terminal-pilot 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cli.js +38 -15
  2. package/dist/cli.js.map +4 -4
  3. package/dist/commands/close-session.js +18 -2
  4. package/dist/commands/close-session.js.map +2 -2
  5. package/dist/commands/create-session.js +18 -2
  6. package/dist/commands/create-session.js.map +2 -2
  7. package/dist/commands/fill.js +18 -2
  8. package/dist/commands/fill.js.map +2 -2
  9. package/dist/commands/get-session.js +18 -2
  10. package/dist/commands/get-session.js.map +2 -2
  11. package/dist/commands/index.js +18 -2
  12. package/dist/commands/index.js.map +2 -2
  13. package/dist/commands/list-sessions.js +18 -2
  14. package/dist/commands/list-sessions.js.map +2 -2
  15. package/dist/commands/press-key.js +18 -2
  16. package/dist/commands/press-key.js.map +2 -2
  17. package/dist/commands/read-history.js +18 -2
  18. package/dist/commands/read-history.js.map +2 -2
  19. package/dist/commands/read-screen.js +18 -2
  20. package/dist/commands/read-screen.js.map +2 -2
  21. package/dist/commands/resize.js +18 -2
  22. package/dist/commands/resize.js.map +2 -2
  23. package/dist/commands/runtime.js +18 -2
  24. package/dist/commands/runtime.js.map +2 -2
  25. package/dist/commands/screenshot.js +18 -2
  26. package/dist/commands/screenshot.js.map +2 -2
  27. package/dist/commands/send-signal.js +18 -2
  28. package/dist/commands/send-signal.js.map +2 -2
  29. package/dist/commands/type.js +18 -2
  30. package/dist/commands/type.js.map +2 -2
  31. package/dist/commands/wait-for-exit.js +18 -2
  32. package/dist/commands/wait-for-exit.js.map +2 -2
  33. package/dist/commands/wait-for.js +18 -2
  34. package/dist/commands/wait-for.js.map +2 -2
  35. package/dist/index.js +18 -2
  36. package/dist/index.js.map +2 -2
  37. package/dist/terminal-pilot.js +18 -2
  38. package/dist/terminal-pilot.js.map +2 -2
  39. package/dist/terminal-session.js +18 -2
  40. package/dist/terminal-session.js.map +2 -2
  41. package/dist/testing/cli-repl.js +38 -15
  42. package/dist/testing/cli-repl.js.map +4 -4
  43. package/dist/testing/qa-cli.js +38 -15
  44. package/dist/testing/qa-cli.js.map +4 -4
  45. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/terminal-session.ts", "../src/ansi.ts", "../src/terminal-buffer.ts", "../src/keys.ts", "../src/terminal-screen.ts"],
