terminal-pilot 0.0.39 → 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.
Files changed (61) hide show
  1. package/README.md +13 -1
  2. package/dist/cli.js +24 -4
  3. package/dist/cli.js.map +2 -2
  4. package/dist/commands/close-session.js +9 -1
  5. package/dist/commands/close-session.js.map +2 -2
  6. package/dist/commands/create-session.js +9 -1
  7. package/dist/commands/create-session.js.map +2 -2
  8. package/dist/commands/daemon-runtime.js +13 -2
  9. package/dist/commands/daemon-runtime.js.map +2 -2
  10. package/dist/commands/fill.js +9 -1
  11. package/dist/commands/fill.js.map +2 -2
  12. package/dist/commands/get-session.js +9 -1
  13. package/dist/commands/get-session.js.map +2 -2
  14. package/dist/commands/index.d.ts +4 -0
  15. package/dist/commands/index.js +19 -2
  16. package/dist/commands/index.js.map +2 -2
  17. package/dist/commands/list-sessions.js +9 -1
  18. package/dist/commands/list-sessions.js.map +2 -2
  19. package/dist/commands/press-key.js +9 -1
  20. package/dist/commands/press-key.js.map +2 -2
  21. package/dist/commands/read-history.js +9 -1
  22. package/dist/commands/read-history.js.map +2 -2
  23. package/dist/commands/read-screen.js +9 -1
  24. package/dist/commands/read-screen.js.map +2 -2
  25. package/dist/commands/resize.js +9 -1
  26. package/dist/commands/resize.js.map +2 -2
  27. package/dist/commands/runtime.js +9 -1
  28. package/dist/commands/runtime.js.map +2 -2
  29. package/dist/commands/screenshot.js +9 -1
  30. package/dist/commands/screenshot.js.map +2 -2
  31. package/dist/commands/send-signal.js +9 -1
  32. package/dist/commands/send-signal.js.map +2 -2
  33. package/dist/commands/type.js +9 -1
  34. package/dist/commands/type.js.map +2 -2
  35. package/dist/commands/wait-for-exit.js +9 -1
  36. package/dist/commands/wait-for-exit.js.map +2 -2
  37. package/dist/commands/wait-for.d.ts +2 -0
  38. package/dist/commands/wait-for.js +19 -2
  39. package/dist/commands/wait-for.js.map +2 -2
  40. package/dist/index.js +9 -1
  41. package/dist/index.js.map +2 -2
  42. package/dist/terminal-pilot.js +9 -1
  43. package/dist/terminal-pilot.js.map +2 -2
  44. package/dist/terminal-session.d.ts +1 -0
  45. package/dist/terminal-session.js +9 -1
  46. package/dist/terminal-session.js.map +2 -2
  47. package/dist/testing/cli-repl.js +24 -4
  48. package/dist/testing/cli-repl.js.map +2 -2
  49. package/dist/testing/qa-cli.js +24 -4
  50. package/dist/testing/qa-cli.js.map +2 -2
  51. package/node_modules/toolcraft-design/dist/index.d.ts +2 -2
  52. package/node_modules/toolcraft-design/dist/index.js +1 -1
  53. package/node_modules/toolcraft-design/dist/render-markdown-plaintext.d.ts +2 -0
  54. package/node_modules/toolcraft-design/dist/render-markdown-plaintext.js +1 -0
  55. package/node_modules/toolcraft-design/dist/terminal-markdown/index.d.ts +2 -0
  56. package/node_modules/toolcraft-design/dist/terminal-markdown/index.js +1 -0
  57. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/inline.js +38 -2
  58. package/node_modules/toolcraft-design/dist/terminal-markdown/plaintext-renderer.d.ts +11 -0
  59. package/node_modules/toolcraft-design/dist/terminal-markdown/plaintext-renderer.js +228 -0
  60. package/node_modules/toolcraft-design/package.json +4 -0
  61. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/daemon-runtime.ts", "../../../toolcraft/src/index.ts", "../../../toolcraft/src/user-error.ts", "../../../toolcraft/src/runtime-logging.ts", "../../../toolcraft/src/package-metadata.ts", "../../src/terminal-pilot.ts", "../../src/terminal-session.ts", "../../src/ansi.ts", "../../src/errors.ts", "../../src/terminal-buffer.ts", "../../src/keys.ts", "../../src/terminal-screen.ts", "../../src/commands/runtime.ts"],
