| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /** 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()),
- })
- }
|