/** Deterministic in-memory PTY backend for transcript snapshots. */ class SnapshotSession { motd = 'dsh> ' statusValue = { kind: 'running' } scrollback = 'dsh> ' startSend(request) { const viewport = `${request.text}\nPTY_OK\ndsh> ` this.scrollback += viewport const result = { viewport, waitReason: 'stdin_read', sessionStatus: this.statusValue, truncated: false, } let consumed = false return { done: Promise.resolve(result), readOutput: () => { if (consumed) return { delta: '', truncated: false } consumed = true return { delta: viewport, truncated: false } }, cancel: () => false, } } read(request) { const lines = this.scrollback.split('\n') const offset = request.offset ?? 0 const count = request.count ?? 500 const end = lines.length - offset const start = Math.max(0, end - count) const text = lines.slice(start, end).join('\n') return { text, totalLines: lines.length, lineBegin: offset, lineEnd: offset + text.split('\n').length, truncated: false } } signal() { return Promise.resolve({ delivered: true, targetPgid: 1 }) } status() { return this.statusValue } close() { this.statusValue = { kind: 'exited', exitCode: 0, signal: null } return Promise.resolve() } } /** Cordis plugin name. */ export const name = 'pty-snapshot-backend' /** Required PTY service. */ export const inject = ['pty'] /** Register the deterministic snapshot backend. */ export function apply(ctx) { ctx.pty.registerBackend({ type: 'shell', spawn: () => Promise.resolve(new SnapshotSession()), }) }