4
- "sourcesContent": ["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { UserError } from \"toolcraft\";\nimport {\n SESSION_ENV_VAR,\n createTerminalPilotRuntime,\n type TerminalPilotRuntime\n} from \"./runtime.js\";\nimport type { TerminalKey } from \"../keys.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nconst RUNTIME_DIR_ENV = \"TERMINAL_PILOT_RUNTIME_DIR\";\nconst DAEMON_ARG = \"__daemon\";\nconst START_TIMEOUT_MS = 5_000;\nconst IDLE_SHUTDOWN_MS = 1_000;\n\ntype SessionInfo = {\n id: string;\n command: string;\n pid: number;\n exitCode: number | null;\n};\n\ntype RpcRequest = {\n id: number;\n method: string;\n params?: unknown;\n};\n\ntype RpcResponse =\n | {\n id: number;\n ok: true;\n result: unknown;\n }\n | {\n id: number;\n ok: false;\n error: { message: string };\n };\n\ntype HandlerEnvLike = {\n get(key: string): string | undefined;\n};\n\ntype SessionProxy = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\nexport function isTerminalPilotDaemonArgv(argv: string[]): boolean {\n return argv[2] === DAEMON_ARG;\n}\n\nexport async function runTerminalPilotDaemon(): Promise<void> {\n const runtime = createTerminalPilotRuntime();\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n const server = net.createServer((socket) => {\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n void handleRequestLine(runtime, line).then((response) => {\n socket.write(`${JSON.stringify(response)}\\n`);\n scheduleIdleShutdown();\n });\n }\n });\n });\n\n async function shutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n await runtime.close();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n }\n\n async function scheduleIdleShutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n\n if (await runtime.hasRetainedSessions()) {\n return;\n }\n\n idleTimer = setTimeout(() => {\n void shutdown().then(() => {\n process.exit(0);\n });\n }, IDLE_SHUTDOWN_MS);\n }\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(socketPath, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n}\n\nexport function createDaemonTerminalPilotRuntime(): TerminalPilotRuntime {\n let nextId = 1;\n\n async function request<T>(method: string, params?: unknown): Promise<T> {\n await ensureDaemon();\n return sendRequest<T>(method, params, nextId++);\n }\n\n function proxySession(name: string, info: SessionInfo): SessionProxy {\n return {\n id: info.id,\n command: info.command,\n pid: info.pid,\n exitCode: info.exitCode,\n fill: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"fill\", args: [text] });\n },\n type: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"type\", args: [text] });\n },\n press: async (key: string) => {\n await request(\"sessionAction\", { name, action: \"press\", args: [key] });\n },\n signal: async (signal: string) => {\n await request(\"sessionAction\", { name, action: \"signal\", args: [signal] });\n },\n waitFor: async (pattern: string | RegExp, options?: { timeout?: number }) =>\n request(\"sessionAction\", {\n name,\n action: \"waitFor\",\n args: [serializePattern(pattern), options]\n }),\n waitForExit: async (options?: { timeout?: number }) =>\n request(\"sessionAction\", { name, action: \"waitForExit\", args: [options] }),\n screen: async () => request(\"sessionAction\", { name, action: \"screen\", args: [] }),\n history: async (options?: { last?: number }) =>\n request(\"sessionAction\", { name, action: \"history\", args: [options] }),\n resize: async (cols: number, rows: number) => {\n await request(\"sessionAction\", { name, action: \"resize\", args: [cols, rows] });\n },\n close: async () => {\n const result = await request<{ exitCode: number }>(\"closeSession\", { name });\n return result.exitCode;\n }\n };\n }\n\n return {\n async createSession(params, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"createSession\", {\n params,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async resolveSession(name, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"resolveSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async closeSession(name, env) {\n return request(\"closeSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n },\n\n async listSessions() {\n const sessions = await request<Array<{ name: string; session: SessionInfo }>>(\"listSessions\");\n return sessions.map((entry) => ({\n name: entry.name,\n session: proxySession(entry.name, entry.session)\n }));\n },\n\n async hasRetainedSessions() {\n return request(\"hasRetainedSessions\");\n },\n\n async close() {\n await request(\"shutdown\").catch(() => undefined);\n }\n };\n}\n\nasync function handleRequestLine(\n runtime: TerminalPilotRuntime,\n line: string\n): Promise<RpcResponse> {\n let request: RpcRequest;\n try {\n request = JSON.parse(line) as RpcRequest;\n } catch (error) {\n return {\n id: 0,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Invalid request\" }\n };\n }\n\n try {\n const result = await handleRequest(runtime, request);\n return { id: request.id, ok: true, result };\n } catch (error) {\n return {\n id: request.id,\n ok: false,\n error: { message: error instanceof Error ? error.message : String(error) }\n };\n }\n}\n\nasync function handleRequest(runtime: TerminalPilotRuntime, request: RpcRequest): Promise<unknown> {\n const params = isRecord(request.params) ? request.params : {};\n\n if (request.method === \"ping\") {\n return { ok: true };\n }\n\n if (request.method === \"createSession\") {\n const createParams = isRecord(params.params) ? params.params : {};\n const namedSession = await runtime.createSession(\n createParams as unknown as Parameters<TerminalPilotRuntime[\"createSession\"]>[0],\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"resolveSession\") {\n const namedSession = await runtime.resolveSession(\n optionalString(params.name),\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"listSessions\") {\n const sessions = await runtime.listSessions();\n return sessions.map(formatNamedSession);\n }\n\n if (request.method === \"hasRetainedSessions\") {\n return runtime.hasRetainedSessions();\n }\n\n if (request.method === \"closeSession\") {\n return runtime.closeSession(optionalString(params.name), envFromValue(params.envSession));\n }\n\n if (request.method === \"sessionAction\") {\n return runSessionAction(runtime, params);\n }\n\n if (request.method === \"shutdown\") {\n await runtime.close();\n process.exit(0);\n }\n\n throw new UserError(`Unknown terminal-pilot daemon method: ${request.method}`);\n}\n\nasync function runSessionAction(\n runtime: TerminalPilotRuntime,\n params: Record<string, unknown>\n): Promise<unknown> {\n const name = optionalString(params.name);\n const action = optionalString(params.action);\n const args = Array.isArray(params.args) ? params.args : [];\n const namedSession = await runtime.resolveSession(name);\n const session = namedSession.session;\n\n if (action === \"fill\") {\n await session.fill(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"type\") {\n await session.type(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"press\") {\n await session.press(String(args[0] ?? \"\") as TerminalKey);\n return undefined;\n }\n if (action === \"signal\") {\n await session.signal(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"waitFor\") {\n return session.waitFor(deserializePattern(args[0]), optionalRecord(args[1]));\n }\n if (action === \"waitForExit\") {\n return session.waitForExit(optionalRecord(args[0]));\n }\n if (action === \"screen\") {\n const screen = await session.screen();\n return {\n lines: [...screen.lines],\n rawLines: [...screen.rawLines],\n cursor: { ...screen.cursor },\n size: { ...screen.size }\n };\n }\n if (action === \"history\") {\n return session.history(optionalRecord(args[0]));\n }\n if (action === \"resize\") {\n await session.resize(Number(args[0]), Number(args[1]));\n return undefined;\n }\n\n throw new UserError(`Unknown terminal-pilot session action: ${action ?? \"<missing>\"}`);\n}\n\nasync function ensureDaemon(): Promise<void> {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n // Start below.\n }\n\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n const entryPoint = process.argv[1];\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n throw new UserError(\"Cannot start terminal-pilot daemon: entrypoint is unknown.\");\n }\n\n const child = spawn(process.execPath, [...process.execArgv, entryPoint, DAEMON_ARG], {\n detached: true,\n stdio: \"ignore\",\n env: process.env\n });\n child.unref();\n\n const startedAt = Date.now();\n while (Date.now() - startedAt <= START_TIMEOUT_MS) {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n await sleep(50);\n }\n }\n\n throw new UserError(\"Timed out waiting for terminal-pilot daemon to start.\");\n}\n\nfunction sendRequest<T>(\n method: string,\n params: unknown,\n id: number,\n options: { start?: boolean } = {}\n): Promise<T> {\n const socketPath = resolveSocketPath(process.env);\n return new Promise<T>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"connect\", () => {\n const request: RpcRequest = { id, method, params };\n socket.write(`${JSON.stringify(request)}\\n`);\n });\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n\n const line = buffer.slice(0, newlineIndex);\n socket.end();\n try {\n const response = JSON.parse(line) as RpcResponse;\n if (response.ok) {\n resolve(response.result as T);\n } else {\n reject(new UserError(response.error.message));\n }\n } catch (error) {\n reject(error);\n }\n });\n socket.on(\"error\", (error) => {\n if (options.start === false) {\n reject(error);\n return;\n }\n reject(new UserError(error.message));\n });\n });\n}\n\nfunction resolveSocketPath(env: NodeJS.ProcessEnv): string {\n const runtimeDir =\n env[RUNTIME_DIR_ENV] ??\n path.join(os.tmpdir(), `terminal-pilot-${process.getuid?.() ?? \"user\"}`);\n\n if (process.platform === \"win32\") {\n const hash = createHash(\"sha256\").update(runtimeDir).digest(\"hex\").slice(0, 16);\n return `\\\\\\\\.\\\\pipe\\\\terminal-pilot-${hash}`;\n }\n\n return path.join(runtimeDir, \"daemon.sock\");\n}\n\nfunction formatNamedSession(\n namedSession: Awaited<ReturnType<TerminalPilotRuntime[\"resolveSession\"]>>\n) {\n return {\n name: namedSession.name,\n session: formatSession(namedSession.session)\n };\n}\n\nfunction formatSession(\n session: Pick<TerminalSession, \"id\" | \"command\" | \"pid\" | \"exitCode\">\n): SessionInfo {\n return {\n id: session.id,\n command: session.command,\n pid: session.pid,\n exitCode: session.exitCode\n };\n}\n\nfunction envFromValue(value: unknown): HandlerEnvLike | undefined {\n const sessionName = optionalString(value);\n if (sessionName === undefined) {\n return undefined;\n }\n\n return {\n get(key: string): string | undefined {\n return key === SESSION_ENV_VAR ? sessionName : undefined;\n }\n };\n}\n\nfunction serializePattern(pattern: string | RegExp): unknown {\n if (typeof pattern === \"string\") {\n return { kind: \"literal\", value: pattern };\n }\n\n return { kind: \"regex\", source: pattern.source, flags: pattern.flags };\n}\n\nfunction deserializePattern(value: unknown): string | RegExp {\n if (!isRecord(value)) {\n return String(value ?? \"\");\n }\n if (value.kind === \"regex\") {\n return new RegExp(String(value.source ?? \"\"), String(value.flags ?? \"\"));\n }\n return String(value.value ?? \"\");\n}\n\nfunction optionalRecord(value: unknown): Record<string, never> | undefined {\n return isRecord(value) ? (value as Record<string, never>) : undefined;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"toolcraft-design\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type {\n HumanInLoopConfig,\n HumanInLoopPending,\n HumanInLoopRuntimeOptions\n} from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { ToolcraftBugError, UserError } from \"./user-error.js\";\nimport { suggest } from \"./suggest.js\";\nimport type { RuntimeLogger } from \"./runtime-logging.js\";\n\nconst commandConfigSymbol = Symbol(\"toolcraft.command.config\");\nconst groupConfigSymbol = Symbol(\"toolcraft.group.config\");\nconst commandSourcePathSymbol = Symbol(\"toolcraft.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\ntype HumanInLoopMode = \"sync\" | \"async\";\ntype HumanInLoopModeInput = HumanInLoopMode | null | undefined;\n\nexport type Scope = ScopeValue;\n\ntype ResolveOwnHumanInLoopMode<TValue> = TValue extends {\n mode: infer TMode extends HumanInLoopMode;\n}\n ? TMode\n : TValue extends null\n ? null\n : undefined;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n exists(path: string): Promise<boolean>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n rename(fromPath: string, toPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport interface CommandExample {\n title: string;\n params: Record<string, unknown>;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n> {\n name: string;\n description?: string;\n hidden?: boolean;\n examples?: CommandExample[];\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown\n> {\n kind: \"command\";\n name: string;\n description?: string;\n hidden: boolean;\n examples: CommandExample[];\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n hidden: boolean;\n examples: CommandExample[];\n result?: ObjectSchema<any>;\n humanInLoop?: HumanInLoopConfig<ObjectSchema<any>> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(\n requires: Requires<TContext> | undefined\n): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneCommandExamples(examples: CommandExample[] | undefined): CommandExample[] {\n return (examples ?? []).map((example) => ({\n title: example.title,\n params: { ...example.params }\n }));\n}\n\nfunction cloneStringRecord(\n values: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return values === undefined ? undefined : { ...values };\n}\n\nfunction cloneMcpServerConfig(config: McpServerConfig | undefined): McpServerConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: cloneStringArray(config.args),\n env: cloneStringRecord(config.env)\n };\n }\n\n return {\n transport: \"http\",\n url: config.url,\n headers: cloneStringRecord(config.headers)\n };\n}\n\nfunction cloneRenameMap(\n rename: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return rename === undefined ? undefined : { ...rename };\n}\n\nfunction validateRenameMap(rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const seenTargets = new Map<string, string>();\n\n for (const [upstreamName, targetPath] of Object.entries(rename)) {\n if (targetPath.length === 0) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`\n );\n }\n\n if (targetPath.split(\".\").some((segment) => segment.length === 0)) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": \"${targetPath}\" contains an empty segment.`\n );\n }\n\n const existingUpstreamName = seenTargets.get(targetPath);\n if (existingUpstreamName !== undefined) {\n throw new UserError(\n `Duplicate rename target \"${targetPath}\" for upstream tools \"${existingUpstreamName}\" and \"${upstreamName}\".`\n );\n }\n\n seenTargets.set(targetPath, upstreamName);\n }\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/toolcraft/src/index.ts\") ||\n candidate.includes(\"/packages/toolcraft/dist/index.js\") ||\n candidate.includes(\"/node_modules/toolcraft/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(\n parent: Requires<any> | undefined,\n child: Requires<any> | undefined\n): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check)\n };\n\n if (merged.auth === undefined && merged.apiVersion === undefined && merged.check === undefined) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n const candidates = Object.keys(env).filter(\n (candidate) => candidate !== secret.env && env[candidate] !== undefined\n );\n const suggestions = suggestSecretEnv(secret.env, candidates);\n const suggestionLine =\n suggestions.length > 0 ? `\\nDid you mean: ${suggestions.join(\", \")}?` : \"\";\n throw new UserError(`Missing required secret ${secret.env}${details}${suggestionLine}`);\n }\n\n Object.defineProperty(secrets, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return secrets;\n}\n\nfunction suggestSecretEnv(input: string, candidates: readonly string[]): string[] {\n const directSuggestions = suggest(input, candidates);\n if (!input.includes(\"_\")) {\n return directSuggestions;\n }\n\n const inputParts = input.split(\"_\");\n const firstPart = inputParts[0];\n const lastPart = inputParts[inputParts.length - 1];\n const relatedCandidates = candidates.filter((candidate) => {\n const candidateParts = candidate.split(\"_\");\n return (\n candidateParts[0] === firstPart && candidateParts[candidateParts.length - 1] === lastPart\n );\n });\n const expandedSuggestions = suggest(input, relatedCandidates, {\n threshold: Math.max(4, Math.floor(input.length / 4))\n });\n\n return [...new Set([...directSuggestions, ...expandedSuggestions])].slice(0, 3);\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child\n });\n}\n\nfunction resolveCommandScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n result: config.result,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n humanInLoop: config.humanInLoop,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n result: config.result,\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath()\n } satisfies InternalCommandConfig\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(\n config: GroupConfig<TServices>\n): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(config.mcp),\n scope: cloneScope(config.scope),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n tools: cloneStringArray(config.tools),\n rename: cloneRenameMap(config.rename),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (\n command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig }\n )[commandConfigSymbol];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n result: internal.result,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, internal.humanInLoop),\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n result: internal.result,\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath\n } satisfies InternalCommandConfig\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath\n });\n\n return materialized;\n}\n\nfunction mergeInheritedMetadata<TServices extends object>(\n group: InternalGroupConfig<TServices>,\n inherited: InheritedMetadata\n): InheritedMetadata {\n return {\n scope: resolveGroupScope(group.scope, inherited.scope),\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, group.humanInLoop),\n secrets: mergeSecrets(inherited.secrets, group.secrets),\n requires: mergeRequires(inherited.requires, group.requires)\n };\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const mergedInherited = mergeInheritedMetadata(internal, inherited);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, mergedInherited)\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new ToolcraftBugError(\n `Default command \"${internal.default.name}\" must be listed in children.`\n );\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new ToolcraftBugError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: mergedInherited.scope,\n humanInLoop: mergedInherited.humanInLoop,\n secrets: mergedInherited.secrets,\n requires: mergedInherited.requires,\n children: materializedChildren,\n default: defaultChild\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(internal.mcp),\n scope: cloneScope(internal.scope),\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n tools: cloneStringArray(internal.tools),\n rename: cloneRenameMap(internal.rename),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<TParamsSchema> | null | undefined = undefined\n>(\n config: Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, TResult>,\n \"name\" | \"scope\" | \"humanInLoop\"\n > & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(\n createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>),\n {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }\n ) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<AnyObjectSchema> | null | undefined = undefined\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateRenameMap(config.rename);\n validateHumanInLoopOnDefine(config);\n\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }) as Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport { S, toJsonSchema } from \"toolcraft-schema\";\nexport {\n AuthenticationError,\n BadRequestError,\n ClientError,\n ConflictError,\n HttpError,\n InternalServerError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n UnprocessableEntityError,\n createHttpError\n} from \"./http-errors.js\";\nexport type { HttpErrorRequest, HttpErrorResponse } from \"./http-errors.js\";\nexport { ApprovalDeclinedError, ToolcraftBugError, UserError };\nexport { createRuntimeLogger, isLogLevel, shouldEmitDiagnostic } from \"./runtime-logging.js\";\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type {\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLogger,\n RuntimeLoggerInput\n} from \"./runtime-logging.js\";\nexport type {\n AnySchema,\n ArraySchema,\n BooleanSchema,\n EnumSchema,\n JsonSchema,\n NumberSchema,\n ObjectSchema,\n OptionalSchema,\n Static,\n StringSchema\n} from \"toolcraft-schema\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"UserError\";\n }\n}\n\nexport class ToolcraftBugError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ToolcraftBugError\";\n }\n}\n", "export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DiagnosticLogEvent {\n level: Exclude<LogLevel, \"silent\">;\n message: string;\n category?: \"runtime\" | \"http\" | \"auth\" | \"retry\" | \"progress\";\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeLogger {\n level: LogLevel;\n emit(event: DiagnosticLogEvent): void;\n}\n\nexport type RuntimeLoggerInput = RuntimeLogger | ((event: DiagnosticLogEvent) => void);\n\nconst LOG_LEVEL_RANK = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5\n} as const satisfies Record<LogLevel, number>;\n\nexport const LOG_LEVELS = Object.freeze([\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n \"trace\"\n] as const satisfies readonly LogLevel[]);\n\nexport function isLogLevel(value: string): value is LogLevel {\n return (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport function shouldEmitDiagnostic(eventLevel: LogLevel, configuredLevel: LogLevel): boolean {\n if (eventLevel === \"silent\" || configuredLevel === \"silent\") {\n return false;\n }\n\n return LOG_LEVEL_RANK[eventLevel] <= LOG_LEVEL_RANK[configuredLevel];\n}\n\nexport function createRuntimeLogger(\n options: {\n level?: LogLevel;\n logger?: RuntimeLoggerInput;\n } = {}\n): RuntimeLogger {\n const level = options.level ?? \"warn\";\n const sink = options.logger;\n\n return {\n level,\n emit(event): void {\n if (!shouldEmitDiagnostic(event.level, level)) {\n return;\n }\n\n if (typeof sink === \"function\") {\n sink(event);\n return;\n }\n\n sink?.emit(event);\n }\n };\n}\n", "import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageMetadata {\n name?: string;\n path: string;\n version?: string;\n}\n\ntype PackageMetadataInput = string | URL;\n\nfunction pathFromInput(from: PackageMetadataInput): string {\n if (from instanceof URL) {\n return fileURLToPath(from);\n }\n\n if (from.startsWith(\"file:\")) {\n return fileURLToPath(from);\n }\n\n return path.resolve(from);\n}\n\nfunction getSearchDirectory(from: PackageMetadataInput): string {\n const resolved = pathFromInput(from);\n let searchPath = resolved;\n\n try {\n searchPath = realpathSync(resolved);\n } catch {\n searchPath = resolved;\n }\n\n try {\n return statSync(searchPath).isDirectory() ? searchPath : path.dirname(searchPath);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { TerminalSession } from \"./terminal-session.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\n\nexport interface NewSessionOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n}\n\nexport class TerminalPilot {\n private readonly sessionMap = new Map<string, TerminalSession>();\n\n static async launch(): Promise<TerminalPilot> {\n return new TerminalPilot();\n }\n\n async newSession(opts: NewSessionOptions): Promise<TerminalSession> {\n const session = new TerminalSession({\n id: randomUUID(),\n command: opts.command,\n args: opts.args,\n cwd: opts.cwd,\n env: opts.env,\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n observe: opts.observe ?? false\n });\n\n this.sessionMap.set(session.id, session);\n return session;\n }\n\n getSession(id: string): TerminalSession {\n const session = this.sessionMap.get(id);\n\n if (session === undefined) {\n throw new Error(`Session not found: ${id}`);\n }\n\n return session;\n }\n\n deleteSession(id: string): void {\n this.sessionMap.delete(id);\n }\n\n sessions(): TerminalSession[] {\n return [...this.sessionMap.values()].filter((s) => s.exitCode === null);\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessionMap.values()];\n\n await Promise.all(\n sessions.map(async (session) => {\n await session.close();\n this.sessionMap.delete(session.id);\n })\n );\n }\n}\n", "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", "import { UserError } from \"toolcraft\";\nimport type { HandlerEnv } from \"toolcraft\";\nimport type { TerminalPilotInstallerServices } from \"./installer.js\";\nimport { TerminalPilot, type NewSessionOptions } from \"../terminal-pilot.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nexport const SESSION_ENV_VAR = \"TERMINAL_PILOT_SESSION\";\n\ntype SessionLike = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\ntype PilotLike = Pick<TerminalPilot, \"newSession\" | \"getSession\" | \"deleteSession\" | \"sessions\">;\ntype ClosablePilotLike = PilotLike & Pick<TerminalPilot, \"close\">;\n\ntype NamedSession = {\n name: string;\n session: SessionLike;\n};\n\ntype CreateSessionParams = NewSessionOptions & {\n session?: string;\n};\n\nexport interface TerminalPilotRuntime {\n createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession>;\n resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession>;\n closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n hasRetainedSessions(): Promise<boolean>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n const pendingNames = new Set<string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n const requestedName = name ?? env?.get(SESSION_ENV_VAR);\n\n if (requestedName !== undefined && requestedName.trim().length === 0) {\n throw new UserError(\"Session name must not be empty.\");\n }\n\n return requestedName;\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`) || pendingNames.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n if (nameToId.get(name) === sessionId) {\n nameToId.delete(name);\n }\n if (idToName.get(sessionId) === name) {\n idToName.delete(sessionId);\n }\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n async function discardExitedSessionName(name: string): Promise<void> {\n const sessionId = nameToId.get(name);\n if (sessionId === undefined) {\n return;\n }\n\n const pilot = await getPilot();\n try {\n const session = pilot.getSession(sessionId);\n if (session.exitCode === null) {\n return;\n }\n pilot.deleteSession(sessionId);\n } catch {\n // Missing sessions no longer reserve public names.\n }\n forgetSession(name, sessionId);\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n if (params.command.trim().length === 0) {\n throw new UserError(\"Command must not be empty.\");\n }\n\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n await discardExitedSessionName(requestedName);\n\n if (nameToId.has(requestedName) || pendingNames.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n pendingNames.add(requestedName);\n try {\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n } finally {\n pendingNames.delete(requestedName);\n }\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async hasRetainedSessions(): Promise<boolean> {\n return nameToId.size > 0 || pendingNames.size > 0;\n },\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n pendingNames.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { UserError } from \"toolcraft\";\nimport {\n SESSION_ENV_VAR,\n createTerminalPilotRuntime,\n type TerminalPilotRuntime\n} from \"./runtime.js\";\nimport type { TerminalKey } from \"../keys.js\";\nimport type { TerminalSession, WaitForOptions } from \"../terminal-session.js\";\n\nconst RUNTIME_DIR_ENV = \"TERMINAL_PILOT_RUNTIME_DIR\";\nconst DAEMON_ARG = \"__daemon\";\nconst START_TIMEOUT_MS = 5_000;\nconst IDLE_SHUTDOWN_MS = 1_000;\n\ntype SessionInfo = {\n id: string;\n command: string;\n pid: number;\n exitCode: number | null;\n};\n\ntype RpcRequest = {\n id: number;\n method: string;\n params?: unknown;\n};\n\ntype RpcResponse =\n | {\n id: number;\n ok: true;\n result: unknown;\n }\n | {\n id: number;\n ok: false;\n error: { message: string };\n };\n\ntype HandlerEnvLike = {\n get(key: string): string | undefined;\n};\n\ntype SessionProxy = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\nexport function isTerminalPilotDaemonArgv(argv: string[]): boolean {\n return argv[2] === DAEMON_ARG;\n}\n\nexport async function runTerminalPilotDaemon(): Promise<void> {\n const runtime = createTerminalPilotRuntime();\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n const server = net.createServer((socket) => {\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n void handleRequestLine(runtime, line).then((response) => {\n socket.write(`${JSON.stringify(response)}\\n`);\n scheduleIdleShutdown();\n });\n }\n });\n });\n\n async function shutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n await runtime.close();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n }\n\n async function scheduleIdleShutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n\n if (await runtime.hasRetainedSessions()) {\n return;\n }\n\n idleTimer = setTimeout(() => {\n void shutdown().then(() => {\n process.exit(0);\n });\n }, IDLE_SHUTDOWN_MS);\n }\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(socketPath, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n}\n\nexport function createDaemonTerminalPilotRuntime(): TerminalPilotRuntime {\n let nextId = 1;\n\n async function request<T>(method: string, params?: unknown): Promise<T> {\n await ensureDaemon();\n return sendRequest<T>(method, params, nextId++);\n }\n\n function proxySession(name: string, info: SessionInfo): SessionProxy {\n return {\n id: info.id,\n command: info.command,\n pid: info.pid,\n exitCode: info.exitCode,\n fill: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"fill\", args: [text] });\n },\n type: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"type\", args: [text] });\n },\n press: async (key: string) => {\n await request(\"sessionAction\", { name, action: \"press\", args: [key] });\n },\n signal: async (signal: string) => {\n await request(\"sessionAction\", { name, action: \"signal\", args: [signal] });\n },\n waitFor: async (pattern: string | RegExp, options?: WaitForOptions) =>\n request(\"sessionAction\", {\n name,\n action: \"waitFor\",\n args: [serializePattern(pattern), options]\n }),\n waitForExit: async (options?: { timeout?: number }) =>\n request(\"sessionAction\", { name, action: \"waitForExit\", args: [options] }),\n screen: async () => request(\"sessionAction\", { name, action: \"screen\", args: [] }),\n history: async (options?: { last?: number }) =>\n request(\"sessionAction\", { name, action: \"history\", args: [options] }),\n resize: async (cols: number, rows: number) => {\n await request(\"sessionAction\", { name, action: \"resize\", args: [cols, rows] });\n },\n close: async () => {\n const result = await request<{ exitCode: number }>(\"closeSession\", { name });\n return result.exitCode;\n }\n };\n }\n\n return {\n async createSession(params, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"createSession\", {\n params: {\n ...params,\n cwd: params.cwd ?? process.cwd()\n },\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async resolveSession(name, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"resolveSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async closeSession(name, env) {\n return request(\"closeSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n },\n\n async listSessions() {\n const sessions = await request<Array<{ name: string; session: SessionInfo }>>(\"listSessions\");\n return sessions.map((entry) => ({\n name: entry.name,\n session: proxySession(entry.name, entry.session)\n }));\n },\n\n async hasRetainedSessions() {\n return request(\"hasRetainedSessions\");\n },\n\n async close() {\n await request(\"shutdown\").catch(() => undefined);\n }\n };\n}\n\nasync function handleRequestLine(\n runtime: TerminalPilotRuntime,\n line: string\n): Promise<RpcResponse> {\n let request: RpcRequest;\n try {\n request = JSON.parse(line) as RpcRequest;\n } catch (error) {\n return {\n id: 0,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Invalid request\" }\n };\n }\n\n try {\n const result = await handleRequest(runtime, request);\n return { id: request.id, ok: true, result };\n } catch (error) {\n return {\n id: request.id,\n ok: false,\n error: { message: error instanceof Error ? error.message : String(error) }\n };\n }\n}\n\nasync function handleRequest(runtime: TerminalPilotRuntime, request: RpcRequest): Promise<unknown> {\n const params = isRecord(request.params) ? request.params : {};\n\n if (request.method === \"ping\") {\n return { ok: true };\n }\n\n if (request.method === \"createSession\") {\n const createParams = isRecord(params.params) ? params.params : {};\n const namedSession = await runtime.createSession(\n createParams as unknown as Parameters<TerminalPilotRuntime[\"createSession\"]>[0],\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"resolveSession\") {\n const namedSession = await runtime.resolveSession(\n optionalString(params.name),\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"listSessions\") {\n const sessions = await runtime.listSessions();\n return sessions.map(formatNamedSession);\n }\n\n if (request.method === \"hasRetainedSessions\") {\n return runtime.hasRetainedSessions();\n }\n\n if (request.method === \"closeSession\") {\n return runtime.closeSession(optionalString(params.name), envFromValue(params.envSession));\n }\n\n if (request.method === \"sessionAction\") {\n return runSessionAction(runtime, params);\n }\n\n if (request.method === \"shutdown\") {\n await runtime.close();\n process.exit(0);\n }\n\n throw new UserError(`Unknown terminal-pilot daemon method: ${request.method}`);\n}\n\nasync function runSessionAction(\n runtime: TerminalPilotRuntime,\n params: Record<string, unknown>\n): Promise<unknown> {\n const name = optionalString(params.name);\n const action = optionalString(params.action);\n const args = Array.isArray(params.args) ? params.args : [];\n const namedSession = await runtime.resolveSession(name);\n const session = namedSession.session;\n\n if (action === \"fill\") {\n await session.fill(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"type\") {\n await session.type(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"press\") {\n await session.press(String(args[0] ?? \"\") as TerminalKey);\n return undefined;\n }\n if (action === \"signal\") {\n await session.signal(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"waitFor\") {\n return session.waitFor(deserializePattern(args[0]), optionalRecord(args[1]));\n }\n if (action === \"waitForExit\") {\n return session.waitForExit(optionalRecord(args[0]));\n }\n if (action === \"screen\") {\n const screen = await session.screen();\n return {\n lines: [...screen.lines],\n rawLines: [...screen.rawLines],\n cursor: { ...screen.cursor },\n size: { ...screen.size }\n };\n }\n if (action === \"history\") {\n return session.history(optionalRecord(args[0]));\n }\n if (action === \"resize\") {\n await session.resize(Number(args[0]), Number(args[1]));\n return undefined;\n }\n\n throw new UserError(`Unknown terminal-pilot session action: ${action ?? \"<missing>\"}`);\n}\n\nasync function ensureDaemon(): Promise<void> {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n // Start below.\n }\n\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n const entryPoint = process.argv[1];\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n throw new UserError(\"Cannot start terminal-pilot daemon: entrypoint is unknown.\");\n }\n\n const child = spawn(process.execPath, [...process.execArgv, entryPoint, DAEMON_ARG], {\n detached: true,\n stdio: \"ignore\",\n env: process.env\n });\n child.unref();\n\n const startedAt = Date.now();\n while (Date.now() - startedAt <= START_TIMEOUT_MS) {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n await sleep(50);\n }\n }\n\n throw new UserError(\"Timed out waiting for terminal-pilot daemon to start.\");\n}\n\nfunction sendRequest<T>(\n method: string,\n params: unknown,\n id: number,\n options: { start?: boolean } = {}\n): Promise<T> {\n const socketPath = resolveSocketPath(process.env);\n return new Promise<T>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"connect\", () => {\n const request: RpcRequest = { id, method, params };\n socket.write(`${JSON.stringify(request)}\\n`);\n });\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n\n const line = buffer.slice(0, newlineIndex);\n socket.end();\n try {\n const response = JSON.parse(line) as RpcResponse;\n if (response.ok) {\n resolve(response.result as T);\n } else {\n reject(new UserError(response.error.message));\n }\n } catch (error) {\n reject(error);\n }\n });\n socket.on(\"error\", (error) => {\n if (options.start === false) {\n reject(error);\n return;\n }\n reject(new UserError(error.message));\n });\n });\n}\n\nfunction resolveSocketPath(env: NodeJS.ProcessEnv): string {\n const runtimeDir =\n env[RUNTIME_DIR_ENV] ??\n path.join(os.tmpdir(), `terminal-pilot-${process.getuid?.() ?? \"user\"}`);\n\n if (process.platform === \"win32\") {\n const hash = createHash(\"sha256\").update(runtimeDir).digest(\"hex\").slice(0, 16);\n return `\\\\\\\\.\\\\pipe\\\\terminal-pilot-${hash}`;\n }\n\n return path.join(runtimeDir, \"daemon.sock\");\n}\n\nfunction formatNamedSession(\n namedSession: Awaited<ReturnType<TerminalPilotRuntime[\"resolveSession\"]>>\n) {\n return {\n name: namedSession.name,\n session: formatSession(namedSession.session)\n };\n}\n\nfunction formatSession(\n session: Pick<TerminalSession, \"id\" | \"command\" | \"pid\" | \"exitCode\">\n): SessionInfo {\n return {\n id: session.id,\n command: session.command,\n pid: session.pid,\n exitCode: session.exitCode\n };\n}\n\nfunction envFromValue(value: unknown): HandlerEnvLike | undefined {\n const sessionName = optionalString(value);\n if (sessionName === undefined) {\n return undefined;\n }\n\n return {\n get(key: string): string | undefined {\n return key === SESSION_ENV_VAR ? sessionName : undefined;\n }\n };\n}\n\nfunction serializePattern(pattern: string | RegExp): unknown {\n if (typeof pattern === \"string\") {\n return { kind: \"literal\", value: pattern };\n }\n\n return { kind: \"regex\", source: pattern.source, flags: pattern.flags };\n}\n\nfunction deserializePattern(value: unknown): string | RegExp {\n if (!isRecord(value)) {\n return String(value ?? \"\");\n }\n if (value.kind === \"regex\") {\n return new RegExp(String(value.source ?? \"\"), String(value.flags ?? \"\"));\n }\n return String(value.value ?? \"\");\n}\n\nfunction optionalRecord(value: unknown): Record<string, never> | undefined {\n return isRecord(value) ? (value as Record<string, never>) : undefined;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"toolcraft-design\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type {\n HumanInLoopConfig,\n HumanInLoopPending,\n HumanInLoopRuntimeOptions\n} from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { ToolcraftBugError, UserError } from \"./user-error.js\";\nimport { suggest } from \"./suggest.js\";\nimport type { RuntimeLogger } from \"./runtime-logging.js\";\n\nconst commandConfigSymbol = Symbol(\"toolcraft.command.config\");\nconst groupConfigSymbol = Symbol(\"toolcraft.group.config\");\nconst commandSourcePathSymbol = Symbol(\"toolcraft.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\ntype HumanInLoopMode = \"sync\" | \"async\";\ntype HumanInLoopModeInput = HumanInLoopMode | null | undefined;\n\nexport type Scope = ScopeValue;\n\ntype ResolveOwnHumanInLoopMode<TValue> = TValue extends {\n mode: infer TMode extends HumanInLoopMode;\n}\n ? TMode\n : TValue extends null\n ? null\n : undefined;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n exists(path: string): Promise<boolean>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n rename(fromPath: string, toPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport interface CommandExample {\n title: string;\n params: Record<string, unknown>;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n> {\n name: string;\n description?: string;\n hidden?: boolean;\n examples?: CommandExample[];\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown\n> {\n kind: \"command\";\n name: string;\n description?: string;\n hidden: boolean;\n examples: CommandExample[];\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n hidden: boolean;\n examples: CommandExample[];\n result?: ObjectSchema<any>;\n humanInLoop?: HumanInLoopConfig<ObjectSchema<any>> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(\n requires: Requires<TContext> | undefined\n): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneCommandExamples(examples: CommandExample[] | undefined): CommandExample[] {\n return (examples ?? []).map((example) => ({\n title: example.title,\n params: { ...example.params }\n }));\n}\n\nfunction cloneStringRecord(\n values: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return values === undefined ? undefined : { ...values };\n}\n\nfunction cloneMcpServerConfig(config: McpServerConfig | undefined): McpServerConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: cloneStringArray(config.args),\n env: cloneStringRecord(config.env)\n };\n }\n\n return {\n transport: \"http\",\n url: config.url,\n headers: cloneStringRecord(config.headers)\n };\n}\n\nfunction cloneRenameMap(\n rename: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return rename === undefined ? undefined : { ...rename };\n}\n\nfunction validateRenameMap(rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const seenTargets = new Map<string, string>();\n\n for (const [upstreamName, targetPath] of Object.entries(rename)) {\n if (targetPath.length === 0) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`\n );\n }\n\n if (targetPath.split(\".\").some((segment) => segment.length === 0)) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": \"${targetPath}\" contains an empty segment.`\n );\n }\n\n const existingUpstreamName = seenTargets.get(targetPath);\n if (existingUpstreamName !== undefined) {\n throw new UserError(\n `Duplicate rename target \"${targetPath}\" for upstream tools \"${existingUpstreamName}\" and \"${upstreamName}\".`\n );\n }\n\n seenTargets.set(targetPath, upstreamName);\n }\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/toolcraft/src/index.ts\") ||\n candidate.includes(\"/packages/toolcraft/dist/index.js\") ||\n candidate.includes(\"/node_modules/toolcraft/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(\n parent: Requires<any> | undefined,\n child: Requires<any> | undefined\n): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check)\n };\n\n if (merged.auth === undefined && merged.apiVersion === undefined && merged.check === undefined) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n const candidates = Object.keys(env).filter(\n (candidate) => candidate !== secret.env && env[candidate] !== undefined\n );\n const suggestions = suggestSecretEnv(secret.env, candidates);\n const suggestionLine =\n suggestions.length > 0 ? `\\nDid you mean: ${suggestions.join(\", \")}?` : \"\";\n throw new UserError(`Missing required secret ${secret.env}${details}${suggestionLine}`);\n }\n\n Object.defineProperty(secrets, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return secrets;\n}\n\nfunction suggestSecretEnv(input: string, candidates: readonly string[]): string[] {\n const directSuggestions = suggest(input, candidates);\n if (!input.includes(\"_\")) {\n return directSuggestions;\n }\n\n const inputParts = input.split(\"_\");\n const firstPart = inputParts[0];\n const lastPart = inputParts[inputParts.length - 1];\n const relatedCandidates = candidates.filter((candidate) => {\n const candidateParts = candidate.split(\"_\");\n return (\n candidateParts[0] === firstPart && candidateParts[candidateParts.length - 1] === lastPart\n );\n });\n const expandedSuggestions = suggest(input, relatedCandidates, {\n threshold: Math.max(4, Math.floor(input.length / 4))\n });\n\n return [...new Set([...directSuggestions, ...expandedSuggestions])].slice(0, 3);\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child\n });\n}\n\nfunction resolveCommandScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n result: config.result,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n humanInLoop: config.humanInLoop,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n result: config.result,\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath()\n } satisfies InternalCommandConfig\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(\n config: GroupConfig<TServices>\n): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(config.mcp),\n scope: cloneScope(config.scope),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n tools: cloneStringArray(config.tools),\n rename: cloneRenameMap(config.rename),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (\n command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig }\n )[commandConfigSymbol];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n result: internal.result,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, internal.humanInLoop),\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n result: internal.result,\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath\n } satisfies InternalCommandConfig\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath\n });\n\n return materialized;\n}\n\nfunction mergeInheritedMetadata<TServices extends object>(\n group: InternalGroupConfig<TServices>,\n inherited: InheritedMetadata\n): InheritedMetadata {\n return {\n scope: resolveGroupScope(group.scope, inherited.scope),\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, group.humanInLoop),\n secrets: mergeSecrets(inherited.secrets, group.secrets),\n requires: mergeRequires(inherited.requires, group.requires)\n };\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const mergedInherited = mergeInheritedMetadata(internal, inherited);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, mergedInherited)\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new ToolcraftBugError(\n `Default command \"${internal.default.name}\" must be listed in children.`\n );\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new ToolcraftBugError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: mergedInherited.scope,\n humanInLoop: mergedInherited.humanInLoop,\n secrets: mergedInherited.secrets,\n requires: mergedInherited.requires,\n children: materializedChildren,\n default: defaultChild\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(internal.mcp),\n scope: cloneScope(internal.scope),\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n tools: cloneStringArray(internal.tools),\n rename: cloneRenameMap(internal.rename),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<TParamsSchema> | null | undefined = undefined\n>(\n config: Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, TResult>,\n \"name\" | \"scope\" | \"humanInLoop\"\n > & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(\n createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>),\n {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }\n ) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<AnyObjectSchema> | null | undefined = undefined\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateRenameMap(config.rename);\n validateHumanInLoopOnDefine(config);\n\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }) as Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport { S, toJsonSchema } from \"toolcraft-schema\";\nexport {\n AuthenticationError,\n BadRequestError,\n ClientError,\n ConflictError,\n HttpError,\n InternalServerError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n UnprocessableEntityError,\n createHttpError\n} from \"./http-errors.js\";\nexport type { HttpErrorRequest, HttpErrorResponse } from \"./http-errors.js\";\nexport { ApprovalDeclinedError, ToolcraftBugError, UserError };\nexport { createRuntimeLogger, isLogLevel, shouldEmitDiagnostic } from \"./runtime-logging.js\";\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type {\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLogger,\n RuntimeLoggerInput\n} from \"./runtime-logging.js\";\nexport type {\n AnySchema,\n ArraySchema,\n BooleanSchema,\n EnumSchema,\n JsonSchema,\n NumberSchema,\n ObjectSchema,\n OptionalSchema,\n Static,\n StringSchema\n} from \"toolcraft-schema\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"UserError\";\n }\n}\n\nexport class ToolcraftBugError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ToolcraftBugError\";\n }\n}\n", "export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DiagnosticLogEvent {\n level: Exclude<LogLevel, \"silent\">;\n message: string;\n category?: \"runtime\" | \"http\" | \"auth\" | \"retry\" | \"progress\";\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeLogger {\n level: LogLevel;\n emit(event: DiagnosticLogEvent): void;\n}\n\nexport type RuntimeLoggerInput = RuntimeLogger | ((event: DiagnosticLogEvent) => void);\n\nconst LOG_LEVEL_RANK = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5\n} as const satisfies Record<LogLevel, number>;\n\nexport const LOG_LEVELS = Object.freeze([\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n \"trace\"\n] as const satisfies readonly LogLevel[]);\n\nexport function isLogLevel(value: string): value is LogLevel {\n return (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport function shouldEmitDiagnostic(eventLevel: LogLevel, configuredLevel: LogLevel): boolean {\n if (eventLevel === \"silent\" || configuredLevel === \"silent\") {\n return false;\n }\n\n return LOG_LEVEL_RANK[eventLevel] <= LOG_LEVEL_RANK[configuredLevel];\n}\n\nexport function createRuntimeLogger(\n options: {\n level?: LogLevel;\n logger?: RuntimeLoggerInput;\n } = {}\n): RuntimeLogger {\n const level = options.level ?? \"warn\";\n const sink = options.logger;\n\n return {\n level,\n emit(event): void {\n if (!shouldEmitDiagnostic(event.level, level)) {\n return;\n }\n\n if (typeof sink === \"function\") {\n sink(event);\n return;\n }\n\n sink?.emit(event);\n }\n };\n}\n", "import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageMetadata {\n name?: string;\n path: string;\n version?: string;\n}\n\ntype PackageMetadataInput = string | URL;\n\nfunction pathFromInput(from: PackageMetadataInput): string {\n if (from instanceof URL) {\n return fileURLToPath(from);\n }\n\n if (from.startsWith(\"file:\")) {\n return fileURLToPath(from);\n }\n\n return path.resolve(from);\n}\n\nfunction getSearchDirectory(from: PackageMetadataInput): string {\n const resolved = pathFromInput(from);\n let searchPath = resolved;\n\n try {\n searchPath = realpathSync(resolved);\n } catch {\n searchPath = resolved;\n }\n\n try {\n return statSync(searchPath).isDirectory() ? searchPath : path.dirname(searchPath);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { TerminalSession } from \"./terminal-session.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\n\nexport interface NewSessionOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n}\n\nexport class TerminalPilot {\n private readonly sessionMap = new Map<string, TerminalSession>();\n\n static async launch(): Promise<TerminalPilot> {\n return new TerminalPilot();\n }\n\n async newSession(opts: NewSessionOptions): Promise<TerminalSession> {\n const session = new TerminalSession({\n id: randomUUID(),\n command: opts.command,\n args: opts.args,\n cwd: opts.cwd,\n env: opts.env,\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n observe: opts.observe ?? false\n });\n\n this.sessionMap.set(session.id, session);\n return session;\n }\n\n getSession(id: string): TerminalSession {\n const session = this.sessionMap.get(id);\n\n if (session === undefined) {\n throw new Error(`Session not found: ${id}`);\n }\n\n return session;\n }\n\n deleteSession(id: string): void {\n this.sessionMap.delete(id);\n }\n\n sessions(): TerminalSession[] {\n return [...this.sessionMap.values()].filter((s) => s.exitCode === null);\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessionMap.values()];\n\n await Promise.all(\n sessions.map(async (session) => {\n await session.close();\n this.sessionMap.delete(session.id);\n })\n );\n }\n}\n", "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", "import { UserError } from \"toolcraft\";\nimport type { HandlerEnv } from \"toolcraft\";\nimport type { TerminalPilotInstallerServices } from \"./installer.js\";\nimport { TerminalPilot, type NewSessionOptions } from \"../terminal-pilot.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nexport const SESSION_ENV_VAR = \"TERMINAL_PILOT_SESSION\";\n\ntype SessionLike = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\ntype PilotLike = Pick<TerminalPilot, \"newSession\" | \"getSession\" | \"deleteSession\" | \"sessions\">;\ntype ClosablePilotLike = PilotLike & Pick<TerminalPilot, \"close\">;\n\ntype NamedSession = {\n name: string;\n session: SessionLike;\n};\n\ntype CreateSessionParams = NewSessionOptions & {\n session?: string;\n};\n\nexport interface TerminalPilotRuntime {\n createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession>;\n resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession>;\n closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n hasRetainedSessions(): Promise<boolean>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n const pendingNames = new Set<string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n const requestedName = name ?? env?.get(SESSION_ENV_VAR);\n\n if (requestedName !== undefined && requestedName.trim().length === 0) {\n throw new UserError(\"Session name must not be empty.\");\n }\n\n return requestedName;\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`) || pendingNames.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n if (nameToId.get(name) === sessionId) {\n nameToId.delete(name);\n }\n if (idToName.get(sessionId) === name) {\n idToName.delete(sessionId);\n }\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n async function discardExitedSessionName(name: string): Promise<void> {\n const sessionId = nameToId.get(name);\n if (sessionId === undefined) {\n return;\n }\n\n const pilot = await getPilot();\n try {\n const session = pilot.getSession(sessionId);\n if (session.exitCode === null) {\n return;\n }\n pilot.deleteSession(sessionId);\n } catch {\n // Missing sessions no longer reserve public names.\n }\n forgetSession(name, sessionId);\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n if (params.command.trim().length === 0) {\n throw new UserError(\"Command must not be empty.\");\n }\n\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n await discardExitedSessionName(requestedName);\n\n if (nameToId.has(requestedName) || pendingNames.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n pendingNames.add(requestedName);\n try {\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n } finally {\n pendingNames.delete(requestedName);\n }\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async hasRetainedSessions(): Promise<boolean> {\n return nameToId.size > 0 || pendingNames.size > 0;\n },\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n pendingNames.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["spawn", "path", "fileURLToPath", "require", "DEFAULT_COLS", "DEFAULT_ROWS", "path", "spawn", "sleep"]
7
7
  }