terminal-pilot 0.0.40 → 0.0.41
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.
- package/README.md +13 -1
- package/dist/cli.js +20 -3
- package/dist/cli.js.map +2 -2
- package/dist/commands/close-session.js +9 -1
- package/dist/commands/close-session.js.map +2 -2
- package/dist/commands/create-session.js +9 -1
- package/dist/commands/create-session.js.map +2 -2
- package/dist/commands/daemon-runtime.js +9 -1
- package/dist/commands/daemon-runtime.js.map +2 -2
- package/dist/commands/fill.js +9 -1
- package/dist/commands/fill.js.map +2 -2
- package/dist/commands/get-session.js +9 -1
- package/dist/commands/get-session.js.map +2 -2
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.js +19 -2
- package/dist/commands/index.js.map +2 -2
- package/dist/commands/list-sessions.js +9 -1
- package/dist/commands/list-sessions.js.map +2 -2
- package/dist/commands/press-key.js +9 -1
- package/dist/commands/press-key.js.map +2 -2
- package/dist/commands/read-history.js +9 -1
- package/dist/commands/read-history.js.map +2 -2
- package/dist/commands/read-screen.js +9 -1
- package/dist/commands/read-screen.js.map +2 -2
- package/dist/commands/resize.js +9 -1
- package/dist/commands/resize.js.map +2 -2
- package/dist/commands/runtime.js +9 -1
- package/dist/commands/runtime.js.map +2 -2
- package/dist/commands/screenshot.js +9 -1
- package/dist/commands/screenshot.js.map +2 -2
- package/dist/commands/send-signal.js +9 -1
- package/dist/commands/send-signal.js.map +2 -2
- package/dist/commands/type.js +9 -1
- package/dist/commands/type.js.map +2 -2
- package/dist/commands/wait-for-exit.js +9 -1
- package/dist/commands/wait-for-exit.js.map +2 -2
- package/dist/commands/wait-for.d.ts +2 -0
- package/dist/commands/wait-for.js +19 -2
- package/dist/commands/wait-for.js.map +2 -2
- package/dist/index.js +9 -1
- package/dist/index.js.map +2 -2
- package/dist/terminal-pilot.js +9 -1
- package/dist/terminal-pilot.js.map +2 -2
- package/dist/terminal-session.d.ts +1 -0
- package/dist/terminal-session.js +9 -1
- package/dist/terminal-session.js.map +2 -2
- package/dist/testing/cli-repl.js +20 -3
- package/dist/testing/cli-repl.js.map +2 -2
- package/dist/testing/qa-cli.js +20 -3
- package/dist/testing/qa-cli.js.map +2 -2
- package/node_modules/toolcraft-design/dist/index.d.ts +2 -2
- package/node_modules/toolcraft-design/dist/index.js +1 -1
- package/node_modules/toolcraft-design/dist/render-markdown-plaintext.d.ts +2 -0
- package/node_modules/toolcraft-design/dist/render-markdown-plaintext.js +1 -0
- package/node_modules/toolcraft-design/dist/terminal-markdown/index.d.ts +2 -0
- package/node_modules/toolcraft-design/dist/terminal-markdown/index.js +1 -0
- package/node_modules/toolcraft-design/dist/terminal-markdown/parser/inline.js +38 -2
- package/node_modules/toolcraft-design/dist/terminal-markdown/plaintext-renderer.d.ts +11 -0
- package/node_modules/toolcraft-design/dist/terminal-markdown/plaintext-renderer.js +228 -0
- package/node_modules/toolcraft-design/package.json +4 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/terminal-session.ts", "../src/ansi.ts", "../src/errors.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 { hasOwnErrorCode } from \"./errors.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;\nconst CLOSE_AFTER_SIGKILL_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 closePromise: Promise<number> | null = null;\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 assertTerminalGeometry(cols, rows);\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 throw new Error(`Terminal session \"${this.id}\" has already exited.`);\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.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n assertTimeout(timeout);\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 if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" exited before matching pattern: ${String(pattern)}`);\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 assertQuietPeriod(ms);\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 if (!Number.isInteger(opts.last) || opts.last < 0) {\n throw new Error(\"History last must be a non-negative integer.\");\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 assertTerminalGeometry(cols, rows);\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 (opts?.timeout !== undefined) {\n assertTimeout(opts.timeout);\n }\n\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 this.closePromise ??= this.closeProcess().catch((error: unknown) => {\n this.closePromise = null;\n throw error;\n });\n return this.closePromise;\n }\n\n private async closeProcess(): Promise<number> {\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\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 const afterSigkill = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGKILL_MS);\n if (afterSigkill !== null) {\n return afterSigkill;\n }\n }\n\n throw new Error(\"Timed out waiting for process to exit after SIGKILL.\");\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction assertTerminalGeometry(cols: number, rows: number): void {\n if (!Number.isInteger(cols) || cols <= 0 || !Number.isInteger(rows) || rows <= 0) {\n throw new Error(\"Terminal columns and rows must be positive integers.\");\n }\n}\n\nfunction assertTimeout(timeout: number): void {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new Error(\"Timeout must be a finite non-negative number.\");\n }\n}\n\nfunction assertQuietPeriod(duration: number): void {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new Error(\"Quiet period must be a finite non-negative number.\");\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 return hasOwnErrorCode(error, \"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 let line = \"\";\n let cursor = 0;\n\n for (const character of input) {\n if (character === \"\\r\") {\n cursor = 0;\n continue;\n }\n\n if (character === \"\\b\") {\n cursor = Math.max(0, cursor - 1);\n continue;\n }\n\n if (character === \"\\n\") {\n output += `${line}\\n`;\n line = \"\";\n cursor = 0;\n continue;\n }\n\n line = `${line.slice(0, cursor)}${character}${line.slice(cursor + 1)}`;\n cursor += 1;\n }\n\n return output + line;\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", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\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 conceal: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\ninterface SavedCursorState {\n x: number;\n y: number;\n autoWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\ninterface PrimaryScreenState {\n screen: Row[];\n cursorX: number;\n cursorY: number;\n pendingWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst DEC_SPECIAL_GRAPHICS: Record<string, string> = {\n j: \"\u2518\",\n k: \"\u2510\",\n l: \"\u250C\",\n m: \"\u2514\",\n n: \"\u253C\",\n q: \"\u2500\",\n t: \"\u251C\",\n u: \"\u2524\",\n v: \"\u2534\",\n w: \"\u252C\",\n x: \"\u2502\"\n};\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n StringEscape,\n EscCharset,\n EscHash\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _primaryScreen: PrimaryScreenState | null = null;\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor: SavedCursorState;\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _pendingWrap = false;\n private _originMode = false;\n private _insertMode = false;\n private _tabStops: Set<number>;\n private _lastPrintedChar: string | null = null;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n private _stringState = State.Normal;\n private _charsetTarget: \"g0\" | \"g1\" | null = null;\n private _g0Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _g1Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _shiftOut = false;\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 this._tabStops = this._createDefaultTabStops(cols);\n this._savedCursor = this._createSavedCursorState();\n\n this.displayBuffer = Object.defineProperties(\n {} as {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n },\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 = this._clamp(this._scrollTop, 0, rows - 1);\n this._scrollBottom = this._clamp(this._scrollBottom, 0, rows - 1);\n if (this._scrollTop >= this._scrollBottom) {\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n }\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 _createDefaultTabStops(cols: number): Set<number> {\n const tabStops = new Set<number>();\n for (let column = 8; column < cols; column += 8) {\n tabStops.add(column);\n }\n return tabStops;\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 _createSavedCursorState(): SavedCursorState {\n return {\n x: this._cursorX,\n y: this._cursorY,\n autoWrap: this._autoWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n }\n\n private _saveCursor(): void {\n this._savedCursor = this._createSavedCursorState();\n }\n\n private _restoreCursor(): void {\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 this._autoWrap = this._savedCursor.autoWrap;\n this._style = {\n ...this._savedCursor.style,\n fg: this._savedCursor.style.fg?.slice(),\n bg: this._savedCursor.style.bg?.slice()\n };\n this._styleSequence = this._savedCursor.styleSequence;\n }\n\n private _resetModes(): void {\n this._autoWrap = true;\n this._originMode = false;\n this._insertMode = false;\n this._pendingWrap = false;\n this._tabStops = this._createDefaultTabStops(this._cols);\n this._g0Charset = \"ascii\";\n this._g1Charset = \"ascii\";\n this._shiftOut = false;\n this._resetStyle();\n }\n\n private _writePrintable(ch: string): void {\n const width = this._cellWidth(ch);\n\n if (width === 0) {\n this._appendCombiningMark(ch);\n return;\n }\n\n if (this._autoWrap && this._pendingWrap) {\n this._cursorX = 0;\n this._newline();\n } else if (this._autoWrap && this._cursorX + width > this._cols) {\n this._cursorX = 0;\n this._newline();\n }\n\n if (this._insertMode) {\n const row = this._screen[this._cursorY];\n if (row) {\n row.splice(this._cursorX, 0, ...(Array(width).fill(null) as Cell[]));\n row.splice(this._cols);\n }\n }\n\n this._setChar(this._cursorY, this._cursorX, ch);\n for (let column = 1; column < width && this._cursorX + column < this._cols; column += 1) {\n const row = this._screen[this._cursorY];\n if (row) row[this._cursorX + column] = null;\n }\n this._lastPrintedChar = ch;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX + width, this._cols - 1);\n this._pendingWrap = false;\n } else if (this._cursorX + width >= this._cols) {\n this._cursorX = this._cols - 1;\n this._pendingWrap = true;\n } else {\n this._cursorX += width;\n this._pendingWrap = false;\n }\n }\n\n private _cellWidth(ch: string): number {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) return 0;\n if (isCombiningCodePoint(codePoint)) {\n return 0;\n }\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x303e) ||\n (codePoint >= 0x3041 && codePoint <= 0x33bf) ||\n (codePoint >= 0x3400 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4cf) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7af) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1fffd) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return Math.min(2, this._cols);\n }\n return 1;\n }\n\n private _appendCombiningMark(ch: string): void {\n const target = this._findCombiningTarget();\n if (target === null) {\n return;\n }\n\n const cell = this._screen[target.y]?.[target.x];\n if (cell === null || cell === undefined) {\n return;\n }\n\n cell[1] += ch;\n }\n\n private _findCombiningTarget(): { x: number; y: number } | null {\n const startX = this._pendingWrap ? this._cursorX : this._cursorX - 1;\n\n for (let y = this._cursorY; y >= 0; y -= 1) {\n const row = this._screen[y];\n if (row === undefined) {\n continue;\n }\n\n for (let x = y === this._cursorY ? startX : this._cols - 1; x >= 0; x -= 1) {\n if (row[x] !== null) {\n return { x, y };\n }\n }\n }\n\n return null;\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 renderedChar = this._style.conceal ? \" \" : ch;\n const cell = [renderedChar.charCodeAt(0), renderedChar] 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 this._pendingWrap = false;\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 const values = this._csiParams\n .split(\";\")\n .flatMap((segment) => segment.split(\":\"))\n .map((segment) => (segment === \"\" ? 0 : parseInt(segment, 10)));\n if ((values[0] === 38 || values[0] === 48) && values[1] === 2 && values[2] === 0) {\n values.splice(2, 1);\n }\n return values;\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 if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(6)) {\n this._originMode = final === \"h\";\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._primaryScreen = {\n screen: this._screen,\n cursorX: this._cursorX,\n cursorY: this._cursorY,\n pendingWrap: this._pendingWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._pendingWrap = false;\n } else {\n if (this._primaryScreen !== null) {\n this._screen = this._primaryScreen.screen;\n this._cursorX = this._primaryScreen.cursorX;\n this._cursorY = this._primaryScreen.cursorY;\n this._pendingWrap = this._primaryScreen.pendingWrap;\n this._style = this._primaryScreen.style;\n this._styleSequence = this._primaryScreen.styleSequence;\n this._primaryScreen = null;\n }\n }\n if (final === \"h\") this._resetStyle();\n }\n }\n return;\n }\n\n if ((final === \"h\" || final === \"l\") && params.includes(4)) {\n this._insertMode = final === \"h\";\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._originMode\n ? this._clamp(this._scrollTop + Math.max(1, p0) - 1, this._scrollTop, this._scrollBottom)\n : 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++)\n 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) {\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\": {\n // insert lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\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\": {\n // delete lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\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\": {\n // 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 \"@\": {\n // 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\": {\n // 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 \"b\": // repeat preceding character\n if (this._lastPrintedChar !== null) {\n for (let index = 0; index < Math.max(1, p0); index += 1) {\n this._writePrintable(this._lastPrintedChar);\n }\n }\n break;\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\": {\n // 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 = this._originMode ? this._scrollTop : 0;\n break;\n }\n case \"s\": // save cursor\n this._saveCursor();\n break;\n case \"u\": // restore cursor\n this._restoreCursor();\n break;\n case \"p\":\n if (this._csiPrivate === \"!\") {\n this._resetModes();\n }\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 if (this._state !== State.Normal && (code === 0x18 || code === 0x1a)) {\n this._state = State.Normal;\n return;\n }\n\n if (this._state === State.Csi && code === 0x1b) {\n this._state = State.Escape;\n return;\n }\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 ST\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Osc;\n this._state = State.StringEscape;\n }\n break;\n case State.Str:\n // consume until ST\n if (code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Str;\n this._state = State.StringEscape;\n }\n break;\n case State.StringEscape:\n this._state = ch === \"\\\\\" ? State.Normal : this._stringState;\n break;\n case State.EscCharset:\n if (this._charsetTarget === \"g0\") this._g0Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n if (this._charsetTarget === \"g1\") this._g1Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n this._charsetTarget = null;\n this._state = State.Normal;\n break;\n case State.EscHash:\n if (ch === \"8\") {\n for (let row = 0; row < this._rows; row += 1) {\n for (let column = 0; column < this._cols; column += 1) {\n this._setChar(row, column, \"E\");\n }\n }\n this._cursorX = 0;\n this._cursorY = 0;\n }\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 === 0x85) {\n // C1 NEL = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x9c) {\n // C1 ST outside a string has no visible effect\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n this._pendingWrap = false;\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL \u2014 ignore in displayed output\n } else if (code === 0x09) {\n // HT\n const nextTabStop = [...this._tabStops]\n .sort((left, right) => left - right)\n .find((tabStop) => tabStop > this._cursorX);\n this._cursorX = nextTabStop ?? this._cols - 1;\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._pendingWrap = false;\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 shift between G1 and G0 character sets\n this._shiftOut = code === 0x0e;\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n const charset = this._shiftOut ? this._g1Charset : this._g0Charset;\n this._writePrintable(charset === \"graphics\" ? (DEC_SPECIAL_GRAPHICS[ch] ?? ch) : ch);\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 (\n code === 0x28 ||\n code === 0x29 ||\n code === 0x2a ||\n code === 0x2b ||\n code === 0x2d ||\n code === 0x2e\n ) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._charsetTarget = code === 0x28 ? \"g0\" : code === 0x29 ? \"g1\" : null;\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._saveCursor();\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._restoreCursor();\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 = horizontal tab set\n this._tabStops.add(this._cursorX);\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._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetModes();\n this._savedCursor = this._createSavedCursorState();\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 || code === 0x3a) {\n // Digit, semicolon, or colon \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 8:\n this._style.conceal = 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 28:\n this._style.conceal = 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 conceal: false,\n strikethrough: false\n };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\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.conceal) {\n codes.push(8);\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>`;\nconst NAMED_KEY_PATTERN = Object.keys(NAMED_KEY_SEQUENCES).map(caseInsensitivePattern).join(\"|\");\n\nexport const TERMINAL_KEY_PATTERN = `^(?:${NAMED_KEY_PATTERN}|.|[Cc][Oo][Nn][Tt][Rr][Oo][Ll]\\\\+[A-Za-z]|[Aa][Ll][Tt]\\\\+.+)$`;\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\nfunction caseInsensitivePattern(value: string): string {\n let pattern = \"\";\n\n for (const character of value) {\n const lower = character.toLowerCase();\n const upper = character.toUpperCase();\n pattern += lower === upper ? escapePatternCharacter(character) : `[${upper}${lower}]`;\n }\n\n return pattern;\n}\n\nfunction escapePatternCharacter(character: string): string {\n return character.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\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 { hasOwnErrorCode } from \"./errors.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;\nconst CLOSE_AFTER_SIGKILL_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 scope?: \"history\" | \"screen\";\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 closePromise: Promise<number> | null = null;\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 assertTerminalGeometry(cols, rows);\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 throw new Error(`Terminal session \"${this.id}\" has already exited.`);\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.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 scope = opts?.scope ?? \"history\";\n assertTimeout(timeout);\n assertWaitScope(scope);\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const source = scope === \"screen\" ? (await this.screen()).text : this.rawBuffer;\n const matched = matchPattern(source, pattern);\n if (matched !== null) {\n return matched;\n }\n\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" exited before matching pattern: ${String(pattern)}`);\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 assertQuietPeriod(ms);\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 if (!Number.isInteger(opts.last) || opts.last < 0) {\n throw new Error(\"History last must be a non-negative integer.\");\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 assertTerminalGeometry(cols, rows);\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 (opts?.timeout !== undefined) {\n assertTimeout(opts.timeout);\n }\n\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 this.closePromise ??= this.closeProcess().catch((error: unknown) => {\n this.closePromise = null;\n throw error;\n });\n return this.closePromise;\n }\n\n private async closeProcess(): Promise<number> {\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\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 const afterSigkill = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGKILL_MS);\n if (afterSigkill !== null) {\n return afterSigkill;\n }\n }\n\n throw new Error(\"Timed out waiting for process to exit after SIGKILL.\");\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction assertTerminalGeometry(cols: number, rows: number): void {\n if (!Number.isInteger(cols) || cols <= 0 || !Number.isInteger(rows) || rows <= 0) {\n throw new Error(\"Terminal columns and rows must be positive integers.\");\n }\n}\n\nfunction assertTimeout(timeout: number): void {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new Error(\"Timeout must be a finite non-negative number.\");\n }\n}\n\nfunction assertWaitScope(scope: string): void {\n if (scope !== \"history\" && scope !== \"screen\") {\n throw new Error('Wait scope must be either \"history\" or \"screen\".');\n }\n}\n\nfunction assertQuietPeriod(duration: number): void {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new Error(\"Quiet period must be a finite non-negative number.\");\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 return hasOwnErrorCode(error, \"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 let line = \"\";\n let cursor = 0;\n\n for (const character of input) {\n if (character === \"\\r\") {\n cursor = 0;\n continue;\n }\n\n if (character === \"\\b\") {\n cursor = Math.max(0, cursor - 1);\n continue;\n }\n\n if (character === \"\\n\") {\n output += `${line}\\n`;\n line = \"\";\n cursor = 0;\n continue;\n }\n\n line = `${line.slice(0, cursor)}${character}${line.slice(cursor + 1)}`;\n cursor += 1;\n }\n\n return output + line;\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", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\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 conceal: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\ninterface SavedCursorState {\n x: number;\n y: number;\n autoWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\ninterface PrimaryScreenState {\n screen: Row[];\n cursorX: number;\n cursorY: number;\n pendingWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst DEC_SPECIAL_GRAPHICS: Record<string, string> = {\n j: \"\u2518\",\n k: \"\u2510\",\n l: \"\u250C\",\n m: \"\u2514\",\n n: \"\u253C\",\n q: \"\u2500\",\n t: \"\u251C\",\n u: \"\u2524\",\n v: \"\u2534\",\n w: \"\u252C\",\n x: \"\u2502\"\n};\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n StringEscape,\n EscCharset,\n EscHash\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _primaryScreen: PrimaryScreenState | null = null;\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor: SavedCursorState;\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _pendingWrap = false;\n private _originMode = false;\n private _insertMode = false;\n private _tabStops: Set<number>;\n private _lastPrintedChar: string | null = null;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n private _stringState = State.Normal;\n private _charsetTarget: \"g0\" | \"g1\" | null = null;\n private _g0Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _g1Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _shiftOut = false;\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 this._tabStops = this._createDefaultTabStops(cols);\n this._savedCursor = this._createSavedCursorState();\n\n this.displayBuffer = Object.defineProperties(\n {} as {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n },\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 = this._clamp(this._scrollTop, 0, rows - 1);\n this._scrollBottom = this._clamp(this._scrollBottom, 0, rows - 1);\n if (this._scrollTop >= this._scrollBottom) {\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n }\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 _createDefaultTabStops(cols: number): Set<number> {\n const tabStops = new Set<number>();\n for (let column = 8; column < cols; column += 8) {\n tabStops.add(column);\n }\n return tabStops;\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 _createSavedCursorState(): SavedCursorState {\n return {\n x: this._cursorX,\n y: this._cursorY,\n autoWrap: this._autoWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n }\n\n private _saveCursor(): void {\n this._savedCursor = this._createSavedCursorState();\n }\n\n private _restoreCursor(): void {\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 this._autoWrap = this._savedCursor.autoWrap;\n this._style = {\n ...this._savedCursor.style,\n fg: this._savedCursor.style.fg?.slice(),\n bg: this._savedCursor.style.bg?.slice()\n };\n this._styleSequence = this._savedCursor.styleSequence;\n }\n\n private _resetModes(): void {\n this._autoWrap = true;\n this._originMode = false;\n this._insertMode = false;\n this._pendingWrap = false;\n this._tabStops = this._createDefaultTabStops(this._cols);\n this._g0Charset = \"ascii\";\n this._g1Charset = \"ascii\";\n this._shiftOut = false;\n this._resetStyle();\n }\n\n private _writePrintable(ch: string): void {\n const width = this._cellWidth(ch);\n\n if (width === 0) {\n this._appendCombiningMark(ch);\n return;\n }\n\n if (this._autoWrap && this._pendingWrap) {\n this._cursorX = 0;\n this._newline();\n } else if (this._autoWrap && this._cursorX + width > this._cols) {\n this._cursorX = 0;\n this._newline();\n }\n\n if (this._insertMode) {\n const row = this._screen[this._cursorY];\n if (row) {\n row.splice(this._cursorX, 0, ...(Array(width).fill(null) as Cell[]));\n row.splice(this._cols);\n }\n }\n\n this._setChar(this._cursorY, this._cursorX, ch);\n for (let column = 1; column < width && this._cursorX + column < this._cols; column += 1) {\n const row = this._screen[this._cursorY];\n if (row) row[this._cursorX + column] = null;\n }\n this._lastPrintedChar = ch;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX + width, this._cols - 1);\n this._pendingWrap = false;\n } else if (this._cursorX + width >= this._cols) {\n this._cursorX = this._cols - 1;\n this._pendingWrap = true;\n } else {\n this._cursorX += width;\n this._pendingWrap = false;\n }\n }\n\n private _cellWidth(ch: string): number {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) return 0;\n if (isCombiningCodePoint(codePoint)) {\n return 0;\n }\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x303e) ||\n (codePoint >= 0x3041 && codePoint <= 0x33bf) ||\n (codePoint >= 0x3400 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4cf) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7af) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1fffd) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return Math.min(2, this._cols);\n }\n return 1;\n }\n\n private _appendCombiningMark(ch: string): void {\n const target = this._findCombiningTarget();\n if (target === null) {\n return;\n }\n\n const cell = this._screen[target.y]?.[target.x];\n if (cell === null || cell === undefined) {\n return;\n }\n\n cell[1] += ch;\n }\n\n private _findCombiningTarget(): { x: number; y: number } | null {\n const startX = this._pendingWrap ? this._cursorX : this._cursorX - 1;\n\n for (let y = this._cursorY; y >= 0; y -= 1) {\n const row = this._screen[y];\n if (row === undefined) {\n continue;\n }\n\n for (let x = y === this._cursorY ? startX : this._cols - 1; x >= 0; x -= 1) {\n if (row[x] !== null) {\n return { x, y };\n }\n }\n }\n\n return null;\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 renderedChar = this._style.conceal ? \" \" : ch;\n const cell = [renderedChar.charCodeAt(0), renderedChar] 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 this._pendingWrap = false;\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 const values = this._csiParams\n .split(\";\")\n .flatMap((segment) => segment.split(\":\"))\n .map((segment) => (segment === \"\" ? 0 : parseInt(segment, 10)));\n if ((values[0] === 38 || values[0] === 48) && values[1] === 2 && values[2] === 0) {\n values.splice(2, 1);\n }\n return values;\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 if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(6)) {\n this._originMode = final === \"h\";\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._primaryScreen = {\n screen: this._screen,\n cursorX: this._cursorX,\n cursorY: this._cursorY,\n pendingWrap: this._pendingWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._pendingWrap = false;\n } else {\n if (this._primaryScreen !== null) {\n this._screen = this._primaryScreen.screen;\n this._cursorX = this._primaryScreen.cursorX;\n this._cursorY = this._primaryScreen.cursorY;\n this._pendingWrap = this._primaryScreen.pendingWrap;\n this._style = this._primaryScreen.style;\n this._styleSequence = this._primaryScreen.styleSequence;\n this._primaryScreen = null;\n }\n }\n if (final === \"h\") this._resetStyle();\n }\n }\n return;\n }\n\n if ((final === \"h\" || final === \"l\") && params.includes(4)) {\n this._insertMode = final === \"h\";\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._originMode\n ? this._clamp(this._scrollTop + Math.max(1, p0) - 1, this._scrollTop, this._scrollBottom)\n : 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++)\n 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) {\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\": {\n // insert lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\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\": {\n // delete lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\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\": {\n // 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 \"@\": {\n // 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\": {\n // 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 \"b\": // repeat preceding character\n if (this._lastPrintedChar !== null) {\n for (let index = 0; index < Math.max(1, p0); index += 1) {\n this._writePrintable(this._lastPrintedChar);\n }\n }\n break;\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\": {\n // 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 = this._originMode ? this._scrollTop : 0;\n break;\n }\n case \"s\": // save cursor\n this._saveCursor();\n break;\n case \"u\": // restore cursor\n this._restoreCursor();\n break;\n case \"p\":\n if (this._csiPrivate === \"!\") {\n this._resetModes();\n }\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 if (this._state !== State.Normal && (code === 0x18 || code === 0x1a)) {\n this._state = State.Normal;\n return;\n }\n\n if (this._state === State.Csi && code === 0x1b) {\n this._state = State.Escape;\n return;\n }\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 ST\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Osc;\n this._state = State.StringEscape;\n }\n break;\n case State.Str:\n // consume until ST\n if (code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Str;\n this._state = State.StringEscape;\n }\n break;\n case State.StringEscape:\n this._state = ch === \"\\\\\" ? State.Normal : this._stringState;\n break;\n case State.EscCharset:\n if (this._charsetTarget === \"g0\") this._g0Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n if (this._charsetTarget === \"g1\") this._g1Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n this._charsetTarget = null;\n this._state = State.Normal;\n break;\n case State.EscHash:\n if (ch === \"8\") {\n for (let row = 0; row < this._rows; row += 1) {\n for (let column = 0; column < this._cols; column += 1) {\n this._setChar(row, column, \"E\");\n }\n }\n this._cursorX = 0;\n this._cursorY = 0;\n }\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 === 0x85) {\n // C1 NEL = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x9c) {\n // C1 ST outside a string has no visible effect\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n this._pendingWrap = false;\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL \u2014 ignore in displayed output\n } else if (code === 0x09) {\n // HT\n const nextTabStop = [...this._tabStops]\n .sort((left, right) => left - right)\n .find((tabStop) => tabStop > this._cursorX);\n this._cursorX = nextTabStop ?? this._cols - 1;\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._pendingWrap = false;\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 shift between G1 and G0 character sets\n this._shiftOut = code === 0x0e;\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n const charset = this._shiftOut ? this._g1Charset : this._g0Charset;\n this._writePrintable(charset === \"graphics\" ? (DEC_SPECIAL_GRAPHICS[ch] ?? ch) : ch);\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 (\n code === 0x28 ||\n code === 0x29 ||\n code === 0x2a ||\n code === 0x2b ||\n code === 0x2d ||\n code === 0x2e\n ) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._charsetTarget = code === 0x28 ? \"g0\" : code === 0x29 ? \"g1\" : null;\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._saveCursor();\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._restoreCursor();\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 = horizontal tab set\n this._tabStops.add(this._cursorX);\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._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetModes();\n this._savedCursor = this._createSavedCursorState();\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 || code === 0x3a) {\n // Digit, semicolon, or colon \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 8:\n this._style.conceal = 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 28:\n this._style.conceal = 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 conceal: false,\n strikethrough: false\n };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\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.conceal) {\n codes.push(8);\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>`;\nconst NAMED_KEY_PATTERN = Object.keys(NAMED_KEY_SEQUENCES).map(caseInsensitivePattern).join(\"|\");\n\nexport const TERMINAL_KEY_PATTERN = `^(?:${NAMED_KEY_PATTERN}|.|[Cc][Oo][Nn][Tt][Rr][Oo][Ll]\\\\+[A-Za-z]|[Aa][Ll][Tt]\\\\+.+)$`;\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\nfunction caseInsensitivePattern(value: string): string {\n let pattern = \"\";\n\n for (const character of value) {\n const lower = character.toLowerCase();\n const upper = character.toUpperCase();\n pattern += lower === upper ? escapePatternCharacter(character) : `[${upper}${lower}]`;\n }\n\n return pattern;\n}\n\nfunction escapePatternCharacter(character: string): string {\n return character.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\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;;;AC/FO,SAAS,gBAAgB,OAAgB,MAAuB;AACrE,SACE,iBAAiB,SACjB,OAAO,UAAU,eAAe,KAAK,OAAO,MAAM,KACjD,MAA6B,SAAS;AAE3C;;;AC0BA,IAAM,YAAY;AAClB,IAAM,uBAA+C;AAAA,EACnD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAaO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAA4C;AAAA,EAC5C,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA,mBAAkC;AAAA,EAClC,SAAwB,wBAAwB;AAAA,EAChD,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAqC;AAAA,EACrC,aAAmC;AAAA,EACnC,aAAmC;AAAA,EACnC,YAAY;AAAA,EAEX;AAAA,EAMT,YAAY,MAAc,MAAc;AACtC,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,gBAAgB,OAAO;AAC5B,SAAK,UAAU,KAAK,YAAY,MAAM,IAAI;AAC1C,SAAK,YAAY,KAAK,uBAAuB,IAAI;AACjD,SAAK,eAAe,KAAK,wBAAwB;AAEjD,SAAK,gBAAgB,OAAO;AAAA,MAC1B,CAAC;AAAA,MAKD;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,KAAK,OAAO,KAAK,YAAY,GAAG,OAAO,CAAC;AAC1D,SAAK,gBAAgB,KAAK,OAAO,KAAK,eAAe,GAAG,OAAO,CAAC;AAChE,QAAI,KAAK,cAAc,KAAK,eAAe;AACzC,WAAK,aAAa;AAClB,WAAK,gBAAgB,OAAO;AAAA,IAC9B;AACA,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,uBAAuB,MAA2B;AACxD,UAAM,WAAW,oBAAI,IAAY;AACjC,aAAS,SAAS,GAAG,SAAS,MAAM,UAAU,GAAG;AAC/C,eAAS,IAAI,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,OAAe,KAAa,KAAqB;AAC9D,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEQ,0BAA4C;AAClD,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,MACf,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,KAAK,OAAO,IAAI,MAAM,GAAG,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE;AAAA,MAClF,eAAe,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,eAAe,KAAK,wBAAwB;AAAA,EACnD;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,SAAK,WAAW,KAAK,OAAO,KAAK,aAAa,GAAG,GAAG,KAAK,QAAQ,CAAC;AAClE,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,SAAS;AAAA,MACZ,GAAG,KAAK,aAAa;AAAA,MACrB,IAAI,KAAK,aAAa,MAAM,IAAI,MAAM;AAAA,MACtC,IAAI,KAAK,aAAa,MAAM,IAAI,MAAM;AAAA,IACxC;AACA,SAAK,iBAAiB,KAAK,aAAa;AAAA,EAC1C;AAAA,EAEQ,cAAoB;AAC1B,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,YAAY,KAAK,uBAAuB,KAAK,KAAK;AACvD,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,gBAAgB,IAAkB;AACxC,UAAM,QAAQ,KAAK,WAAW,EAAE;AAEhC,QAAI,UAAU,GAAG;AACf,WAAK,qBAAqB,EAAE;AAC5B;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,KAAK,cAAc;AACvC,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,KAAK,aAAa,KAAK,WAAW,QAAQ,KAAK,OAAO;AAC/D,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB;AAEA,QAAI,KAAK,aAAa;AACpB,YAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,UAAI,KAAK;AACP,YAAI,OAAO,KAAK,UAAU,GAAG,GAAI,MAAM,KAAK,EAAE,KAAK,IAAI,CAAY;AACnE,YAAI,OAAO,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,SAAS,KAAK,UAAU,KAAK,UAAU,EAAE;AAC9C,aAAS,SAAS,GAAG,SAAS,SAAS,KAAK,WAAW,SAAS,KAAK,OAAO,UAAU,GAAG;AACvF,YAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;AACtC,UAAI,IAAK,KAAI,KAAK,WAAW,MAAM,IAAI;AAAA,IACzC;AACA,SAAK,mBAAmB;AAExB,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,WAAW,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,CAAC;AAC9D,WAAK,eAAe;AAAA,IACtB,WAAW,KAAK,WAAW,SAAS,KAAK,OAAO;AAC9C,WAAK,WAAW,KAAK,QAAQ;AAC7B,WAAK,eAAe;AAAA,IACtB,OAAO;AACL,WAAK,YAAY;AACjB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,WAAW,IAAoB;AACrC,UAAM,YAAY,GAAG,YAAY,CAAC;AAClC,QAAI,cAAc,OAAW,QAAO;AACpC,QAAI,qBAAqB,SAAS,GAAG;AACnC,aAAO;AAAA,IACT;AACA,QACG,aAAa,QAAU,aAAa,QACrC,cAAc,QACd,cAAc,QACb,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAU,aAAa,SACpC,aAAa,UAAW,aAAa,UACrC,aAAa,UAAW,aAAa,QACtC;AACA,aAAO,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,IAAkB;AAC7C,UAAM,SAAS,KAAK,qBAAqB;AACzC,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAQ,OAAO,CAAC,IAAI,OAAO,CAAC;AAC9C,QAAI,SAAS,QAAQ,SAAS,QAAW;AACvC;AAAA,IACF;AAEA,SAAK,CAAC,KAAK;AAAA,EACb;AAAA,EAEQ,uBAAwD;AAC9D,UAAM,SAAS,KAAK,eAAe,KAAK,WAAW,KAAK,WAAW;AAEnE,aAAS,IAAI,KAAK,UAAU,KAAK,GAAG,KAAK,GAAG;AAC1C,YAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,UAAI,QAAQ,QAAW;AACrB;AAAA,MACF;AAEA,eAAS,IAAI,MAAM,KAAK,WAAW,SAAS,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG;AAC1E,YAAI,IAAI,CAAC,MAAM,MAAM;AACnB,iBAAO,EAAE,GAAG,EAAE;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,GAAW,GAAW,IAAkB;AACvD,UAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,QAAI,OAAO,KAAK,KAAK,IAAI,KAAK,OAAO;AACnC,YAAM,eAAe,KAAK,OAAO,UAAU,MAAM;AACjD,YAAM,OAAO,CAAC,aAAa,WAAW,CAAC,GAAG,YAAY;AAEtD,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,SAAK,eAAe;AACpB,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,UAAM,SAAS,KAAK,WACjB,MAAM,GAAG,EACT,QAAQ,CAAC,YAAY,QAAQ,MAAM,GAAG,CAAC,EACvC,IAAI,CAAC,YAAa,YAAY,KAAK,IAAI,SAAS,SAAS,EAAE,CAAE;AAChE,SAAK,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG;AAChF,aAAO,OAAO,GAAG,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;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;AAClC,YAAI,OAAO,SAAS,CAAC,GAAG;AACtB,eAAK,YAAY,UAAU;AAAA,QAC7B;AAEA,YAAI,OAAO,SAAS,CAAC,GAAG;AACtB,eAAK,cAAc,UAAU;AAC7B,eAAK,WAAW;AAChB,eAAK,WAAW,KAAK,cAAc,KAAK,aAAa;AAAA,QACvD;AAEA,YAAI,OAAO,SAAS,IAAI,GAAG;AACzB,cAAI,UAAU,KAAK;AACjB,iBAAK,iBAAiB;AAAA,cACpB,QAAQ,KAAK;AAAA,cACb,SAAS,KAAK;AAAA,cACd,SAAS,KAAK;AAAA,cACd,aAAa,KAAK;AAAA,cAClB,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,KAAK,OAAO,IAAI,MAAM,GAAG,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE;AAAA,cAClF,eAAe,KAAK;AAAA,YACtB;AACA,iBAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,iBAAK,WAAW;AAChB,iBAAK,WAAW;AAChB,iBAAK,eAAe;AAAA,UACtB,OAAO;AACL,gBAAI,KAAK,mBAAmB,MAAM;AAChC,mBAAK,UAAU,KAAK,eAAe;AACnC,mBAAK,WAAW,KAAK,eAAe;AACpC,mBAAK,WAAW,KAAK,eAAe;AACpC,mBAAK,eAAe,KAAK,eAAe;AACxC,mBAAK,SAAS,KAAK,eAAe;AAClC,mBAAK,iBAAiB,KAAK,eAAe;AAC1C,mBAAK,iBAAiB;AAAA,YACxB;AAAA,UACF;AACA,cAAI,UAAU,IAAK,MAAK,YAAY;AAAA,QACtC;AAAA,MACF;AACA;AAAA,IACF;AAEA,SAAK,UAAU,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC,GAAG;AAC1D,WAAK,cAAc,UAAU;AAC7B;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,cACjB,KAAK,OAAO,KAAK,aAAa,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,KAAK,YAAY,KAAK,aAAa,IACtF,KAAK,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;AACtD,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;AAC9C,iBAAK,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;AAAA,QACxC,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,GAAG;AACnB,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;AAER,YAAI,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,KAAK,eAAe;AACzE;AAAA,QACF;AACA,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;AAER,YAAI,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,KAAK,eAAe;AACzE;AAAA,QACF;AACA,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;AAER,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;AAER,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;AAER,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,YAAI,KAAK,qBAAqB,MAAM;AAClC,mBAAS,QAAQ,GAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,GAAG,SAAS,GAAG;AACvD,iBAAK,gBAAgB,KAAK,gBAAgB;AAAA,UAC5C;AAAA,QACF;AACA;AAAA,MACF,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;AAER,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,KAAK,cAAc,KAAK,aAAa;AACrD;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,YAAY;AACjB;AAAA,MACF,KAAK;AACH,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,YAAI,KAAK,gBAAgB,KAAK;AAC5B,eAAK,YAAY;AAAA,QACnB;AACA;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,QAAI,KAAK,WAAW,mBAAiB,SAAS,MAAQ,SAAS,KAAO;AACpE,WAAK,SAAS;AACd;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,eAAa,SAAS,IAAM;AAC9C,WAAK,SAAS;AACd;AAAA,IACF;AAEA,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;AACxB,eAAK,eAAe;AACpB,eAAK,SAAS;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AAEH,YAAI,SAAS,KAAM;AACjB,eAAK,SAAS;AAAA,QAChB,WAAW,SAAS,IAAM;AACxB,eAAK,eAAe;AACpB,eAAK,SAAS;AAAA,QAChB;AACA;AAAA,MACF,KAAK;AACH,aAAK,SAAS,OAAO,OAAO,iBAAe,KAAK;AAChD;AAAA,MACF,KAAK;AACH,YAAI,KAAK,mBAAmB,KAAM,MAAK,aAAa,OAAO,MAAM,aAAa;AAC9E,YAAI,KAAK,mBAAmB,KAAM,MAAK,aAAa,OAAO,MAAM,aAAa;AAC9E,aAAK,iBAAiB;AACtB,aAAK,SAAS;AACd;AAAA,MACF,KAAK;AACH,YAAI,OAAO,KAAK;AACd,mBAAS,MAAM,GAAG,MAAM,KAAK,OAAO,OAAO,GAAG;AAC5C,qBAAS,SAAS,GAAG,SAAS,KAAK,OAAO,UAAU,GAAG;AACrD,mBAAK,SAAS,KAAK,QAAQ,GAAG;AAAA,YAChC;AAAA,UACF;AACA,eAAK,WAAW;AAChB,eAAK,WAAW;AAAA,QAClB;AACA,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,KAAM;AAExB,WAAK,WAAW;AAChB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,KAAM;AAAA,IAE1B,WAAW,SAAS,KAAQ,SAAS,KAAQ,SAAS,GAAM;AAAA,IAE5D,WAAW,SAAS,GAAM;AAExB,WAAK,eAAe;AACpB,UAAI,KAAK,WAAW,EAAG,MAAK;AAAA,IAC9B,WAAW,SAAS,KAAM;AAAA,IAE1B,WAAW,SAAS,GAAM;AAExB,YAAM,cAAc,CAAC,GAAG,KAAK,SAAS,EACnC,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK,EAClC,KAAK,CAAC,YAAY,UAAU,KAAK,QAAQ;AAC5C,WAAK,WAAW,eAAe,KAAK,QAAQ;AAAA,IAC9C,WAAW,SAAS,MAAQ,SAAS,MAAQ,SAAS,IAAM;AAE1D,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,eAAe;AACpB,WAAK,WAAW;AAAA,IAClB,WAAW,SAAS,MAAQ,SAAS,IAAM;AAEzC,WAAK,YAAY,SAAS;AAAA,IAC5B,WAAW,QAAQ,MAAQ,SAAS,KAAM;AAExC,YAAM,UAAU,KAAK,YAAY,KAAK,aAAa,KAAK;AACxD,WAAK,gBAAgB,YAAY,aAAc,qBAAqB,EAAE,KAAK,KAAM,EAAE;AAAA,IACrF;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,WACE,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,IACT;AAEA,WAAK,iBAAiB,SAAS,KAAO,OAAO,SAAS,KAAO,OAAO;AACpE,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,SAAS;AAAA,IAChB,WAAW,SAAS,IAAM;AAExB,WAAK,YAAY;AAAA,IACnB,WAAW,SAAS,IAAM;AAExB,WAAK,eAAe;AAAA,IACtB,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;AAExB,WAAK,UAAU,IAAI,KAAK,QAAQ;AAAA,IAClC,WAAW,SAAS,IAAM;AAExB,WAAK,UAAU,KAAK,YAAY,KAAK,OAAO,KAAK,KAAK;AACtD,WAAK,WAAW;AAChB,WAAK,WAAW;AAChB,WAAK,aAAa;AAClB,WAAK,gBAAgB,KAAK,QAAQ;AAClC,WAAK,YAAY;AACjB,WAAK,eAAe,KAAK,wBAAwB;AAAA,IACnD;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,MAAQ,SAAS,IAAM;AAE3E,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,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,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,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AACF;AAEA,SAAS,qBAAqB,WAA4B;AACxD,SACG,aAAa,OAAU,aAAa,OACpC,aAAa,QAAU,aAAa,QACpC,aAAa,QAAU,aAAa,QACpC,aAAa,QAAU,aAAa,QACpC,aAAa,SAAU,aAAa;AAEzC;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,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;;;AC/8BA,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;AAClF,IAAM,oBAAoB,OAAO,KAAK,mBAAmB,EAAE,IAAI,sBAAsB,EAAE,KAAK,GAAG;AAExF,IAAM,uBAAuB,OAAO,iBAAiB;AAE5D,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;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI,UAAU;AAEd,aAAW,aAAa,OAAO;AAC7B,UAAM,QAAQ,UAAU,YAAY;AACpC,UAAM,QAAQ,UAAU,YAAY;AACpC,eAAW,UAAU,QAAQ,uBAAuB,SAAS,IAAI,IAAI,KAAK,GAAG,KAAK;AAAA,EACpF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,WAA2B;AACzD,SAAO,UAAU,QAAQ,uBAAuB,MAAM;AACxD;;;AC9GO,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;;;ALlCA,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AACtB,IAAM,8BAA8B;AACpC,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AA+BxB,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,eAAuC;AAAA,EAE/C,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,2BAAuB,MAAM,IAAI;AACjC,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,YAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE,uBAAuB;AAAA,IACrE;AAEA,SAAK,IAAI,MAAM,GAAG;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,QAAI,KAAK,aAAa,MAAM;AAC1B;AAAA,IACF;AAEA,SAAK,IAAI,KAAK,GAAG;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ,SAA0B,MAAwC;AAC9E,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,MAAM,SAAS;AAC7B,kBAAc,OAAO;AACrB,oBAAgB,KAAK;AACrB,UAAM,YAAY,KAAK,IAAI;AAE3B,WAAO,KAAK,IAAI,IAAI,aAAa,SAAS;AACxC,YAAM,SAAS,UAAU,YAAY,MAAM,KAAK,OAAO,GAAG,OAAO,KAAK;AACtE,YAAM,UAAU,aAAa,QAAQ,OAAO;AAC5C,UAAI,YAAY,MAAM;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,KAAK,aAAa,MAAM;AAC1B,cAAM,IAAI,MAAM,qBAAqB,KAAK,EAAE,qCAAqC,OAAO,OAAO,CAAC,EAAE;AAAA,MACpG;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,sBAAkB,EAAE;AACpB,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,QAAI,CAAC,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,OAAO,GAAG;AACjD,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,IAAI;AAClD,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAO,MAAc,MAA6B;AACtD,2BAAuB,MAAM,IAAI;AACjC,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,MAAM,YAAY,QAAW;AAC/B,oBAAc,KAAK,OAAO;AAAA,IAC5B;AAEA,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,SAAK,iBAAiB,KAAK,aAAa,EAAE,MAAM,CAAC,UAAmB;AAClE,WAAK,eAAe;AACpB,YAAM;AAAA,IACR,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAAgC;AAC5C,UAAM,mBAAmB,MAAM,YAAY,KAAK,aAAa,2BAA2B;AACxF,QAAI,qBAAqB,MAAM;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,IAAI,KAAK,SAAS;AACvB,YAAM,eAAe,MAAM,YAAY,KAAK,aAAa,sBAAsB;AAC/E,UAAI,iBAAiB,MAAM;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,IAAI,KAAK,SAAS;AACvB,YAAM,eAAe,MAAM,YAAY,KAAK,aAAa,sBAAsB;AAC/E,UAAI,iBAAiB,MAAM;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAAA,EAEA,GAAG,OAAe,IAAkC;AAClD,SAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,EAC3B;AACF;AAEA,SAAS,uBAAuB,MAAc,MAAoB;AAChE,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,GAAG;AAChF,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACF;AAEA,SAAS,cAAc,SAAuB;AAC5C,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU,GAAG;AAC5C,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACF;AAEA,SAAS,gBAAgB,OAAqB;AAC5C,MAAI,UAAU,aAAa,UAAU,UAAU;AAC7C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACF;AAEA,SAAS,kBAAkB,UAAwB;AACjD,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG;AAC9C,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;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,SAAO,gBAAgB,OAAO,QAAQ;AACxC;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;AACb,MAAI,OAAO;AACX,MAAI,SAAS;AAEb,aAAW,aAAa,OAAO;AAC7B,QAAI,cAAc,MAAM;AACtB,eAAS;AACT;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,eAAS,KAAK,IAAI,GAAG,SAAS,CAAC;AAC/B;AAAA,IACF;AAEA,QAAI,cAAc,MAAM;AACtB,gBAAU,GAAG,IAAI;AAAA;AACjB,aAAO;AACP,eAAS;AACT;AAAA,IACF;AAEA,WAAO,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK,MAAM,SAAS,CAAC,CAAC;AACpE,cAAU;AAAA,EACZ;AAEA,SAAO,SAAS;AAClB;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
|
}
|
package/dist/testing/cli-repl.js
CHANGED
|
@@ -18998,10 +18998,13 @@ var TerminalSession = class {
|
|
|
18998
18998
|
}
|
|
18999
18999
|
async waitFor(pattern, opts) {
|
|
19000
19000
|
const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
19001
|
+
const scope = opts?.scope ?? "history";
|
|
19001
19002
|
assertTimeout(timeout);
|
|
19003
|
+
assertWaitScope(scope);
|
|
19002
19004
|
const startedAt = Date.now();
|
|
19003
19005
|
while (Date.now() - startedAt <= timeout) {
|
|
19004
|
-
const
|
|
19006
|
+
const source = scope === "screen" ? (await this.screen()).text : this.rawBuffer;
|
|
19007
|
+
const matched = matchPattern(source, pattern);
|
|
19005
19008
|
if (matched !== null) {
|
|
19006
19009
|
return matched;
|
|
19007
19010
|
}
|
|
@@ -19122,6 +19125,11 @@ function assertTimeout(timeout) {
|
|
|
19122
19125
|
throw new Error("Timeout must be a finite non-negative number.");
|
|
19123
19126
|
}
|
|
19124
19127
|
}
|
|
19128
|
+
function assertWaitScope(scope) {
|
|
19129
|
+
if (scope !== "history" && scope !== "screen") {
|
|
19130
|
+
throw new Error('Wait scope must be either "history" or "screen".');
|
|
19131
|
+
}
|
|
19132
|
+
}
|
|
19125
19133
|
function assertQuietPeriod(duration) {
|
|
19126
19134
|
if (!Number.isFinite(duration) || duration < 0) {
|
|
19127
19135
|
throw new Error("Quiet period must be a finite non-negative number.");
|
|
@@ -22822,6 +22830,11 @@ var params15 = S.Object({
|
|
|
22822
22830
|
timeout: S.Optional(
|
|
22823
22831
|
S.Number({ short: "t", description: "Maximum wait time in milliseconds", minimum: 0 })
|
|
22824
22832
|
),
|
|
22833
|
+
scope: S.Optional(
|
|
22834
|
+
S.Enum(["history", "screen"], {
|
|
22835
|
+
description: "Search all captured output or only the current visible screen"
|
|
22836
|
+
})
|
|
22837
|
+
),
|
|
22825
22838
|
literal: S.Optional(
|
|
22826
22839
|
S.Boolean({
|
|
22827
22840
|
short: "l",
|
|
@@ -22845,7 +22858,11 @@ var waitFor = defineCommand({
|
|
|
22845
22858
|
env
|
|
22846
22859
|
);
|
|
22847
22860
|
const pattern = params17.literal === true ? params17.pattern : new RegExp(params17.pattern);
|
|
22848
|
-
const
|
|
22861
|
+
const options = params17.timeout === void 0 && params17.scope === void 0 ? void 0 : {
|
|
22862
|
+
...params17.timeout === void 0 ? {} : { timeout: params17.timeout },
|
|
22863
|
+
...params17.scope === void 0 ? {} : { scope: params17.scope }
|
|
22864
|
+
};
|
|
22865
|
+
const line = await namedSession.session.waitFor(pattern, options);
|
|
22849
22866
|
return { matched: true, line };
|
|
22850
22867
|
}
|
|
22851
22868
|
});
|
|
@@ -23311,7 +23328,7 @@ function sleep2(ms) {
|
|
|
23311
23328
|
// src/cli.ts
|
|
23312
23329
|
configureTheme({ brand: "green", label: "Terminal Pilot" });
|
|
23313
23330
|
function getBundledPackageVersion() {
|
|
23314
|
-
return true ? "0.0.
|
|
23331
|
+
return true ? "0.0.41" : void 0;
|
|
23315
23332
|
}
|
|
23316
23333
|
function normalizeArgv(argv) {
|
|
23317
23334
|
if (argv.includes("--json") && !argv.some((argument) => argument === "--output" || argument.startsWith("--output="))) {
|