terminal-pilot 0.0.11 → 0.0.13

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../node_modules/sisteransi/src/index.js", "../../src/testing/qa-cli.ts", "../../src/ansi.ts", "../../src/cli.ts", "../../../cmdkit/src/cli.ts", "../../../design-system/src/tokens/colors.ts", "../../../design-system/src/tokens/typography.ts", "../../../design-system/src/tokens/widths.ts", "../../../design-system/src/components/text.ts", "../../../design-system/src/internal/output-format.ts", "../../../design-system/src/internal/theme-detect.ts", "../../../design-system/src/components/symbols.ts", "../../../design-system/src/components/logger.ts", "../../../design-system/src/prompts/primitives/log.ts", "../../../design-system/src/internal/strip-ansi.ts", "../../../design-system/src/components/help-formatter.ts", "../../../design-system/src/components/table.ts", "../../../design-system/src/acp/components.ts", "../../../design-system/src/acp/writer.ts", "../../../design-system/src/dashboard/buffer.ts", "../../../design-system/src/dashboard/terminal.ts", "../../../design-system/src/prompts/index.ts", "../../../design-system/src/prompts/primitives/cancel.ts", "../../../../node_modules/node_modules/.pnpm/fast-string-truncated-width@1.2.1/node_modules/fast-string-truncated-width/dist/utils.js", "../../../../node_modules/node_modules/.pnpm/fast-string-truncated-width@1.2.1/node_modules/fast-string-truncated-width/dist/index.js", "../../../../node_modules/node_modules/.pnpm/fast-string-width@1.1.0/node_modules/fast-string-width/dist/index.js", "../../../../node_modules/node_modules/.pnpm/fast-wrap-ansi@0.1.3/node_modules/fast-wrap-ansi/lib/main.js", "../../../../node_modules/@clack/core/src/utils/settings.ts", "../../../../node_modules/@clack/core/src/utils/string.ts", "../../../../node_modules/@clack/core/src/utils/index.ts", "../../../../node_modules/@clack/core/src/prompts/prompt.ts", "../../../../node_modules/@clack/core/src/prompts/autocomplete.ts", "../../../../node_modules/@clack/core/src/prompts/confirm.ts", "../../../../node_modules/@clack/core/src/prompts/group-multiselect.ts", "../../../../node_modules/@clack/core/src/utils/cursor.ts", "../../../../node_modules/@clack/core/src/prompts/multi-select.ts", "../../../../node_modules/@clack/core/src/prompts/password.ts", "../../../../node_modules/@clack/core/src/prompts/select.ts", "../../../../node_modules/@clack/core/src/prompts/select-key.ts", "../../../../node_modules/@clack/core/src/prompts/text.ts", "../../../design-system/src/prompts/primitives/intro.ts", "../../../design-system/src/prompts/primitives/note.ts", "../../../design-system/src/prompts/primitives/outro.ts", "../../../design-system/src/prompts/primitives/spinner.ts", "../../../design-system/src/static/spinner.ts", "../../../design-system/src/static/menu.ts", "../../../cmdkit/src/index.ts", "../../../cmdkit-schema/src/index.ts", "../../../cmdkit/src/number-schema.ts", "../../../cmdkit/src/renderer.ts", "../../src/terminal-pilot.ts", "../../src/terminal-session.ts", "../../src/terminal-buffer.ts", "../../src/keys.ts", "../../src/terminal-screen.ts", "../../src/commands/runtime.ts", "../../src/commands/close-session.ts", "../../src/commands/create-session.ts", "../../src/commands/fill.ts", "../../src/commands/get-session.ts", "../../../agent-skill-config/src/configs.ts", "../../../agent-defs/src/agents/claude-code.ts", "../../../agent-defs/src/agents/claude-desktop.ts", "../../../agent-defs/src/agents/codex.ts", "../../../agent-defs/src/agents/opencode.ts", "../../../agent-defs/src/agents/kimi.ts", "../../../agent-defs/src/agents/goose.ts", "../../../agent-defs/src/agents/poe-agent.ts", "../../../agent-defs/src/registry.ts", "../../../config-mutations/src/mutations/file-mutation.ts", "../../../config-mutations/src/mutations/template-mutation.ts", "../../../config-mutations/src/execution/apply-mutation.ts", "../../../config-mutations/src/formats/json.ts", "../../../config-mutations/src/formats/toml.ts", "../../../config-mutations/src/formats/yaml.ts", "../../../config-mutations/src/formats/index.ts", "../../../config-mutations/src/execution/path-utils.ts", "../../../config-mutations/src/fs-utils.ts", "../../../config-mutations/src/execution/run-mutations.ts", "../../../config-mutations/src/template/render.ts", "../../../agent-skill-config/src/apply.ts", "../../src/commands/installer.ts", "../../src/commands/install.ts", "../../src/commands/list-sessions.ts", "../../src/commands/press-key.ts", "../../src/commands/read-history.ts", "../../src/commands/read-screen.ts", "../../src/commands/resize.ts", "../../../terminal-png/src/index.ts", "../../../terminal-png/src/ansi-parser.ts", "../../../terminal-png/src/png-renderer.ts", "../../../terminal-png/src/font.ts", "../../../terminal-png/src/svg-renderer.ts", "../../src/commands/screenshot.ts", "../../src/commands/send-signal.ts", "../../src/commands/type.ts", "../../src/commands/uninstall.ts", "../../src/commands/wait-for.ts", "../../src/commands/wait-for-exit.ts", "../../src/commands/index.ts", "../../src/testing/cli-repl.ts"],
4
- "sourcesContent": ["'use strict';\n\nconst ESC = '\\x1B';\nconst CSI = `${ESC}[`;\nconst beep = '\\u0007';\n\nconst cursor = {\n to(x, y) {\n if (!y) return `${CSI}${x + 1}G`;\n return `${CSI}${y + 1};${x + 1}H`;\n },\n move(x, y) {\n let ret = '';\n\n if (x < 0) ret += `${CSI}${-x}D`;\n else if (x > 0) ret += `${CSI}${x}C`;\n\n if (y < 0) ret += `${CSI}${-y}A`;\n else if (y > 0) ret += `${CSI}${y}B`;\n\n return ret;\n },\n up: (count = 1) => `${CSI}${count}A`,\n down: (count = 1) => `${CSI}${count}B`,\n forward: (count = 1) => `${CSI}${count}C`,\n backward: (count = 1) => `${CSI}${count}D`,\n nextLine: (count = 1) => `${CSI}E`.repeat(count),\n prevLine: (count = 1) => `${CSI}F`.repeat(count),\n left: `${CSI}G`,\n hide: `${CSI}?25l`,\n show: `${CSI}?25h`,\n save: `${ESC}7`,\n restore: `${ESC}8`\n}\n\nconst scroll = {\n up: (count = 1) => `${CSI}S`.repeat(count),\n down: (count = 1) => `${CSI}T`.repeat(count)\n}\n\nconst erase = {\n screen: `${CSI}2J`,\n up: (count = 1) => `${CSI}1J`.repeat(count),\n down: (count = 1) => `${CSI}J`.repeat(count),\n line: `${CSI}2K`,\n lineEnd: `${CSI}K`,\n lineStart: `${CSI}1K`,\n lines(count) {\n let clear = '';\n for (let i = 0; i < count; i++)\n clear += this.line + (i < count - 1 ? cursor.up() : '');\n if (count)\n clear += cursor.left;\n return clear;\n }\n}\n\nmodule.exports = { cursor, scroll, erase, beep };\n", "import assert from \"node:assert/strict\";\nimport { rm } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createTerminalPilotCliRepl } from \"./cli-repl.js\";\n\ntype QaCase = {\n id: number;\n title: string;\n skipped?: boolean;\n run?: (ctx: QaContext) => Promise<void>;\n};\n\ntype QaFailure = {\n id: number;\n title: string;\n reason: string;\n};\n\ntype SessionListResult = {\n sessions: Array<{ session: string; command: string; pid: number }>;\n};\n\ntype SessionResult = {\n session: string;\n pid: number;\n command: string;\n exitCode: number | null;\n};\n\ntype CreateSessionResult = {\n session: string;\n pid: number;\n};\n\ntype WaitForResult = {\n matched: true;\n line: string;\n};\n\ntype ExitCodeResult = {\n exitCode: number;\n};\n\ntype ReadScreenResult = {\n lines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n exitCode: number | null;\n};\n\ntype ReadHistoryResult = {\n lines: string[];\n exitCode: number | null;\n};\n\ntype OkResult = {\n ok: true;\n};\n\nconst testingDirectory = path.dirname(fileURLToPath(import.meta.url));\nconst repoRoot = path.resolve(testingDirectory, \"../../../..\");\nconst tsxPath = path.join(repoRoot, \"node_modules\", \".bin\", \"tsx\");\nconst testCliPath = path.join(repoRoot, \"packages/terminal-pilot/src/testing/test-cli.js\");\nconst menuCliPath = path.join(repoRoot, \"packages/terminal-pilot/src/testing/menu-cli.js\");\nconst vimSavedFile = path.join(os.tmpdir(), \"terminal-pilot-qa-test.txt\");\nconst vimDiscardFile = path.join(os.tmpdir(), \"terminal-pilot-qa-discard.txt\");\n\nclass QaContext {\n private readonly repl = createTerminalPilotCliRepl();\n\n async close(): Promise<void> {\n await this.repl.close();\n }\n\n async expectOk<T>(args: string[]): Promise<T> {\n const result = await this.repl.runJson<T>(args);\n\n if (result.exitCode !== 0) {\n throw new Error(\n `Command failed (${result.exitCode}): terminal-pilot ${args.join(\" \")}\\n${result.stderr || \"<no error output>\"}`\n );\n }\n\n return result.stdout;\n }\n\n async expectError(args: string[]): Promise<string> {\n const result = await this.repl.run(args);\n\n if (result.exitCode === 0) {\n throw new Error(\n `Expected command to fail: terminal-pilot ${args.join(\" \")}\\nstdout: ${result.stdout || \"<empty>\"}`\n );\n }\n\n return result.stderr || result.stdout;\n }\n\n async listSessions(): Promise<SessionListResult> {\n return this.expectOk<SessionListResult>([\"list-sessions\"]);\n }\n\n async getSessionIfExists(session: string): Promise<SessionResult | null> {\n const result = await this.repl.runJson<SessionResult>([\"get-session\", \"-s\", session]);\n if (result.exitCode !== 0) return null;\n return result.stdout;\n }\n\n async closeSessionIfExists(session: string): Promise<void> {\n const existing = await this.getSessionIfExists(session);\n\n if (existing !== null) {\n await this.expectOk<ExitCodeResult>([\"close-session\", \"-s\", session]);\n }\n }\n\n async ensurePromptSession(session: string): Promise<void> {\n const existing = await this.getSessionIfExists(session);\n\n if (existing?.exitCode !== null) {\n await this.expectOk<ExitCodeResult>([\"close-session\", \"-s\", session]);\n }\n\n if (existing === null || existing.exitCode !== null) {\n const created = await this.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n session,\n tsxPath,\n testCliPath\n ]);\n assert.equal(created.session, session);\n assert.ok(created.pid > 0);\n }\n\n const screen = await this.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", session]);\n if (!screen.lines.some((line) => line.includes(\"What is your name?\"))) {\n const prompt = await this.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n session,\n \"-l\",\n \"What is your name?\"\n ]);\n assert.equal(prompt.matched, true);\n }\n }\n\n async ensureGreetingSession(session: string, name: string): Promise<void> {\n await this.ensurePromptSession(session);\n\n const history = await this.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", session]);\n if (history.lines.some((line) => line.includes(`Hello, ${name}!`))) {\n return;\n }\n\n await this.expectOk<OkResult>([\"fill\", \"-s\", session, `${name}\\n`]);\n const greeted = await this.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n session,\n \"-l\",\n `Hello, ${name}!`\n ]);\n assert.equal(greeted.matched, true);\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\nasync function removeIfExists(filePath: string): Promise<void> {\n await rm(filePath, { force: true });\n}\n\nasync function closeSessions(ctx: QaContext, sessions: string[]): Promise<void> {\n for (const session of sessions) {\n await ctx.closeSessionIfExists(session);\n }\n}\n\nconst cases: QaCase[] = [\n {\n id: 1,\n title: \"Empty session list\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S1\");\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n }\n },\n {\n id: 2,\n title: \"Create a session\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S1\");\n const created = await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"S1\",\n tsxPath,\n testCliPath\n ]);\n assert.equal(created.session, \"S1\");\n assert.ok(created.pid > 0);\n }\n },\n {\n id: 3,\n title: \"Session appears in list\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const listed = await ctx.listSessions();\n assert.equal(listed.sessions.length, 1);\n assert.equal(listed.sessions[0]?.session, \"S1\");\n }\n },\n {\n id: 4,\n title: \"Get session metadata\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const session = await ctx.expectOk<SessionResult>([\"get-session\", \"-s\", \"S1\"]);\n assert.equal(session.session, \"S1\");\n assert.ok(session.pid > 0);\n assert.match(session.command, /tsx/);\n assert.equal(session.exitCode, null);\n }\n },\n {\n id: 5,\n title: \"Wait for prompt\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const waited = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S1\",\n \"-l\",\n \"What is your name?\"\n ]);\n assert.equal(waited.matched, true);\n assert.match(waited.line, /What is your name\\?/);\n }\n },\n {\n id: 6,\n title: \"Fill text\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const result = await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S1\", \"Alice\\n\"]);\n assert.deepEqual(result, { ok: true });\n }\n },\n {\n id: 7,\n title: \"Wait for greeting\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const waited = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S1\",\n \"-l\",\n \"Hello, Alice!\"\n ]);\n assert.equal(waited.matched, true);\n }\n },\n {\n id: 8,\n title: \"Read screen includes exitCode null\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const screen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S1\"]);\n assert.ok(Array.isArray(screen.lines));\n assert.equal(typeof screen.cursor.row, \"number\");\n assert.equal(typeof screen.cursor.col, \"number\");\n assert.equal(typeof screen.size.rows, \"number\");\n assert.equal(typeof screen.size.cols, \"number\");\n // test-cli exits immediately after printing the greeting, so exitCode may be 0 or null\n assert.ok(screen.exitCode === null || screen.exitCode === 0);\n }\n },\n {\n id: 9,\n title: \"Read history includes all output, exitCode null\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const history = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"S1\"]);\n assert.ok(history.lines.length > 0);\n assert.ok(history.lines.some((line) => line.includes(\"Hello, Alice!\")));\n // test-cli exits immediately after printing the greeting, so exitCode may be 0 or null\n assert.ok(history.exitCode === null || history.exitCode === 0);\n }\n },\n {\n id: 10,\n title: \"Read history with last N\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const history = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"S1\", \"-n\", \"2\"]);\n assert.ok(history.lines.length <= 2);\n }\n },\n {\n id: 11,\n title: \"Close session\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const closed = await ctx.expectOk<ExitCodeResult>([\"close-session\", \"-s\", \"S1\"]);\n assert.equal(typeof closed.exitCode, \"number\");\n\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n\n const error = await ctx.expectError([\"get-session\", \"-s\", \"S1\"]);\n assert.match(error, /not found/);\n }\n },\n {\n id: 12,\n title: \"terminal_type character-by-character\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S2\");\n try {\n const created = await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"S2\",\n tsxPath,\n testCliPath\n ]);\n assert.equal(created.session, \"S2\");\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S2\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"type\", \"-s\", \"S2\", \"Bob\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S2\", \"Enter\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S2\",\n \"-l\",\n \"Hello, Bob!\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S2\");\n }\n }\n },\n {\n id: 13,\n title: \"terminal_wait_for with literal flag\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S3\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S3\", tsxPath, testCliPath]);\n const prompt = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S3\",\n \"-l\",\n \"What is your name?\"\n ]);\n assert.equal(prompt.matched, true);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S3\", \"Carol\\n\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S3\",\n \"-l\",\n \"Hello, Carol!\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S3\");\n }\n }\n },\n {\n id: 14,\n title: \"terminal_wait_for regex\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S4\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S4\", tsxPath, testCliPath]);\n const prompt = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S4\",\n \"What is your name\\\\?\"\n ]);\n assert.equal(prompt.matched, true);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S4\", \"Dan\\n\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S4\",\n \"Hello,\\\\s+Dan\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S4\");\n }\n }\n },\n {\n id: 15,\n title: \"terminal_wait_for timeout exceeded\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S5\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S5\", tsxPath, testCliPath]);\n const error = await ctx.expectError([\n \"wait-for\",\n \"-s\",\n \"S5\",\n \"-t\",\n \"500\",\n \"THIS_WILL_NEVER_APPEAR\"\n ]);\n assert.match(error, /Timed out waiting for pattern/i);\n } finally {\n await ctx.closeSessionIfExists(\"S5\");\n }\n }\n },\n {\n id: 16,\n title: \"terminal_wait_for_exit natural exit\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S6\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S6\", tsxPath, testCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S6\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S6\", \"Eve\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"S6\",\n \"-t\",\n \"5000\"\n ]);\n assert.equal(exited.exitCode, 0);\n\n const session = await ctx.expectOk<SessionResult>([\"get-session\", \"-s\", \"S6\"]);\n assert.equal(session.exitCode, 0);\n\n const exitedAgain = await ctx.expectOk<ExitCodeResult>([\"wait-for-exit\", \"-s\", \"S6\"]);\n assert.equal(exitedAgain.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"S6\");\n }\n }\n },\n {\n id: 17,\n title: \"terminal_wait_for_exit timeout exceeded\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S7\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S7\", tsxPath, testCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S7\", \"-l\", \"What is your name?\"]);\n const error = await ctx.expectError([\n \"wait-for-exit\",\n \"-s\",\n \"S7\",\n \"-t\",\n \"300\"\n ]);\n assert.match(error, /Timed out waiting for process to exit/i);\n } finally {\n await ctx.closeSessionIfExists(\"S7\");\n }\n }\n },\n {\n id: 18,\n title: \"terminal_send_signal SIGINT\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S8\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S8\", tsxPath, testCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S8\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"send-signal\", \"-s\", \"S8\", \"SIGINT\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"S8\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(typeof exited.exitCode, \"number\");\n const screen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S8\"]);\n assert.equal(screen.exitCode, exited.exitCode);\n } finally {\n await ctx.closeSessionIfExists(\"S8\");\n }\n }\n },\n {\n id: 19,\n title: \"terminal_resize\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S9\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"S9\",\n \"--cols\",\n \"80\",\n \"--rows\",\n \"24\",\n tsxPath,\n testCliPath\n ]);\n const initialScreen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S9\"]);\n assert.equal(initialScreen.size.cols, 80);\n assert.equal(initialScreen.size.rows, 24);\n\n await ctx.expectOk<OkResult>([\"resize\", \"-s\", \"S9\", \"--cols\", \"120\", \"--rows\", \"40\"]);\n const resizedScreen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S9\"]);\n assert.equal(resizedScreen.size.cols, 120);\n assert.equal(resizedScreen.size.rows, 40);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S9\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S9\", \"Frank\\n\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S9\",\n \"-l\",\n \"Hello, Frank!\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S9\");\n }\n }\n },\n {\n id: 20,\n title: \"Full flow menu-cli with ArrowDown navigation\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S10\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S10\", tsxPath, menuCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S10\", \"-l\", \"Select an option:\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S10\", \"ArrowDown\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S10\", \"ArrowDown\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S10\", \"Enter\"]);\n const selected = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S10\",\n \"-l\",\n \"You selected: Option 3\"\n ]);\n assert.equal(selected.matched, true);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"S10\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"S10\");\n }\n }\n },\n {\n id: 21,\n title: \"Full flow menu-cli ArrowUp wrap-around\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S11\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S11\", tsxPath, menuCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S11\", \"-l\", \"Select an option:\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S11\", \"ArrowUp\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S11\", \"Enter\"]);\n const selected = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S11\",\n \"You selected: Option [123]\"\n ]);\n assert.equal(selected.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S11\");\n }\n }\n },\n {\n id: 22,\n title: \"Multiple concurrent sessions isolation\",\n async run(ctx) {\n await closeSessions(ctx, [\"SA\", \"SB\", \"SC\"]);\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"SA\", tsxPath, testCliPath]);\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"SB\", tsxPath, testCliPath]);\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"SC\", tsxPath, menuCliPath]);\n\n const listed = await ctx.listSessions();\n assert.equal(listed.sessions.length, 3);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SA\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"SA\", \"Session-A\\n\"]);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SB\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"SB\", \"Session-B\\n\"]);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SC\", \"-l\", \"Select an option:\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"SC\", \"Enter\"]);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SA\", \"-l\", \"Hello, Session-A!\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SB\", \"-l\", \"Hello, Session-B!\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SC\", \"-l\", \"You selected: Option 1\"]);\n\n const historyA = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"SA\"]);\n assert.ok(historyA.lines.some((line) => line.includes(\"Session-A\")));\n assert.ok(historyA.lines.every((line) => !line.includes(\"Session-B\")));\n\n const historyB = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"SB\"]);\n assert.ok(historyB.lines.some((line) => line.includes(\"Session-B\")));\n assert.ok(historyB.lines.every((line) => !line.includes(\"Session-A\")));\n\n await ctx.expectOk<ExitCodeResult>([\"close-session\", \"-s\", \"SB\"]);\n const afterClose = await ctx.listSessions();\n // SA and SC exit naturally after their interactions complete,\n // so the list only guarantees SB is gone\n assert.ok(!afterClose.sessions.some((s) => s.session === \"SB\"));\n } finally {\n await closeSessions(ctx, [\"SA\", \"SB\", \"SC\"]);\n }\n }\n },\n {\n id: 23,\n title: \"Final state\",\n async run(ctx) {\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n }\n },\n {\n id: 24,\n title: \"Unknown session error\",\n async run(ctx) {\n const readScreenError = await ctx.expectError([\"read-screen\", \"-s\", \"does-not-exist\"]);\n assert.match(readScreenError, /not found/);\n\n const closeError = await ctx.expectError([\"close-session\", \"-s\", \"does-not-exist\"]);\n assert.match(closeError, /not found/);\n }\n },\n {\n id: 25,\n title: \"Bash interactive shell\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"BASH\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"BASH\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"bash\",\n \"--\",\n \"--norc\",\n \"--noprofile\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-t\", \"3000\", \"\\\\$\\\\s*$\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"echo hello-from-bash\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-l\", \"hello-from-bash\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"echo $((6 * 7))\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-l\", \"42\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"sleep 60\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-t\", \"2000\", \"sleep\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"BASH\", \"Control+c\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-t\", \"3000\", \"\\\\$\\\\s*$\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"exit 0\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"BASH\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"BASH\");\n }\n }\n },\n {\n id: 26,\n title: \"Bash long output read_history line count\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"BASH2\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"BASH2\",\n \"bash\",\n \"--\",\n \"--norc\",\n \"--noprofile\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH2\", \"-t\", \"3000\", \"\\\\$\\\\s*$\"]);\n await ctx.expectOk<OkResult>([\n \"fill\",\n \"-s\",\n \"BASH2\",\n \"for i in $(seq 1 50); do echo \\\"line $i\\\"; done\\n\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH2\", \"-l\", \"line 50\"]);\n\n const history = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"BASH2\"]);\n for (let index = 1; index <= 50; index += 1) {\n assert.ok(history.lines.some((line) => line.includes(`line ${index}`)));\n }\n\n const tail = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"BASH2\", \"-n\", \"10\"]);\n assert.ok(tail.lines.length <= 10);\n assert.ok(tail.lines.some((line) => /line 50/.test(line)));\n } finally {\n await ctx.closeSessionIfExists(\"BASH2\");\n }\n }\n },\n {\n id: 27,\n title: \"Python REPL expression evaluation and multi-line input\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"PY\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"PY\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"python3\",\n \"--\",\n \"-q\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \">>>\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"2 ** 10\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \"1024\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"[x*x for x in range(5)]\\n\"]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"PY\",\n \"\\\\[0, 1, 4, 9, 16\\\\]\"\n ]);\n\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"def greet(name):\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"\\\\.\\\\.\\\\.\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \" return f'hi {name}'\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"\\\\.\\\\.\\\\.\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \">>>\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"greet('world')\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \"hi world\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"PY\", \"Control+d\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"PY\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"PY\");\n }\n }\n },\n {\n id: 28,\n title: \"Node.js REPL evaluation\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"NODE\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"NODE\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"node\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"-l\", \">\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"NODE\", \"Math.PI.toFixed(4)\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"-l\", \"3.1416\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"NODE\", \"[1,2,3].map(x => x * 2)\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"\\\\[ 2, 4, 6 \\\\]\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"NODE\", \"process.version\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"v\\\\d+\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"NODE\", \"Control+d\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"NODE\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"NODE\");\n }\n }\n },\n {\n id: 29,\n title: \"vim open, edit, save and quit\",\n async run(ctx) {\n await removeIfExists(vimSavedFile);\n await closeSessions(ctx, [\"VIM\", \"CAT\"]);\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"VIM\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"vim\",\n vimSavedFile\n ]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"VIM\",\n \"-t\",\n \"5000\",\n path.basename(vimSavedFile)\n ]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM\", \"i\"]);\n await ctx.expectOk<OkResult>([\"type\", \"-s\", \"VIM\", \"hello from terminal-pilot\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM\", \"Escape\"]);\n const screen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"VIM\"]);\n assert.ok(screen.lines.some((line) => line.includes(\"hello from terminal-pilot\")));\n assert.equal(screen.exitCode, null);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"VIM\", \":wq\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"VIM\",\n \"-t\",\n \"5000\"\n ]);\n assert.equal(exited.exitCode, 0);\n\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"CAT\", \"cat\", vimSavedFile]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"CAT\",\n \"-l\",\n \"hello from terminal-pilot\"\n ]);\n } finally {\n await closeSessions(ctx, [\"VIM\", \"CAT\"]);\n await removeIfExists(vimSavedFile);\n }\n }\n },\n {\n id: 30,\n title: \"vim quit without saving\",\n async run(ctx) {\n await removeIfExists(vimDiscardFile);\n await ctx.closeSessionIfExists(\"VIM2\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"VIM2\",\n \"--cols\",\n \"80\",\n \"--rows\",\n \"24\",\n \"vim\",\n vimDiscardFile\n ]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"VIM2\",\n \"-t\",\n \"5000\",\n path.basename(vimDiscardFile)\n ]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM2\", \"i\"]);\n await ctx.expectOk<OkResult>([\"type\", \"-s\", \"VIM2\", \"this should not be saved\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM2\", \"Escape\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"VIM2\", \":q!\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"VIM2\",\n \"-t\",\n \"5000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"VIM2\");\n await removeIfExists(vimDiscardFile);\n }\n }\n },\n {\n id: 31,\n title: \"poe-code help output\",\n skipped: true\n },\n {\n id: 32,\n title: \"poe-code configure interactive agent selection\",\n skipped: true\n },\n {\n id: 33,\n title: \"Claude Code version and help\",\n skipped: true\n },\n {\n id: 34,\n title: \"Claude Code single prompt\",\n skipped: true\n },\n {\n id: 35,\n title: \"Claude Code interactive REPL mode\",\n skipped: true\n },\n {\n id: 36,\n title: \"Final state all sessions closed\",\n async run(ctx) {\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n }\n }\n];\n\nexport async function main(): Promise<void> {\n const ctx = new QaContext();\n const failures: QaFailure[] = [];\n\n try {\n for (const testCase of cases) {\n if (testCase.skipped === true) {\n process.stdout.write(`SKIP ${testCase.id}. ${testCase.title}\\n`);\n continue;\n }\n\n process.stdout.write(`RUN ${testCase.id}. ${testCase.title}\\n`);\n\n try {\n await testCase.run?.(ctx);\n process.stdout.write(`PASS ${testCase.id}. ${testCase.title}\\n`);\n } catch (error) {\n const reason = formatError(error);\n failures.push({\n id: testCase.id,\n title: testCase.title,\n reason\n });\n process.stdout.write(`FAIL ${testCase.id}. ${testCase.title}\\n`);\n process.stdout.write(`${reason}\\n`);\n }\n }\n } finally {\n await ctx.close();\n }\n\n process.stdout.write(`\\nSummary: ${cases.filter((entry) => !entry.skipped).length - failures.length} passed, ${failures.length} failed, ${cases.filter((entry) => entry.skipped).length} skipped.\\n`);\n\n if (failures.length > 0) {\n process.stdout.write(\"\\nFailures:\\n\");\n for (const failure of failures) {\n process.stdout.write(`${failure.id}. ${failure.title}: ${failure.reason}\\n`);\n }\n process.exitCode = 1;\n }\n}\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n await main();\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", "#!/usr/bin/env node\nimport { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { runCLI } from \"@poe-code/cmdkit/cli\";\nimport { terminalPilotGroup } from \"./commands/index.js\";\n\nfunction normalizeArgv(argv: string[]): string[] {\n if (\n argv.includes(\"--json\") &&\n !argv.some((argument) => argument === \"--output\" || argument.startsWith(\"--output=\"))\n ) {\n return argv.flatMap((argument) => argument === \"--json\" ? [\"--output\", \"json\"] : [argument]);\n }\n\n return argv;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const originalArgv = process.argv;\n process.argv = normalizeArgv(argv);\n\n try {\n await runCLI(terminalPilotGroup);\n } finally {\n process.argv = originalArgv;\n }\n}\n\nasync function isDirectExecution(argv: string[]): Promise<boolean> {\n const entryPoint = argv[1];\n\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n return false;\n }\n\n try {\n const modulePath = fileURLToPath(import.meta.url);\n const [resolvedEntryPoint, resolvedModulePath] = await Promise.all([\n realpath(path.resolve(entryPoint)),\n realpath(modulePath)\n ]);\n\n return resolvedEntryPoint === resolvedModulePath;\n } catch {\n return false;\n }\n}\n\nif (await isDirectExecution(process.argv)) {\n await main();\n}\n", "import { access, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command as CommanderCommand, CommanderError, InvalidArgumentError, Option } from \"commander\";\nimport type { AnySchema, ArraySchema, ObjectSchema } from \"@poe-code/cmdkit-schema\";\nimport {\n cancel,\n confirm,\n createLogger,\n formatCommandList,\n formatOptionList,\n getTheme,\n isCancel,\n note,\n promptText,\n renderTable,\n resetOutputFormatCache,\n select,\n text,\n} from \"@poe-code/design-system\";\nimport type {\n Command,\n CommandRequirementOptions,\n Group,\n HandlerContext,\n HandlerEnv,\n HandlerFs,\n SecretDeclarations,\n SecretDefinition,\n Scope,\n} from \"./index.js\";\nimport { UserError, assertCommandRequirements, getCommandSourcePath, resolveCommandSecrets } from \"./index.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { renderResult } from \"./renderer.js\";\nimport type { OutputMode } from \"./renderer.js\";\n\nconst RESERVED_SERVICE_NAMES = new Set([\"params\", \"secrets\", \"fetch\", \"fs\", \"env\", \"progress\"]);\n\ntype Casing = \"kebab\" | \"snake\";\ntype PrimitiveSchema = Exclude<AnySchema, ObjectSchema<any>>;\ntype ScalarSchema = Exclude<PrimitiveSchema, ArraySchema<any>>;\ntype FieldSchema = Exclude<PrimitiveSchema, { kind: \"optional\" }>;\n\ninterface ResolvedFlags {\n json?: boolean;\n preset?: string;\n yes?: boolean;\n output?: OutputMode;\n verbose?: boolean;\n}\n\ninterface FieldDefinition {\n path: string[];\n displayPath: string;\n optionAttribute: string;\n commanderOptionAttribute: string;\n optionFlag: string;\n shortFlag?: string;\n schema: FieldSchema;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n positionalIndex?: number;\n variadicPosition?: boolean;\n}\n\ninterface ExecutionState<TServices extends object> {\n command: Command<TServices, any, any, any>;\n fields: FieldDefinition[];\n positionalValues: unknown[];\n actionCommand: CommanderCommand;\n}\n\ninterface FixtureFetchRequest {\n method?: string;\n url: string;\n}\n\ninterface FixtureFetchResponse {\n body?: unknown;\n headers?: Record<string, string>;\n status?: number;\n}\n\ninterface FixtureFetchEntry {\n request: FixtureFetchRequest;\n response: FixtureFetchResponse;\n}\n\ninterface FixtureScenario {\n name: string;\n services?: Record<string, unknown>;\n}\n\ninterface ResolvedFixtureRuntime<TServices extends object> {\n env: HandlerEnv;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n isFixture: boolean;\n requirementOptions: CommandRequirementOptions;\n secrets: Record<string, string | undefined>;\n services: TServices;\n}\n\ninterface ResolvedHelpTarget<TServices extends object> {\n breadcrumb: string[];\n node: Command<TServices, any, any, any> | Group<TServices>;\n}\n\ninterface HelpCommandRow {\n description: string;\n name: string;\n}\n\ninterface HelpOptionRow {\n description: string;\n flags: string;\n}\n\nexport interface RunCLIOptions<TServices extends object = Record<string, unknown>> {\n apiVersion?: string;\n casing?: Casing;\n rootDisplayName?: string;\n rootUsageName?: string;\n services?: TServices;\n version?: string;\n}\n\nfunction inferProgramName(argv: string[]): string {\n const entrypoint = argv[1];\n\n if (typeof entrypoint !== \"string\" || entrypoint.length === 0) {\n return \"cmdkit\";\n }\n\n const parsed = path.parse(entrypoint);\n return parsed.name.length > 0 ? parsed.name : \"cmdkit\";\n}\n\nfunction normalizeRoots<TServices extends object>(\n roots: Group<TServices> | Group<TServices>[],\n argv: string[]\n): Group<TServices> {\n if (!Array.isArray(roots)) {\n return roots;\n }\n\n return {\n kind: \"group\",\n name: inferProgramName(argv),\n aliases: [],\n secrets: {},\n children: roots,\n };\n}\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\n\nfunction unwrapOptional(schema: AnySchema): AnySchema {\n if (schema.kind === \"optional\") {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n const isSeparator = char === \"-\" || char === \"_\" || char === \" \" || char === \".\";\n\n if (isSeparator) {\n if (current.length > 0) {\n words.push(current.toLowerCase());\n current = \"\";\n }\n continue;\n }\n\n const isUppercase = char !== lower && char === upper;\n const previous = value[index - 1];\n const next = value[index + 1];\n const previousIsLowercase = previous !== undefined && previous === previous.toLowerCase() && previous !== previous.toUpperCase();\n const nextIsLowercase = next !== undefined && next === next.toLowerCase() && next !== next.toUpperCase();\n\n if (isUppercase && current.length > 0 && (previousIsLowercase || nextIsLowercase)) {\n words.push(current.toLowerCase());\n current = char;\n continue;\n }\n\n current += char;\n }\n\n if (current.length > 0) {\n words.push(current.toLowerCase());\n }\n\n return words;\n}\n\nfunction formatSegment(segment: string, casing: Casing): string {\n const separator = casing === \"snake\" ? \"_\" : \"-\";\n return splitWords(segment).join(separator);\n}\n\nfunction toOptionFlag(path: string[], casing: Casing): string {\n return `--${path.map((segment) => formatSegment(segment, casing)).join(\".\")}`;\n}\n\nfunction toOptionAttribute(path: string[], casing: Casing): string {\n return path\n .map((segment) => {\n const formatted = formatSegment(segment, casing);\n\n if (casing === \"snake\") {\n return formatted;\n }\n\n const words = formatted.split(\"-\");\n return words\n .map((word, index) =>\n index === 0 ? word : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`\n )\n .join(\"\");\n })\n .join(\".\");\n}\n\nfunction toDisplayPath(path: string[]): string {\n return path.join(\".\");\n}\n\nfunction collectFields(\n schema: ObjectSchema<any>,\n casing: Casing,\n path: string[] = [],\n inheritedOptional = false\n): FieldDefinition[] {\n const fields: FieldDefinition[] = [];\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const nextPath = [...path, key];\n const optional = inheritedOptional || rawChildSchema.kind === \"optional\";\n const childSchema = unwrapOptional(rawChildSchema);\n\n if (childSchema.kind === \"object\") {\n fields.push(...collectFields(childSchema, casing, nextPath, optional));\n continue;\n }\n\n fields.push({\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionAttribute: toOptionAttribute(nextPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(nextPath, casing),\n optionFlag: toOptionFlag(nextPath, casing),\n shortFlag: childSchema.short,\n schema: childSchema as FieldSchema,\n description: childSchema.description,\n optional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n });\n }\n\n return fields;\n}\n\nfunction toCommanderOptionAttribute(path: string[], casing: Casing): string {\n const optionAttribute = toOptionAttribute(path, casing);\n const optionFlag = toOptionFlag(path, casing);\n\n if (!GLOBAL_LONG_OPTION_FLAGS.has(optionFlag)) {\n return optionAttribute;\n }\n\n return `param_${optionAttribute}`;\n}\n\nfunction assignPositionals(fields: FieldDefinition[], positional: string[]): FieldDefinition[] {\n if (positional.length === 0) {\n return fields;\n }\n\n const byPath = new Map(fields.map((field) => [field.displayPath, field]));\n let variadicPositionSeen = false;\n\n positional.forEach((name, index) => {\n const field = byPath.get(name);\n\n if (field === undefined) {\n throw new UserError(`Positional parameter \"${name}\" does not exist in params.`);\n }\n\n if (field.schema.kind === \"array\") {\n if (index !== positional.length - 1) {\n throw new UserError(`Positional array parameter \"${name}\" must be the last positional.`);\n }\n\n variadicPositionSeen = true;\n }\n\n if (variadicPositionSeen && field.schema.kind !== \"array\") {\n throw new UserError(`Positional parameter \"${name}\" cannot appear after a positional array.`);\n }\n\n field.positionalIndex = index;\n field.variadicPosition = field.schema.kind === \"array\";\n });\n\n return fields;\n}\n\nfunction formatOptionFlags(field: FieldDefinition): string {\n const collidesWithGlobalFlag = GLOBAL_LONG_OPTION_FLAGS.has(field.optionFlag);\n\n if (collidesWithGlobalFlag) {\n if (field.shortFlag === undefined) {\n throw new UserError(\n `Parameter \"${field.displayPath}\" uses reserved CLI flag \"${field.optionFlag}\". Add a short flag or rename the parameter.`\n );\n }\n\n return `-${field.shortFlag}`;\n }\n\n if (field.shortFlag === undefined) {\n return field.optionFlag;\n }\n\n return `-${field.shortFlag}, ${field.optionFlag}`;\n}\n\nfunction formatPositionalToken(field: FieldDefinition): string {\n const optionalPositional = field.optional || field.hasDefault;\n\n if (field.variadicPosition === true) {\n return optionalPositional ? `[${field.displayPath}...]` : `<${field.displayPath}...>`;\n }\n\n return optionalPositional ? `[${field.displayPath}]` : `<${field.displayPath}>`;\n}\n\nfunction parseBooleanText(value: string, label: string): boolean {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"true\") {\n return true;\n }\n\n if (normalized === \"false\") {\n return false;\n }\n\n throw new InvalidArgumentError(`Invalid value for \"${label}\". Expected true or false.`);\n}\n\nfunction parseEnumValue(value: string, values: ReadonlyArray<string | number | boolean>, label: string): string | number | boolean {\n const match = values.find((candidate) => String(candidate) === value);\n\n if (match === undefined) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}.`\n );\n }\n\n return match;\n}\n\nfunction parseScalarValue(value: string, schema: ScalarSchema, label: string): string | number | boolean {\n switch (schema.kind) {\n case \"string\":\n return value;\n\n case \"number\": {\n const parsed = Number(value);\n if (!isValidNumberSchemaValue(parsed, schema)) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected ${getExpectedNumberDescription(schema)}.`\n );\n }\n return parsed;\n }\n\n case \"boolean\":\n return parseBooleanText(value, label);\n\n case \"enum\":\n return parseEnumValue(value, schema.values, label);\n\n default:\n throw new UserError(`Unsupported CLI schema kind \"${schema.kind}\".`);\n }\n}\n\nfunction splitArrayInput(value: string): string[] {\n const items: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n\n if (char === \",\") {\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n items.push(trimmed);\n }\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n items.push(trimmed);\n }\n\n return items;\n}\n\nfunction parseArrayValue(value: string, schema: ArraySchema<any>, label: string): unknown[] {\n const itemSchema = unwrapOptional(schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${label}\" must use scalar items.`);\n }\n\n return splitArrayInput(value).map((item) => parseScalarValue(item, itemSchema as ScalarSchema, label));\n}\n\nfunction createOption(field: FieldDefinition): Option[] {\n const flags = formatOptionFlags(field);\n const collidesWithGlobalFlag = GLOBAL_LONG_OPTION_FLAGS.has(field.optionFlag);\n\n if (field.schema.kind === \"boolean\") {\n if (collidesWithGlobalFlag) {\n return [createCommanderOption(flags, field.description, field)];\n }\n\n return [\n createCommanderOption(flags, field.description, field),\n createCommanderOption(`--no-${field.optionFlag.slice(2)}`, field.description, field),\n ];\n }\n\n if (field.schema.kind === \"array\") {\n return [\n createCommanderOption(`${flags} <value...>`, field.description, field).argParser(\n (value: string, previous: unknown[] = []) => [\n ...previous,\n ...parseArrayValue(value, field.schema as ArraySchema<any>, field.displayPath),\n ]\n ),\n ];\n }\n\n const option = createCommanderOption(`${flags} <value>`, field.description, field);\n\n if (field.schema.kind === \"enum\" && field.schema.values.every((value) => typeof value === \"string\")) {\n option.choices([...field.schema.values] as string[]);\n }\n\n option.argParser((value: string) => parseScalarValue(value, field.schema as ScalarSchema, field.displayPath));\n return [option];\n}\n\nconst GLOBAL_LONG_OPTION_FLAGS = new Set([\"--preset\", \"--yes\", \"--output\", \"--verbose\"]);\n\nfunction createCommanderOption(\n flags: string,\n description: string | undefined,\n field: FieldDefinition\n): Option {\n const option = new Option(flags, description);\n\n if (field.commanderOptionAttribute !== field.optionAttribute) {\n option.attributeName = () => field.commanderOptionAttribute;\n }\n\n return option;\n}\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.some((token) => HELP_FLAGS.has(token));\n}\n\nfunction resolveHelpOutput(argv: string[]): OutputMode {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index] ?? \"\";\n\n if (token === \"--output\") {\n const value = argv[index + 1];\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n continue;\n }\n\n if (token.startsWith(\"--output=\")) {\n const value = token.slice(\"--output=\".length);\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n }\n }\n\n return \"rich\";\n}\n\nfunction isNodeVisibleInScope<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n scope: Scope\n): boolean {\n if (node.kind === \"command\") {\n return node.scope.includes(scope);\n }\n\n return (\n getVisibleChildren(node, scope).length > 0 ||\n Boolean(node.default && node.default.scope.includes(scope)) ||\n node.scope === undefined ||\n node.scope.includes(scope)\n );\n}\n\nfunction getVisibleChildren<TServices extends object>(group: Group<TServices>, scope: Scope): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return group.children.filter((child) => isNodeVisibleInScope(child, scope));\n}\n\nfunction findVisibleChild<TServices extends object>(\n group: Group<TServices>,\n token: string,\n scope: Scope\n): Command<TServices, any, any, any> | Group<TServices> | undefined {\n return getVisibleChildren(group, scope).find(\n (child) => child.name === token || child.aliases.includes(token)\n );\n}\n\nfunction resolveHelpTarget<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n scope: Scope,\n rootDisplayName?: string\n): ResolvedHelpTarget<TServices> {\n const breadcrumb = [rootDisplayName ?? root.name];\n let current: Command<TServices, any, any, any> | Group<TServices> = root;\n\n for (const token of argv.slice(2)) {\n if (token.startsWith(\"-\") || token === \"help\") {\n break;\n }\n\n if (current.kind !== \"group\") {\n break;\n }\n\n const child: Command<TServices, any, any, any> | Group<TServices> | undefined = findVisibleChild(\n current,\n token,\n scope\n );\n if (child === undefined) {\n break;\n }\n\n breadcrumb.push(child.name);\n current = child;\n }\n\n return {\n breadcrumb,\n node: current,\n };\n}\n\nfunction describeSchemaType(schema: FieldSchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n\n case \"number\":\n return \"number\";\n\n case \"boolean\":\n return \"boolean\";\n\n case \"enum\":\n return \"value\";\n\n case \"array\":\n return `${describeSchemaType(unwrapOptional(schema.item) as FieldSchema)}...`;\n\n default:\n throw new UserError(\"Unsupported CLI schema kind.\");\n }\n}\n\nfunction formatHelpFieldFlags(field: FieldDefinition): string {\n if (field.positionalIndex !== undefined) {\n return formatPositionalToken(field);\n }\n\n if (field.schema.kind === \"boolean\") {\n return formatOptionFlags(field);\n }\n\n return `${formatOptionFlags(field)} <${describeSchemaType(field.schema)}>`;\n}\n\nfunction appendHelpMetadata(description: string, metadata: string[]): string {\n if (metadata.length === 0) {\n return description;\n }\n\n if (description.length === 0) {\n return `(${metadata.join(\", \")})`;\n }\n\n return `${description} (${metadata.join(\", \")})`;\n}\n\nfunction formatHelpFieldDescription(field: FieldDefinition): string {\n const description = field.description ?? field.displayPath;\n const metadata: string[] = [];\n\n if (!field.optional && !field.hasDefault) {\n metadata.push(\"required\");\n }\n\n if (field.hasDefault) {\n metadata.push(`default: ${formatResolvedValue(field.defaultValue)}`);\n }\n\n return appendHelpMetadata(description, metadata);\n}\n\nfunction formatSecretRows(secrets: SecretDeclarations): HelpOptionRow[] {\n return Object.values(secrets).map((secret) => ({\n flags: secret.env,\n description: formatSecretDescription(secret),\n }));\n}\n\nfunction formatSecretDescription(secret: SecretDefinition): string {\n if (secret.description !== undefined && secret.description.length > 0) {\n return secret.description;\n }\n\n return secret.optional === true ? \"Optional secret\" : \"Required secret\";\n}\n\nfunction formatCommandRows<TServices extends object>(group: Group<TServices>, scope: Scope): HelpCommandRow[] {\n return getVisibleChildren(group, scope).map((child) => ({\n name: child.aliases.length === 0 ? child.name : `${child.name} (${child.aliases.join(\", \")})`,\n description: child.description ?? \"\",\n }));\n}\n\nfunction formatGlobalOptionRows(showVersion: boolean): HelpOptionRow[] {\n const rows: HelpOptionRow[] = [\n {\n flags: \"--preset <path>\",\n description: \"Load parameter defaults from a JSON file\",\n },\n {\n flags: \"--yes\",\n description: \"Accept defaults, skip prompts\",\n },\n {\n flags: \"--output <format>\",\n description: \"Output format (rich, md, json)\",\n },\n {\n flags: \"-h, --help\",\n description: \"Show help\",\n },\n ];\n\n if (showVersion) {\n rows.push({\n flags: \"--version\",\n description: \"Show version\",\n });\n }\n\n return rows;\n}\n\nfunction renderHelpSections(sections: string[]): string {\n return sections.filter((section) => section.length > 0).join(\"\\n\\n\");\n}\n\nfunction buildUsageLine(breadcrumb: string[], rootUsageName: string | undefined, suffix: string): string | undefined {\n if (rootUsageName === undefined) {\n return undefined;\n }\n const subPath = breadcrumb.slice(1).join(\" \");\n return subPath ? `${rootUsageName} ${subPath} ${suffix}` : `${rootUsageName} ${suffix}`;\n}\n\nfunction renderGroupHelp<TServices extends object>(\n group: Group<TServices>,\n breadcrumb: string[],\n scope: Scope,\n showVersion: boolean,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const commandRows = formatCommandRows(group, scope);\n\n if (commandRows.length > 0) {\n sections.push(`${text.section(\"Commands:\")}\\n${formatCommandList(commandRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(showVersion))}`);\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, \"[options] [command]\"),\n description: group.description,\n requiresAuth: group.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderLeafHelp<TServices extends object>(\n command: Command<TServices, any, any, any>,\n breadcrumb: string[],\n casing: Casing,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const fields = assignPositionals(collectFields(command.params, casing), command.positional);\n const optionRows = fields.map((field) => ({\n flags: formatHelpFieldFlags(field),\n description: formatHelpFieldDescription(field),\n }));\n\n if (optionRows.length > 0) {\n sections.push(`${text.section(\"Options:\")}\\n${formatOptionList(optionRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(false))}`);\n\n const secretRows = formatSecretRows(command.secrets);\n if (secretRows.length > 0) {\n sections.push(`${text.section(\"Secrets (via environment):\")}\\n${formatOptionList(secretRows)}`);\n }\n\n const positionalFields = fields.filter((f) => f.positionalIndex !== undefined);\n const usageSuffix = positionalFields.length > 0\n ? `[options] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[options]\";\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, usageSuffix),\n description: command.description,\n requiresAuth: command.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderHelpDocument(input: {\n breadcrumb: string[];\n usageLine?: string;\n description?: string;\n requiresAuth: boolean;\n sections: string[];\n}): string {\n const lines = [text.heading(input.breadcrumb.join(\" \")), \"\"];\n\n if (input.usageLine !== undefined) {\n lines.push(`${text.section(\"Usage:\")} ${text.usageCommand(input.usageLine)}`, \"\");\n }\n\n if (input.description !== undefined) {\n lines.push(input.description);\n }\n\n if (input.requiresAuth) {\n lines.push(\"Requires: authentication\");\n }\n\n if (input.description !== undefined || input.requiresAuth) {\n lines.push(\"\");\n }\n\n lines.push(renderHelpSections(input.sections));\n\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nasync function renderGeneratedHelp<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n options: RunCLIOptions<TServices>\n): Promise<void> {\n const target = resolveHelpTarget(root, argv, \"cli\", options.rootDisplayName);\n const output = resolveHelpOutput(argv);\n const casing = options.casing ?? \"kebab\";\n\n await withOutputFormat(output, async () => {\n const rendered =\n target.node.kind === \"group\"\n ? renderGroupHelp(target.node, target.breadcrumb, \"cli\", options.version !== undefined, options.rootUsageName)\n : renderLeafHelp(target.node, target.breadcrumb, casing, options.rootUsageName);\n\n process.stdout.write(rendered);\n });\n}\n\nfunction createNodeCommand<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n execute: (state: ExecutionState<TServices>) => Promise<void>\n): CommanderCommand | null {\n if (node.kind === \"command\") {\n if (!node.scope.includes(\"cli\")) {\n return null;\n }\n\n const command = new CommanderCommand(node.name);\n const fields = assignPositionals(collectFields(node.params, casing), node.positional);\n\n if (node.description !== undefined) {\n command.description(node.description);\n }\n\n node.aliases.forEach((alias) => command.alias(alias));\n command.addHelpCommand(false);\n addGlobalOptions(command);\n\n for (const field of fields) {\n if (field.positionalIndex !== undefined) {\n command.argument(formatPositionalToken(field));\n continue;\n }\n\n for (const option of createOption(field)) {\n command.addOption(option);\n }\n }\n\n command.action(async (...args: unknown[]) => {\n const actionCommand = args[args.length - 1] as CommanderCommand;\n const positionalValues = args.slice(0, -2);\n\n await execute({\n command: node,\n fields,\n positionalValues,\n actionCommand,\n });\n });\n\n return command;\n }\n\n if (!isNodeVisibleInScope(node, \"cli\")) {\n return null;\n }\n\n const visibleChildren = node.children\n .map((child) => createNodeCommand(child, casing, execute))\n .filter((child): child is CommanderCommand => child !== null);\n\n const group = new CommanderCommand(node.name);\n\n if (node.description !== undefined) {\n group.description(node.description);\n }\n\n node.aliases.forEach((alias) => group.alias(alias));\n group.addHelpCommand(false);\n addGlobalOptions(group);\n for (const child of visibleChildren) {\n const isDefaultChild =\n node.default !== undefined &&\n node.default.scope.includes(\"cli\") &&\n (child.name() === node.default.name || child.aliases().includes(node.default.name));\n\n group.addCommand(child, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n return group;\n}\n\nfunction addGlobalOptions(command: CommanderCommand): void {\n command\n .option(\"--preset <path>\", \"Load parameter defaults from a JSON file.\")\n .option(\"--yes\", \"Accept defaults and skip prompts.\")\n .option(\"--output <format>\", \"Output format.\", (value: string) => {\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n\n if (value === \"markdown\") {\n return \"md\";\n }\n\n throw new InvalidArgumentError('Invalid value for \"--output\". Expected one of: rich, md, markdown, json.');\n })\n .option(\"--verbose\", \"Print stack traces for unexpected errors.\");\n}\n\nfunction setNestedValue(target: Record<string, unknown>, path: string[], value: unknown): void {\n let cursor = target;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const segment = path[index] ?? \"\";\n const existing = cursor[segment];\n\n if (typeof existing === \"object\" && existing !== null) {\n cursor = existing as Record<string, unknown>;\n continue;\n }\n\n const next: Record<string, unknown> = {};\n cursor[segment] = next;\n cursor = next;\n }\n\n const leaf = path[path.length - 1];\n if (leaf !== undefined) {\n cursor[leaf] = value;\n }\n}\n\nfunction formatResolvedValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\", \");\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nasync function promptForField(field: FieldDefinition): Promise<unknown> {\n const schema = field.schema;\n if (schema.kind === \"enum\") {\n const options = schema.loadOptions\n ? await schema.loadOptions()\n : schema.values.map((value) => ({\n label: schema.labels?.[String(value)] ?? String(value),\n value,\n }));\n const selected = await select({\n message: field.description ?? field.displayPath,\n options,\n initialValue: field.hasDefault ? field.defaultValue : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n if (field.schema.kind === \"boolean\") {\n const selected = await confirm({\n message: field.displayPath,\n initialValue: field.hasDefault ? Boolean(field.defaultValue) : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n const entered = await promptText({\n message: field.displayPath,\n initialValue:\n field.hasDefault && field.defaultValue !== undefined\n ? formatResolvedValue(field.defaultValue)\n : undefined,\n });\n\n if (isCancel(entered)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (typeof entered !== \"string\") {\n throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\n }\n\n if (entered.trim().length === 0 && field.hasDefault) {\n return field.defaultValue;\n }\n\n if (field.schema.kind === \"array\") {\n return parseArrayValue(entered, field.schema, field.displayPath);\n }\n\n return parseScalarValue(entered, field.schema as ScalarSchema, field.displayPath);\n}\n\nfunction resolveOutput(resolvedFlags: ResolvedFlags): OutputMode {\n if (resolvedFlags.json === true) {\n return \"json\";\n }\n\n if (resolvedFlags.output !== undefined) {\n return resolvedFlags.output;\n }\n\n return \"rich\";\n}\n\nconst DESIGN_SYSTEM_OUTPUT_BY_MODE = {\n rich: \"terminal\",\n md: \"markdown\",\n json: \"json\",\n} as const satisfies Record<OutputMode, \"terminal\" | \"markdown\" | \"json\">;\n\nfunction toDesignSystemOutput(output: OutputMode): \"terminal\" | \"markdown\" | \"json\" {\n return DESIGN_SYSTEM_OUTPUT_BY_MODE[output];\n}\n\nasync function withOutputFormat<T>(output: OutputMode, fn: () => Promise<T>): Promise<T> {\n const previous = process.env.OUTPUT_FORMAT;\n process.env.OUTPUT_FORMAT = toDesignSystemOutput(output);\n resetOutputFormatCache();\n\n try {\n return await fn();\n } finally {\n if (previous === undefined) {\n delete process.env.OUTPUT_FORMAT;\n } else {\n process.env.OUTPUT_FORMAT = previous;\n }\n resetOutputFormatCache();\n }\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") =>\n readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasFieldValue(value: unknown): boolean {\n return value !== undefined;\n}\n\nfunction hasNestedField(fields: FieldDefinition[], path: string[]): boolean {\n return fields.some(\n (field) =>\n path.length < field.path.length &&\n path.every((segment, index) => field.path[index] === segment)\n );\n}\n\nfunction describeExpectedPresetValue(schema: FieldSchema): string {\n if (schema.kind === \"array\") {\n return \"an array\";\n }\n\n if (schema.kind === \"enum\") {\n return `one of: ${schema.values.map((value) => JSON.stringify(value)).join(\", \")}`;\n }\n\n return `a ${schema.kind}`;\n}\n\nfunction validatePresetScalarValue(\n value: unknown,\n schema: ScalarSchema,\n fieldPath: string,\n presetPath: string\n): string | number | boolean | null {\n if (value === null && schema.nullable === true) {\n return null;\n }\n\n switch (schema.kind) {\n case \"string\":\n if (typeof value !== \"string\") {\n break;\n }\n return value;\n\n case \"number\":\n if (!isValidNumberSchemaValue(value, schema)) {\n break;\n }\n return value;\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n break;\n }\n return value;\n\n case \"enum\": {\n const match = schema.values.find((candidate) => Object.is(candidate, value));\n if (match !== undefined) {\n return match;\n }\n break;\n }\n\n default:\n throw new UserError(`Unsupported CLI schema kind \"${schema.kind}\".`);\n }\n\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected ${describeExpectedPresetValue(schema)}.`\n );\n}\n\nfunction validatePresetFieldValue(\n value: unknown,\n field: FieldDefinition,\n presetPath: string\n): unknown {\n if (field.schema.kind !== \"array\") {\n return validatePresetScalarValue(value, field.schema as ScalarSchema, field.displayPath, presetPath);\n }\n\n const itemSchema = unwrapOptional(field.schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${field.displayPath}\" must use scalar items.`);\n }\n\n if (!Array.isArray(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array.`\n );\n }\n\n return value.map((item) =>\n validatePresetScalarValue(item, itemSchema as ScalarSchema, field.displayPath, presetPath)\n );\n}\n\nasync function loadPresetValues(\n fields: FieldDefinition[],\n presetPath: string\n): Promise<Record<string, unknown>> {\n let rawPreset: string;\n\n try {\n rawPreset = await readFile(presetPath, {\n encoding: \"utf8\",\n });\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new UserError(`Preset file \"${presetPath}\" was not found.`);\n }\n\n const message =\n error instanceof Error && error.message.length > 0\n ? error.message\n : \"Unknown read error.\";\n throw new UserError(`Preset file \"${presetPath}\" could not be read: ${message}`);\n }\n\n let parsedPreset: unknown;\n\n try {\n parsedPreset = JSON.parse(rawPreset);\n } catch {\n throw new UserError(`Preset file \"${presetPath}\" is not valid JSON.`);\n }\n\n if (!isPlainObject(parsedPreset)) {\n throw new UserError(`Preset file \"${presetPath}\" must contain a JSON object.`);\n }\n\n const fieldByPath = new Map(fields.map((field) => [field.displayPath, field]));\n const presetValues: Record<string, unknown> = {};\n\n function visitObject(current: Record<string, unknown>, path: string[]): void {\n for (const [key, value] of Object.entries(current)) {\n const nextPath = [...path, key];\n const displayPath = toDisplayPath(nextPath);\n const field = fieldByPath.get(displayPath);\n\n if (field !== undefined) {\n presetValues[field.optionAttribute] = validatePresetFieldValue(value, field, presetPath);\n continue;\n }\n\n if (!hasNestedField(fields, nextPath)) {\n throw new UserError(\n `Preset file \"${presetPath}\" contains unknown parameter \"${displayPath}\".`\n );\n }\n\n if (!isPlainObject(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${displayPath}\". Expected an object.`\n );\n }\n\n visitObject(value, nextPath);\n }\n }\n\n visitObject(parsedPreset, []);\n return presetValues;\n}\n\nfunction isNumericFixtureSelector(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeHttpMethod(value: string | undefined): string {\n return (value ?? \"GET\").toUpperCase();\n}\n\nfunction isReadLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"get\" ||\n normalized === \"head\" ||\n normalized === \"options\" ||\n normalized.startsWith(\"read\") ||\n normalized.startsWith(\"get\") ||\n normalized.startsWith(\"find\") ||\n normalized.startsWith(\"list\") ||\n normalized.startsWith(\"load\") ||\n normalized.startsWith(\"fetch\") ||\n normalized.startsWith(\"query\") ||\n normalized.startsWith(\"exists\") ||\n normalized.startsWith(\"has\")\n );\n}\n\nfunction isWriteLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"post\" ||\n normalized === \"put\" ||\n normalized === \"patch\" ||\n normalized === \"delete\" ||\n normalized.startsWith(\"write\") ||\n normalized.startsWith(\"set\") ||\n normalized.startsWith(\"save\") ||\n normalized.startsWith(\"create\") ||\n normalized.startsWith(\"update\") ||\n normalized.startsWith(\"delete\") ||\n normalized.startsWith(\"remove\") ||\n normalized.startsWith(\"insert\")\n );\n}\n\nfunction matchesFixtureValue(expected: unknown, actual: unknown): boolean {\n if (typeof expected === \"string\" && typeof actual === \"string\" && expected.endsWith(\"%\")) {\n return actual.startsWith(expected.slice(0, -1));\n }\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || expected.length !== actual.length) {\n return false;\n }\n\n return expected.every((item, index) => matchesFixtureValue(item, actual[index]));\n }\n\n if (isPlainObject(expected)) {\n if (!isPlainObject(actual)) {\n return false;\n }\n\n return Object.entries(expected).every(([key, value]) => matchesFixtureValue(value, actual[key]));\n }\n\n return Object.is(expected, actual);\n}\n\nfunction getFetchUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") {\n return input;\n }\n\n if (input instanceof URL) {\n return input.toString();\n }\n\n return input.url;\n}\n\nfunction createFixtureResponse(response: FixtureFetchResponse): Response {\n const status = response.status ?? 200;\n const headers = new Headers(response.headers);\n\n if (response.body === undefined) {\n return new Response(null, {\n status,\n headers,\n });\n }\n\n if (typeof response.body === \"string\") {\n return new Response(response.body, {\n status,\n headers,\n });\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return new Response(JSON.stringify(response.body), {\n status,\n headers,\n });\n}\n\nfunction createFixtureFetch(entries: FixtureFetchEntry[] | undefined): typeof globalThis.fetch {\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = normalizeHttpMethod(init?.method ?? (input instanceof Request ? input.method : undefined));\n const url = getFetchUrl(input);\n const match = entries?.find((entry) => {\n const requestMethod = normalizeHttpMethod(entry.request.method);\n return requestMethod === method && entry.request.url === url;\n });\n\n if (match !== undefined) {\n return createFixtureResponse(match.response);\n }\n\n if (isReadLikeMethod(method)) {\n return null as unknown as Response;\n }\n\n return new Response(null, {\n status: 204,\n });\n };\n}\n\nfunction createFixtureFs(definition: unknown): HandlerFs {\n const fsDefinition = isPlainObject(definition) ? definition : {};\n const readFileEntries = isPlainObject(fsDefinition.readFile) ? fsDefinition.readFile : {};\n const existsEntries = isPlainObject(fsDefinition.exists) ? fsDefinition.exists : {};\n\n return {\n readFile: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(readFileEntries, filePath)) {\n return String(readFileEntries[filePath]);\n }\n\n return null as unknown as string;\n },\n writeFile: async () => undefined,\n exists: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(existsEntries, filePath)) {\n return Boolean(existsEntries[filePath]);\n }\n\n return Object.prototype.hasOwnProperty.call(readFileEntries, filePath);\n },\n };\n}\n\nfunction resolveFixtureMethodResult(\n methodName: string,\n definition: unknown,\n args: unknown[]\n): Promise<unknown> {\n if (Array.isArray(definition)) {\n for (const entry of definition) {\n if (!isPlainObject(entry)) {\n continue;\n }\n\n const explicitMatcher = isPlainObject(entry.request) ? entry.request : undefined;\n const matcher =\n explicitMatcher ??\n Object.fromEntries(\n Object.entries(entry).filter(([key]) => key !== \"result\" && key !== \"response\" && key !== \"error\")\n );\n\n const firstArg = args[0];\n let matched = false;\n\n if (Array.isArray(matcher.args)) {\n matched = matchesFixtureValue(matcher.args, args);\n } else if (Object.keys(matcher).length === 0) {\n matched = true;\n } else if (isPlainObject(firstArg)) {\n matched = matchesFixtureValue(matcher, firstArg);\n } else if (args.length === 1 && Object.keys(matcher).length === 1) {\n const [[, expectedValue]] = Object.entries(matcher);\n matched = matchesFixtureValue(expectedValue, firstArg);\n }\n\n if (!matched) {\n continue;\n }\n\n if (entry.error !== undefined) {\n throw new Error(String(entry.error));\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"result\")) {\n return Promise.resolve(entry.result);\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"response\")) {\n return Promise.resolve(entry.response);\n }\n\n return Promise.resolve(null);\n }\n }\n\n if (isPlainObject(definition)) {\n const firstArg = args[0];\n\n if (typeof firstArg === \"string\" && Object.prototype.hasOwnProperty.call(definition, firstArg)) {\n return Promise.resolve(definition[firstArg]);\n }\n }\n\n if (isWriteLikeMethod(methodName)) {\n return Promise.resolve(undefined);\n }\n\n return Promise.resolve(null);\n}\n\nfunction createFixtureService(definition: unknown): Record<string, unknown> {\n const methods = isPlainObject(definition) ? definition : {};\n\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === \"then\") {\n return undefined;\n }\n\n const methodName = String(property);\n return async (...args: unknown[]) => resolveFixtureMethodResult(methodName, methods[methodName], args);\n },\n }\n );\n}\n\nfunction resolveFixturePath(commandPath: string): string {\n const parsed = path.parse(commandPath);\n return path.join(parsed.dir, `${parsed.name}.fixture.json`);\n}\n\nfunction selectFixtureScenario(scenarios: FixtureScenario[], selector: string): FixtureScenario {\n if (isNumericFixtureSelector(selector)) {\n const index = Number(selector) - 1;\n const scenario = scenarios[index];\n\n if (scenario === undefined) {\n throw new UserError(\n `Fixture scenario index ${selector} is out of range. Available scenarios: ${scenarios.length}.`\n );\n }\n\n return scenario;\n }\n\n const scenario = scenarios.find((entry) => entry.name === selector);\n\n if (scenario === undefined) {\n throw new UserError(`Fixture scenario \"${selector}\" was not found.`);\n }\n\n return scenario;\n}\n\nasync function loadFixtureScenario(command: Command<any, any, any, any>, selector: string): Promise<FixtureScenario> {\n const commandPath = getCommandSourcePath(command);\n\n if (commandPath === undefined) {\n throw new UserError(`Fixture mode could not determine the source file for command \"${command.name}\".`);\n }\n\n const fixturePath = resolveFixturePath(commandPath);\n let rawFixture: string;\n\n try {\n rawFixture = await readFile(fixturePath, {\n encoding: \"utf8\",\n });\n } catch {\n throw new UserError(\n `Fixture file not found for command \"${command.name}\". Expected ${fixturePath}.`\n );\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(rawFixture);\n } catch {\n throw new UserError(`Fixture file ${fixturePath} is not valid JSON.`);\n }\n\n if (!Array.isArray(parsed)) {\n throw new UserError(`Fixture file ${fixturePath} must contain a JSON array of scenarios.`);\n }\n\n return selectFixtureScenario(parsed as FixtureScenario[], selector);\n}\n\nfunction resolveFixtureSecrets(command: Command<any, any, any, any>): Record<string, string> {\n return Object.fromEntries(Object.keys(command.secrets).map((name) => [name, \"fixture-secret\"]));\n}\n\nfunction createFixtureEnvValues(command: Command<any, any, any, any>): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {\n ...process.env,\n POE_API_KEY: process.env.POE_API_KEY ?? \"fixture-secret\",\n };\n\n for (const secret of Object.values(command.secrets)) {\n values[secret.env] = values[secret.env] ?? \"fixture-secret\";\n }\n\n return values;\n}\n\nasync function resolveFixtureRuntime<TServices extends object>(\n command: Command<TServices, any, any, any>,\n services: TServices,\n requirementOptions: CommandRequirementOptions\n): Promise<ResolvedFixtureRuntime<TServices>> {\n const selector = process.env.CMDKIT_FIXTURE;\n\n if (selector === undefined || selector.length === 0) {\n return {\n env: createEnv(),\n fetch: globalThis.fetch,\n fs: createFs(),\n isFixture: false,\n requirementOptions,\n secrets: resolveCommandSecrets(command),\n services,\n };\n }\n\n const scenario = await loadFixtureScenario(command, selector);\n const scenarioServices = isPlainObject(scenario.services) ? scenario.services : {};\n const customServiceNames = new Set([\n ...Object.keys(services as Record<string, unknown>),\n ...Object.keys(scenarioServices).filter((name) => !RESERVED_SERVICE_NAMES.has(name)),\n ]);\n const fixtureServices = Object.fromEntries(\n [...customServiceNames].map((name) => [name, createFixtureService(scenarioServices[name])])\n ) as TServices;\n const fixtureEnvValues = createFixtureEnvValues(command);\n\n return {\n env: createEnv(fixtureEnvValues),\n fetch: createFixtureFetch(scenarioServices.fetch as FixtureFetchEntry[] | undefined),\n fs: createFixtureFs(scenarioServices.fs),\n isFixture: true,\n requirementOptions: {\n ...requirementOptions,\n env: fixtureEnvValues,\n },\n secrets: resolveFixtureSecrets(command),\n services: fixtureServices,\n };\n}\n\nfunction writeRichHeader(title: string): void {\n const padding = Math.max(12, 34 - title.length);\n process.stdout.write(`\u2500\u2500 ${title} ${\"\u2500\".repeat(padding)}\\n`);\n}\n\nfunction validateServices(services: Record<string, unknown>): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(`Service name \"${name}\" is reserved. Choose a different name.`);\n }\n }\n}\n\nasync function resolveParams(\n fields: FieldDefinition[],\n positionalValues: unknown[],\n optionValues: Record<string, unknown>,\n presetPath: string | undefined,\n shouldPrompt: boolean\n): Promise<Record<string, unknown>> {\n const params: Record<string, unknown> = {};\n const presetValues =\n typeof presetPath === \"string\" && presetPath.length > 0\n ? await loadPresetValues(fields, presetPath)\n : {};\n\n for (const field of fields) {\n let value: unknown;\n\n if (field.positionalIndex !== undefined) {\n const positionalValue = positionalValues[field.positionalIndex];\n\n if (field.schema.kind === \"array\") {\n if (Array.isArray(positionalValue) && positionalValue.length > 0) {\n const itemSchema = unwrapOptional(field.schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${field.displayPath}\" must use scalar items.`);\n }\n\n value = positionalValue.map((item) =>\n parseScalarValue(String(item), itemSchema as ScalarSchema, field.displayPath)\n );\n }\n } else if (typeof positionalValue === \"string\" && positionalValue.length > 0) {\n value = parseScalarValue(positionalValue, field.schema as ScalarSchema, field.displayPath);\n }\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(optionValues, field.commanderOptionAttribute) &&\n hasFieldValue(optionValues[field.commanderOptionAttribute])\n ) {\n value = optionValues[field.commanderOptionAttribute];\n }\n\n if (\n value === undefined &&\n field.commanderOptionAttribute === field.optionAttribute &&\n Object.prototype.hasOwnProperty.call(optionValues, field.optionAttribute) &&\n hasFieldValue(optionValues[field.optionAttribute])\n ) {\n value = optionValues[field.optionAttribute];\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(presetValues, field.optionAttribute)\n ) {\n value = presetValues[field.optionAttribute];\n }\n\n if (value === undefined && shouldPrompt && !field.optional) {\n value = await promptForField(field);\n }\n\n if (value === undefined && field.hasDefault) {\n value = field.defaultValue;\n }\n\n if (value === undefined) {\n if (field.optional) {\n continue;\n }\n\n throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\n }\n\n setNestedValue(params, field.path, value);\n }\n\n return params;\n}\n\nfunction getResolvedFlags(command: CommanderCommand): ResolvedFlags {\n const flags = command.optsWithGlobals() as ResolvedFlags;\n return flags;\n}\n\nasync function executeCommand<TServices extends object>(\n state: ExecutionState<TServices>,\n services: TServices,\n requirementOptions: CommandRequirementOptions\n): Promise<void> {\n const logger = createLogger();\n const primitives = {\n logger,\n renderTable,\n getTheme,\n note,\n };\n const optionValues = state.actionCommand.optsWithGlobals() as Record<string, unknown>;\n const resolvedFlags = optionValues as ResolvedFlags;\n const output = resolveOutput(resolvedFlags);\n const shouldPrompt = !resolvedFlags.yes && Boolean(process.stdin.isTTY);\n const runtime = await resolveFixtureRuntime(state.command, services, requirementOptions);\n const preflightContext = {\n ...runtime.services,\n secrets: runtime.secrets,\n fetch: runtime.fetch,\n fs: runtime.fs,\n env: runtime.env,\n progress(message: string): void {\n logger.info(message);\n },\n };\n\n await withOutputFormat(output, async () => {\n await assertCommandRequirements(state.command, preflightContext, runtime.requirementOptions);\n\n const params = await resolveParams(\n state.fields,\n state.positionalValues,\n optionValues,\n resolvedFlags.preset,\n shouldPrompt\n );\n\n const context = {\n ...preflightContext,\n params,\n } as HandlerContext<any, any, TServices>;\n\n if (state.command.confirm && !resolvedFlags.yes && process.stdin.isTTY) {\n for (const field of state.fields) {\n const value = field.path.reduce<unknown>(\n (current, segment) =>\n current && typeof current === \"object\"\n ? (current as Record<string, unknown>)[segment]\n : undefined,\n params\n );\n\n if (value !== undefined) {\n logger.resolved(field.displayPath, formatResolvedValue(value));\n }\n }\n\n const proceed = await confirm({\n message: \"Proceed?\",\n initialValue: true,\n });\n\n if (isCancel(proceed)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (proceed !== true) {\n throw new UserError(\"Operation cancelled.\");\n }\n }\n\n const result = await state.command.handler(context);\n\n if (output === \"rich\" && runtime.isFixture) {\n writeRichHeader(`${state.command.name} (fixture)`);\n }\n\n renderResult(state.command, result, output, primitives);\n });\n}\n\nfunction handleRunError(error: unknown, verbose: boolean): void {\n const logger = createLogger();\n\n if (error instanceof UserError) {\n logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof CommanderError) {\n process.exitCode = error.exitCode;\n if (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\") {\n return;\n }\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error(verbose ? message : `${message} Use --verbose for a stack trace.`);\n\n if (verbose && error instanceof Error && error.stack) {\n process.stderr.write(`${error.stack}\\n`);\n }\n\n process.exitCode = 1;\n}\n\nexport async function runCLI<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunCLIOptions<TServices> = {}\n): Promise<void> {\n const root = normalizeRoots(roots, process.argv);\n const casing = options.casing ?? \"kebab\";\n const services = (options.services ?? {}) as TServices;\n const requirementOptions = {\n apiVersion: options.apiVersion,\n } satisfies CommandRequirementOptions;\n\n validateServices(services as Record<string, unknown>);\n\n if (hasHelpFlag(process.argv)) {\n await renderGeneratedHelp(root, process.argv, options);\n return;\n }\n\n const program = new CommanderCommand();\n program.name(root.name);\n program.exitOverride();\n program.showHelpAfterError();\n program.addHelpCommand(false);\n addGlobalOptions(program);\n\n if (options.version !== undefined) {\n program.version(options.version, \"--version\");\n }\n\n const execute = async (state: ExecutionState<TServices>) => {\n try {\n await executeCommand(state, services, requirementOptions);\n } catch (error) {\n handleRunError(error, Boolean(getResolvedFlags(state.actionCommand).verbose));\n }\n };\n\n for (const child of root.children) {\n const command = createNodeCommand(child, casing, execute);\n if (command === null) {\n continue;\n }\n\n const isDefaultChild =\n root.default !== undefined &&\n root.default.scope.includes(\"cli\") &&\n (command.name() === root.default.name || command.aliases().includes(root.default.name));\n\n program.addCommand(command, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n handleRunError(error, process.argv.includes(\"--verbose\"));\n }\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "export const widths = {\n header: 60,\n helpColumn: 24,\n maxLine: 80\n} as const;\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().intro(content);\n },\n heading(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return getTheme().header(content);\n },\n section(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return typography.bold(content);\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().accent(content);\n },\n argument(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `<${content}>`;\n return getTheme().muted(content);\n },\n option(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().muted(content);\n },\n usageCommand(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}](${content})`;\n return getTheme().accent(content);\n },\n muted(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `*${content}*`;\n return getTheme().muted(content);\n },\n badge(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}]`;\n return getTheme().badge(content);\n },\n selectLabel(label: string, detail?: string): string {\n if (!detail) {\n return label;\n }\n const format = resolveOutputFormat();\n if (format !== \"terminal\") {\n return `${label} \u2014 ${detail}`;\n }\n return `${label} ${typography.dim(\"\u2014\")} ${typography.dim(detail)}`;\n }\n} as const;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "import chalk from \"chalk\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import chalk from \"chalk\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = chalk.gray(\"\u2502\"),\n secondarySymbol = chalk.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { text } from \"./text.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface CommandInfo {\n name: string;\n description: string;\n}\n\nexport interface OptionInfo {\n flags: string;\n description: string;\n}\n\nexport function formatCommand(name: string, description: string): string {\n const paddedName = name.padEnd(widths.helpColumn);\n return ` ${text.command(paddedName)} ${description}`;\n}\n\nexport function formatUsage(command: string, args?: string): string {\n const argsStr = args ? ` ${text.argument(args)}` : \"\";\n return `${text.usageCommand(command)}${argsStr}`;\n}\n\nexport function formatOption(flags: string, description: string): string {\n const paddedFlags = flags.padEnd(widths.helpColumn);\n return ` ${text.option(paddedFlags)} ${description}`;\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return commands.map((cmd) => formatCommand(cmd.name, cmd.description)).join(\"\\n\");\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return options.map((opt) => formatOption(opt.flags, opt.description)).join(\"\\n\");\n}\n\nexport const helpFormatter = {\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList\n} as const;\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { renderMarkdown } from \"../terminal-markdown/index.js\";\nimport { getAcpWriter } from \"./writer.js\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n getAcpWriter()(line);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nfunction formatCost(costUsd: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(costUsd);\n}\n\nexport function renderAgentMessage(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **agent:** ${text}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"agent_message\", text }));\n return;\n }\n\n const rendered = renderMarkdown(text).trimEnd();\n writeLine(`${AGENT_PREFIX}${rendered}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2192 ${kind}: ${title}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_start\", kind, title }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2713 ${kind}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_complete\", kind }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *thinking:* ${truncate(text, 80)}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"reasoning\", text }));\n return;\n }\n\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const format = resolveOutputFormat();\n const cached =\n typeof tokens.cached === \"number\" && tokens.cached > 0 ? ` (${tokens.cached} cached)` : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n cost = ` (${formatCost(tokens.costUsd)})`;\n }\n\n if (format === \"markdown\") {\n writeLine(`- **tokens:** ${tokens.input} in \u2192 ${tokens.output} out${cost}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(\n JSON.stringify({\n event: \"usage\",\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n cachedTokens: tokens.cached ?? 0,\n costUsd: tokens.costUsd ?? 0\n })\n );\n return;\n }\n\n writeLine(\"\");\n writeLine(chalk.green(`\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`));\n}\n\nexport function renderError(message: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **error:** ${message}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"error\", message }));\n return;\n }\n\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import chalk from \"chalk\";\nimport type { Cell, CellStyle, Rect } from \"./types.js\";\n\nconst EMPTY_CELL: Cell = { ch: \" \", style: {} };\n\nexport class ScreenBuffer {\n private _width: number;\n private _height: number;\n private _cells: Cell[];\n\n constructor(width: number, height: number) {\n this._width = normalizeSize(width);\n this._height = normalizeSize(height);\n this._cells = createCells(this._width, this._height);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n put(x: number, y: number, text: string, style?: CellStyle): void {\n if (!this.isInBoundsY(y) || text.length === 0) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n let offset = 0;\n\n for (const ch of text) {\n const targetX = x + offset;\n offset += 1;\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n get(x: number, y: number): Cell {\n if (!this.isInBounds(x, y)) {\n return cloneCell(EMPTY_CELL);\n }\n\n return cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n\n clear(style?: CellStyle): void {\n this._cells = createCells(this._width, this._height, style);\n }\n\n clearRect(rect: Rect, style?: CellStyle): void {\n const startX = Math.max(0, rect.x);\n const startY = Math.max(0, rect.y);\n const endX = Math.min(this._width, rect.x + Math.max(0, rect.width));\n const endY = Math.min(this._height, rect.y + Math.max(0, rect.height));\n const normalizedStyle = normalizeStyle(style);\n\n for (let y = startY; y < endY; y += 1) {\n for (let x = startX; x < endX; x += 1) {\n this._cells[this.index(x, y)] = { ch: \" \", style: normalizedStyle };\n }\n }\n }\n\n resize(width: number, height: number): void {\n const nextWidth = normalizeSize(width);\n const nextHeight = normalizeSize(height);\n const nextCells = createCells(nextWidth, nextHeight);\n const copyWidth = Math.min(this._width, nextWidth);\n const copyHeight = Math.min(this._height, nextHeight);\n\n for (let y = 0; y < copyHeight; y += 1) {\n for (let x = 0; x < copyWidth; x += 1) {\n nextCells[(y * nextWidth) + x] = cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n }\n\n this._width = nextWidth;\n this._height = nextHeight;\n this._cells = nextCells;\n }\n\n putInRect(rect: Rect, row: number, text: string, style?: CellStyle): void {\n if (row < 0 || row >= rect.height || text.length === 0 || rect.width <= 0) {\n return;\n }\n\n const y = rect.y + row;\n if (!this.isInBoundsY(y)) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n const rectEndX = rect.x + rect.width;\n let offset = 0;\n\n for (const ch of text) {\n const targetX = rect.x + offset;\n offset += 1;\n\n if (targetX >= rectEndX) {\n break;\n }\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n private index(x: number, y: number): number {\n return (y * this._width) + x;\n }\n\n private isInBounds(x: number, y: number): boolean {\n return this.isInBoundsX(x) && this.isInBoundsY(y);\n }\n\n private isInBoundsX(x: number): boolean {\n return x >= 0 && x < this._width;\n }\n\n private isInBoundsY(y: number): boolean {\n return y >= 0 && y < this._height;\n }\n}\n\nexport function diff(\n prev: ScreenBuffer,\n next: ScreenBuffer\n): Array<{ x: number; y: number; cell: Cell }> {\n const changes: Array<{ x: number; y: number; cell: Cell }> = [];\n const width = Math.max(prev.width, next.width);\n const height = Math.max(prev.height, next.height);\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const previousCell = prev.get(x, y);\n const nextCell = next.get(x, y);\n\n if (!cellsEqual(previousCell, nextCell)) {\n changes.push({ x, y, cell: nextCell });\n }\n }\n }\n\n return changes;\n}\n\nexport function cellToAnsi(cell: Cell): string {\n const style = cell.style ?? {};\n let painter = chalk;\n\n if (style.bold) {\n painter = painter.bold;\n }\n\n if (style.dim) {\n painter = painter.dim;\n }\n\n if (style.fg) {\n painter = applyForegroundColor(painter, style.fg);\n }\n\n if (style.bg) {\n painter = applyBackgroundColor(painter, style.bg);\n }\n\n return painter(cell.ch);\n}\n\nfunction createCells(width: number, height: number, style?: CellStyle): Cell[] {\n const normalizedStyle = normalizeStyle(style);\n return Array.from({ length: width * height }, () => ({ ch: \" \", style: normalizedStyle }));\n}\n\nfunction cloneCell(cell: Cell): Cell {\n return {\n ch: cell.ch,\n style: normalizeStyle(cell.style)\n };\n}\n\nfunction normalizeStyle(style?: CellStyle): CellStyle {\n const next: CellStyle = {};\n\n if (style?.fg !== undefined) {\n next.fg = style.fg;\n }\n\n if (style?.bg !== undefined) {\n next.bg = style.bg;\n }\n\n if (style?.bold !== undefined) {\n next.bold = style.bold;\n }\n\n if (style?.dim !== undefined) {\n next.dim = style.dim;\n }\n\n return next;\n}\n\nfunction normalizeSize(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction cellsEqual(left: Cell, right: Cell): boolean {\n return left.ch === right.ch\n && left.style.fg === right.style.fg\n && left.style.bg === right.style.bg\n && left.style.bold === right.style.bold\n && left.style.dim === right.style.dim;\n}\n\nfunction applyForegroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.hex(color);\n }\n\n const painter = (instance as unknown as Record<string, unknown>)[color];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n\nfunction applyBackgroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.bgHex(color);\n }\n\n const methodName = color.startsWith(\"bg\")\n ? color\n : `bg${color.charAt(0).toUpperCase()}${color.slice(1)}`;\n const painter = (instance as unknown as Record<string, unknown>)[methodName];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import chalk from \"chalk\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nexport { isCancel } from \"@clack/core\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2514\")} ${chalk.red(msg)}\\n\\n`);\n}\n", "/* MAIN */\n//URL: https://github.com/sindresorhus/get-east-asian-width/blob/main/lookup.js\n//LICENSE: https://github.com/sindresorhus/get-east-asian-width/blob/main/license\n//TODO: Replace these with some unicode property classes, if the ones we need exist\nconst isAmbiguous = (x) => {\n return x === 0xA1 || x === 0xA4 || x === 0xA7 || x === 0xA8 || x === 0xAA || x === 0xAD || x === 0xAE || x >= 0xB0 && x <= 0xB4 || x >= 0xB6 && x <= 0xBA || x >= 0xBC && x <= 0xBF || x === 0xC6 || x === 0xD0 || x === 0xD7 || x === 0xD8 || x >= 0xDE && x <= 0xE1 || x === 0xE6 || x >= 0xE8 && x <= 0xEA || x === 0xEC || x === 0xED || x === 0xF0 || x === 0xF2 || x === 0xF3 || x >= 0xF7 && x <= 0xFA || x === 0xFC || x === 0xFE || x === 0x101 || x === 0x111 || x === 0x113 || x === 0x11B || x === 0x126 || x === 0x127 || x === 0x12B || x >= 0x131 && x <= 0x133 || x === 0x138 || x >= 0x13F && x <= 0x142 || x === 0x144 || x >= 0x148 && x <= 0x14B || x === 0x14D || x === 0x152 || x === 0x153 || x === 0x166 || x === 0x167 || x === 0x16B || x === 0x1CE || x === 0x1D0 || x === 0x1D2 || x === 0x1D4 || x === 0x1D6 || x === 0x1D8 || x === 0x1DA || x === 0x1DC || x === 0x251 || x === 0x261 || x === 0x2C4 || x === 0x2C7 || x >= 0x2C9 && x <= 0x2CB || x === 0x2CD || x === 0x2D0 || x >= 0x2D8 && x <= 0x2DB || x === 0x2DD || x === 0x2DF || x >= 0x300 && x <= 0x36F || x >= 0x391 && x <= 0x3A1 || x >= 0x3A3 && x <= 0x3A9 || x >= 0x3B1 && x <= 0x3C1 || x >= 0x3C3 && x <= 0x3C9 || x === 0x401 || x >= 0x410 && x <= 0x44F || x === 0x451 || x === 0x2010 || x >= 0x2013 && x <= 0x2016 || x === 0x2018 || x === 0x2019 || x === 0x201C || x === 0x201D || x >= 0x2020 && x <= 0x2022 || x >= 0x2024 && x <= 0x2027 || x === 0x2030 || x === 0x2032 || x === 0x2033 || x === 0x2035 || x === 0x203B || x === 0x203E || x === 0x2074 || x === 0x207F || x >= 0x2081 && x <= 0x2084 || x === 0x20AC || x === 0x2103 || x === 0x2105 || x === 0x2109 || x === 0x2113 || x === 0x2116 || x === 0x2121 || x === 0x2122 || x === 0x2126 || x === 0x212B || x === 0x2153 || x === 0x2154 || x >= 0x215B && x <= 0x215E || x >= 0x2160 && x <= 0x216B || x >= 0x2170 && x <= 0x2179 || x === 0x2189 || x >= 0x2190 && x <= 0x2199 || x === 0x21B8 || x === 0x21B9 || x === 0x21D2 || x === 0x21D4 || x === 0x21E7 || x === 0x2200 || x === 0x2202 || x === 0x2203 || x === 0x2207 || x === 0x2208 || x === 0x220B || x === 0x220F || x === 0x2211 || x === 0x2215 || x === 0x221A || x >= 0x221D && x <= 0x2220 || x === 0x2223 || x === 0x2225 || x >= 0x2227 && x <= 0x222C || x === 0x222E || x >= 0x2234 && x <= 0x2237 || x === 0x223C || x === 0x223D || x === 0x2248 || x === 0x224C || x === 0x2252 || x === 0x2260 || x === 0x2261 || x >= 0x2264 && x <= 0x2267 || x === 0x226A || x === 0x226B || x === 0x226E || x === 0x226F || x === 0x2282 || x === 0x2283 || x === 0x2286 || x === 0x2287 || x === 0x2295 || x === 0x2299 || x === 0x22A5 || x === 0x22BF || x === 0x2312 || x >= 0x2460 && x <= 0x24E9 || x >= 0x24EB && x <= 0x254B || x >= 0x2550 && x <= 0x2573 || x >= 0x2580 && x <= 0x258F || x >= 0x2592 && x <= 0x2595 || x === 0x25A0 || x === 0x25A1 || x >= 0x25A3 && x <= 0x25A9 || x === 0x25B2 || x === 0x25B3 || x === 0x25B6 || x === 0x25B7 || x === 0x25BC || x === 0x25BD || x === 0x25C0 || x === 0x25C1 || x >= 0x25C6 && x <= 0x25C8 || x === 0x25CB || x >= 0x25CE && x <= 0x25D1 || x >= 0x25E2 && x <= 0x25E5 || x === 0x25EF || x === 0x2605 || x === 0x2606 || x === 0x2609 || x === 0x260E || x === 0x260F || x === 0x261C || x === 0x261E || x === 0x2640 || x === 0x2642 || x === 0x2660 || x === 0x2661 || x >= 0x2663 && x <= 0x2665 || x >= 0x2667 && x <= 0x266A || x === 0x266C || x === 0x266D || x === 0x266F || x === 0x269E || x === 0x269F || x === 0x26BF || x >= 0x26C6 && x <= 0x26CD || x >= 0x26CF && x <= 0x26D3 || x >= 0x26D5 && x <= 0x26E1 || x === 0x26E3 || x === 0x26E8 || x === 0x26E9 || x >= 0x26EB && x <= 0x26F1 || x === 0x26F4 || x >= 0x26F6 && x <= 0x26F9 || x === 0x26FB || x === 0x26FC || x === 0x26FE || x === 0x26FF || x === 0x273D || x >= 0x2776 && x <= 0x277F || x >= 0x2B56 && x <= 0x2B59 || x >= 0x3248 && x <= 0x324F || x >= 0xE000 && x <= 0xF8FF || x >= 0xFE00 && x <= 0xFE0F || x === 0xFFFD || x >= 0x1F100 && x <= 0x1F10A || x >= 0x1F110 && x <= 0x1F12D || x >= 0x1F130 && x <= 0x1F169 || x >= 0x1F170 && x <= 0x1F18D || x === 0x1F18F || x === 0x1F190 || x >= 0x1F19B && x <= 0x1F1AC || x >= 0xE0100 && x <= 0xE01EF || x >= 0xF0000 && x <= 0xFFFFD || x >= 0x100000 && x <= 0x10FFFD;\n};\nconst isFullWidth = (x) => {\n return x === 0x3000 || x >= 0xFF01 && x <= 0xFF60 || x >= 0xFFE0 && x <= 0xFFE6;\n};\nconst isWide = (x) => {\n return x >= 0x1100 && x <= 0x115F || x === 0x231A || x === 0x231B || x === 0x2329 || x === 0x232A || x >= 0x23E9 && x <= 0x23EC || x === 0x23F0 || x === 0x23F3 || x === 0x25FD || x === 0x25FE || x === 0x2614 || x === 0x2615 || x >= 0x2648 && x <= 0x2653 || x === 0x267F || x === 0x2693 || x === 0x26A1 || x === 0x26AA || x === 0x26AB || x === 0x26BD || x === 0x26BE || x === 0x26C4 || x === 0x26C5 || x === 0x26CE || x === 0x26D4 || x === 0x26EA || x === 0x26F2 || x === 0x26F3 || x === 0x26F5 || x === 0x26FA || x === 0x26FD || x === 0x2705 || x === 0x270A || x === 0x270B || x === 0x2728 || x === 0x274C || x === 0x274E || x >= 0x2753 && x <= 0x2755 || x === 0x2757 || x >= 0x2795 && x <= 0x2797 || x === 0x27B0 || x === 0x27BF || x === 0x2B1B || x === 0x2B1C || x === 0x2B50 || x === 0x2B55 || x >= 0x2E80 && x <= 0x2E99 || x >= 0x2E9B && x <= 0x2EF3 || x >= 0x2F00 && x <= 0x2FD5 || x >= 0x2FF0 && x <= 0x2FFF || x >= 0x3001 && x <= 0x303E || x >= 0x3041 && x <= 0x3096 || x >= 0x3099 && x <= 0x30FF || x >= 0x3105 && x <= 0x312F || x >= 0x3131 && x <= 0x318E || x >= 0x3190 && x <= 0x31E3 || x >= 0x31EF && x <= 0x321E || x >= 0x3220 && x <= 0x3247 || x >= 0x3250 && x <= 0x4DBF || x >= 0x4E00 && x <= 0xA48C || x >= 0xA490 && x <= 0xA4C6 || x >= 0xA960 && x <= 0xA97C || x >= 0xAC00 && x <= 0xD7A3 || x >= 0xF900 && x <= 0xFAFF || x >= 0xFE10 && x <= 0xFE19 || x >= 0xFE30 && x <= 0xFE52 || x >= 0xFE54 && x <= 0xFE66 || x >= 0xFE68 && x <= 0xFE6B || x >= 0x16FE0 && x <= 0x16FE4 || x === 0x16FF0 || x === 0x16FF1 || x >= 0x17000 && x <= 0x187F7 || x >= 0x18800 && x <= 0x18CD5 || x >= 0x18D00 && x <= 0x18D08 || x >= 0x1AFF0 && x <= 0x1AFF3 || x >= 0x1AFF5 && x <= 0x1AFFB || x === 0x1AFFD || x === 0x1AFFE || x >= 0x1B000 && x <= 0x1B122 || x === 0x1B132 || x >= 0x1B150 && x <= 0x1B152 || x === 0x1B155 || x >= 0x1B164 && x <= 0x1B167 || x >= 0x1B170 && x <= 0x1B2FB || x === 0x1F004 || x === 0x1F0CF || x === 0x1F18E || x >= 0x1F191 && x <= 0x1F19A || x >= 0x1F200 && x <= 0x1F202 || x >= 0x1F210 && x <= 0x1F23B || x >= 0x1F240 && x <= 0x1F248 || x === 0x1F250 || x === 0x1F251 || x >= 0x1F260 && x <= 0x1F265 || x >= 0x1F300 && x <= 0x1F320 || x >= 0x1F32D && x <= 0x1F335 || x >= 0x1F337 && x <= 0x1F37C || x >= 0x1F37E && x <= 0x1F393 || x >= 0x1F3A0 && x <= 0x1F3CA || x >= 0x1F3CF && x <= 0x1F3D3 || x >= 0x1F3E0 && x <= 0x1F3F0 || x === 0x1F3F4 || x >= 0x1F3F8 && x <= 0x1F43E || x === 0x1F440 || x >= 0x1F442 && x <= 0x1F4FC || x >= 0x1F4FF && x <= 0x1F53D || x >= 0x1F54B && x <= 0x1F54E || x >= 0x1F550 && x <= 0x1F567 || x === 0x1F57A || x === 0x1F595 || x === 0x1F596 || x === 0x1F5A4 || x >= 0x1F5FB && x <= 0x1F64F || x >= 0x1F680 && x <= 0x1F6C5 || x === 0x1F6CC || x >= 0x1F6D0 && x <= 0x1F6D2 || x >= 0x1F6D5 && x <= 0x1F6D7 || x >= 0x1F6DC && x <= 0x1F6DF || x === 0x1F6EB || x === 0x1F6EC || x >= 0x1F6F4 && x <= 0x1F6FC || x >= 0x1F7E0 && x <= 0x1F7EB || x === 0x1F7F0 || x >= 0x1F90C && x <= 0x1F93A || x >= 0x1F93C && x <= 0x1F945 || x >= 0x1F947 && x <= 0x1F9FF || x >= 0x1FA70 && x <= 0x1FA7C || x >= 0x1FA80 && x <= 0x1FA88 || x >= 0x1FA90 && x <= 0x1FABD || x >= 0x1FABF && x <= 0x1FAC5 || x >= 0x1FACE && x <= 0x1FADB || x >= 0x1FAE0 && x <= 0x1FAE8 || x >= 0x1FAF0 && x <= 0x1FAF8 || x >= 0x20000 && x <= 0x2FFFD || x >= 0x30000 && x <= 0x3FFFD;\n};\n/* EXPORT */\nexport { isAmbiguous, isFullWidth, isWide };\n", "/* IMPORT */\nimport { isAmbiguous, isFullWidth, isWide } from './utils.js';\n/* HELPERS */\nconst ANSI_RE = /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y;\nconst CONTROL_RE = /[\\x00-\\x08\\x0A-\\x1F\\x7F-\\x9F]{1,1000}/y;\nconst TAB_RE = /\\t{1,1000}/y;\nconst EMOJI_RE = /[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*/yu;\nconst LATIN_RE = /(?:[\\x20-\\x7E\\xA0-\\xFF](?!\\uFE0F)){1,1000}/y;\nconst MODIFIER_RE = /\\p{M}+/gu;\nconst NO_TRUNCATION = { limit: Infinity, ellipsis: '' };\n/* MAIN */\n//TODO: Optimize matching non-latin letters\nconst getStringTruncatedWidth = (input, truncationOptions = {}, widthOptions = {}) => {\n /* CONSTANTS */\n const LIMIT = truncationOptions.limit ?? Infinity;\n const ELLIPSIS = truncationOptions.ellipsis ?? '';\n const ELLIPSIS_WIDTH = truncationOptions?.ellipsisWidth ?? (ELLIPSIS ? getStringTruncatedWidth(ELLIPSIS, NO_TRUNCATION, widthOptions).width : 0);\n const ANSI_WIDTH = widthOptions.ansiWidth ?? 0;\n const CONTROL_WIDTH = widthOptions.controlWidth ?? 0;\n const TAB_WIDTH = widthOptions.tabWidth ?? 8;\n const AMBIGUOUS_WIDTH = widthOptions.ambiguousWidth ?? 1;\n const EMOJI_WIDTH = widthOptions.emojiWidth ?? 2;\n const FULL_WIDTH_WIDTH = widthOptions.fullWidthWidth ?? 2;\n const REGULAR_WIDTH = widthOptions.regularWidth ?? 1;\n const WIDE_WIDTH = widthOptions.wideWidth ?? 2;\n /* STATE */\n let indexPrev = 0;\n let index = 0;\n let length = input.length;\n let lengthExtra = 0;\n let truncationEnabled = false;\n let truncationIndex = length;\n let truncationLimit = Math.max(0, LIMIT - ELLIPSIS_WIDTH);\n let unmatchedStart = 0;\n let unmatchedEnd = 0;\n let width = 0;\n let widthExtra = 0;\n /* PARSE LOOP */\n outer: while (true) {\n /* UNMATCHED */\n if ((unmatchedEnd > unmatchedStart) || (index >= length && index > indexPrev)) {\n const unmatched = input.slice(unmatchedStart, unmatchedEnd) || input.slice(indexPrev, index);\n lengthExtra = 0;\n for (const char of unmatched.replaceAll(MODIFIER_RE, '')) {\n const codePoint = char.codePointAt(0) || 0;\n if (isFullWidth(codePoint)) {\n widthExtra = FULL_WIDTH_WIDTH;\n }\n else if (isWide(codePoint)) {\n widthExtra = WIDE_WIDTH;\n }\n else if (AMBIGUOUS_WIDTH !== REGULAR_WIDTH && isAmbiguous(codePoint)) {\n widthExtra = AMBIGUOUS_WIDTH;\n }\n else {\n widthExtra = REGULAR_WIDTH;\n }\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, Math.max(unmatchedStart, indexPrev) + lengthExtra);\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break outer;\n }\n lengthExtra += char.length;\n width += widthExtra;\n }\n unmatchedStart = unmatchedEnd = 0;\n }\n /* EXITING */\n if (index >= length)\n break;\n /* LATIN */\n LATIN_RE.lastIndex = index;\n if (LATIN_RE.test(input)) {\n lengthExtra = LATIN_RE.lastIndex - index;\n widthExtra = lengthExtra * REGULAR_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / REGULAR_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = LATIN_RE.lastIndex;\n continue;\n }\n /* ANSI */\n ANSI_RE.lastIndex = index;\n if (ANSI_RE.test(input)) {\n if ((width + ANSI_WIDTH) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index);\n }\n if ((width + ANSI_WIDTH) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += ANSI_WIDTH;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = ANSI_RE.lastIndex;\n continue;\n }\n /* CONTROL */\n CONTROL_RE.lastIndex = index;\n if (CONTROL_RE.test(input)) {\n lengthExtra = CONTROL_RE.lastIndex - index;\n widthExtra = lengthExtra * CONTROL_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / CONTROL_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = CONTROL_RE.lastIndex;\n continue;\n }\n /* TAB */\n TAB_RE.lastIndex = index;\n if (TAB_RE.test(input)) {\n lengthExtra = TAB_RE.lastIndex - index;\n widthExtra = lengthExtra * TAB_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / TAB_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = TAB_RE.lastIndex;\n continue;\n }\n /* EMOJI */\n EMOJI_RE.lastIndex = index;\n if (EMOJI_RE.test(input)) {\n if ((width + EMOJI_WIDTH) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index);\n }\n if ((width + EMOJI_WIDTH) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += EMOJI_WIDTH;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = EMOJI_RE.lastIndex;\n continue;\n }\n /* UNMATCHED INDEX */\n index += 1;\n }\n /* RETURN */\n return {\n width: truncationEnabled ? truncationLimit : width,\n index: truncationEnabled ? truncationIndex : length,\n truncated: truncationEnabled,\n ellipsed: truncationEnabled && LIMIT >= ELLIPSIS_WIDTH\n };\n};\n/* EXPORT */\nexport default getStringTruncatedWidth;\n", "/* IMPORT */\nimport fastStringTruncatedWidth from 'fast-string-truncated-width';\n/* HELPERS */\nconst NO_TRUNCATION = {\n limit: Infinity,\n ellipsis: '',\n ellipsisWidth: 0,\n};\n/* MAIN */\nconst fastStringWidth = (input, options = {}) => {\n return fastStringTruncatedWidth(input, NO_TRUNCATION, options).width;\n};\n/* EXPORT */\nexport default fastStringWidth;\n", "import stringWidth from 'fast-string-width';\nconst ESC = '\\x1B';\nconst CSI = '\\x9B';\nconst END_CODE = 39;\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;\nconst GROUP_REGEX = new RegExp(`(?:\\\\${ANSI_CSI}(?<code>\\\\d+)m|\\\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`, 'y');\nconst getClosingCode = (openingCode) => {\n if (openingCode >= 30 && openingCode <= 37)\n return 39;\n if (openingCode >= 90 && openingCode <= 97)\n return 39;\n if (openingCode >= 40 && openingCode <= 47)\n return 49;\n if (openingCode >= 100 && openingCode <= 107)\n return 49;\n if (openingCode === 1 || openingCode === 2)\n return 22;\n if (openingCode === 3)\n return 23;\n if (openingCode === 4)\n return 24;\n if (openingCode === 7)\n return 27;\n if (openingCode === 8)\n return 28;\n if (openingCode === 9)\n return 29;\n if (openingCode === 0)\n return 0;\n return undefined;\n};\nconst wrapAnsiCode = (code) => `${ESC}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = (url) => `${ESC}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;\nconst wordLengths = (words) => words.map((character) => stringWidth(character));\nconst wrapWord = (rows, word, columns) => {\n const characters = word[Symbol.iterator]();\n let isInsideEscape = false;\n let isInsideLinkEscape = false;\n let lastRow = rows.at(-1);\n let visible = lastRow === undefined ? 0 : stringWidth(lastRow);\n let currentCharacter = characters.next();\n let nextCharacter = characters.next();\n let rawCharacterIndex = 0;\n while (!currentCharacter.done) {\n const character = currentCharacter.value;\n const characterLength = stringWidth(character);\n if (visible + characterLength <= columns) {\n rows[rows.length - 1] += character;\n }\n else {\n rows.push(character);\n visible = 0;\n }\n if (character === ESC || character === CSI) {\n isInsideEscape = true;\n isInsideLinkEscape = word.startsWith(ANSI_ESCAPE_LINK, rawCharacterIndex + 1);\n }\n if (isInsideEscape) {\n if (isInsideLinkEscape) {\n if (character === ANSI_ESCAPE_BELL) {\n isInsideEscape = false;\n isInsideLinkEscape = false;\n }\n }\n else if (character === ANSI_SGR_TERMINATOR) {\n isInsideEscape = false;\n }\n }\n else {\n visible += characterLength;\n if (visible === columns && !nextCharacter.done) {\n rows.push('');\n visible = 0;\n }\n }\n currentCharacter = nextCharacter;\n nextCharacter = characters.next();\n rawCharacterIndex += character.length;\n }\n lastRow = rows.at(-1);\n if (!visible &&\n lastRow !== undefined &&\n lastRow.length > 0 &&\n rows.length > 1) {\n rows[rows.length - 2] += rows.pop();\n }\n};\nconst stringVisibleTrimSpacesRight = (string) => {\n const words = string.split(' ');\n let last = words.length;\n while (last > 0) {\n if (stringWidth(words[last - 1]) > 0) {\n break;\n }\n last--;\n }\n if (last === words.length) {\n return string;\n }\n return words.slice(0, last).join(' ') + words.slice(last).join('');\n};\nconst exec = (string, columns, options = {}) => {\n if (options.trim !== false && string.trim() === '') {\n return '';\n }\n let returnValue = '';\n let escapeCode;\n let escapeUrl;\n const words = string.split(' ');\n const lengths = wordLengths(words);\n let rows = [''];\n for (const [index, word] of words.entries()) {\n if (options.trim !== false) {\n rows[rows.length - 1] = (rows.at(-1) ?? '').trimStart();\n }\n let rowLength = stringWidth(rows.at(-1) ?? '');\n if (index !== 0) {\n if (rowLength >= columns &&\n (options.wordWrap === false || options.trim === false)) {\n rows.push('');\n rowLength = 0;\n }\n if (rowLength > 0 || options.trim === false) {\n rows[rows.length - 1] += ' ';\n rowLength++;\n }\n }\n if (options.hard && lengths[index] > columns) {\n const remainingColumns = columns - rowLength;\n const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);\n const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);\n if (breaksStartingNextLine < breaksStartingThisLine) {\n rows.push('');\n }\n wrapWord(rows, word, columns);\n continue;\n }\n if (rowLength + lengths[index] > columns &&\n rowLength > 0 &&\n lengths[index] > 0) {\n if (options.wordWrap === false && rowLength < columns) {\n wrapWord(rows, word, columns);\n continue;\n }\n rows.push('');\n }\n if (rowLength + lengths[index] > columns && options.wordWrap === false) {\n wrapWord(rows, word, columns);\n continue;\n }\n rows[rows.length - 1] += word;\n }\n if (options.trim !== false) {\n rows = rows.map((row) => stringVisibleTrimSpacesRight(row));\n }\n const preString = rows.join('\\n');\n const pre = preString[Symbol.iterator]();\n let currentPre = pre.next();\n let nextPre = pre.next();\n // We need to keep a separate index as `String#slice()` works on Unicode code units, while `pre` is an array of codepoints.\n let preStringIndex = 0;\n while (!currentPre.done) {\n const character = currentPre.value;\n const nextCharacter = nextPre.value;\n returnValue += character;\n if (character === ESC || character === CSI) {\n GROUP_REGEX.lastIndex = preStringIndex + 1;\n const groupsResult = GROUP_REGEX.exec(preString);\n const groups = groupsResult?.groups;\n if (groups?.code !== undefined) {\n const code = Number.parseFloat(groups.code);\n escapeCode = code === END_CODE ? undefined : code;\n }\n else if (groups?.uri !== undefined) {\n escapeUrl = groups.uri.length === 0 ? undefined : groups.uri;\n }\n }\n const closingCode = escapeCode ? getClosingCode(escapeCode) : undefined;\n if (nextCharacter === '\\n') {\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink('');\n }\n if (escapeCode && closingCode) {\n returnValue += wrapAnsiCode(closingCode);\n }\n }\n else if (character === '\\n') {\n if (escapeCode && closingCode) {\n returnValue += wrapAnsiCode(escapeCode);\n }\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink(escapeUrl);\n }\n }\n preStringIndex += character.length;\n currentPre = nextPre;\n nextPre = pre.next();\n }\n return returnValue;\n};\nexport function wrapAnsi(string, columns, options) {\n return String(string)\n .normalize()\n .replaceAll('\\r\\n', '\\n')\n .split('\\n')\n .map((line) => exec(line, columns, options))\n .join('\\n');\n}\n//# sourceMappingURL=main.js.map", "const actions = ['up', 'down', 'left', 'right', 'space', 'enter', 'cancel'] as const;\nexport type Action = (typeof actions)[number];\n\n/** Global settings for Clack programs, stored in memory */\ninterface InternalClackSettings {\n\tactions: Set<Action>;\n\taliases: Map<string, Action>;\n\tmessages: {\n\t\tcancel: string;\n\t\terror: string;\n\t};\n\twithGuide: boolean;\n}\n\nexport const settings: InternalClackSettings = {\n\tactions: new Set(actions),\n\taliases: new Map<string, Action>([\n\t\t// vim support\n\t\t['k', 'up'],\n\t\t['j', 'down'],\n\t\t['h', 'left'],\n\t\t['l', 'right'],\n\t\t['\\x03', 'cancel'],\n\t\t// opinionated defaults!\n\t\t['escape', 'cancel'],\n\t]),\n\tmessages: {\n\t\tcancel: 'Canceled',\n\t\terror: 'Something went wrong',\n\t},\n\twithGuide: true,\n};\n\nexport interface ClackSettings {\n\t/**\n\t * Set custom global aliases for the default actions.\n\t * This will not overwrite existing aliases, it will only add new ones!\n\t *\n\t * @param aliases - An object that maps aliases to actions\n\t * @default { k: 'up', j: 'down', h: 'left', l: 'right', '\\x03': 'cancel', 'escape': 'cancel' }\n\t */\n\taliases?: Record<string, Action>;\n\n\t/**\n\t * Custom messages for prompts\n\t */\n\tmessages?: {\n\t\t/**\n\t\t * Custom message to display when a spinner is cancelled\n\t\t * @default \"Canceled\"\n\t\t */\n\t\tcancel?: string;\n\t\t/**\n\t\t * Custom message to display when a spinner encounters an error\n\t\t * @default \"Something went wrong\"\n\t\t */\n\t\terror?: string;\n\t};\n\n\twithGuide?: boolean;\n}\n\nexport function updateSettings(updates: ClackSettings) {\n\t// Handle each property in the updates\n\tif (updates.aliases !== undefined) {\n\t\tconst aliases = updates.aliases;\n\t\tfor (const alias in aliases) {\n\t\t\tif (!Object.hasOwn(aliases, alias)) continue;\n\n\t\t\tconst action = aliases[alias];\n\t\t\tif (!settings.actions.has(action)) continue;\n\n\t\t\tif (!settings.aliases.has(alias)) {\n\t\t\t\tsettings.aliases.set(alias, action);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (updates.messages !== undefined) {\n\t\tconst messages = updates.messages;\n\t\tif (messages.cancel !== undefined) {\n\t\t\tsettings.messages.cancel = messages.cancel;\n\t\t}\n\t\tif (messages.error !== undefined) {\n\t\t\tsettings.messages.error = messages.error;\n\t\t}\n\t}\n\n\tif (updates.withGuide !== undefined) {\n\t\tsettings.withGuide = updates.withGuide !== false;\n\t}\n}\n\n/**\n * Check if a key is an alias for a default action\n * @param key - The raw key which might match to an action\n * @param action - The action to match\n * @returns boolean\n */\nexport function isActionKey(key: string | Array<string | undefined>, action: Action) {\n\tif (typeof key === 'string') {\n\t\treturn settings.aliases.get(key) === action;\n\t}\n\n\tfor (const value of key) {\n\t\tif (value === undefined) continue;\n\t\tif (isActionKey(value, action)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n", "export function diffLines(a: string, b: string) {\n\tif (a === b) return;\n\n\tconst aLines = a.split('\\n');\n\tconst bLines = b.split('\\n');\n\tconst numLines = Math.max(aLines.length, bLines.length);\n\tconst diff: number[] = [];\n\n\tfor (let i = 0; i < numLines; i++) {\n\t\tif (aLines[i] !== bLines[i]) diff.push(i);\n\t}\n\n\treturn {\n\t\tlines: diff,\n\t\tnumLinesBefore: aLines.length,\n\t\tnumLinesAfter: bLines.length,\n\t\tnumLines,\n\t};\n}\n", "import { stdin, stdout } from 'node:process';\nimport type { Key } from 'node:readline';\nimport * as readline from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { ReadStream } from 'node:tty';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor } from 'sisteransi';\nimport { isActionKey } from './settings.js';\n\nexport * from './settings.js';\nexport * from './string.js';\n\nconst isWindows = globalThis.process.platform.startsWith('win');\n\nexport const CANCEL_SYMBOL = Symbol('clack:cancel');\n\nexport function isCancel(value: unknown): value is symbol {\n\treturn value === CANCEL_SYMBOL;\n}\n\nexport function setRawMode(input: Readable, value: boolean) {\n\tconst i = input as typeof stdin;\n\n\tif (i.isTTY) i.setRawMode(value);\n}\n\ninterface BlockOptions {\n\tinput?: Readable;\n\toutput?: Writable;\n\toverwrite?: boolean;\n\thideCursor?: boolean;\n}\n\nexport function block({\n\tinput = stdin,\n\toutput = stdout,\n\toverwrite = true,\n\thideCursor = true,\n}: BlockOptions = {}) {\n\tconst rl = readline.createInterface({\n\t\tinput,\n\t\toutput,\n\t\tprompt: '',\n\t\ttabSize: 1,\n\t});\n\treadline.emitKeypressEvents(input, rl);\n\n\tif (input instanceof ReadStream && input.isTTY) {\n\t\tinput.setRawMode(true);\n\t}\n\n\tconst clear = (data: Buffer, { name, sequence }: Key) => {\n\t\tconst str = String(data);\n\t\tif (isActionKey([str, name, sequence], 'cancel')) {\n\t\t\tif (hideCursor) output.write(cursor.show);\n\t\t\tprocess.exit(0);\n\t\t\treturn;\n\t\t}\n\t\tif (!overwrite) return;\n\t\tconst dx = name === 'return' ? 0 : -1;\n\t\tconst dy = name === 'return' ? -1 : 0;\n\n\t\treadline.moveCursor(output, dx, dy, () => {\n\t\t\treadline.clearLine(output, 1, () => {\n\t\t\t\tinput.once('keypress', clear);\n\t\t\t});\n\t\t});\n\t};\n\tif (hideCursor) output.write(cursor.hide);\n\tinput.once('keypress', clear);\n\n\treturn () => {\n\t\tinput.off('keypress', clear);\n\t\tif (hideCursor) output.write(cursor.show);\n\n\t\t// Prevent Windows specific issues: https://github.com/bombshell-dev/clack/issues/176\n\t\tif (input instanceof ReadStream && input.isTTY && !isWindows) {\n\t\t\tinput.setRawMode(false);\n\t\t}\n\n\t\t// @ts-expect-error fix for https://github.com/nodejs/node/issues/31762#issuecomment-1441223907\n\t\trl.terminal = false;\n\t\trl.close();\n\t};\n}\n\nexport const getColumns = (output: Writable): number => {\n\tif ('columns' in output && typeof output.columns === 'number') {\n\t\treturn output.columns;\n\t}\n\treturn 80;\n};\n\nexport const getRows = (output: Writable): number => {\n\tif ('rows' in output && typeof output.rows === 'number') {\n\t\treturn output.rows;\n\t}\n\treturn 20;\n};\n\nexport function wrapTextWithPrefix(\n\toutput: Writable | undefined,\n\ttext: string,\n\tprefix: string,\n\tstartPrefix: string = prefix\n): string {\n\tconst columns = getColumns(output ?? stdout);\n\tconst wrapped = wrapAnsi(text, columns - prefix.length, {\n\t\thard: true,\n\t\ttrim: false,\n\t});\n\tconst lines = wrapped\n\t\t.split('\\n')\n\t\t.map((line, index) => {\n\t\t\treturn `${index === 0 ? startPrefix : prefix}${line}`;\n\t\t})\n\t\t.join('\\n');\n\treturn lines;\n}\n", "import { stdin, stdout } from 'node:process';\nimport readline, { type Key, type ReadLine } from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor, erase } from 'sisteransi';\nimport type { ClackEvents, ClackState } from '../types.js';\nimport type { Action } from '../utils/index.js';\nimport {\n\tCANCEL_SYMBOL,\n\tdiffLines,\n\tgetRows,\n\tisActionKey,\n\tsetRawMode,\n\tsettings,\n} from '../utils/index.js';\n\nexport interface PromptOptions<TValue, Self extends Prompt<TValue>> {\n\trender(this: Omit<Self, 'prompt'>): string | undefined;\n\tinitialValue?: any;\n\tinitialUserInput?: string;\n\tvalidate?: ((value: TValue | undefined) => string | Error | undefined) | undefined;\n\tinput?: Readable;\n\toutput?: Writable;\n\tdebug?: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport default class Prompt<TValue> {\n\tprotected input: Readable;\n\tprotected output: Writable;\n\tprivate _abortSignal?: AbortSignal;\n\n\tprivate rl: ReadLine | undefined;\n\tprivate opts: Omit<PromptOptions<TValue, Prompt<TValue>>, 'render' | 'input' | 'output'>;\n\tprivate _render: (context: Omit<Prompt<TValue>, 'prompt'>) => string | undefined;\n\tprivate _track = false;\n\tprivate _prevFrame = '';\n\tprivate _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>();\n\tprotected _cursor = 0;\n\n\tpublic state: ClackState = 'initial';\n\tpublic error = '';\n\tpublic value: TValue | undefined;\n\tpublic userInput = '';\n\n\tconstructor(options: PromptOptions<TValue, Prompt<TValue>>, trackValue = true) {\n\t\tconst { input = stdin, output = stdout, render, signal, ...opts } = options;\n\n\t\tthis.opts = opts;\n\t\tthis.onKeypress = this.onKeypress.bind(this);\n\t\tthis.close = this.close.bind(this);\n\t\tthis.render = this.render.bind(this);\n\t\tthis._render = render.bind(this);\n\t\tthis._track = trackValue;\n\t\tthis._abortSignal = signal;\n\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t}\n\n\t/**\n\t * Unsubscribe all listeners\n\t */\n\tprotected unsubscribe() {\n\t\tthis._subscribers.clear();\n\t}\n\n\t/**\n\t * Set a subscriber with opts\n\t * @param event - The event name\n\t */\n\tprivate setSubscriber<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\topts: { cb: ClackEvents<TValue>[T]; once?: boolean }\n\t) {\n\t\tconst params = this._subscribers.get(event) ?? [];\n\t\tparams.push(opts);\n\t\tthis._subscribers.set(event, params);\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic on<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb });\n\t}\n\n\t/**\n\t * Subscribe to an event once\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic once<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb, once: true });\n\t}\n\n\t/**\n\t * Emit an event with data\n\t * @param event - The event name\n\t * @param data - The data to pass to the callback\n\t */\n\tpublic emit<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\t...data: Parameters<ClackEvents<TValue>[T]>\n\t) {\n\t\tconst cbs = this._subscribers.get(event) ?? [];\n\t\tconst cleanup: (() => void)[] = [];\n\n\t\tfor (const subscriber of cbs) {\n\t\t\tsubscriber.cb(...data);\n\n\t\t\tif (subscriber.once) {\n\t\t\t\tcleanup.push(() => cbs.splice(cbs.indexOf(subscriber), 1));\n\t\t\t}\n\t\t}\n\n\t\tfor (const cb of cleanup) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\tpublic prompt() {\n\t\treturn new Promise<TValue | symbol | undefined>((resolve) => {\n\t\t\tif (this._abortSignal) {\n\t\t\t\tif (this._abortSignal.aborted) {\n\t\t\t\t\tthis.state = 'cancel';\n\n\t\t\t\t\tthis.close();\n\t\t\t\t\treturn resolve(CANCEL_SYMBOL);\n\t\t\t\t}\n\n\t\t\t\tthis._abortSignal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.state = 'cancel';\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.rl = readline.createInterface({\n\t\t\t\tinput: this.input,\n\t\t\t\ttabSize: 2,\n\t\t\t\tprompt: '',\n\t\t\t\tescapeCodeTimeout: 50,\n\t\t\t\tterminal: true,\n\t\t\t});\n\t\t\tthis.rl.prompt();\n\n\t\t\tif (this.opts.initialUserInput !== undefined) {\n\t\t\t\tthis._setUserInput(this.opts.initialUserInput, true);\n\t\t\t}\n\n\t\t\tthis.input.on('keypress', this.onKeypress);\n\t\t\tsetRawMode(this.input, true);\n\t\t\tthis.output.on('resize', this.render);\n\n\t\t\tthis.render();\n\n\t\t\tthis.once('submit', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(this.value);\n\t\t\t});\n\t\t\tthis.once('cancel', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(CANCEL_SYMBOL);\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected _isActionKey(char: string | undefined, _key: Key): boolean {\n\t\treturn char === '\\t';\n\t}\n\n\tprotected _setValue(value: TValue | undefined): void {\n\t\tthis.value = value;\n\t\tthis.emit('value', this.value);\n\t}\n\n\tprotected _setUserInput(value: string | undefined, write?: boolean): void {\n\t\tthis.userInput = value ?? '';\n\t\tthis.emit('userInput', this.userInput);\n\t\tif (write && this._track && this.rl) {\n\t\t\tthis.rl.write(this.userInput);\n\t\t\tthis._cursor = this.rl.cursor;\n\t\t}\n\t}\n\n\tprotected _clearUserInput(): void {\n\t\tthis.rl?.write(null, { ctrl: true, name: 'u' });\n\t\tthis._setUserInput('');\n\t}\n\n\tprivate onKeypress(char: string | undefined, key: Key) {\n\t\tif (this._track && key.name !== 'return') {\n\t\t\tif (key.name && this._isActionKey(char, key)) {\n\t\t\t\tthis.rl?.write(null, { ctrl: true, name: 'h' });\n\t\t\t}\n\t\t\tthis._cursor = this.rl?.cursor ?? 0;\n\t\t\tthis._setUserInput(this.rl?.line);\n\t\t}\n\n\t\tif (this.state === 'error') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tif (key?.name) {\n\t\t\tif (!this._track && settings.aliases.has(key.name)) {\n\t\t\t\tthis.emit('cursor', settings.aliases.get(key.name));\n\t\t\t}\n\t\t\tif (settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.emit('cursor', key.name as Action);\n\t\t\t}\n\t\t}\n\t\tif (char && (char.toLowerCase() === 'y' || char.toLowerCase() === 'n')) {\n\t\t\tthis.emit('confirm', char.toLowerCase() === 'y');\n\t\t}\n\n\t\t// Call the key event handler and emit the key event\n\t\tthis.emit('key', char?.toLowerCase(), key);\n\n\t\tif (key?.name === 'return') {\n\t\t\tif (this.opts.validate) {\n\t\t\t\tconst problem = this.opts.validate(this.value);\n\t\t\t\tif (problem) {\n\t\t\t\t\tthis.error = problem instanceof Error ? problem.message : problem;\n\t\t\t\t\tthis.state = 'error';\n\t\t\t\t\tthis.rl?.write(this.userInput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.state !== 'error') {\n\t\t\t\tthis.state = 'submit';\n\t\t\t}\n\t\t}\n\n\t\tif (isActionKey([char, key?.name, key?.sequence], 'cancel')) {\n\t\t\tthis.state = 'cancel';\n\t\t}\n\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.emit('finalize');\n\t\t}\n\t\tthis.render();\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tprotected close() {\n\t\tthis.input.unpipe();\n\t\tthis.input.removeListener('keypress', this.onKeypress);\n\t\tthis.output.write('\\n');\n\t\tsetRawMode(this.input, false);\n\t\tthis.rl?.close();\n\t\tthis.rl = undefined;\n\t\tthis.emit(`${this.state}`, this.value);\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate restoreCursor() {\n\t\tconst lines =\n\t\t\twrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\\n')\n\t\t\t\t.length - 1;\n\t\tthis.output.write(cursor.move(-999, lines * -1));\n\t}\n\n\tprivate render() {\n\t\tconst frame = wrapAnsi(this._render(this) ?? '', process.stdout.columns, {\n\t\t\thard: true,\n\t\t\ttrim: false,\n\t\t});\n\t\tif (frame === this._prevFrame) return;\n\n\t\tif (this.state === 'initial') {\n\t\t\tthis.output.write(cursor.hide);\n\t\t} else {\n\t\t\tconst diff = diffLines(this._prevFrame, frame);\n\t\t\tconst rows = getRows(this.output);\n\t\t\tthis.restoreCursor();\n\t\t\tif (diff) {\n\t\t\t\tconst diffOffsetAfter = Math.max(0, diff.numLinesAfter - rows);\n\t\t\t\tconst diffOffsetBefore = Math.max(0, diff.numLinesBefore - rows);\n\t\t\t\tlet diffLine = diff.lines.find((line) => line >= diffOffsetAfter);\n\n\t\t\t\tif (diffLine === undefined) {\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If a single line has changed, only update that line\n\t\t\t\tif (diff.lines.length === 1) {\n\t\t\t\t\tthis.output.write(cursor.move(0, diffLine - diffOffsetBefore));\n\t\t\t\t\tthis.output.write(erase.lines(1));\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tthis.output.write(lines[diffLine]);\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\tthis.output.write(cursor.move(0, lines.length - diffLine - 1));\n\t\t\t\t\treturn;\n\t\t\t\t\t// If many lines have changed, rerender everything past the first line\n\t\t\t\t} else if (diff.lines.length > 1) {\n\t\t\t\t\tif (diffOffsetAfter < diffOffsetBefore) {\n\t\t\t\t\t\tdiffLine = diffOffsetAfter;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst adjustedDiffLine = diffLine - diffOffsetBefore;\n\t\t\t\t\t\tif (adjustedDiffLine > 0) {\n\t\t\t\t\t\t\tthis.output.write(cursor.move(0, adjustedDiffLine));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.output.write(erase.down());\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tconst newLines = lines.slice(diffLine);\n\t\t\t\t\tthis.output.write(newLines.join('\\n'));\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.output.write(erase.down());\n\t\t}\n\n\t\tthis.output.write(frame);\n\t\tif (this.state === 'initial') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tthis._prevFrame = frame;\n\t}\n}\n", "import type { Key } from 'node:readline';\nimport color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: unknown;\n\tlabel?: string;\n}\n\ntype FilterFunction<T extends OptionLike> = (search: string, opt: T) => boolean;\n\nfunction getCursorForValue<T extends OptionLike>(\n\tselected: T['value'] | undefined,\n\titems: T[]\n): number {\n\tif (selected === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst currLength = items.length;\n\n\t// If filtering changed the available options, update cursor\n\tif (currLength === 0) {\n\t\treturn 0;\n\t}\n\n\t// Try to maintain the same selected item\n\tconst index = items.findIndex((item) => item.value === selected);\n\treturn index !== -1 ? index : 0;\n}\n\nfunction defaultFilter<T extends OptionLike>(input: string, option: T): boolean {\n\tconst label = option.label ?? String(option.value);\n\treturn label.toLowerCase().includes(input.toLowerCase());\n}\n\nfunction normalisedValue<T>(multiple: boolean, values: T[] | undefined): T | T[] | undefined {\n\tif (!values) {\n\t\treturn undefined;\n\t}\n\tif (multiple) {\n\t\treturn values;\n\t}\n\treturn values[0];\n}\n\nexport interface AutocompleteOptions<T extends OptionLike>\n\textends PromptOptions<T['value'] | T['value'][], AutocompletePrompt<T>> {\n\toptions: T[] | ((this: AutocompletePrompt<T>) => T[]);\n\tfilter?: FilterFunction<T>;\n\tmultiple?: boolean;\n}\n\nexport default class AutocompletePrompt<T extends OptionLike> extends Prompt<\n\tT['value'] | T['value'][]\n> {\n\tfilteredOptions: T[];\n\tmultiple: boolean;\n\tisNavigating = false;\n\tselectedValues: Array<T['value']> = [];\n\n\tfocusedValue: T['value'] | undefined;\n\t#cursor = 0;\n\t#lastUserInput = '';\n\t#filterFn: FilterFunction<T>;\n\t#options: T[] | (() => T[]);\n\n\tget cursor(): number {\n\t\treturn this.#cursor;\n\t}\n\n\tget userInputWithCursor() {\n\t\tif (!this.userInput) {\n\t\t\treturn color.inverse(color.hidden('_'));\n\t\t}\n\t\tif (this._cursor >= this.userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = this.userInput.slice(0, this._cursor);\n\t\tconst [s2, ...s3] = this.userInput.slice(this._cursor);\n\t\treturn `${s1}${color.inverse(s2)}${s3.join('')}`;\n\t}\n\n\tget options(): T[] {\n\t\tif (typeof this.#options === 'function') {\n\t\t\treturn this.#options();\n\t\t}\n\t\treturn this.#options;\n\t}\n\n\tconstructor(opts: AutocompleteOptions<T>) {\n\t\tsuper(opts);\n\n\t\tthis.#options = opts.options;\n\t\tconst options = this.options;\n\t\tthis.filteredOptions = [...options];\n\t\tthis.multiple = opts.multiple === true;\n\t\tthis.#filterFn = opts.filter ?? defaultFilter;\n\t\tlet initialValues: unknown[] | undefined;\n\t\tif (opts.initialValue && Array.isArray(opts.initialValue)) {\n\t\t\tif (this.multiple) {\n\t\t\t\tinitialValues = opts.initialValue;\n\t\t\t} else {\n\t\t\t\tinitialValues = opts.initialValue.slice(0, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.multiple && this.options.length > 0) {\n\t\t\t\tinitialValues = [this.options[0].value];\n\t\t\t}\n\t\t}\n\n\t\tif (initialValues) {\n\t\t\tfor (const selectedValue of initialValues) {\n\t\t\t\tconst selectedIndex = options.findIndex((opt) => opt.value === selectedValue);\n\t\t\t\tif (selectedIndex !== -1) {\n\t\t\t\t\tthis.toggleSelected(selectedValue);\n\t\t\t\t\tthis.#cursor = selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.focusedValue = this.options[this.#cursor]?.value;\n\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('userInput', (value) => this.#onUserInputChanged(value));\n\t}\n\n\tprotected override _isActionKey(char: string | undefined, key: Key): boolean {\n\t\treturn (\n\t\t\tchar === '\\t' ||\n\t\t\t(this.multiple &&\n\t\t\t\tthis.isNavigating &&\n\t\t\t\tkey.name === 'space' &&\n\t\t\t\tchar !== undefined &&\n\t\t\t\tchar !== '')\n\t\t);\n\t}\n\n\t#onKey(_char: string | undefined, key: Key): void {\n\t\tconst isUpKey = key.name === 'up';\n\t\tconst isDownKey = key.name === 'down';\n\t\tconst isReturnKey = key.name === 'return';\n\n\t\t// Start navigation mode with up/down arrows\n\t\tif (isUpKey || isDownKey) {\n\t\t\tthis.#cursor = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(this.#cursor + (isUpKey ? -1 : 1), this.filteredOptions.length - 1)\n\t\t\t);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t}\n\t\t\tthis.isNavigating = true;\n\t\t} else if (isReturnKey) {\n\t\t\tthis.value = normalisedValue(this.multiple, this.selectedValues);\n\t\t} else {\n\t\t\tif (this.multiple) {\n\t\t\t\tif (\n\t\t\t\t\tthis.focusedValue !== undefined &&\n\t\t\t\t\t(key.name === 'tab' || (this.isNavigating && key.name === 'space'))\n\t\t\t\t) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.isNavigating = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.focusedValue) {\n\t\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t\t}\n\t\t\t\tthis.isNavigating = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tdeselectAll() {\n\t\tthis.selectedValues = [];\n\t}\n\n\ttoggleSelected(value: T['value']) {\n\t\tif (this.filteredOptions.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.multiple) {\n\t\t\tif (this.selectedValues.includes(value)) {\n\t\t\t\tthis.selectedValues = this.selectedValues.filter((v) => v !== value);\n\t\t\t} else {\n\t\t\t\tthis.selectedValues = [...this.selectedValues, value];\n\t\t\t}\n\t\t} else {\n\t\t\tthis.selectedValues = [value];\n\t\t}\n\t}\n\n\t#onUserInputChanged(value: string): void {\n\t\tif (value !== this.#lastUserInput) {\n\t\t\tthis.#lastUserInput = value;\n\n\t\t\tconst options = this.options;\n\n\t\t\tif (value) {\n\t\t\t\tthis.filteredOptions = options.filter((opt) => this.#filterFn(value, opt));\n\t\t\t} else {\n\t\t\t\tthis.filteredOptions = [...options];\n\t\t\t}\n\t\t\tthis.#cursor = getCursorForValue(this.focusedValue, this.filteredOptions);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tif (this.focusedValue !== undefined) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.deselectAll();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n", "import { cursor } from 'sisteransi';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface ConfirmOptions extends PromptOptions<boolean, ConfirmPrompt> {\n\tactive: string;\n\tinactive: string;\n\tinitialValue?: boolean;\n}\n\nexport default class ConfirmPrompt extends Prompt<boolean> {\n\tget cursor() {\n\t\treturn this.value ? 0 : 1;\n\t}\n\n\tprivate get _value() {\n\t\treturn this.cursor === 0;\n\t}\n\n\tconstructor(opts: ConfirmOptions) {\n\t\tsuper(opts, false);\n\t\tthis.value = !!opts.initialValue;\n\n\t\tthis.on('userInput', () => {\n\t\t\tthis.value = this._value;\n\t\t});\n\n\t\tthis.on('confirm', (confirm) => {\n\t\t\tthis.output.write(cursor.move(0, -1));\n\t\t\tthis.value = confirm;\n\t\t\tthis.state = 'submit';\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis.on('cursor', () => {\n\t\t\tthis.value = !this.value;\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface GroupMultiSelectOptions<T extends { value: any }>\n\textends PromptOptions<T['value'][], GroupMultiSelectPrompt<T>> {\n\toptions: Record<string, T[]>;\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n\tselectableGroups?: boolean;\n}\nexport default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt<T['value'][]> {\n\toptions: (T & { group: string | boolean })[];\n\tcursor = 0;\n\t#selectableGroups: boolean;\n\n\tgetGroupItems(group: string): T[] {\n\t\treturn this.options.filter((o) => o.group === group);\n\t}\n\n\tisGroupSelected(group: string) {\n\t\tconst items = this.getGroupItems(group);\n\t\tconst value = this.value;\n\t\tif (value === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn items.every((i) => value.includes(i.value));\n\t}\n\n\tprivate toggleValue() {\n\t\tconst item = this.options[this.cursor];\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tif (item.group === true) {\n\t\t\tconst group = item.value;\n\t\t\tconst groupedItems = this.getGroupItems(group);\n\t\t\tif (this.isGroupSelected(group)) {\n\t\t\t\tthis.value = this.value.filter(\n\t\t\t\t\t(v: string) => groupedItems.findIndex((i) => i.value === v) === -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.value = [...this.value, ...groupedItems.map((i) => i.value)];\n\t\t\t}\n\t\t\tthis.value = Array.from(new Set(this.value));\n\t\t} else {\n\t\t\tconst selected = this.value.includes(item.value);\n\t\t\tthis.value = selected\n\t\t\t\t? this.value.filter((v: T['value']) => v !== item.value)\n\t\t\t\t: [...this.value, item.value];\n\t\t}\n\t}\n\n\tconstructor(opts: GroupMultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\t\tconst { options } = opts;\n\t\tthis.#selectableGroups = opts.selectableGroups !== false;\n\t\tthis.options = Object.entries(options).flatMap(([key, option]) => [\n\t\t\t{ value: key, group: true, label: key },\n\t\t\t...option.map((opt) => ({ ...opt, group: key })),\n\t\t]) as any;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\tthis.#selectableGroups ? 0 : 1\n\t\t);\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up': {\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right': {\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n", "export function findCursor<T extends { disabled?: boolean }>(\n\tcursor: number,\n\tdelta: number,\n\toptions: T[]\n) {\n\tconst newCursor = cursor + delta;\n\tconst maxCursor = Math.max(options.length - 1, 0);\n\tconst clampedCursor = newCursor < 0 ? maxCursor : newCursor > maxCursor ? 0 : newCursor;\n\tconst newOption = options[clampedCursor];\n\tif (newOption.disabled) {\n\t\treturn findCursor(clampedCursor, delta < 0 ? -1 : 1, options);\n\t}\n\treturn clampedCursor;\n}\n", "import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: any;\n\tdisabled?: boolean;\n}\n\nexport interface MultiSelectOptions<T extends OptionLike>\n\textends PromptOptions<T['value'][], MultiSelectPrompt<T>> {\n\toptions: T[];\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n}\nexport default class MultiSelectPrompt<T extends OptionLike> extends Prompt<T['value'][]> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value(): T['value'] {\n\t\treturn this.options[this.cursor].value;\n\t}\n\n\tprivate get _enabledOptions(): T[] {\n\t\treturn this.options.filter((option) => option.disabled !== true);\n\t}\n\n\tprivate toggleAll() {\n\t\tconst enabledOptions = this._enabledOptions;\n\t\tconst allSelected = this.value !== undefined && this.value.length === enabledOptions.length;\n\t\tthis.value = allSelected ? [] : enabledOptions.map((v) => v.value);\n\t}\n\n\tprivate toggleInvert() {\n\t\tconst value = this.value;\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tconst notSelected = this._enabledOptions.filter((v) => !value.includes(v.value));\n\t\tthis.value = notSelected.map((v) => v.value);\n\t}\n\n\tprivate toggleValue() {\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tconst selected = this.value.includes(this._value);\n\t\tthis.value = selected\n\t\t\t? this.value.filter((value) => value !== this._value)\n\t\t\t: [...this.value, this._value];\n\t}\n\n\tconstructor(opts: MultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tconst cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\t0\n\t\t);\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.on('key', (char) => {\n\t\t\tif (char === 'a') {\n\t\t\t\tthis.toggleAll();\n\t\t\t}\n\t\t\tif (char === 'i') {\n\t\t\t\tthis.toggleInvert();\n\t\t\t}\n\t\t});\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n", "import color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface PasswordOptions extends PromptOptions<string, PasswordPrompt> {\n\tmask?: string;\n}\nexport default class PasswordPrompt extends Prompt<string> {\n\tprivate _mask = '•';\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tget masked() {\n\t\treturn this.userInput.replaceAll(/./g, this._mask);\n\t}\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\treturn this.masked;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.masked}${color.inverse(color.hidden('_'))}`;\n\t\t}\n\t\tconst masked = this.masked;\n\t\tconst s1 = masked.slice(0, this.cursor);\n\t\tconst s2 = masked.slice(this.cursor);\n\t\treturn `${s1}${color.inverse(s2[0])}${s2.slice(1)}`;\n\t}\n\tclear() {\n\t\tthis._clearUserInput();\n\t}\n\tconstructor({ mask, ...opts }: PasswordOptions) {\n\t\tsuper(opts);\n\t\tthis._mask = mask ?? '•';\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t}\n}\n", "import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectOptions<T extends { value: any; disabled?: boolean }>\n\textends PromptOptions<T['value'], SelectPrompt<T>> {\n\toptions: T[];\n\tinitialValue?: T['value'];\n}\nexport default class SelectPrompt<T extends { value: any; disabled?: boolean }> extends Prompt<\n\tT['value']\n> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _selectedValue() {\n\t\treturn this.options[this.cursor];\n\t}\n\n\tprivate changeValue() {\n\t\tthis.value = this._selectedValue.value;\n\t}\n\n\tconstructor(opts: SelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\n\t\tconst initialCursor = this.options.findIndex(({ value }) => value === opts.initialValue);\n\t\tconst cursor = initialCursor === -1 ? 0 : initialCursor;\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.changeValue();\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.changeValue();\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectKeyOptions<T extends { value: string }>\n\textends PromptOptions<T['value'], SelectKeyPrompt<T>> {\n\toptions: T[];\n\tcaseSensitive?: boolean;\n}\nexport default class SelectKeyPrompt<T extends { value: string }> extends Prompt<T['value']> {\n\toptions: T[];\n\tcursor = 0;\n\n\tconstructor(opts: SelectKeyOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tconst caseSensitive = opts.caseSensitive === true;\n\t\tconst keys = this.options.map(({ value: [initial] }) => {\n\t\t\treturn caseSensitive ? initial : initial?.toLowerCase();\n\t\t});\n\t\tthis.cursor = Math.max(keys.indexOf(opts.initialValue), 0);\n\n\t\tthis.on('key', (key, keyInfo) => {\n\t\t\tif (!key) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst casedKey = caseSensitive && keyInfo.shift ? key.toUpperCase() : key;\n\t\t\tif (!keys.includes(casedKey)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst value = this.options.find(({ value: [initial] }) => {\n\t\t\t\treturn caseSensitive ? initial === casedKey : initial?.toLowerCase() === key;\n\t\t\t});\n\t\t\tif (value) {\n\t\t\t\tthis.value = value.value;\n\t\t\t\tthis.state = 'submit';\n\t\t\t\tthis.emit('submit');\n\t\t\t}\n\t\t});\n\t}\n}\n", "import color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface TextOptions extends PromptOptions<string, TextPrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n}\n\nexport default class TextPrompt extends Prompt<string> {\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.userInput;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = userInput.slice(0, this.cursor);\n\t\tconst [s2, ...s3] = userInput.slice(this.cursor);\n\t\treturn `${s1}${color.inverse(s2)}${s3.join('')}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tconstructor(opts: TextOptions) {\n\t\tsuper({\n\t\t\t...opts,\n\t\t\tinitialUserInput: opts.initialUserInput ?? opts.initialValue,\n\t\t});\n\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t\tif (this.value === undefined) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t}\n}\n", "import chalk from \"chalk\";\nimport { text } from \"../../components/text.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${text.intro(title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nfunction getVisibleWidth(value: string): number {\n return stripAnsi(value).length;\n}\n\nfunction renderTerminalNote(message: string, title?: string): string {\n const contentLines = [\"\", ...message.split(\"\\n\"), \"\"];\n const visibleTitle = stripAnsi(title ?? \"\");\n const contentWidth = Math.max(\n visibleTitle.length,\n ...contentLines.map((line) => getVisibleWidth(line))\n ) + 2;\n const titleLine = `${chalk.green(\"\u25C7\")} ${chalk.reset(title ?? \"\")} ${chalk.gray(\n `${\"\u2500\".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`\n )}`;\n const content = contentLines.map((line) => {\n const padding = \" \".repeat(contentWidth - getVisibleWidth(line));\n return `${chalk.gray(\"\u2502\")} ${line}${padding}${chalk.gray(\"\u2502\")}`;\n });\n const bottom = chalk.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [chalk.gray(\"\u2502\"), titleLine, ...content, bottom].join(\"\\n\");\n}\n\nexport function note(message: string, title?: string): void {\n const format = resolveOutputFormat();\n const strippedMessage = stripAnsi(message);\n const strippedTitle = stripAnsi(title ?? \"\");\n\n if (format === \"markdown\") {\n const lines = strippedMessage.split(\"\\n\");\n const heading = strippedTitle ? `> **${strippedTitle}**\\n` : \"\";\n const body = lines.map((line) => `> ${line}`).join(\"\\n\");\n process.stdout.write(`${heading}${body}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({\n type: \"note\",\n title: strippedTitle,\n message: strippedMessage\n })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${renderTerminalNote(message, title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function outro(message: string): void {\n const format = resolveOutputFormat();\n const stripped = stripAnsi(message);\n\n if (format === \"markdown\") {\n process.stdout.write(`---\\n${stripped}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"outro\", message: stripped })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2502\")}\\n${chalk.gray(\"\u2514\")} ${message}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\nimport { SPINNER_FRAMES } from \"../../static/spinner.js\";\n\nexport interface SpinnerOptions {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n}\n\nfunction writeTerminalFrame(frame: string, message: string): void {\n process.stdout.write(`\\r\\x1b[K${frame} ${message}`);\n}\n\nexport function spinner(): SpinnerOptions {\n let currentMessage = \"\";\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n let fallback = false;\n\n const format = resolveOutputFormat();\n\n const renderFrame = (): void => {\n writeTerminalFrame(SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length], currentMessage);\n };\n\n const clearTimer = (): void => {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n };\n\n return {\n start(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}...\\n`);\n return;\n }\n\n fallback = process.env.POE_NO_SPINNER === \"1\" || !process.stdout.isTTY;\n if (fallback) {\n process.stdout.write(`${currentMessage}\\n`);\n return;\n }\n\n frameIndex = 0;\n renderFrame();\n timer = setInterval(() => {\n frameIndex += 1;\n renderFrame();\n }, 16);\n },\n\n message(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format !== \"terminal\" || fallback || !timer) {\n return;\n }\n\n renderFrame();\n },\n\n stop(message = currentMessage, code?: number): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"spinner\", state: \"stopped\", message: currentMessage })}\\n`\n );\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}\\n`);\n return;\n }\n\n clearTimer();\n\n const symbol = code === undefined || code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n\n if (fallback) {\n process.stdout.write(`${symbol} ${currentMessage}\\n`);\n return;\n }\n\n process.stdout.write(`\\r\\x1b[K${symbol} ${currentMessage}\\n`);\n }\n };\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? chalk.green(\"\u25C6\") : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const format = resolveOutputFormat();\n const selectedIndex = opts.selectedIndex ?? 0;\n\n if (format === \"markdown\") {\n return [\n `**${opts.message}**`,\n ...opts.options.map(\n (option, index) => `- [${index === selectedIndex ? \"x\" : \" \"}] ${option.label}`\n )\n ].join(\"\\n\");\n }\n\n if (format === \"json\") {\n return JSON.stringify({\n type: \"menu\",\n message: opts.message,\n options: opts.options,\n selected: selectedIndex\n });\n }\n\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { ObjectSchema, Static } from \"@poe-code/cmdkit-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"@poe-code/design-system\";\n\nconst commandConfigSymbol = Symbol(\"cmdkit.command.config\");\nconst groupConfigSymbol = Symbol(\"cmdkit.group.config\");\nconst commandSourcePathSymbol = Symbol(\"cmdkit.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\n\nexport type Scope = ScopeValue;\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(path: string, contents: string): Promise<void>;\n exists(path: string): Promise<boolean>;\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 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 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 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 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 aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\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 aliases: string[];\n positional: string[];\n params: TParamsSchema;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\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 scope?: Scope[];\n secrets?: SecretDeclarations;\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 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> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\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> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitCommandTypeInfo: CommandTypeInfo<TName, TParamsSchema, TResult, TOwnScope>;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitGroupTypeInfo: GroupTypeInfo<TServices, TName, TChildren, TOwnScope>;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport class UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\n }\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>(requires: Requires<TContext> | undefined): 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 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 = 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 = 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/cmdkit/src/index.ts\") ||\n candidate.includes(\"/packages/cmdkit/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(parent: Requires<any> | undefined, child: Requires<any> | undefined): 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 (\n merged.auth === undefined &&\n merged.apiVersion === undefined &&\n merged.check === undefined\n ) {\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 throw new UserError(`Error: Missing required secret ${secret.env}${details}`);\n }\n\n secrets[name] = value;\n }\n\n return secrets;\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 `Error: 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 `Error: 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 `Error: 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 `Error: 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 `Error: 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(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): 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 aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\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 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>(config: GroupConfig<TServices>): 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 secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined,\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n secrets: cloneSecrets(config.secrets),\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 (command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig })[\n commandConfigSymbol\n ];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(group: Group<TServices>): 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 aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\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 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 materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const scope = resolveGroupScope(internal.scope, inherited.scope);\n const secrets = mergeSecrets(inherited.secrets, internal.secrets);\n const requires = mergeRequires(inherited.requires, internal.requires);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, {\n scope,\n secrets,\n requires,\n })\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 UserError(`Default command \"${internal.default.name}\" must be listed in children.`);\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new UserError(`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,\n secrets,\n requires,\n children: materializedChildren,\n default: defaultChild,\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n secrets: cloneSecrets(internal.secrets),\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>(\n config: Omit<CommandConfig<TServices, TParamsSchema, TSecrets, TResult>, \"name\" | \"scope\"> & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope> {\n return materializeCommand(createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope>;\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>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n }\n): Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope> {\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope>;\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 \"@poe-code/cmdkit-schema\";\nexport type { AnySchema, ArraySchema, BooleanSchema, EnumSchema, JsonSchema, NumberSchema, ObjectSchema, OptionalSchema, Static, StringSchema } from \"@poe-code/cmdkit-schema\";\n", "type JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\";\ntype EnumValue = string | number | boolean;\ntype JsonSchemaEnumValue = EnumValue | null;\ntype NumberJsonType = \"number\" | \"integer\";\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> = TSchema extends OptionalSchema<infer TInner>\n ? Static<TInner>\n : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n description?: string;\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n};\n\ninterface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly description?: string;\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean;\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<JsonSchemaEnumValue>;\n format?: string;\n items?: JsonSchema;\n maxItems?: number;\n maximum?: number;\n maxLength?: number;\n minItems?: number;\n minimum?: number;\n minLength?: number;\n nullable?: boolean;\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport interface StringSchema extends SchemaBase<\"string\", string>, StringMetadata {}\n\nexport interface NumberSchema extends SchemaBase<\"number\", number>, NumberMetadata {\n readonly jsonType?: NumberJsonType;\n}\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>>\n extends SchemaBase<\"enum\", TValues[number]> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema>\n extends SchemaBase<\"optional\", Static<TInner> | undefined> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties = schema.additionalProperties;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nexport const S = {\n String(options: SchemaOptions<string> & StringMetadata = {}): StringSchema {\n return {\n kind: \"string\",\n ...options,\n };\n },\n\n Number(\n options: SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } = {}\n ): NumberSchema {\n return {\n kind: \"number\",\n ...options,\n };\n },\n\n Boolean(options: SchemaOptions<boolean> = {}): BooleanSchema {\n return {\n kind: \"boolean\",\n ...options,\n };\n },\n\n Enum<const TValues extends NonEmptyReadonlyArray<EnumValue>>(\n values: TValues,\n options: SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = {}\n ): EnumSchema<TValues> {\n assertValidEnumValues(values);\n\n return {\n kind: \"enum\",\n values,\n ...options,\n };\n },\n\n Array<TItem extends AnySchema>(\n item: TItem,\n options: SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = {}\n ): ArraySchema<TItem> {\n return {\n kind: \"array\",\n item,\n ...options,\n };\n },\n\n Object<const TShape extends ObjectShape>(\n shape: TShape,\n options: SchemaOptions<InferObject<TShape>> & ObjectMetadata = {}\n ): ObjectSchema<TShape> {\n return {\n kind: \"object\",\n shape,\n ...options,\n };\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner,\n };\n },\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withStringMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withNumberMetadata(unwrappedSchema, { type: unwrappedSchema.jsonType ?? \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum:\n unwrappedSchema.nullable === true\n ? [...unwrappedSchema.values, null]\n : [...unwrappedSchema.values],\n };\n const enumType = unwrappedSchema.jsonType ?? getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withArrayMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item),\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n properties[key] = toJsonSchema(propertySchema);\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required,\n });\n }\n }\n}\n", "import type { NumberSchema } from \"@poe-code/cmdkit-schema\";\n\nexport function isValidNumberSchemaValue(\n value: unknown,\n schema: NumberSchema\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value))\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n return schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n}\n", "import type { Command, RenderPrimitives } from \"./index.js\";\n\nexport type OutputMode = \"rich\" | \"md\" | \"json\";\n\ntype WriteFn = (chunk: string) => void;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.every((entry) => isObject(entry));\n}\n\nfunction stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return stringifyJson(value);\n}\n\nfunction stringifyJson(value: unknown, spaces?: number): string {\n try {\n return JSON.stringify(\n value,\n (_key, currentValue) => (typeof currentValue === \"bigint\" ? currentValue.toString() : currentValue),\n spaces\n ) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction renderObjectTable(result: Record<string, unknown>, primitives: RenderPrimitives): string {\n const rows = Object.entries(result).map(([key, value]) => ({\n key,\n value: stringifyValue(value),\n }));\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: [\n {\n name: \"key\",\n title: \"Key\",\n alignment: \"left\",\n maxLen: Math.max(\"Key\".length, ...rows.map((row) => row.key.length)),\n },\n {\n name: \"value\",\n title: \"Value\",\n alignment: \"left\",\n maxLen: Math.max(\"Value\".length, ...rows.map((row) => row.value.length)),\n },\n ],\n rows,\n });\n}\n\nfunction renderObjectMarkdown(result: Record<string, unknown>): string {\n return Object.entries(result)\n .map(([key, value]) => `- ${key}: ${stringifyValue(value)}`)\n .join(\"\\n\");\n}\n\nfunction getColumnNames(rows: Array<Record<string, unknown>>): string[] {\n const names = new Set<string>();\n\n for (const row of rows) {\n for (const name of Object.keys(row)) {\n names.add(name);\n }\n }\n\n return [...names];\n}\n\nfunction renderArrayTable(result: Array<Record<string, unknown>>, primitives: RenderPrimitives): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: columnNames.map((name) => ({\n name,\n title: name,\n alignment: \"left\",\n maxLen: Math.max(\n name.length,\n ...result.map((row) => (name in row ? stringifyValue(row[name]).length : 0))\n ),\n })),\n rows: result.map((row) =>\n Object.fromEntries(\n columnNames.map((name) => [name, name in row ? stringifyValue(row[name]) : \"\"])\n )\n ),\n });\n}\n\nfunction renderArrayMarkdown(result: Array<Record<string, unknown>>): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n const header = `| ${columnNames.join(\" | \")} |`;\n const separator = `| ${columnNames.map(() => \":---\").join(\" | \")} |`;\n const rows = result.map(\n (row) =>\n `| ${columnNames\n .map((name) => (name in row ? stringifyValue(row[name]).replaceAll(\"|\", \"\\\\|\") : \"\"))\n .join(\" | \")} |`\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction autoRender(result: unknown, output: OutputMode, primitives: RenderPrimitives): string {\n if (result === null || result === undefined) {\n if (output === \"json\") {\n return stringifyJson({ ok: true }, 2);\n }\n\n return \"Done.\";\n }\n\n if (typeof result === \"string\") {\n if (output === \"json\") {\n return stringifyJson({ result }, 2);\n }\n\n return result;\n }\n\n if (isObject(result)) {\n if (output === \"rich\") {\n return renderObjectTable(result, primitives);\n }\n\n if (output === \"md\") {\n return renderObjectMarkdown(result);\n }\n\n return stringifyJson(result, 2);\n }\n\n if (isArrayOfObjects(result)) {\n if (output === \"md\") {\n return renderArrayMarkdown(result);\n }\n\n if (output === \"json\") {\n return stringifyJson(result, 2);\n }\n\n return renderArrayTable(result, primitives);\n }\n\n return stringifyJson(result, 2);\n}\n\nexport function renderResult(\n command: Command<any, any, any, any>,\n result: unknown,\n output: OutputMode,\n primitives: RenderPrimitives,\n write: WriteFn = (chunk) => {\n process.stdout.write(chunk);\n }\n): void {\n if (output === \"json\" && command.render?.json) {\n const payload = command.render.json(result, primitives);\n if (payload !== undefined) {\n write(`${stringifyJson(payload, 2)}\\n`);\n }\n return;\n }\n\n if (output === \"md\" && command.render?.markdown) {\n const payload = command.render.markdown(result, primitives);\n if (typeof payload === \"string\" && payload.length > 0) {\n write(`${payload}\\n`);\n }\n return;\n }\n\n if (output === \"rich\" && command.render?.rich) {\n command.render.rich(result, primitives);\n return;\n }\n\n const payload = autoRender(result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`);\n }\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 try {\n await Promise.all(sessions.map((session) => session.close()));\n } finally {\n this.sessionMap.clear();\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 { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closeRequested = false;\n private signalRequested = false;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.signalRequested = true;\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const matched = matchPattern(this.rawBuffer, pattern);\n if (matched !== null) {\n return matched;\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.signalRequested) {\n return this.exitPromise;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n }\n }\n\n return this.exitPromise;\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character === \"\\r\" || character === \"\\b\") {\n continue;\n }\n\n output += character;\n }\n\n return output;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n EscCharset,\n EscHash,\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor = { x: 0, y: 0 };\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n\n this.displayBuffer = Object.defineProperties(\n {} as { readonly cursorX: number; readonly cursorY: number; readonly data: Array<Row | undefined> },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true },\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const cell = [ch.charCodeAt(0), ch] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n return this._csiParams.split(\";\").map((s) => (s === \"\" ? 0 : parseInt(s, 10)));\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n } else {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._resetStyle();\n }\n }\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2 || p0 === 3) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": { // insert lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": { // delete lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": { // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": { // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": { // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": { // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = 0;\n break;\n }\n case \"s\": // save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n break;\n case \"u\": // restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ESC (ESC \\ = ST)\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n // next char should be `\\` \u2014 just return to normal, it will be consumed\n this._state = State.Normal;\n }\n break;\n case State.Str:\n // consume until ST (0x9c) or BEL\n if (code === 0x9c || code === 0x07) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._state = State.Normal;\n }\n break;\n case State.EscCharset:\n // consume one character for charset designation\n this._state = State.Normal;\n break;\n case State.EscHash:\n // consume one character for line attributes\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL\n if (this._cursorX > 0) {\n this._cursorX--;\n this._setChar(this._cursorY, this._cursorX, \" \");\n }\n } else if (code === 0x09) {\n // HT\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 charset switch, ignore\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n this._setChar(this._cursorY, this._cursorX, ch);\n this._cursorX++;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX, this._cols - 1);\n return;\n }\n\n if (this._cursorX >= this._cols) {\n // Auto-wrap\n this._cursorX = 0;\n this._newline();\n }\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x28 || code === 0x29 || code === 0x2a || code === 0x2b || code === 0x2d || code === 0x2e) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = tab set (ignore)\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._savedCursor = { x: 0, y: 0 };\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetStyle();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b) {\n // Digit or semicolon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n strikethrough: false\n };\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"@poe-code/cmdkit\";\nimport type { HandlerEnv } from \"@poe-code/cmdkit\";\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(name: string | undefined, env?: HandlerEnv): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\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 let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n return name ?? env?.get(SESSION_ENV_VAR);\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}`)) {\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 nameToId.delete(name);\n idToName.delete(sessionId);\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(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\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(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\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 return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n if (nameToId.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\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 },\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(name: string | undefined, env?: HandlerEnv): 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 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 }\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", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const closeSession = defineCommand<\n TerminalPilotCommandServices,\n \"close-session\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"close-session\",\n description: \"Close an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const { exitCode } = await getTerminalPilotRuntime(terminalPilotRuntime).closeSession(params.session, env);\n return { exitCode };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n command: S.String({ description: \"Command to execute\" }),\n args: S.Optional(S.Array(S.String(), { description: \"Command arguments\" })),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n cwd: S.Optional(S.String({ description: \"Working directory\" })),\n cols: S.Optional(S.Number({ description: \"Terminal width in columns\" })),\n rows: S.Optional(S.Number({ description: \"Terminal height in rows\" })),\n observe: S.Optional(S.Boolean({ description: \"Mirror PTY output to stderr\" }))\n});\n\nexport const createSession = defineCommand<\n TerminalPilotCommandServices,\n \"create-session\",\n typeof params,\n undefined,\n { session: string; pid: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"create-session\",\n description: \"Spawn an interactive CLI in a PTY\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"command\", \"args\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).createSession(params, env);\n return { session: namedSession.name, pid: namedSession.session.pid };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n text: S.String({ description: \"Text to write to the session\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const fill = defineCommand<\n TerminalPilotCommandServices,\n \"fill\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"fill\",\n description: \"Write text to an active terminal session all at once (replaces \\\\n with \\\\r)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.fill(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const getSession = defineCommand<\n TerminalPilotCommandServices,\n \"get-session\",\n typeof params,\n undefined,\n { session: string; pid: number; command: string; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"get-session\",\n description: \"Get session metadata (name, pid, command, exitCode)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n return {\n session: namedSession.name,\n pid: namedSession.session.pid,\n command: namedSession.session.command,\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return os.homedir();\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? os.homedir() : path.join(os.homedir(), remainder);\n}\n\nexport function resolveSkillDir(config: AgentSkillConfig, scope: SkillScope, cwd: string): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import type {\n TemplateWriteMutation,\n TemplateMergeTomlMutation,\n TemplateMergeJsonMutation,\n ConfigObject,\n ValueResolver\n} from \"../types.js\";\n\nexport interface WriteOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeTomlOptions {\n /** Target TOML file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeJsonOptions {\n /** Target JSON file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction write(options: WriteOptions): TemplateWriteMutation {\n return {\n kind: \"templateWrite\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeToml(options: MergeTomlOptions): TemplateMergeTomlMutation {\n return {\n kind: \"templateMergeToml\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeJson(options: MergeJsonOptions): TemplateMergeJsonMutation {\n return {\n kind: \"templateMergeJson\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nexport const templateMutation = {\n write,\n mergeToml,\n mergeJson\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\nimport { yamlFormat } from \"./yaml.js\";\n\nexport type FormatName = \"json\" | \"toml\" | \"yaml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat,\n yaml: yamlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\nexport { yamlFormat } from \"./yaml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import { fileMutation, runMutations, templateMutation } from \"@poe-code/config-mutations\";\nimport { resolveAgentSupport } from \"./configs.js\";\nimport { createTemplateLoader } from \"./templates.js\";\nimport type { ApplyOptions, SkillFile } from \"./types.js\";\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction toHomeRelative(localSkillDir: string): string {\n if (localSkillDir.startsWith(\"~/\") || localSkillDir === \"~\") {\n return localSkillDir;\n }\n\n const normalized = localSkillDir.startsWith(\"./\")\n ? localSkillDir.slice(2)\n : localSkillDir;\n\n return `~/${normalized}`;\n}\n\nconst bundledSkillTemplateIds = [\"poe-generate.md\"] as const;\n\nexport async function configure(agentId: string, options: ApplyOptions): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillDir,\n label: `Ensure directory ${skillDir}`\n }),\n ...bundledSkillTemplateIds.map((templateId) =>\n templateMutation.write({\n target: `${skillDir}/${templateId}`,\n templateId,\n label: `Write bundled skill ${templateId} to ${skillDir}`\n })\n )\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: createTemplateLoader()\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n options: ApplyOptions & { force?: boolean }\n): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.removeDirectory({\n path: skillDir,\n force: options.force,\n label: `Remove skills directory ${skillDir}`\n })\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport type InstallSkillOptions = {\n fs: ApplyOptions[\"fs\"];\n cwd: string;\n homeDir: string;\n scope: ApplyOptions[\"scope\"];\n dryRun?: boolean;\n observers?: ApplyOptions[\"observers\"];\n};\n\nexport type InstallSkillResult = {\n skillPath: string;\n displayPath: string;\n};\n\nconst SKILL_TEMPLATE_ID = \"__skill_content__\";\n\n/**\n * Install a skill for an agent.\n * Creates folder structure: skillDir/<skill.name>/SKILL.md\n */\nexport async function installSkill(\n agentId: string,\n skill: SkillFile,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"local\";\n const config = support.config!;\n\n // Use home-relative paths for mutations (same pattern as configure/unconfigure)\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const skillFolderPath = `${skillDir}/${skill.name}`;\n const skillFilePath = `${skillFolderPath}/SKILL.md`;\n const displayPath = `${scope === \"global\" ? config.globalSkillDir : config.localSkillDir}/${skill.name}/SKILL.md`;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillFolderPath,\n label: `Ensure skill directory ${skill.name}`\n }),\n templateMutation.write({\n target: skillFilePath,\n templateId: SKILL_TEMPLATE_ID,\n label: `Write skill ${skill.name}`\n })\n ],\n {\n fs: options.fs,\n homeDir: scope === \"global\" ? options.homeDir : options.cwd,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: async (templateId) => {\n if (templateId === SKILL_TEMPLATE_ID) {\n return skill.content;\n }\n throw new Error(`Unknown template: ${templateId}`);\n }\n }\n );\n\n return { skillPath: skillFilePath, displayPath };\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { readFile } from \"node:fs/promises\";\nimport { UserError } from \"@poe-code/cmdkit\";\nimport {\n getAgentConfig,\n resolveAgentSupport as resolveSkillAgentSupport,\n supportedAgents as skillSupportedAgents\n} from \"@poe-code/agent-skill-config\";\n\nexport type TerminalPilotInstallerFileSystem = {\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n writeFile(\n path: string,\n content: string,\n options?: { encoding: \"utf8\" }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<void>;\n unlink(path: string): Promise<void>;\n rm?(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n stat(path: string): Promise<{ mode?: number }>;\n readdir(path: string): Promise<string[]>;\n chmod?(path: string, mode: number): Promise<void>;\n};\n\nexport type TerminalPilotInstallScope = \"global\" | \"local\";\nexport type TerminalPilotInstallerPlatform = \"darwin\" | \"linux\" | \"win32\";\n\nexport const DEFAULT_INSTALL_AGENT = \"claude-code\";\nexport const DEFAULT_INSTALL_SCOPE: TerminalPilotInstallScope = \"local\";\nexport const TERMINAL_PILOT_SKILL_NAME = \"terminal-pilot\";\nexport const installableAgents = skillSupportedAgents;\n\nexport type TerminalPilotInstallerServices = {\n fs?: TerminalPilotInstallerFileSystem;\n cwd?: string;\n homeDir?: string;\n platform?: TerminalPilotInstallerPlatform;\n};\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nexport function resolveInstallerServices(\n installer: TerminalPilotInstallerServices | undefined\n): Required<TerminalPilotInstallerServices> {\n return {\n fs: installer?.fs ?? (nodeFs as TerminalPilotInstallerFileSystem),\n cwd: installer?.cwd ?? process.cwd(),\n homeDir: installer?.homeDir ?? os.homedir(),\n platform: installer?.platform ?? (process.platform as TerminalPilotInstallerPlatform)\n };\n}\n\nfunction throwUnsupportedAgent(agent: string): never {\n throw new UserError(`Unsupported agent: ${agent}`);\n}\n\nexport function resolveInstallableAgent(agent: string): string {\n const skillSupport = resolveSkillAgentSupport(agent);\n\n if (\n skillSupport.status !== \"supported\" ||\n !skillSupport.id\n ) {\n throwUnsupportedAgent(agent);\n }\n\n return skillSupport.id;\n}\n\nexport function resolveInstallScope(input: {\n local?: boolean;\n global?: boolean;\n}): TerminalPilotInstallScope {\n if (input.local && input.global) {\n throw new UserError(\"Use either --local or --global, not both.\");\n }\n\n if (input.local) {\n return \"local\";\n }\n\n if (input.global) {\n return \"global\";\n }\n\n return DEFAULT_INSTALL_SCOPE;\n}\n\nlet terminalPilotTemplateCache: string | undefined;\n\nexport async function loadTerminalPilotTemplate(): Promise<string> {\n if (terminalPilotTemplateCache !== undefined) {\n return terminalPilotTemplateCache;\n }\n\n const candidates = [\n new URL(\"./templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../../../agent-skill-config/src/templates/terminal-pilot.md\", import.meta.url)\n ];\n\n for (const candidate of candidates) {\n try {\n terminalPilotTemplateCache = await readFile(candidate, \"utf8\");\n return terminalPilotTemplateCache;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n throw new UserError(\"terminal-pilot skill template is missing.\");\n}\n\nfunction resolveHomeRelativePath(targetPath: string, homeDir: string): string {\n if (targetPath === \"~\") {\n return homeDir;\n }\n\n if (targetPath.startsWith(\"~/\")) {\n return path.join(homeDir, targetPath.slice(2));\n }\n\n return targetPath;\n}\n\nexport function getSkillFolderWithHome(\n agent: string,\n scope: TerminalPilotInstallScope,\n cwd: string,\n homeDir: string\n): {\n displayPath: string;\n fullPath: string;\n} {\n const config = getAgentConfig(agent);\n\n if (!config) {\n throwUnsupportedAgent(agent);\n }\n\n return {\n displayPath: path.join(\n scope === \"global\" ? config.globalSkillDir : config.localSkillDir,\n TERMINAL_PILOT_SKILL_NAME\n ),\n fullPath: path.join(\n scope === \"global\"\n ? resolveHomeRelativePath(config.globalSkillDir, homeDir)\n : path.resolve(cwd, config.localSkillDir),\n TERMINAL_PILOT_SKILL_NAME\n )\n };\n}\n\nexport async function removeSkillFolder(\n fs: TerminalPilotInstallerFileSystem,\n folderPath: string\n): Promise<boolean> {\n try {\n await fs.stat(folderPath);\n } catch (error) {\n if (isNotFoundError(error)) {\n return false;\n }\n throw error;\n }\n\n if (typeof fs.rm !== \"function\") {\n throw new UserError(\"The configured filesystem does not support removing directories.\");\n }\n\n await fs.rm(folderPath, { recursive: true, force: true });\n return true;\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { defineCommand, S } from \"@poe-code/cmdkit\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n installableAgents,\n loadTerminalPilotTemplate,\n resolveInstallScope,\n resolveInstallableAgent,\n resolveInstallerServices,\n TERMINAL_PILOT_SKILL_NAME\n} from \"./installer.js\";\n\nconst params = S.Object({\n agent: S.Enum(installableAgents as [string, ...string[]], {\n description: \"Agent to install terminal-pilot for\",\n default: DEFAULT_INSTALL_AGENT\n }),\n local: S.Optional(S.Boolean({ description: \"Install the skill in the current project\" })),\n global: S.Optional(S.Boolean({ description: \"Install the skill in the user home directory\" }))\n});\n\nexport const install = defineCommand<\n TerminalPilotCommandServices,\n \"install\",\n typeof params,\n undefined,\n {\n agent: string;\n scope: \"local\" | \"global\";\n skillPath: string;\n },\n readonly [\"cli\"]\n>({\n name: \"install\",\n description: \"Install the terminal-pilot CLI skill.\",\n scope: [\"cli\"],\n positional: [\"agent\"],\n params,\n handler: async ({ params, terminalPilotInstaller }) => {\n const services = resolveInstallerServices(terminalPilotInstaller);\n const agent = resolveInstallableAgent(params.agent);\n const scope = resolveInstallScope(params);\n const template = await loadTerminalPilotTemplate();\n\n const skillResult = await installSkill(\n agent,\n {\n name: TERMINAL_PILOT_SKILL_NAME,\n content: template\n },\n {\n fs: services.fs,\n cwd: services.cwd,\n homeDir: services.homeDir,\n scope\n }\n );\n\n return {\n agent,\n scope,\n skillPath: skillResult.displayPath\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({});\n\nexport const listSessions = defineCommand<\n TerminalPilotCommandServices,\n \"list-sessions\",\n typeof params,\n undefined,\n { sessions: Array<{ session: string; command: string; pid: number }> },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"list-sessions\",\n description: \"List active terminal sessions\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ terminalPilotRuntime }) => {\n const sessions = await getTerminalPilotRuntime(terminalPilotRuntime).listSessions();\n return {\n sessions: sessions.map((namedSession) => ({\n session: namedSession.name,\n command: namedSession.session.command,\n pid: namedSession.session.pid\n }))\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n key: S.String({ description: \"Named key to press\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const pressKey = defineCommand<\n TerminalPilotCommandServices,\n \"press-key\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"press-key\",\n description: \"Send a named key press to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"key\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.press(params.key as never);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n last: S.Optional(S.Number({ short: \"n\", description: \"Return only the last N lines\" }))\n});\n\nexport const readHistory = defineCommand<\n TerminalPilotCommandServices,\n \"read-history\",\n typeof params,\n undefined,\n { lines: string[]; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-history\",\n description: \"Read terminal output history\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const lines = await namedSession.session.history({ last: params.last });\n return { lines, exitCode: namedSession.session.exitCode };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\ntype ReadScreenResult = {\n lines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n exitCode: number | null;\n};\n\nexport const readScreen = defineCommand<\n TerminalPilotCommandServices,\n \"read-screen\",\n typeof params,\n undefined,\n ReadScreenResult,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-screen\",\n description: \"Read the current visible terminal screen\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n return {\n lines: [...screen.lines],\n cursor: { ...screen.cursor },\n size: { ...screen.size },\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n cols: S.Number({ description: \"Terminal width in columns\" }),\n rows: S.Number({ description: \"Terminal height in rows\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const resize = defineCommand<\n TerminalPilotCommandServices,\n \"resize\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"resize\",\n description: \"Resize an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.resize(params.cols, params.rows);\n return undefined;\n }\n});\n", "import { writeFile } from \"node:fs/promises\";\nimport { parseAnsi } from \"./ansi-parser.js\";\nimport { renderPng } from \"./png-renderer.js\";\nimport { renderSvg } from \"./svg-renderer.js\";\n\nexport interface TerminalPngOptions {\n padding?: number;\n window?: boolean;\n output?: string;\n}\n\nexport async function renderTerminalPng(\n ansiText: string,\n options: TerminalPngOptions = {}\n): Promise<Buffer> {\n const runs = parseAnsi(ansiText);\n const svg = renderSvg(runs, {\n padding: options.padding,\n window: options.window\n });\n const png = renderPng(svg);\n\n if (options.output) {\n await writeFile(options.output, png);\n }\n\n return png;\n}\n\nexport * from \"./ansi-parser.js\";\nexport * from \"./font.js\";\nexport * from \"./png-renderer.js\";\nexport * from \"./svg-renderer.js\";\n", "export type Color =\n | { type: \"ansi4\"; index: number }\n | { type: \"ansi8\"; index: number }\n | { type: \"rgb\"; r: number; g: number; b: number };\n\nexport type StyledRun = {\n text: string;\n fg: Color | null;\n bg: Color | null;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n dim: boolean;\n};\n\ntype StyleState = Omit<StyledRun, \"text\">;\n\nconst ESC = \"\\u001b\";\n\nfunction createDefaultStyle(): StyleState {\n return {\n fg: null,\n bg: null,\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false,\n dim: false\n };\n}\n\nfunction cloneStyle(style: StyleState): StyleState {\n return { ...style };\n}\n\nfunction stylesEqual(left: StyleState, right: StyleState): boolean {\n return (\n left.bold === right.bold &&\n left.italic === right.italic &&\n left.underline === right.underline &&\n left.strikethrough === right.strikethrough &&\n left.dim === right.dim &&\n colorsEqual(left.fg, right.fg) &&\n colorsEqual(left.bg, right.bg)\n );\n}\n\nfunction colorsEqual(left: Color | null, right: Color | null): boolean {\n if (left === right) {\n return true;\n }\n\n if (!left || !right || left.type !== right.type) {\n return false;\n }\n\n if (left.type === \"rgb\" && right.type === \"rgb\") {\n return left.r === right.r && left.g === right.g && left.b === right.b;\n }\n\n if ((left.type === \"ansi4\" || left.type === \"ansi8\") && left.type === right.type) {\n return left.index === right.index;\n }\n\n return false;\n}\n\nfunction pushRun(runs: StyledRun[], style: StyleState, text: string): void {\n if (text.length === 0) {\n return;\n }\n\n const previous = runs.at(-1);\n if (previous && text !== \"\\n\" && previous.text !== \"\\n\" && stylesEqual(previous, style)) {\n previous.text += text;\n return;\n }\n\n runs.push({\n text,\n fg: style.fg,\n bg: style.bg,\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n strikethrough: style.strikethrough,\n dim: style.dim\n });\n}\n\nfunction parseCsi(input: string, start: number): { end: number; final: string | null; params: string } {\n let index = start + 2;\n\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return {\n end: index + 1,\n final: input[index],\n params: input.slice(start + 2, index)\n };\n }\n\n index += 1;\n }\n\n return {\n end: input.length,\n final: null,\n params: input.slice(start + 2)\n };\n}\n\nfunction toInteger(value: string | undefined): number | null {\n if (!value || value.length === 0) {\n return null;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return null;\n }\n }\n\n return Number.parseInt(value, 10);\n}\n\nfunction clampByte(value: number): number {\n if (value < 0) {\n return 0;\n }\n\n if (value > 255) {\n return 255;\n }\n\n return value;\n}\n\nfunction applyExtendedColor(\n params: number[],\n start: number\n): { color: Color | null; consumed: number } | null {\n const mode = params[start];\n if (mode === 5) {\n const index = params[start + 1];\n if (index === undefined) {\n return null;\n }\n\n return {\n color: { type: \"ansi8\", index: clampByte(index) },\n consumed: 2\n };\n }\n\n if (mode === 2) {\n const r = params[start + 1];\n const g = params[start + 2];\n const b = params[start + 3];\n if (r === undefined || g === undefined || b === undefined) {\n return null;\n }\n\n return {\n color: { type: \"rgb\", r: clampByte(r), g: clampByte(g), b: clampByte(b) },\n consumed: 4\n };\n }\n\n return null;\n}\n\nfunction applySgr(style: StyleState, paramsText: string): StyleState {\n const nextStyle = cloneStyle(style);\n const rawParams = paramsText.length === 0 ? [\"0\"] : paramsText.split(\";\");\n const params: number[] = [];\n\n for (const rawParam of rawParams) {\n const value = toInteger(rawParam);\n if (value === null) {\n return nextStyle;\n }\n\n params.push(value);\n }\n\n for (let index = 0; index < params.length; index += 1) {\n const value = params[index];\n\n if (value === 0) {\n Object.assign(nextStyle, createDefaultStyle());\n continue;\n }\n\n if (value === 1) {\n nextStyle.bold = true;\n continue;\n }\n\n if (value === 2) {\n nextStyle.dim = true;\n continue;\n }\n\n if (value === 22) {\n nextStyle.bold = false;\n nextStyle.dim = false;\n continue;\n }\n\n if (value === 3) {\n nextStyle.italic = true;\n continue;\n }\n\n if (value === 23) {\n nextStyle.italic = false;\n continue;\n }\n\n if (value === 4) {\n nextStyle.underline = true;\n continue;\n }\n\n if (value === 24) {\n nextStyle.underline = false;\n continue;\n }\n\n if (value === 9) {\n nextStyle.strikethrough = true;\n continue;\n }\n\n if (value === 29) {\n nextStyle.strikethrough = false;\n continue;\n }\n\n if (value === 39) {\n nextStyle.fg = null;\n continue;\n }\n\n if (value === 49) {\n nextStyle.bg = null;\n continue;\n }\n\n if (value >= 30 && value <= 37) {\n nextStyle.fg = { type: \"ansi4\", index: value - 30 };\n continue;\n }\n\n if (value >= 90 && value <= 97) {\n nextStyle.fg = { type: \"ansi4\", index: value - 90 + 8 };\n continue;\n }\n\n if (value >= 40 && value <= 47) {\n nextStyle.bg = { type: \"ansi4\", index: value - 40 };\n continue;\n }\n\n if (value >= 100 && value <= 107) {\n nextStyle.bg = { type: \"ansi4\", index: value - 100 + 8 };\n continue;\n }\n\n if (value === 38 || value === 48) {\n const extended = applyExtendedColor(params, index + 1);\n if (!extended) {\n continue;\n }\n\n if (value === 38) {\n nextStyle.fg = extended.color;\n } else {\n nextStyle.bg = extended.color;\n }\n\n index += extended.consumed;\n }\n }\n\n return nextStyle;\n}\n\nexport function parseAnsi(input: string): StyledRun[] {\n const runs: StyledRun[] = [];\n let style = createDefaultStyle();\n let textStart = 0;\n let index = 0;\n\n while (index < input.length) {\n const char = input[index];\n\n if (char === \"\\n\") {\n pushRun(runs, style, input.slice(textStart, index));\n pushRun(runs, style, \"\\n\");\n index += 1;\n textStart = index;\n continue;\n }\n\n if (char === ESC && input[index + 1] === \"[\") {\n pushRun(runs, style, input.slice(textStart, index));\n const sequence = parseCsi(input, index);\n\n if (sequence.final === \"m\") {\n style = applySgr(style, sequence.params);\n }\n\n index = sequence.end;\n textStart = index;\n continue;\n }\n\n index += 1;\n }\n\n pushRun(runs, style, input.slice(textStart));\n\n return runs;\n}\n", "import { Resvg } from \"@resvg/resvg-js\";\nimport { JETBRAINS_MONO_FONT_FILES } from \"./font.js\";\n\nexport function renderPng(svg: string): Buffer {\n const resvg = new Resvg(svg, {\n font: {\n defaultFontFamily: \"JetBrains Mono\",\n fontFiles: [...JETBRAINS_MONO_FONT_FILES],\n loadSystemFonts: false,\n monospaceFamily: \"JetBrains Mono\"\n },\n fitTo: {\n mode: \"zoom\",\n value: 4\n }\n });\n const png = resvg.render();\n return Buffer.from(png.asPng());\n}\n", "import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\n\n// Full JetBrains Mono (all Unicode blocks including box-drawing and geometric shapes).\n// The @fontsource subsets only cover Latin and miss characters used by the design system.\nconst fontPackageRoot = dirname(require.resolve(\"jetbrains-mono/package.json\"));\nconst webfontRoot = join(fontPackageRoot, \"fonts/webfonts\");\n\nfunction readWebfontBase64(filename: string): string {\n return readFileSync(join(webfontRoot, filename)).toString(\"base64\");\n}\n\nfunction resolveAssetPath(filename: string): string {\n return fileURLToPath(new URL(`../assets/${filename}`, import.meta.url));\n}\n\nfunction createFontFace(base64: string, weight: 400 | 700, style: \"normal\" | \"italic\"): string {\n return `@font-face {\n font-family: 'JetBrains Mono';\n font-style: ${style};\n font-weight: ${weight};\n src: url('data:font/woff2;base64,${base64}') format('woff2');\n}`;\n}\n\nexport const JETBRAINS_MONO_BASE64 = readWebfontBase64(\"JetBrainsMono-Regular.woff2\");\nexport const JETBRAINS_MONO_FONT_FILES = [\n resolveAssetPath(\"jetbrains-mono-400-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-400-italic.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-italic.ttf\")\n] as const;\nexport const JETBRAINS_MONO_TTF_PATH = JETBRAINS_MONO_FONT_FILES[0];\n\nexport const FONT_FACE_CSS = [\n createFontFace(JETBRAINS_MONO_BASE64, 400, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Bold.woff2\"), 700, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Italic.woff2\"), 400, \"italic\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-BoldItalic.woff2\"), 700, \"italic\")\n].join(\"\\n\");\n", "import type { Color, StyledRun } from \"./ansi-parser.js\";\nimport { FONT_FACE_CSS } from \"./font.js\";\n\nexport interface SvgOptions {\n padding?: number;\n window?: boolean;\n}\n\nconst ANSI_16_PALETTE = [\n \"#282a2e\",\n \"#D74E6F\",\n \"#31BB71\",\n \"#D3E561\",\n \"#8056FF\",\n \"#ED61D7\",\n \"#04D7D7\",\n \"#C5C8C6\",\n \"#4B4B4B\",\n \"#FE5F86\",\n \"#00D787\",\n \"#EBFF71\",\n \"#8F69FF\",\n \"#FF7AEA\",\n \"#00FEFE\",\n \"#FFFFFF\"\n] as const;\n\nconst XTERM_256_PALETTE = [\n \"#000000\", \"#800000\", \"#008000\", \"#808000\", \"#000080\", \"#800080\", \"#008080\", \"#c0c0c0\",\n \"#808080\", \"#ff0000\", \"#00ff00\", \"#ffff00\", \"#0000ff\", \"#ff00ff\", \"#00ffff\", \"#ffffff\",\n \"#000000\", \"#00005f\", \"#000087\", \"#0000af\", \"#0000d7\", \"#0000ff\", \"#005f00\", \"#005f5f\",\n \"#005f87\", \"#005faf\", \"#005fd7\", \"#005fff\", \"#008700\", \"#00875f\", \"#008787\", \"#0087af\",\n \"#0087d7\", \"#0087ff\", \"#00af00\", \"#00af5f\", \"#00af87\", \"#00afaf\", \"#00afd7\", \"#00afff\",\n \"#00d700\", \"#00d75f\", \"#00d787\", \"#00d7af\", \"#00d7d7\", \"#00d7ff\", \"#00ff00\", \"#00ff5f\",\n \"#00ff87\", \"#00ffaf\", \"#00ffd7\", \"#00ffff\", \"#5f0000\", \"#5f005f\", \"#5f0087\", \"#5f00af\",\n \"#5f00d7\", \"#5f00ff\", \"#5f5f00\", \"#5f5f5f\", \"#5f5f87\", \"#5f5faf\", \"#5f5fd7\", \"#5f5fff\",\n \"#5f8700\", \"#5f875f\", \"#5f8787\", \"#5f87af\", \"#5f87d7\", \"#5f87ff\", \"#5faf00\", \"#5faf5f\",\n \"#5faf87\", \"#5fafaf\", \"#5fafd7\", \"#5fafff\", \"#5fd700\", \"#5fd75f\", \"#5fd787\", \"#5fd7af\",\n \"#5fd7d7\", \"#5fd7ff\", \"#5fff00\", \"#5fff5f\", \"#5fff87\", \"#5fffaf\", \"#5fffd7\", \"#5fffff\",\n \"#870000\", \"#87005f\", \"#870087\", \"#8700af\", \"#8700d7\", \"#8700ff\", \"#875f00\", \"#875f5f\",\n \"#875f87\", \"#875faf\", \"#875fd7\", \"#875fff\", \"#878700\", \"#87875f\", \"#878787\", \"#8787af\",\n \"#8787d7\", \"#8787ff\", \"#87af00\", \"#87af5f\", \"#87af87\", \"#87afaf\", \"#87afd7\", \"#87afff\",\n \"#87d700\", \"#87d75f\", \"#87d787\", \"#87d7af\", \"#87d7d7\", \"#87d7ff\", \"#87ff00\", \"#87ff5f\",\n \"#87ff87\", \"#87ffaf\", \"#87ffd7\", \"#87ffff\", \"#af0000\", \"#af005f\", \"#af0087\", \"#af00af\",\n \"#af00d7\", \"#af00ff\", \"#af5f00\", \"#af5f5f\", \"#af5f87\", \"#af5faf\", \"#af5fd7\", \"#af5fff\",\n \"#af8700\", \"#af875f\", \"#af8787\", \"#af87af\", \"#af87d7\", \"#af87ff\", \"#afaf00\", \"#afaf5f\",\n \"#afaf87\", \"#afafaf\", \"#afafd7\", \"#afafff\", \"#afd700\", \"#afd75f\", \"#afd787\", \"#afd7af\",\n \"#afd7d7\", \"#afd7ff\", \"#afff00\", \"#afff5f\", \"#afff87\", \"#afffaf\", \"#afffd7\", \"#afffff\",\n \"#d70000\", \"#d7005f\", \"#d70087\", \"#d700af\", \"#d700d7\", \"#d700ff\", \"#d75f00\", \"#d75f5f\",\n \"#d75f87\", \"#d75faf\", \"#d75fd7\", \"#d75fff\", \"#d78700\", \"#d7875f\", \"#d78787\", \"#d787af\",\n \"#d787d7\", \"#d787ff\", \"#d7af00\", \"#d7af5f\", \"#d7af87\", \"#d7afaf\", \"#d7afd7\", \"#d7afff\",\n \"#d7d700\", \"#d7d75f\", \"#d7d787\", \"#d7d7af\", \"#d7d7d7\", \"#d7d7ff\", \"#d7ff00\", \"#d7ff5f\",\n \"#d7ff87\", \"#d7ffaf\", \"#d7ffd7\", \"#d7ffff\", \"#ff0000\", \"#ff005f\", \"#ff0087\", \"#ff00af\",\n \"#ff00d7\", \"#ff00ff\", \"#ff5f00\", \"#ff5f5f\", \"#ff5f87\", \"#ff5faf\", \"#ff5fd7\", \"#ff5fff\",\n \"#ff8700\", \"#ff875f\", \"#ff8787\", \"#ff87af\", \"#ff87d7\", \"#ff87ff\", \"#ffaf00\", \"#ffaf5f\",\n \"#ffaf87\", \"#ffafaf\", \"#ffafd7\", \"#ffafff\", \"#ffd700\", \"#ffd75f\", \"#ffd787\", \"#ffd7af\",\n \"#ffd7d7\", \"#ffd7ff\", \"#ffff00\", \"#ffff5f\", \"#ffff87\", \"#ffffaf\", \"#ffffd7\", \"#ffffff\",\n \"#080808\", \"#121212\", \"#1c1c1c\", \"#262626\", \"#303030\", \"#3a3a3a\", \"#444444\", \"#4e4e4e\",\n \"#585858\", \"#606060\", \"#666666\", \"#767676\", \"#808080\", \"#8a8a8a\", \"#949494\", \"#9e9e9e\",\n \"#a8a8a8\", \"#b2b2b2\", \"#bcbcbc\", \"#c6c6c6\", \"#d0d0d0\", \"#dadada\", \"#e4e4e4\", \"#eeeeee\"\n] as const;\n\nconst BACKGROUND = \"#171717\";\nconst DEFAULT_FOREGROUND = \"#c4c4c4\";\nconst FONT_FAMILY = \"JetBrains Mono\";\nconst FONT_SIZE = 14;\nconst LINE_HEIGHT = 1.2;\nconst CHARACTER_WIDTH = 8.412666666666667;\nconst TEXT_BOTTOM_PADDING = 11.6;\nconst DEFAULT_PADDING = {\n top: 20,\n right: 40,\n bottom: 20,\n left: 20\n};\nconst WINDOW_BAR_HEIGHT = 15;\n\nexport function renderSvg(runs: StyledRun[], options: SvgOptions = {}): string {\n const padding = options.padding === undefined\n ? DEFAULT_PADDING\n : {\n top: options.padding,\n right: options.padding,\n bottom: options.padding,\n left: options.padding\n };\n const showWindow = options.window ?? true;\n const titleBarHeight = showWindow ? WINDOW_BAR_HEIGHT : 0;\n const textStartX = padding.left;\n const lineHeightPx = FONT_SIZE * LINE_HEIGHT;\n const textStartY = titleBarHeight + padding.top + lineHeightPx;\n const lines = splitIntoLines(runs);\n const contentWidth = measureLines(lines);\n const width = padding.left + contentWidth + padding.right;\n const height =\n titleBarHeight + padding.top + (lines.length * lineHeightPx) + padding.bottom + TEXT_BOTTOM_PADDING;\n const svgWidth = formatNumber(width);\n const svgHeight = formatNumber(height);\n const viewBox = `0 0 ${svgWidth} ${svgHeight}`;\n const textElements = renderLines(lines, textStartX, textStartY, lineHeightPx);\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${svgWidth}\" height=\"${svgHeight}\" viewBox=\"${viewBox}\">`,\n \"<defs>\",\n \"<style><![CDATA[\",\n FONT_FACE_CSS,\n \"]]></style>\",\n \"</defs>\",\n `<rect x=\"0\" y=\"0\" width=\"${svgWidth}\" height=\"${svgHeight}\" fill=\"${BACKGROUND}\" />`,\n showWindow ? renderWindowControls() : \"\",\n `<g font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(FONT_SIZE)}px\" fill=\"${DEFAULT_FOREGROUND}\">`,\n textElements,\n \"</g>\",\n \"</svg>\"\n ].join(\"\");\n}\n\nfunction splitIntoLines(runs: StyledRun[]): StyledRun[][] {\n const lines: StyledRun[][] = [[]];\n\n for (const run of runs) {\n if (run.text === \"\\n\") {\n lines.push([]);\n continue;\n }\n\n lines[lines.length - 1]?.push(run);\n }\n\n return lines;\n}\n\nfunction measureLines(lines: StyledRun[][]): number {\n return Math.max(\n ...lines.map(line => line.reduce((width, run) => width + (displayWidth(run.text) * CHARACTER_WIDTH), 0)),\n 0\n );\n}\n\nfunction displayWidth(text: string): number {\n const segmenter = new Intl.Segmenter();\n let width = 0;\n\n for (const { segment } of segmenter.segment(text)) {\n const cp = segment.codePointAt(0);\n width += cp !== undefined && isWideCodePoint(cp) ? 2 : 1;\n }\n\n return width;\n}\n\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115F) || // Hangul Jamo\n cp === 0x2329 || cp === 0x232A || // Angle brackets\n (cp >= 0x2E80 && cp <= 0x303E) || // CJK Radicals, Kangxi\n (cp >= 0x3041 && cp <= 0x33BF) || // Hiragana, Katakana, CJK symbols\n (cp >= 0x3400 && cp <= 0x4DBF) || // CJK Extension A\n (cp >= 0x4E00 && cp <= 0xA4CF) || // CJK Unified Ideographs\n (cp >= 0xA960 && cp <= 0xA97F) || // Hangul Jamo Extended-A\n (cp >= 0xAC00 && cp <= 0xD7AF) || // Hangul Syllables\n (cp >= 0xF900 && cp <= 0xFAFF) || // CJK Compatibility Ideographs\n (cp >= 0xFE10 && cp <= 0xFE19) || // Vertical Forms\n (cp >= 0xFE30 && cp <= 0xFE6F) || // CJK Compatibility Forms\n (cp >= 0xFF00 && cp <= 0xFF60) || // Fullwidth Latin, Halfwidth Katakana\n (cp >= 0xFFE0 && cp <= 0xFFE6) || // Fullwidth Signs\n (cp >= 0x1B000 && cp <= 0x1B0FF) || // Kana Supplement\n (cp >= 0x1F004 && cp <= 0x1F004) || // Mahjong tile\n (cp >= 0x1F0CF && cp <= 0x1F0CF) || // Playing card black joker\n (cp >= 0x1F200 && cp <= 0x1FFFD) || // Enclosed CJK + Emoji\n (cp >= 0x20000 && cp <= 0x2FFFD) || // CJK Extension B\u2013F\n (cp >= 0x30000 && cp <= 0x3FFFD) // CJK Extension G\u2013H\n );\n}\n\nfunction renderLines(\n lines: StyledRun[][],\n textStartX: number,\n textStartY: number,\n lineHeightPx: number\n): string {\n return lines\n .map((line, index) => {\n const y = formatNumber(textStartY + (index * lineHeightPx));\n\n if (line.length === 0) {\n return `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\"/>`;\n }\n\n return [\n `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\">`,\n line.map(renderRun).join(\"\"),\n \"</text>\"\n ].join(\"\");\n })\n .join(\"\");\n}\n\nfunction renderRun(run: StyledRun): string {\n const attributes = ['xml:space=\"preserve\"'];\n const color = resolveColor(run.fg);\n const textDecorations: string[] = [];\n\n if (color !== DEFAULT_FOREGROUND) {\n attributes.push(`fill=\"${escapeXmlAttribute(color)}\"`);\n }\n\n if (run.bold) {\n attributes.push('font-weight=\"bold\"');\n }\n\n if (run.italic) {\n attributes.push('font-style=\"italic\"');\n }\n\n if (run.underline) {\n textDecorations.push(\"underline\");\n }\n\n if (run.strikethrough) {\n textDecorations.push(\"line-through\");\n }\n\n if (textDecorations.length > 0) {\n attributes.push(`text-decoration=\"${textDecorations.join(\" \")}\"`);\n }\n\n if (run.dim) {\n attributes.push('opacity=\"0.7\"');\n }\n\n return `<tspan ${attributes.join(\" \")}>${escapeXmlText(run.text)}</tspan>`;\n}\n\nfunction renderWindowControls(): string {\n return [\n '<circle cx=\"13.5\" cy=\"12\" r=\"5.5\" fill=\"#FF5A54\" />',\n '<circle cx=\"32.5\" cy=\"12\" r=\"5.5\" fill=\"#E6BF29\" />',\n '<circle cx=\"51.5\" cy=\"12\" r=\"5.5\" fill=\"#52C12B\" />'\n ].join(\"\");\n}\n\nfunction resolveColor(color: Color | null): string {\n if (color === null) {\n return DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi4\") {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi8\") {\n if (color.index < ANSI_16_PALETTE.length) {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return XTERM_256_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return `rgb(${color.r},${color.g},${color.b})`;\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \"&quot;\").replaceAll(\"'\", \"&apos;\");\n}\n\nfunction formatNumber(value: number): string {\n return value.toFixed(2);\n}\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { renderTerminalPng } from \"terminal-png\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n output: S.String({ short: \"o\", description: \"Path to the output PNG file\" }),\n window: S.Optional(S.Boolean({ description: \"Include terminal window chrome\", default: true })),\n padding: S.Optional(S.Number({ short: \"p\", description: \"Padding around terminal content\" }))\n});\n\nexport const screenshot = defineCommand<\n TerminalPilotCommandServices,\n \"screenshot\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\"]\n>({\n name: \"screenshot\",\n description: \"Capture the current terminal screen as a PNG image\",\n scope: [\"cli\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n\n await renderTerminalPng(screen.rawLines.join(\"\\n\"), {\n output: params.output,\n window: params.window,\n padding: params.padding\n });\n\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n signal: S.String({ description: \"Signal to send to the session process\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const sendSignal = defineCommand<\n TerminalPilotCommandServices,\n \"send-signal\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"send-signal\",\n description: \"Send a process signal to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"signal\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.signal(params.signal);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n text: S.String({ description: \"Text to write to the session\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const type = defineCommand<\n TerminalPilotCommandServices,\n \"type\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"type\",\n description: \"Write text to an active terminal session character-by-character with delay\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.type(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n getSkillFolderWithHome,\n installableAgents,\n removeSkillFolder,\n resolveInstallableAgent,\n resolveInstallerServices\n} from \"./installer.js\";\n\nconst params = S.Object({\n agent: S.Enum(installableAgents as [string, ...string[]], {\n description: \"Agent to uninstall terminal-pilot from\",\n default: DEFAULT_INSTALL_AGENT\n })\n});\n\nexport const uninstall = defineCommand<\n TerminalPilotCommandServices,\n \"uninstall\",\n typeof params,\n undefined,\n {\n agent: string;\n removedSkillPaths: string[];\n },\n readonly [\"cli\"]\n>({\n name: \"uninstall\",\n description: \"Remove the terminal-pilot CLI skill.\",\n scope: [\"cli\"],\n positional: [\"agent\"],\n params,\n handler: async ({ params, terminalPilotInstaller }) => {\n const services = resolveInstallerServices(terminalPilotInstaller);\n const agent = resolveInstallableAgent(params.agent);\n const localSkill = getSkillFolderWithHome(\n agent,\n \"local\",\n services.cwd,\n services.homeDir\n );\n const globalSkill = getSkillFolderWithHome(\n agent,\n \"global\",\n services.cwd,\n services.homeDir\n );\n const removedSkillPaths: string[] = [];\n\n if (await removeSkillFolder(services.fs, localSkill.fullPath)) {\n removedSkillPaths.push(localSkill.displayPath);\n }\n\n if (await removeSkillFolder(services.fs, globalSkill.fullPath)) {\n removedSkillPaths.push(globalSkill.displayPath);\n }\n\n return {\n agent,\n removedSkillPaths\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n pattern: S.String({ description: \"Regular expression pattern to wait for\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" })),\n literal: S.Optional(\n S.Boolean({\n short: \"l\",\n description: \"When true, treat pattern as a literal string instead of a regex\"\n })\n )\n});\n\nexport const waitFor = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for\",\n typeof params,\n undefined,\n { matched: true; line: string },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for\",\n description: \"Wait for terminal output to match a pattern\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"pattern\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const pattern = params.literal === true ? params.pattern : new RegExp(params.pattern);\n const line =\n params.timeout === undefined\n ? await namedSession.session.waitFor(pattern)\n : await namedSession.session.waitFor(pattern, { timeout: params.timeout });\n\n return { matched: true, line };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" }))\n});\n\nexport const waitForExit = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for-exit\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for-exit\",\n description: \"Wait for a terminal session process to finish\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const exitCode = await namedSession.session.waitForExit(\n params.timeout === undefined ? undefined : { timeout: params.timeout }\n );\n return { exitCode };\n }\n});\n", "import { defineGroup } from \"@poe-code/cmdkit\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport { closeSession } from \"./close-session.js\";\nimport { createSession } from \"./create-session.js\";\nimport { fill } from \"./fill.js\";\nimport { getSession } from \"./get-session.js\";\nimport { install } from \"./install.js\";\nimport { listSessions } from \"./list-sessions.js\";\nimport { pressKey } from \"./press-key.js\";\nimport { readHistory } from \"./read-history.js\";\nimport { readScreen } from \"./read-screen.js\";\nimport { resize } from \"./resize.js\";\nimport { screenshot } from \"./screenshot.js\";\nimport { sendSignal } from \"./send-signal.js\";\nimport { type } from \"./type.js\";\nimport { uninstall } from \"./uninstall.js\";\nimport { waitFor } from \"./wait-for.js\";\nimport { waitForExit } from \"./wait-for-exit.js\";\n\nexport { closeSession } from \"./close-session.js\";\nexport { createSession } from \"./create-session.js\";\nexport { fill } from \"./fill.js\";\nexport { getSession } from \"./get-session.js\";\nexport { install } from \"./install.js\";\nexport { listSessions } from \"./list-sessions.js\";\nexport { pressKey } from \"./press-key.js\";\nexport { readHistory } from \"./read-history.js\";\nexport { readScreen } from \"./read-screen.js\";\nexport { resize } from \"./resize.js\";\nexport { screenshot } from \"./screenshot.js\";\nexport { sendSignal } from \"./send-signal.js\";\nexport { type } from \"./type.js\";\nexport { uninstall } from \"./uninstall.js\";\nexport { waitFor } from \"./wait-for.js\";\nexport { waitForExit } from \"./wait-for-exit.js\";\nexport { createTerminalPilotRuntime, SESSION_ENV_VAR } from \"./runtime.js\";\nexport type { TerminalPilotCommandServices, TerminalPilotRuntime } from \"./runtime.js\";\n\nconst children = [\n install,\n uninstall,\n createSession,\n fill,\n type,\n pressKey,\n sendSignal,\n waitFor,\n waitForExit,\n readScreen,\n screenshot,\n readHistory,\n resize,\n closeSession,\n getSession,\n listSessions\n] as const;\n\nexport const terminalPilotGroup = defineGroup<TerminalPilotCommandServices, \"terminal-pilot\", typeof children, readonly [\"cli\", \"mcp\", \"sdk\"]>({\n name: \"terminal-pilot\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n children\n});\n", "import { stripAnsi } from \"../ansi.js\";\nimport { main } from \"../cli.js\";\nimport { closeSharedTerminalPilotRuntime } from \"../commands/runtime.js\";\n\nexport type TerminalPilotCliRunResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport type TerminalPilotCliJsonRunResult<T> = {\n exitCode: number;\n stdout: T;\n stderr: string;\n};\n\nfunction appendJsonOutputFlag(args: string[]): string[] {\n if (args.includes(\"--json\") || args.includes(\"--output\") || args.some((arg) => arg.startsWith(\"--output=\"))) {\n return [...args];\n }\n\n const ddashIndex = args.indexOf(\"--\");\n\n if (ddashIndex === -1) {\n return [...args, \"--output\", \"json\"];\n }\n\n return [...args.slice(0, ddashIndex), \"--output\", \"json\", \"--\", ...args.slice(ddashIndex + 1)];\n}\n\nfunction toText(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return String(chunk);\n}\n\nfunction normalizeOutput(text: string): string {\n return stripAnsi(text).replaceAll(\"\\r\", \"\").trim();\n}\n\nfunction canParseJson(text: string): boolean {\n if (text.length === 0) {\n return false;\n }\n\n try {\n JSON.parse(text);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createTerminalPilotCliRepl() {\n return {\n async run(args: string[]): Promise<TerminalPilotCliRunResult> {\n const stdoutChunks: string[] = [];\n const stderrChunks: string[] = [];\n const originalStdoutWrite = process.stdout.write.bind(process.stdout);\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n const previousExitCode = process.exitCode;\n\n process.exitCode = 0;\n process.stdout.write = ((chunk: unknown, ...rest: unknown[]) => {\n stdoutChunks.push(toText(chunk));\n const callback = typeof rest.at(-1) === \"function\" ? (rest.at(-1) as (() => void)) : undefined;\n callback?.();\n return true;\n }) as typeof process.stdout.write;\n process.stderr.write = ((chunk: unknown, ...rest: unknown[]) => {\n stderrChunks.push(toText(chunk));\n const callback = typeof rest.at(-1) === \"function\" ? (rest.at(-1) as (() => void)) : undefined;\n callback?.();\n return true;\n }) as typeof process.stderr.write;\n\n try {\n await main([\"node\", \"terminal-pilot\", ...args]);\n } finally {\n process.stdout.write = originalStdoutWrite;\n process.stderr.write = originalStderrWrite;\n }\n\n const exitCode = process.exitCode ?? 0;\n process.exitCode = previousExitCode;\n\n let stdout = normalizeOutput(stdoutChunks.join(\"\"));\n let stderr = normalizeOutput(stderrChunks.join(\"\"));\n\n if (exitCode !== 0 && stderr.length === 0 && !canParseJson(stdout)) {\n stderr = stdout;\n stdout = \"\";\n }\n\n return {\n exitCode,\n stdout,\n stderr\n };\n },\n\n async runJson<T>(args: string[]): Promise<TerminalPilotCliJsonRunResult<T>> {\n const result = await this.run(appendJsonOutputFlag(args));\n\n if (result.exitCode !== 0) {\n return {\n exitCode: result.exitCode,\n stdout: undefined as T,\n stderr: result.stderr\n };\n }\n\n if (result.stdout.length === 0) {\n throw new Error(`Expected JSON output for terminal-pilot ${args.join(\" \")}, but stdout was empty.`);\n }\n\n return {\n exitCode: result.exitCode,\n stdout: JSON.parse(result.stdout) as T,\n stderr: result.stderr\n };\n },\n\n async close(): Promise<void> {\n await closeSharedTerminalPilotRuntime();\n }\n };\n}\n"],
5
- "mappings": "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AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;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",
6
- "names": ["ESC", "CSI", "os", "path", "fileURLToPath", "path", "fileURLToPath", "text", "chalk", "text", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "stripAnsi", "chalk", "spacing", "stripAnsi", "message", "chalk", "stripAnsi", "chalk", "AsyncLocalStorage", "chalk", "chalk", "chalk", "chalk", "EMOJI_RE", "MODIFIER_RE", "NO_TRUNCATION", "NO_TRUNCATION", "ANSI_ESCAPE_BELL", "ANSI_CSI", "ANSI_OSC", "ANSI_ESCAPE_LINK", "ANSI_OSC", "GROUP_REGEX", "ANSI_CSI", "ANSI_ESCAPE_BELL", "actions", "settings", "isWindows", "CANCEL_SYMBOL", "isCancel", "value", "chalk", "chalk", "chalk", "stripAnsi", "message", "chalk", "chalk", "chalk", "chalk", "select", "text", "confirm", "chalk", "message", "location", "separatorIndex", "previousSeparatorIndex", "candidate", "write", "payload", "path", "trimmed", "withOutputFormat", "select", "confirm", "text", "error", "message", "scenario", "params", "logger", "params", "k", "text", "require", "error", "DEFAULT_COLS", "DEFAULT_ROWS", "listSessions", "params", "params", "params", "params", "params", "path", "parse", "parse", "isConfigObject", "parse", "serialize", "merge", "prune", "isConfigObject", "parse", "serialize", "merge", "prune", "path", "path", "error", "isConfigObject", "error", "error", "Mustache", "os", "path", "readFile", "error", "os", "readFile", "path", "params", "params", "params", "params", "params", "params", "writeFile", "ESC", "text", "params", "parseAnsi", "createRequire", "dirname", "join", "fileURLToPath", "require", "text", "parseAnsi", "writeFile", "params", "params", "params", "params", "params", "params", "waitForExit", "waitForExit", "fileURLToPath", "path", "text", "path", "fileURLToPath", "os", "error", "main"]
3
+ "sources": ["../../../../node_modules/sisteransi/src/index.js", "../../src/testing/qa-cli.ts", "../../src/ansi.ts", "../../src/cli.ts", "../../../cmdkit/src/cli.ts", "../../../design-system/src/tokens/colors.ts", "../../../design-system/src/tokens/typography.ts", "../../../design-system/src/tokens/widths.ts", "../../../design-system/src/components/text.ts", "../../../design-system/src/internal/output-format.ts", "../../../design-system/src/internal/theme-detect.ts", "../../../design-system/src/components/symbols.ts", "../../../design-system/src/components/logger.ts", "../../../design-system/src/prompts/primitives/log.ts", "../../../design-system/src/internal/strip-ansi.ts", "../../../design-system/src/components/help-formatter.ts", "../../../design-system/src/components/table.ts", "../../../design-system/src/acp/components.ts", "../../../design-system/src/acp/writer.ts", "../../../design-system/src/dashboard/buffer.ts", "../../../design-system/src/dashboard/terminal.ts", "../../../design-system/src/prompts/index.ts", "../../../design-system/src/prompts/primitives/cancel.ts", "../../../../node_modules/node_modules/.pnpm/fast-string-truncated-width@1.2.1/node_modules/fast-string-truncated-width/dist/utils.js", "../../../../node_modules/node_modules/.pnpm/fast-string-truncated-width@1.2.1/node_modules/fast-string-truncated-width/dist/index.js", "../../../../node_modules/node_modules/.pnpm/fast-string-width@1.1.0/node_modules/fast-string-width/dist/index.js", "../../../../node_modules/node_modules/.pnpm/fast-wrap-ansi@0.1.3/node_modules/fast-wrap-ansi/lib/main.js", "../../../../node_modules/@clack/core/src/utils/settings.ts", "../../../../node_modules/@clack/core/src/utils/string.ts", "../../../../node_modules/@clack/core/src/utils/index.ts", "../../../../node_modules/@clack/core/src/prompts/prompt.ts", "../../../../node_modules/@clack/core/src/prompts/autocomplete.ts", "../../../../node_modules/@clack/core/src/prompts/confirm.ts", "../../../../node_modules/@clack/core/src/prompts/group-multiselect.ts", "../../../../node_modules/@clack/core/src/utils/cursor.ts", "../../../../node_modules/@clack/core/src/prompts/multi-select.ts", "../../../../node_modules/@clack/core/src/prompts/password.ts", "../../../../node_modules/@clack/core/src/prompts/select.ts", "../../../../node_modules/@clack/core/src/prompts/select-key.ts", "../../../../node_modules/@clack/core/src/prompts/text.ts", "../../../design-system/src/prompts/primitives/intro.ts", "../../../design-system/src/prompts/primitives/note.ts", "../../../design-system/src/prompts/primitives/outro.ts", "../../../design-system/src/prompts/primitives/spinner.ts", "../../../design-system/src/static/spinner.ts", "../../../design-system/src/static/menu.ts", "../../../cmdkit/src/index.ts", "../../../cmdkit-schema/src/index.ts", "../../../cmdkit/src/number-schema.ts", "../../../cmdkit/src/renderer.ts", "../../src/terminal-pilot.ts", "../../src/terminal-session.ts", "../../src/terminal-buffer.ts", "../../src/keys.ts", "../../src/terminal-screen.ts", "../../src/commands/runtime.ts", "../../src/commands/close-session.ts", "../../src/commands/create-session.ts", "../../src/commands/fill.ts", "../../src/commands/get-session.ts", "../../../agent-skill-config/src/configs.ts", "../../../agent-defs/src/agents/claude-code.ts", "../../../agent-defs/src/agents/claude-desktop.ts", "../../../agent-defs/src/agents/codex.ts", "../../../agent-defs/src/agents/opencode.ts", "../../../agent-defs/src/agents/kimi.ts", "../../../agent-defs/src/agents/goose.ts", "../../../agent-defs/src/agents/poe-agent.ts", "../../../agent-defs/src/registry.ts", "../../../config-mutations/src/mutations/file-mutation.ts", "../../../config-mutations/src/mutations/template-mutation.ts", "../../../config-mutations/src/execution/apply-mutation.ts", "../../../config-mutations/src/formats/json.ts", "../../../config-mutations/src/formats/toml.ts", "../../../config-mutations/src/formats/yaml.ts", "../../../config-mutations/src/formats/index.ts", "../../../config-mutations/src/execution/path-utils.ts", "../../../config-mutations/src/fs-utils.ts", "../../../config-mutations/src/execution/run-mutations.ts", "../../../config-mutations/src/template/render.ts", "../../../agent-skill-config/src/templates.ts", "../../../agent-skill-config/src/apply.ts", "../../src/commands/installer.ts", "../../src/commands/install.ts", "../../src/commands/list-sessions.ts", "../../src/commands/press-key.ts", "../../src/commands/read-history.ts", "../../src/commands/read-screen.ts", "../../src/commands/resize.ts", "../../../terminal-png/src/index.ts", "../../../terminal-png/src/ansi-parser.ts", "../../../terminal-png/src/png-renderer.ts", "../../../terminal-png/src/font.ts", "../../../terminal-png/src/svg-renderer.ts", "../../src/commands/screenshot.ts", "../../src/commands/send-signal.ts", "../../src/commands/type.ts", "../../src/commands/uninstall.ts", "../../src/commands/wait-for.ts", "../../src/commands/wait-for-exit.ts", "../../src/commands/index.ts", "../../src/testing/cli-repl.ts"],
4
+ "sourcesContent": ["'use strict';\n\nconst ESC = '\\x1B';\nconst CSI = `${ESC}[`;\nconst beep = '\\u0007';\n\nconst cursor = {\n to(x, y) {\n if (!y) return `${CSI}${x + 1}G`;\n return `${CSI}${y + 1};${x + 1}H`;\n },\n move(x, y) {\n let ret = '';\n\n if (x < 0) ret += `${CSI}${-x}D`;\n else if (x > 0) ret += `${CSI}${x}C`;\n\n if (y < 0) ret += `${CSI}${-y}A`;\n else if (y > 0) ret += `${CSI}${y}B`;\n\n return ret;\n },\n up: (count = 1) => `${CSI}${count}A`,\n down: (count = 1) => `${CSI}${count}B`,\n forward: (count = 1) => `${CSI}${count}C`,\n backward: (count = 1) => `${CSI}${count}D`,\n nextLine: (count = 1) => `${CSI}E`.repeat(count),\n prevLine: (count = 1) => `${CSI}F`.repeat(count),\n left: `${CSI}G`,\n hide: `${CSI}?25l`,\n show: `${CSI}?25h`,\n save: `${ESC}7`,\n restore: `${ESC}8`\n}\n\nconst scroll = {\n up: (count = 1) => `${CSI}S`.repeat(count),\n down: (count = 1) => `${CSI}T`.repeat(count)\n}\n\nconst erase = {\n screen: `${CSI}2J`,\n up: (count = 1) => `${CSI}1J`.repeat(count),\n down: (count = 1) => `${CSI}J`.repeat(count),\n line: `${CSI}2K`,\n lineEnd: `${CSI}K`,\n lineStart: `${CSI}1K`,\n lines(count) {\n let clear = '';\n for (let i = 0; i < count; i++)\n clear += this.line + (i < count - 1 ? cursor.up() : '');\n if (count)\n clear += cursor.left;\n return clear;\n }\n}\n\nmodule.exports = { cursor, scroll, erase, beep };\n", "import assert from \"node:assert/strict\";\nimport { rm } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createTerminalPilotCliRepl } from \"./cli-repl.js\";\n\ntype QaCase = {\n id: number;\n title: string;\n skipped?: boolean;\n run?: (ctx: QaContext) => Promise<void>;\n};\n\ntype QaFailure = {\n id: number;\n title: string;\n reason: string;\n};\n\ntype SessionListResult = {\n sessions: Array<{ session: string; command: string; pid: number }>;\n};\n\ntype SessionResult = {\n session: string;\n pid: number;\n command: string;\n exitCode: number | null;\n};\n\ntype CreateSessionResult = {\n session: string;\n pid: number;\n};\n\ntype WaitForResult = {\n matched: true;\n line: string;\n};\n\ntype ExitCodeResult = {\n exitCode: number;\n};\n\ntype ReadScreenResult = {\n lines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n exitCode: number | null;\n};\n\ntype ReadHistoryResult = {\n lines: string[];\n exitCode: number | null;\n};\n\ntype OkResult = {\n ok: true;\n};\n\nconst testingDirectory = path.dirname(fileURLToPath(import.meta.url));\nconst repoRoot = path.resolve(testingDirectory, \"../../../..\");\nconst tsxPath = path.join(repoRoot, \"node_modules\", \".bin\", \"tsx\");\nconst testCliPath = path.join(repoRoot, \"packages/terminal-pilot/src/testing/test-cli.js\");\nconst menuCliPath = path.join(repoRoot, \"packages/terminal-pilot/src/testing/menu-cli.js\");\nconst vimSavedFile = path.join(os.tmpdir(), \"terminal-pilot-qa-test.txt\");\nconst vimDiscardFile = path.join(os.tmpdir(), \"terminal-pilot-qa-discard.txt\");\n\nclass QaContext {\n private readonly repl = createTerminalPilotCliRepl();\n\n async close(): Promise<void> {\n await this.repl.close();\n }\n\n async expectOk<T>(args: string[]): Promise<T> {\n const result = await this.repl.runJson<T>(args);\n\n if (result.exitCode !== 0) {\n throw new Error(\n `Command failed (${result.exitCode}): terminal-pilot ${args.join(\" \")}\\n${result.stderr || \"<no error output>\"}`\n );\n }\n\n return result.stdout;\n }\n\n async expectError(args: string[]): Promise<string> {\n const result = await this.repl.run(args);\n\n if (result.exitCode === 0) {\n throw new Error(\n `Expected command to fail: terminal-pilot ${args.join(\" \")}\\nstdout: ${result.stdout || \"<empty>\"}`\n );\n }\n\n return result.stderr || result.stdout;\n }\n\n async listSessions(): Promise<SessionListResult> {\n return this.expectOk<SessionListResult>([\"list-sessions\"]);\n }\n\n async getSessionIfExists(session: string): Promise<SessionResult | null> {\n const result = await this.repl.runJson<SessionResult>([\"get-session\", \"-s\", session]);\n if (result.exitCode !== 0) return null;\n return result.stdout;\n }\n\n async closeSessionIfExists(session: string): Promise<void> {\n const existing = await this.getSessionIfExists(session);\n\n if (existing !== null) {\n await this.expectOk<ExitCodeResult>([\"close-session\", \"-s\", session]);\n }\n }\n\n async ensurePromptSession(session: string): Promise<void> {\n const existing = await this.getSessionIfExists(session);\n\n if (existing?.exitCode !== null) {\n await this.expectOk<ExitCodeResult>([\"close-session\", \"-s\", session]);\n }\n\n if (existing === null || existing.exitCode !== null) {\n const created = await this.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n session,\n tsxPath,\n testCliPath\n ]);\n assert.equal(created.session, session);\n assert.ok(created.pid > 0);\n }\n\n const screen = await this.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", session]);\n if (!screen.lines.some((line) => line.includes(\"What is your name?\"))) {\n const prompt = await this.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n session,\n \"-l\",\n \"What is your name?\"\n ]);\n assert.equal(prompt.matched, true);\n }\n }\n\n async ensureGreetingSession(session: string, name: string): Promise<void> {\n await this.ensurePromptSession(session);\n\n const history = await this.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", session]);\n if (history.lines.some((line) => line.includes(`Hello, ${name}!`))) {\n return;\n }\n\n await this.expectOk<OkResult>([\"fill\", \"-s\", session, `${name}\\n`]);\n const greeted = await this.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n session,\n \"-l\",\n `Hello, ${name}!`\n ]);\n assert.equal(greeted.matched, true);\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\nasync function removeIfExists(filePath: string): Promise<void> {\n await rm(filePath, { force: true });\n}\n\nasync function closeSessions(ctx: QaContext, sessions: string[]): Promise<void> {\n for (const session of sessions) {\n await ctx.closeSessionIfExists(session);\n }\n}\n\nconst cases: QaCase[] = [\n {\n id: 1,\n title: \"Empty session list\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S1\");\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n }\n },\n {\n id: 2,\n title: \"Create a session\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S1\");\n const created = await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"S1\",\n tsxPath,\n testCliPath\n ]);\n assert.equal(created.session, \"S1\");\n assert.ok(created.pid > 0);\n }\n },\n {\n id: 3,\n title: \"Session appears in list\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const listed = await ctx.listSessions();\n assert.equal(listed.sessions.length, 1);\n assert.equal(listed.sessions[0]?.session, \"S1\");\n }\n },\n {\n id: 4,\n title: \"Get session metadata\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const session = await ctx.expectOk<SessionResult>([\"get-session\", \"-s\", \"S1\"]);\n assert.equal(session.session, \"S1\");\n assert.ok(session.pid > 0);\n assert.match(session.command, /tsx/);\n assert.equal(session.exitCode, null);\n }\n },\n {\n id: 5,\n title: \"Wait for prompt\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const waited = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S1\",\n \"-l\",\n \"What is your name?\"\n ]);\n assert.equal(waited.matched, true);\n assert.match(waited.line, /What is your name\\?/);\n }\n },\n {\n id: 6,\n title: \"Fill text\",\n async run(ctx) {\n await ctx.ensurePromptSession(\"S1\");\n const result = await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S1\", \"Alice\\n\"]);\n assert.deepEqual(result, { ok: true });\n }\n },\n {\n id: 7,\n title: \"Wait for greeting\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const waited = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S1\",\n \"-l\",\n \"Hello, Alice!\"\n ]);\n assert.equal(waited.matched, true);\n }\n },\n {\n id: 8,\n title: \"Read screen includes exitCode null\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const screen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S1\"]);\n assert.ok(Array.isArray(screen.lines));\n assert.equal(typeof screen.cursor.row, \"number\");\n assert.equal(typeof screen.cursor.col, \"number\");\n assert.equal(typeof screen.size.rows, \"number\");\n assert.equal(typeof screen.size.cols, \"number\");\n // test-cli exits immediately after printing the greeting, so exitCode may be 0 or null\n assert.ok(screen.exitCode === null || screen.exitCode === 0);\n }\n },\n {\n id: 9,\n title: \"Read history includes all output, exitCode null\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const history = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"S1\"]);\n assert.ok(history.lines.length > 0);\n assert.ok(history.lines.some((line) => line.includes(\"Hello, Alice!\")));\n // test-cli exits immediately after printing the greeting, so exitCode may be 0 or null\n assert.ok(history.exitCode === null || history.exitCode === 0);\n }\n },\n {\n id: 10,\n title: \"Read history with last N\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const history = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"S1\", \"-n\", \"2\"]);\n assert.ok(history.lines.length <= 2);\n }\n },\n {\n id: 11,\n title: \"Close session\",\n async run(ctx) {\n await ctx.ensureGreetingSession(\"S1\", \"Alice\");\n const closed = await ctx.expectOk<ExitCodeResult>([\"close-session\", \"-s\", \"S1\"]);\n assert.equal(typeof closed.exitCode, \"number\");\n\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n\n const error = await ctx.expectError([\"get-session\", \"-s\", \"S1\"]);\n assert.match(error, /not found/);\n }\n },\n {\n id: 12,\n title: \"terminal_type character-by-character\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S2\");\n try {\n const created = await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"S2\",\n tsxPath,\n testCliPath\n ]);\n assert.equal(created.session, \"S2\");\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S2\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"type\", \"-s\", \"S2\", \"Bob\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S2\", \"Enter\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S2\",\n \"-l\",\n \"Hello, Bob!\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S2\");\n }\n }\n },\n {\n id: 13,\n title: \"terminal_wait_for with literal flag\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S3\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S3\", tsxPath, testCliPath]);\n const prompt = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S3\",\n \"-l\",\n \"What is your name?\"\n ]);\n assert.equal(prompt.matched, true);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S3\", \"Carol\\n\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S3\",\n \"-l\",\n \"Hello, Carol!\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S3\");\n }\n }\n },\n {\n id: 14,\n title: \"terminal_wait_for regex\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S4\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S4\", tsxPath, testCliPath]);\n const prompt = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S4\",\n \"What is your name\\\\?\"\n ]);\n assert.equal(prompt.matched, true);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S4\", \"Dan\\n\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S4\",\n \"Hello,\\\\s+Dan\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S4\");\n }\n }\n },\n {\n id: 15,\n title: \"terminal_wait_for timeout exceeded\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S5\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S5\", tsxPath, testCliPath]);\n const error = await ctx.expectError([\n \"wait-for\",\n \"-s\",\n \"S5\",\n \"-t\",\n \"500\",\n \"THIS_WILL_NEVER_APPEAR\"\n ]);\n assert.match(error, /Timed out waiting for pattern/i);\n } finally {\n await ctx.closeSessionIfExists(\"S5\");\n }\n }\n },\n {\n id: 16,\n title: \"terminal_wait_for_exit natural exit\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S6\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S6\", tsxPath, testCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S6\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S6\", \"Eve\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"S6\",\n \"-t\",\n \"5000\"\n ]);\n assert.equal(exited.exitCode, 0);\n\n const session = await ctx.expectOk<SessionResult>([\"get-session\", \"-s\", \"S6\"]);\n assert.equal(session.exitCode, 0);\n\n const exitedAgain = await ctx.expectOk<ExitCodeResult>([\"wait-for-exit\", \"-s\", \"S6\"]);\n assert.equal(exitedAgain.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"S6\");\n }\n }\n },\n {\n id: 17,\n title: \"terminal_wait_for_exit timeout exceeded\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S7\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S7\", tsxPath, testCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S7\", \"-l\", \"What is your name?\"]);\n const error = await ctx.expectError([\n \"wait-for-exit\",\n \"-s\",\n \"S7\",\n \"-t\",\n \"300\"\n ]);\n assert.match(error, /Timed out waiting for process to exit/i);\n } finally {\n await ctx.closeSessionIfExists(\"S7\");\n }\n }\n },\n {\n id: 18,\n title: \"terminal_send_signal SIGINT\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S8\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S8\", tsxPath, testCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S8\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"send-signal\", \"-s\", \"S8\", \"SIGINT\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"S8\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(typeof exited.exitCode, \"number\");\n const screen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S8\"]);\n assert.equal(screen.exitCode, exited.exitCode);\n } finally {\n await ctx.closeSessionIfExists(\"S8\");\n }\n }\n },\n {\n id: 19,\n title: \"terminal_resize\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S9\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"S9\",\n \"--cols\",\n \"80\",\n \"--rows\",\n \"24\",\n tsxPath,\n testCliPath\n ]);\n const initialScreen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S9\"]);\n assert.equal(initialScreen.size.cols, 80);\n assert.equal(initialScreen.size.rows, 24);\n\n await ctx.expectOk<OkResult>([\"resize\", \"-s\", \"S9\", \"--cols\", \"120\", \"--rows\", \"40\"]);\n const resizedScreen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"S9\"]);\n assert.equal(resizedScreen.size.cols, 120);\n assert.equal(resizedScreen.size.rows, 40);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S9\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"S9\", \"Frank\\n\"]);\n const greeted = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S9\",\n \"-l\",\n \"Hello, Frank!\"\n ]);\n assert.equal(greeted.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S9\");\n }\n }\n },\n {\n id: 20,\n title: \"Full flow menu-cli with ArrowDown navigation\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S10\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S10\", tsxPath, menuCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S10\", \"-l\", \"Select an option:\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S10\", \"ArrowDown\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S10\", \"ArrowDown\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S10\", \"Enter\"]);\n const selected = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S10\",\n \"-l\",\n \"You selected: Option 3\"\n ]);\n assert.equal(selected.matched, true);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"S10\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"S10\");\n }\n }\n },\n {\n id: 21,\n title: \"Full flow menu-cli ArrowUp wrap-around\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"S11\");\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"S11\", tsxPath, menuCliPath]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"S11\", \"-l\", \"Select an option:\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S11\", \"ArrowUp\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"S11\", \"Enter\"]);\n const selected = await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"S11\",\n \"You selected: Option [123]\"\n ]);\n assert.equal(selected.matched, true);\n } finally {\n await ctx.closeSessionIfExists(\"S11\");\n }\n }\n },\n {\n id: 22,\n title: \"Multiple concurrent sessions isolation\",\n async run(ctx) {\n await closeSessions(ctx, [\"SA\", \"SB\", \"SC\"]);\n try {\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"SA\", tsxPath, testCliPath]);\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"SB\", tsxPath, testCliPath]);\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"SC\", tsxPath, menuCliPath]);\n\n const listed = await ctx.listSessions();\n assert.equal(listed.sessions.length, 3);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SA\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"SA\", \"Session-A\\n\"]);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SB\", \"-l\", \"What is your name?\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"SB\", \"Session-B\\n\"]);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SC\", \"-l\", \"Select an option:\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"SC\", \"Enter\"]);\n\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SA\", \"-l\", \"Hello, Session-A!\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SB\", \"-l\", \"Hello, Session-B!\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"SC\", \"-l\", \"You selected: Option 1\"]);\n\n const historyA = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"SA\"]);\n assert.ok(historyA.lines.some((line) => line.includes(\"Session-A\")));\n assert.ok(historyA.lines.every((line) => !line.includes(\"Session-B\")));\n\n const historyB = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"SB\"]);\n assert.ok(historyB.lines.some((line) => line.includes(\"Session-B\")));\n assert.ok(historyB.lines.every((line) => !line.includes(\"Session-A\")));\n\n await ctx.expectOk<ExitCodeResult>([\"close-session\", \"-s\", \"SB\"]);\n const afterClose = await ctx.listSessions();\n // SA and SC exit naturally after their interactions complete,\n // so the list only guarantees SB is gone\n assert.ok(!afterClose.sessions.some((s) => s.session === \"SB\"));\n } finally {\n await closeSessions(ctx, [\"SA\", \"SB\", \"SC\"]);\n }\n }\n },\n {\n id: 23,\n title: \"Final state\",\n async run(ctx) {\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n }\n },\n {\n id: 24,\n title: \"Unknown session error\",\n async run(ctx) {\n const readScreenError = await ctx.expectError([\"read-screen\", \"-s\", \"does-not-exist\"]);\n assert.match(readScreenError, /not found/);\n\n const closeError = await ctx.expectError([\"close-session\", \"-s\", \"does-not-exist\"]);\n assert.match(closeError, /not found/);\n }\n },\n {\n id: 25,\n title: \"Bash interactive shell\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"BASH\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"BASH\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"bash\",\n \"--\",\n \"--norc\",\n \"--noprofile\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-t\", \"3000\", \"\\\\$\\\\s*$\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"echo hello-from-bash\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-l\", \"hello-from-bash\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"echo $((6 * 7))\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-l\", \"42\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"sleep 60\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-t\", \"2000\", \"sleep\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"BASH\", \"Control+c\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH\", \"-t\", \"3000\", \"\\\\$\\\\s*$\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"BASH\", \"exit 0\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"BASH\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"BASH\");\n }\n }\n },\n {\n id: 26,\n title: \"Bash long output read_history line count\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"BASH2\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"BASH2\",\n \"bash\",\n \"--\",\n \"--norc\",\n \"--noprofile\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH2\", \"-t\", \"3000\", \"\\\\$\\\\s*$\"]);\n await ctx.expectOk<OkResult>([\n \"fill\",\n \"-s\",\n \"BASH2\",\n \"for i in $(seq 1 50); do echo \\\"line $i\\\"; done\\n\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"BASH2\", \"-l\", \"line 50\"]);\n\n const history = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"BASH2\"]);\n for (let index = 1; index <= 50; index += 1) {\n assert.ok(history.lines.some((line) => line.includes(`line ${index}`)));\n }\n\n const tail = await ctx.expectOk<ReadHistoryResult>([\"read-history\", \"-s\", \"BASH2\", \"-n\", \"10\"]);\n assert.ok(tail.lines.length <= 10);\n assert.ok(tail.lines.some((line) => /line 50/.test(line)));\n } finally {\n await ctx.closeSessionIfExists(\"BASH2\");\n }\n }\n },\n {\n id: 27,\n title: \"Python REPL expression evaluation and multi-line input\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"PY\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"PY\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"python3\",\n \"--\",\n \"-q\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \">>>\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"2 ** 10\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \"1024\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"[x*x for x in range(5)]\\n\"]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"PY\",\n \"\\\\[0, 1, 4, 9, 16\\\\]\"\n ]);\n\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"def greet(name):\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"\\\\.\\\\.\\\\.\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \" return f'hi {name}'\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"\\\\.\\\\.\\\\.\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \">>>\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"PY\", \"greet('world')\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"PY\", \"-l\", \"hi world\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"PY\", \"Control+d\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"PY\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"PY\");\n }\n }\n },\n {\n id: 28,\n title: \"Node.js REPL evaluation\",\n async run(ctx) {\n await ctx.closeSessionIfExists(\"NODE\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"NODE\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"node\"\n ]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"-l\", \">\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"NODE\", \"Math.PI.toFixed(4)\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"-l\", \"3.1416\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"NODE\", \"[1,2,3].map(x => x * 2)\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"\\\\[ 2, 4, 6 \\\\]\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"NODE\", \"process.version\\n\"]);\n await ctx.expectOk<WaitForResult>([\"wait-for\", \"-s\", \"NODE\", \"v\\\\d+\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"NODE\", \"Control+d\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"NODE\",\n \"-t\",\n \"3000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"NODE\");\n }\n }\n },\n {\n id: 29,\n title: \"vim open, edit, save and quit\",\n async run(ctx) {\n await removeIfExists(vimSavedFile);\n await closeSessions(ctx, [\"VIM\", \"CAT\"]);\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"VIM\",\n \"--cols\",\n \"120\",\n \"--rows\",\n \"40\",\n \"vim\",\n vimSavedFile\n ]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"VIM\",\n \"-t\",\n \"5000\",\n path.basename(vimSavedFile)\n ]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM\", \"i\"]);\n await ctx.expectOk<OkResult>([\"type\", \"-s\", \"VIM\", \"hello from terminal-pilot\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM\", \"Escape\"]);\n const screen = await ctx.expectOk<ReadScreenResult>([\"read-screen\", \"-s\", \"VIM\"]);\n assert.ok(screen.lines.some((line) => line.includes(\"hello from terminal-pilot\")));\n assert.equal(screen.exitCode, null);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"VIM\", \":wq\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"VIM\",\n \"-t\",\n \"5000\"\n ]);\n assert.equal(exited.exitCode, 0);\n\n await ctx.expectOk<CreateSessionResult>([\"create-session\", \"-s\", \"CAT\", \"cat\", vimSavedFile]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"CAT\",\n \"-l\",\n \"hello from terminal-pilot\"\n ]);\n } finally {\n await closeSessions(ctx, [\"VIM\", \"CAT\"]);\n await removeIfExists(vimSavedFile);\n }\n }\n },\n {\n id: 30,\n title: \"vim quit without saving\",\n async run(ctx) {\n await removeIfExists(vimDiscardFile);\n await ctx.closeSessionIfExists(\"VIM2\");\n try {\n await ctx.expectOk<CreateSessionResult>([\n \"create-session\",\n \"-s\",\n \"VIM2\",\n \"--cols\",\n \"80\",\n \"--rows\",\n \"24\",\n \"vim\",\n vimDiscardFile\n ]);\n await ctx.expectOk<WaitForResult>([\n \"wait-for\",\n \"-s\",\n \"VIM2\",\n \"-t\",\n \"5000\",\n path.basename(vimDiscardFile)\n ]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM2\", \"i\"]);\n await ctx.expectOk<OkResult>([\"type\", \"-s\", \"VIM2\", \"this should not be saved\"]);\n await ctx.expectOk<OkResult>([\"press-key\", \"-s\", \"VIM2\", \"Escape\"]);\n await ctx.expectOk<OkResult>([\"fill\", \"-s\", \"VIM2\", \":q!\\n\"]);\n const exited = await ctx.expectOk<ExitCodeResult>([\n \"wait-for-exit\",\n \"-s\",\n \"VIM2\",\n \"-t\",\n \"5000\"\n ]);\n assert.equal(exited.exitCode, 0);\n } finally {\n await ctx.closeSessionIfExists(\"VIM2\");\n await removeIfExists(vimDiscardFile);\n }\n }\n },\n {\n id: 31,\n title: \"poe-code help output\",\n skipped: true\n },\n {\n id: 32,\n title: \"poe-code configure interactive agent selection\",\n skipped: true\n },\n {\n id: 33,\n title: \"Claude Code version and help\",\n skipped: true\n },\n {\n id: 34,\n title: \"Claude Code single prompt\",\n skipped: true\n },\n {\n id: 35,\n title: \"Claude Code interactive REPL mode\",\n skipped: true\n },\n {\n id: 36,\n title: \"Final state all sessions closed\",\n async run(ctx) {\n const listed = await ctx.listSessions();\n assert.deepEqual(listed.sessions, []);\n }\n }\n];\n\nexport async function main(): Promise<void> {\n const ctx = new QaContext();\n const failures: QaFailure[] = [];\n\n try {\n for (const testCase of cases) {\n if (testCase.skipped === true) {\n process.stdout.write(`SKIP ${testCase.id}. ${testCase.title}\\n`);\n continue;\n }\n\n process.stdout.write(`RUN ${testCase.id}. ${testCase.title}\\n`);\n\n try {\n await testCase.run?.(ctx);\n process.stdout.write(`PASS ${testCase.id}. ${testCase.title}\\n`);\n } catch (error) {\n const reason = formatError(error);\n failures.push({\n id: testCase.id,\n title: testCase.title,\n reason\n });\n process.stdout.write(`FAIL ${testCase.id}. ${testCase.title}\\n`);\n process.stdout.write(`${reason}\\n`);\n }\n }\n } finally {\n await ctx.close();\n }\n\n process.stdout.write(`\\nSummary: ${cases.filter((entry) => !entry.skipped).length - failures.length} passed, ${failures.length} failed, ${cases.filter((entry) => entry.skipped).length} skipped.\\n`);\n\n if (failures.length > 0) {\n process.stdout.write(\"\\nFailures:\\n\");\n for (const failure of failures) {\n process.stdout.write(`${failure.id}. ${failure.title}: ${failure.reason}\\n`);\n }\n process.exitCode = 1;\n }\n}\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n await main();\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", "#!/usr/bin/env node\nimport { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { runCLI } from \"@poe-code/cmdkit/cli\";\nimport { terminalPilotGroup } from \"./commands/index.js\";\n\nfunction normalizeArgv(argv: string[]): string[] {\n if (\n argv.includes(\"--json\") &&\n !argv.some((argument) => argument === \"--output\" || argument.startsWith(\"--output=\"))\n ) {\n return argv.flatMap((argument) => argument === \"--json\" ? [\"--output\", \"json\"] : [argument]);\n }\n\n return argv;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const originalArgv = process.argv;\n process.argv = normalizeArgv(argv);\n\n try {\n await runCLI(terminalPilotGroup);\n } finally {\n process.argv = originalArgv;\n }\n}\n\nasync function isDirectExecution(argv: string[]): Promise<boolean> {\n const entryPoint = argv[1];\n\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n return false;\n }\n\n try {\n const modulePath = fileURLToPath(import.meta.url);\n const [resolvedEntryPoint, resolvedModulePath] = await Promise.all([\n realpath(path.resolve(entryPoint)),\n realpath(modulePath)\n ]);\n\n return resolvedEntryPoint === resolvedModulePath;\n } catch {\n return false;\n }\n}\n\nif (await isDirectExecution(process.argv)) {\n await main();\n}\n", "import { access, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command as CommanderCommand, CommanderError, InvalidArgumentError, Option } from \"commander\";\nimport type { AnySchema, ArraySchema, ObjectSchema } from \"@poe-code/cmdkit-schema\";\nimport {\n cancel,\n confirm,\n createLogger,\n formatCommandList,\n formatOptionList,\n getTheme,\n isCancel,\n note,\n promptText,\n renderTable,\n resetOutputFormatCache,\n select,\n text,\n} from \"@poe-code/design-system\";\nimport type {\n Command,\n CommandRequirementOptions,\n Group,\n HandlerContext,\n HandlerEnv,\n HandlerFs,\n SecretDeclarations,\n SecretDefinition,\n Scope,\n} from \"./index.js\";\nimport { UserError, assertCommandRequirements, getCommandSourcePath, resolveCommandSecrets } from \"./index.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { renderResult } from \"./renderer.js\";\nimport type { OutputMode } from \"./renderer.js\";\n\nconst RESERVED_SERVICE_NAMES = new Set([\"params\", \"secrets\", \"fetch\", \"fs\", \"env\", \"progress\"]);\n\ntype Casing = \"kebab\" | \"snake\";\ntype PrimitiveSchema = Exclude<AnySchema, ObjectSchema<any>>;\ntype ScalarSchema = Exclude<PrimitiveSchema, ArraySchema<any>>;\ntype FieldSchema = Exclude<PrimitiveSchema, { kind: \"optional\" }>;\n\ninterface ResolvedFlags {\n json?: boolean;\n preset?: string;\n yes?: boolean;\n output?: OutputMode;\n verbose?: boolean;\n}\n\ninterface FieldDefinition {\n path: string[];\n displayPath: string;\n optionAttribute: string;\n commanderOptionAttribute: string;\n optionFlag: string;\n shortFlag?: string;\n schema: FieldSchema;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n positionalIndex?: number;\n variadicPosition?: boolean;\n}\n\ninterface ExecutionState<TServices extends object> {\n command: Command<TServices, any, any, any>;\n fields: FieldDefinition[];\n positionalValues: unknown[];\n actionCommand: CommanderCommand;\n}\n\ninterface FixtureFetchRequest {\n method?: string;\n url: string;\n}\n\ninterface FixtureFetchResponse {\n body?: unknown;\n headers?: Record<string, string>;\n status?: number;\n}\n\ninterface FixtureFetchEntry {\n request: FixtureFetchRequest;\n response: FixtureFetchResponse;\n}\n\ninterface FixtureScenario {\n name: string;\n services?: Record<string, unknown>;\n}\n\ninterface ResolvedFixtureRuntime<TServices extends object> {\n env: HandlerEnv;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n isFixture: boolean;\n requirementOptions: CommandRequirementOptions;\n secrets: Record<string, string | undefined>;\n services: TServices;\n}\n\ninterface ResolvedHelpTarget<TServices extends object> {\n breadcrumb: string[];\n node: Command<TServices, any, any, any> | Group<TServices>;\n}\n\ninterface HelpCommandRow {\n description: string;\n name: string;\n}\n\ninterface HelpOptionRow {\n description: string;\n flags: string;\n}\n\nexport interface RunCLIOptions<TServices extends object = Record<string, unknown>> {\n apiVersion?: string;\n casing?: Casing;\n rootDisplayName?: string;\n rootUsageName?: string;\n services?: TServices;\n version?: string;\n}\n\nfunction inferProgramName(argv: string[]): string {\n const entrypoint = argv[1];\n\n if (typeof entrypoint !== \"string\" || entrypoint.length === 0) {\n return \"cmdkit\";\n }\n\n const parsed = path.parse(entrypoint);\n return parsed.name.length > 0 ? parsed.name : \"cmdkit\";\n}\n\nfunction normalizeRoots<TServices extends object>(\n roots: Group<TServices> | Group<TServices>[],\n argv: string[]\n): Group<TServices> {\n if (!Array.isArray(roots)) {\n return roots;\n }\n\n return {\n kind: \"group\",\n name: inferProgramName(argv),\n aliases: [],\n secrets: {},\n children: roots,\n };\n}\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\n\nfunction unwrapOptional(schema: AnySchema): AnySchema {\n if (schema.kind === \"optional\") {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n const isSeparator = char === \"-\" || char === \"_\" || char === \" \" || char === \".\";\n\n if (isSeparator) {\n if (current.length > 0) {\n words.push(current.toLowerCase());\n current = \"\";\n }\n continue;\n }\n\n const isUppercase = char !== lower && char === upper;\n const previous = value[index - 1];\n const next = value[index + 1];\n const previousIsLowercase = previous !== undefined && previous === previous.toLowerCase() && previous !== previous.toUpperCase();\n const nextIsLowercase = next !== undefined && next === next.toLowerCase() && next !== next.toUpperCase();\n\n if (isUppercase && current.length > 0 && (previousIsLowercase || nextIsLowercase)) {\n words.push(current.toLowerCase());\n current = char;\n continue;\n }\n\n current += char;\n }\n\n if (current.length > 0) {\n words.push(current.toLowerCase());\n }\n\n return words;\n}\n\nfunction formatSegment(segment: string, casing: Casing): string {\n const separator = casing === \"snake\" ? \"_\" : \"-\";\n return splitWords(segment).join(separator);\n}\n\nfunction toOptionFlag(path: string[], casing: Casing): string {\n return `--${path.map((segment) => formatSegment(segment, casing)).join(\".\")}`;\n}\n\nfunction toOptionAttribute(path: string[], casing: Casing): string {\n return path\n .map((segment) => {\n const formatted = formatSegment(segment, casing);\n\n if (casing === \"snake\") {\n return formatted;\n }\n\n const words = formatted.split(\"-\");\n return words\n .map((word, index) =>\n index === 0 ? word : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`\n )\n .join(\"\");\n })\n .join(\".\");\n}\n\nfunction toDisplayPath(path: string[]): string {\n return path.join(\".\");\n}\n\nfunction collectFields(\n schema: ObjectSchema<any>,\n casing: Casing,\n path: string[] = [],\n inheritedOptional = false\n): FieldDefinition[] {\n const fields: FieldDefinition[] = [];\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const nextPath = [...path, key];\n const optional = inheritedOptional || rawChildSchema.kind === \"optional\";\n const childSchema = unwrapOptional(rawChildSchema);\n\n if (childSchema.kind === \"object\") {\n fields.push(...collectFields(childSchema, casing, nextPath, optional));\n continue;\n }\n\n fields.push({\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionAttribute: toOptionAttribute(nextPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(nextPath, casing),\n optionFlag: toOptionFlag(nextPath, casing),\n shortFlag: childSchema.short,\n schema: childSchema as FieldSchema,\n description: childSchema.description,\n optional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n });\n }\n\n return fields;\n}\n\nfunction toCommanderOptionAttribute(path: string[], casing: Casing): string {\n const optionAttribute = toOptionAttribute(path, casing);\n const optionFlag = toOptionFlag(path, casing);\n\n if (!GLOBAL_LONG_OPTION_FLAGS.has(optionFlag)) {\n return optionAttribute;\n }\n\n return `param_${optionAttribute}`;\n}\n\nfunction assignPositionals(fields: FieldDefinition[], positional: string[]): FieldDefinition[] {\n if (positional.length === 0) {\n return fields;\n }\n\n const byPath = new Map(fields.map((field) => [field.displayPath, field]));\n let variadicPositionSeen = false;\n\n positional.forEach((name, index) => {\n const field = byPath.get(name);\n\n if (field === undefined) {\n throw new UserError(`Positional parameter \"${name}\" does not exist in params.`);\n }\n\n if (field.schema.kind === \"array\") {\n if (index !== positional.length - 1) {\n throw new UserError(`Positional array parameter \"${name}\" must be the last positional.`);\n }\n\n variadicPositionSeen = true;\n }\n\n if (variadicPositionSeen && field.schema.kind !== \"array\") {\n throw new UserError(`Positional parameter \"${name}\" cannot appear after a positional array.`);\n }\n\n field.positionalIndex = index;\n field.variadicPosition = field.schema.kind === \"array\";\n });\n\n return fields;\n}\n\nfunction formatOptionFlags(field: FieldDefinition): string {\n const collidesWithGlobalFlag = GLOBAL_LONG_OPTION_FLAGS.has(field.optionFlag);\n\n if (collidesWithGlobalFlag) {\n if (field.shortFlag === undefined) {\n throw new UserError(\n `Parameter \"${field.displayPath}\" uses reserved CLI flag \"${field.optionFlag}\". Add a short flag or rename the parameter.`\n );\n }\n\n return `-${field.shortFlag}`;\n }\n\n if (field.shortFlag === undefined) {\n return field.optionFlag;\n }\n\n return `-${field.shortFlag}, ${field.optionFlag}`;\n}\n\nfunction formatPositionalToken(field: FieldDefinition): string {\n const optionalPositional = field.optional || field.hasDefault;\n\n if (field.variadicPosition === true) {\n return optionalPositional ? `[${field.displayPath}...]` : `<${field.displayPath}...>`;\n }\n\n return optionalPositional ? `[${field.displayPath}]` : `<${field.displayPath}>`;\n}\n\nfunction parseBooleanText(value: string, label: string): boolean {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"true\") {\n return true;\n }\n\n if (normalized === \"false\") {\n return false;\n }\n\n throw new InvalidArgumentError(`Invalid value for \"${label}\". Expected true or false.`);\n}\n\nfunction parseEnumValue(value: string, values: ReadonlyArray<string | number | boolean>, label: string): string | number | boolean {\n const match = values.find((candidate) => String(candidate) === value);\n\n if (match === undefined) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}.`\n );\n }\n\n return match;\n}\n\nfunction parseScalarValue(value: string, schema: ScalarSchema, label: string): string | number | boolean {\n switch (schema.kind) {\n case \"string\":\n return value;\n\n case \"number\": {\n const parsed = Number(value);\n if (!isValidNumberSchemaValue(parsed, schema)) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected ${getExpectedNumberDescription(schema)}.`\n );\n }\n return parsed;\n }\n\n case \"boolean\":\n return parseBooleanText(value, label);\n\n case \"enum\":\n return parseEnumValue(value, schema.values, label);\n\n default:\n throw new UserError(`Unsupported CLI schema kind \"${schema.kind}\".`);\n }\n}\n\nfunction splitArrayInput(value: string): string[] {\n const items: string[] = [];\n let current = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n\n if (char === \",\") {\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n items.push(trimmed);\n }\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n items.push(trimmed);\n }\n\n return items;\n}\n\nfunction parseArrayValue(value: string, schema: ArraySchema<any>, label: string): unknown[] {\n const itemSchema = unwrapOptional(schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${label}\" must use scalar items.`);\n }\n\n return splitArrayInput(value).map((item) => parseScalarValue(item, itemSchema as ScalarSchema, label));\n}\n\nfunction createOption(field: FieldDefinition): Option[] {\n const flags = formatOptionFlags(field);\n const collidesWithGlobalFlag = GLOBAL_LONG_OPTION_FLAGS.has(field.optionFlag);\n\n if (field.schema.kind === \"boolean\") {\n if (collidesWithGlobalFlag) {\n return [createCommanderOption(flags, field.description, field)];\n }\n\n const mainOption = createCommanderOption(`${flags} [value]`, field.description, field);\n mainOption.preset(true);\n // Commander v14 passes the preset value through argParser too, so guard with typeof check\n mainOption.argParser((value: string | boolean) =>\n typeof value === \"boolean\" ? value : parseBooleanText(value, field.displayPath)\n );\n\n return [\n mainOption,\n createCommanderOption(`--no-${field.optionFlag.slice(2)}`, field.description, field),\n ];\n }\n\n if (field.schema.kind === \"array\") {\n return [\n createCommanderOption(`${flags} <value...>`, field.description, field).argParser(\n (value: string, previous: unknown[] = []) => [\n ...previous,\n ...parseArrayValue(value, field.schema as ArraySchema<any>, field.displayPath),\n ]\n ),\n ];\n }\n\n const option = createCommanderOption(`${flags} <value>`, field.description, field);\n\n if (field.schema.kind === \"enum\" && field.schema.values.every((value) => typeof value === \"string\")) {\n option.choices([...field.schema.values] as string[]);\n }\n\n option.argParser((value: string) => parseScalarValue(value, field.schema as ScalarSchema, field.displayPath));\n return [option];\n}\n\nconst GLOBAL_LONG_OPTION_FLAGS = new Set([\"--preset\", \"--yes\", \"--output\", \"--verbose\"]);\n\nfunction createCommanderOption(\n flags: string,\n description: string | undefined,\n field: FieldDefinition\n): Option {\n const option = new Option(flags, description);\n\n if (field.commanderOptionAttribute !== field.optionAttribute) {\n option.attributeName = () => field.commanderOptionAttribute;\n }\n\n return option;\n}\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.some((token) => HELP_FLAGS.has(token));\n}\n\nfunction resolveHelpOutput(argv: string[]): OutputMode {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index] ?? \"\";\n\n if (token === \"--output\") {\n const value = argv[index + 1];\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n continue;\n }\n\n if (token.startsWith(\"--output=\")) {\n const value = token.slice(\"--output=\".length);\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n }\n }\n\n return \"rich\";\n}\n\nfunction isNodeVisibleInScope<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n scope: Scope\n): boolean {\n if (node.kind === \"command\") {\n return node.scope.includes(scope);\n }\n\n return (\n getVisibleChildren(node, scope).length > 0 ||\n Boolean(node.default && node.default.scope.includes(scope)) ||\n node.scope === undefined ||\n node.scope.includes(scope)\n );\n}\n\nfunction getVisibleChildren<TServices extends object>(group: Group<TServices>, scope: Scope): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return group.children.filter((child) => isNodeVisibleInScope(child, scope));\n}\n\nfunction findVisibleChild<TServices extends object>(\n group: Group<TServices>,\n token: string,\n scope: Scope\n): Command<TServices, any, any, any> | Group<TServices> | undefined {\n return getVisibleChildren(group, scope).find(\n (child) => child.name === token || child.aliases.includes(token)\n );\n}\n\nfunction resolveHelpTarget<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n scope: Scope,\n rootDisplayName?: string\n): ResolvedHelpTarget<TServices> {\n const breadcrumb = [rootDisplayName ?? root.name];\n let current: Command<TServices, any, any, any> | Group<TServices> = root;\n\n for (const token of argv.slice(2)) {\n if (token.startsWith(\"-\") || token === \"help\") {\n break;\n }\n\n if (current.kind !== \"group\") {\n break;\n }\n\n const child: Command<TServices, any, any, any> | Group<TServices> | undefined = findVisibleChild(\n current,\n token,\n scope\n );\n if (child === undefined) {\n break;\n }\n\n breadcrumb.push(child.name);\n current = child;\n }\n\n return {\n breadcrumb,\n node: current,\n };\n}\n\nfunction describeSchemaType(schema: FieldSchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n\n case \"number\":\n return \"number\";\n\n case \"boolean\":\n return \"boolean\";\n\n case \"enum\":\n return \"value\";\n\n case \"array\":\n return `${describeSchemaType(unwrapOptional(schema.item) as FieldSchema)}...`;\n\n default:\n throw new UserError(\"Unsupported CLI schema kind.\");\n }\n}\n\nfunction formatHelpFieldFlags(field: FieldDefinition): string {\n if (field.positionalIndex !== undefined) {\n return formatPositionalToken(field);\n }\n\n if (field.schema.kind === \"boolean\") {\n return `${formatOptionFlags(field)} [value]`;\n }\n\n return `${formatOptionFlags(field)} <${describeSchemaType(field.schema)}>`;\n}\n\nfunction appendHelpMetadata(description: string, metadata: string[]): string {\n if (metadata.length === 0) {\n return description;\n }\n\n if (description.length === 0) {\n return `(${metadata.join(\", \")})`;\n }\n\n return `${description} (${metadata.join(\", \")})`;\n}\n\nfunction formatHelpFieldDescription(field: FieldDefinition): string {\n const description = field.description ?? field.displayPath;\n const metadata: string[] = [];\n\n if (!field.optional && !field.hasDefault) {\n metadata.push(\"required\");\n }\n\n if (field.hasDefault) {\n metadata.push(`default: ${formatResolvedValue(field.defaultValue)}`);\n }\n\n return appendHelpMetadata(description, metadata);\n}\n\nfunction formatSecretRows(secrets: SecretDeclarations): HelpOptionRow[] {\n return Object.values(secrets).map((secret) => ({\n flags: secret.env,\n description: formatSecretDescription(secret),\n }));\n}\n\nfunction formatSecretDescription(secret: SecretDefinition): string {\n if (secret.description !== undefined && secret.description.length > 0) {\n return secret.description;\n }\n\n return secret.optional === true ? \"Optional secret\" : \"Required secret\";\n}\n\nfunction formatCommandRows<TServices extends object>(group: Group<TServices>, scope: Scope): HelpCommandRow[] {\n return getVisibleChildren(group, scope).map((child) => ({\n name: child.aliases.length === 0 ? child.name : `${child.name} (${child.aliases.join(\", \")})`,\n description: child.description ?? \"\",\n }));\n}\n\nfunction formatGlobalOptionRows(showVersion: boolean): HelpOptionRow[] {\n const rows: HelpOptionRow[] = [\n {\n flags: \"--preset <path>\",\n description: \"Load parameter defaults from a JSON file\",\n },\n {\n flags: \"--yes\",\n description: \"Accept defaults, skip prompts\",\n },\n {\n flags: \"--output <format>\",\n description: \"Output format (rich, md, json)\",\n },\n {\n flags: \"-h, --help\",\n description: \"Show help\",\n },\n ];\n\n if (showVersion) {\n rows.push({\n flags: \"--version\",\n description: \"Show version\",\n });\n }\n\n return rows;\n}\n\nfunction renderHelpSections(sections: string[]): string {\n return sections.filter((section) => section.length > 0).join(\"\\n\\n\");\n}\n\nfunction buildUsageLine(breadcrumb: string[], rootUsageName: string | undefined, suffix: string): string | undefined {\n if (rootUsageName === undefined) {\n return undefined;\n }\n const subPath = breadcrumb.slice(1).join(\" \");\n return subPath ? `${rootUsageName} ${subPath} ${suffix}` : `${rootUsageName} ${suffix}`;\n}\n\nfunction renderGroupHelp<TServices extends object>(\n group: Group<TServices>,\n breadcrumb: string[],\n scope: Scope,\n showVersion: boolean,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const commandRows = formatCommandRows(group, scope);\n\n if (commandRows.length > 0) {\n sections.push(`${text.section(\"Commands:\")}\\n${formatCommandList(commandRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(showVersion))}`);\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, \"[options] [command]\"),\n description: group.description,\n requiresAuth: group.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderLeafHelp<TServices extends object>(\n command: Command<TServices, any, any, any>,\n breadcrumb: string[],\n casing: Casing,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const fields = assignPositionals(collectFields(command.params, casing), command.positional);\n const optionRows = fields.map((field) => ({\n flags: formatHelpFieldFlags(field),\n description: formatHelpFieldDescription(field),\n }));\n\n if (optionRows.length > 0) {\n sections.push(`${text.section(\"Options:\")}\\n${formatOptionList(optionRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(false))}`);\n\n const secretRows = formatSecretRows(command.secrets);\n if (secretRows.length > 0) {\n sections.push(`${text.section(\"Secrets (via environment):\")}\\n${formatOptionList(secretRows)}`);\n }\n\n const positionalFields = fields.filter((f) => f.positionalIndex !== undefined);\n const usageSuffix = positionalFields.length > 0\n ? `[options] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[options]\";\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, usageSuffix),\n description: command.description,\n requiresAuth: command.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderHelpDocument(input: {\n breadcrumb: string[];\n usageLine?: string;\n description?: string;\n requiresAuth: boolean;\n sections: string[];\n}): string {\n const lines = [text.heading(input.breadcrumb.join(\" \")), \"\"];\n\n if (input.usageLine !== undefined) {\n lines.push(`${text.section(\"Usage:\")} ${text.usageCommand(input.usageLine)}`, \"\");\n }\n\n if (input.description !== undefined) {\n lines.push(input.description);\n }\n\n if (input.requiresAuth) {\n lines.push(\"Requires: authentication\");\n }\n\n if (input.description !== undefined || input.requiresAuth) {\n lines.push(\"\");\n }\n\n lines.push(renderHelpSections(input.sections));\n\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nasync function renderGeneratedHelp<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n options: RunCLIOptions<TServices>\n): Promise<void> {\n const target = resolveHelpTarget(root, argv, \"cli\", options.rootDisplayName);\n const output = resolveHelpOutput(argv);\n const casing = options.casing ?? \"kebab\";\n\n await withOutputFormat(output, async () => {\n const rendered =\n target.node.kind === \"group\"\n ? renderGroupHelp(target.node, target.breadcrumb, \"cli\", options.version !== undefined, options.rootUsageName)\n : renderLeafHelp(target.node, target.breadcrumb, casing, options.rootUsageName);\n\n process.stdout.write(rendered);\n });\n}\n\nfunction createNodeCommand<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n execute: (state: ExecutionState<TServices>) => Promise<void>\n): CommanderCommand | null {\n if (node.kind === \"command\") {\n if (!node.scope.includes(\"cli\")) {\n return null;\n }\n\n const command = new CommanderCommand(node.name);\n const fields = assignPositionals(collectFields(node.params, casing), node.positional);\n\n if (node.description !== undefined) {\n command.description(node.description);\n }\n\n node.aliases.forEach((alias) => command.alias(alias));\n command.addHelpCommand(false);\n addGlobalOptions(command);\n\n for (const field of fields) {\n if (field.positionalIndex !== undefined) {\n command.argument(formatPositionalToken(field));\n continue;\n }\n\n for (const option of createOption(field)) {\n command.addOption(option);\n }\n }\n\n command.action(async (...args: unknown[]) => {\n const actionCommand = args[args.length - 1] as CommanderCommand;\n const positionalValues = args.slice(0, -2);\n\n await execute({\n command: node,\n fields,\n positionalValues,\n actionCommand,\n });\n });\n\n return command;\n }\n\n if (!isNodeVisibleInScope(node, \"cli\")) {\n return null;\n }\n\n const visibleChildren = node.children\n .map((child) => createNodeCommand(child, casing, execute))\n .filter((child): child is CommanderCommand => child !== null);\n\n const group = new CommanderCommand(node.name);\n\n if (node.description !== undefined) {\n group.description(node.description);\n }\n\n node.aliases.forEach((alias) => group.alias(alias));\n group.addHelpCommand(false);\n addGlobalOptions(group);\n for (const child of visibleChildren) {\n const isDefaultChild =\n node.default !== undefined &&\n node.default.scope.includes(\"cli\") &&\n (child.name() === node.default.name || child.aliases().includes(node.default.name));\n\n group.addCommand(child, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n return group;\n}\n\nfunction addGlobalOptions(command: CommanderCommand): void {\n command\n .option(\"--preset <path>\", \"Load parameter defaults from a JSON file.\")\n .option(\"--yes\", \"Accept defaults and skip prompts.\")\n .option(\"--output <format>\", \"Output format.\", (value: string) => {\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n\n if (value === \"markdown\") {\n return \"md\";\n }\n\n throw new InvalidArgumentError('Invalid value for \"--output\". Expected one of: rich, md, markdown, json.');\n })\n .option(\"--verbose\", \"Print stack traces for unexpected errors.\");\n}\n\nfunction setNestedValue(target: Record<string, unknown>, path: string[], value: unknown): void {\n let cursor = target;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const segment = path[index] ?? \"\";\n const existing = cursor[segment];\n\n if (typeof existing === \"object\" && existing !== null) {\n cursor = existing as Record<string, unknown>;\n continue;\n }\n\n const next: Record<string, unknown> = {};\n cursor[segment] = next;\n cursor = next;\n }\n\n const leaf = path[path.length - 1];\n if (leaf !== undefined) {\n cursor[leaf] = value;\n }\n}\n\nfunction formatResolvedValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\", \");\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nasync function promptForField(field: FieldDefinition): Promise<unknown> {\n const schema = field.schema;\n if (schema.kind === \"enum\") {\n const options = schema.loadOptions\n ? await schema.loadOptions()\n : schema.values.map((value) => ({\n label: schema.labels?.[String(value)] ?? String(value),\n value,\n }));\n const selected = await select({\n message: field.description ?? field.displayPath,\n options,\n initialValue: field.hasDefault ? field.defaultValue : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n if (field.schema.kind === \"boolean\") {\n const selected = await confirm({\n message: field.displayPath,\n initialValue: field.hasDefault ? Boolean(field.defaultValue) : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n const entered = await promptText({\n message: field.displayPath,\n initialValue:\n field.hasDefault && field.defaultValue !== undefined\n ? formatResolvedValue(field.defaultValue)\n : undefined,\n });\n\n if (isCancel(entered)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (typeof entered !== \"string\") {\n throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\n }\n\n if (entered.trim().length === 0 && field.hasDefault) {\n return field.defaultValue;\n }\n\n if (field.schema.kind === \"array\") {\n return parseArrayValue(entered, field.schema, field.displayPath);\n }\n\n return parseScalarValue(entered, field.schema as ScalarSchema, field.displayPath);\n}\n\nfunction resolveOutput(resolvedFlags: ResolvedFlags): OutputMode {\n if (resolvedFlags.json === true) {\n return \"json\";\n }\n\n if (resolvedFlags.output !== undefined) {\n return resolvedFlags.output;\n }\n\n return \"rich\";\n}\n\nconst DESIGN_SYSTEM_OUTPUT_BY_MODE = {\n rich: \"terminal\",\n md: \"markdown\",\n json: \"json\",\n} as const satisfies Record<OutputMode, \"terminal\" | \"markdown\" | \"json\">;\n\nfunction toDesignSystemOutput(output: OutputMode): \"terminal\" | \"markdown\" | \"json\" {\n return DESIGN_SYSTEM_OUTPUT_BY_MODE[output];\n}\n\nasync function withOutputFormat<T>(output: OutputMode, fn: () => Promise<T>): Promise<T> {\n const previous = process.env.OUTPUT_FORMAT;\n process.env.OUTPUT_FORMAT = toDesignSystemOutput(output);\n resetOutputFormatCache();\n\n try {\n return await fn();\n } finally {\n if (previous === undefined) {\n delete process.env.OUTPUT_FORMAT;\n } else {\n process.env.OUTPUT_FORMAT = previous;\n }\n resetOutputFormatCache();\n }\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") =>\n readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasFieldValue(value: unknown): boolean {\n return value !== undefined;\n}\n\nfunction hasNestedField(fields: FieldDefinition[], path: string[]): boolean {\n return fields.some(\n (field) =>\n path.length < field.path.length &&\n path.every((segment, index) => field.path[index] === segment)\n );\n}\n\nfunction describeExpectedPresetValue(schema: FieldSchema): string {\n if (schema.kind === \"array\") {\n return \"an array\";\n }\n\n if (schema.kind === \"enum\") {\n return `one of: ${schema.values.map((value) => JSON.stringify(value)).join(\", \")}`;\n }\n\n return `a ${schema.kind}`;\n}\n\nfunction validatePresetScalarValue(\n value: unknown,\n schema: ScalarSchema,\n fieldPath: string,\n presetPath: string\n): string | number | boolean | null {\n if (value === null && schema.nullable === true) {\n return null;\n }\n\n switch (schema.kind) {\n case \"string\":\n if (typeof value !== \"string\") {\n break;\n }\n return value;\n\n case \"number\":\n if (!isValidNumberSchemaValue(value, schema)) {\n break;\n }\n return value;\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n break;\n }\n return value;\n\n case \"enum\": {\n const match = schema.values.find((candidate) => Object.is(candidate, value));\n if (match !== undefined) {\n return match;\n }\n break;\n }\n\n default:\n throw new UserError(`Unsupported CLI schema kind \"${schema.kind}\".`);\n }\n\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected ${describeExpectedPresetValue(schema)}.`\n );\n}\n\nfunction validatePresetFieldValue(\n value: unknown,\n field: FieldDefinition,\n presetPath: string\n): unknown {\n if (field.schema.kind !== \"array\") {\n return validatePresetScalarValue(value, field.schema as ScalarSchema, field.displayPath, presetPath);\n }\n\n const itemSchema = unwrapOptional(field.schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${field.displayPath}\" must use scalar items.`);\n }\n\n if (!Array.isArray(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array.`\n );\n }\n\n return value.map((item) =>\n validatePresetScalarValue(item, itemSchema as ScalarSchema, field.displayPath, presetPath)\n );\n}\n\nasync function loadPresetValues(\n fields: FieldDefinition[],\n presetPath: string\n): Promise<Record<string, unknown>> {\n let rawPreset: string;\n\n try {\n rawPreset = await readFile(presetPath, {\n encoding: \"utf8\",\n });\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new UserError(`Preset file \"${presetPath}\" was not found.`);\n }\n\n const message =\n error instanceof Error && error.message.length > 0\n ? error.message\n : \"Unknown read error.\";\n throw new UserError(`Preset file \"${presetPath}\" could not be read: ${message}`);\n }\n\n let parsedPreset: unknown;\n\n try {\n parsedPreset = JSON.parse(rawPreset);\n } catch {\n throw new UserError(`Preset file \"${presetPath}\" is not valid JSON.`);\n }\n\n if (!isPlainObject(parsedPreset)) {\n throw new UserError(`Preset file \"${presetPath}\" must contain a JSON object.`);\n }\n\n const fieldByPath = new Map(fields.map((field) => [field.displayPath, field]));\n const presetValues: Record<string, unknown> = {};\n\n function visitObject(current: Record<string, unknown>, path: string[]): void {\n for (const [key, value] of Object.entries(current)) {\n const nextPath = [...path, key];\n const displayPath = toDisplayPath(nextPath);\n const field = fieldByPath.get(displayPath);\n\n if (field !== undefined) {\n presetValues[field.optionAttribute] = validatePresetFieldValue(value, field, presetPath);\n continue;\n }\n\n if (!hasNestedField(fields, nextPath)) {\n throw new UserError(\n `Preset file \"${presetPath}\" contains unknown parameter \"${displayPath}\".`\n );\n }\n\n if (!isPlainObject(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${displayPath}\". Expected an object.`\n );\n }\n\n visitObject(value, nextPath);\n }\n }\n\n visitObject(parsedPreset, []);\n return presetValues;\n}\n\nfunction isNumericFixtureSelector(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeHttpMethod(value: string | undefined): string {\n return (value ?? \"GET\").toUpperCase();\n}\n\nfunction isReadLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"get\" ||\n normalized === \"head\" ||\n normalized === \"options\" ||\n normalized.startsWith(\"read\") ||\n normalized.startsWith(\"get\") ||\n normalized.startsWith(\"find\") ||\n normalized.startsWith(\"list\") ||\n normalized.startsWith(\"load\") ||\n normalized.startsWith(\"fetch\") ||\n normalized.startsWith(\"query\") ||\n normalized.startsWith(\"exists\") ||\n normalized.startsWith(\"has\")\n );\n}\n\nfunction isWriteLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"post\" ||\n normalized === \"put\" ||\n normalized === \"patch\" ||\n normalized === \"delete\" ||\n normalized.startsWith(\"write\") ||\n normalized.startsWith(\"set\") ||\n normalized.startsWith(\"save\") ||\n normalized.startsWith(\"create\") ||\n normalized.startsWith(\"update\") ||\n normalized.startsWith(\"delete\") ||\n normalized.startsWith(\"remove\") ||\n normalized.startsWith(\"insert\")\n );\n}\n\nfunction matchesFixtureValue(expected: unknown, actual: unknown): boolean {\n if (typeof expected === \"string\" && typeof actual === \"string\" && expected.endsWith(\"%\")) {\n return actual.startsWith(expected.slice(0, -1));\n }\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || expected.length !== actual.length) {\n return false;\n }\n\n return expected.every((item, index) => matchesFixtureValue(item, actual[index]));\n }\n\n if (isPlainObject(expected)) {\n if (!isPlainObject(actual)) {\n return false;\n }\n\n return Object.entries(expected).every(([key, value]) => matchesFixtureValue(value, actual[key]));\n }\n\n return Object.is(expected, actual);\n}\n\nfunction getFetchUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") {\n return input;\n }\n\n if (input instanceof URL) {\n return input.toString();\n }\n\n return input.url;\n}\n\nfunction createFixtureResponse(response: FixtureFetchResponse): Response {\n const status = response.status ?? 200;\n const headers = new Headers(response.headers);\n\n if (response.body === undefined) {\n return new Response(null, {\n status,\n headers,\n });\n }\n\n if (typeof response.body === \"string\") {\n return new Response(response.body, {\n status,\n headers,\n });\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return new Response(JSON.stringify(response.body), {\n status,\n headers,\n });\n}\n\nfunction createFixtureFetch(entries: FixtureFetchEntry[] | undefined): typeof globalThis.fetch {\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = normalizeHttpMethod(init?.method ?? (input instanceof Request ? input.method : undefined));\n const url = getFetchUrl(input);\n const match = entries?.find((entry) => {\n const requestMethod = normalizeHttpMethod(entry.request.method);\n return requestMethod === method && entry.request.url === url;\n });\n\n if (match !== undefined) {\n return createFixtureResponse(match.response);\n }\n\n if (isReadLikeMethod(method)) {\n return null as unknown as Response;\n }\n\n return new Response(null, {\n status: 204,\n });\n };\n}\n\nfunction createFixtureFs(definition: unknown): HandlerFs {\n const fsDefinition = isPlainObject(definition) ? definition : {};\n const readFileEntries = isPlainObject(fsDefinition.readFile) ? fsDefinition.readFile : {};\n const existsEntries = isPlainObject(fsDefinition.exists) ? fsDefinition.exists : {};\n\n return {\n readFile: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(readFileEntries, filePath)) {\n return String(readFileEntries[filePath]);\n }\n\n return null as unknown as string;\n },\n writeFile: async () => undefined,\n exists: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(existsEntries, filePath)) {\n return Boolean(existsEntries[filePath]);\n }\n\n return Object.prototype.hasOwnProperty.call(readFileEntries, filePath);\n },\n };\n}\n\nfunction resolveFixtureMethodResult(\n methodName: string,\n definition: unknown,\n args: unknown[]\n): Promise<unknown> {\n if (Array.isArray(definition)) {\n for (const entry of definition) {\n if (!isPlainObject(entry)) {\n continue;\n }\n\n const explicitMatcher = isPlainObject(entry.request) ? entry.request : undefined;\n const matcher =\n explicitMatcher ??\n Object.fromEntries(\n Object.entries(entry).filter(([key]) => key !== \"result\" && key !== \"response\" && key !== \"error\")\n );\n\n const firstArg = args[0];\n let matched = false;\n\n if (Array.isArray(matcher.args)) {\n matched = matchesFixtureValue(matcher.args, args);\n } else if (Object.keys(matcher).length === 0) {\n matched = true;\n } else if (isPlainObject(firstArg)) {\n matched = matchesFixtureValue(matcher, firstArg);\n } else if (args.length === 1 && Object.keys(matcher).length === 1) {\n const [[, expectedValue]] = Object.entries(matcher);\n matched = matchesFixtureValue(expectedValue, firstArg);\n }\n\n if (!matched) {\n continue;\n }\n\n if (entry.error !== undefined) {\n throw new Error(String(entry.error));\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"result\")) {\n return Promise.resolve(entry.result);\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"response\")) {\n return Promise.resolve(entry.response);\n }\n\n return Promise.resolve(null);\n }\n }\n\n if (isPlainObject(definition)) {\n const firstArg = args[0];\n\n if (typeof firstArg === \"string\" && Object.prototype.hasOwnProperty.call(definition, firstArg)) {\n return Promise.resolve(definition[firstArg]);\n }\n }\n\n if (isWriteLikeMethod(methodName)) {\n return Promise.resolve(undefined);\n }\n\n return Promise.resolve(null);\n}\n\nfunction createFixtureService(definition: unknown): Record<string, unknown> {\n const methods = isPlainObject(definition) ? definition : {};\n\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === \"then\") {\n return undefined;\n }\n\n const methodName = String(property);\n return async (...args: unknown[]) => resolveFixtureMethodResult(methodName, methods[methodName], args);\n },\n }\n );\n}\n\nfunction resolveFixturePath(commandPath: string): string {\n const parsed = path.parse(commandPath);\n return path.join(parsed.dir, `${parsed.name}.fixture.json`);\n}\n\nfunction selectFixtureScenario(scenarios: FixtureScenario[], selector: string): FixtureScenario {\n if (isNumericFixtureSelector(selector)) {\n const index = Number(selector) - 1;\n const scenario = scenarios[index];\n\n if (scenario === undefined) {\n throw new UserError(\n `Fixture scenario index ${selector} is out of range. Available scenarios: ${scenarios.length}.`\n );\n }\n\n return scenario;\n }\n\n const scenario = scenarios.find((entry) => entry.name === selector);\n\n if (scenario === undefined) {\n throw new UserError(`Fixture scenario \"${selector}\" was not found.`);\n }\n\n return scenario;\n}\n\nasync function loadFixtureScenario(command: Command<any, any, any, any>, selector: string): Promise<FixtureScenario> {\n const commandPath = getCommandSourcePath(command);\n\n if (commandPath === undefined) {\n throw new UserError(`Fixture mode could not determine the source file for command \"${command.name}\".`);\n }\n\n const fixturePath = resolveFixturePath(commandPath);\n let rawFixture: string;\n\n try {\n rawFixture = await readFile(fixturePath, {\n encoding: \"utf8\",\n });\n } catch {\n throw new UserError(\n `Fixture file not found for command \"${command.name}\". Expected ${fixturePath}.`\n );\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(rawFixture);\n } catch {\n throw new UserError(`Fixture file ${fixturePath} is not valid JSON.`);\n }\n\n if (!Array.isArray(parsed)) {\n throw new UserError(`Fixture file ${fixturePath} must contain a JSON array of scenarios.`);\n }\n\n return selectFixtureScenario(parsed as FixtureScenario[], selector);\n}\n\nfunction resolveFixtureSecrets(command: Command<any, any, any, any>): Record<string, string> {\n return Object.fromEntries(Object.keys(command.secrets).map((name) => [name, \"fixture-secret\"]));\n}\n\nfunction createFixtureEnvValues(command: Command<any, any, any, any>): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {\n ...process.env,\n POE_API_KEY: process.env.POE_API_KEY ?? \"fixture-secret\",\n };\n\n for (const secret of Object.values(command.secrets)) {\n values[secret.env] = values[secret.env] ?? \"fixture-secret\";\n }\n\n return values;\n}\n\nasync function resolveFixtureRuntime<TServices extends object>(\n command: Command<TServices, any, any, any>,\n services: TServices,\n requirementOptions: CommandRequirementOptions\n): Promise<ResolvedFixtureRuntime<TServices>> {\n const selector = process.env.CMDKIT_FIXTURE;\n\n if (selector === undefined || selector.length === 0) {\n return {\n env: createEnv(),\n fetch: globalThis.fetch,\n fs: createFs(),\n isFixture: false,\n requirementOptions,\n secrets: resolveCommandSecrets(command),\n services,\n };\n }\n\n const scenario = await loadFixtureScenario(command, selector);\n const scenarioServices = isPlainObject(scenario.services) ? scenario.services : {};\n const customServiceNames = new Set([\n ...Object.keys(services as Record<string, unknown>),\n ...Object.keys(scenarioServices).filter((name) => !RESERVED_SERVICE_NAMES.has(name)),\n ]);\n const fixtureServices = Object.fromEntries(\n [...customServiceNames].map((name) => [name, createFixtureService(scenarioServices[name])])\n ) as TServices;\n const fixtureEnvValues = createFixtureEnvValues(command);\n\n return {\n env: createEnv(fixtureEnvValues),\n fetch: createFixtureFetch(scenarioServices.fetch as FixtureFetchEntry[] | undefined),\n fs: createFixtureFs(scenarioServices.fs),\n isFixture: true,\n requirementOptions: {\n ...requirementOptions,\n env: fixtureEnvValues,\n },\n secrets: resolveFixtureSecrets(command),\n services: fixtureServices,\n };\n}\n\nfunction writeRichHeader(title: string): void {\n const padding = Math.max(12, 34 - title.length);\n process.stdout.write(`\u2500\u2500 ${title} ${\"\u2500\".repeat(padding)}\\n`);\n}\n\nfunction validateServices(services: Record<string, unknown>): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(`Service name \"${name}\" is reserved. Choose a different name.`);\n }\n }\n}\n\nasync function resolveParams(\n fields: FieldDefinition[],\n positionalValues: unknown[],\n optionValues: Record<string, unknown>,\n presetPath: string | undefined,\n shouldPrompt: boolean\n): Promise<Record<string, unknown>> {\n const params: Record<string, unknown> = {};\n const presetValues =\n typeof presetPath === \"string\" && presetPath.length > 0\n ? await loadPresetValues(fields, presetPath)\n : {};\n\n for (const field of fields) {\n let value: unknown;\n\n if (field.positionalIndex !== undefined) {\n const positionalValue = positionalValues[field.positionalIndex];\n\n if (field.schema.kind === \"array\") {\n if (Array.isArray(positionalValue) && positionalValue.length > 0) {\n const itemSchema = unwrapOptional(field.schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${field.displayPath}\" must use scalar items.`);\n }\n\n value = positionalValue.map((item) =>\n parseScalarValue(String(item), itemSchema as ScalarSchema, field.displayPath)\n );\n }\n } else if (typeof positionalValue === \"string\" && positionalValue.length > 0) {\n value = parseScalarValue(positionalValue, field.schema as ScalarSchema, field.displayPath);\n }\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(optionValues, field.commanderOptionAttribute) &&\n hasFieldValue(optionValues[field.commanderOptionAttribute])\n ) {\n value = optionValues[field.commanderOptionAttribute];\n }\n\n if (\n value === undefined &&\n field.commanderOptionAttribute === field.optionAttribute &&\n Object.prototype.hasOwnProperty.call(optionValues, field.optionAttribute) &&\n hasFieldValue(optionValues[field.optionAttribute])\n ) {\n value = optionValues[field.optionAttribute];\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(presetValues, field.optionAttribute)\n ) {\n value = presetValues[field.optionAttribute];\n }\n\n if (value === undefined && shouldPrompt && !field.optional) {\n value = await promptForField(field);\n }\n\n if (value === undefined && field.hasDefault) {\n value = field.defaultValue;\n }\n\n if (value === undefined) {\n if (field.optional) {\n continue;\n }\n\n throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\n }\n\n setNestedValue(params, field.path, value);\n }\n\n return params;\n}\n\nfunction getResolvedFlags(command: CommanderCommand): ResolvedFlags {\n const flags = command.optsWithGlobals() as ResolvedFlags;\n return flags;\n}\n\nasync function executeCommand<TServices extends object>(\n state: ExecutionState<TServices>,\n services: TServices,\n requirementOptions: CommandRequirementOptions\n): Promise<void> {\n const logger = createLogger();\n const primitives = {\n logger,\n renderTable,\n getTheme,\n note,\n };\n const optionValues = state.actionCommand.optsWithGlobals() as Record<string, unknown>;\n const resolvedFlags = optionValues as ResolvedFlags;\n const output = resolveOutput(resolvedFlags);\n const shouldPrompt = !resolvedFlags.yes && Boolean(process.stdin.isTTY);\n const runtime = await resolveFixtureRuntime(state.command, services, requirementOptions);\n const preflightContext = {\n ...runtime.services,\n secrets: runtime.secrets,\n fetch: runtime.fetch,\n fs: runtime.fs,\n env: runtime.env,\n progress(message: string): void {\n logger.info(message);\n },\n };\n\n await withOutputFormat(output, async () => {\n await assertCommandRequirements(state.command, preflightContext, runtime.requirementOptions);\n\n const params = await resolveParams(\n state.fields,\n state.positionalValues,\n optionValues,\n resolvedFlags.preset,\n shouldPrompt\n );\n\n const context = {\n ...preflightContext,\n params,\n } as HandlerContext<any, any, TServices>;\n\n if (state.command.confirm && !resolvedFlags.yes && process.stdin.isTTY) {\n for (const field of state.fields) {\n const value = field.path.reduce<unknown>(\n (current, segment) =>\n current && typeof current === \"object\"\n ? (current as Record<string, unknown>)[segment]\n : undefined,\n params\n );\n\n if (value !== undefined) {\n logger.resolved(field.displayPath, formatResolvedValue(value));\n }\n }\n\n const proceed = await confirm({\n message: \"Proceed?\",\n initialValue: true,\n });\n\n if (isCancel(proceed)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (proceed !== true) {\n throw new UserError(\"Operation cancelled.\");\n }\n }\n\n const result = await state.command.handler(context);\n\n if (output === \"rich\" && runtime.isFixture) {\n writeRichHeader(`${state.command.name} (fixture)`);\n }\n\n renderResult(state.command, result, output, primitives);\n });\n}\n\nfunction handleRunError(error: unknown, verbose: boolean): void {\n const logger = createLogger();\n\n if (error instanceof UserError) {\n logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof CommanderError) {\n process.exitCode = error.exitCode;\n if (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\") {\n return;\n }\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error(verbose ? message : `${message} Use --verbose for a stack trace.`);\n\n if (verbose && error instanceof Error && error.stack) {\n process.stderr.write(`${error.stack}\\n`);\n }\n\n process.exitCode = 1;\n}\n\nexport async function runCLI<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunCLIOptions<TServices> = {}\n): Promise<void> {\n const root = normalizeRoots(roots, process.argv);\n const casing = options.casing ?? \"kebab\";\n const services = (options.services ?? {}) as TServices;\n const requirementOptions = {\n apiVersion: options.apiVersion,\n } satisfies CommandRequirementOptions;\n\n validateServices(services as Record<string, unknown>);\n\n if (hasHelpFlag(process.argv)) {\n await renderGeneratedHelp(root, process.argv, options);\n return;\n }\n\n const program = new CommanderCommand();\n program.name(root.name);\n program.exitOverride();\n program.showHelpAfterError();\n program.addHelpCommand(false);\n addGlobalOptions(program);\n\n if (options.version !== undefined) {\n program.version(options.version, \"--version\");\n }\n\n const execute = async (state: ExecutionState<TServices>) => {\n try {\n await executeCommand(state, services, requirementOptions);\n } catch (error) {\n handleRunError(error, Boolean(getResolvedFlags(state.actionCommand).verbose));\n }\n };\n\n for (const child of root.children) {\n const command = createNodeCommand(child, casing, execute);\n if (command === null) {\n continue;\n }\n\n const isDefaultChild =\n root.default !== undefined &&\n root.default.scope.includes(\"cli\") &&\n (command.name() === root.default.name || command.aliases().includes(root.default.name));\n\n program.addCommand(command, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n handleRunError(error, process.argv.includes(\"--verbose\"));\n }\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "export const widths = {\n header: 60,\n helpColumn: 24,\n maxLine: 80\n} as const;\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().intro(content);\n },\n heading(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return getTheme().header(content);\n },\n section(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return typography.bold(content);\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().accent(content);\n },\n argument(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `<${content}>`;\n return getTheme().muted(content);\n },\n option(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().muted(content);\n },\n usageCommand(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}](${content})`;\n return getTheme().accent(content);\n },\n muted(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `*${content}*`;\n return getTheme().muted(content);\n },\n badge(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}]`;\n return getTheme().badge(content);\n },\n selectLabel(label: string, detail?: string): string {\n if (!detail) {\n return label;\n }\n const format = resolveOutputFormat();\n if (format !== \"terminal\") {\n return `${label} \u2014 ${detail}`;\n }\n return `${label} ${typography.dim(\"\u2014\")} ${typography.dim(detail)}`;\n }\n} as const;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "import chalk from \"chalk\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import chalk from \"chalk\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = chalk.gray(\"\u2502\"),\n secondarySymbol = chalk.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { text } from \"./text.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface CommandInfo {\n name: string;\n description: string;\n}\n\nexport interface OptionInfo {\n flags: string;\n description: string;\n}\n\nexport function formatCommand(name: string, description: string): string {\n const paddedName = name.padEnd(widths.helpColumn);\n return ` ${text.command(paddedName)} ${description}`;\n}\n\nexport function formatUsage(command: string, args?: string): string {\n const argsStr = args ? ` ${text.argument(args)}` : \"\";\n return `${text.usageCommand(command)}${argsStr}`;\n}\n\nexport function formatOption(flags: string, description: string): string {\n const paddedFlags = flags.padEnd(widths.helpColumn);\n return ` ${text.option(paddedFlags)} ${description}`;\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return commands.map((cmd) => formatCommand(cmd.name, cmd.description)).join(\"\\n\");\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return options.map((opt) => formatOption(opt.flags, opt.description)).join(\"\\n\");\n}\n\nexport const helpFormatter = {\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList\n} as const;\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { renderMarkdown } from \"../terminal-markdown/index.js\";\nimport { getAcpWriter } from \"./writer.js\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n getAcpWriter()(line);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nfunction formatCost(costUsd: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(costUsd);\n}\n\nexport function renderAgentMessage(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **agent:** ${text}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"agent_message\", text }));\n return;\n }\n\n const rendered = renderMarkdown(text).trimEnd();\n writeLine(`${AGENT_PREFIX}${rendered}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2192 ${kind}: ${title}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_start\", kind, title }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2713 ${kind}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_complete\", kind }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *thinking:* ${truncate(text, 80)}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"reasoning\", text }));\n return;\n }\n\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const format = resolveOutputFormat();\n const cached =\n typeof tokens.cached === \"number\" && tokens.cached > 0 ? ` (${tokens.cached} cached)` : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n cost = ` (${formatCost(tokens.costUsd)})`;\n }\n\n if (format === \"markdown\") {\n writeLine(`- **tokens:** ${tokens.input} in \u2192 ${tokens.output} out${cost}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(\n JSON.stringify({\n event: \"usage\",\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n cachedTokens: tokens.cached ?? 0,\n costUsd: tokens.costUsd ?? 0\n })\n );\n return;\n }\n\n writeLine(\"\");\n writeLine(chalk.green(`\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`));\n}\n\nexport function renderError(message: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **error:** ${message}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"error\", message }));\n return;\n }\n\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import chalk from \"chalk\";\nimport type { Cell, CellStyle, Rect } from \"./types.js\";\n\nconst EMPTY_CELL: Cell = { ch: \" \", style: {} };\n\nexport class ScreenBuffer {\n private _width: number;\n private _height: number;\n private _cells: Cell[];\n\n constructor(width: number, height: number) {\n this._width = normalizeSize(width);\n this._height = normalizeSize(height);\n this._cells = createCells(this._width, this._height);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n put(x: number, y: number, text: string, style?: CellStyle): void {\n if (!this.isInBoundsY(y) || text.length === 0) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n let offset = 0;\n\n for (const ch of text) {\n const targetX = x + offset;\n offset += 1;\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n get(x: number, y: number): Cell {\n if (!this.isInBounds(x, y)) {\n return cloneCell(EMPTY_CELL);\n }\n\n return cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n\n clear(style?: CellStyle): void {\n this._cells = createCells(this._width, this._height, style);\n }\n\n clearRect(rect: Rect, style?: CellStyle): void {\n const startX = Math.max(0, rect.x);\n const startY = Math.max(0, rect.y);\n const endX = Math.min(this._width, rect.x + Math.max(0, rect.width));\n const endY = Math.min(this._height, rect.y + Math.max(0, rect.height));\n const normalizedStyle = normalizeStyle(style);\n\n for (let y = startY; y < endY; y += 1) {\n for (let x = startX; x < endX; x += 1) {\n this._cells[this.index(x, y)] = { ch: \" \", style: normalizedStyle };\n }\n }\n }\n\n resize(width: number, height: number): void {\n const nextWidth = normalizeSize(width);\n const nextHeight = normalizeSize(height);\n const nextCells = createCells(nextWidth, nextHeight);\n const copyWidth = Math.min(this._width, nextWidth);\n const copyHeight = Math.min(this._height, nextHeight);\n\n for (let y = 0; y < copyHeight; y += 1) {\n for (let x = 0; x < copyWidth; x += 1) {\n nextCells[(y * nextWidth) + x] = cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n }\n\n this._width = nextWidth;\n this._height = nextHeight;\n this._cells = nextCells;\n }\n\n putInRect(rect: Rect, row: number, text: string, style?: CellStyle): void {\n if (row < 0 || row >= rect.height || text.length === 0 || rect.width <= 0) {\n return;\n }\n\n const y = rect.y + row;\n if (!this.isInBoundsY(y)) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n const rectEndX = rect.x + rect.width;\n let offset = 0;\n\n for (const ch of text) {\n const targetX = rect.x + offset;\n offset += 1;\n\n if (targetX >= rectEndX) {\n break;\n }\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n private index(x: number, y: number): number {\n return (y * this._width) + x;\n }\n\n private isInBounds(x: number, y: number): boolean {\n return this.isInBoundsX(x) && this.isInBoundsY(y);\n }\n\n private isInBoundsX(x: number): boolean {\n return x >= 0 && x < this._width;\n }\n\n private isInBoundsY(y: number): boolean {\n return y >= 0 && y < this._height;\n }\n}\n\nexport function diff(\n prev: ScreenBuffer,\n next: ScreenBuffer\n): Array<{ x: number; y: number; cell: Cell }> {\n const changes: Array<{ x: number; y: number; cell: Cell }> = [];\n const width = Math.max(prev.width, next.width);\n const height = Math.max(prev.height, next.height);\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const previousCell = prev.get(x, y);\n const nextCell = next.get(x, y);\n\n if (!cellsEqual(previousCell, nextCell)) {\n changes.push({ x, y, cell: nextCell });\n }\n }\n }\n\n return changes;\n}\n\nexport function cellToAnsi(cell: Cell): string {\n const style = cell.style ?? {};\n let painter = chalk;\n\n if (style.bold) {\n painter = painter.bold;\n }\n\n if (style.dim) {\n painter = painter.dim;\n }\n\n if (style.fg) {\n painter = applyForegroundColor(painter, style.fg);\n }\n\n if (style.bg) {\n painter = applyBackgroundColor(painter, style.bg);\n }\n\n return painter(cell.ch);\n}\n\nfunction createCells(width: number, height: number, style?: CellStyle): Cell[] {\n const normalizedStyle = normalizeStyle(style);\n return Array.from({ length: width * height }, () => ({ ch: \" \", style: normalizedStyle }));\n}\n\nfunction cloneCell(cell: Cell): Cell {\n return {\n ch: cell.ch,\n style: normalizeStyle(cell.style)\n };\n}\n\nfunction normalizeStyle(style?: CellStyle): CellStyle {\n const next: CellStyle = {};\n\n if (style?.fg !== undefined) {\n next.fg = style.fg;\n }\n\n if (style?.bg !== undefined) {\n next.bg = style.bg;\n }\n\n if (style?.bold !== undefined) {\n next.bold = style.bold;\n }\n\n if (style?.dim !== undefined) {\n next.dim = style.dim;\n }\n\n return next;\n}\n\nfunction normalizeSize(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction cellsEqual(left: Cell, right: Cell): boolean {\n return left.ch === right.ch\n && left.style.fg === right.style.fg\n && left.style.bg === right.style.bg\n && left.style.bold === right.style.bold\n && left.style.dim === right.style.dim;\n}\n\nfunction applyForegroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.hex(color);\n }\n\n const painter = (instance as unknown as Record<string, unknown>)[color];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n\nfunction applyBackgroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.bgHex(color);\n }\n\n const methodName = color.startsWith(\"bg\")\n ? color\n : `bg${color.charAt(0).toUpperCase()}${color.slice(1)}`;\n const painter = (instance as unknown as Record<string, unknown>)[methodName];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import chalk from \"chalk\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nexport { isCancel } from \"@clack/core\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2514\")} ${chalk.red(msg)}\\n\\n`);\n}\n", "/* MAIN */\n//URL: https://github.com/sindresorhus/get-east-asian-width/blob/main/lookup.js\n//LICENSE: https://github.com/sindresorhus/get-east-asian-width/blob/main/license\n//TODO: Replace these with some unicode property classes, if the ones we need exist\nconst isAmbiguous = (x) => {\n return x === 0xA1 || x === 0xA4 || x === 0xA7 || x === 0xA8 || x === 0xAA || x === 0xAD || x === 0xAE || x >= 0xB0 && x <= 0xB4 || x >= 0xB6 && x <= 0xBA || x >= 0xBC && x <= 0xBF || x === 0xC6 || x === 0xD0 || x === 0xD7 || x === 0xD8 || x >= 0xDE && x <= 0xE1 || x === 0xE6 || x >= 0xE8 && x <= 0xEA || x === 0xEC || x === 0xED || x === 0xF0 || x === 0xF2 || x === 0xF3 || x >= 0xF7 && x <= 0xFA || x === 0xFC || x === 0xFE || x === 0x101 || x === 0x111 || x === 0x113 || x === 0x11B || x === 0x126 || x === 0x127 || x === 0x12B || x >= 0x131 && x <= 0x133 || x === 0x138 || x >= 0x13F && x <= 0x142 || x === 0x144 || x >= 0x148 && x <= 0x14B || x === 0x14D || x === 0x152 || x === 0x153 || x === 0x166 || x === 0x167 || x === 0x16B || x === 0x1CE || x === 0x1D0 || x === 0x1D2 || x === 0x1D4 || x === 0x1D6 || x === 0x1D8 || x === 0x1DA || x === 0x1DC || x === 0x251 || x === 0x261 || x === 0x2C4 || x === 0x2C7 || x >= 0x2C9 && x <= 0x2CB || x === 0x2CD || x === 0x2D0 || x >= 0x2D8 && x <= 0x2DB || x === 0x2DD || x === 0x2DF || x >= 0x300 && x <= 0x36F || x >= 0x391 && x <= 0x3A1 || x >= 0x3A3 && x <= 0x3A9 || x >= 0x3B1 && x <= 0x3C1 || x >= 0x3C3 && x <= 0x3C9 || x === 0x401 || x >= 0x410 && x <= 0x44F || x === 0x451 || x === 0x2010 || x >= 0x2013 && x <= 0x2016 || x === 0x2018 || x === 0x2019 || x === 0x201C || x === 0x201D || x >= 0x2020 && x <= 0x2022 || x >= 0x2024 && x <= 0x2027 || x === 0x2030 || x === 0x2032 || x === 0x2033 || x === 0x2035 || x === 0x203B || x === 0x203E || x === 0x2074 || x === 0x207F || x >= 0x2081 && x <= 0x2084 || x === 0x20AC || x === 0x2103 || x === 0x2105 || x === 0x2109 || x === 0x2113 || x === 0x2116 || x === 0x2121 || x === 0x2122 || x === 0x2126 || x === 0x212B || x === 0x2153 || x === 0x2154 || x >= 0x215B && x <= 0x215E || x >= 0x2160 && x <= 0x216B || x >= 0x2170 && x <= 0x2179 || x === 0x2189 || x >= 0x2190 && x <= 0x2199 || x === 0x21B8 || x === 0x21B9 || x === 0x21D2 || x === 0x21D4 || x === 0x21E7 || x === 0x2200 || x === 0x2202 || x === 0x2203 || x === 0x2207 || x === 0x2208 || x === 0x220B || x === 0x220F || x === 0x2211 || x === 0x2215 || x === 0x221A || x >= 0x221D && x <= 0x2220 || x === 0x2223 || x === 0x2225 || x >= 0x2227 && x <= 0x222C || x === 0x222E || x >= 0x2234 && x <= 0x2237 || x === 0x223C || x === 0x223D || x === 0x2248 || x === 0x224C || x === 0x2252 || x === 0x2260 || x === 0x2261 || x >= 0x2264 && x <= 0x2267 || x === 0x226A || x === 0x226B || x === 0x226E || x === 0x226F || x === 0x2282 || x === 0x2283 || x === 0x2286 || x === 0x2287 || x === 0x2295 || x === 0x2299 || x === 0x22A5 || x === 0x22BF || x === 0x2312 || x >= 0x2460 && x <= 0x24E9 || x >= 0x24EB && x <= 0x254B || x >= 0x2550 && x <= 0x2573 || x >= 0x2580 && x <= 0x258F || x >= 0x2592 && x <= 0x2595 || x === 0x25A0 || x === 0x25A1 || x >= 0x25A3 && x <= 0x25A9 || x === 0x25B2 || x === 0x25B3 || x === 0x25B6 || x === 0x25B7 || x === 0x25BC || x === 0x25BD || x === 0x25C0 || x === 0x25C1 || x >= 0x25C6 && x <= 0x25C8 || x === 0x25CB || x >= 0x25CE && x <= 0x25D1 || x >= 0x25E2 && x <= 0x25E5 || x === 0x25EF || x === 0x2605 || x === 0x2606 || x === 0x2609 || x === 0x260E || x === 0x260F || x === 0x261C || x === 0x261E || x === 0x2640 || x === 0x2642 || x === 0x2660 || x === 0x2661 || x >= 0x2663 && x <= 0x2665 || x >= 0x2667 && x <= 0x266A || x === 0x266C || x === 0x266D || x === 0x266F || x === 0x269E || x === 0x269F || x === 0x26BF || x >= 0x26C6 && x <= 0x26CD || x >= 0x26CF && x <= 0x26D3 || x >= 0x26D5 && x <= 0x26E1 || x === 0x26E3 || x === 0x26E8 || x === 0x26E9 || x >= 0x26EB && x <= 0x26F1 || x === 0x26F4 || x >= 0x26F6 && x <= 0x26F9 || x === 0x26FB || x === 0x26FC || x === 0x26FE || x === 0x26FF || x === 0x273D || x >= 0x2776 && x <= 0x277F || x >= 0x2B56 && x <= 0x2B59 || x >= 0x3248 && x <= 0x324F || x >= 0xE000 && x <= 0xF8FF || x >= 0xFE00 && x <= 0xFE0F || x === 0xFFFD || x >= 0x1F100 && x <= 0x1F10A || x >= 0x1F110 && x <= 0x1F12D || x >= 0x1F130 && x <= 0x1F169 || x >= 0x1F170 && x <= 0x1F18D || x === 0x1F18F || x === 0x1F190 || x >= 0x1F19B && x <= 0x1F1AC || x >= 0xE0100 && x <= 0xE01EF || x >= 0xF0000 && x <= 0xFFFFD || x >= 0x100000 && x <= 0x10FFFD;\n};\nconst isFullWidth = (x) => {\n return x === 0x3000 || x >= 0xFF01 && x <= 0xFF60 || x >= 0xFFE0 && x <= 0xFFE6;\n};\nconst isWide = (x) => {\n return x >= 0x1100 && x <= 0x115F || x === 0x231A || x === 0x231B || x === 0x2329 || x === 0x232A || x >= 0x23E9 && x <= 0x23EC || x === 0x23F0 || x === 0x23F3 || x === 0x25FD || x === 0x25FE || x === 0x2614 || x === 0x2615 || x >= 0x2648 && x <= 0x2653 || x === 0x267F || x === 0x2693 || x === 0x26A1 || x === 0x26AA || x === 0x26AB || x === 0x26BD || x === 0x26BE || x === 0x26C4 || x === 0x26C5 || x === 0x26CE || x === 0x26D4 || x === 0x26EA || x === 0x26F2 || x === 0x26F3 || x === 0x26F5 || x === 0x26FA || x === 0x26FD || x === 0x2705 || x === 0x270A || x === 0x270B || x === 0x2728 || x === 0x274C || x === 0x274E || x >= 0x2753 && x <= 0x2755 || x === 0x2757 || x >= 0x2795 && x <= 0x2797 || x === 0x27B0 || x === 0x27BF || x === 0x2B1B || x === 0x2B1C || x === 0x2B50 || x === 0x2B55 || x >= 0x2E80 && x <= 0x2E99 || x >= 0x2E9B && x <= 0x2EF3 || x >= 0x2F00 && x <= 0x2FD5 || x >= 0x2FF0 && x <= 0x2FFF || x >= 0x3001 && x <= 0x303E || x >= 0x3041 && x <= 0x3096 || x >= 0x3099 && x <= 0x30FF || x >= 0x3105 && x <= 0x312F || x >= 0x3131 && x <= 0x318E || x >= 0x3190 && x <= 0x31E3 || x >= 0x31EF && x <= 0x321E || x >= 0x3220 && x <= 0x3247 || x >= 0x3250 && x <= 0x4DBF || x >= 0x4E00 && x <= 0xA48C || x >= 0xA490 && x <= 0xA4C6 || x >= 0xA960 && x <= 0xA97C || x >= 0xAC00 && x <= 0xD7A3 || x >= 0xF900 && x <= 0xFAFF || x >= 0xFE10 && x <= 0xFE19 || x >= 0xFE30 && x <= 0xFE52 || x >= 0xFE54 && x <= 0xFE66 || x >= 0xFE68 && x <= 0xFE6B || x >= 0x16FE0 && x <= 0x16FE4 || x === 0x16FF0 || x === 0x16FF1 || x >= 0x17000 && x <= 0x187F7 || x >= 0x18800 && x <= 0x18CD5 || x >= 0x18D00 && x <= 0x18D08 || x >= 0x1AFF0 && x <= 0x1AFF3 || x >= 0x1AFF5 && x <= 0x1AFFB || x === 0x1AFFD || x === 0x1AFFE || x >= 0x1B000 && x <= 0x1B122 || x === 0x1B132 || x >= 0x1B150 && x <= 0x1B152 || x === 0x1B155 || x >= 0x1B164 && x <= 0x1B167 || x >= 0x1B170 && x <= 0x1B2FB || x === 0x1F004 || x === 0x1F0CF || x === 0x1F18E || x >= 0x1F191 && x <= 0x1F19A || x >= 0x1F200 && x <= 0x1F202 || x >= 0x1F210 && x <= 0x1F23B || x >= 0x1F240 && x <= 0x1F248 || x === 0x1F250 || x === 0x1F251 || x >= 0x1F260 && x <= 0x1F265 || x >= 0x1F300 && x <= 0x1F320 || x >= 0x1F32D && x <= 0x1F335 || x >= 0x1F337 && x <= 0x1F37C || x >= 0x1F37E && x <= 0x1F393 || x >= 0x1F3A0 && x <= 0x1F3CA || x >= 0x1F3CF && x <= 0x1F3D3 || x >= 0x1F3E0 && x <= 0x1F3F0 || x === 0x1F3F4 || x >= 0x1F3F8 && x <= 0x1F43E || x === 0x1F440 || x >= 0x1F442 && x <= 0x1F4FC || x >= 0x1F4FF && x <= 0x1F53D || x >= 0x1F54B && x <= 0x1F54E || x >= 0x1F550 && x <= 0x1F567 || x === 0x1F57A || x === 0x1F595 || x === 0x1F596 || x === 0x1F5A4 || x >= 0x1F5FB && x <= 0x1F64F || x >= 0x1F680 && x <= 0x1F6C5 || x === 0x1F6CC || x >= 0x1F6D0 && x <= 0x1F6D2 || x >= 0x1F6D5 && x <= 0x1F6D7 || x >= 0x1F6DC && x <= 0x1F6DF || x === 0x1F6EB || x === 0x1F6EC || x >= 0x1F6F4 && x <= 0x1F6FC || x >= 0x1F7E0 && x <= 0x1F7EB || x === 0x1F7F0 || x >= 0x1F90C && x <= 0x1F93A || x >= 0x1F93C && x <= 0x1F945 || x >= 0x1F947 && x <= 0x1F9FF || x >= 0x1FA70 && x <= 0x1FA7C || x >= 0x1FA80 && x <= 0x1FA88 || x >= 0x1FA90 && x <= 0x1FABD || x >= 0x1FABF && x <= 0x1FAC5 || x >= 0x1FACE && x <= 0x1FADB || x >= 0x1FAE0 && x <= 0x1FAE8 || x >= 0x1FAF0 && x <= 0x1FAF8 || x >= 0x20000 && x <= 0x2FFFD || x >= 0x30000 && x <= 0x3FFFD;\n};\n/* EXPORT */\nexport { isAmbiguous, isFullWidth, isWide };\n", "/* IMPORT */\nimport { isAmbiguous, isFullWidth, isWide } from './utils.js';\n/* HELPERS */\nconst ANSI_RE = /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y;\nconst CONTROL_RE = /[\\x00-\\x08\\x0A-\\x1F\\x7F-\\x9F]{1,1000}/y;\nconst TAB_RE = /\\t{1,1000}/y;\nconst EMOJI_RE = /[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*/yu;\nconst LATIN_RE = /(?:[\\x20-\\x7E\\xA0-\\xFF](?!\\uFE0F)){1,1000}/y;\nconst MODIFIER_RE = /\\p{M}+/gu;\nconst NO_TRUNCATION = { limit: Infinity, ellipsis: '' };\n/* MAIN */\n//TODO: Optimize matching non-latin letters\nconst getStringTruncatedWidth = (input, truncationOptions = {}, widthOptions = {}) => {\n /* CONSTANTS */\n const LIMIT = truncationOptions.limit ?? Infinity;\n const ELLIPSIS = truncationOptions.ellipsis ?? '';\n const ELLIPSIS_WIDTH = truncationOptions?.ellipsisWidth ?? (ELLIPSIS ? getStringTruncatedWidth(ELLIPSIS, NO_TRUNCATION, widthOptions).width : 0);\n const ANSI_WIDTH = widthOptions.ansiWidth ?? 0;\n const CONTROL_WIDTH = widthOptions.controlWidth ?? 0;\n const TAB_WIDTH = widthOptions.tabWidth ?? 8;\n const AMBIGUOUS_WIDTH = widthOptions.ambiguousWidth ?? 1;\n const EMOJI_WIDTH = widthOptions.emojiWidth ?? 2;\n const FULL_WIDTH_WIDTH = widthOptions.fullWidthWidth ?? 2;\n const REGULAR_WIDTH = widthOptions.regularWidth ?? 1;\n const WIDE_WIDTH = widthOptions.wideWidth ?? 2;\n /* STATE */\n let indexPrev = 0;\n let index = 0;\n let length = input.length;\n let lengthExtra = 0;\n let truncationEnabled = false;\n let truncationIndex = length;\n let truncationLimit = Math.max(0, LIMIT - ELLIPSIS_WIDTH);\n let unmatchedStart = 0;\n let unmatchedEnd = 0;\n let width = 0;\n let widthExtra = 0;\n /* PARSE LOOP */\n outer: while (true) {\n /* UNMATCHED */\n if ((unmatchedEnd > unmatchedStart) || (index >= length && index > indexPrev)) {\n const unmatched = input.slice(unmatchedStart, unmatchedEnd) || input.slice(indexPrev, index);\n lengthExtra = 0;\n for (const char of unmatched.replaceAll(MODIFIER_RE, '')) {\n const codePoint = char.codePointAt(0) || 0;\n if (isFullWidth(codePoint)) {\n widthExtra = FULL_WIDTH_WIDTH;\n }\n else if (isWide(codePoint)) {\n widthExtra = WIDE_WIDTH;\n }\n else if (AMBIGUOUS_WIDTH !== REGULAR_WIDTH && isAmbiguous(codePoint)) {\n widthExtra = AMBIGUOUS_WIDTH;\n }\n else {\n widthExtra = REGULAR_WIDTH;\n }\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, Math.max(unmatchedStart, indexPrev) + lengthExtra);\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break outer;\n }\n lengthExtra += char.length;\n width += widthExtra;\n }\n unmatchedStart = unmatchedEnd = 0;\n }\n /* EXITING */\n if (index >= length)\n break;\n /* LATIN */\n LATIN_RE.lastIndex = index;\n if (LATIN_RE.test(input)) {\n lengthExtra = LATIN_RE.lastIndex - index;\n widthExtra = lengthExtra * REGULAR_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / REGULAR_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = LATIN_RE.lastIndex;\n continue;\n }\n /* ANSI */\n ANSI_RE.lastIndex = index;\n if (ANSI_RE.test(input)) {\n if ((width + ANSI_WIDTH) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index);\n }\n if ((width + ANSI_WIDTH) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += ANSI_WIDTH;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = ANSI_RE.lastIndex;\n continue;\n }\n /* CONTROL */\n CONTROL_RE.lastIndex = index;\n if (CONTROL_RE.test(input)) {\n lengthExtra = CONTROL_RE.lastIndex - index;\n widthExtra = lengthExtra * CONTROL_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / CONTROL_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = CONTROL_RE.lastIndex;\n continue;\n }\n /* TAB */\n TAB_RE.lastIndex = index;\n if (TAB_RE.test(input)) {\n lengthExtra = TAB_RE.lastIndex - index;\n widthExtra = lengthExtra * TAB_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / TAB_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = TAB_RE.lastIndex;\n continue;\n }\n /* EMOJI */\n EMOJI_RE.lastIndex = index;\n if (EMOJI_RE.test(input)) {\n if ((width + EMOJI_WIDTH) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index);\n }\n if ((width + EMOJI_WIDTH) > LIMIT) {\n truncationEnabled = true;\n break;\n }\n width += EMOJI_WIDTH;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = EMOJI_RE.lastIndex;\n continue;\n }\n /* UNMATCHED INDEX */\n index += 1;\n }\n /* RETURN */\n return {\n width: truncationEnabled ? truncationLimit : width,\n index: truncationEnabled ? truncationIndex : length,\n truncated: truncationEnabled,\n ellipsed: truncationEnabled && LIMIT >= ELLIPSIS_WIDTH\n };\n};\n/* EXPORT */\nexport default getStringTruncatedWidth;\n", "/* IMPORT */\nimport fastStringTruncatedWidth from 'fast-string-truncated-width';\n/* HELPERS */\nconst NO_TRUNCATION = {\n limit: Infinity,\n ellipsis: '',\n ellipsisWidth: 0,\n};\n/* MAIN */\nconst fastStringWidth = (input, options = {}) => {\n return fastStringTruncatedWidth(input, NO_TRUNCATION, options).width;\n};\n/* EXPORT */\nexport default fastStringWidth;\n", "import stringWidth from 'fast-string-width';\nconst ESC = '\\x1B';\nconst CSI = '\\x9B';\nconst END_CODE = 39;\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;\nconst GROUP_REGEX = new RegExp(`(?:\\\\${ANSI_CSI}(?<code>\\\\d+)m|\\\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`, 'y');\nconst getClosingCode = (openingCode) => {\n if (openingCode >= 30 && openingCode <= 37)\n return 39;\n if (openingCode >= 90 && openingCode <= 97)\n return 39;\n if (openingCode >= 40 && openingCode <= 47)\n return 49;\n if (openingCode >= 100 && openingCode <= 107)\n return 49;\n if (openingCode === 1 || openingCode === 2)\n return 22;\n if (openingCode === 3)\n return 23;\n if (openingCode === 4)\n return 24;\n if (openingCode === 7)\n return 27;\n if (openingCode === 8)\n return 28;\n if (openingCode === 9)\n return 29;\n if (openingCode === 0)\n return 0;\n return undefined;\n};\nconst wrapAnsiCode = (code) => `${ESC}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = (url) => `${ESC}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;\nconst wordLengths = (words) => words.map((character) => stringWidth(character));\nconst wrapWord = (rows, word, columns) => {\n const characters = word[Symbol.iterator]();\n let isInsideEscape = false;\n let isInsideLinkEscape = false;\n let lastRow = rows.at(-1);\n let visible = lastRow === undefined ? 0 : stringWidth(lastRow);\n let currentCharacter = characters.next();\n let nextCharacter = characters.next();\n let rawCharacterIndex = 0;\n while (!currentCharacter.done) {\n const character = currentCharacter.value;\n const characterLength = stringWidth(character);\n if (visible + characterLength <= columns) {\n rows[rows.length - 1] += character;\n }\n else {\n rows.push(character);\n visible = 0;\n }\n if (character === ESC || character === CSI) {\n isInsideEscape = true;\n isInsideLinkEscape = word.startsWith(ANSI_ESCAPE_LINK, rawCharacterIndex + 1);\n }\n if (isInsideEscape) {\n if (isInsideLinkEscape) {\n if (character === ANSI_ESCAPE_BELL) {\n isInsideEscape = false;\n isInsideLinkEscape = false;\n }\n }\n else if (character === ANSI_SGR_TERMINATOR) {\n isInsideEscape = false;\n }\n }\n else {\n visible += characterLength;\n if (visible === columns && !nextCharacter.done) {\n rows.push('');\n visible = 0;\n }\n }\n currentCharacter = nextCharacter;\n nextCharacter = characters.next();\n rawCharacterIndex += character.length;\n }\n lastRow = rows.at(-1);\n if (!visible &&\n lastRow !== undefined &&\n lastRow.length > 0 &&\n rows.length > 1) {\n rows[rows.length - 2] += rows.pop();\n }\n};\nconst stringVisibleTrimSpacesRight = (string) => {\n const words = string.split(' ');\n let last = words.length;\n while (last > 0) {\n if (stringWidth(words[last - 1]) > 0) {\n break;\n }\n last--;\n }\n if (last === words.length) {\n return string;\n }\n return words.slice(0, last).join(' ') + words.slice(last).join('');\n};\nconst exec = (string, columns, options = {}) => {\n if (options.trim !== false && string.trim() === '') {\n return '';\n }\n let returnValue = '';\n let escapeCode;\n let escapeUrl;\n const words = string.split(' ');\n const lengths = wordLengths(words);\n let rows = [''];\n for (const [index, word] of words.entries()) {\n if (options.trim !== false) {\n rows[rows.length - 1] = (rows.at(-1) ?? '').trimStart();\n }\n let rowLength = stringWidth(rows.at(-1) ?? '');\n if (index !== 0) {\n if (rowLength >= columns &&\n (options.wordWrap === false || options.trim === false)) {\n rows.push('');\n rowLength = 0;\n }\n if (rowLength > 0 || options.trim === false) {\n rows[rows.length - 1] += ' ';\n rowLength++;\n }\n }\n if (options.hard && lengths[index] > columns) {\n const remainingColumns = columns - rowLength;\n const breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);\n const breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);\n if (breaksStartingNextLine < breaksStartingThisLine) {\n rows.push('');\n }\n wrapWord(rows, word, columns);\n continue;\n }\n if (rowLength + lengths[index] > columns &&\n rowLength > 0 &&\n lengths[index] > 0) {\n if (options.wordWrap === false && rowLength < columns) {\n wrapWord(rows, word, columns);\n continue;\n }\n rows.push('');\n }\n if (rowLength + lengths[index] > columns && options.wordWrap === false) {\n wrapWord(rows, word, columns);\n continue;\n }\n rows[rows.length - 1] += word;\n }\n if (options.trim !== false) {\n rows = rows.map((row) => stringVisibleTrimSpacesRight(row));\n }\n const preString = rows.join('\\n');\n const pre = preString[Symbol.iterator]();\n let currentPre = pre.next();\n let nextPre = pre.next();\n // We need to keep a separate index as `String#slice()` works on Unicode code units, while `pre` is an array of codepoints.\n let preStringIndex = 0;\n while (!currentPre.done) {\n const character = currentPre.value;\n const nextCharacter = nextPre.value;\n returnValue += character;\n if (character === ESC || character === CSI) {\n GROUP_REGEX.lastIndex = preStringIndex + 1;\n const groupsResult = GROUP_REGEX.exec(preString);\n const groups = groupsResult?.groups;\n if (groups?.code !== undefined) {\n const code = Number.parseFloat(groups.code);\n escapeCode = code === END_CODE ? undefined : code;\n }\n else if (groups?.uri !== undefined) {\n escapeUrl = groups.uri.length === 0 ? undefined : groups.uri;\n }\n }\n const closingCode = escapeCode ? getClosingCode(escapeCode) : undefined;\n if (nextCharacter === '\\n') {\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink('');\n }\n if (escapeCode && closingCode) {\n returnValue += wrapAnsiCode(closingCode);\n }\n }\n else if (character === '\\n') {\n if (escapeCode && closingCode) {\n returnValue += wrapAnsiCode(escapeCode);\n }\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink(escapeUrl);\n }\n }\n preStringIndex += character.length;\n currentPre = nextPre;\n nextPre = pre.next();\n }\n return returnValue;\n};\nexport function wrapAnsi(string, columns, options) {\n return String(string)\n .normalize()\n .replaceAll('\\r\\n', '\\n')\n .split('\\n')\n .map((line) => exec(line, columns, options))\n .join('\\n');\n}\n//# sourceMappingURL=main.js.map", "const actions = ['up', 'down', 'left', 'right', 'space', 'enter', 'cancel'] as const;\nexport type Action = (typeof actions)[number];\n\n/** Global settings for Clack programs, stored in memory */\ninterface InternalClackSettings {\n\tactions: Set<Action>;\n\taliases: Map<string, Action>;\n\tmessages: {\n\t\tcancel: string;\n\t\terror: string;\n\t};\n\twithGuide: boolean;\n}\n\nexport const settings: InternalClackSettings = {\n\tactions: new Set(actions),\n\taliases: new Map<string, Action>([\n\t\t// vim support\n\t\t['k', 'up'],\n\t\t['j', 'down'],\n\t\t['h', 'left'],\n\t\t['l', 'right'],\n\t\t['\\x03', 'cancel'],\n\t\t// opinionated defaults!\n\t\t['escape', 'cancel'],\n\t]),\n\tmessages: {\n\t\tcancel: 'Canceled',\n\t\terror: 'Something went wrong',\n\t},\n\twithGuide: true,\n};\n\nexport interface ClackSettings {\n\t/**\n\t * Set custom global aliases for the default actions.\n\t * This will not overwrite existing aliases, it will only add new ones!\n\t *\n\t * @param aliases - An object that maps aliases to actions\n\t * @default { k: 'up', j: 'down', h: 'left', l: 'right', '\\x03': 'cancel', 'escape': 'cancel' }\n\t */\n\taliases?: Record<string, Action>;\n\n\t/**\n\t * Custom messages for prompts\n\t */\n\tmessages?: {\n\t\t/**\n\t\t * Custom message to display when a spinner is cancelled\n\t\t * @default \"Canceled\"\n\t\t */\n\t\tcancel?: string;\n\t\t/**\n\t\t * Custom message to display when a spinner encounters an error\n\t\t * @default \"Something went wrong\"\n\t\t */\n\t\terror?: string;\n\t};\n\n\twithGuide?: boolean;\n}\n\nexport function updateSettings(updates: ClackSettings) {\n\t// Handle each property in the updates\n\tif (updates.aliases !== undefined) {\n\t\tconst aliases = updates.aliases;\n\t\tfor (const alias in aliases) {\n\t\t\tif (!Object.hasOwn(aliases, alias)) continue;\n\n\t\t\tconst action = aliases[alias];\n\t\t\tif (!settings.actions.has(action)) continue;\n\n\t\t\tif (!settings.aliases.has(alias)) {\n\t\t\t\tsettings.aliases.set(alias, action);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (updates.messages !== undefined) {\n\t\tconst messages = updates.messages;\n\t\tif (messages.cancel !== undefined) {\n\t\t\tsettings.messages.cancel = messages.cancel;\n\t\t}\n\t\tif (messages.error !== undefined) {\n\t\t\tsettings.messages.error = messages.error;\n\t\t}\n\t}\n\n\tif (updates.withGuide !== undefined) {\n\t\tsettings.withGuide = updates.withGuide !== false;\n\t}\n}\n\n/**\n * Check if a key is an alias for a default action\n * @param key - The raw key which might match to an action\n * @param action - The action to match\n * @returns boolean\n */\nexport function isActionKey(key: string | Array<string | undefined>, action: Action) {\n\tif (typeof key === 'string') {\n\t\treturn settings.aliases.get(key) === action;\n\t}\n\n\tfor (const value of key) {\n\t\tif (value === undefined) continue;\n\t\tif (isActionKey(value, action)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n", "export function diffLines(a: string, b: string) {\n\tif (a === b) return;\n\n\tconst aLines = a.split('\\n');\n\tconst bLines = b.split('\\n');\n\tconst numLines = Math.max(aLines.length, bLines.length);\n\tconst diff: number[] = [];\n\n\tfor (let i = 0; i < numLines; i++) {\n\t\tif (aLines[i] !== bLines[i]) diff.push(i);\n\t}\n\n\treturn {\n\t\tlines: diff,\n\t\tnumLinesBefore: aLines.length,\n\t\tnumLinesAfter: bLines.length,\n\t\tnumLines,\n\t};\n}\n", "import { stdin, stdout } from 'node:process';\nimport type { Key } from 'node:readline';\nimport * as readline from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { ReadStream } from 'node:tty';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor } from 'sisteransi';\nimport { isActionKey } from './settings.js';\n\nexport * from './settings.js';\nexport * from './string.js';\n\nconst isWindows = globalThis.process.platform.startsWith('win');\n\nexport const CANCEL_SYMBOL = Symbol('clack:cancel');\n\nexport function isCancel(value: unknown): value is symbol {\n\treturn value === CANCEL_SYMBOL;\n}\n\nexport function setRawMode(input: Readable, value: boolean) {\n\tconst i = input as typeof stdin;\n\n\tif (i.isTTY) i.setRawMode(value);\n}\n\ninterface BlockOptions {\n\tinput?: Readable;\n\toutput?: Writable;\n\toverwrite?: boolean;\n\thideCursor?: boolean;\n}\n\nexport function block({\n\tinput = stdin,\n\toutput = stdout,\n\toverwrite = true,\n\thideCursor = true,\n}: BlockOptions = {}) {\n\tconst rl = readline.createInterface({\n\t\tinput,\n\t\toutput,\n\t\tprompt: '',\n\t\ttabSize: 1,\n\t});\n\treadline.emitKeypressEvents(input, rl);\n\n\tif (input instanceof ReadStream && input.isTTY) {\n\t\tinput.setRawMode(true);\n\t}\n\n\tconst clear = (data: Buffer, { name, sequence }: Key) => {\n\t\tconst str = String(data);\n\t\tif (isActionKey([str, name, sequence], 'cancel')) {\n\t\t\tif (hideCursor) output.write(cursor.show);\n\t\t\tprocess.exit(0);\n\t\t\treturn;\n\t\t}\n\t\tif (!overwrite) return;\n\t\tconst dx = name === 'return' ? 0 : -1;\n\t\tconst dy = name === 'return' ? -1 : 0;\n\n\t\treadline.moveCursor(output, dx, dy, () => {\n\t\t\treadline.clearLine(output, 1, () => {\n\t\t\t\tinput.once('keypress', clear);\n\t\t\t});\n\t\t});\n\t};\n\tif (hideCursor) output.write(cursor.hide);\n\tinput.once('keypress', clear);\n\n\treturn () => {\n\t\tinput.off('keypress', clear);\n\t\tif (hideCursor) output.write(cursor.show);\n\n\t\t// Prevent Windows specific issues: https://github.com/bombshell-dev/clack/issues/176\n\t\tif (input instanceof ReadStream && input.isTTY && !isWindows) {\n\t\t\tinput.setRawMode(false);\n\t\t}\n\n\t\t// @ts-expect-error fix for https://github.com/nodejs/node/issues/31762#issuecomment-1441223907\n\t\trl.terminal = false;\n\t\trl.close();\n\t};\n}\n\nexport const getColumns = (output: Writable): number => {\n\tif ('columns' in output && typeof output.columns === 'number') {\n\t\treturn output.columns;\n\t}\n\treturn 80;\n};\n\nexport const getRows = (output: Writable): number => {\n\tif ('rows' in output && typeof output.rows === 'number') {\n\t\treturn output.rows;\n\t}\n\treturn 20;\n};\n\nexport function wrapTextWithPrefix(\n\toutput: Writable | undefined,\n\ttext: string,\n\tprefix: string,\n\tstartPrefix: string = prefix\n): string {\n\tconst columns = getColumns(output ?? stdout);\n\tconst wrapped = wrapAnsi(text, columns - prefix.length, {\n\t\thard: true,\n\t\ttrim: false,\n\t});\n\tconst lines = wrapped\n\t\t.split('\\n')\n\t\t.map((line, index) => {\n\t\t\treturn `${index === 0 ? startPrefix : prefix}${line}`;\n\t\t})\n\t\t.join('\\n');\n\treturn lines;\n}\n", "import { stdin, stdout } from 'node:process';\nimport readline, { type Key, type ReadLine } from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor, erase } from 'sisteransi';\nimport type { ClackEvents, ClackState } from '../types.js';\nimport type { Action } from '../utils/index.js';\nimport {\n\tCANCEL_SYMBOL,\n\tdiffLines,\n\tgetRows,\n\tisActionKey,\n\tsetRawMode,\n\tsettings,\n} from '../utils/index.js';\n\nexport interface PromptOptions<TValue, Self extends Prompt<TValue>> {\n\trender(this: Omit<Self, 'prompt'>): string | undefined;\n\tinitialValue?: any;\n\tinitialUserInput?: string;\n\tvalidate?: ((value: TValue | undefined) => string | Error | undefined) | undefined;\n\tinput?: Readable;\n\toutput?: Writable;\n\tdebug?: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport default class Prompt<TValue> {\n\tprotected input: Readable;\n\tprotected output: Writable;\n\tprivate _abortSignal?: AbortSignal;\n\n\tprivate rl: ReadLine | undefined;\n\tprivate opts: Omit<PromptOptions<TValue, Prompt<TValue>>, 'render' | 'input' | 'output'>;\n\tprivate _render: (context: Omit<Prompt<TValue>, 'prompt'>) => string | undefined;\n\tprivate _track = false;\n\tprivate _prevFrame = '';\n\tprivate _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>();\n\tprotected _cursor = 0;\n\n\tpublic state: ClackState = 'initial';\n\tpublic error = '';\n\tpublic value: TValue | undefined;\n\tpublic userInput = '';\n\n\tconstructor(options: PromptOptions<TValue, Prompt<TValue>>, trackValue = true) {\n\t\tconst { input = stdin, output = stdout, render, signal, ...opts } = options;\n\n\t\tthis.opts = opts;\n\t\tthis.onKeypress = this.onKeypress.bind(this);\n\t\tthis.close = this.close.bind(this);\n\t\tthis.render = this.render.bind(this);\n\t\tthis._render = render.bind(this);\n\t\tthis._track = trackValue;\n\t\tthis._abortSignal = signal;\n\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t}\n\n\t/**\n\t * Unsubscribe all listeners\n\t */\n\tprotected unsubscribe() {\n\t\tthis._subscribers.clear();\n\t}\n\n\t/**\n\t * Set a subscriber with opts\n\t * @param event - The event name\n\t */\n\tprivate setSubscriber<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\topts: { cb: ClackEvents<TValue>[T]; once?: boolean }\n\t) {\n\t\tconst params = this._subscribers.get(event) ?? [];\n\t\tparams.push(opts);\n\t\tthis._subscribers.set(event, params);\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic on<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb });\n\t}\n\n\t/**\n\t * Subscribe to an event once\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic once<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb, once: true });\n\t}\n\n\t/**\n\t * Emit an event with data\n\t * @param event - The event name\n\t * @param data - The data to pass to the callback\n\t */\n\tpublic emit<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\t...data: Parameters<ClackEvents<TValue>[T]>\n\t) {\n\t\tconst cbs = this._subscribers.get(event) ?? [];\n\t\tconst cleanup: (() => void)[] = [];\n\n\t\tfor (const subscriber of cbs) {\n\t\t\tsubscriber.cb(...data);\n\n\t\t\tif (subscriber.once) {\n\t\t\t\tcleanup.push(() => cbs.splice(cbs.indexOf(subscriber), 1));\n\t\t\t}\n\t\t}\n\n\t\tfor (const cb of cleanup) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\tpublic prompt() {\n\t\treturn new Promise<TValue | symbol | undefined>((resolve) => {\n\t\t\tif (this._abortSignal) {\n\t\t\t\tif (this._abortSignal.aborted) {\n\t\t\t\t\tthis.state = 'cancel';\n\n\t\t\t\t\tthis.close();\n\t\t\t\t\treturn resolve(CANCEL_SYMBOL);\n\t\t\t\t}\n\n\t\t\t\tthis._abortSignal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.state = 'cancel';\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.rl = readline.createInterface({\n\t\t\t\tinput: this.input,\n\t\t\t\ttabSize: 2,\n\t\t\t\tprompt: '',\n\t\t\t\tescapeCodeTimeout: 50,\n\t\t\t\tterminal: true,\n\t\t\t});\n\t\t\tthis.rl.prompt();\n\n\t\t\tif (this.opts.initialUserInput !== undefined) {\n\t\t\t\tthis._setUserInput(this.opts.initialUserInput, true);\n\t\t\t}\n\n\t\t\tthis.input.on('keypress', this.onKeypress);\n\t\t\tsetRawMode(this.input, true);\n\t\t\tthis.output.on('resize', this.render);\n\n\t\t\tthis.render();\n\n\t\t\tthis.once('submit', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(this.value);\n\t\t\t});\n\t\t\tthis.once('cancel', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(CANCEL_SYMBOL);\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected _isActionKey(char: string | undefined, _key: Key): boolean {\n\t\treturn char === '\\t';\n\t}\n\n\tprotected _setValue(value: TValue | undefined): void {\n\t\tthis.value = value;\n\t\tthis.emit('value', this.value);\n\t}\n\n\tprotected _setUserInput(value: string | undefined, write?: boolean): void {\n\t\tthis.userInput = value ?? '';\n\t\tthis.emit('userInput', this.userInput);\n\t\tif (write && this._track && this.rl) {\n\t\t\tthis.rl.write(this.userInput);\n\t\t\tthis._cursor = this.rl.cursor;\n\t\t}\n\t}\n\n\tprotected _clearUserInput(): void {\n\t\tthis.rl?.write(null, { ctrl: true, name: 'u' });\n\t\tthis._setUserInput('');\n\t}\n\n\tprivate onKeypress(char: string | undefined, key: Key) {\n\t\tif (this._track && key.name !== 'return') {\n\t\t\tif (key.name && this._isActionKey(char, key)) {\n\t\t\t\tthis.rl?.write(null, { ctrl: true, name: 'h' });\n\t\t\t}\n\t\t\tthis._cursor = this.rl?.cursor ?? 0;\n\t\t\tthis._setUserInput(this.rl?.line);\n\t\t}\n\n\t\tif (this.state === 'error') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tif (key?.name) {\n\t\t\tif (!this._track && settings.aliases.has(key.name)) {\n\t\t\t\tthis.emit('cursor', settings.aliases.get(key.name));\n\t\t\t}\n\t\t\tif (settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.emit('cursor', key.name as Action);\n\t\t\t}\n\t\t}\n\t\tif (char && (char.toLowerCase() === 'y' || char.toLowerCase() === 'n')) {\n\t\t\tthis.emit('confirm', char.toLowerCase() === 'y');\n\t\t}\n\n\t\t// Call the key event handler and emit the key event\n\t\tthis.emit('key', char?.toLowerCase(), key);\n\n\t\tif (key?.name === 'return') {\n\t\t\tif (this.opts.validate) {\n\t\t\t\tconst problem = this.opts.validate(this.value);\n\t\t\t\tif (problem) {\n\t\t\t\t\tthis.error = problem instanceof Error ? problem.message : problem;\n\t\t\t\t\tthis.state = 'error';\n\t\t\t\t\tthis.rl?.write(this.userInput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.state !== 'error') {\n\t\t\t\tthis.state = 'submit';\n\t\t\t}\n\t\t}\n\n\t\tif (isActionKey([char, key?.name, key?.sequence], 'cancel')) {\n\t\t\tthis.state = 'cancel';\n\t\t}\n\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.emit('finalize');\n\t\t}\n\t\tthis.render();\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tprotected close() {\n\t\tthis.input.unpipe();\n\t\tthis.input.removeListener('keypress', this.onKeypress);\n\t\tthis.output.write('\\n');\n\t\tsetRawMode(this.input, false);\n\t\tthis.rl?.close();\n\t\tthis.rl = undefined;\n\t\tthis.emit(`${this.state}`, this.value);\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate restoreCursor() {\n\t\tconst lines =\n\t\t\twrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\\n')\n\t\t\t\t.length - 1;\n\t\tthis.output.write(cursor.move(-999, lines * -1));\n\t}\n\n\tprivate render() {\n\t\tconst frame = wrapAnsi(this._render(this) ?? '', process.stdout.columns, {\n\t\t\thard: true,\n\t\t\ttrim: false,\n\t\t});\n\t\tif (frame === this._prevFrame) return;\n\n\t\tif (this.state === 'initial') {\n\t\t\tthis.output.write(cursor.hide);\n\t\t} else {\n\t\t\tconst diff = diffLines(this._prevFrame, frame);\n\t\t\tconst rows = getRows(this.output);\n\t\t\tthis.restoreCursor();\n\t\t\tif (diff) {\n\t\t\t\tconst diffOffsetAfter = Math.max(0, diff.numLinesAfter - rows);\n\t\t\t\tconst diffOffsetBefore = Math.max(0, diff.numLinesBefore - rows);\n\t\t\t\tlet diffLine = diff.lines.find((line) => line >= diffOffsetAfter);\n\n\t\t\t\tif (diffLine === undefined) {\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If a single line has changed, only update that line\n\t\t\t\tif (diff.lines.length === 1) {\n\t\t\t\t\tthis.output.write(cursor.move(0, diffLine - diffOffsetBefore));\n\t\t\t\t\tthis.output.write(erase.lines(1));\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tthis.output.write(lines[diffLine]);\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\tthis.output.write(cursor.move(0, lines.length - diffLine - 1));\n\t\t\t\t\treturn;\n\t\t\t\t\t// If many lines have changed, rerender everything past the first line\n\t\t\t\t} else if (diff.lines.length > 1) {\n\t\t\t\t\tif (diffOffsetAfter < diffOffsetBefore) {\n\t\t\t\t\t\tdiffLine = diffOffsetAfter;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst adjustedDiffLine = diffLine - diffOffsetBefore;\n\t\t\t\t\t\tif (adjustedDiffLine > 0) {\n\t\t\t\t\t\t\tthis.output.write(cursor.move(0, adjustedDiffLine));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.output.write(erase.down());\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tconst newLines = lines.slice(diffLine);\n\t\t\t\t\tthis.output.write(newLines.join('\\n'));\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.output.write(erase.down());\n\t\t}\n\n\t\tthis.output.write(frame);\n\t\tif (this.state === 'initial') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tthis._prevFrame = frame;\n\t}\n}\n", "import type { Key } from 'node:readline';\nimport color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: unknown;\n\tlabel?: string;\n}\n\ntype FilterFunction<T extends OptionLike> = (search: string, opt: T) => boolean;\n\nfunction getCursorForValue<T extends OptionLike>(\n\tselected: T['value'] | undefined,\n\titems: T[]\n): number {\n\tif (selected === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst currLength = items.length;\n\n\t// If filtering changed the available options, update cursor\n\tif (currLength === 0) {\n\t\treturn 0;\n\t}\n\n\t// Try to maintain the same selected item\n\tconst index = items.findIndex((item) => item.value === selected);\n\treturn index !== -1 ? index : 0;\n}\n\nfunction defaultFilter<T extends OptionLike>(input: string, option: T): boolean {\n\tconst label = option.label ?? String(option.value);\n\treturn label.toLowerCase().includes(input.toLowerCase());\n}\n\nfunction normalisedValue<T>(multiple: boolean, values: T[] | undefined): T | T[] | undefined {\n\tif (!values) {\n\t\treturn undefined;\n\t}\n\tif (multiple) {\n\t\treturn values;\n\t}\n\treturn values[0];\n}\n\nexport interface AutocompleteOptions<T extends OptionLike>\n\textends PromptOptions<T['value'] | T['value'][], AutocompletePrompt<T>> {\n\toptions: T[] | ((this: AutocompletePrompt<T>) => T[]);\n\tfilter?: FilterFunction<T>;\n\tmultiple?: boolean;\n}\n\nexport default class AutocompletePrompt<T extends OptionLike> extends Prompt<\n\tT['value'] | T['value'][]\n> {\n\tfilteredOptions: T[];\n\tmultiple: boolean;\n\tisNavigating = false;\n\tselectedValues: Array<T['value']> = [];\n\n\tfocusedValue: T['value'] | undefined;\n\t#cursor = 0;\n\t#lastUserInput = '';\n\t#filterFn: FilterFunction<T>;\n\t#options: T[] | (() => T[]);\n\n\tget cursor(): number {\n\t\treturn this.#cursor;\n\t}\n\n\tget userInputWithCursor() {\n\t\tif (!this.userInput) {\n\t\t\treturn color.inverse(color.hidden('_'));\n\t\t}\n\t\tif (this._cursor >= this.userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = this.userInput.slice(0, this._cursor);\n\t\tconst [s2, ...s3] = this.userInput.slice(this._cursor);\n\t\treturn `${s1}${color.inverse(s2)}${s3.join('')}`;\n\t}\n\n\tget options(): T[] {\n\t\tif (typeof this.#options === 'function') {\n\t\t\treturn this.#options();\n\t\t}\n\t\treturn this.#options;\n\t}\n\n\tconstructor(opts: AutocompleteOptions<T>) {\n\t\tsuper(opts);\n\n\t\tthis.#options = opts.options;\n\t\tconst options = this.options;\n\t\tthis.filteredOptions = [...options];\n\t\tthis.multiple = opts.multiple === true;\n\t\tthis.#filterFn = opts.filter ?? defaultFilter;\n\t\tlet initialValues: unknown[] | undefined;\n\t\tif (opts.initialValue && Array.isArray(opts.initialValue)) {\n\t\t\tif (this.multiple) {\n\t\t\t\tinitialValues = opts.initialValue;\n\t\t\t} else {\n\t\t\t\tinitialValues = opts.initialValue.slice(0, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.multiple && this.options.length > 0) {\n\t\t\t\tinitialValues = [this.options[0].value];\n\t\t\t}\n\t\t}\n\n\t\tif (initialValues) {\n\t\t\tfor (const selectedValue of initialValues) {\n\t\t\t\tconst selectedIndex = options.findIndex((opt) => opt.value === selectedValue);\n\t\t\t\tif (selectedIndex !== -1) {\n\t\t\t\t\tthis.toggleSelected(selectedValue);\n\t\t\t\t\tthis.#cursor = selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.focusedValue = this.options[this.#cursor]?.value;\n\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('userInput', (value) => this.#onUserInputChanged(value));\n\t}\n\n\tprotected override _isActionKey(char: string | undefined, key: Key): boolean {\n\t\treturn (\n\t\t\tchar === '\\t' ||\n\t\t\t(this.multiple &&\n\t\t\t\tthis.isNavigating &&\n\t\t\t\tkey.name === 'space' &&\n\t\t\t\tchar !== undefined &&\n\t\t\t\tchar !== '')\n\t\t);\n\t}\n\n\t#onKey(_char: string | undefined, key: Key): void {\n\t\tconst isUpKey = key.name === 'up';\n\t\tconst isDownKey = key.name === 'down';\n\t\tconst isReturnKey = key.name === 'return';\n\n\t\t// Start navigation mode with up/down arrows\n\t\tif (isUpKey || isDownKey) {\n\t\t\tthis.#cursor = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(this.#cursor + (isUpKey ? -1 : 1), this.filteredOptions.length - 1)\n\t\t\t);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t}\n\t\t\tthis.isNavigating = true;\n\t\t} else if (isReturnKey) {\n\t\t\tthis.value = normalisedValue(this.multiple, this.selectedValues);\n\t\t} else {\n\t\t\tif (this.multiple) {\n\t\t\t\tif (\n\t\t\t\t\tthis.focusedValue !== undefined &&\n\t\t\t\t\t(key.name === 'tab' || (this.isNavigating && key.name === 'space'))\n\t\t\t\t) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.isNavigating = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.focusedValue) {\n\t\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t\t}\n\t\t\t\tthis.isNavigating = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tdeselectAll() {\n\t\tthis.selectedValues = [];\n\t}\n\n\ttoggleSelected(value: T['value']) {\n\t\tif (this.filteredOptions.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.multiple) {\n\t\t\tif (this.selectedValues.includes(value)) {\n\t\t\t\tthis.selectedValues = this.selectedValues.filter((v) => v !== value);\n\t\t\t} else {\n\t\t\t\tthis.selectedValues = [...this.selectedValues, value];\n\t\t\t}\n\t\t} else {\n\t\t\tthis.selectedValues = [value];\n\t\t}\n\t}\n\n\t#onUserInputChanged(value: string): void {\n\t\tif (value !== this.#lastUserInput) {\n\t\t\tthis.#lastUserInput = value;\n\n\t\t\tconst options = this.options;\n\n\t\t\tif (value) {\n\t\t\t\tthis.filteredOptions = options.filter((opt) => this.#filterFn(value, opt));\n\t\t\t} else {\n\t\t\t\tthis.filteredOptions = [...options];\n\t\t\t}\n\t\t\tthis.#cursor = getCursorForValue(this.focusedValue, this.filteredOptions);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tif (this.focusedValue !== undefined) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.deselectAll();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n", "import { cursor } from 'sisteransi';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface ConfirmOptions extends PromptOptions<boolean, ConfirmPrompt> {\n\tactive: string;\n\tinactive: string;\n\tinitialValue?: boolean;\n}\n\nexport default class ConfirmPrompt extends Prompt<boolean> {\n\tget cursor() {\n\t\treturn this.value ? 0 : 1;\n\t}\n\n\tprivate get _value() {\n\t\treturn this.cursor === 0;\n\t}\n\n\tconstructor(opts: ConfirmOptions) {\n\t\tsuper(opts, false);\n\t\tthis.value = !!opts.initialValue;\n\n\t\tthis.on('userInput', () => {\n\t\t\tthis.value = this._value;\n\t\t});\n\n\t\tthis.on('confirm', (confirm) => {\n\t\t\tthis.output.write(cursor.move(0, -1));\n\t\t\tthis.value = confirm;\n\t\t\tthis.state = 'submit';\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis.on('cursor', () => {\n\t\t\tthis.value = !this.value;\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface GroupMultiSelectOptions<T extends { value: any }>\n\textends PromptOptions<T['value'][], GroupMultiSelectPrompt<T>> {\n\toptions: Record<string, T[]>;\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n\tselectableGroups?: boolean;\n}\nexport default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt<T['value'][]> {\n\toptions: (T & { group: string | boolean })[];\n\tcursor = 0;\n\t#selectableGroups: boolean;\n\n\tgetGroupItems(group: string): T[] {\n\t\treturn this.options.filter((o) => o.group === group);\n\t}\n\n\tisGroupSelected(group: string) {\n\t\tconst items = this.getGroupItems(group);\n\t\tconst value = this.value;\n\t\tif (value === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn items.every((i) => value.includes(i.value));\n\t}\n\n\tprivate toggleValue() {\n\t\tconst item = this.options[this.cursor];\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tif (item.group === true) {\n\t\t\tconst group = item.value;\n\t\t\tconst groupedItems = this.getGroupItems(group);\n\t\t\tif (this.isGroupSelected(group)) {\n\t\t\t\tthis.value = this.value.filter(\n\t\t\t\t\t(v: string) => groupedItems.findIndex((i) => i.value === v) === -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.value = [...this.value, ...groupedItems.map((i) => i.value)];\n\t\t\t}\n\t\t\tthis.value = Array.from(new Set(this.value));\n\t\t} else {\n\t\t\tconst selected = this.value.includes(item.value);\n\t\t\tthis.value = selected\n\t\t\t\t? this.value.filter((v: T['value']) => v !== item.value)\n\t\t\t\t: [...this.value, item.value];\n\t\t}\n\t}\n\n\tconstructor(opts: GroupMultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\t\tconst { options } = opts;\n\t\tthis.#selectableGroups = opts.selectableGroups !== false;\n\t\tthis.options = Object.entries(options).flatMap(([key, option]) => [\n\t\t\t{ value: key, group: true, label: key },\n\t\t\t...option.map((opt) => ({ ...opt, group: key })),\n\t\t]) as any;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\tthis.#selectableGroups ? 0 : 1\n\t\t);\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up': {\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right': {\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n", "export function findCursor<T extends { disabled?: boolean }>(\n\tcursor: number,\n\tdelta: number,\n\toptions: T[]\n) {\n\tconst newCursor = cursor + delta;\n\tconst maxCursor = Math.max(options.length - 1, 0);\n\tconst clampedCursor = newCursor < 0 ? maxCursor : newCursor > maxCursor ? 0 : newCursor;\n\tconst newOption = options[clampedCursor];\n\tif (newOption.disabled) {\n\t\treturn findCursor(clampedCursor, delta < 0 ? -1 : 1, options);\n\t}\n\treturn clampedCursor;\n}\n", "import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: any;\n\tdisabled?: boolean;\n}\n\nexport interface MultiSelectOptions<T extends OptionLike>\n\textends PromptOptions<T['value'][], MultiSelectPrompt<T>> {\n\toptions: T[];\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n}\nexport default class MultiSelectPrompt<T extends OptionLike> extends Prompt<T['value'][]> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value(): T['value'] {\n\t\treturn this.options[this.cursor].value;\n\t}\n\n\tprivate get _enabledOptions(): T[] {\n\t\treturn this.options.filter((option) => option.disabled !== true);\n\t}\n\n\tprivate toggleAll() {\n\t\tconst enabledOptions = this._enabledOptions;\n\t\tconst allSelected = this.value !== undefined && this.value.length === enabledOptions.length;\n\t\tthis.value = allSelected ? [] : enabledOptions.map((v) => v.value);\n\t}\n\n\tprivate toggleInvert() {\n\t\tconst value = this.value;\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tconst notSelected = this._enabledOptions.filter((v) => !value.includes(v.value));\n\t\tthis.value = notSelected.map((v) => v.value);\n\t}\n\n\tprivate toggleValue() {\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tconst selected = this.value.includes(this._value);\n\t\tthis.value = selected\n\t\t\t? this.value.filter((value) => value !== this._value)\n\t\t\t: [...this.value, this._value];\n\t}\n\n\tconstructor(opts: MultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tconst cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\t0\n\t\t);\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.on('key', (char) => {\n\t\t\tif (char === 'a') {\n\t\t\t\tthis.toggleAll();\n\t\t\t}\n\t\t\tif (char === 'i') {\n\t\t\t\tthis.toggleInvert();\n\t\t\t}\n\t\t});\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n", "import color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface PasswordOptions extends PromptOptions<string, PasswordPrompt> {\n\tmask?: string;\n}\nexport default class PasswordPrompt extends Prompt<string> {\n\tprivate _mask = '•';\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tget masked() {\n\t\treturn this.userInput.replaceAll(/./g, this._mask);\n\t}\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\treturn this.masked;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.masked}${color.inverse(color.hidden('_'))}`;\n\t\t}\n\t\tconst masked = this.masked;\n\t\tconst s1 = masked.slice(0, this.cursor);\n\t\tconst s2 = masked.slice(this.cursor);\n\t\treturn `${s1}${color.inverse(s2[0])}${s2.slice(1)}`;\n\t}\n\tclear() {\n\t\tthis._clearUserInput();\n\t}\n\tconstructor({ mask, ...opts }: PasswordOptions) {\n\t\tsuper(opts);\n\t\tthis._mask = mask ?? '•';\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t}\n}\n", "import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectOptions<T extends { value: any; disabled?: boolean }>\n\textends PromptOptions<T['value'], SelectPrompt<T>> {\n\toptions: T[];\n\tinitialValue?: T['value'];\n}\nexport default class SelectPrompt<T extends { value: any; disabled?: boolean }> extends Prompt<\n\tT['value']\n> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _selectedValue() {\n\t\treturn this.options[this.cursor];\n\t}\n\n\tprivate changeValue() {\n\t\tthis.value = this._selectedValue.value;\n\t}\n\n\tconstructor(opts: SelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\n\t\tconst initialCursor = this.options.findIndex(({ value }) => value === opts.initialValue);\n\t\tconst cursor = initialCursor === -1 ? 0 : initialCursor;\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.changeValue();\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.changeValue();\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectKeyOptions<T extends { value: string }>\n\textends PromptOptions<T['value'], SelectKeyPrompt<T>> {\n\toptions: T[];\n\tcaseSensitive?: boolean;\n}\nexport default class SelectKeyPrompt<T extends { value: string }> extends Prompt<T['value']> {\n\toptions: T[];\n\tcursor = 0;\n\n\tconstructor(opts: SelectKeyOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tconst caseSensitive = opts.caseSensitive === true;\n\t\tconst keys = this.options.map(({ value: [initial] }) => {\n\t\t\treturn caseSensitive ? initial : initial?.toLowerCase();\n\t\t});\n\t\tthis.cursor = Math.max(keys.indexOf(opts.initialValue), 0);\n\n\t\tthis.on('key', (key, keyInfo) => {\n\t\t\tif (!key) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst casedKey = caseSensitive && keyInfo.shift ? key.toUpperCase() : key;\n\t\t\tif (!keys.includes(casedKey)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst value = this.options.find(({ value: [initial] }) => {\n\t\t\t\treturn caseSensitive ? initial === casedKey : initial?.toLowerCase() === key;\n\t\t\t});\n\t\t\tif (value) {\n\t\t\t\tthis.value = value.value;\n\t\t\t\tthis.state = 'submit';\n\t\t\t\tthis.emit('submit');\n\t\t\t}\n\t\t});\n\t}\n}\n", "import color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface TextOptions extends PromptOptions<string, TextPrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n}\n\nexport default class TextPrompt extends Prompt<string> {\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.userInput;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = userInput.slice(0, this.cursor);\n\t\tconst [s2, ...s3] = userInput.slice(this.cursor);\n\t\treturn `${s1}${color.inverse(s2)}${s3.join('')}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tconstructor(opts: TextOptions) {\n\t\tsuper({\n\t\t\t...opts,\n\t\t\tinitialUserInput: opts.initialUserInput ?? opts.initialValue,\n\t\t});\n\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t\tif (this.value === undefined) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t}\n}\n", "import chalk from \"chalk\";\nimport { text } from \"../../components/text.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${text.intro(title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nfunction getVisibleWidth(value: string): number {\n return stripAnsi(value).length;\n}\n\nfunction renderTerminalNote(message: string, title?: string): string {\n const contentLines = [\"\", ...message.split(\"\\n\"), \"\"];\n const visibleTitle = stripAnsi(title ?? \"\");\n const contentWidth = Math.max(\n visibleTitle.length,\n ...contentLines.map((line) => getVisibleWidth(line))\n ) + 2;\n const titleLine = `${chalk.green(\"\u25C7\")} ${chalk.reset(title ?? \"\")} ${chalk.gray(\n `${\"\u2500\".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`\n )}`;\n const content = contentLines.map((line) => {\n const padding = \" \".repeat(contentWidth - getVisibleWidth(line));\n return `${chalk.gray(\"\u2502\")} ${line}${padding}${chalk.gray(\"\u2502\")}`;\n });\n const bottom = chalk.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [chalk.gray(\"\u2502\"), titleLine, ...content, bottom].join(\"\\n\");\n}\n\nexport function note(message: string, title?: string): void {\n const format = resolveOutputFormat();\n const strippedMessage = stripAnsi(message);\n const strippedTitle = stripAnsi(title ?? \"\");\n\n if (format === \"markdown\") {\n const lines = strippedMessage.split(\"\\n\");\n const heading = strippedTitle ? `> **${strippedTitle}**\\n` : \"\";\n const body = lines.map((line) => `> ${line}`).join(\"\\n\");\n process.stdout.write(`${heading}${body}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({\n type: \"note\",\n title: strippedTitle,\n message: strippedMessage\n })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${renderTerminalNote(message, title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function outro(message: string): void {\n const format = resolveOutputFormat();\n const stripped = stripAnsi(message);\n\n if (format === \"markdown\") {\n process.stdout.write(`---\\n${stripped}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"outro\", message: stripped })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2502\")}\\n${chalk.gray(\"\u2514\")} ${message}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\nimport { SPINNER_FRAMES } from \"../../static/spinner.js\";\n\nexport interface SpinnerOptions {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n}\n\nfunction writeTerminalFrame(frame: string, message: string): void {\n process.stdout.write(`\\r\\x1b[K${frame} ${message}`);\n}\n\nexport function spinner(): SpinnerOptions {\n let currentMessage = \"\";\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n let fallback = false;\n\n const format = resolveOutputFormat();\n\n const renderFrame = (): void => {\n writeTerminalFrame(SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length], currentMessage);\n };\n\n const clearTimer = (): void => {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n };\n\n return {\n start(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}...\\n`);\n return;\n }\n\n fallback = process.env.POE_NO_SPINNER === \"1\" || !process.stdout.isTTY;\n if (fallback) {\n process.stdout.write(`${currentMessage}\\n`);\n return;\n }\n\n frameIndex = 0;\n renderFrame();\n timer = setInterval(() => {\n frameIndex += 1;\n renderFrame();\n }, 16);\n },\n\n message(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format !== \"terminal\" || fallback || !timer) {\n return;\n }\n\n renderFrame();\n },\n\n stop(message = currentMessage, code?: number): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"spinner\", state: \"stopped\", message: currentMessage })}\\n`\n );\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}\\n`);\n return;\n }\n\n clearTimer();\n\n const symbol = code === undefined || code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n\n if (fallback) {\n process.stdout.write(`${symbol} ${currentMessage}\\n`);\n return;\n }\n\n process.stdout.write(`\\r\\x1b[K${symbol} ${currentMessage}\\n`);\n }\n };\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? chalk.green(\"\u25C6\") : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const format = resolveOutputFormat();\n const selectedIndex = opts.selectedIndex ?? 0;\n\n if (format === \"markdown\") {\n return [\n `**${opts.message}**`,\n ...opts.options.map(\n (option, index) => `- [${index === selectedIndex ? \"x\" : \" \"}] ${option.label}`\n )\n ].join(\"\\n\");\n }\n\n if (format === \"json\") {\n return JSON.stringify({\n type: \"menu\",\n message: opts.message,\n options: opts.options,\n selected: selectedIndex\n });\n }\n\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { ObjectSchema, Static } from \"@poe-code/cmdkit-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"@poe-code/design-system\";\n\nconst commandConfigSymbol = Symbol(\"cmdkit.command.config\");\nconst groupConfigSymbol = Symbol(\"cmdkit.group.config\");\nconst commandSourcePathSymbol = Symbol(\"cmdkit.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\n\nexport type Scope = ScopeValue;\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(path: string, contents: string): Promise<void>;\n exists(path: string): Promise<boolean>;\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 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 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 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 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 aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\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 aliases: string[];\n positional: string[];\n params: TParamsSchema;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\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 scope?: Scope[];\n secrets?: SecretDeclarations;\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 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> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\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> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitCommandTypeInfo: CommandTypeInfo<TName, TParamsSchema, TResult, TOwnScope>;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n> = {\n readonly __cmdkitGroupTypeInfo: GroupTypeInfo<TServices, TName, TChildren, TOwnScope>;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport class UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\n }\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>(requires: Requires<TContext> | undefined): 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 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 = 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 = 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/cmdkit/src/index.ts\") ||\n candidate.includes(\"/packages/cmdkit/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(parent: Requires<any> | undefined, child: Requires<any> | undefined): 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 (\n merged.auth === undefined &&\n merged.apiVersion === undefined &&\n merged.check === undefined\n ) {\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 throw new UserError(`Error: Missing required secret ${secret.env}${details}`);\n }\n\n secrets[name] = value;\n }\n\n return secrets;\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 `Error: 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 `Error: 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 `Error: 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 `Error: 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 `Error: 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(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): 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 aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\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 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>(config: GroupConfig<TServices>): 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 secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined,\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n secrets: cloneSecrets(config.secrets),\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 (command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig })[\n commandConfigSymbol\n ];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(group: Group<TServices>): 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 aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\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 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 materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const scope = resolveGroupScope(internal.scope, inherited.scope);\n const secrets = mergeSecrets(inherited.secrets, internal.secrets);\n const requires = mergeRequires(inherited.requires, internal.requires);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, {\n scope,\n secrets,\n requires,\n })\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 UserError(`Default command \"${internal.default.name}\" must be listed in children.`);\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new UserError(`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,\n secrets,\n requires,\n children: materializedChildren,\n default: defaultChild,\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n secrets: cloneSecrets(internal.secrets),\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>(\n config: Omit<CommandConfig<TServices, TParamsSchema, TSecrets, TResult>, \"name\" | \"scope\"> & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope> {\n return materializeCommand(createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope>;\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>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n }\n): Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope> {\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n secrets: {},\n requires: undefined,\n }) as Group<TServices> & TypedGroupMetadata<TServices, TName, TChildren, TOwnScope>;\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 \"@poe-code/cmdkit-schema\";\nexport type { AnySchema, ArraySchema, BooleanSchema, EnumSchema, JsonSchema, NumberSchema, ObjectSchema, OptionalSchema, Static, StringSchema } from \"@poe-code/cmdkit-schema\";\n", "type JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\";\ntype EnumValue = string | number | boolean;\ntype JsonSchemaEnumValue = EnumValue | null;\ntype NumberJsonType = \"number\" | \"integer\";\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> = TSchema extends OptionalSchema<infer TInner>\n ? Static<TInner>\n : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n description?: string;\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n};\n\ninterface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly description?: string;\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean;\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<JsonSchemaEnumValue>;\n format?: string;\n items?: JsonSchema;\n maxItems?: number;\n maximum?: number;\n maxLength?: number;\n minItems?: number;\n minimum?: number;\n minLength?: number;\n nullable?: boolean;\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport interface StringSchema extends SchemaBase<\"string\", string>, StringMetadata {}\n\nexport interface NumberSchema extends SchemaBase<\"number\", number>, NumberMetadata {\n readonly jsonType?: NumberJsonType;\n}\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>>\n extends SchemaBase<\"enum\", TValues[number]> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema>\n extends SchemaBase<\"optional\", Static<TInner> | undefined> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties = schema.additionalProperties;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nexport const S = {\n String(options: SchemaOptions<string> & StringMetadata = {}): StringSchema {\n return {\n kind: \"string\",\n ...options,\n };\n },\n\n Number(\n options: SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } = {}\n ): NumberSchema {\n return {\n kind: \"number\",\n ...options,\n };\n },\n\n Boolean(options: SchemaOptions<boolean> = {}): BooleanSchema {\n return {\n kind: \"boolean\",\n ...options,\n };\n },\n\n Enum<const TValues extends NonEmptyReadonlyArray<EnumValue>>(\n values: TValues,\n options: SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = {}\n ): EnumSchema<TValues> {\n assertValidEnumValues(values);\n\n return {\n kind: \"enum\",\n values,\n ...options,\n };\n },\n\n Array<TItem extends AnySchema>(\n item: TItem,\n options: SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = {}\n ): ArraySchema<TItem> {\n return {\n kind: \"array\",\n item,\n ...options,\n };\n },\n\n Object<const TShape extends ObjectShape>(\n shape: TShape,\n options: SchemaOptions<InferObject<TShape>> & ObjectMetadata = {}\n ): ObjectSchema<TShape> {\n return {\n kind: \"object\",\n shape,\n ...options,\n };\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner,\n };\n },\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withStringMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withNumberMetadata(unwrappedSchema, { type: unwrappedSchema.jsonType ?? \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum:\n unwrappedSchema.nullable === true\n ? [...unwrappedSchema.values, null]\n : [...unwrappedSchema.values],\n };\n const enumType = unwrappedSchema.jsonType ?? getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withArrayMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item),\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n properties[key] = toJsonSchema(propertySchema);\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required,\n });\n }\n }\n}\n", "import type { NumberSchema } from \"@poe-code/cmdkit-schema\";\n\nexport function isValidNumberSchemaValue(\n value: unknown,\n schema: NumberSchema\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value))\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n return schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n}\n", "import type { Command, RenderPrimitives } from \"./index.js\";\n\nexport type OutputMode = \"rich\" | \"md\" | \"json\";\n\ntype WriteFn = (chunk: string) => void;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.every((entry) => isObject(entry));\n}\n\nfunction stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return stringifyJson(value);\n}\n\nfunction stringifyJson(value: unknown, spaces?: number): string {\n try {\n return JSON.stringify(\n value,\n (_key, currentValue) => (typeof currentValue === \"bigint\" ? currentValue.toString() : currentValue),\n spaces\n ) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction renderObjectTable(result: Record<string, unknown>, primitives: RenderPrimitives): string {\n const rows = Object.entries(result).map(([key, value]) => ({\n key,\n value: stringifyValue(value),\n }));\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: [\n {\n name: \"key\",\n title: \"Key\",\n alignment: \"left\",\n maxLen: Math.max(\"Key\".length, ...rows.map((row) => row.key.length)),\n },\n {\n name: \"value\",\n title: \"Value\",\n alignment: \"left\",\n maxLen: Math.max(\"Value\".length, ...rows.map((row) => row.value.length)),\n },\n ],\n rows,\n });\n}\n\nfunction renderObjectMarkdown(result: Record<string, unknown>): string {\n return Object.entries(result)\n .map(([key, value]) => `- ${key}: ${stringifyValue(value)}`)\n .join(\"\\n\");\n}\n\nfunction getColumnNames(rows: Array<Record<string, unknown>>): string[] {\n const names = new Set<string>();\n\n for (const row of rows) {\n for (const name of Object.keys(row)) {\n names.add(name);\n }\n }\n\n return [...names];\n}\n\nfunction renderArrayTable(result: Array<Record<string, unknown>>, primitives: RenderPrimitives): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: columnNames.map((name) => ({\n name,\n title: name,\n alignment: \"left\",\n maxLen: Math.max(\n name.length,\n ...result.map((row) => (name in row ? stringifyValue(row[name]).length : 0))\n ),\n })),\n rows: result.map((row) =>\n Object.fromEntries(\n columnNames.map((name) => [name, name in row ? stringifyValue(row[name]) : \"\"])\n )\n ),\n });\n}\n\nfunction renderArrayMarkdown(result: Array<Record<string, unknown>>): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n const header = `| ${columnNames.join(\" | \")} |`;\n const separator = `| ${columnNames.map(() => \":---\").join(\" | \")} |`;\n const rows = result.map(\n (row) =>\n `| ${columnNames\n .map((name) => (name in row ? stringifyValue(row[name]).replaceAll(\"|\", \"\\\\|\") : \"\"))\n .join(\" | \")} |`\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction autoRender(result: unknown, output: OutputMode, primitives: RenderPrimitives): string {\n if (result === null || result === undefined) {\n if (output === \"json\") {\n return stringifyJson({ ok: true }, 2);\n }\n\n return \"Done.\";\n }\n\n if (typeof result === \"string\") {\n if (output === \"json\") {\n return stringifyJson({ result }, 2);\n }\n\n return result;\n }\n\n if (isObject(result)) {\n if (output === \"rich\") {\n return renderObjectTable(result, primitives);\n }\n\n if (output === \"md\") {\n return renderObjectMarkdown(result);\n }\n\n return stringifyJson(result, 2);\n }\n\n if (isArrayOfObjects(result)) {\n if (output === \"md\") {\n return renderArrayMarkdown(result);\n }\n\n if (output === \"json\") {\n return stringifyJson(result, 2);\n }\n\n return renderArrayTable(result, primitives);\n }\n\n return stringifyJson(result, 2);\n}\n\nexport function renderResult(\n command: Command<any, any, any, any>,\n result: unknown,\n output: OutputMode,\n primitives: RenderPrimitives,\n write: WriteFn = (chunk) => {\n process.stdout.write(chunk);\n }\n): void {\n if (output === \"json\" && command.render?.json) {\n const payload = command.render.json(result, primitives);\n if (payload !== undefined) {\n write(`${stringifyJson(payload, 2)}\\n`);\n }\n return;\n }\n\n if (output === \"md\" && command.render?.markdown) {\n const payload = command.render.markdown(result, primitives);\n if (typeof payload === \"string\" && payload.length > 0) {\n write(`${payload}\\n`);\n }\n return;\n }\n\n if (output === \"rich\" && command.render?.rich) {\n command.render.rich(result, primitives);\n return;\n }\n\n const payload = autoRender(result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`);\n }\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 try {\n await Promise.all(sessions.map((session) => session.close()));\n } finally {\n this.sessionMap.clear();\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 { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closeRequested = false;\n private signalRequested = false;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.signalRequested = true;\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const matched = matchPattern(this.rawBuffer, pattern);\n if (matched !== null) {\n return matched;\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.signalRequested) {\n return this.exitPromise;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n }\n }\n\n return this.exitPromise;\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character === \"\\r\" || character === \"\\b\") {\n continue;\n }\n\n output += character;\n }\n\n return output;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n EscCharset,\n EscHash,\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor = { x: 0, y: 0 };\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n\n this.displayBuffer = Object.defineProperties(\n {} as { readonly cursorX: number; readonly cursorY: number; readonly data: Array<Row | undefined> },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true },\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const cell = [ch.charCodeAt(0), ch] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n return this._csiParams.split(\";\").map((s) => (s === \"\" ? 0 : parseInt(s, 10)));\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n } else {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._resetStyle();\n }\n }\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2 || p0 === 3) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": { // insert lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": { // delete lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": { // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": { // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": { // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": { // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = 0;\n break;\n }\n case \"s\": // save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n break;\n case \"u\": // restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ESC (ESC \\ = ST)\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n // next char should be `\\` \u2014 just return to normal, it will be consumed\n this._state = State.Normal;\n }\n break;\n case State.Str:\n // consume until ST (0x9c) or BEL\n if (code === 0x9c || code === 0x07) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._state = State.Normal;\n }\n break;\n case State.EscCharset:\n // consume one character for charset designation\n this._state = State.Normal;\n break;\n case State.EscHash:\n // consume one character for line attributes\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL\n if (this._cursorX > 0) {\n this._cursorX--;\n this._setChar(this._cursorY, this._cursorX, \" \");\n }\n } else if (code === 0x09) {\n // HT\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 charset switch, ignore\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n this._setChar(this._cursorY, this._cursorX, ch);\n this._cursorX++;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX, this._cols - 1);\n return;\n }\n\n if (this._cursorX >= this._cols) {\n // Auto-wrap\n this._cursorX = 0;\n this._newline();\n }\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x28 || code === 0x29 || code === 0x2a || code === 0x2b || code === 0x2d || code === 0x2e) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = tab set (ignore)\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._savedCursor = { x: 0, y: 0 };\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetStyle();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b) {\n // Digit or semicolon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n strikethrough: false\n };\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"@poe-code/cmdkit\";\nimport type { HandlerEnv } from \"@poe-code/cmdkit\";\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(name: string | undefined, env?: HandlerEnv): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\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 let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n return name ?? env?.get(SESSION_ENV_VAR);\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}`)) {\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 nameToId.delete(name);\n idToName.delete(sessionId);\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(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\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(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\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 return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n if (nameToId.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\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 },\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(name: string | undefined, env?: HandlerEnv): 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 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 }\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", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const closeSession = defineCommand<\n TerminalPilotCommandServices,\n \"close-session\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"close-session\",\n description: \"Close an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const { exitCode } = await getTerminalPilotRuntime(terminalPilotRuntime).closeSession(params.session, env);\n return { exitCode };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n command: S.String({ description: \"Command to execute\" }),\n args: S.Optional(S.Array(S.String(), { description: \"Command arguments\" })),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n cwd: S.Optional(S.String({ description: \"Working directory\" })),\n cols: S.Optional(S.Number({ description: \"Terminal width in columns\" })),\n rows: S.Optional(S.Number({ description: \"Terminal height in rows\" })),\n observe: S.Optional(S.Boolean({ description: \"Mirror PTY output to stderr\" }))\n});\n\nexport const createSession = defineCommand<\n TerminalPilotCommandServices,\n \"create-session\",\n typeof params,\n undefined,\n { session: string; pid: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"create-session\",\n description: \"Spawn an interactive CLI in a PTY\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"command\", \"args\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).createSession(params, env);\n return { session: namedSession.name, pid: namedSession.session.pid };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n text: S.String({ description: \"Text to write to the session\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const fill = defineCommand<\n TerminalPilotCommandServices,\n \"fill\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"fill\",\n description: \"Write text to an active terminal session all at once (replaces \\\\n with \\\\r)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.fill(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const getSession = defineCommand<\n TerminalPilotCommandServices,\n \"get-session\",\n typeof params,\n undefined,\n { session: string; pid: number; command: string; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"get-session\",\n description: \"Get session metadata (name, pid, command, exitCode)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n return {\n session: namedSession.name,\n pid: namedSession.session.pid,\n command: namedSession.session.command,\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return os.homedir();\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? os.homedir() : path.join(os.homedir(), remainder);\n}\n\nexport function resolveSkillDir(config: AgentSkillConfig, scope: SkillScope, cwd: string): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import type {\n TemplateWriteMutation,\n TemplateMergeTomlMutation,\n TemplateMergeJsonMutation,\n ConfigObject,\n ValueResolver\n} from \"../types.js\";\n\nexport interface WriteOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeTomlOptions {\n /** Target TOML file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeJsonOptions {\n /** Target JSON file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction write(options: WriteOptions): TemplateWriteMutation {\n return {\n kind: \"templateWrite\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeToml(options: MergeTomlOptions): TemplateMergeTomlMutation {\n return {\n kind: \"templateMergeToml\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeJson(options: MergeJsonOptions): TemplateMergeJsonMutation {\n return {\n kind: \"templateMergeJson\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nexport const templateMutation = {\n write,\n mergeToml,\n mergeJson\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\nimport { yamlFormat } from \"./yaml.js\";\n\nexport type FormatName = \"json\" | \"toml\" | \"yaml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat,\n yaml: yamlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\nexport { yamlFormat } from \"./yaml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { TemplateLoader } from \"@poe-code/config-mutations\";\n\nconst TEMPLATE_IDS = [\"poe-generate.md\", \"terminal-pilot.md\"] as const;\ntype TemplateId = (typeof TEMPLATE_IDS)[number];\n\nconst cache = new Map<TemplateId, string>();\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await stat(target);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function findPackageRoot(entryFilePath: string): Promise<string> {\n let current = path.dirname(entryFilePath);\n while (true) {\n if (await pathExists(path.join(current, \"package.json\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(\"Unable to locate package root for agent-skill-config templates.\");\n }\n current = parent;\n }\n}\n\nasync function resolveTemplatePath(templateId: TemplateId): Promise<string> {\n const packageRoot = await findPackageRoot(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(packageRoot, \"src\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", \"skill\", templateId)\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Template not found: ${templateId}`);\n}\n\nfunction isKnownTemplate(templateId: string): templateId is TemplateId {\n return (TEMPLATE_IDS as readonly string[]).includes(templateId);\n}\n\nexport async function loadTemplate(templateId: string): Promise<string> {\n if (!isKnownTemplate(templateId)) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const cached = cache.get(templateId);\n if (cached !== undefined) {\n return cached;\n }\n\n const resolved = await resolveTemplatePath(templateId);\n const content = await readFile(resolved, \"utf8\");\n cache.set(templateId, content);\n return content;\n}\n\nexport function createTemplateLoader(): TemplateLoader {\n return loadTemplate;\n}\n", "import { fileMutation, runMutations, templateMutation } from \"@poe-code/config-mutations\";\nimport { resolveAgentSupport } from \"./configs.js\";\nimport { createTemplateLoader } from \"./templates.js\";\nimport type { ApplyOptions, SkillFile } from \"./types.js\";\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction toHomeRelative(localSkillDir: string): string {\n if (localSkillDir.startsWith(\"~/\") || localSkillDir === \"~\") {\n return localSkillDir;\n }\n\n const normalized = localSkillDir.startsWith(\"./\")\n ? localSkillDir.slice(2)\n : localSkillDir;\n\n return `~/${normalized}`;\n}\n\nconst bundledSkillTemplateIds = [\"poe-generate.md\"] as const;\n\nexport async function configure(agentId: string, options: ApplyOptions): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillDir,\n label: `Ensure directory ${skillDir}`\n }),\n ...bundledSkillTemplateIds.map((templateId) =>\n templateMutation.write({\n target: `${skillDir}/${templateId}`,\n templateId,\n label: `Write bundled skill ${templateId} to ${skillDir}`\n })\n )\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: createTemplateLoader()\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n options: ApplyOptions & { force?: boolean }\n): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.removeDirectory({\n path: skillDir,\n force: options.force,\n label: `Remove skills directory ${skillDir}`\n })\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport type InstallSkillOptions = {\n fs: ApplyOptions[\"fs\"];\n cwd: string;\n homeDir: string;\n scope: ApplyOptions[\"scope\"];\n dryRun?: boolean;\n observers?: ApplyOptions[\"observers\"];\n};\n\nexport type InstallSkillResult = {\n skillPath: string;\n displayPath: string;\n};\n\nconst SKILL_TEMPLATE_ID = \"__skill_content__\";\n\n/**\n * Install a skill for an agent.\n * Creates folder structure: skillDir/<skill.name>/SKILL.md\n */\nexport async function installSkill(\n agentId: string,\n skill: SkillFile,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"local\";\n const config = support.config!;\n\n // Use home-relative paths for mutations (same pattern as configure/unconfigure)\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const skillFolderPath = `${skillDir}/${skill.name}`;\n const skillFilePath = `${skillFolderPath}/SKILL.md`;\n const displayPath = `${scope === \"global\" ? config.globalSkillDir : config.localSkillDir}/${skill.name}/SKILL.md`;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillFolderPath,\n label: `Ensure skill directory ${skill.name}`\n }),\n templateMutation.write({\n target: skillFilePath,\n templateId: SKILL_TEMPLATE_ID,\n label: `Write skill ${skill.name}`\n })\n ],\n {\n fs: options.fs,\n homeDir: scope === \"global\" ? options.homeDir : options.cwd,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: async (templateId) => {\n if (templateId === SKILL_TEMPLATE_ID) {\n return skill.content;\n }\n throw new Error(`Unknown template: ${templateId}`);\n }\n }\n );\n\n return { skillPath: skillFilePath, displayPath };\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { readFile } from \"node:fs/promises\";\nimport { UserError } from \"@poe-code/cmdkit\";\nimport {\n getAgentConfig,\n resolveAgentSupport as resolveSkillAgentSupport,\n supportedAgents as skillSupportedAgents\n} from \"@poe-code/agent-skill-config\";\n\nexport type TerminalPilotInstallerFileSystem = {\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n writeFile(\n path: string,\n content: string,\n options?: { encoding: \"utf8\" }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<void>;\n unlink(path: string): Promise<void>;\n rm?(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n stat(path: string): Promise<{ mode?: number }>;\n readdir(path: string): Promise<string[]>;\n chmod?(path: string, mode: number): Promise<void>;\n};\n\nexport type TerminalPilotInstallScope = \"global\" | \"local\";\nexport type TerminalPilotInstallerPlatform = \"darwin\" | \"linux\" | \"win32\";\n\nexport const DEFAULT_INSTALL_AGENT = \"claude-code\";\nexport const DEFAULT_INSTALL_SCOPE: TerminalPilotInstallScope = \"local\";\nexport const TERMINAL_PILOT_SKILL_NAME = \"terminal-pilot\";\nexport const installableAgents = skillSupportedAgents;\n\nexport type TerminalPilotInstallerServices = {\n fs?: TerminalPilotInstallerFileSystem;\n cwd?: string;\n homeDir?: string;\n platform?: TerminalPilotInstallerPlatform;\n};\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nexport function resolveInstallerServices(\n installer: TerminalPilotInstallerServices | undefined\n): Required<TerminalPilotInstallerServices> {\n return {\n fs: installer?.fs ?? (nodeFs as TerminalPilotInstallerFileSystem),\n cwd: installer?.cwd ?? process.cwd(),\n homeDir: installer?.homeDir ?? os.homedir(),\n platform: installer?.platform ?? (process.platform as TerminalPilotInstallerPlatform)\n };\n}\n\nfunction throwUnsupportedAgent(agent: string): never {\n throw new UserError(`Unsupported agent: ${agent}`);\n}\n\nexport function resolveInstallableAgent(agent: string): string {\n const skillSupport = resolveSkillAgentSupport(agent);\n\n if (\n skillSupport.status !== \"supported\" ||\n !skillSupport.id\n ) {\n throwUnsupportedAgent(agent);\n }\n\n return skillSupport.id;\n}\n\nexport function resolveInstallScope(input: {\n local?: boolean;\n global?: boolean;\n}): TerminalPilotInstallScope {\n if (input.local && input.global) {\n throw new UserError(\"Use either --local or --global, not both.\");\n }\n\n if (input.local) {\n return \"local\";\n }\n\n if (input.global) {\n return \"global\";\n }\n\n return DEFAULT_INSTALL_SCOPE;\n}\n\nlet terminalPilotTemplateCache: string | undefined;\n\nexport async function loadTerminalPilotTemplate(): Promise<string> {\n if (terminalPilotTemplateCache !== undefined) {\n return terminalPilotTemplateCache;\n }\n\n const candidates = [\n new URL(\"./templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../../../agent-skill-config/src/templates/terminal-pilot.md\", import.meta.url)\n ];\n\n for (const candidate of candidates) {\n try {\n terminalPilotTemplateCache = await readFile(candidate, \"utf8\");\n return terminalPilotTemplateCache;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n throw new UserError(\"terminal-pilot skill template is missing.\");\n}\n\nfunction resolveHomeRelativePath(targetPath: string, homeDir: string): string {\n if (targetPath === \"~\") {\n return homeDir;\n }\n\n if (targetPath.startsWith(\"~/\")) {\n return path.join(homeDir, targetPath.slice(2));\n }\n\n return targetPath;\n}\n\nexport function getSkillFolderWithHome(\n agent: string,\n scope: TerminalPilotInstallScope,\n cwd: string,\n homeDir: string\n): {\n displayPath: string;\n fullPath: string;\n} {\n const config = getAgentConfig(agent);\n\n if (!config) {\n throwUnsupportedAgent(agent);\n }\n\n return {\n displayPath: path.join(\n scope === \"global\" ? config.globalSkillDir : config.localSkillDir,\n TERMINAL_PILOT_SKILL_NAME\n ),\n fullPath: path.join(\n scope === \"global\"\n ? resolveHomeRelativePath(config.globalSkillDir, homeDir)\n : path.resolve(cwd, config.localSkillDir),\n TERMINAL_PILOT_SKILL_NAME\n )\n };\n}\n\nexport async function removeSkillFolder(\n fs: TerminalPilotInstallerFileSystem,\n folderPath: string\n): Promise<boolean> {\n try {\n await fs.stat(folderPath);\n } catch (error) {\n if (isNotFoundError(error)) {\n return false;\n }\n throw error;\n }\n\n if (typeof fs.rm !== \"function\") {\n throw new UserError(\"The configured filesystem does not support removing directories.\");\n }\n\n await fs.rm(folderPath, { recursive: true, force: true });\n return true;\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { defineCommand, S } from \"@poe-code/cmdkit\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n installableAgents,\n loadTerminalPilotTemplate,\n resolveInstallScope,\n resolveInstallableAgent,\n resolveInstallerServices,\n TERMINAL_PILOT_SKILL_NAME\n} from \"./installer.js\";\n\nconst params = S.Object({\n agent: S.Enum(installableAgents as [string, ...string[]], {\n description: \"Agent to install terminal-pilot for\",\n default: DEFAULT_INSTALL_AGENT\n }),\n local: S.Optional(S.Boolean({ description: \"Install the skill in the current project\" })),\n global: S.Optional(S.Boolean({ description: \"Install the skill in the user home directory\" }))\n});\n\nexport const install = defineCommand<\n TerminalPilotCommandServices,\n \"install\",\n typeof params,\n undefined,\n {\n agent: string;\n scope: \"local\" | \"global\";\n skillPath: string;\n },\n readonly [\"cli\"]\n>({\n name: \"install\",\n description: \"Install the terminal-pilot CLI skill.\",\n scope: [\"cli\"],\n positional: [\"agent\"],\n params,\n handler: async ({ params, terminalPilotInstaller }) => {\n const services = resolveInstallerServices(terminalPilotInstaller);\n const agent = resolveInstallableAgent(params.agent);\n const scope = resolveInstallScope(params);\n const template = await loadTerminalPilotTemplate();\n\n const skillResult = await installSkill(\n agent,\n {\n name: TERMINAL_PILOT_SKILL_NAME,\n content: template\n },\n {\n fs: services.fs,\n cwd: services.cwd,\n homeDir: services.homeDir,\n scope\n }\n );\n\n return {\n agent,\n scope,\n skillPath: skillResult.displayPath\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({});\n\nexport const listSessions = defineCommand<\n TerminalPilotCommandServices,\n \"list-sessions\",\n typeof params,\n undefined,\n { sessions: Array<{ session: string; command: string; pid: number }> },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"list-sessions\",\n description: \"List active terminal sessions\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ terminalPilotRuntime }) => {\n const sessions = await getTerminalPilotRuntime(terminalPilotRuntime).listSessions();\n return {\n sessions: sessions.map((namedSession) => ({\n session: namedSession.name,\n command: namedSession.session.command,\n pid: namedSession.session.pid\n }))\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n key: S.String({ description: \"Named key to press\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const pressKey = defineCommand<\n TerminalPilotCommandServices,\n \"press-key\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"press-key\",\n description: \"Send a named key press to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"key\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.press(params.key as never);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n last: S.Optional(S.Number({ short: \"n\", description: \"Return only the last N lines\" }))\n});\n\nexport const readHistory = defineCommand<\n TerminalPilotCommandServices,\n \"read-history\",\n typeof params,\n undefined,\n { lines: string[]; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-history\",\n description: \"Read terminal output history\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const lines = await namedSession.session.history({ last: params.last });\n return { lines, exitCode: namedSession.session.exitCode };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\ntype ReadScreenResult = {\n lines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n exitCode: number | null;\n};\n\nexport const readScreen = defineCommand<\n TerminalPilotCommandServices,\n \"read-screen\",\n typeof params,\n undefined,\n ReadScreenResult,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-screen\",\n description: \"Read the current visible terminal screen\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n return {\n lines: [...screen.lines],\n cursor: { ...screen.cursor },\n size: { ...screen.size },\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n cols: S.Number({ description: \"Terminal width in columns\" }),\n rows: S.Number({ description: \"Terminal height in rows\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const resize = defineCommand<\n TerminalPilotCommandServices,\n \"resize\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"resize\",\n description: \"Resize an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.resize(params.cols, params.rows);\n return undefined;\n }\n});\n", "import { writeFile } from \"node:fs/promises\";\nimport { parseAnsi } from \"./ansi-parser.js\";\nimport { renderPng } from \"./png-renderer.js\";\nimport { renderSvg } from \"./svg-renderer.js\";\n\nexport interface TerminalPngOptions {\n padding?: number;\n window?: boolean;\n output?: string;\n}\n\nexport async function renderTerminalPng(\n ansiText: string,\n options: TerminalPngOptions = {}\n): Promise<Buffer> {\n const runs = parseAnsi(ansiText);\n const svg = renderSvg(runs, {\n padding: options.padding,\n window: options.window\n });\n const png = renderPng(svg);\n\n if (options.output) {\n await writeFile(options.output, png);\n }\n\n return png;\n}\n\nexport * from \"./ansi-parser.js\";\nexport * from \"./font.js\";\nexport * from \"./png-renderer.js\";\nexport * from \"./svg-renderer.js\";\n", "export type Color =\n | { type: \"ansi4\"; index: number }\n | { type: \"ansi8\"; index: number }\n | { type: \"rgb\"; r: number; g: number; b: number };\n\nexport type StyledRun = {\n text: string;\n fg: Color | null;\n bg: Color | null;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n dim: boolean;\n};\n\ntype StyleState = Omit<StyledRun, \"text\">;\n\nconst ESC = \"\\u001b\";\n\nfunction createDefaultStyle(): StyleState {\n return {\n fg: null,\n bg: null,\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false,\n dim: false\n };\n}\n\nfunction cloneStyle(style: StyleState): StyleState {\n return { ...style };\n}\n\nfunction stylesEqual(left: StyleState, right: StyleState): boolean {\n return (\n left.bold === right.bold &&\n left.italic === right.italic &&\n left.underline === right.underline &&\n left.strikethrough === right.strikethrough &&\n left.dim === right.dim &&\n colorsEqual(left.fg, right.fg) &&\n colorsEqual(left.bg, right.bg)\n );\n}\n\nfunction colorsEqual(left: Color | null, right: Color | null): boolean {\n if (left === right) {\n return true;\n }\n\n if (!left || !right || left.type !== right.type) {\n return false;\n }\n\n if (left.type === \"rgb\" && right.type === \"rgb\") {\n return left.r === right.r && left.g === right.g && left.b === right.b;\n }\n\n if ((left.type === \"ansi4\" || left.type === \"ansi8\") && left.type === right.type) {\n return left.index === right.index;\n }\n\n return false;\n}\n\nfunction pushRun(runs: StyledRun[], style: StyleState, text: string): void {\n if (text.length === 0) {\n return;\n }\n\n const previous = runs.at(-1);\n if (previous && text !== \"\\n\" && previous.text !== \"\\n\" && stylesEqual(previous, style)) {\n previous.text += text;\n return;\n }\n\n runs.push({\n text,\n fg: style.fg,\n bg: style.bg,\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n strikethrough: style.strikethrough,\n dim: style.dim\n });\n}\n\nfunction parseCsi(input: string, start: number): { end: number; final: string | null; params: string } {\n let index = start + 2;\n\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return {\n end: index + 1,\n final: input[index],\n params: input.slice(start + 2, index)\n };\n }\n\n index += 1;\n }\n\n return {\n end: input.length,\n final: null,\n params: input.slice(start + 2)\n };\n}\n\nfunction toInteger(value: string | undefined): number | null {\n if (!value || value.length === 0) {\n return null;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return null;\n }\n }\n\n return Number.parseInt(value, 10);\n}\n\nfunction clampByte(value: number): number {\n if (value < 0) {\n return 0;\n }\n\n if (value > 255) {\n return 255;\n }\n\n return value;\n}\n\nfunction applyExtendedColor(\n params: number[],\n start: number\n): { color: Color | null; consumed: number } | null {\n const mode = params[start];\n if (mode === 5) {\n const index = params[start + 1];\n if (index === undefined) {\n return null;\n }\n\n return {\n color: { type: \"ansi8\", index: clampByte(index) },\n consumed: 2\n };\n }\n\n if (mode === 2) {\n const r = params[start + 1];\n const g = params[start + 2];\n const b = params[start + 3];\n if (r === undefined || g === undefined || b === undefined) {\n return null;\n }\n\n return {\n color: { type: \"rgb\", r: clampByte(r), g: clampByte(g), b: clampByte(b) },\n consumed: 4\n };\n }\n\n return null;\n}\n\nfunction applySgr(style: StyleState, paramsText: string): StyleState {\n const nextStyle = cloneStyle(style);\n const rawParams = paramsText.length === 0 ? [\"0\"] : paramsText.split(\";\");\n const params: number[] = [];\n\n for (const rawParam of rawParams) {\n const value = toInteger(rawParam);\n if (value === null) {\n return nextStyle;\n }\n\n params.push(value);\n }\n\n for (let index = 0; index < params.length; index += 1) {\n const value = params[index];\n\n if (value === 0) {\n Object.assign(nextStyle, createDefaultStyle());\n continue;\n }\n\n if (value === 1) {\n nextStyle.bold = true;\n continue;\n }\n\n if (value === 2) {\n nextStyle.dim = true;\n continue;\n }\n\n if (value === 22) {\n nextStyle.bold = false;\n nextStyle.dim = false;\n continue;\n }\n\n if (value === 3) {\n nextStyle.italic = true;\n continue;\n }\n\n if (value === 23) {\n nextStyle.italic = false;\n continue;\n }\n\n if (value === 4) {\n nextStyle.underline = true;\n continue;\n }\n\n if (value === 24) {\n nextStyle.underline = false;\n continue;\n }\n\n if (value === 9) {\n nextStyle.strikethrough = true;\n continue;\n }\n\n if (value === 29) {\n nextStyle.strikethrough = false;\n continue;\n }\n\n if (value === 39) {\n nextStyle.fg = null;\n continue;\n }\n\n if (value === 49) {\n nextStyle.bg = null;\n continue;\n }\n\n if (value >= 30 && value <= 37) {\n nextStyle.fg = { type: \"ansi4\", index: value - 30 };\n continue;\n }\n\n if (value >= 90 && value <= 97) {\n nextStyle.fg = { type: \"ansi4\", index: value - 90 + 8 };\n continue;\n }\n\n if (value >= 40 && value <= 47) {\n nextStyle.bg = { type: \"ansi4\", index: value - 40 };\n continue;\n }\n\n if (value >= 100 && value <= 107) {\n nextStyle.bg = { type: \"ansi4\", index: value - 100 + 8 };\n continue;\n }\n\n if (value === 38 || value === 48) {\n const extended = applyExtendedColor(params, index + 1);\n if (!extended) {\n continue;\n }\n\n if (value === 38) {\n nextStyle.fg = extended.color;\n } else {\n nextStyle.bg = extended.color;\n }\n\n index += extended.consumed;\n }\n }\n\n return nextStyle;\n}\n\nexport function parseAnsi(input: string): StyledRun[] {\n const runs: StyledRun[] = [];\n let style = createDefaultStyle();\n let textStart = 0;\n let index = 0;\n\n while (index < input.length) {\n const char = input[index];\n\n if (char === \"\\n\") {\n pushRun(runs, style, input.slice(textStart, index));\n pushRun(runs, style, \"\\n\");\n index += 1;\n textStart = index;\n continue;\n }\n\n if (char === ESC && input[index + 1] === \"[\") {\n pushRun(runs, style, input.slice(textStart, index));\n const sequence = parseCsi(input, index);\n\n if (sequence.final === \"m\") {\n style = applySgr(style, sequence.params);\n }\n\n index = sequence.end;\n textStart = index;\n continue;\n }\n\n index += 1;\n }\n\n pushRun(runs, style, input.slice(textStart));\n\n return runs;\n}\n", "import { Resvg } from \"@resvg/resvg-js\";\nimport { JETBRAINS_MONO_FONT_FILES } from \"./font.js\";\n\nexport function renderPng(svg: string): Buffer {\n const resvg = new Resvg(svg, {\n font: {\n defaultFontFamily: \"JetBrains Mono\",\n fontFiles: [...JETBRAINS_MONO_FONT_FILES],\n loadSystemFonts: false,\n monospaceFamily: \"JetBrains Mono\"\n },\n fitTo: {\n mode: \"zoom\",\n value: 4\n }\n });\n const png = resvg.render();\n return Buffer.from(png.asPng());\n}\n", "import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\n\n// Full JetBrains Mono (all Unicode blocks including box-drawing and geometric shapes).\n// The @fontsource subsets only cover Latin and miss characters used by the design system.\nconst fontPackageRoot = dirname(require.resolve(\"jetbrains-mono/package.json\"));\nconst webfontRoot = join(fontPackageRoot, \"fonts/webfonts\");\n\nfunction readWebfontBase64(filename: string): string {\n return readFileSync(join(webfontRoot, filename)).toString(\"base64\");\n}\n\nfunction resolveAssetPath(filename: string): string {\n return fileURLToPath(new URL(`../assets/${filename}`, import.meta.url));\n}\n\nfunction createFontFace(base64: string, weight: 400 | 700, style: \"normal\" | \"italic\"): string {\n return `@font-face {\n font-family: 'JetBrains Mono';\n font-style: ${style};\n font-weight: ${weight};\n src: url('data:font/woff2;base64,${base64}') format('woff2');\n}`;\n}\n\nexport const JETBRAINS_MONO_BASE64 = readWebfontBase64(\"JetBrainsMono-Regular.woff2\");\nexport const JETBRAINS_MONO_FONT_FILES = [\n resolveAssetPath(\"jetbrains-mono-400-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-400-italic.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-italic.ttf\")\n] as const;\nexport const JETBRAINS_MONO_TTF_PATH = JETBRAINS_MONO_FONT_FILES[0];\n\nexport const FONT_FACE_CSS = [\n createFontFace(JETBRAINS_MONO_BASE64, 400, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Bold.woff2\"), 700, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Italic.woff2\"), 400, \"italic\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-BoldItalic.woff2\"), 700, \"italic\")\n].join(\"\\n\");\n", "import type { Color, StyledRun } from \"./ansi-parser.js\";\nimport { FONT_FACE_CSS } from \"./font.js\";\n\nexport interface SvgOptions {\n padding?: number;\n window?: boolean;\n}\n\nconst ANSI_16_PALETTE = [\n \"#282a2e\",\n \"#D74E6F\",\n \"#31BB71\",\n \"#D3E561\",\n \"#8056FF\",\n \"#ED61D7\",\n \"#04D7D7\",\n \"#C5C8C6\",\n \"#4B4B4B\",\n \"#FE5F86\",\n \"#00D787\",\n \"#EBFF71\",\n \"#8F69FF\",\n \"#FF7AEA\",\n \"#00FEFE\",\n \"#FFFFFF\"\n] as const;\n\nconst XTERM_256_PALETTE = [\n \"#000000\", \"#800000\", \"#008000\", \"#808000\", \"#000080\", \"#800080\", \"#008080\", \"#c0c0c0\",\n \"#808080\", \"#ff0000\", \"#00ff00\", \"#ffff00\", \"#0000ff\", \"#ff00ff\", \"#00ffff\", \"#ffffff\",\n \"#000000\", \"#00005f\", \"#000087\", \"#0000af\", \"#0000d7\", \"#0000ff\", \"#005f00\", \"#005f5f\",\n \"#005f87\", \"#005faf\", \"#005fd7\", \"#005fff\", \"#008700\", \"#00875f\", \"#008787\", \"#0087af\",\n \"#0087d7\", \"#0087ff\", \"#00af00\", \"#00af5f\", \"#00af87\", \"#00afaf\", \"#00afd7\", \"#00afff\",\n \"#00d700\", \"#00d75f\", \"#00d787\", \"#00d7af\", \"#00d7d7\", \"#00d7ff\", \"#00ff00\", \"#00ff5f\",\n \"#00ff87\", \"#00ffaf\", \"#00ffd7\", \"#00ffff\", \"#5f0000\", \"#5f005f\", \"#5f0087\", \"#5f00af\",\n \"#5f00d7\", \"#5f00ff\", \"#5f5f00\", \"#5f5f5f\", \"#5f5f87\", \"#5f5faf\", \"#5f5fd7\", \"#5f5fff\",\n \"#5f8700\", \"#5f875f\", \"#5f8787\", \"#5f87af\", \"#5f87d7\", \"#5f87ff\", \"#5faf00\", \"#5faf5f\",\n \"#5faf87\", \"#5fafaf\", \"#5fafd7\", \"#5fafff\", \"#5fd700\", \"#5fd75f\", \"#5fd787\", \"#5fd7af\",\n \"#5fd7d7\", \"#5fd7ff\", \"#5fff00\", \"#5fff5f\", \"#5fff87\", \"#5fffaf\", \"#5fffd7\", \"#5fffff\",\n \"#870000\", \"#87005f\", \"#870087\", \"#8700af\", \"#8700d7\", \"#8700ff\", \"#875f00\", \"#875f5f\",\n \"#875f87\", \"#875faf\", \"#875fd7\", \"#875fff\", \"#878700\", \"#87875f\", \"#878787\", \"#8787af\",\n \"#8787d7\", \"#8787ff\", \"#87af00\", \"#87af5f\", \"#87af87\", \"#87afaf\", \"#87afd7\", \"#87afff\",\n \"#87d700\", \"#87d75f\", \"#87d787\", \"#87d7af\", \"#87d7d7\", \"#87d7ff\", \"#87ff00\", \"#87ff5f\",\n \"#87ff87\", \"#87ffaf\", \"#87ffd7\", \"#87ffff\", \"#af0000\", \"#af005f\", \"#af0087\", \"#af00af\",\n \"#af00d7\", \"#af00ff\", \"#af5f00\", \"#af5f5f\", \"#af5f87\", \"#af5faf\", \"#af5fd7\", \"#af5fff\",\n \"#af8700\", \"#af875f\", \"#af8787\", \"#af87af\", \"#af87d7\", \"#af87ff\", \"#afaf00\", \"#afaf5f\",\n \"#afaf87\", \"#afafaf\", \"#afafd7\", \"#afafff\", \"#afd700\", \"#afd75f\", \"#afd787\", \"#afd7af\",\n \"#afd7d7\", \"#afd7ff\", \"#afff00\", \"#afff5f\", \"#afff87\", \"#afffaf\", \"#afffd7\", \"#afffff\",\n \"#d70000\", \"#d7005f\", \"#d70087\", \"#d700af\", \"#d700d7\", \"#d700ff\", \"#d75f00\", \"#d75f5f\",\n \"#d75f87\", \"#d75faf\", \"#d75fd7\", \"#d75fff\", \"#d78700\", \"#d7875f\", \"#d78787\", \"#d787af\",\n \"#d787d7\", \"#d787ff\", \"#d7af00\", \"#d7af5f\", \"#d7af87\", \"#d7afaf\", \"#d7afd7\", \"#d7afff\",\n \"#d7d700\", \"#d7d75f\", \"#d7d787\", \"#d7d7af\", \"#d7d7d7\", \"#d7d7ff\", \"#d7ff00\", \"#d7ff5f\",\n \"#d7ff87\", \"#d7ffaf\", \"#d7ffd7\", \"#d7ffff\", \"#ff0000\", \"#ff005f\", \"#ff0087\", \"#ff00af\",\n \"#ff00d7\", \"#ff00ff\", \"#ff5f00\", \"#ff5f5f\", \"#ff5f87\", \"#ff5faf\", \"#ff5fd7\", \"#ff5fff\",\n \"#ff8700\", \"#ff875f\", \"#ff8787\", \"#ff87af\", \"#ff87d7\", \"#ff87ff\", \"#ffaf00\", \"#ffaf5f\",\n \"#ffaf87\", \"#ffafaf\", \"#ffafd7\", \"#ffafff\", \"#ffd700\", \"#ffd75f\", \"#ffd787\", \"#ffd7af\",\n \"#ffd7d7\", \"#ffd7ff\", \"#ffff00\", \"#ffff5f\", \"#ffff87\", \"#ffffaf\", \"#ffffd7\", \"#ffffff\",\n \"#080808\", \"#121212\", \"#1c1c1c\", \"#262626\", \"#303030\", \"#3a3a3a\", \"#444444\", \"#4e4e4e\",\n \"#585858\", \"#606060\", \"#666666\", \"#767676\", \"#808080\", \"#8a8a8a\", \"#949494\", \"#9e9e9e\",\n \"#a8a8a8\", \"#b2b2b2\", \"#bcbcbc\", \"#c6c6c6\", \"#d0d0d0\", \"#dadada\", \"#e4e4e4\", \"#eeeeee\"\n] as const;\n\nconst BACKGROUND = \"#171717\";\nconst DEFAULT_FOREGROUND = \"#c4c4c4\";\nconst FONT_FAMILY = \"JetBrains Mono\";\nconst FONT_SIZE = 14;\nconst LINE_HEIGHT = 1.2;\nconst CHARACTER_WIDTH = 8.412666666666667;\nconst TEXT_BOTTOM_PADDING = 11.6;\nconst DEFAULT_PADDING = {\n top: 20,\n right: 40,\n bottom: 20,\n left: 20\n};\nconst WINDOW_BAR_HEIGHT = 15;\n\nexport function renderSvg(runs: StyledRun[], options: SvgOptions = {}): string {\n const padding = options.padding === undefined\n ? DEFAULT_PADDING\n : {\n top: options.padding,\n right: options.padding,\n bottom: options.padding,\n left: options.padding\n };\n const showWindow = options.window ?? true;\n const titleBarHeight = showWindow ? WINDOW_BAR_HEIGHT : 0;\n const textStartX = padding.left;\n const lineHeightPx = FONT_SIZE * LINE_HEIGHT;\n const textStartY = titleBarHeight + padding.top + lineHeightPx;\n const lines = splitIntoLines(runs);\n const contentWidth = measureLines(lines);\n const width = padding.left + contentWidth + padding.right;\n const height =\n titleBarHeight + padding.top + (lines.length * lineHeightPx) + padding.bottom + TEXT_BOTTOM_PADDING;\n const svgWidth = formatNumber(width);\n const svgHeight = formatNumber(height);\n const viewBox = `0 0 ${svgWidth} ${svgHeight}`;\n const textElements = renderLines(lines, textStartX, textStartY, lineHeightPx);\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${svgWidth}\" height=\"${svgHeight}\" viewBox=\"${viewBox}\">`,\n \"<defs>\",\n \"<style><![CDATA[\",\n FONT_FACE_CSS,\n \"]]></style>\",\n \"</defs>\",\n `<rect x=\"0\" y=\"0\" width=\"${svgWidth}\" height=\"${svgHeight}\" fill=\"${BACKGROUND}\" />`,\n showWindow ? renderWindowControls() : \"\",\n `<g font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(FONT_SIZE)}px\" fill=\"${DEFAULT_FOREGROUND}\">`,\n textElements,\n \"</g>\",\n \"</svg>\"\n ].join(\"\");\n}\n\nfunction splitIntoLines(runs: StyledRun[]): StyledRun[][] {\n const lines: StyledRun[][] = [[]];\n\n for (const run of runs) {\n if (run.text === \"\\n\") {\n lines.push([]);\n continue;\n }\n\n lines[lines.length - 1]?.push(run);\n }\n\n return lines;\n}\n\nfunction measureLines(lines: StyledRun[][]): number {\n return Math.max(\n ...lines.map(line => line.reduce((width, run) => width + (displayWidth(run.text) * CHARACTER_WIDTH), 0)),\n 0\n );\n}\n\nfunction displayWidth(text: string): number {\n const segmenter = new Intl.Segmenter();\n let width = 0;\n\n for (const { segment } of segmenter.segment(text)) {\n const cp = segment.codePointAt(0);\n width += cp !== undefined && isWideCodePoint(cp) ? 2 : 1;\n }\n\n return width;\n}\n\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115F) || // Hangul Jamo\n cp === 0x2329 || cp === 0x232A || // Angle brackets\n (cp >= 0x2E80 && cp <= 0x303E) || // CJK Radicals, Kangxi\n (cp >= 0x3041 && cp <= 0x33BF) || // Hiragana, Katakana, CJK symbols\n (cp >= 0x3400 && cp <= 0x4DBF) || // CJK Extension A\n (cp >= 0x4E00 && cp <= 0xA4CF) || // CJK Unified Ideographs\n (cp >= 0xA960 && cp <= 0xA97F) || // Hangul Jamo Extended-A\n (cp >= 0xAC00 && cp <= 0xD7AF) || // Hangul Syllables\n (cp >= 0xF900 && cp <= 0xFAFF) || // CJK Compatibility Ideographs\n (cp >= 0xFE10 && cp <= 0xFE19) || // Vertical Forms\n (cp >= 0xFE30 && cp <= 0xFE6F) || // CJK Compatibility Forms\n (cp >= 0xFF00 && cp <= 0xFF60) || // Fullwidth Latin, Halfwidth Katakana\n (cp >= 0xFFE0 && cp <= 0xFFE6) || // Fullwidth Signs\n (cp >= 0x1B000 && cp <= 0x1B0FF) || // Kana Supplement\n (cp >= 0x1F004 && cp <= 0x1F004) || // Mahjong tile\n (cp >= 0x1F0CF && cp <= 0x1F0CF) || // Playing card black joker\n (cp >= 0x1F200 && cp <= 0x1FFFD) || // Enclosed CJK + Emoji\n (cp >= 0x20000 && cp <= 0x2FFFD) || // CJK Extension B\u2013F\n (cp >= 0x30000 && cp <= 0x3FFFD) // CJK Extension G\u2013H\n );\n}\n\nfunction renderLines(\n lines: StyledRun[][],\n textStartX: number,\n textStartY: number,\n lineHeightPx: number\n): string {\n return lines\n .map((line, index) => {\n const y = formatNumber(textStartY + (index * lineHeightPx));\n\n if (line.length === 0) {\n return `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\"/>`;\n }\n\n return [\n `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\">`,\n line.map(renderRun).join(\"\"),\n \"</text>\"\n ].join(\"\");\n })\n .join(\"\");\n}\n\nfunction renderRun(run: StyledRun): string {\n const attributes = ['xml:space=\"preserve\"'];\n const color = resolveColor(run.fg);\n const textDecorations: string[] = [];\n\n if (color !== DEFAULT_FOREGROUND) {\n attributes.push(`fill=\"${escapeXmlAttribute(color)}\"`);\n }\n\n if (run.bold) {\n attributes.push('font-weight=\"bold\"');\n }\n\n if (run.italic) {\n attributes.push('font-style=\"italic\"');\n }\n\n if (run.underline) {\n textDecorations.push(\"underline\");\n }\n\n if (run.strikethrough) {\n textDecorations.push(\"line-through\");\n }\n\n if (textDecorations.length > 0) {\n attributes.push(`text-decoration=\"${textDecorations.join(\" \")}\"`);\n }\n\n if (run.dim) {\n attributes.push('opacity=\"0.7\"');\n }\n\n return `<tspan ${attributes.join(\" \")}>${escapeXmlText(run.text)}</tspan>`;\n}\n\nfunction renderWindowControls(): string {\n return [\n '<circle cx=\"13.5\" cy=\"12\" r=\"5.5\" fill=\"#FF5A54\" />',\n '<circle cx=\"32.5\" cy=\"12\" r=\"5.5\" fill=\"#E6BF29\" />',\n '<circle cx=\"51.5\" cy=\"12\" r=\"5.5\" fill=\"#52C12B\" />'\n ].join(\"\");\n}\n\nfunction resolveColor(color: Color | null): string {\n if (color === null) {\n return DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi4\") {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi8\") {\n if (color.index < ANSI_16_PALETTE.length) {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return XTERM_256_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return `rgb(${color.r},${color.g},${color.b})`;\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \"&quot;\").replaceAll(\"'\", \"&apos;\");\n}\n\nfunction formatNumber(value: number): string {\n return value.toFixed(2);\n}\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { renderTerminalPng } from \"terminal-png\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n output: S.String({ short: \"o\", description: \"Path to the output PNG file\" }),\n window: S.Optional(S.Boolean({ description: \"Include terminal window chrome\", default: true })),\n padding: S.Optional(S.Number({ short: \"p\", description: \"Padding around terminal content\" }))\n});\n\nexport const screenshot = defineCommand<\n TerminalPilotCommandServices,\n \"screenshot\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\"]\n>({\n name: \"screenshot\",\n description: \"Capture the current terminal screen as a PNG image\",\n scope: [\"cli\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n\n await renderTerminalPng(screen.rawLines.join(\"\\n\"), {\n output: params.output,\n window: params.window,\n padding: params.padding\n });\n\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n signal: S.String({ description: \"Signal to send to the session process\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const sendSignal = defineCommand<\n TerminalPilotCommandServices,\n \"send-signal\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"send-signal\",\n description: \"Send a process signal to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"signal\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.signal(params.signal);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n text: S.String({ description: \"Text to write to the session\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const type = defineCommand<\n TerminalPilotCommandServices,\n \"type\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"type\",\n description: \"Write text to an active terminal session character-by-character with delay\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.type(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n getSkillFolderWithHome,\n installableAgents,\n removeSkillFolder,\n resolveInstallableAgent,\n resolveInstallerServices\n} from \"./installer.js\";\n\nconst params = S.Object({\n agent: S.Enum(installableAgents as [string, ...string[]], {\n description: \"Agent to uninstall terminal-pilot from\",\n default: DEFAULT_INSTALL_AGENT\n })\n});\n\nexport const uninstall = defineCommand<\n TerminalPilotCommandServices,\n \"uninstall\",\n typeof params,\n undefined,\n {\n agent: string;\n removedSkillPaths: string[];\n },\n readonly [\"cli\"]\n>({\n name: \"uninstall\",\n description: \"Remove the terminal-pilot CLI skill.\",\n scope: [\"cli\"],\n positional: [\"agent\"],\n params,\n handler: async ({ params, terminalPilotInstaller }) => {\n const services = resolveInstallerServices(terminalPilotInstaller);\n const agent = resolveInstallableAgent(params.agent);\n const localSkill = getSkillFolderWithHome(\n agent,\n \"local\",\n services.cwd,\n services.homeDir\n );\n const globalSkill = getSkillFolderWithHome(\n agent,\n \"global\",\n services.cwd,\n services.homeDir\n );\n const removedSkillPaths: string[] = [];\n\n if (await removeSkillFolder(services.fs, localSkill.fullPath)) {\n removedSkillPaths.push(localSkill.displayPath);\n }\n\n if (await removeSkillFolder(services.fs, globalSkill.fullPath)) {\n removedSkillPaths.push(globalSkill.displayPath);\n }\n\n return {\n agent,\n removedSkillPaths\n };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n pattern: S.String({ description: \"Regular expression pattern to wait for\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" })),\n literal: S.Optional(\n S.Boolean({\n short: \"l\",\n description: \"When true, treat pattern as a literal string instead of a regex\"\n })\n )\n});\n\nexport const waitFor = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for\",\n typeof params,\n undefined,\n { matched: true; line: string },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for\",\n description: \"Wait for terminal output to match a pattern\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"pattern\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const pattern = params.literal === true ? params.pattern : new RegExp(params.pattern);\n const line =\n params.timeout === undefined\n ? await namedSession.session.waitFor(pattern)\n : await namedSession.session.waitFor(pattern, { timeout: params.timeout });\n\n return { matched: true, line };\n }\n});\n", "import { defineCommand, S } from \"@poe-code/cmdkit\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" }))\n});\n\nexport const waitForExit = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for-exit\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for-exit\",\n description: \"Wait for a terminal session process to finish\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const exitCode = await namedSession.session.waitForExit(\n params.timeout === undefined ? undefined : { timeout: params.timeout }\n );\n return { exitCode };\n }\n});\n", "import { defineGroup } from \"@poe-code/cmdkit\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport { closeSession } from \"./close-session.js\";\nimport { createSession } from \"./create-session.js\";\nimport { fill } from \"./fill.js\";\nimport { getSession } from \"./get-session.js\";\nimport { install } from \"./install.js\";\nimport { listSessions } from \"./list-sessions.js\";\nimport { pressKey } from \"./press-key.js\";\nimport { readHistory } from \"./read-history.js\";\nimport { readScreen } from \"./read-screen.js\";\nimport { resize } from \"./resize.js\";\nimport { screenshot } from \"./screenshot.js\";\nimport { sendSignal } from \"./send-signal.js\";\nimport { type } from \"./type.js\";\nimport { uninstall } from \"./uninstall.js\";\nimport { waitFor } from \"./wait-for.js\";\nimport { waitForExit } from \"./wait-for-exit.js\";\n\nexport { closeSession } from \"./close-session.js\";\nexport { createSession } from \"./create-session.js\";\nexport { fill } from \"./fill.js\";\nexport { getSession } from \"./get-session.js\";\nexport { install } from \"./install.js\";\nexport { listSessions } from \"./list-sessions.js\";\nexport { pressKey } from \"./press-key.js\";\nexport { readHistory } from \"./read-history.js\";\nexport { readScreen } from \"./read-screen.js\";\nexport { resize } from \"./resize.js\";\nexport { screenshot } from \"./screenshot.js\";\nexport { sendSignal } from \"./send-signal.js\";\nexport { type } from \"./type.js\";\nexport { uninstall } from \"./uninstall.js\";\nexport { waitFor } from \"./wait-for.js\";\nexport { waitForExit } from \"./wait-for-exit.js\";\nexport { createTerminalPilotRuntime, SESSION_ENV_VAR } from \"./runtime.js\";\nexport type { TerminalPilotCommandServices, TerminalPilotRuntime } from \"./runtime.js\";\n\nconst children = [\n install,\n uninstall,\n createSession,\n fill,\n type,\n pressKey,\n sendSignal,\n waitFor,\n waitForExit,\n readScreen,\n screenshot,\n readHistory,\n resize,\n closeSession,\n getSession,\n listSessions\n] as const;\n\nexport const terminalPilotGroup = defineGroup<TerminalPilotCommandServices, \"terminal-pilot\", typeof children, readonly [\"cli\", \"mcp\", \"sdk\"]>({\n name: \"terminal-pilot\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n children\n});\n", "import { stripAnsi } from \"../ansi.js\";\nimport { main } from \"../cli.js\";\nimport { closeSharedTerminalPilotRuntime } from \"../commands/runtime.js\";\n\nexport type TerminalPilotCliRunResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport type TerminalPilotCliJsonRunResult<T> = {\n exitCode: number;\n stdout: T;\n stderr: string;\n};\n\nfunction appendJsonOutputFlag(args: string[]): string[] {\n if (args.includes(\"--json\") || args.includes(\"--output\") || args.some((arg) => arg.startsWith(\"--output=\"))) {\n return [...args];\n }\n\n const ddashIndex = args.indexOf(\"--\");\n\n if (ddashIndex === -1) {\n return [...args, \"--output\", \"json\"];\n }\n\n return [...args.slice(0, ddashIndex), \"--output\", \"json\", \"--\", ...args.slice(ddashIndex + 1)];\n}\n\nfunction toText(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return String(chunk);\n}\n\nfunction normalizeOutput(text: string): string {\n return stripAnsi(text).replaceAll(\"\\r\", \"\").trim();\n}\n\nfunction canParseJson(text: string): boolean {\n if (text.length === 0) {\n return false;\n }\n\n try {\n JSON.parse(text);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function createTerminalPilotCliRepl() {\n return {\n async run(args: string[]): Promise<TerminalPilotCliRunResult> {\n const stdoutChunks: string[] = [];\n const stderrChunks: string[] = [];\n const originalStdoutWrite = process.stdout.write.bind(process.stdout);\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n const previousExitCode = process.exitCode;\n\n process.exitCode = 0;\n process.stdout.write = ((chunk: unknown, ...rest: unknown[]) => {\n stdoutChunks.push(toText(chunk));\n const callback = typeof rest.at(-1) === \"function\" ? (rest.at(-1) as (() => void)) : undefined;\n callback?.();\n return true;\n }) as typeof process.stdout.write;\n process.stderr.write = ((chunk: unknown, ...rest: unknown[]) => {\n stderrChunks.push(toText(chunk));\n const callback = typeof rest.at(-1) === \"function\" ? (rest.at(-1) as (() => void)) : undefined;\n callback?.();\n return true;\n }) as typeof process.stderr.write;\n\n try {\n await main([\"node\", \"terminal-pilot\", ...args]);\n } finally {\n process.stdout.write = originalStdoutWrite;\n process.stderr.write = originalStderrWrite;\n }\n\n const exitCode = process.exitCode ?? 0;\n process.exitCode = previousExitCode;\n\n let stdout = normalizeOutput(stdoutChunks.join(\"\"));\n let stderr = normalizeOutput(stderrChunks.join(\"\"));\n\n if (exitCode !== 0 && stderr.length === 0 && !canParseJson(stdout)) {\n stderr = stdout;\n stdout = \"\";\n }\n\n return {\n exitCode,\n stdout,\n stderr\n };\n },\n\n async runJson<T>(args: string[]): Promise<TerminalPilotCliJsonRunResult<T>> {\n const result = await this.run(appendJsonOutputFlag(args));\n\n if (result.exitCode !== 0) {\n return {\n exitCode: result.exitCode,\n stdout: undefined as T,\n stderr: result.stderr\n };\n }\n\n if (result.stdout.length === 0) {\n throw new Error(`Expected JSON output for terminal-pilot ${args.join(\" \")}, but stdout was empty.`);\n }\n\n return {\n exitCode: result.exitCode,\n stdout: JSON.parse(result.stdout) as T,\n stderr: result.stderr\n };\n },\n\n async close(): Promise<void> {\n await closeSharedTerminalPilotRuntime();\n }\n };\n}\n"],
5
+ "mappings": "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AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW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",
6
+ "names": ["ESC", "CSI", "os", "path", "fileURLToPath", "path", "fileURLToPath", "text", "chalk", "text", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "stripAnsi", "chalk", "spacing", "stripAnsi", "message", "chalk", "stripAnsi", "chalk", "AsyncLocalStorage", "chalk", "chalk", "chalk", "chalk", "EMOJI_RE", "MODIFIER_RE", "NO_TRUNCATION", "NO_TRUNCATION", "ANSI_ESCAPE_BELL", "ANSI_CSI", "ANSI_OSC", "ANSI_ESCAPE_LINK", "ANSI_OSC", "GROUP_REGEX", "ANSI_CSI", "ANSI_ESCAPE_BELL", "actions", "settings", "isWindows", "CANCEL_SYMBOL", "isCancel", "value", "chalk", "chalk", "chalk", "stripAnsi", "message", "chalk", "chalk", "chalk", "chalk", "select", "text", "confirm", "chalk", "message", "location", "separatorIndex", "previousSeparatorIndex", "candidate", "write", "payload", "path", "trimmed", "withOutputFormat", "select", "confirm", "text", "error", "message", "scenario", "params", "logger", "params", "k", "text", "require", "error", "DEFAULT_COLS", "DEFAULT_ROWS", "listSessions", "params", "params", "params", "params", "params", "path", "parse", "parse", "isConfigObject", "parse", "serialize", "merge", "prune", "isConfigObject", "parse", "serialize", "merge", "prune", "path", "path", "error", "isConfigObject", "error", "stat", "error", "Mustache", "readFile", "path", "fileURLToPath", "os", "path", "readFile", "error", "os", "readFile", "path", "params", "params", "params", "params", "params", "params", "writeFile", "ESC", "text", "params", "parseAnsi", "createRequire", "dirname", "join", "fileURLToPath", "require", "text", "parseAnsi", "writeFile", "params", "params", "params", "params", "params", "params", "waitForExit", "waitForExit", "fileURLToPath", "path", "text", "path", "fileURLToPath", "os", "error", "main"]
7
7
  }