4
- "sourcesContent": ["import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closeRequested = false;\n private signalRequested = false;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.signalRequested = true;\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const matched = matchPattern(this.rawBuffer, pattern);\n if (matched !== null) {\n return matched;\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.signalRequested) {\n return this.exitPromise;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n }\n }\n\n return this.exitPromise;\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch {\n chmodSync(helper, 0o755);\n }\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character === \"\\r\" || character === \"\\b\") {\n continue;\n }\n\n output += character;\n }\n\n return output;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n EscCharset,\n EscHash,\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor = { x: 0, y: 0 };\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n\n this.displayBuffer = Object.defineProperties(\n {} as { readonly cursorX: number; readonly cursorY: number; readonly data: Array<Row | undefined> },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true },\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const cell = [ch.charCodeAt(0), ch] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n return this._csiParams.split(\";\").map((s) => (s === \"\" ? 0 : parseInt(s, 10)));\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n // Only handle alt screen (1049) \u2014 ignore everything else\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n } else {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._resetStyle();\n }\n }\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2 || p0 === 3) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": { // insert lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": { // delete lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": { // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": { // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": { // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": { // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = 0;\n break;\n }\n case \"s\": // save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n break;\n case \"u\": // restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ESC (ESC \\ = ST)\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n // next char should be `\\` \u2014 just return to normal, it will be consumed\n this._state = State.Normal;\n }\n break;\n case State.Str:\n // consume until ST (0x9c) or BEL\n if (code === 0x9c || code === 0x07) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._state = State.Normal;\n }\n break;\n case State.EscCharset:\n // consume one character for charset designation\n this._state = State.Normal;\n break;\n case State.EscHash:\n // consume one character for line attributes\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL\n if (this._cursorX > 0) {\n this._cursorX--;\n this._setChar(this._cursorY, this._cursorX, \" \");\n }\n } else if (code === 0x09) {\n // HT\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 charset switch, ignore\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n this._setChar(this._cursorY, this._cursorX, ch);\n this._cursorX++;\n if (this._cursorX >= this._cols) {\n // Auto-wrap\n this._cursorX = 0;\n this._newline();\n }\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x28 || code === 0x29 || code === 0x2a || code === 0x2b || code === 0x2d || code === 0x2e) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = tab set (ignore)\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._savedCursor = { x: 0, y: 0 };\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetStyle();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b) {\n // Digit or semicolon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n strikethrough: false\n };\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closeRequested = false;\n private signalRequested = false;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.signalRequested = true;\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const matched = matchPattern(this.rawBuffer, pattern);\n if (matched !== null) {\n return matched;\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.signalRequested) {\n return this.exitPromise;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n }\n }\n\n return this.exitPromise;\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character === \"\\r\" || character === \"\\b\") {\n continue;\n }\n\n output += character;\n }\n\n return output;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n EscCharset,\n EscHash,\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor = { x: 0, y: 0 };\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n\n this.displayBuffer = Object.defineProperties(\n {} as { readonly cursorX: number; readonly cursorY: number; readonly data: Array<Row | undefined> },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true },\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const cell = [ch.charCodeAt(0), ch] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n return this._csiParams.split(\";\").map((s) => (s === \"\" ? 0 : parseInt(s, 10)));\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n // Only handle alt screen (1049) \u2014 ignore everything else\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n } else {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._resetStyle();\n }\n }\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2 || p0 === 3) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": { // insert lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": { // delete lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": { // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": { // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": { // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": { // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = 0;\n break;\n }\n case \"s\": // save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n break;\n case \"u\": // restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ESC (ESC \\ = ST)\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n // next char should be `\\` \u2014 just return to normal, it will be consumed\n this._state = State.Normal;\n }\n break;\n case State.Str:\n // consume until ST (0x9c) or BEL\n if (code === 0x9c || code === 0x07) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._state = State.Normal;\n }\n break;\n case State.EscCharset:\n // consume one character for charset designation\n this._state = State.Normal;\n break;\n case State.EscHash:\n // consume one character for line attributes\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL\n if (this._cursorX > 0) {\n this._cursorX--;\n this._setChar(this._cursorY, this._cursorX, \" \");\n }\n } else if (code === 0x09) {\n // HT\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 charset switch, ignore\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n this._setChar(this._cursorY, this._cursorX, ch);\n this._cursorX++;\n if (this._cursorX >= this._cols) {\n // Auto-wrap\n this._cursorX = 0;\n this._newline();\n }\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x28 || code === 0x29 || code === 0x2a || code === 0x2b || code === 0x2d || code === 0x2e) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = tab set (ignore)\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._savedCursor = { x: 0, y: 0 };\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetStyle();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b) {\n // Digit or semicolon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n strikethrough: false\n };\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAS,oBAAoB;AAC7B,SAAS,YAAY,WAAW,iBAAiB;AACjD,SAAS,qBAAqB;AAC9B,SAAS,SAAS,YAAY;AAC9B,YAAY,aAAa;;;ACJzB,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,KAAK;AACX,IAAM,MAAM;AAEL,SAAS,UAAU,OAAuB;AAC/C,MAAI,SAAS;AAEb,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,WAAW,KAAK;AAEnC,QAAI,SAAS,KAAK;AAChB,YAAM,WAAW,MAAM,WAAW,QAAQ,CAAC;AAE3C,UAAI,aAAa,IAAM;AACrB,gBAAQ,WAAW,OAAO,QAAQ,CAAC;AACnC;AAAA,MACF;AAEA,UAAI,aAAa,IAAM;AACrB,gBAAQ,wBAAwB,OAAO,QAAQ,GAAG,IAAI;AACtD;AAAA,MACF;AAEA,UAAI,aAAa,MAAQ,aAAa,MAAQ,aAAa,MAAQ,aAAa,IAAM;AACpF,gBAAQ,wBAAwB,OAAO,QAAQ,GAAG,KAAK;AACvD;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,MAAM,QAAQ,GAAG;AAC3B,iBAAS;AAAA,MACX;AAEA;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,cAAQ,WAAW,OAAO,QAAQ,CAAC;AACnC;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,cAAQ,wBAAwB,OAAO,QAAQ,GAAG,IAAI;AACtD;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,MAAM,SAAS,KAAK;AAC/D,cAAQ,wBAAwB,OAAO,QAAQ,GAAG,KAAK;AACvD;AAAA,IACF;AAEA,cAAU,MAAM,KAAK;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,OAAuB;AACxD,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,OAAO,MAAM,WAAW,KAAK;AACnC,QAAI,QAAQ,MAAQ,QAAQ,KAAM;AAChC,aAAO;AAAA,IACT;AAEA,aAAS;AAAA,EACX;AAEA,SAAO,MAAM;AACf;AAEA,SAAS,wBACP,OACA,OACA,qBACQ;AACR,SAAO,QAAQ,MAAM,QAAQ;AAC3B,UAAM,OAAO,MAAM,WAAW,KAAK;AAEnC,QAAI,SAAS,MAAO,uBAAuB,SAAS,KAAM;AACxD,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,OAAO,MAAM,WAAW,QAAQ,CAAC,MAAM,IAAM;AACxD,aAAO,QAAQ;AAAA,IACjB;AAEA,aAAS;AAAA,EACX;AAEA,SAAO,MAAM;AACf;;;ACjFA,IAAM,YAAY;AAYX,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,eAAe,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAC5B,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,cAAc;AAAA,EACd,SAAwB,wBAAwB;AAAA,EAChD,iBAAiB;AAAA,EAEhB;AAAA,EAMT,YAAY,MAAc,MAAc;AACtC,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,gBAAgB,OAAO;AAC5B,SAAK,UAAU,KAAK,YAAY,MAAM,IAAI;AAE1C,SAAK,gBAAgB,OAAO;AAAA,MAC1B,CAAC;AAAA,MACD;AAAA,QACE,SAAS,EAAE,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,QACtD,SAAS,EAAE,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,QACtD,MAAM,EAAE,KAAK,MAAM,KAAK,SAAmC,YAAY,KAAK;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAoB;AACxB,eAAW,MAAM,MAAM;AACrB,WAAK,MAAM,EAAE;AAAA,IACf;AAAA,EACF;AAAA,EAEA,WAAW,KAAqB;AAC9B,UAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,CAAC;AACpC,QAAI,kBAAkB;AAEtB,aAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACzD,UAAI,MAAM,KAAK,MAAM,MAAM;AACzB,0BAAkB;AAClB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,IAAI;AAC1B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO;AACX,QAAI,cAAc;AAElB,aAAS,QAAQ,GAAG,SAAS,iBAAiB,SAAS,GAAG;AACxD,YAAM,OAAO,MAAM,KAAK;AACxB,YAAM,YAAY,MAAM,SAAS;AAEjC,UAAI,cAAc,aAAa;AAC7B,gBAAQ,UAAU,SAAS,IAAI,YAAY;AAC3C,sBAAc;AAAA,MAChB;AAEA,cAAQ,OAAO,CAAC,KAAK;AAAA,IACvB;AAEA,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ;AAAA,IACV;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAc,MAAoB;AAEvC,WAAO,KAAK,QAAQ,SAAS,MAAM;AACjC,WAAK,QAAQ,KAAK,KAAK,SAAS,IAAI,CAAC;AAAA,IACvC;AACA,SAAK,QAAQ,SAAS;AAGtB,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,MAAM,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI;AACjD,aAAO,IAAI,SAAS,KAAM,KAAI,KAAK,IAAI;AACvC,UAAI,SAAS;AACb,WAAK,QAAQ,CAAC,IAAI;AAAA,IACpB;AAEA,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,aAAa;AAClB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,WAAW,KAAK,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC;AACtD,SAAK,WAAW,KAAK,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC;AAAA,EACxD;AAAA,EAEQ,YAAY,MAAc,MAAqB;AACrD,WAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEQ,SAAS,MAAmB;AAClC,WAAO,MAAM,IAAI,EAAE,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEQ,OAAO,OAAe,KAAa,KAAqB;AAC9D,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEQ,SAAS,GAAW,GAAW,IAAkB;AACvD,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO;AACnC,YAAM,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE;AAElC,UAAI,KAAK,eAAe,SAAS,GAAG;AAClC,eAAO,eAAe,MAAM,SAAS;AAAA,UACnC,OAAO,KAAK;AAAA,UACZ,UAAU;AAAA,UACV,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,WAAW,GAAW,OAAe,KAAmB;AAC9D,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI,CAAC,IAAK;AACV,aAAS,IAAI,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK;AACnD,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,UAAU,OAAqB;AACrC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAK,QAAQ,OAAO,KAAK,YAAY,CAAC;AACtC,WAAK,QAAQ,OAAO,KAAK,eAAe,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,YAAY,OAAqB;AACvC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAK,QAAQ,OAAO,KAAK,eAAe,CAAC;AACzC,WAAK,QAAQ,OAAO,KAAK,YAAY,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,WAAiB;AACvB,QAAI,KAAK,aAAa,KAAK,eAAe;AACxC,WAAK,UAAU,CAAC;AAAA,IAClB,OAAO;AACL,WAAK,WAAW,KAAK,IAAI,KAAK,WAAW,GAAG,KAAK,QAAQ,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA,EAEQ,kBAA4B;AAClC,QAAI,CAAC,KAAK,WAAY,QAAO,CAAC;AAC9B,WAAO,KAAK,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAO,MAAM,KAAK,IAAI,SAAS,GAAG,EAAE,CAAE;AAAA,EAC/E;AAAA,EAEQ,SAAS,OAAqB;AACpC,UAAM,SAAS,KAAK,gBAAgB;AACpC,UAAM,KAAK,OAAO,CAAC,KAAK;AACxB,UAAM,KAAK,OAAO,CAAC,KAAK;AAExB,QAAI,KAAK,gBAAgB,KAAK;AAC5B,UAAI,UAAU,OAAO,UAAU,KAAK;AAElC,YAAI,OAAO,SAAS,IAAI,GAAG;AACzB,cAAI,UAAU,KAAK;AACjB,iBAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,iBAAK,WAAW;AAChB,iBAAK,WAAW;AAAA,UAClB,OAAO;AACL,iBAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,iBAAK,WAAW;AAChB,iBAAK,WAAW;AAAA,UAClB;AACA,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AACA;AAAA,IACF;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E,aAAK,WAAW;AAChB;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AAAA;AAAA,MACL,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AACH,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK;AACxC,eAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,WAAW,CAAC,IAAI,KAAK,CAAC;AAAA,QAClF;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,GAAG;AACZ,eAAK,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,CAAC;AAC5D,mBAAS,IAAI,KAAK,WAAW,GAAG,IAAI,KAAK,OAAO,IAAK,MAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,QAC3F,WAAW,OAAO,GAAG;AACnB,mBAAS,IAAI,GAAG,IAAI,KAAK,UAAU,IAAK,MAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC5E,eAAK,WAAW,KAAK,UAAU,GAAG,KAAK,QAAQ;AAAA,QACjD,WAAW,OAAO,KAAK,OAAO,GAAG;AAC/B,mBAAS,IAAI,GAAG,IAAI,KAAK,OAAO,IAAK,MAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,QAC3E;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,EAAG,MAAK,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,iBACjE,OAAO,EAAG,MAAK,WAAW,KAAK,UAAU,GAAG,KAAK,QAAQ;AAAA,iBACzD,OAAO,EAAG,MAAK,WAAW,KAAK,UAAU,GAAG,KAAK,QAAQ,CAAC;AACnE;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,UAAU,KAAK,UAAU,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,IAAI,CAAC;AACjF;AAAA,MACF,KAAK,KAAK;AACR,cAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,QAAQ,OAAO,KAAK,eAAe,CAAC;AACzC,eAAK,QAAQ,OAAO,KAAK,UAAU,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,QACjE;AACA;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,QAAQ,OAAO,KAAK,UAAU,CAAC;AACpC,eAAK,QAAQ,OAAO,KAAK,eAAe,GAAG,KAAK,SAAS,KAAK,KAAK,CAAC;AAAA,QACtE;AACA;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,cAAI,OAAO,KAAK,UAAU,CAAC;AAC3B,iBAAO,IAAI,SAAS,KAAK,MAAO,KAAI,KAAK,IAAI;AAAA,QAC/C;AACA;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AACR,cAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,YAAI,KAAK;AACP,gBAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,mBAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,OAAO,KAAK,UAAU,GAAG,IAAI;AAC7D,cAAI,OAAO,KAAK,KAAK;AAAA,QACvB;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,UAAU,KAAK,IAAI,GAAG,EAAE,CAAC;AAC9B;AAAA,MACF,KAAK;AACH,YAAI,OAAO,UAAU,EAAG,MAAK,YAAY,KAAK,IAAI,GAAG,EAAE,CAAC;AACxD;AAAA,MACF,KAAK,KAAK;AACR,cAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,WAAW,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,WAAW,CAAC,IAAI,KAAK,CAAC;AAAA,QACpE;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK,IAAI,GAAG,EAAE,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E;AAAA,MACF,KAAK,KAAK;AACR,cAAM,MAAM,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9D,cAAM,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,QAAQ,MAAM,GAAG,GAAG,KAAK,QAAQ,CAAC;AAC9E,YAAI,MAAM,QAAQ;AAChB,eAAK,aAAa;AAClB,eAAK,gBAAgB;AAAA,QACvB;AACA,aAAK,WAAW;AAChB,aAAK,WAAW;AAChB;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,eAAe,EAAE,GAAG,KAAK,UAAU,GAAG,KAAK,SAAS;AACzD;AAAA,MACF,KAAK;AACH,aAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,aAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE;AAAA,MACF,KAAK;AACH,aAAK,UAAU,MAAM;AACrB;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,MAAM,IAAkB;AAC9B,UAAM,OAAO,GAAG,WAAW,CAAC;AAE5B,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AACH,aAAK,YAAY,IAAI,IAAI;AACzB;AAAA,MACF,KAAK;AACH,aAAK,YAAY,IAAI,IAAI;AACzB;AAAA,MACF,KAAK;AACH,aAAK,SAAS,IAAI,IAAI;AACtB;AAAA,MACF,KAAK;AAEH,YAAI,SAAS,KAAQ,SAAS,KAAM;AAClC,eAAK,SAAS;AAAA,QAChB,WAAW,SAAS,IAAM;AAExB,eAAK,SAAS;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AAEH,YAAI,SAAS,OAAQ,SAAS,GAAM;AAClC,eAAK,SAAS;AAAA,QAChB,WAAW,SAAS,IAAM;AACxB,eAAK,SAAS;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AAEH,aAAK,SAAS;AACd;AAAA,MACF,KAAK;AAEH,aAAK,SAAS;AACd;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,YAAY,IAAY,MAAoB;AAClD,QAAI,SAAS,IAAM;AACjB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAExB,WAAK,aAAa;AAClB,WAAK,cAAc;AACnB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,OAAQ,SAAS,OAAQ,SAAS,OAAQ,SAAS,KAAM;AAE3E,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAQ,SAAS,KAAQ,SAAS,GAAM;AAAA,IAE5D,WAAW,SAAS,GAAM;AAExB,UAAI,KAAK,WAAW,EAAG,MAAK;AAAA,IAC9B,WAAW,SAAS,KAAM;AAExB,UAAI,KAAK,WAAW,GAAG;AACrB,aAAK;AACL,aAAK,SAAS,KAAK,UAAU,KAAK,UAAU,GAAG;AAAA,MACjD;AAAA,IACF,WAAW,SAAS,GAAM;AAExB,WAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,WAAW,CAAC,IAAI,KAAK,CAAC;AAAA,IAClF,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE1D,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,WAAW;AAAA,IAClB,WAAW,SAAS,MAAQ,SAAS,IAAM;AAAA,IAE3C,WAAW,QAAQ,MAAQ,SAAS,KAAM;AAExC,WAAK,SAAS,KAAK,UAAU,KAAK,UAAU,EAAE;AAC9C,WAAK;AACL,UAAI,KAAK,YAAY,KAAK,OAAO;AAE/B,aAAK,WAAW;AAChB,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,IAAY,MAAoB;AAClD,SAAK,SAAS;AAEd,QAAI,SAAS,IAAM;AAEjB,WAAK,aAAa;AAClB,WAAK,cAAc;AACnB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE3E,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE7G,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,eAAe,EAAE,GAAG,KAAK,UAAU,GAAG,KAAK,SAAS;AAAA,IAC3D,WAAW,SAAS,IAAM;AAExB,WAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,WAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,IACpE,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,UAAI,KAAK,aAAa,KAAK,YAAY;AACrC,aAAK,YAAY,CAAC;AAAA,MACpB,OAAO;AACL,aAAK,WAAW,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAAA,MAC/C;AAAA,IACF,WAAW,SAAS,IAAM;AAAA,IAE1B,WAAW,SAAS,IAAM;AAExB,WAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,eAAe,EAAE,GAAG,GAAG,GAAG,EAAE;AACjC,WAAK,aAAa;AAClB,WAAK,gBAAgB,KAAK,QAAQ;AAClC,WAAK,YAAY;AAAA,IACnB;AAAA,EAEF;AAAA,EAEQ,SAAS,IAAY,MAAoB;AAC/C,QAAI,QAAQ,MAAQ,QAAQ,KAAM;AAEhC,WAAK,SAAS,EAAE;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE3E,WAAK,cAAc;AAAA,IACrB,WAAY,QAAQ,MAAQ,QAAQ,MAAS,SAAS,IAAM;AAE1D,WAAK,cAAc;AAAA,IACrB;AAAA,EAEF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,SAAS,wBAAwB;AACtC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,UAAU,QAAwB;AACxC,UAAM,mBAAmB,OAAO,WAAW,IAAI,CAAC,CAAC,IAAI;AAErD,aAAS,QAAQ,GAAG,QAAQ,iBAAiB,QAAQ,SAAS,GAAG;AAC/D,YAAM,QAAQ,iBAAiB,KAAK,KAAK;AAEzC,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,eAAK,YAAY;AACjB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,MAAM;AAClB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,SAAS;AACrB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,YAAY;AACxB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,UAAU;AACtB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,gBAAgB;AAC5B;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,eAAK,OAAO,OAAO;AACnB,eAAK,OAAO,MAAM;AAClB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,SAAS;AACrB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,YAAY;AACxB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,UAAU;AACtB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,gBAAgB;AAC5B;AAAA,QACF,KAAK;AACH,eAAK,OAAO,KAAK;AACjB;AAAA,QACF,KAAK;AACH,eAAK,OAAO,KAAK;AACjB;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,kBAAQ,KAAK,oBAAoB,OAAO,kBAAkB,KAAK;AAC/D;AAAA,QACF;AACE,cAAK,SAAS,MAAM,SAAS,MAAQ,SAAS,MAAM,SAAS,IAAK;AAChE,iBAAK,OAAO,KAAK,CAAC,KAAK;AAAA,UACzB,WAAY,SAAS,MAAM,SAAS,MAAQ,SAAS,OAAO,SAAS,KAAM;AACzE,iBAAK,OAAO,KAAK,CAAC,KAAK;AAAA,UACzB;AACA;AAAA,MACJ;AAAA,IACF;AAEA,SAAK,iBAAiB,oBAAoB,KAAK,MAAM;AAAA,EACvD;AAAA,EAEQ,oBAAoB,SAAkB,QAAkB,OAAuB;AACrF,UAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,UAAM,SAAS,YAAY,KAAK,OAAO;AAEvC,QAAI,SAAS,GAAG;AACd,YAAM,eAAe,OAAO,QAAQ,CAAC;AACrC,UAAI,iBAAiB,QAAW;AAC9B,aAAK,OAAO,MAAM,IAAI,CAAC,SAAS,GAAG,YAAY;AAC/C,eAAO,QAAQ;AAAA,MACjB;AAEA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,GAAG;AACd,YAAM,MAAM,OAAO,QAAQ,CAAC;AAC5B,YAAM,QAAQ,OAAO,QAAQ,CAAC;AAC9B,YAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,UAAI,QAAQ,UAAa,UAAU,UAAa,SAAS,QAAW;AAClE,aAAK,OAAO,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,OAAO,IAAI;AACnD,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BAAyC;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,oBAAoB,OAA8B;AACzD,QAAM,QAAkB,CAAC;AAEzB,MAAI,MAAM,MAAM;AACd,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,KAAK;AACb,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,QAAQ;AAChB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,WAAW;AACnB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,SAAS;AACjB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,eAAe;AACvB,UAAM,KAAK,CAAC;AAAA,EACd;AACA,MAAI,MAAM,OAAO,QAAW;AAC1B,UAAM,KAAK,GAAG,MAAM,EAAE;AAAA,EACxB;AACA,MAAI,MAAM,OAAO,QAAW;AAC1B,UAAM,KAAK,GAAG,MAAM,EAAE;AAAA,EACxB;AAEA,SAAO,MAAM,WAAW,IAAI,KAAK,QAAQ,MAAM,KAAK,GAAG,CAAC;AAC1D;;;AC5oBA,IAAM,sBAAsB;AAAA,EAC1B,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AACT;AAEA,IAAM,kBAAkB,IAAI;AAAA,EACzB,OAAO,QAAQ,mBAAmB,EAAyB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;AAClG;AAEA,IAAM,kBAAkB,eAAe,OAAO,KAAK,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAElF,SAAS,gBAAgB,KAAoB;AAC3C,SAAO,IAAI,MAAM,yBAAyB,GAAG,KAAK,eAAe,EAAE;AACrE;AAoBO,SAAS,cAAc,KAA0B;AACtD,QAAM,WAAY,IAAe,YAAY;AAE7C,QAAM,gBAAgB,gBAAgB,IAAI,QAAQ;AAClD,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,UAAU,GAAG;AACnC,WAAO,qBAAsB,IAAe,MAAM,WAAW,MAAM,CAAC;AAAA,EACtE;AAEA,MAAI,SAAS,WAAW,MAAM,GAAG;AAC/B,UAAM,YAAa,IAAe,MAAM,OAAO,MAAM;AACrD,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,gBAAgB,GAAG;AAAA,IAC3B;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO,SAAS;AAAA,IAClB;AAEA,QAAI;AACF,aAAO,SAAS,cAAc,SAAwB;AAAA,IACxD,QAAQ;AACN,YAAM,gBAAgB,GAAG;AAAA,IAC3B;AAAA,EACF;AAEA,MAAK,IAAe,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,GAAG;AAC3B;AAEA,SAAS,qBAAqB,YAA4B;AACxD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,gBAAgB,WAAW,UAAU,EAAE;AAAA,EAC/C;AAEA,QAAM,kBAAkB,WAAW,YAAY;AAC/C,QAAM,WAAW,gBAAgB,WAAW,CAAC;AAC7C,MAAI,WAAW,MAAM,WAAW,IAAI;AAClC,UAAM,gBAAgB,WAAW,UAAU,EAAE;AAAA,EAC/C;AAEA,SAAO,OAAO,aAAa,WAAW,EAAE;AAC1C;;;AC3FO,IAAM,iBAAN,MAAqB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,SAAK,QAAQ,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC;AAC/D,SAAK,WAAW,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;AAC3C,SAAK,SAAS,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;AACzC,SAAK,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAErC,WAAO,OAAO,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,SAAS,WAA4B;AACnC,WAAO,KAAK,KAAK,SAAS,SAAS;AAAA,EACrC;AAAA,EAEA,KAAK,OAAuB;AAC1B,UAAM,kBAAkB,QAAQ,IAAI,KAAK,MAAM,SAAS,QAAQ;AAChE,UAAM,OAAO,KAAK,MAAM,eAAe;AAEvC,QAAI,SAAS,QAAW;AACtB,YAAM,IAAI,WAAW,6BAA6B,KAAK,EAAE;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AACF;;;AJnCA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AACtB,IAAM,8BAA8B;AACpC,IAAM,yBAAyB;AA8BxB,IAAM,kBAAN,MAAsB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACT,WAA0B;AAAA,EAET;AAAA,EACA;AAAA,EACA,UAAU,IAAI,aAAa;AAAA,EAC3B;AAAA,EACT,YAAY;AAAA,EACZ,aAAa,KAAK,IAAI;AAAA,EACtB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAE1B,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA,OAAO,CAAC;AAAA,IACR,MAAM,QAAQ,IAAI;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,GAA2B;AACzB,SAAK,KAAK;AACV,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,WAAW,IAAI,eAAe,MAAM,IAAI;AAC7C,SAAK,MAAM,iBAAiB,EAAE,SAAS,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AACnE,SAAK,MAAM,KAAK,IAAI;AAEpB,UAAM,mBAAmB,KAAK,IAAI,OAAO,CAAC,UAAU;AAClD,WAAK,aAAa;AAClB,WAAK,aAAa,KAAK,IAAI;AAC3B,WAAK,SAAS,MAAM,KAAK;AAEzB,UAAI,SAAS;AACX,gBAAQ,OAAO,MAAM,KAAK;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,QAAI;AAEJ,SAAK,cAAc,IAAI,QAAgB,CAAC,YAAY;AAClD,yBAAmB,KAAK,IAAI,OAAO,CAAC,EAAE,SAAS,MAAM;AACnD,YAAI,KAAK,aAAa,MAAM;AAC1B,kBAAQ,KAAK,QAAQ;AACrB;AAAA,QACF;AAEA,aAAK,WAAW;AAChB,yBAAiB,QAAQ;AACzB,0BAAkB,QAAQ;AAC1B,aAAK,QAAQ,KAAK,QAAQ,QAAQ;AAClC,gBAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,MAA6B;AACtC,eAAW,aAAa,MAAM;AAC5B,YAAM,KAAK,KAAK,SAAS;AACzB,YAAM,MAAM,aAAa;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,MAA6B;AACtC,UAAM,KAAK,KAAK,KAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,MAAM,KAAiC;AAC3C,UAAM,KAAK,KAAK,cAAc,GAAG,CAAC;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,KAA4B;AACrC,QAAI,KAAK,aAAa,MAAM;AAC1B;AAAA,IACF;AAEA,SAAK,IAAI,MAAM,GAAG;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,QAAI,KAAK,aAAa,MAAM;AAC1B;AAAA,IACF;AAEA,SAAK,kBAAkB;AACvB,SAAK,IAAI,KAAK,GAAG;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ,SAA0B,MAAwC;AAC9E,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,YAAY,KAAK,IAAI;AAE3B,WAAO,KAAK,IAAI,IAAI,aAAa,SAAS;AACxC,YAAM,UAAU,aAAa,KAAK,WAAW,OAAO;AACpD,UAAI,YAAY,MAAM;AACpB,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,gBAAgB;AAAA,IAC9B;AAEA,UAAM,IAAI,MAAM,uCAAuC,OAAO,OAAO,OAAO,OAAO,CAAC,EAAE;AAAA,EACxF;AAAA,EAEA,MAAM,aAAa,IAA2B;AAC5C,WAAO,MAAM;AACX,YAAM,YAAY,MAAM,KAAK,IAAI,IAAI,KAAK;AAC1C,UAAI,aAAa,GAAG;AAClB;AAAA,MACF;AAEA,YAAM,MAAM,SAAS;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,SAAkC;AACtC,UAAM,WAAqB,CAAC;AAE5B,aAAS,MAAM,GAAG,MAAM,KAAK,aAAa,OAAO,GAAG;AAClD,eAAS,KAAK,KAAK,SAAS,WAAW,GAAG,CAAC;AAAA,IAC7C;AAEA,WAAO,IAAI,eAAe;AAAA,MACxB,OAAO;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,QACN,KAAK,KAAK,SAAS,cAAc;AAAA,QACjC,KAAK,KAAK,SAAS,cAAc;AAAA,MACnC;AAAA,MACA,MAAM;AAAA,QACJ,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,MAA0C;AACtD,UAAM,aAAa,uBAAuB,UAAU,KAAK,SAAS,CAAC;AACnE,UAAM,QAAQ,kBAAkB,UAAU;AAE1C,QAAI,MAAM,SAAS,QAAW;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,IAAI;AAClD,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAO,MAAc,MAA6B;AACtD,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,IAAI,OAAO,MAAM,IAAI;AAAA,IAC5B;AACA,SAAK,SAAS,OAAO,MAAM,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,YAAY,MAA8C;AAC9D,QAAI,KAAK,aAAa,MAAM;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,MAAM,YAAY,QAAW;AAC/B,YAAM,SAAS,MAAM,YAAY,KAAK,aAAa,KAAK,OAAO;AAC/D,UAAI,WAAW,MAAM;AACnB,cAAM,IAAI,MAAM,+CAA+C,KAAK,OAAO,IAAI;AAAA,MACjF;AACA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAyB;AAC7B,QAAI,KAAK,aAAa,MAAM;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAiB;AAEtB,YAAM,mBAAmB,MAAM,YAAY,KAAK,aAAa,2BAA2B;AACxF,UAAI,qBAAqB,MAAM;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,KAAK,iBAAiB;AACxB,eAAO,KAAK;AAAA,MACd;AAEA,UAAI,KAAK,aAAa,MAAM;AAC1B,aAAK,IAAI,KAAK,SAAS;AACvB,cAAM,eAAe,MAAM,YAAY,KAAK,aAAa,sBAAsB;AAC/E,YAAI,iBAAiB,MAAM;AACzB,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,KAAK,aAAa,MAAM;AAC1B,aAAK,IAAI,KAAK,SAAS;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,GAAG,OAAe,IAAkC;AAClD,SAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,EAC3B;AACF;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOY;AACV,8BAA4B;AAC5B,SAAe,cAAM,SAAS,MAAM;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AACH;AAEA,IAAI,qBAAqB;AAEzB,SAAS,8BAAoC;AAC3C,MAAI,mBAAoB;AACxB,uBAAqB;AAErB,QAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,QAAM,aAAa,QAAQA,SAAQ,QAAQ,UAAU,CAAC;AACtD,QAAM,SAAS,KAAK,YAAY,MAAM,aAAa,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI,IAAI,cAAc;AAExG,MAAI;AACF,eAAW,QAAQ,UAAU,IAAI;AAAA,EACnC,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,GAAG;AAC7B;AAAA,IACF;AAEA,QAAI;AACF,gBAAU,QAAQ,GAAK;AAAA,IACzB,SAAS,YAAY;AACnB,UAAI,mBAAmB,UAAU,GAAG;AAClC;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,SAAS,MAAM,SAAS;AAC3C;AAEA,SAAS,aAAa,QAAgB,SAAyC;AAC7E,QAAM,QAAQ,uBAAuB,UAAU,MAAM,CAAC;AAEtD,aAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,QAAI,OAAO,YAAY,UAAU;AAC/B,UAAI,KAAK,SAAS,OAAO,EAAG,QAAO;AAAA,IACrC,OAAO;AACL,YAAM,QAAQ,gBAAgB,QAAQ,OAAO,GAAG;AAChD,UAAI,IAAI,OAAO,QAAQ,QAAQ,KAAK,EAAE,KAAK,IAAI,EAAG,QAAO;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAe,cAA8B;AACpE,MAAI,SAAS;AAEb,aAAW,aAAa,OAAO;AAC7B,QAAI,cAAc,cAAc;AAC9B,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,kBAAkB,OAAyB;AAClD,QAAM,QAAQ,MAAM,MAAM,IAAI;AAE9B,MAAI,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACtD,UAAM,IAAI;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,SAAS;AAEb,aAAW,aAAa,OAAO;AAC7B,QAAI,cAAc,QAAQ,cAAc,MAAM;AAC5C;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;AAEA,eAAe,YAAY,aAA8B,SAAyC;AAChG,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,UAAU;AAEd,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,cAAQ,IAAI;AAAA,IACd,GAAG,OAAO;AAEV,SAAK,YAAY,KAAK,CAAC,SAAS;AAC9B,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ,IAAI;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;",
6
6
  "names": ["require"]
7
7
  }
@@ -713,12 +713,19 @@ function renderTable(options) {
713
713
  import chalk7 from "chalk";
714
714
  var AGENT_PREFIX = `${chalk7.green.bold("\u2713")} agent: `;
715
715
 
716
+ // ../design-system/src/dashboard/buffer.ts
717
+ import chalk8 from "chalk";
718
+
719
+ // ../design-system/src/dashboard/terminal.ts
720
+ import readline from "node:readline";
721
+ import { PassThrough } from "node:stream";
722
+
716
723
  // ../design-system/src/prompts/index.ts
717
- import chalk14 from "chalk";
724
+ import chalk15 from "chalk";
718
725
  import * as clack from "@clack/prompts";
719
726
 
720
727
  // ../design-system/src/prompts/primitives/cancel.ts
721
- import chalk8 from "chalk";
728
+ import chalk9 from "chalk";
722
729
 
723
730
  // ../../node_modules/@clack/core/dist/index.mjs
724
731
  var import_sisteransi = __toESM(require_src(), 1);
@@ -748,16 +755,16 @@ function cancel(msg = "") {
748
755
  if (resolveOutputFormat() !== "terminal") {
749
756
  return;
750
757
  }
751
- process.stdout.write(`${chalk8.gray("\u2514")} ${chalk8.red(msg)}
758
+ process.stdout.write(`${chalk9.gray("\u2514")} ${chalk9.red(msg)}
752
759
 
753
760
  `);
754
761
  }
755
762
 
756
763
  // ../design-system/src/prompts/primitives/intro.ts
757
- import chalk9 from "chalk";
764
+ import chalk10 from "chalk";
758
765
 
759
766
  // ../design-system/src/prompts/primitives/note.ts
760
- import chalk10 from "chalk";
767
+ import chalk11 from "chalk";
761
768
  function getVisibleWidth(value) {
762
769
  return stripAnsi2(value).length;
763
770
  }
@@ -768,15 +775,15 @@ function renderTerminalNote(message2, title) {
768
775
  visibleTitle.length,
769
776
  ...contentLines.map((line) => getVisibleWidth(line))
770
777
  ) + 2;
771
- const titleLine = `${chalk10.green("\u25C7")} ${chalk10.reset(title ?? "")} ${chalk10.gray(
778
+ const titleLine = `${chalk11.green("\u25C7")} ${chalk11.reset(title ?? "")} ${chalk11.gray(
772
779
  `${"\u2500".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`
773
780
  )}`;
774
781
  const content = contentLines.map((line) => {
775
782
  const padding = " ".repeat(contentWidth - getVisibleWidth(line));
776
- return `${chalk10.gray("\u2502")} ${line}${padding}${chalk10.gray("\u2502")}`;
783
+ return `${chalk11.gray("\u2502")} ${line}${padding}${chalk11.gray("\u2502")}`;
777
784
  });
778
- const bottom = chalk10.gray(`\u251C${"\u2500".repeat(contentWidth + 2)}\u256F`);
779
- return [chalk10.gray("\u2502"), titleLine, ...content, bottom].join("\n");
785
+ const bottom = chalk11.gray(`\u251C${"\u2500".repeat(contentWidth + 2)}\u256F`);
786
+ return [chalk11.gray("\u2502"), titleLine, ...content, bottom].join("\n");
780
787
  }
781
788
  function note(message2, title) {
782
789
  const format = resolveOutputFormat();
@@ -807,13 +814,13 @@ function note(message2, title) {
807
814
  }
808
815
 
809
816
  // ../design-system/src/prompts/primitives/outro.ts
810
- import chalk11 from "chalk";
817
+ import chalk12 from "chalk";
811
818
 
812
819
  // ../design-system/src/prompts/primitives/spinner.ts
813
- import chalk13 from "chalk";
820
+ import chalk14 from "chalk";
814
821
 
815
822
  // ../design-system/src/static/spinner.ts
816
- import chalk12 from "chalk";
823
+ import chalk13 from "chalk";
817
824
 
818
825
  // ../design-system/src/prompts/index.ts
819
826
  async function select2(opts) {
@@ -827,7 +834,7 @@ async function confirm2(opts) {
827
834
  }
828
835
 
829
836
  // ../design-system/src/static/menu.ts
830
- import chalk15 from "chalk";
837
+ import chalk16 from "chalk";
831
838
 
832
839
  // ../cmdkit/src/index.ts
833
840
  import { fileURLToPath } from "node:url";
@@ -3550,9 +3557,25 @@ function ensureSpawnHelperExecutable() {
3550
3557
  const helper = join(nodePtyDir, "..", "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper");
3551
3558
  try {
3552
3559
  accessSync(helper, constants.X_OK);
3553
- } catch {
3554
- chmodSync(helper, 493);
3560
+ } catch (error2) {
3561
+ if (isMissingFileError(error2)) {
3562
+ return;
3563
+ }
3564
+ try {
3565
+ chmodSync(helper, 493);
3566
+ } catch (chmodError) {
3567
+ if (isMissingFileError(chmodError)) {
3568
+ return;
3569
+ }
3570
+ throw chmodError;
3571
+ }
3572
+ }
3573
+ }
3574
+ function isMissingFileError(error2) {
3575
+ if (!(error2 instanceof Error)) {
3576
+ return false;
3555
3577
  }
3578
+ return "code" in error2 && error2.code === "ENOENT";
3556
3579
  }
3557
3580
  function matchPattern(buffer, pattern) {
3558
3581
  const clean = normalizeHistoryBuffer(stripAnsi(buffer));