terminal-pilot 0.0.44 → 0.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/close-session.js.map +1 -1
- package/dist/commands/create-session.js.map +1 -1
- package/dist/commands/daemon-runtime.js.map +1 -1
- package/dist/commands/fill.js.map +1 -1
- package/dist/commands/get-session.js.map +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/installer.js.map +1 -1
- package/dist/commands/list-sessions.js.map +1 -1
- package/dist/commands/press-key.js.map +1 -1
- package/dist/commands/read-history.js.map +1 -1
- package/dist/commands/read-screen.js.map +1 -1
- package/dist/commands/resize.js.map +1 -1
- package/dist/commands/runtime.js.map +1 -1
- package/dist/commands/screenshot.js.map +1 -1
- package/dist/commands/send-signal.js.map +1 -1
- package/dist/commands/type.js.map +1 -1
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/wait-for-exit.js.map +1 -1
- package/dist/commands/wait-for.js.map +1 -1
- package/dist/composition.json +1 -1
- package/dist/testing/cli-repl.js +1 -1
- package/dist/testing/cli-repl.js.map +1 -1
- package/dist/testing/qa-cli.js +1 -1
- package/dist/testing/qa-cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts", "../../toolcraft/src/node-require-shim.ts", "../../toolcraft/src/cli.ts", "../../toolcraft-schema/src/json.ts", "../../toolcraft-schema/src/oneof.ts", "../../toolcraft-schema/src/record.ts", "../../toolcraft-schema/src/union.ts", "../../toolcraft-schema/src/validate.ts", "../../toolcraft-schema/src/index.ts", "../../toolcraft-design/src/internal/color-support.ts", "../../toolcraft-design/src/components/color.ts", "../../toolcraft-design/src/tokens/brand.ts", "../../toolcraft-design/src/internal/theme-state.ts", "../../toolcraft-design/src/tokens/colors.ts", "../../toolcraft-design/src/tokens/typography.ts", "../../toolcraft-design/src/tokens/widths.ts", "../../toolcraft-design/src/internal/output-format.ts", "../../toolcraft-design/src/internal/theme-detect.ts", "../../toolcraft-design/src/components/text.ts", "../../toolcraft-design/src/components/symbols.ts", "../../toolcraft-design/src/internal/strip-ansi.ts", "../../toolcraft-design/src/prompts/primitives/log.ts", "../../toolcraft-design/src/components/logger.ts", "../../toolcraft-design/src/components/help-formatter.ts", "../../toolcraft-design/src/components/help-formatter-plain.ts", "../../toolcraft-design/src/components/table.ts", "../../toolcraft-design/src/components/detail-card.ts", "../../toolcraft-design/src/components/template.ts", "../../toolcraft-design/src/components/browser.ts", "../../frontmatter/src/parse.ts", "../../frontmatter/src/stringify.ts", "../../toolcraft-design/src/terminal-markdown/parser/code-highlight.ts", "../../toolcraft-design/src/dashboard/terminal-width.ts", "../../toolcraft-design/src/acp/writer.ts", "../../toolcraft-design/src/dashboard/terminal.ts", "../../toolcraft-design/src/explorer/state.ts", "../../toolcraft-design/src/prompts/interactive/glyphs.ts", "../../toolcraft-design/src/prompts/interactive/core.ts", "../../toolcraft-design/src/prompts/interactive/cancel-symbol.ts", "../../toolcraft-design/src/prompts/interactive/keys.ts", "../../toolcraft-design/src/prompts/interactive/wrap.ts", "../../toolcraft-design/src/prompts/interactive/confirm.ts", "../../toolcraft-design/src/prompts/interactive/pagination.ts", "../../toolcraft-design/src/prompts/interactive/select.ts", "../../toolcraft-design/src/prompts/interactive/text.ts", "../../toolcraft-design/src/prompts/primitives/cancel.ts", "../../toolcraft-design/src/prompts/primitives/note.ts", "../../toolcraft-design/src/static/spinner.ts", "../../toolcraft-design/src/prompts/index.ts", "../../toolcraft/src/index.ts", "../../toolcraft/src/user-error.ts", "../../toolcraft/src/human-in-loop/types.ts", "../../toolcraft/src/human-in-loop/config.ts", "../../toolcraft/src/suggest.ts", "../../toolcraft/src/stream.ts", "../../toolcraft/src/runtime-logging.ts", "../../toolcraft/src/package-metadata.ts", "../../toolcraft/src/error-codes.ts", "../../toolcraft/src/error-report.ts", "../../toolcraft/src/project-root.ts", "../../toolcraft/src/redaction.ts", "../../toolcraft/src/number-schema.ts", "../../toolcraft/src/api-error-summary.ts", "../../toolcraft/src/renderer.ts", "../../toolcraft/src/source-snippet.ts", "../../toolcraft/src/stack-trim.ts", "../../toolcraft/src/validation-errors.ts", "../../toolcraft/src/runtime/io.ts", "../src/terminal-pilot.ts", "../src/terminal-session.ts", "../src/ansi.ts", "../src/errors.ts", "../src/terminal-buffer.ts", "../src/keys.ts", "../src/terminal-screen.ts", "../src/commands/runtime.ts", "../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/cursor.ts", "../../agent-defs/src/agents/gemini-cli.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/object.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/error-codes.ts", "../../config-mutations/src/fs-utils.ts", "../../config-mutations/src/execution/run-mutations.ts", "../../agent-skill-config/src/error-codes.ts", "../../agent-skill-config/src/templates.ts", "../../agent-skill-config/src/apply.ts", "../../agent-skill-config/src/resolve-skill-reference.ts", "../../agent-skill-config/src/git-exclude.ts", "../../agent-skill-config/src/bridge-active-skills.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/error-codes.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/commands/daemon-runtime.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\nimport { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { runCLI } from \"toolcraft/cli\";\nimport { configureTheme } from \"toolcraft/design\";\nimport { createTerminalPilotGroup } from \"./commands/index.js\";\nimport {\n createDaemonTerminalPilotRuntime,\n isTerminalPilotDaemonArgv,\n runTerminalPilotDaemon\n} from \"./commands/daemon-runtime.js\";\nimport type { TerminalPilotRuntime } from \"./commands/runtime.js\";\n\nconfigureTheme({ brand: \"green\", label: \"Terminal Pilot\" });\n\ndeclare const __TERMINAL_PILOT_VERSION__: string | undefined;\n\nfunction getBundledPackageVersion(): string | undefined {\n return typeof __TERMINAL_PILOT_VERSION__ === \"string\"\n ? __TERMINAL_PILOT_VERSION__\n : undefined;\n}\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(\n argv: string[] = process.argv,\n options: { terminalPilotRuntime?: TerminalPilotRuntime; packageVersion?: string } = {}\n): Promise<void> {\n if (isTerminalPilotDaemonArgv(argv)) {\n await runTerminalPilotDaemon();\n return;\n }\n\n const originalArgv = process.argv;\n process.argv = normalizeArgv(argv);\n\n try {\n const packageVersion = options.packageVersion ?? getBundledPackageVersion();\n await runCLI(createTerminalPilotGroup(), {\n services: {\n terminalPilotRuntime: options.terminalPilotRuntime ?? createDaemonTerminalPilotRuntime()\n },\n controls: {\n debug: true,\n output: true,\n verbose: true,\n yes: true\n },\n ...(packageVersion === undefined ? {} : { version: packageVersion })\n });\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 { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nconst globalWithRequire = globalThis as typeof globalThis & {\n require?: NodeJS.Require;\n};\n\nglobalWithRequire.require ??= createRequire(path.join(process.cwd(), \"package.json\"));\n", "import \"./node-require-shim.js\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Command as CommanderCommand,\n CommanderError,\n InvalidArgumentError,\n Option\n} from \"commander\";\nimport type {\n AnySchema,\n ArraySchema,\n CliMissingParameterContext,\n EnumSchema,\n JsonValueSchema,\n ObjectSchema,\n RecordSchema\n} from \"toolcraft-schema\";\nimport { validate as validateSchema } from \"toolcraft-schema\";\nimport {\n cancel,\n configureTheme,\n confirm,\n createLogger,\n formatCommandList,\n formatOptionList,\n getTheme,\n helpFormatterPlain,\n isCancel,\n note,\n promptText,\n renderTable,\n resetOutputFormatCache,\n select,\n text\n} from \"toolcraft-design\";\nimport type {\n Command,\n CommandRequirementOptions,\n Group,\n HandlerContext,\n HandlerEnv,\n HandlerFs,\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLoggerInput,\n SecretDeclarations,\n SecretDefinition,\n Scope\n} from \"./index.js\";\nimport {\n ApprovalDeclinedError,\n UserError,\n assertCommandRequirements,\n getCommandSourcePath,\n hasMcpProxyConfig,\n resolveCommandSecrets\n} from \"./index.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport { writeErrorReport, type ErrorReportsOption } from \"./error-report.js\";\nimport type { HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./human-in-loop/types.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { findEntrypointPackageMetadata } from \"./package-metadata.js\";\nimport { redactHttpBody, redactHttpHeaderValue } from \"./redaction.js\";\nimport { createRuntimeLogger, isLogLevel, LOG_LEVELS } from \"./runtime-logging.js\";\nimport { summarizeHttpError } from \"./api-error-summary.js\";\nimport { renderResult } from \"./renderer.js\";\nimport type { OutputMode } from \"./renderer.js\";\nimport { renderSourceSnippet } from \"./source-snippet.js\";\nimport { enableSourceMaps, formatDebugStack, type DebugStackMode } from \"./stack-trim.js\";\nimport { suggest } from \"./suggest.js\";\nimport { throwValidationErrors, type ValidationError } from \"./validation-errors.js\";\nimport { RESERVED_SERVICE_NAMES, createEnv, createFs, validateServices } from \"./runtime/io.js\";\nimport { createManagedStream } from \"./stream.js\";\n\nexport { renderErrorReport } from \"./error-report.js\";\nexport type { ErrorReportRenderContext, ErrorReportRenderResult } from \"./error-report.js\";\n\nconfigureTheme({ brand: \"blue\", label: \"Toolcraft\" });\n\nexport { configureTheme };\n\nconst NULL_OPTION_VALUE = Symbol(\"toolcraft.cli.null\");\nconst optionalModulePaths = {\n approvals: \"./human-in-loop/approvals-commands.js\",\n humanInLoop: \"./human-in-loop/gate.js\",\n mcpProxy: \"./mcp-proxy.js\"\n} as const;\n\nfunction importOptionalModule<T>(specifier: string): Promise<T> {\n return import(specifier) as Promise<T>;\n}\n\ntype Casing = \"kebab\" | \"snake\";\ntype ScalarSchema = Extract<AnySchema, { kind: \"string\" | \"number\" | \"boolean\" | \"enum\" }>;\ntype FieldSchema = ScalarSchema | ArraySchema<any> | JsonValueSchema;\n\ninterface ResolvedFlags {\n json?: boolean;\n preset?: string;\n yes?: boolean;\n output?: OutputMode;\n debug?: DebugStackMode | boolean;\n logLevel?: LogLevel;\n verbose?: boolean;\n}\n\ninterface FieldDefinition {\n id: string;\n path: string[];\n displayPath: string;\n optionAttribute: string;\n commanderOptionAttribute: string;\n optionFlag: string;\n longAliases: string[];\n shortFlag?: string;\n schema: FieldSchema;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n requiredWhenActive: boolean;\n global?: boolean;\n synthetic?: boolean;\n variantId?: string;\n variantBranchId?: string;\n positionalIndex?: number;\n variadicPosition?: boolean;\n}\n\ninterface DynamicFieldDefinition {\n id: string;\n path: string[];\n displayPath: string;\n optionPath: string[];\n optionPathDisplay: string;\n optionFlag: string;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n requiredWhenActive: boolean;\n schema: RecordSchema<any> | ArraySchema<ObjectSchema<any>>;\n variantId?: string;\n variantBranchId?: string;\n}\n\ninterface VariantBranchDefinition {\n branchId: string;\n dynamicFieldIds: string[];\n fieldIds: string[];\n requiredDynamicFieldIds: string[];\n requiredFieldIds: string[];\n}\n\ninterface VariantDefinition {\n id: string;\n controlDisplayPath: string;\n controlFieldId: string;\n optional: boolean;\n branches: VariantBranchDefinition[];\n}\n\ninterface CollectedCliSchema {\n dynamicFields: DynamicFieldDefinition[];\n fields: FieldDefinition[];\n variants: VariantDefinition[];\n}\n\ninterface ExecutionState<TServices extends object> {\n command: Command<TServices, any, any, any>;\n commandPath: string;\n casing: Casing;\n dynamicFields: DynamicFieldDefinition[];\n fields: FieldDefinition[];\n positionalValues: unknown[];\n presetsEnabled: boolean;\n rawArgv: string[];\n actionCommand: CommanderCommand;\n variants: VariantDefinition[];\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\ninterface JsonHelpOption {\n name: string;\n flags: string[];\n type: string;\n description?: string;\n required: boolean;\n default?: unknown;\n positional?: boolean;\n}\n\nexport interface CLIControls {\n debug?: boolean;\n logLevel?: boolean;\n output?: boolean;\n verbose?: boolean;\n yes?: boolean;\n}\n\nexport interface RunCLIOptions<TServices extends object = Record<string, unknown>> {\n apiVersion?: string;\n approvals?: boolean;\n argv?: readonly string[];\n casing?: Casing;\n controls?: CLIControls;\n env?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n fs?: HandlerFs;\n humanInLoop?: HumanInLoopRuntimeOptions;\n logLevel?: LogLevel;\n logger?: RuntimeLoggerInput;\n outputEmitter?: (entry: string) => void;\n promptInput?: NodeJS.ReadableStream;\n promptOutput?: NodeJS.WritableStream;\n projectRoot?: string;\n rootDisplayName?: string;\n rootUsageName?: string;\n services?: TServices;\n version?: string;\n presets?: boolean;\n errorReports?: ErrorReportsOption;\n}\n\nexport interface CLICommandTreeSnapshotOption {\n name: string;\n flags: string[];\n type: string;\n required: boolean;\n hidden: boolean;\n description?: string;\n default?: unknown;\n positional?: boolean;\n global?: boolean;\n dynamic?: boolean;\n}\n\nexport interface CLICommandTreeSnapshotCommand {\n kind: \"command\";\n name: string;\n path: string[];\n aliases: string[];\n hidden: boolean;\n default: boolean;\n description?: string;\n options: CLICommandTreeSnapshotOption[];\n}\n\nexport interface CLICommandTreeSnapshotGroup {\n kind: \"group\";\n name: string;\n path: string[];\n aliases: string[];\n hidden: false;\n default: boolean;\n description?: string;\n children: CLICommandTreeSnapshotNode[];\n}\n\nexport type CLICommandTreeSnapshotNode =\n | CLICommandTreeSnapshotCommand\n | CLICommandTreeSnapshotGroup;\n\nexport interface CLICommandTreeSnapshot {\n schemaVersion: 1;\n globalOptions: CLICommandTreeSnapshotOption[];\n root: CLICommandTreeSnapshotGroup;\n}\n\nexport interface CLICommandTreeSnapshotOptions {\n approvals?: boolean;\n argv?: readonly string[];\n casing?: Casing;\n controls?: CLIControls;\n presets?: boolean;\n version?: string;\n}\n\n/**\n * Returns the resolved CLI command surface as deterministic plain data.\n *\n * Schema version 1 is independent of human-facing help layout. Nodes and options retain\n * declaration order, paths exclude the root name, non-CLI nodes are omitted, hidden commands\n * remain present, and Toolcraft-controlled global options are reported separately. A future\n * incompatible shape change will increment `schemaVersion`.\n */\nexport async function createCLICommandTreeSnapshot<TServices extends object>(\n roots: Group<TServices> | Group<TServices>[],\n options: CLICommandTreeSnapshotOptions = {}\n): Promise<CLICommandTreeSnapshot> {\n const argv = [...(options.argv ?? [\"node\", \"toolcraft\"])];\n const normalizedRoot = normalizeRoots(roots, argv);\n const root =\n options.approvals === true\n ? (\n await importOptionalModule<typeof import(\"./human-in-loop/approvals-commands.js\")>(\n optionalModulePaths.approvals\n )\n ).mergeApprovalsGroup(normalizedRoot)\n : normalizedRoot;\n const controls = resolveCLIControls(options.controls);\n const presetsEnabled = options.presets === true;\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n presetsEnabled,\n options.version !== undefined,\n controls\n );\n\n return {\n schemaVersion: 1,\n globalOptions: createGlobalSnapshotOptions(\n presetsEnabled,\n options.version !== undefined,\n controls\n ),\n root: createSnapshotGroup(root, options.casing ?? \"kebab\", globalLongOptionFlags, [], false)\n };\n}\n\nfunction inferProgramName(argv: string[]): string {\n const entrypoint = argv[1];\n\n if (typeof entrypoint !== \"string\" || entrypoint.length === 0) {\n return \"toolcraft\";\n }\n\n const parsed = path.parse(entrypoint);\n return parsed.name.length > 0 ? parsed.name : \"toolcraft\";\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 =\n previous !== undefined &&\n previous === previous.toLowerCase() &&\n previous !== previous.toUpperCase();\n const nextIsLowercase =\n 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 toUnionKindControlPath(path: string[]): string[] {\n if (path.length === 0) {\n return [\"kind\"];\n }\n\n const head = path.slice(0, -1);\n const tail = path[path.length - 1] ?? \"\";\n return [...head, `${tail}Kind`];\n}\n\nfunction toUnionKindDisplayPath(path: string[]): string {\n if (path.length === 0) {\n return \"kind\";\n }\n\n const head = path.slice(0, -1);\n const tail = path[path.length - 1] ?? \"\";\n return [...head, `${tail}-kind`].join(\".\");\n}\n\nfunction createSyntheticEnumSchema(values: string[]): EnumSchema<[string, ...string[]]> {\n if (values.length === 0) {\n throw new Error(\"Synthetic enum schema requires at least one value.\");\n }\n\n return {\n kind: \"enum\",\n values: values as [string, ...string[]]\n };\n}\n\nfunction getRequiredBranchFingerprint(branch: ObjectSchema<any>, casing: Casing): string {\n const requiredKeys = (Object.entries(branch.shape) as Array<[string, AnySchema]>)\n .filter(([, schema]) => schema.kind !== \"optional\")\n .map(([key]) => formatSegment(key, casing))\n .sort();\n\n return requiredKeys.join(\"+\");\n}\n\nfunction collectFields(\n schema: ObjectSchema<any>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n path: string[] = [],\n inheritedOptional = false,\n variantContext?: {\n branchId: string;\n id: string;\n }\n): CollectedCliSchema {\n const collected: CollectedCliSchema = {\n dynamicFields: [],\n fields: [],\n variants: []\n };\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const nextPath = [...path, key];\n const runtimeOptional = inheritedOptional || rawChildSchema.kind === \"optional\";\n const childSchema = unwrapOptional(rawChildSchema);\n const requiredWhenActive =\n rawChildSchema.kind !== \"optional\" && childSchema.default === undefined;\n\n if (childSchema.kind === \"object\") {\n const nested = collectFields(\n childSchema,\n casing,\n globalLongOptionFlags,\n nextPath,\n runtimeOptional,\n variantContext\n );\n collected.dynamicFields.push(...nested.dynamicFields);\n collected.fields.push(...nested.fields);\n collected.variants.push(...nested.variants);\n continue;\n }\n\n if (childSchema.kind === \"oneOf\") {\n const variantId = `${toDisplayPath(nextPath)}:oneOf`;\n const branchIds = Object.keys(childSchema.branches);\n const controlField: FieldDefinition = {\n id: toDisplayPath([...nextPath, childSchema.discriminator]),\n path: [...nextPath, childSchema.discriminator],\n displayPath: toDisplayPath([...nextPath, childSchema.discriminator]),\n optionAttribute: toOptionAttribute([...nextPath, childSchema.discriminator], casing),\n commanderOptionAttribute: toCommanderOptionAttribute(\n [...nextPath, childSchema.discriminator],\n casing,\n globalLongOptionFlags\n ),\n optionFlag: toOptionFlag([...nextPath, childSchema.discriminator], casing),\n longAliases: [],\n shortFlag: undefined,\n schema: createSyntheticEnumSchema(branchIds),\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: false,\n defaultValue: undefined,\n requiredWhenActive\n };\n collected.fields.push(controlField);\n\n const branches: VariantBranchDefinition[] = [];\n\n for (const [branchId, branchSchema] of Object.entries(childSchema.branches)) {\n const branch = collectFields(branchSchema, casing, globalLongOptionFlags, nextPath, true, {\n id: variantId,\n branchId\n });\n collected.dynamicFields.push(...branch.dynamicFields);\n collected.fields.push(...branch.fields);\n collected.variants.push(...branch.variants);\n branches.push({\n branchId,\n dynamicFieldIds: branch.dynamicFields.map((field) => field.id),\n fieldIds: branch.fields.map((field) => field.id),\n requiredDynamicFieldIds: branch.dynamicFields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id),\n requiredFieldIds: branch.fields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id)\n });\n }\n\n collected.variants.push({\n id: variantId,\n controlDisplayPath: controlField.displayPath,\n controlFieldId: controlField.id,\n optional: runtimeOptional,\n branches\n });\n continue;\n }\n\n if (childSchema.kind === \"union\") {\n const variantId = `${toDisplayPath(nextPath)}:union`;\n const controlPath = toUnionKindControlPath(nextPath);\n const controlDisplayPath = toUnionKindDisplayPath(nextPath);\n const branchIds = childSchema.branches.map((branch) =>\n getRequiredBranchFingerprint(branch, casing)\n );\n const controlField: FieldDefinition = {\n id: controlDisplayPath,\n path: controlPath,\n displayPath: controlDisplayPath,\n optionAttribute: toOptionAttribute(controlPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(\n controlPath,\n casing,\n globalLongOptionFlags\n ),\n optionFlag: toOptionFlag(controlPath, casing),\n longAliases: [],\n shortFlag: undefined,\n schema: createSyntheticEnumSchema(branchIds),\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: false,\n defaultValue: undefined,\n requiredWhenActive,\n synthetic: true\n };\n collected.fields.push(controlField);\n\n const branches: VariantBranchDefinition[] = [];\n\n childSchema.branches.forEach((branchSchema, index) => {\n const branchId = branchIds[index] ?? \"\";\n const branch = collectFields(branchSchema, casing, globalLongOptionFlags, nextPath, true, {\n id: variantId,\n branchId\n });\n collected.dynamicFields.push(...branch.dynamicFields);\n collected.fields.push(...branch.fields);\n collected.variants.push(...branch.variants);\n branches.push({\n branchId,\n dynamicFieldIds: branch.dynamicFields.map((field) => field.id),\n fieldIds: branch.fields.map((field) => field.id),\n requiredDynamicFieldIds: branch.dynamicFields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id),\n requiredFieldIds: branch.fields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id)\n });\n });\n\n collected.variants.push({\n id: variantId,\n controlDisplayPath,\n controlFieldId: controlField.id,\n optional: runtimeOptional,\n branches\n });\n continue;\n }\n\n if (childSchema.kind === \"record\") {\n collected.dynamicFields.push({\n id: toDisplayPath(nextPath),\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionPath: nextPath,\n optionPathDisplay: `${toDisplayPath(nextPath)}.<key>`,\n optionFlag: `${toOptionFlag(nextPath, casing)}.<key>`,\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n schema: childSchema,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId\n });\n continue;\n }\n\n if (childSchema.kind === \"array\" && unwrapOptional(childSchema.item).kind === \"object\") {\n collected.dynamicFields.push({\n id: toDisplayPath(nextPath),\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionPath: nextPath,\n optionPathDisplay: `${toDisplayPath(nextPath)}.<index>`,\n optionFlag: `${toOptionFlag(nextPath, casing)}.<index>`,\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n schema: childSchema as ArraySchema<ObjectSchema<any>>,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId\n });\n continue;\n }\n\n collected.fields.push({\n id: toDisplayPath(nextPath),\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionAttribute: toOptionAttribute(nextPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(nextPath, casing, globalLongOptionFlags),\n optionFlag: toOptionFlag(nextPath, casing),\n longAliases: [...(childSchema.cliAliases ?? [])].map((alias) =>\n alias.startsWith(\"--\") ? alias : `--${alias}`\n ),\n shortFlag: childSchema.short,\n schema: childSchema as FieldSchema,\n description: childSchema.cliDescription ?? childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n global: childSchema.global === true ? true : undefined,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId\n });\n }\n\n return collected;\n}\n\nfunction toCommanderOptionAttribute(\n path: string[],\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const optionAttribute = toOptionAttribute(path, casing);\n const optionFlag = toOptionFlag(path, casing);\n\n if (!globalLongOptionFlags.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(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const collidesWithGlobalFlag = globalLongOptionFlags.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, ...field.longAliases].join(\", \");\n }\n\n return [`-${field.shortFlag}`, field.optionFlag, ...field.longAliases].join(\", \");\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(\n `Invalid value for \"${label}\". Expected true or false, got ${describeReceived(value)}.`\n );\n}\n\nfunction parseEnumValue(\n value: string,\n values: ReadonlyArray<string | number | boolean>,\n label: string\n): string | number | boolean {\n const match = values.find((candidate) => String(candidate) === value);\n\n if (match === undefined) {\n const suggestions = suggest(\n value,\n values.map((candidate) => String(candidate))\n );\n const suggestionLine =\n suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}?\\n` : \" \";\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\".${suggestionLine}Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}, got ${describeReceived(value)}.`\n );\n }\n\n return match;\n}\n\nfunction validateStringPattern(\n value: string,\n schema: Extract<ScalarSchema, { kind: \"string\" }>,\n label: string\n): string {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected a string with length at least ${schema.minLength}, got string with length ${value.length}.`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected a string with length at most ${schema.maxLength}, got string with length ${value.length}.`\n );\n }\n\n if (schema.pattern !== undefined && !matchesStringPattern(value, schema.pattern)) {\n throw new UserError(\n `Invalid value for \"${label}\": \"${value}\" does not match pattern \"${schema.pattern}\".`\n );\n }\n\n return value;\n}\n\nfunction matchesStringPattern(value: string, pattern: string): boolean {\n return new RegExp(pattern).test(value);\n}\n\nfunction parseJsonText(value: string, label: string): unknown {\n try {\n return JSON.parse(value);\n } catch (error) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected valid JSON, got ${describeReceived(value)} (parser: ${getErrorMessage(error)}).`\n );\n }\n}\n\nfunction describeReceived(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"missing\";\n if (Array.isArray(value)) return `array(${value.length})`;\n if (typeof value === \"object\") return \"object\";\n if (typeof value === \"string\") {\n const s = value.length > 40 ? `${value.slice(0, 40)}\u2026` : value;\n return `${JSON.stringify(s)}`;\n }\n return JSON.stringify(value);\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatJsonParseUserErrorMessage(\n label: string,\n filePath: string,\n source: string,\n error: unknown,\n options: { quotePath: boolean }\n): string {\n const location = getJsonParseErrorLocation(error, source);\n const message =\n location === null\n ? getErrorMessage(error)\n : removeNativeJsonParseLocation(getErrorMessage(error), location);\n const positionText =\n location === null ? \"\" : ` at line ${location.line} column ${location.column}`;\n const formattedPath = options.quotePath ? `\"${filePath}\"` : filePath;\n const snippet =\n location === null\n ? \"\"\n : `\\n${renderSourceSnippet({\n source,\n line: location.line,\n column: location.column,\n filePath\n })}`;\n\n return `${label} ${formattedPath} is not valid JSON: ${message}${positionText}.${snippet}`;\n}\n\nfunction removeNativeJsonParseLocation(\n message: string,\n location: { line: number; column: number }\n): string {\n const nativeSuffix = ` (line ${location.line} column ${location.column})`;\n\n return message.endsWith(nativeSuffix) ? message.slice(0, -nativeSuffix.length) : message;\n}\n\nfunction getJsonParseErrorLocation(\n error: unknown,\n source: string\n): { line: number; column: number } | null {\n const causeLocation = getJsonParseCauseLocation(error);\n\n if (causeLocation !== null) {\n return causeLocation;\n }\n\n const directPosition = getNumericProperty(error, \"position\");\n\n if (directPosition !== null) {\n return getSourceOffsetLocation(source, directPosition);\n }\n\n const messagePosition = getJsonParseMessagePosition(getErrorMessage(error));\n\n if (messagePosition !== null) {\n return getSourceOffsetLocation(source, messagePosition);\n }\n\n return null;\n}\n\nfunction getJsonParseCauseLocation(error: unknown): { line: number; column: number } | null {\n if (typeof error !== \"object\" || error === null || !hasOwnProperty(error, \"cause\")) {\n return null;\n }\n\n const cause = error.cause;\n const line = getNumericProperty(cause, \"line\");\n const column = getNumericProperty(cause, \"column\") ?? getNumericProperty(cause, \"col\");\n\n if (line === null || column === null) {\n return null;\n }\n\n return { line, column };\n}\n\nfunction getNumericProperty(value: unknown, key: string): number | null {\n if (typeof value !== \"object\" || value === null || !hasOwnProperty(value, key)) {\n return null;\n }\n\n const propertyValue = value[key];\n\n return typeof propertyValue === \"number\" && Number.isFinite(propertyValue) ? propertyValue : null;\n}\n\nfunction getJsonParseMessagePosition(message: string): number | null {\n const marker = \" at position \";\n const markerIndex = message.indexOf(marker);\n\n if (markerIndex === -1) {\n return null;\n }\n\n const startIndex = markerIndex + marker.length;\n let endIndex = startIndex;\n\n while (endIndex < message.length && isAsciiDigit(message[endIndex] ?? \"\")) {\n endIndex += 1;\n }\n\n if (endIndex === startIndex) {\n return null;\n }\n\n return Number.parseInt(message.slice(startIndex, endIndex), 10);\n}\n\nfunction getSourceOffsetLocation(source: string, offset: number): { line: number; column: number } {\n let line = 1;\n let column = 1;\n const boundedOffset = Math.max(0, Math.floor(offset));\n\n for (let index = 0; index < boundedOffset && index < source.length; index += 1) {\n if (source[index] === \"\\n\") {\n line += 1;\n column = 1;\n continue;\n }\n\n column += 1;\n }\n\n return { line, column };\n}\n\nfunction isAsciiDigit(value: string): boolean {\n return value >= \"0\" && value <= \"9\";\n}\n\nfunction formatAvailableList(values: Iterable<string>): string {\n return `Available: ${[...values].sort().join(\", \")}.`;\n}\n\nfunction normalizeCommanderOptionValue(value: unknown): unknown {\n return value === NULL_OPTION_VALUE ? null : value;\n}\n\nfunction parseScalarValue(\n value: string,\n schema: ScalarSchema,\n label: string\n): string | number | boolean {\n if (value === \"null\" && schema.nullable === true) {\n return null as unknown as string | number | boolean;\n }\n\n switch (schema.kind) {\n case \"string\":\n return validateStringPattern(value, schema, label);\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)}, got ${describeReceived(value)}.`\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\n throw new UserError(\n `Unsupported CLI schema kind. ${formatAvailableList([\"boolean\", \"enum\", \"number\", \"string\"])}`\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 if (value === \"null\" && schema.nullable === true) {\n return null as unknown as unknown[];\n }\n\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) =>\n parseScalarValue(item, itemSchema as ScalarSchema, label)\n );\n}\n\nfunction isNegativeNumericArrayToken(token: string, schema: ArraySchema<any>): boolean {\n if (!token.startsWith(\"-\") || token.startsWith(\"--\")) {\n return false;\n }\n\n const itemSchema = unwrapOptional(schema.item);\n if (itemSchema.kind !== \"number\") {\n return false;\n }\n\n const items = splitArrayInput(token);\n return (\n items.length > 0 && items.every((item) => isValidNumberSchemaValue(Number(item), itemSchema))\n );\n}\n\nfunction isNextArrayOptionToken(token: string, schema: ArraySchema<any>): boolean {\n return token.startsWith(\"-\") && !isNegativeNumericArrayToken(token, schema);\n}\n\nfunction validateArrayBounds(value: unknown[], schema: ArraySchema<any>, label: string): void {\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected an array with at least ${schema.minItems} items, got array(${value.length}).`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected an array with at most ${schema.maxItems} items, got array(${value.length}).`\n );\n }\n}\n\nfunction createOption(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): Option[] {\n const flags = formatOptionFlags(field, globalLongOptionFlags);\n const collidesWithGlobalFlag = globalLongOptionFlags.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) => (typeof value === \"boolean\" ? value : value));\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: string[] = []) => [...previous, value]\n )\n ];\n }\n\n if (field.schema.kind === \"json\") {\n return [createCommanderOption(`${flags} <json>`, field.description, field)];\n }\n\n const option = createCommanderOption(`${flags} <value>`, field.description, field);\n return [option];\n}\n\ninterface ResolvedCLIControls {\n debug: boolean;\n logLevel: boolean;\n output: boolean;\n verbose: boolean;\n yes: boolean;\n}\n\nfunction resolveCLIControls(controls: CLIControls | undefined): ResolvedCLIControls {\n return {\n debug: controls?.debug === true,\n logLevel: controls?.logLevel === true,\n output: controls?.output === true,\n verbose: controls?.verbose === true,\n yes: controls?.yes === true\n };\n}\n\nfunction getGlobalLongOptionFlags(\n presetsEnabled: boolean,\n versionEnabled: boolean,\n controls: ResolvedCLIControls\n): ReadonlySet<string> {\n const flags: string[] = [];\n\n if (presetsEnabled) {\n flags.push(\"--preset\");\n }\n if (controls.yes) {\n flags.push(\"--yes\");\n }\n if (controls.output) {\n flags.push(\"--output\");\n }\n if (controls.debug) {\n flags.push(\"--debug\");\n }\n if (controls.logLevel) {\n flags.push(\"--log-level\");\n }\n if (controls.verbose) {\n flags.push(\"--verbose\");\n }\n\n if (versionEnabled) {\n flags.push(\"--version\");\n }\n\n return new Set(flags);\n}\n\nfunction validateUniqueOptionFlags(\n fields: FieldDefinition[],\n globalLongOptionFlags: ReadonlySet<string>\n): void {\n const fieldsByFlag = new Map<string, FieldDefinition>();\n\n for (const field of fields) {\n if (field.positionalIndex !== undefined) {\n continue;\n }\n\n for (const flag of [field.optionFlag, ...field.longAliases]) {\n if (globalLongOptionFlags.has(flag)) {\n if (flag === field.optionFlag && field.shortFlag !== undefined) {\n continue;\n }\n\n throw new UserError(\n `Parameter \"${field.displayPath}\" uses reserved CLI flag \"${flag}\". Add a short flag or rename the parameter.`\n );\n }\n\n const existing = fieldsByFlag.get(flag);\n if (existing !== undefined) {\n throw new UserError(\n `Parameters \"${existing.displayPath}\" and \"${field.displayPath}\" use conflicting CLI flag \"${flag}\".`\n );\n }\n\n fieldsByFlag.set(flag, field);\n }\n }\n}\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 || field.longAliases.length > 0) {\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 normalizeVerboseAlias(argv: string[]): string[] {\n return argv.map((token) => (token === \"-v\" ? \"--verbose\" : 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>(\n group: Group<TServices>,\n scope: Scope\n): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return group.children.filter((child) => isNodeVisibleInScope(child, scope));\n}\n\nfunction getHelpChildren<TServices extends object>(\n group: Group<TServices>,\n scope: Scope\n): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return getVisibleChildren(group, scope).filter((child) => {\n if (child.kind === \"command\") {\n return child.hidden !== true;\n }\n\n return true;\n });\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 rootUsageName: string,\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 =\n findVisibleChild(current, token, scope);\n if (child === undefined) {\n throw new UserError(\n formatUnknownHelpCommandMessage(current, token, scope, rootUsageName, breadcrumb)\n );\n }\n\n breadcrumb.push(child.name);\n current = child;\n }\n\n return {\n breadcrumb,\n node: current\n };\n}\n\nfunction formatUnknownHelpCommandMessage<TServices extends object>(\n group: Group<TServices>,\n input: string,\n scope: Scope,\n rootUsageName: string,\n breadcrumb: string[]\n): string {\n const suggestions = suggest(\n input,\n getHelpChildren(group, scope).map((child) => child.name)\n );\n const commandPath = breadcrumb.slice(1).join(\" \");\n const helpTarget = commandPath.length === 0 ? rootUsageName : `${rootUsageName} ${commandPath}`;\n\n return `${formatSuggestionMessage(`Unknown command \"${input}\".`, suggestions)}\\nRun ${helpTarget} --help for usage.`;\n}\n\nfunction formatHelpFieldFlags(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n if (field.positionalIndex !== undefined) {\n return formatPositionalToken(field);\n }\n\n if (field.schema.kind === \"boolean\") {\n if (field.defaultValue === true) {\n return `--no-${field.optionFlag.slice(2)}`;\n }\n\n return formatOptionFlags(field, globalLongOptionFlags);\n }\n\n return `${formatOptionFlags(field, globalLongOptionFlags)} <${describeHelpValueToken(\n field.schema,\n {\n displayPath: field.displayPath,\n optionFlag: field.optionFlag\n }\n )}>`;\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.schema.kind === \"enum\" && field.schema.values.length <= 8) {\n const values = field.schema.values.map((value) => String(value)).join(\", \");\n if (values.length <= 120) {\n metadata.push(`values: ${values}`);\n }\n }\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 describeKnownStringFormat(format: string | undefined): string | undefined {\n switch (format) {\n case \"date\":\n return \"date\";\n\n case \"date-time\":\n return \"datetime\";\n\n case \"uri\":\n return \"url\";\n\n case \"email\":\n return \"email\";\n\n default:\n return undefined;\n }\n}\n\nfunction describeKnownStringPattern(pattern: string | undefined): string | undefined {\n if (pattern === undefined) {\n return undefined;\n }\n\n if (pattern === \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\") {\n return \"YYYY-MM-DD\";\n }\n\n if (pattern.startsWith(\"^\\\\d{4}-\\\\d{2}-\\\\d{2}T\")) {\n return \"YYYY-MM-DDTHH:MM:SS\";\n }\n\n return undefined;\n}\n\nfunction stripLongOptionPrefix(optionFlag: string): string {\n return optionFlag.startsWith(\"--\") ? optionFlag.slice(2) : optionFlag;\n}\n\nfunction getLastSegment(value: string, separator: string): string {\n const segments = value.split(separator);\n return segments[segments.length - 1] ?? value;\n}\n\nfunction matchesFieldNameSuffix(name: string, suffix: string): boolean {\n const lowerName = name.toLowerCase();\n const lowerSuffix = suffix.toLowerCase();\n\n return (\n lowerName === lowerSuffix ||\n name.endsWith(suffix) ||\n lowerName.endsWith(`-${lowerSuffix}`) ||\n lowerName.endsWith(`_${lowerSuffix}`)\n );\n}\n\nfunction describeFieldNameValueToken(displayPath: string, optionFlag: string): string | undefined {\n const displayName = getLastSegment(displayPath, \".\");\n const optionName = getLastSegment(stripLongOptionPrefix(optionFlag), \".\");\n const candidates = [displayName, optionName];\n const suffixTokens = [\n [\"Path\", \"path\"],\n [\"Paths\", \"path\"],\n [\"File\", \"path\"],\n [\"Files\", \"path\"],\n [\"Url\", \"url\"],\n [\"Email\", \"email\"],\n [\"Name\", \"name\"],\n [\"Id\", \"id\"]\n ] as const;\n\n for (const [suffix, token] of suffixTokens) {\n if (candidates.some((candidate) => matchesFieldNameSuffix(candidate, suffix))) {\n return token;\n }\n }\n\n return undefined;\n}\n\nfunction describeHelpValueToken(\n schema: FieldSchema,\n field: {\n displayPath: string;\n optionFlag: string;\n }\n): string {\n if (schema.kind === \"array\") {\n const itemSchema = unwrapOptional(schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n return \"value...\";\n }\n\n return `${describeHelpValueToken(itemSchema as FieldSchema, field)}...`;\n }\n\n if (schema.kind === \"json\") {\n return \"json\";\n }\n\n if (schema.kind === \"string\") {\n const metadataToken =\n describeKnownStringFormat(schema.format) ?? describeKnownStringPattern(schema.pattern);\n\n if (metadataToken !== undefined) {\n return metadataToken;\n }\n }\n\n if (schema.kind === \"enum\") {\n return \"value\";\n }\n\n return describeFieldNameValueToken(field.displayPath, field.optionFlag) ?? \"value\";\n}\n\nfunction formatCompactEnumSignatureToken(schema: FieldSchema): string | undefined {\n if (schema.kind !== \"enum\" || schema.values.length < 2 || schema.values.length > 3) {\n return undefined;\n }\n\n const tokens = schema.values.map((value) => String(value));\n const compact = tokens.every(\n (token) =>\n token.length > 0 &&\n token.length <= 24 &&\n token.trim() === token &&\n !token.includes(\"|\") &&\n !token.includes(\"\\t\") &&\n !token.includes(\"\\n\") &&\n !token.includes(\"\\r\") &&\n !token.includes(\" \")\n );\n\n return compact ? tokens.join(\"|\") : undefined;\n}\n\nfunction formatCommandParameterFieldFlags(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n if (field.positionalIndex !== undefined || field.schema.kind === \"boolean\") {\n return formatHelpFieldFlags(field, globalLongOptionFlags);\n }\n\n const enumToken = formatCompactEnumSignatureToken(field.schema);\n if (enumToken !== undefined) {\n return `${formatOptionFlags(field, globalLongOptionFlags)} ${enumToken}`;\n }\n\n return formatHelpFieldFlags(field, globalLongOptionFlags);\n}\n\nfunction describeDynamicFieldType(field: DynamicFieldDefinition): string {\n if (field.schema.kind === \"record\") {\n const valueSchema = unwrapOptional(field.schema.value);\n\n if (valueSchema.kind === \"json\") {\n return \"json\";\n }\n\n if (valueSchema.kind === \"array\") {\n return describeHelpValueToken(valueSchema as FieldSchema, {\n displayPath: field.optionPathDisplay,\n optionFlag: field.optionFlag\n });\n }\n\n if (valueSchema.kind === \"object\") {\n return \"value\";\n }\n\n return describeHelpValueToken(valueSchema as FieldSchema, {\n displayPath: field.optionPathDisplay,\n optionFlag: field.optionFlag\n });\n }\n\n return \"value\";\n}\n\nfunction formatDynamicHelpMetadata(field: DynamicFieldDefinition): string[] {\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 metadata;\n}\n\nfunction collectDynamicObjectHelpRows(\n schema: ObjectSchema<any>,\n casing: Casing,\n optionPrefix: string,\n displayPrefix: string,\n metadata: string[]\n): HelpOptionRow[] {\n const rows: HelpOptionRow[] = [];\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const childSchema = unwrapOptional(rawChildSchema);\n const optionFlag = `${optionPrefix}.${formatSegment(key, casing)}`;\n const displayPath = `${displayPrefix}.${key}`;\n const description = childSchema.description ?? displayPath;\n\n if (childSchema.kind === \"object\") {\n rows.push(\n ...collectDynamicObjectHelpRows(childSchema, casing, optionFlag, displayPath, metadata)\n );\n continue;\n }\n\n if (childSchema.kind === \"record\") {\n rows.push({\n flags: `${optionFlag}.<key> <${describeDynamicFieldType({\n ...({\n id: displayPath,\n path: [],\n displayPath,\n optionPath: [],\n optionPathDisplay: `${displayPath}.<key>`,\n optionFlag: `${optionFlag}.<key>`,\n optional: false,\n hasDefault: false,\n defaultValue: undefined,\n requiredWhenActive: false,\n schema: childSchema\n } satisfies DynamicFieldDefinition)\n })}>`,\n description: appendHelpMetadata(description, metadata)\n });\n continue;\n }\n\n if (childSchema.kind === \"array\" && unwrapOptional(childSchema.item).kind === \"object\") {\n rows.push(\n ...collectDynamicObjectHelpRows(\n unwrapOptional(childSchema.item) as ObjectSchema<any>,\n casing,\n `${optionFlag}.<index>`,\n `${displayPath}.<index>`,\n metadata\n )\n );\n continue;\n }\n\n rows.push({\n flags:\n childSchema.kind === \"boolean\"\n ? childSchema.default === true\n ? `--no-${optionFlag.slice(2)}`\n : optionFlag\n : `${optionFlag} <${describeHelpValueToken(childSchema as FieldSchema, {\n displayPath,\n optionFlag\n })}>`,\n description: appendHelpMetadata(description, metadata)\n });\n }\n\n return rows;\n}\n\nfunction formatDynamicHelpFields(field: DynamicFieldDefinition, casing: Casing): HelpOptionRow[] {\n const metadata = formatDynamicHelpMetadata(field);\n\n if (field.schema.kind === \"record\") {\n const valueSchema = unwrapOptional(field.schema.value);\n if (valueSchema.kind === \"object\") {\n return collectDynamicObjectHelpRows(\n valueSchema,\n casing,\n `${field.optionFlag}`,\n `${field.optionPathDisplay}`,\n metadata\n );\n }\n }\n\n if (field.schema.kind === \"array\") {\n const itemSchema = unwrapOptional(field.schema.item);\n if (itemSchema.kind === \"object\") {\n return collectDynamicObjectHelpRows(\n itemSchema,\n casing,\n `${field.optionFlag}`,\n `${field.optionPathDisplay}`,\n metadata\n );\n }\n }\n\n return [\n {\n flags: `${field.optionFlag} <${describeDynamicFieldType(field)}>`,\n description: appendHelpMetadata(field.description ?? field.optionPathDisplay, metadata)\n }\n ];\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 formatExampleValue(value: unknown): string {\n if (typeof value === \"string\" && value.length > 0 && !value.includes(\" \")) {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nfunction formatExampleCommand(\n breadcrumb: string[],\n rootUsageName: string,\n params: Record<string, unknown>\n): string {\n const commandPath = buildUsageLine(breadcrumb, rootUsageName, \"\");\n const flags = Object.entries(params).map(([key, value]) => {\n const flag = `--${key}`;\n return typeof value === \"boolean\"\n ? value\n ? flag\n : `--no-${key}`\n : `${flag} ${formatExampleValue(value)}`;\n });\n\n return [commandPath, ...flags].filter((token) => token.length > 0).join(\" \");\n}\n\nfunction formatExampleRows(\n examples: Command<any, any, any, any>[\"examples\"],\n breadcrumb: string[],\n rootUsageName: string\n): string[] {\n return examples.map(\n (example) =>\n `${example.title}\\n ${formatExampleCommand(breadcrumb, rootUsageName, example.params)}`\n );\n}\n\nfunction wrapOptionalCommandParameterToken(token: string, optional: boolean): string {\n return optional ? `[${token}]` : token;\n}\n\nfunction formatCommandDynamicParameterTokens(\n field: DynamicFieldDefinition,\n casing: Casing\n): string[] {\n const optional = field.optional || field.hasDefault;\n return formatDynamicHelpFields(field, casing).map((row) =>\n wrapOptionalCommandParameterToken(row.flags, optional)\n );\n}\n\nfunction formatCommandParameterTokens<TServices extends object>(\n command: Command<TServices, any, any, any>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string[] {\n const collected = collectFields(command.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, command.positional);\n\n return fields\n .filter((field) => field.global !== true)\n .map((field) =>\n wrapOptionalCommandParameterToken(\n formatCommandParameterFieldFlags(field, globalLongOptionFlags),\n field.positionalIndex === undefined && (field.optional || field.hasDefault)\n )\n )\n .concat(\n collected.dynamicFields.flatMap((field) => formatCommandDynamicParameterTokens(field, casing))\n );\n}\n\nfunction formatCommandRowName<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const baseName =\n node.aliases.length === 0 ? node.name : `${node.name} (${node.aliases.join(\", \")})`;\n const parameterTokens =\n node.kind === \"command\"\n ? formatCommandParameterTokens(node, casing, globalLongOptionFlags)\n : [];\n const name = parameterTokens.length === 0 ? baseName : `${baseName} ${parameterTokens.join(\" \")}`;\n return name;\n}\n\nfunction formatCommandRows<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): HelpCommandRow[] {\n return getHelpChildren(group, scope).map((child) => ({\n name: formatCommandRowName(child, casing, globalLongOptionFlags),\n description: child.description ?? \"\"\n }));\n}\n\nfunction formatGlobalOptionsLine(ctx: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n}): string {\n const flags: string[] = [];\n\n if (ctx.presetsEnabled) {\n flags.push(\"--preset <path>\");\n }\n\n if (ctx.controls.yes) {\n flags.push(\"--yes\");\n }\n if (ctx.controls.output) {\n flags.push(\"--output <format>\");\n }\n if (ctx.controls.verbose) {\n flags.push(\"-v, --verbose\");\n }\n\n if (ctx.showVersion) {\n flags.push(\"--version\");\n }\n\n return flags.length > 0 ? `${text.section(\"Options:\")} ${flags.join(\" \")}` : \"\";\n}\n\nfunction formatLeafGlobalOptionsLine(ctx: { controls: ResolvedCLIControls }): string {\n return ctx.controls.verbose ? `${text.section(\"Options:\")} -v, --verbose` : \"\";\n}\n\nfunction collectSchemaGlobalFieldRows<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): HelpOptionRow[] {\n const seen = new Map<string, HelpOptionRow>();\n\n const visit = (node: Command<TServices, any, any, any> | Group<TServices>): void => {\n if (node.kind === \"command\") {\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n for (const field of collected.fields) {\n if (field.global !== true) {\n continue;\n }\n\n if (globalLongOptionFlags.has(field.optionFlag)) {\n continue;\n }\n\n const dedupeKey = `${field.optionFlag}|${field.shortFlag ?? \"\"}`;\n if (seen.has(dedupeKey)) {\n continue;\n }\n\n seen.set(dedupeKey, {\n flags: formatHelpFieldFlags(field, globalLongOptionFlags),\n description: formatHelpFieldDescription(field)\n });\n }\n return;\n }\n\n for (const child of getHelpChildren(node, scope)) {\n visit(child);\n }\n };\n\n visit(group);\n return [...seen.values()];\n}\n\nfunction renderHelpSections(sections: string[]): string {\n return sections.filter((section) => section.length > 0).join(\"\\n\\n\");\n}\n\nfunction formatHelpCommandList(rows: HelpCommandRow[]): string {\n return process.stdout.isTTY !== true\n ? helpFormatterPlain.formatCommandList(rows)\n : formatCommandList(rows);\n}\n\nfunction formatHelpOptionList(rows: HelpOptionRow[]): string {\n return process.stdout.isTTY !== true\n ? helpFormatterPlain.formatOptionList(rows)\n : formatOptionList(rows);\n}\n\nfunction buildUsageLine(breadcrumb: string[], rootUsageName: string, suffix: string): string {\n const visibleBreadcrumb = breadcrumb.filter((segment) => segment.length > 0);\n const usageBreadcrumb =\n breadcrumb[0] === \"\" ? [rootUsageName, ...visibleBreadcrumb] : visibleBreadcrumb;\n const subPath = usageBreadcrumb.slice(1).join(\" \");\n const tokens = [rootUsageName, subPath, suffix].filter((segment) => segment.length > 0);\n return tokens.join(\" \");\n}\n\nfunction formatGroupUsageSuffix<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n if (\n group.default !== undefined &&\n group.default.hidden === true &&\n group.default.scope.includes(scope)\n ) {\n const parameterTokens = formatCommandParameterTokens(\n group.default,\n casing,\n globalLongOptionFlags\n );\n return [\"[command]\", \"[OPTIONS]\", ...parameterTokens].join(\" \");\n }\n\n return \"[command] [OPTIONS]\";\n}\n\nfunction renderGroupHelp<TServices extends object>(\n group: Group<TServices>,\n breadcrumb: string[],\n scope: Scope,\n casing: Casing,\n globalOptions: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n },\n rootUsageName: string,\n isRoot: boolean\n): string {\n const sections: string[] = [];\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n globalOptions.presetsEnabled,\n globalOptions.showVersion,\n globalOptions.controls\n );\n const commandRows = formatCommandRows(group, scope, casing, globalLongOptionFlags);\n\n if (commandRows.length > 0) {\n sections.push(`${text.sectionHeader(\"Commands\")}\\n${formatHelpCommandList(commandRows)}`);\n }\n\n if (isRoot) {\n const schemaGlobalRows = collectSchemaGlobalFieldRows(\n group,\n scope,\n casing,\n globalLongOptionFlags\n );\n const builtInLine = formatGlobalOptionsLine(globalOptions);\n\n if (schemaGlobalRows.length > 0) {\n sections.push(\n `${text.sectionHeader(\"Options\")}\\n${formatHelpOptionList(schemaGlobalRows)}\\n${builtInLine}`\n );\n } else {\n sections.push(builtInLine);\n }\n }\n\n return renderHelpDocument({\n breadcrumb,\n rootUsageName,\n usageLine: buildUsageLine(\n breadcrumb,\n rootUsageName,\n formatGroupUsageSuffix(group, scope, casing, globalLongOptionFlags)\n ),\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 globalOptions: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n },\n rootUsageName: string\n): string {\n const sections: string[] = [];\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n globalOptions.presetsEnabled,\n globalOptions.showVersion,\n globalOptions.controls\n );\n const collected = collectFields(command.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, command.positional);\n const optionRows = fields\n .filter((field) => field.global !== true)\n .map((field) => ({\n flags: formatHelpFieldFlags(field, globalLongOptionFlags),\n description: formatHelpFieldDescription(field)\n }))\n .concat(collected.dynamicFields.flatMap((field) => formatDynamicHelpFields(field, casing)));\n\n if (optionRows.length > 0) {\n sections.push(`${text.sectionHeader(\"Options\")}\\n${formatHelpOptionList(optionRows)}`);\n }\n\n const builtInLine = formatLeafGlobalOptionsLine(globalOptions);\n if (builtInLine.length > 0) {\n sections.push(builtInLine);\n }\n\n const secretRows = formatSecretRows(command.secrets);\n if (secretRows.length > 0) {\n sections.push(\n `${text.sectionHeader(\"Secrets (environment)\")}\\n${formatHelpOptionList(secretRows)}`\n );\n }\n\n if (command.examples.length > 0) {\n sections.push(\n `${text.sectionHeader(\"Examples\")}\\n${formatExampleRows(command.examples, breadcrumb, rootUsageName).join(\"\\n\")}`\n );\n }\n\n const positionalFields = fields.filter((f) => f.positionalIndex !== undefined);\n const usageSuffix =\n positionalFields.length > 0\n ? `[OPTIONS] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[OPTIONS]\";\n\n return renderHelpDocument({\n breadcrumb,\n rootUsageName,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, usageSuffix),\n description: command.description,\n requiresAuth: command.requires?.auth === true,\n sections\n });\n}\n\nfunction renderJsonHelp<TServices extends object>(\n target: ResolvedHelpTarget<TServices>,\n root: Group<TServices>,\n casing: Casing,\n globalOptions: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n },\n rootUsageName: string\n): string {\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n globalOptions.presetsEnabled,\n globalOptions.showVersion,\n globalOptions.controls\n );\n const node = target.node;\n\n if (node.kind === \"group\") {\n const commandRows = formatCommandRows(node, \"cli\", casing, globalLongOptionFlags);\n const isRoot = node === root;\n return `${JSON.stringify(\n {\n schemaVersion: 1,\n kind: \"group\",\n name: target.breadcrumb.at(-1) ?? rootUsageName,\n path: target.breadcrumb.filter((segment) => segment.length > 0),\n usage: buildUsageLine(\n target.breadcrumb,\n rootUsageName,\n formatGroupUsageSuffix(node, \"cli\", casing, globalLongOptionFlags)\n ),\n ...(node.description === undefined ? {} : { description: node.description }),\n commands: commandRows.map((row) => ({ name: row.name, description: row.description })),\n options: isRoot\n ? collectSchemaGlobalFieldRows(node, \"cli\", casing, globalLongOptionFlags).map((row) => ({\n name: row.flags.split(/[ ,]+/)[0]?.replace(/^--/, \"\") ?? row.flags,\n flags: row.flags.split(\", \"),\n type: \"unknown\",\n description: row.description,\n required: false\n }))\n : []\n },\n null,\n 2\n )}\\n`;\n }\n\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n const positionalFields = fields.filter((field) => field.positionalIndex !== undefined);\n const usageSuffix =\n positionalFields.length > 0\n ? `[OPTIONS] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[OPTIONS]\";\n\n return `${JSON.stringify(\n {\n schemaVersion: 1,\n kind: \"command\",\n name: node.name,\n path: target.breadcrumb.filter((segment) => segment.length > 0),\n usage: buildUsageLine(target.breadcrumb, rootUsageName, usageSuffix),\n ...(node.description === undefined ? {} : { description: node.description }),\n options: fields\n .filter((field) => field.global !== true)\n .map((field) => formatJsonHelpOption(field, globalLongOptionFlags)),\n secrets: Object.entries(node.secrets).map(([name, secret]) => ({\n name,\n env: secret.env,\n required: secret.optional !== true,\n ...(secret.description === undefined ? {} : { description: secret.description })\n })),\n examples: node.examples\n },\n null,\n 2\n )}\\n`;\n}\n\nfunction formatJsonHelpOption(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): JsonHelpOption {\n return {\n name: field.displayPath,\n flags: formatHelpFieldFlags(field, globalLongOptionFlags).split(\", \"),\n type: formatJsonHelpSchemaType(field.schema),\n ...(field.description === undefined ? {} : { description: field.description }),\n required: field.requiredWhenActive,\n ...(field.hasDefault ? { default: field.defaultValue } : {}),\n ...(field.positionalIndex === undefined ? {} : { positional: true })\n };\n}\n\nfunction formatJsonHelpSchemaType(schema: FieldSchema): string {\n if (schema.kind === \"enum\") {\n return \"enum\";\n }\n\n if (schema.kind === \"array\") {\n return \"array\";\n }\n\n if (schema.kind === \"json\") {\n return \"json\";\n }\n\n return schema.kind;\n}\n\nfunction renderHelpDocument(input: {\n breadcrumb: string[];\n rootUsageName: string;\n usageLine: string;\n description?: string;\n requiresAuth: boolean;\n sections: string[];\n}): string {\n const title =\n input.breadcrumb.filter((segment) => segment.length > 0).join(\" \") || input.rootUsageName;\n const description = input.description ?? \"\";\n const sentenceEndIndex = description.indexOf(\". \");\n const headingDescription =\n sentenceEndIndex === -1 ? description : description.slice(0, sentenceEndIndex + 1);\n const remainingDescription =\n sentenceEndIndex === -1 ? \"\" : description.slice(sentenceEndIndex + 2);\n const heading = headingDescription.length > 0 ? `${title} \u2014 ${headingDescription}` : title;\n const lines = [text.heading(heading), \"\"];\n\n if (remainingDescription.length > 0) {\n lines.push(remainingDescription, \"\");\n }\n\n lines.push(`Usage: ${text.usageCommand(input.usageLine)}`, \"\");\n\n if (input.requiresAuth) {\n lines.push(\"Requires: authentication\");\n }\n\n if (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 output = resolveHelpOutput(argv);\n const casing = options.casing ?? \"kebab\";\n const rootUsageName = options.rootUsageName ?? inferProgramName(argv);\n const target = resolveHelpTarget(root, argv, \"cli\", rootUsageName, options.rootDisplayName);\n const controls = resolveCLIControls(options.controls);\n\n if (output === \"json\") {\n process.stdout.write(\n renderJsonHelp(\n target,\n root,\n casing,\n {\n controls,\n showVersion: options.version !== undefined,\n presetsEnabled: options.presets === true\n },\n rootUsageName\n )\n );\n return;\n }\n\n await withOutputFormat(output, async () => {\n const rendered =\n target.node.kind === \"group\"\n ? renderGroupHelp(\n target.node,\n target.breadcrumb,\n \"cli\",\n casing,\n {\n controls,\n showVersion: options.version !== undefined,\n presetsEnabled: options.presets === true\n },\n rootUsageName,\n target.node === root\n )\n : renderLeafHelp(\n target.node,\n target.breadcrumb,\n casing,\n {\n controls,\n showVersion: options.version !== undefined,\n presetsEnabled: options.presets === true\n },\n rootUsageName\n );\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 globalLongOptionFlags: ReadonlySet<string>,\n execute: (state: ExecutionState<TServices>) => Promise<void>,\n presetsEnabled: boolean,\n controls: ResolvedCLIControls,\n pathSegments: string[] = []\n): CommanderCommand | null {\n const nextPathSegments = [...pathSegments, node.name];\n\n if (node.kind === \"command\") {\n if (!node.scope.includes(\"cli\")) {\n return null;\n }\n\n const command = new CommanderCommand(node.name);\n Reflect.set(command, \"_toolcraftHidden\", node.hidden);\n Reflect.set(command, \"_toolcraftOriginalName\", node.name);\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n validateUniqueOptionFlags(fields, globalLongOptionFlags);\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, presetsEnabled, controls);\n command.allowExcessArguments(true);\n\n if (collected.dynamicFields.length > 0) {\n command.allowUnknownOption(true);\n }\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, globalLongOptionFlags)) {\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 commandPath: nextPathSegments.join(\".\"),\n casing,\n dynamicFields: collected.dynamicFields,\n fields,\n positionalValues,\n presetsEnabled,\n rawArgv: actionCommand.args,\n actionCommand,\n variants: collected.variants\n });\n });\n\n return command;\n }\n\n if (!isNodeVisibleInScope(node, \"cli\")) {\n return null;\n }\n\n const reservedChildNames = node.children\n .filter((child) => !isNodeVisibleInScope(child, \"cli\"))\n .flatMap((child) => getNodeCommandNames(child));\n const visibleChildren = node.children\n .map((child) =>\n createNodeCommand(\n child,\n casing,\n globalLongOptionFlags,\n execute,\n presetsEnabled,\n controls,\n nextPathSegments\n )\n )\n .filter((child): child is CommanderCommand => child !== null);\n\n const group = new CommanderCommand(node.name);\n Reflect.set(group, \"_toolcraftReservedChildNames\", reservedChildNames);\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, presetsEnabled, controls);\n const childNames = new Set(visibleChildren.map((child) => child.name()));\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 addCommanderChild(group, child, isDefaultChild, childNames);\n }\n\n return group;\n}\n\nfunction addCommanderChild(\n parent: CommanderCommand,\n child: CommanderCommand,\n isDefault: boolean,\n siblingNames: ReadonlySet<string>\n): void {\n if (isDefault && (child.name().length === 0 || isToolcraftHiddenCommander(child))) {\n let internalName = \"__toolcraft_default__\";\n let suffix = 2;\n\n while (siblingNames.has(internalName)) {\n internalName = `__toolcraft_default_${suffix}`;\n suffix += 1;\n }\n\n child.name(internalName);\n Reflect.set(\n parent,\n \"_toolcraftHiddenDefaultNames\",\n getToolcraftHiddenDefaultNames(parent).concat([\n ...new Set(\n [Reflect.get(child, \"_toolcraftOriginalName\"), ...child.aliases()].filter(\n (name): name is string => typeof name === \"string\" && name.length > 0\n )\n )\n ])\n );\n parent.addCommand(child, { hidden: true, isDefault: true });\n return;\n }\n\n const options = {\n ...(isDefault ? { isDefault: true } : {}),\n ...(isToolcraftHiddenCommander(child) ? { hidden: true } : {})\n };\n parent.addCommand(child, Object.keys(options).length > 0 ? options : undefined);\n}\n\nfunction isToolcraftHiddenCommander(command: CommanderCommand): boolean {\n return Reflect.get(command, \"_toolcraftHidden\") === true;\n}\n\nfunction getToolcraftHiddenDefaultNames(command: CommanderCommand): string[] {\n const value = Reflect.get(command, \"_toolcraftHiddenDefaultNames\");\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\nfunction getToolcraftReservedChildNames(command: CommanderCommand): string[] {\n const value = Reflect.get(command, \"_toolcraftReservedChildNames\");\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\nfunction getNodeCommandNames<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>\n): string[] {\n return [node.name, ...node.aliases].filter((name) => name.length > 0);\n}\n\nfunction createGlobalSnapshotOptions(\n presetsEnabled: boolean,\n versionEnabled: boolean,\n controls: ResolvedCLIControls\n): CLICommandTreeSnapshotOption[] {\n const options: CLICommandTreeSnapshotOption[] = [\n {\n name: \"help\",\n flags: [\"-h\", \"--help\"],\n type: \"boolean\",\n required: false,\n hidden: false,\n description: \"Display help for command.\"\n }\n ];\n\n if (presetsEnabled) {\n options.push({\n name: \"preset\",\n flags: [\"--preset\"],\n type: \"string\",\n required: false,\n hidden: true,\n description: \"Load parameter defaults from a JSON file.\"\n });\n }\n if (controls.yes) {\n options.push({\n name: \"yes\",\n flags: [\"--yes\"],\n type: \"boolean\",\n required: false,\n hidden: true,\n description: \"Accept defaults and skip prompts.\"\n });\n }\n if (controls.output) {\n options.push({\n name: \"output\",\n flags: [\"--output\"],\n type: \"enum\",\n required: false,\n hidden: true,\n description: \"Output format.\"\n });\n }\n if (controls.debug) {\n options.push({\n name: \"debug\",\n flags: [\"--debug\"],\n type: \"enum\",\n required: false,\n hidden: true,\n description: \"Print stack traces for unexpected errors.\"\n });\n }\n if (controls.logLevel) {\n options.push({\n name: \"logLevel\",\n flags: [\"--log-level\"],\n type: \"enum\",\n required: false,\n hidden: true,\n description: \"Set runtime diagnostic log level.\"\n });\n }\n if (controls.verbose) {\n options.push({\n name: \"verbose\",\n flags: [\"-v\", \"--verbose\"],\n type: \"boolean\",\n required: false,\n hidden: true,\n description: \"Print detailed runtime diagnostics.\"\n });\n }\n if (versionEnabled) {\n options.push({\n name: \"version\",\n flags: [\"--version\"],\n type: \"boolean\",\n required: false,\n hidden: false,\n description: \"Output the version number.\"\n });\n }\n\n return options;\n}\n\nfunction createSnapshotGroup<TServices extends object>(\n group: Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n pathSegments: string[],\n isDefault: boolean\n): CLICommandTreeSnapshotGroup {\n const children = group.children\n .filter((child) => isNodeVisibleInScope(child, \"cli\"))\n .map((child) =>\n createSnapshotNode(\n child,\n casing,\n globalLongOptionFlags,\n [...pathSegments, child.name],\n group.default === child\n )\n );\n\n return {\n kind: \"group\",\n name: group.name,\n path: pathSegments,\n aliases: [...group.aliases],\n hidden: false,\n default: isDefault,\n ...(group.description === undefined ? {} : { description: group.description }),\n children\n };\n}\n\nfunction createSnapshotNode<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n pathSegments: string[],\n isDefault: boolean\n): CLICommandTreeSnapshotNode {\n if (node.kind === \"group\") {\n return createSnapshotGroup(node, casing, globalLongOptionFlags, pathSegments, isDefault);\n }\n\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n validateUniqueOptionFlags(fields, globalLongOptionFlags);\n\n return {\n kind: \"command\",\n name: node.name,\n path: pathSegments,\n aliases: [...node.aliases],\n hidden: node.hidden,\n default: isDefault,\n ...(node.description === undefined ? {} : { description: node.description }),\n options: [\n ...fields.map((field) => createFieldSnapshotOption(field, globalLongOptionFlags)),\n ...collected.dynamicFields.flatMap((field) => createDynamicSnapshotOptions(field, casing))\n ]\n };\n}\n\nfunction createFieldSnapshotOption(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): CLICommandTreeSnapshotOption {\n return {\n name: field.displayPath,\n flags: formatHelpFieldFlags(field, globalLongOptionFlags).split(\", \"),\n type: formatJsonHelpSchemaType(field.schema),\n required: field.requiredWhenActive,\n hidden: false,\n ...(field.description === undefined ? {} : { description: field.description }),\n ...(field.hasDefault ? { default: field.defaultValue } : {}),\n ...(field.positionalIndex === undefined ? {} : { positional: true }),\n ...(field.global === true ? { global: true } : {})\n };\n}\n\nfunction createDynamicSnapshotOptions(\n field: DynamicFieldDefinition,\n casing: Casing\n): CLICommandTreeSnapshotOption[] {\n return formatDynamicHelpFields(field, casing).map((row) => ({\n name: field.displayPath,\n flags: [row.flags],\n type: describeDynamicFieldType(field),\n required: field.requiredWhenActive,\n hidden: false,\n ...(field.description === undefined ? {} : { description: field.description }),\n ...(field.hasDefault ? { default: field.defaultValue } : {}),\n dynamic: true\n }));\n}\n\nfunction addGlobalOptions(\n command: CommanderCommand,\n presetsEnabled: boolean,\n controls: ResolvedCLIControls\n): void {\n const options: Option[] = [];\n\n if (presetsEnabled) {\n options.push(new Option(\"--preset <path>\", \"Load parameter defaults from a JSON file.\"));\n }\n\n if (controls.yes) {\n options.push(new Option(\"--yes\", \"Accept defaults and skip prompts.\"));\n }\n if (controls.output) {\n options.push(\n new Option(\"--output <format>\", \"Output format.\").argParser((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(\n formatInvalidEnumMessage(\"--output\", value, [\"rich\", \"md\", \"markdown\", \"json\"], {\n candidates: [\"rich\", \"markdown\", \"json\"],\n threshold: 3\n })\n );\n })\n );\n }\n if (controls.debug) {\n options.push(\n new Option(\"--debug [mode]\", \"Print stack traces for unexpected errors.\")\n .preset(\"trim\")\n .argParser(parseDebugStackMode)\n );\n }\n if (controls.logLevel) {\n options.push(\n new Option(\"--log-level <level>\", \"Set runtime diagnostic log level.\").argParser(\n parseLogLevel\n )\n );\n }\n if (controls.verbose) {\n options.push(new Option(\"--verbose\", \"Print detailed runtime diagnostics.\"));\n }\n\n for (const option of options) {\n option.hideHelp(true);\n command.addOption(option);\n }\n}\n\nfunction parseDebugStackMode(value: string | boolean): DebugStackMode {\n if (value === true || value === \"trim\") {\n return \"trim\";\n }\n\n if (value === \"raw\") {\n return \"raw\";\n }\n\n throw new InvalidArgumentError(\n formatInvalidEnumMessage(\"--debug\", String(value), [\"raw\"], { candidates: [\"raw\"] })\n );\n}\n\nfunction parseLogLevel(value: string): LogLevel {\n if (isLogLevel(value)) {\n return value;\n }\n\n throw new InvalidArgumentError(\n formatInvalidEnumMessage(\"--log-level\", value, [...LOG_LEVELS], {\n candidates: [\"warn\", \"debug\", \"trace\"],\n threshold: 3\n })\n );\n}\n\nfunction writeCLIDiagnosticEvent(event: DiagnosticLogEvent): void {\n const transcript = event.data?.transcript;\n if (typeof transcript === \"string\") {\n process.stderr.write(transcript);\n return;\n }\n\n if (event.category === \"progress\" || event.level === \"trace\") {\n return;\n }\n\n process.stderr.write(`${event.message}\\n`);\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 = Object.prototype.hasOwnProperty.call(cursor, segment)\n ? cursor[segment]\n : undefined;\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 Object.defineProperty(cursor, segment, {\n value: next,\n enumerable: true,\n configurable: true,\n writable: true\n });\n cursor = next;\n }\n\n const leaf = path[path.length - 1];\n if (leaf !== undefined) {\n Object.defineProperty(cursor, leaf, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\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\nfunction fieldPromptLabel(field: FieldDefinition): string {\n return field.positionalIndex === undefined ? field.optionFlag : `<${field.displayPath}>`;\n}\n\nfunction enumOptionLabel(schema: Extract<FieldSchema, { kind: \"enum\" }>, value: unknown): string {\n const key = String(value);\n\n if (schema.labels === undefined || !Object.prototype.hasOwnProperty.call(schema.labels, key)) {\n return key;\n }\n\n return schema.labels[key] ?? key;\n}\n\ninterface PromptStreams {\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nfunction withPromptStreams<T extends object>(options: T, streams: PromptStreams): T & PromptStreams {\n return {\n ...options,\n ...(streams.input === undefined ? {} : { input: streams.input }),\n ...(streams.output === undefined ? {} : { output: streams.output })\n };\n}\n\nfunction throwPromptCancellation(): never {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n}\n\nasync function promptForField(\n field: FieldDefinition,\n streams: PromptStreams = {}\n): 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: enumOptionLabel(schema, value),\n value\n }));\n const selected = await select(\n withPromptStreams(\n {\n message: field.description ?? fieldPromptLabel(field),\n options,\n initialValue: field.hasDefault ? field.defaultValue : undefined\n },\n streams\n )\n );\n\n if (isCancel(selected)) {\n throwPromptCancellation();\n }\n\n return selected;\n }\n\n if (field.schema.kind === \"boolean\") {\n const selected = await confirm(\n withPromptStreams(\n {\n message: fieldPromptLabel(field),\n initialValue: field.hasDefault ? Boolean(field.defaultValue) : undefined\n },\n streams\n )\n );\n\n if (isCancel(selected)) {\n throwPromptCancellation();\n }\n\n return selected;\n }\n\n const entered = await promptText(\n withPromptStreams(\n {\n message: fieldPromptLabel(field),\n initialValue:\n field.hasDefault && field.defaultValue !== undefined\n ? formatResolvedValue(field.defaultValue)\n : undefined\n },\n streams\n )\n );\n\n if (isCancel(entered)) {\n throwPromptCancellation();\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 if (field.schema.kind === \"json\") {\n if (entered === \"null\" && field.schema.nullable === true) {\n return null;\n }\n\n return parseJsonText(entered, 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\nfunction resolveOutputFromArgv(argv: readonly string[]): OutputMode {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index] ?? \"\";\n\n if (token === \"--json\") {\n return \"json\";\n }\n if (token === \"--md\" || token === \"--markdown\") {\n return \"md\";\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 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\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 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 === \"number\") {\n return getExpectedNumberDescription(schema);\n }\n\n if (schema.kind === \"json\") {\n return \"valid JSON\";\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 if (schema.minLength !== undefined && value.length < schema.minLength) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected a string with length at least ${schema.minLength}, got string with length ${value.length}.`\n );\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected a string with length at most ${schema.maxLength}, got string with length ${value.length}.`\n );\n }\n if (schema.pattern !== undefined && !matchesStringPattern(value, schema.pattern)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\": \"${value}\" does not match pattern \"${schema.pattern}\".`\n );\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\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected ${describeExpectedPresetValue(schema)}, got ${describeReceived(value)}.`\n );\n}\n\nfunction validatePresetFieldValue(\n value: unknown,\n field: FieldDefinition,\n presetPath: string\n): unknown {\n if (field.schema.kind === \"json\") {\n return value;\n }\n\n if (field.schema.kind !== \"array\") {\n return validatePresetScalarValue(\n value,\n field.schema as ScalarSchema,\n field.displayPath,\n presetPath\n );\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, got ${describeReceived(value)}.`\n );\n }\n\n if (field.schema.minItems !== undefined && value.length < field.schema.minItems) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array with at least ${field.schema.minItems} items, got array(${value.length}).`\n );\n }\n\n if (field.schema.maxItems !== undefined && value.length > field.schema.maxItems) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array with at most ${field.schema.maxItems} items, got array(${value.length}).`\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 (hasOwnErrorCode(error, \"ENOENT\")) {\n throw new UserError(`Preset file \"${presetPath}\" was not found.`);\n }\n\n const message =\n error instanceof Error && error.message.length > 0 ? error.message : \"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 (error) {\n throw new UserError(\n formatJsonParseUserErrorMessage(\"Preset file\", presetPath, rawPreset, error, {\n quotePath: true\n }),\n { cause: error }\n );\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, got ${describeReceived(value)}.`\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]) =>\n matchesFixtureValue(value, actual[key])\n );\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(\n init?.method ?? (input instanceof Request ? input.method : undefined)\n );\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 lstat: async () => ({ isSymbolicLink: () => false }),\n rename: async () => undefined,\n unlink: async () => undefined\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(\n ([key]) => key !== \"result\" && key !== \"response\" && key !== \"error\"\n )\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 (\n typeof firstArg === \"string\" &&\n Object.prototype.hasOwnProperty.call(definition, firstArg)\n ) {\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[]) =>\n 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(\n scenarios: FixtureScenario[],\n selector: string,\n fixturePath: string\n): 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 const names = scenarios\n .map((entry) => entry.name)\n .filter((name): name is string => typeof name === \"string\" && name.length > 0);\n const available =\n names.length === 0\n ? `No fixtures are declared in ${fixturePath}.`\n : formatAvailableList(names);\n throw new UserError(`Fixture scenario \"${selector}\" was not found. ${available}`);\n }\n\n return scenario;\n}\n\nasync function loadFixtureScenario(\n command: Command<any, any, any, any>,\n selector: string\n): Promise<FixtureScenario> {\n const commandPath = getCommandSourcePath(command);\n\n if (commandPath === undefined) {\n throw new UserError(\n `Fixture mode could not determine the source file for command \"${command.name}\".`\n );\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 (error) {\n throw new UserError(\n formatJsonParseUserErrorMessage(\"Fixture file\", fixturePath, rawFixture, error, {\n quotePath: false\n }),\n { cause: error }\n );\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, fixturePath);\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(\n command: Command<any, any, any, any>\n): 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 runtimeFetch: typeof globalThis.fetch,\n runtimeEnv?: Record<string, string>,\n runtimeFs?: HandlerFs\n): Promise<ResolvedFixtureRuntime<TServices>> {\n const selector = process.env.TOOLCRAFT_FIXTURE;\n\n if (selector === undefined || selector.length === 0) {\n return {\n env: createEnv(runtimeEnv),\n fetch: runtimeFetch,\n fs: createFs(runtimeFs),\n isFixture: false,\n requirementOptions,\n secrets: resolveCommandSecrets(command, runtimeEnv),\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 isHumanInLoopPending(result: unknown): result is HumanInLoopPending {\n return (\n typeof result === \"object\" &&\n result !== null &&\n (result as { status?: unknown }).status === \"pending-approval\" &&\n typeof (result as { approvalId?: unknown }).approvalId === \"string\" &&\n typeof (result as { message?: unknown }).message === \"string\" &&\n typeof (result as { enqueuedAt?: unknown }).enqueuedAt === \"string\"\n );\n}\n\nfunction renderHumanInLoopPending(pending: HumanInLoopPending): void {\n process.stdout.write(\n `\u2713 Queued for human approval (id: ${pending.approvalId})\\n` +\n ` Message: ${pending.message}\\n` +\n ` Track: toolcraft approvals show ${pending.approvalId}\\n`\n );\n}\n\nfunction renderApprovalDeclined(error: ApprovalDeclinedError): void {\n const logger = createLogger();\n logger.error(error.message);\n process.exitCode = 1;\n}\n\ntype CliErrorPattern =\n | {\n kind: \"usage\";\n message: string;\n rootUsageName: string;\n commandPath: string;\n }\n | {\n kind: \"runtime-user\";\n message: string;\n }\n | {\n kind: \"definition\";\n error: Error;\n debugStackMode: DebugStackMode | undefined;\n }\n | {\n kind: \"toolcraft-bug\";\n error: Error;\n debugStackMode: DebugStackMode | undefined;\n }\n | {\n kind: \"unexpected\";\n message: string;\n stack: string | undefined;\n debugStackMode: DebugStackMode | undefined;\n };\n\nfunction renderCliErrorPattern(\n pattern: CliErrorPattern,\n outputEmitter?: (entry: string) => void\n): void {\n const logger = createLogger(outputEmitter);\n\n if (pattern.kind === \"usage\") {\n logger.error(\n appendUsagePointer(pattern.message, {\n rootUsageName: pattern.rootUsageName,\n commandPath: pattern.commandPath\n })\n );\n process.exitCode = 1;\n return;\n }\n\n if (pattern.kind === \"runtime-user\") {\n logger.error(pattern.message);\n process.exitCode = 1;\n return;\n }\n\n if (pattern.kind === \"definition\") {\n logger.error(\n `Command definition error: ${pattern.error.message}\\n` +\n \"This is a bug in the generated command definition, not in your command arguments.\\n\" +\n \"Run with --debug for a stack trace.\"\n );\n if (pattern.debugStackMode !== undefined && pattern.error.stack) {\n process.stderr.write(`${formatDebugStack(pattern.error.stack, pattern.debugStackMode)}\\n`);\n }\n process.exitCode = 1;\n return;\n }\n\n if (pattern.kind === \"toolcraft-bug\") {\n logger.error(\n `toolcraft hit an internal invariant: ${pattern.error.message}\\n` +\n `This is a bug in toolcraft or in the command definition; ` +\n `it cannot be worked around by changing argv. ` +\n `Re-run with --debug for a stack trace and file an issue.`\n );\n if (pattern.debugStackMode !== undefined && pattern.error.stack) {\n process.stderr.write(`${formatDebugStack(pattern.error.stack, pattern.debugStackMode)}\\n`);\n }\n process.exitCode = 1;\n return;\n }\n\n logger.error(\n pattern.debugStackMode !== undefined\n ? pattern.message\n : `${pattern.message} Use --debug for a stack trace.`\n );\n if (pattern.debugStackMode !== undefined && pattern.stack !== undefined) {\n process.stderr.write(`${formatDebugStack(pattern.stack, pattern.debugStackMode)}\\n`);\n }\n process.exitCode = 1;\n}\n\nfunction getNestedValue(target: Record<string, unknown>, path: string[]): unknown {\n return path.reduce<unknown>(\n (current, segment) =>\n current !== null && typeof current === \"object\"\n ? (current as Record<string, unknown>)[segment]\n : undefined,\n target\n );\n}\n\nfunction parseFieldInputValue(value: string, schema: FieldSchema, label: string): unknown {\n if (schema.kind === \"array\") {\n return parseArrayValue(value, schema, label);\n }\n\n if (schema.kind === \"json\") {\n if (value === \"null\" && schema.nullable === true) {\n return null;\n }\n\n return parseJsonText(value, label);\n }\n\n return parseScalarValue(value, schema, label);\n}\n\nfunction parseOptionFieldValue(\n field: FieldDefinition,\n value: unknown,\n errors: ValidationError[]\n): { ok: true; value: unknown } | { ok: false } {\n try {\n if (value === null) {\n return { ok: true, value };\n }\n\n if (field.schema.kind === \"array\" && Array.isArray(value)) {\n const parsedValues: unknown[] = [];\n\n for (const item of value) {\n const parsed = parseArrayValue(String(item), field.schema, field.displayPath);\n if (parsed === null) {\n return { ok: true, value: null };\n }\n\n parsedValues.push(...parsed);\n }\n\n validateArrayBounds(parsedValues, field.schema, field.displayPath);\n return { ok: true, value: parsedValues };\n }\n\n if (typeof value !== \"string\") {\n return { ok: true, value };\n }\n\n const parsedValue = parseFieldInputValue(value, field.schema, field.displayPath);\n if (field.schema.kind === \"array\" && Array.isArray(parsedValue)) {\n validateArrayBounds(parsedValue, field.schema, field.displayPath);\n }\n\n return { ok: true, value: parsedValue };\n } catch (error) {\n if (error instanceof UserError || error instanceof InvalidArgumentError) {\n errors.push({\n path: field.displayPath,\n message: error.message\n });\n return { ok: false };\n }\n\n throw error;\n }\n}\n\nfunction consumeFieldValue(\n args: string[],\n index: number,\n schema: FieldSchema,\n label: string,\n inlineValue?: string\n): {\n nextIndex: number;\n value: unknown;\n} {\n if (schema.kind === \"boolean\") {\n if (inlineValue !== undefined) {\n return {\n nextIndex: index,\n value: parseScalarValue(inlineValue, schema, label)\n };\n }\n\n const next = args[index + 1];\n if (next === \"true\" || next === \"false\" || (schema.nullable === true && next === \"null\")) {\n return {\n nextIndex: index + 1,\n value: parseScalarValue(next, schema, label)\n };\n }\n\n return {\n nextIndex: index,\n value: true\n };\n }\n\n if (inlineValue !== undefined) {\n return {\n nextIndex: index,\n value: parseFieldInputValue(inlineValue, schema, label)\n };\n }\n\n if (schema.kind === \"array\") {\n const values: unknown[] = [];\n let nextIndex = index;\n let cursor = index + 1;\n\n while (cursor < args.length) {\n const token = args[cursor] ?? \"\";\n if (isNextArrayOptionToken(token, schema)) {\n break;\n }\n\n const parsed = parseArrayValue(token, schema, label);\n if (parsed === null) {\n return {\n nextIndex: cursor,\n value: null\n };\n }\n\n values.push(...parsed);\n nextIndex = cursor;\n cursor += 1;\n }\n\n if (values.length === 0) {\n throw new InvalidArgumentError(`option '${label}' argument missing`);\n }\n\n validateArrayBounds(values, schema, label);\n\n return {\n nextIndex,\n value: values\n };\n }\n\n const next = args[index + 1];\n if (next === undefined) {\n throw new InvalidArgumentError(`option '${label}' argument missing`);\n }\n\n return {\n nextIndex: index + 1,\n value: parseFieldInputValue(next, schema, label)\n };\n}\n\nfunction resolveDynamicLeaf(\n schema: AnySchema,\n rawSegments: string[],\n casing: Casing,\n outputPath: string[] = [],\n displayPath: string[] = [],\n displayPathPrefix = \"\"\n): {\n displayPath: string;\n path: string[];\n schema: FieldSchema;\n} {\n const unwrappedSchema = unwrapOptional(schema);\n const kind = formatCliSchemaKind(unwrappedSchema.kind);\n\n if (rawSegments.length === 0) {\n if (\n unwrappedSchema.kind === \"json\" ||\n unwrappedSchema.kind === \"array\" ||\n unwrappedSchema.kind === \"string\" ||\n unwrappedSchema.kind === \"number\" ||\n unwrappedSchema.kind === \"boolean\" ||\n unwrappedSchema.kind === \"enum\"\n ) {\n return {\n displayPath: toDisplayPath(displayPath),\n path: outputPath,\n schema: unwrappedSchema as FieldSchema\n };\n }\n\n throw new UserError(\n formatUnsupportedDynamicSchemaMessage(\n kind,\n qualifyDisplayPath(displayPathPrefix, toDisplayPath(displayPath))\n )\n );\n }\n\n switch (unwrappedSchema.kind) {\n case \"object\": {\n const [head, ...rest] = rawSegments;\n\n for (const [key, childSchema] of Object.entries(unwrappedSchema.shape) as Array<\n [string, AnySchema]\n >) {\n if (formatSegment(key, casing) !== head) {\n continue;\n }\n\n return resolveDynamicLeaf(\n childSchema,\n rest,\n casing,\n [...outputPath, key],\n [...displayPath, key],\n displayPathPrefix\n );\n }\n\n throw new UserError(\n `Unknown parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n [...displayPath, head].join(\".\")\n )}\". ${formatAvailableList(\n Object.keys(unwrappedSchema.shape).map((key) =>\n qualifyDisplayPath(\n displayPathPrefix,\n toDisplayPath([...displayPath, formatSegment(key, casing)])\n )\n )\n )}`\n );\n }\n\n case \"record\": {\n const [head, ...rest] = rawSegments;\n return resolveDynamicLeaf(\n unwrappedSchema.value,\n rest,\n casing,\n [...outputPath, head ?? \"\"],\n [...displayPath, head ?? \"\"],\n displayPathPrefix\n );\n }\n\n case \"array\": {\n const itemSchema = unwrapOptional(unwrappedSchema.item);\n if (itemSchema.kind !== \"object\") {\n throw new UserError(\n `Array parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n toDisplayPath(displayPath)\n )}\" must use object items.`\n );\n }\n\n const [head, ...rest] = rawSegments;\n if (head === undefined || !isNumericFixtureSelector(head)) {\n throw new UserError(\n `Array parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n toDisplayPath(displayPath)\n )}\" must use numeric indices.`\n );\n }\n\n return resolveDynamicLeaf(\n itemSchema,\n rest,\n casing,\n [...outputPath, head],\n [...displayPath, head],\n displayPathPrefix\n );\n }\n\n default:\n throw new UserError(\n `Unknown parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n [...displayPath, ...rawSegments].join(\".\")\n )}\". ${formatAvailableList(\n displayPath.length === 0\n ? []\n : [qualifyDisplayPath(displayPathPrefix, toDisplayPath(displayPath))]\n )}`\n );\n }\n}\n\nfunction finalizeDynamicValue(\n schema: AnySchema,\n value: unknown,\n displayPath: string,\n errors: ValidationError[]\n): unknown {\n const unwrappedSchema = unwrapOptional(schema);\n\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null && unwrappedSchema.nullable === true) {\n return null;\n }\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"enum\":\n case \"json\":\n return value;\n\n case \"array\": {\n const itemSchema = unwrapOptional(unwrappedSchema.item);\n if (itemSchema.kind !== \"object\") {\n return value;\n }\n\n if (!isPlainObject(value)) {\n errors.push({\n path: displayPath,\n message: `Invalid value for \"${displayPath}\". Expected indexed object entries, got ${describeReceived(value)}.`\n });\n return value;\n }\n\n const entries = Object.entries(value);\n const indices = entries.map(([key]) => Number(key)).sort((left, right) => left - right);\n\n if (indices.some((index) => !Number.isInteger(index) || index < 0)) {\n errors.push({\n path: displayPath,\n message: `Array parameter \"${displayPath}\" must use numeric indices.`\n });\n return value;\n }\n\n for (let index = 0; index < indices.length; index += 1) {\n if (indices[index] !== index) {\n errors.push({\n path: displayPath,\n message: `Array parameter \"${displayPath}\" must use contiguous indices starting at 0.`\n });\n return value;\n }\n }\n\n return indices.map((index) =>\n finalizeDynamicValue(\n unwrappedSchema.item,\n (value as Record<string, unknown>)[String(index)],\n `${displayPath}.${index}`,\n errors\n )\n );\n }\n\n case \"object\": {\n if (!isPlainObject(value)) {\n errors.push({\n path: displayPath,\n message: `Invalid value for \"${displayPath}\". Expected an object, got ${describeReceived(value)}.`\n });\n return value;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, rawChildSchema] of Object.entries(unwrappedSchema.shape) as Array<\n [string, AnySchema]\n >) {\n const childSchema = unwrapOptional(rawChildSchema);\n const childValue = value[key];\n const childDisplayPath = displayPath.length === 0 ? key : `${displayPath}.${key}`;\n\n if (childValue === undefined) {\n if (childSchema.default !== undefined) {\n result[key] = childSchema.default;\n continue;\n }\n\n if (rawChildSchema.kind === \"optional\") {\n continue;\n }\n\n errors.push({\n path: childDisplayPath,\n message: `Missing required parameter \"${childDisplayPath}\".`\n });\n continue;\n }\n\n result[key] = finalizeDynamicValue(rawChildSchema, childValue, childDisplayPath, errors);\n }\n\n return result;\n }\n\n case \"record\": {\n if (!isPlainObject(value)) {\n errors.push({\n path: displayPath,\n message: `Invalid value for \"${displayPath}\". Expected an object, got ${describeReceived(value)}.`\n });\n return value;\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entryValue]) => [\n key,\n finalizeDynamicValue(\n unwrappedSchema.value,\n entryValue,\n displayPath.length === 0 ? key : `${displayPath}.${key}`,\n errors\n )\n ])\n );\n }\n\n default:\n errors.push({\n path: displayPath,\n message: formatUnsupportedDynamicSchemaMessage(\n formatCliSchemaKind(unwrappedSchema.kind),\n displayPath\n )\n });\n return value;\n }\n}\n\nfunction formatCliSchemaKind(kind: string): string {\n return kind === \"oneOf\" ? \"oneof\" : kind;\n}\n\nfunction formatUnsupportedDynamicSchemaMessage(kind: string, displayPath: string): string {\n return `Unsupported parameter type \"${kind}\" for \"${displayPath}\". Supported types: string, number, integer, boolean, array, object, enum, oneof.`;\n}\n\nfunction qualifyDisplayPath(prefix: string, displayPath: string): string {\n if (prefix.length === 0) {\n return displayPath;\n }\n\n if (displayPath.length === 0) {\n return prefix;\n }\n\n return `${prefix}.${displayPath}`;\n}\n\nfunction parseDynamicValues(\n dynamicFields: DynamicFieldDefinition[],\n rawArgv: string[],\n casing: Casing,\n errors: ValidationError[]\n): {\n providedFieldIds: Set<string>;\n values: Map<string, unknown>;\n} {\n const rawValues = new Map<string, Record<string, unknown>>();\n const providedFieldIds = new Set<string>();\n const sortedFields = [...dynamicFields].sort(\n (left, right) => right.optionPath.length - left.optionPath.length\n );\n\n for (let index = 0; index < rawArgv.length; index += 1) {\n const token = rawArgv[index] ?? \"\";\n if (!token.startsWith(\"--\")) {\n continue;\n }\n\n const negated = token.startsWith(\"--no-\");\n const normalized = negated ? `--${token.slice(\"--no-\".length)}` : token;\n const equalsIndex = normalized.indexOf(\"=\");\n const flagName = equalsIndex >= 0 ? normalized.slice(2, equalsIndex) : normalized.slice(2);\n const inlineValue = equalsIndex >= 0 ? normalized.slice(equalsIndex + 1) : undefined;\n const flagPath = flagName.split(\".\");\n const match = sortedFields.find((field) => {\n const optionPath = field.optionPath.map((segment) => formatSegment(segment, casing));\n return (\n flagPath.length > optionPath.length &&\n optionPath.every((segment, segmentIndex) => flagPath[segmentIndex] === segment)\n );\n });\n\n if (match === undefined) {\n throw new UserError(\n `Unknown parameter \"${flagName}\". ${formatAvailableList(\n dynamicFields.map((field) => field.optionPathDisplay)\n )}`\n );\n }\n\n const optionPath = match.optionPath.map((segment) => formatSegment(segment, casing));\n const remainder = flagPath.slice(optionPath.length);\n const leaf = resolveDynamicLeaf(match.schema, remainder, casing, [], [], match.displayPath);\n const rawStore = rawValues.get(match.id) ?? {};\n const label = `${match.displayPath}.${leaf.displayPath}`.replace(/^\\./u, \"\");\n const parsed =\n negated && leaf.schema.kind === \"boolean\"\n ? {\n nextIndex: index,\n value: false\n }\n : consumeFieldValue(rawArgv, index, leaf.schema, label, inlineValue);\n\n setNestedValue(rawStore, leaf.path, parsed.value);\n rawValues.set(match.id, rawStore);\n providedFieldIds.add(match.id);\n index = parsed.nextIndex;\n }\n\n return {\n providedFieldIds,\n values: new Map(\n dynamicFields\n .filter((field) => rawValues.has(field.id))\n .map((field) => [\n field.id,\n finalizeDynamicValue(\n field.schema.kind === \"record\" ? field.schema : field.schema,\n rawValues.get(field.id),\n field.displayPath,\n errors\n )\n ])\n )\n };\n}\n\nasync function enforceVariantConstraints(\n params: Record<string, unknown>,\n fields: FieldDefinition[],\n dynamicFields: DynamicFieldDefinition[],\n variants: VariantDefinition[],\n resolvedFieldValues: Map<string, unknown>,\n providedDynamicFieldIds: Set<string>,\n providedFieldIds: Set<string>,\n shouldPrompt: boolean,\n errors: ValidationError[]\n): Promise<void> {\n const fieldById = new Map(fields.map((field) => [field.id, field]));\n const dynamicFieldById = new Map(dynamicFields.map((field) => [field.id, field]));\n const getAvailableBranchParameters = (branch: VariantBranchDefinition): string[] => [\n ...branch.fieldIds\n .map((fieldId) => fieldById.get(fieldId))\n .filter((field): field is FieldDefinition => field !== undefined && field.synthetic !== true)\n .map((field) => field.displayPath),\n ...branch.dynamicFieldIds\n .map((fieldId) => dynamicFieldById.get(fieldId))\n .filter((field): field is DynamicFieldDefinition => field !== undefined)\n .map((field) => field.optionPathDisplay)\n ];\n\n for (const variant of variants) {\n let selectedBranchId = resolvedFieldValues.get(variant.controlFieldId);\n\n if (selectedBranchId === undefined && shouldPrompt) {\n const controlField = fieldById.get(variant.controlFieldId);\n if (controlField !== undefined) {\n selectedBranchId = await promptForField(controlField);\n resolvedFieldValues.set(controlField.id, selectedBranchId);\n if (!controlField.synthetic) {\n setNestedValue(params, controlField.path, selectedBranchId);\n }\n }\n }\n\n if (selectedBranchId === undefined) {\n if (variant.optional) {\n continue;\n }\n\n errors.push({\n path: variant.controlDisplayPath,\n message: `Missing required parameter \"${variant.controlDisplayPath}\".`\n });\n continue;\n }\n\n const selectedBranch = variant.branches.find((branch) => branch.branchId === selectedBranchId);\n if (selectedBranch === undefined) {\n errors.push({\n path: variant.controlDisplayPath,\n message: `Invalid value for \"${variant.controlDisplayPath}\". Expected one of: ${variant.branches.map((branch) => branch.branchId).join(\", \")}, got ${describeReceived(selectedBranchId)}.`\n });\n continue;\n }\n\n let hasInvalidBranchParameter = false;\n\n for (const branch of variant.branches) {\n if (branch.branchId === selectedBranch.branchId) {\n continue;\n }\n\n const invalidFieldId = branch.fieldIds.find((fieldId) => providedFieldIds.has(fieldId));\n if (invalidFieldId !== undefined) {\n const field = fieldById.get(invalidFieldId);\n if (field !== undefined) {\n errors.push({\n path: field.displayPath,\n message: `Unknown parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n hasInvalidBranchParameter = true;\n }\n }\n\n const invalidDynamicFieldId = branch.dynamicFieldIds.find((fieldId) =>\n providedDynamicFieldIds.has(fieldId)\n );\n if (invalidDynamicFieldId !== undefined) {\n const field = dynamicFieldById.get(invalidDynamicFieldId);\n if (field !== undefined) {\n errors.push({\n path: field.displayPath,\n message: `Unknown parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n hasInvalidBranchParameter = true;\n }\n }\n }\n\n if (hasInvalidBranchParameter) {\n continue;\n }\n\n for (const fieldId of selectedBranch.requiredFieldIds) {\n const field = fieldById.get(fieldId);\n if (field === undefined || field.synthetic) {\n continue;\n }\n\n if (getNestedValue(params, field.path) !== undefined) {\n continue;\n }\n\n if (shouldPrompt) {\n const promptedValue = await promptForField(field);\n resolvedFieldValues.set(field.id, promptedValue);\n setNestedValue(params, field.path, promptedValue);\n providedFieldIds.add(field.id);\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n }\n\n for (const fieldId of selectedBranch.requiredDynamicFieldIds) {\n const field = dynamicFieldById.get(fieldId);\n if (field === undefined) {\n continue;\n }\n\n if (getNestedValue(params, field.path) !== undefined) {\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n }\n }\n}\n\nasync function resolveParams(\n fields: FieldDefinition[],\n dynamicFields: DynamicFieldDefinition[],\n variants: VariantDefinition[],\n positionalValues: unknown[],\n optionValues: Record<string, unknown>,\n rawArgv: string[],\n casing: Casing,\n presetPath: string | undefined,\n shouldPrompt: boolean,\n missingParameterContext: CliMissingParameterContext | undefined,\n promptStreams: PromptStreams\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 const providedFieldIds = new Set<string>();\n const resolvedFieldValues = new Map<string, unknown>();\n const errors: ValidationError[] = [];\n\n for (const field of fields) {\n let value: unknown;\n let resolvedMissing = false;\n let source: \"default\" | \"option\" | \"positional\" | \"preset\" | \"prompt\" | undefined;\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 source = \"positional\";\n }\n } else if (typeof positionalValue === \"string\" && positionalValue.length > 0) {\n value = parseFieldInputValue(positionalValue, field.schema, field.displayPath);\n source = \"positional\";\n }\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(optionValues, field.commanderOptionAttribute) &&\n hasFieldValue(optionValues[field.commanderOptionAttribute])\n ) {\n value = normalizeCommanderOptionValue(optionValues[field.commanderOptionAttribute]);\n source = \"option\";\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 = normalizeCommanderOptionValue(optionValues[field.optionAttribute]);\n source = \"option\";\n }\n\n if (\n value === undefined &&\n field.optionFlag === \"--verbose\" &&\n Object.prototype.hasOwnProperty.call(optionValues, field.optionAttribute) &&\n hasFieldValue(optionValues[field.optionAttribute])\n ) {\n value = normalizeCommanderOptionValue(optionValues[field.optionAttribute]);\n source = \"option\";\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(presetValues, field.optionAttribute)\n ) {\n value = presetValues[field.optionAttribute];\n source = \"preset\";\n }\n\n if (source === \"option\") {\n const parsed = parseOptionFieldValue(field, value, errors);\n if (!parsed.ok) {\n continue;\n }\n\n value = parsed.value;\n }\n\n if (\n value === undefined &&\n field.optional &&\n missingParameterContext !== undefined &&\n field.schema.cli?.resolveMissing !== undefined\n ) {\n const resolution = await field.schema.cli.resolveMissing({\n ...missingParameterContext,\n params: { ...params }\n });\n const choices = resolution?.choices ?? [];\n\n if (choices.length === 1) {\n value = choices[0]?.value;\n resolvedMissing = true;\n source = \"prompt\";\n } else if (choices.length > 1) {\n const selected = await select<unknown>(\n withPromptStreams(\n {\n message: resolution?.message ?? field.description ?? fieldPromptLabel(field),\n options: choices.map((choice) => ({\n label: choice.label,\n value: choice.value as unknown\n }))\n },\n promptStreams\n )\n );\n\n if (isCancel(selected)) {\n throwPromptCancellation();\n }\n\n value = selected;\n resolvedMissing = true;\n source = \"prompt\";\n }\n }\n\n if (resolvedMissing) {\n const validation = validateSchema(field.schema, value);\n if (!validation.ok) {\n errors.push(\n ...validation.issues.map((issue) => ({\n path: field.displayPath,\n message: issue.message\n }))\n );\n continue;\n }\n value = validation.value;\n }\n\n if (value === undefined && shouldPrompt && !field.optional) {\n value = await promptForField(field, promptStreams);\n source = \"prompt\";\n }\n\n if (value === undefined && field.hasDefault) {\n value = field.defaultValue;\n source = \"default\";\n }\n\n if (value === undefined) {\n if (field.optional) {\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\".`\n });\n continue;\n }\n\n resolvedFieldValues.set(field.id, value);\n if (source !== undefined && source !== \"default\") {\n providedFieldIds.add(field.id);\n }\n\n if (!field.synthetic) {\n setNestedValue(params, field.path, value);\n }\n }\n\n const dynamicResults =\n dynamicFields.length > 0\n ? parseDynamicValues(dynamicFields, rawArgv, casing, errors)\n : {\n providedFieldIds: new Set<string>(),\n values: new Map<string, unknown>()\n };\n\n for (const field of dynamicFields) {\n let value = dynamicResults.values.get(field.id);\n\n if (value === undefined && field.hasDefault) {\n value = field.defaultValue;\n }\n\n if (value === undefined) {\n if (field.optional || field.variantId !== undefined) {\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\".`\n });\n continue;\n }\n\n setNestedValue(params, field.path, value);\n }\n\n await enforceVariantConstraints(\n params,\n fields,\n dynamicFields,\n variants,\n resolvedFieldValues,\n dynamicResults.providedFieldIds,\n providedFieldIds,\n shouldPrompt,\n errors\n );\n\n throwValidationErrors(errors);\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 runtimeFetch: typeof globalThis.fetch,\n runtimeOptions: HumanInLoopRuntimeOptions | undefined,\n runtimeEnv: Record<string, string> | undefined,\n runtimeFs: HandlerFs | undefined,\n outputEmitter: ((entry: string) => void) | undefined,\n promptStreams: PromptStreams,\n diagnosticsOptions: {\n logLevel?: LogLevel;\n logger?: RuntimeLoggerInput;\n verboseControlEnabled: boolean;\n },\n onErrorReportContext?: (context: {\n command: Command<TServices, any, any, any>;\n commandPath: string;\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n }) => void\n): Promise<void> {\n const logger = createLogger(outputEmitter);\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 diagnostics = createRuntimeLogger({\n level:\n resolvedFlags.logLevel ??\n (diagnosticsOptions.verboseControlEnabled && resolvedFlags.verbose\n ? \"trace\"\n : diagnosticsOptions.logLevel),\n logger: diagnosticsOptions.logger ?? writeCLIDiagnosticEvent\n });\n const promptInput = promptStreams.input ?? process.stdin;\n const promptOutput = promptStreams.output ?? process.stdout;\n const stdinTTY = Boolean((promptInput as NodeJS.ReadStream).isTTY);\n const stdoutTTY = Boolean((promptOutput as NodeJS.WriteStream).isTTY);\n const shouldPrompt = !resolvedFlags.yes && stdinTTY;\n const missingParameterContext: CliMissingParameterContext | undefined =\n !resolvedFlags.yes && output === \"rich\" && stdinTTY && stdoutTTY\n ? {\n commandPath: state.commandPath,\n params: {},\n output,\n stdinTTY,\n stdoutTTY\n }\n : undefined;\n const runtime = await resolveFixtureRuntime(\n state.command,\n services,\n requirementOptions,\n runtimeFetch,\n runtimeEnv,\n runtimeFs\n );\n const preflightContext = {\n ...runtime.services,\n secrets: runtime.secrets,\n fetch: runtime.fetch,\n fs: runtime.fs,\n env: runtime.env,\n diagnostics,\n progress(message: string): void {\n diagnostics.emit({ level: \"info\", message, category: \"progress\" });\n logger.info(message);\n }\n };\n\n let runtimeSecrets: Record<string, string | undefined> | undefined;\n let resolvedParams: unknown;\n\n try {\n await withOutputFormat(output, async () => {\n await assertCommandRequirements(state.command, preflightContext, runtime.requirementOptions);\n\n const params = await resolveParams(\n state.fields,\n state.dynamicFields,\n state.variants,\n state.positionalValues,\n optionValues,\n state.rawArgv,\n state.casing,\n state.presetsEnabled ? resolvedFlags.preset : undefined,\n shouldPrompt,\n missingParameterContext,\n promptStreams\n );\n resolvedParams = params;\n runtimeSecrets = runtime.secrets;\n\n const context = {\n ...preflightContext,\n params\n } as HandlerContext<any, any, TServices>;\n\n if (state.command.stream !== undefined) {\n const stream = createManagedStream({\n eventSchema: state.command.stream.event,\n onStatus(event) {\n diagnostics.emit({\n level: \"info\",\n message: event.message ?? event.type,\n category: \"runtime\"\n });\n if (output === \"rich\" && event.message !== undefined) {\n logger.info(event.message);\n }\n },\n async create(signal, status) {\n return await state.command.handler({\n ...context,\n signal,\n status,\n async refreshSecrets() {\n return resolveCommandSecrets(state.command, runtimeEnv);\n }\n } as never);\n }\n });\n const interrupt = (): void => {\n void stream.cancel(new UserError(\"Operation cancelled.\"));\n };\n process.once(\"SIGINT\", interrupt);\n try {\n for await (const event of stream) {\n if (output === \"json\") {\n const line = JSON.stringify(event);\n if (outputEmitter === undefined) {\n process.stdout.write(`${line}\\n`);\n } else {\n outputEmitter(line);\n }\n } else {\n renderResult(\n state.command,\n event,\n output,\n primitives,\n outputEmitter === undefined\n ? undefined\n : (chunk) => outputEmitter(chunk.endsWith(\"\\n\") ? chunk.slice(0, -1) : chunk)\n );\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", interrupt);\n await stream.cancel();\n }\n return;\n }\n\n if (\n state.command.confirm &&\n !state.command.humanInLoop &&\n !resolvedFlags.yes &&\n process.stdin.isTTY\n ) {\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 = state.command.humanInLoop\n ? await (\n await importOptionalModule<typeof import(\"./human-in-loop/gate.js\")>(\n optionalModulePaths.humanInLoop\n )\n ).invokeWithHumanInLoop(state.command, context, runtimeOptions, state.commandPath)\n : await state.command.handler(context);\n\n if (output === \"rich\" && runtime.isFixture) {\n writeRichHeader(`${state.command.name} (fixture)`);\n }\n\n if (isHumanInLoopPending(result)) {\n renderHumanInLoopPending(result);\n return;\n }\n\n const renderStatus = renderResult(\n state.command,\n result,\n output,\n primitives,\n outputEmitter === undefined\n ? undefined\n : (chunk) => outputEmitter(chunk.endsWith(\"\\n\") ? chunk.slice(0, -1) : chunk)\n );\n if (renderStatus.mcpError) {\n process.exitCode = 1;\n }\n });\n } catch (error) {\n onErrorReportContext?.({\n command: state.command,\n commandPath: state.commandPath,\n params: resolvedParams,\n secrets: runtimeSecrets ?? runtime.secrets\n });\n throw error;\n }\n}\n\ntype HttpErrorLike = {\n name: string;\n message: string;\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n };\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\n };\n};\n\ntype ProblemDetailsLike = {\n type?: string;\n title?: string;\n status?: number;\n detail?: string;\n instance?: string;\n};\n\ntype GraphQLErrorEnvelopeLike = {\n errors: Array<{\n message: string;\n path?: Array<string | number>;\n extensions?: {\n code?: string;\n };\n }>;\n};\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isPlainObject(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\nfunction isHttpErrorLike(error: unknown): error is HttpErrorLike {\n if (!isPlainObject(error)) {\n return false;\n }\n\n if (typeof error.name !== \"string\" || typeof error.message !== \"string\") {\n return false;\n }\n\n const request = error.request;\n const response = error.response;\n\n return (\n isPlainObject(request) &&\n typeof request.method === \"string\" &&\n typeof request.url === \"string\" &&\n isStringRecord(request.headers) &&\n isPlainObject(response) &&\n typeof response.status === \"number\" &&\n typeof response.statusText === \"string\" &&\n isStringRecord(response.headers) &&\n hasOwnProperty(response, \"body\")\n );\n}\n\nfunction hasTypedOptionalField(\n value: Record<string, unknown>,\n field: string,\n type: \"number\" | \"string\"\n): boolean {\n return !hasOwnProperty(value, field) || typeof value[field] === type;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction isProblemDetailsLike(body: unknown): body is ProblemDetailsLike {\n if (!isPlainObject(body)) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"type\", \"string\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"title\", \"string\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"status\", \"number\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"detail\", \"string\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"instance\", \"string\")) {\n return false;\n }\n\n return hasOwnNonEmptyString(body, \"title\") || hasOwnNonEmptyString(body, \"detail\");\n}\n\nfunction isGraphQLErrorEnvelopeLike(body: unknown): body is GraphQLErrorEnvelopeLike {\n if (!isPlainObject(body) || !Array.isArray(body.errors) || body.errors.length === 0) {\n return false;\n }\n\n return body.errors.every((error) => {\n if (!isPlainObject(error) || typeof error.message !== \"string\") {\n return false;\n }\n\n if (hasOwnProperty(error, \"path\")) {\n const pathValue = error.path;\n if (\n !Array.isArray(pathValue) ||\n !pathValue.every((entry) => typeof entry === \"string\" || typeof entry === \"number\")\n ) {\n return false;\n }\n }\n\n if (hasOwnProperty(error, \"extensions\")) {\n if (!isPlainObject(error.extensions)) {\n return false;\n }\n\n if (hasOwnProperty(error.extensions, \"code\") && typeof error.extensions.code !== \"string\") {\n return false;\n }\n }\n\n return true;\n });\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n\nfunction hasOwnNonEmptyString<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, string> {\n return hasOwnProperty(value, name) && isNonEmptyString(value[name]);\n}\n\nfunction styleHttpErrorLine(value: string, style: (line: string) => string): string {\n return process.stdout.isTTY !== true ? value : style(value);\n}\n\nfunction formatHttpErrorStatus(value: string): string {\n return styleHttpErrorLine(value, text.error);\n}\n\nfunction formatProblemDetailsBody(body: ProblemDetailsLike): string {\n const lines: string[] = [];\n\n if (hasOwnNonEmptyString(body, \"title\")) {\n lines.push(`Problem: ${body.title}`);\n }\n\n if (hasOwnNonEmptyString(body, \"detail\")) {\n lines.push(`Detail: ${body.detail}`);\n }\n\n if (hasOwnProperty(body, \"type\") && body.type !== undefined) {\n lines.push(`Type: ${body.type}`);\n }\n\n if (hasOwnProperty(body, \"instance\") && body.instance !== undefined) {\n lines.push(`Instance: ${body.instance}`);\n }\n\n if (hasOwnProperty(body, \"status\") && body.status !== undefined) {\n lines.push(`Status: ${body.status}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatGraphQLErrorEnvelopeBody(body: GraphQLErrorEnvelopeLike): string {\n return body.errors\n .map((error) => {\n const lines = [`GraphQL error: ${error.message}`];\n\n if (hasOwnProperty(error, \"path\") && error.path !== undefined) {\n lines.push(` at path: ${error.path.join(\".\")}`);\n }\n\n if (\n hasOwnProperty(error, \"extensions\") &&\n error.extensions !== undefined &&\n hasOwnProperty(error.extensions, \"code\") &&\n error.extensions.code !== undefined\n ) {\n lines.push(` code: ${error.extensions.code}`);\n }\n\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatHttpErrorBody(body: unknown): string {\n const redactedBody = redactHttpBody(body);\n\n if (typeof redactedBody === \"string\") {\n return redactedBody;\n }\n\n if (isProblemDetailsLike(redactedBody)) {\n return formatProblemDetailsBody(redactedBody);\n }\n\n if (isGraphQLErrorEnvelopeLike(redactedBody)) {\n return formatGraphQLErrorEnvelopeBody(redactedBody);\n }\n\n const serialized = JSON.stringify(redactedBody, null, 2);\n return serialized === undefined ? String(redactedBody) : serialized;\n}\n\nfunction indentHttpErrorBlock(value: string): string {\n return value\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n\nfunction formatHttpHeaderValue(name: string, value: string): string {\n return redactHttpHeaderValue(name, value);\n}\n\nfunction formatHttpErrorHeaders(headers: Record<string, string>): string[] {\n return Object.entries(headers).map(\n ([name, value]) => ` ${name}: ${formatHttpHeaderValue(name, value)}`\n );\n}\n\nfunction formatHttpErrorSnippet(body: unknown): string {\n return formatHttpErrorBody(body).replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nfunction renderHttpError(\n error: HttpErrorLike,\n options: { debugStackMode: DebugStackMode | undefined; verbose: boolean }\n): void {\n const detailed = options.verbose || options.debugStackMode !== undefined;\n const summary = summarizeHttpError(error);\n const lines: string[] = [\n styleHttpErrorLine(`Request: ${error.request.method} ${error.request.url}`, text.muted)\n ];\n\n if (detailed) {\n lines.push(\"\", \"Request headers:\", ...formatHttpErrorHeaders(error.request.headers), \"\");\n\n if (error.request.body !== undefined) {\n lines.push(\n \"Request body:\",\n indentHttpErrorBlock(formatHttpErrorBody(error.request.body)),\n \"\"\n );\n }\n }\n\n lines.push(\n formatHttpErrorStatus(`Status: ${error.response.status} ${error.response.statusText}`)\n );\n\n if (detailed) {\n lines.push(\n \"\",\n \"Response headers:\",\n ...formatHttpErrorHeaders(error.response.headers),\n \"\",\n \"Response body:\",\n indentHttpErrorBlock(formatHttpErrorBody(error.response.body))\n );\n } else {\n const summaryLines = [\n summary.code === undefined ? undefined : `Code: ${summary.code}`,\n summary.message === undefined ? undefined : `Message: ${summary.message}`,\n summary.requestId === undefined ? undefined : `Request id: ${summary.requestId}`,\n summary.retryAfter === undefined ? undefined : `Retry after: ${summary.retryAfter}`,\n summary.hint === undefined ? undefined : `Hint: ${summary.hint}`\n ].filter((line): line is string => line !== undefined);\n\n if (summary.fieldErrors !== undefined && summary.fieldErrors.length > 0) {\n summaryLines.push(\n \"\",\n \"Field errors:\",\n ...summary.fieldErrors.map((fieldError) => ` ${fieldError.path}: ${fieldError.message}`)\n );\n }\n\n lines.push(\"\");\n if (summaryLines.length > 0) {\n lines.push(...summaryLines);\n } else {\n lines.push(`Response body: ${formatHttpErrorSnippet(error.response.body)}`);\n }\n lines.push(\"Re-run with --verbose to see headers and full body.\");\n }\n\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n\n const stack = error instanceof Error ? (error as Error).stack : undefined;\n if (options.debugStackMode !== undefined && stack) {\n process.stderr.write(`${formatDebugStack(stack, options.debugStackMode)}\\n`);\n }\n}\n\nasync function handleRunError(\n error: unknown,\n options: {\n debugStackMode: DebugStackMode | undefined;\n output: OutputMode;\n verbose: boolean;\n program?: CommanderCommand;\n argv?: readonly string[];\n rootUsageName: string;\n commandPath: string;\n outputEmitter?: (entry: string) => void;\n userErrorPattern: \"definition\" | \"runtime-user\" | \"usage\";\n }\n): Promise<void> {\n const logger = createLogger(options.outputEmitter);\n\n await withOutputFormat(options.output, async () => {\n if (error instanceof UserError) {\n renderCliErrorPattern(\n options.userErrorPattern === \"definition\"\n ? {\n kind: \"definition\",\n error,\n debugStackMode: options.debugStackMode\n }\n : options.userErrorPattern === \"usage\"\n ? {\n kind: \"usage\",\n message: error.message,\n rootUsageName: options.rootUsageName,\n commandPath: options.commandPath\n }\n : {\n kind: \"runtime-user\",\n message: error.message\n },\n options.outputEmitter\n );\n return;\n }\n\n if (error instanceof Error && error.name === \"ToolcraftBugError\") {\n renderCliErrorPattern(\n {\n kind: \"toolcraft-bug\",\n error,\n debugStackMode: options.debugStackMode\n },\n options.outputEmitter\n );\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 if (error.code === \"commander.unknownCommand\") {\n logger.error(\n appendUsagePointer(\n formatUnknownCommandError(error, options.program, options.argv ?? process.argv),\n {\n rootUsageName: options.rootUsageName,\n commandPath: options.commandPath\n }\n )\n );\n return;\n }\n if (error.code === \"commander.unknownOption\") {\n const argv = options.argv ?? process.argv;\n logger.error(\n appendUsagePointer(formatUnknownOptionError(error, options.program, argv), {\n rootUsageName: options.rootUsageName,\n commandPath:\n options.commandPath.length > 0\n ? options.commandPath\n : findCurrentCommanderCommandPath(options.program, argv)\n })\n );\n return;\n }\n logger.error(\n appendUsagePointer(formatCommanderErrorMessage(error), {\n rootUsageName: options.rootUsageName,\n commandPath:\n options.commandPath.length > 0\n ? options.commandPath\n : findCurrentCommanderCommandPath(options.program, options.argv ?? process.argv)\n })\n );\n return;\n }\n\n if (isHttpErrorLike(error)) {\n renderHttpError(error, options);\n process.exitCode = 1;\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n renderCliErrorPattern(\n {\n kind: \"unexpected\",\n message,\n stack: error instanceof Error ? error.stack : undefined,\n debugStackMode: options.debugStackMode\n },\n options.outputEmitter\n );\n });\n}\n\nfunction formatCommanderErrorMessage(error: CommanderError): string {\n return error.message.startsWith(\"error:\") ? error.message : `error: ${error.message}`;\n}\n\nfunction formatInvalidEnumMessage(\n label: string,\n value: string,\n values: ReadonlyArray<string | number | boolean>,\n opts: { candidates?: readonly string[]; threshold?: number } = {}\n): string {\n const suggestions = suggest(\n value,\n opts.candidates ?? values.map((candidate) => String(candidate)),\n opts\n );\n const suggestionLine =\n suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}?\\n` : \" \";\n return `Invalid value for \"${label}\".${suggestionLine}Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}, got ${describeReceived(value)}.`;\n}\n\nfunction formatUnknownCommandError(\n error: CommanderError,\n program: CommanderCommand | undefined,\n argv: readonly string[]\n): string {\n const input = extractQuotedCommanderValue(error.message) ?? \"\";\n const currentCommand =\n program === undefined ? undefined : findCurrentCommanderCommand(program, argv);\n return formatUnknownCommandMessage(input, currentCommand);\n}\n\nfunction appendUsagePointer(\n message: string,\n options: {\n rootUsageName: string;\n commandPath: string;\n }\n): string {\n if (message.includes(\"--help\")) {\n return message;\n }\n\n const helpTarget =\n options.commandPath.length === 0\n ? options.rootUsageName\n : `${options.rootUsageName} ${options.commandPath}`;\n return `${message}\\nRun ${helpTarget} --help for usage.`;\n}\n\nfunction formatCliCommandPath(commandPath: string): string {\n return commandPath\n .split(\".\")\n .filter((segment) => segment.length > 0)\n .join(\" \");\n}\n\nfunction formatUnknownCommandMessage(\n input: string,\n currentCommand: CommanderCommand | undefined\n): string {\n const suggestions =\n currentCommand === undefined\n ? []\n : suggest(\n input,\n currentCommand.commands.map((command) => command.name())\n );\n return formatSuggestionMessage(`Unknown command \"${input}\".`, suggestions);\n}\n\nfunction formatUnknownOptionError(\n error: CommanderError,\n program: CommanderCommand | undefined,\n argv: readonly string[]\n): string {\n const input = extractQuotedCommanderValue(error.message) ?? \"\";\n const currentCommand =\n program === undefined ? undefined : findCurrentCommanderCommand(program, argv);\n const suggestions =\n currentCommand === undefined\n ? []\n : suggest(\n input,\n currentCommand.options\n .map((option) => option.long)\n .filter((flag): flag is string => flag !== undefined)\n );\n return formatSuggestionMessage(`Unknown option \"${input}\".`, suggestions);\n}\n\nfunction formatSuggestionMessage(message: string, suggestions: readonly string[]): string {\n if (suggestions.length === 0) {\n return message;\n }\n\n return `${message}\\nDid you mean: ${suggestions.join(\", \")}?`;\n}\n\nfunction extractQuotedCommanderValue(message: string): string | undefined {\n const singleQuoted = extractBetweenQuotes(message, \"'\");\n if (singleQuoted !== undefined) {\n return singleQuoted;\n }\n\n return extractBetweenQuotes(message, '\"');\n}\n\nfunction extractBetweenQuotes(message: string, quote: \"'\" | '\"'): string | undefined {\n const start = message.indexOf(quote);\n if (start === -1) {\n return undefined;\n }\n\n const end = message.indexOf(quote, start + 1);\n if (end === -1) {\n return undefined;\n }\n\n return message.slice(start + 1, end);\n}\n\nfunction resolveDebugStackMode(value: unknown): DebugStackMode | undefined {\n if (value === true || value === \"trim\") {\n return \"trim\";\n }\n\n if (value === \"raw\") {\n return \"raw\";\n }\n\n return undefined;\n}\n\nfunction getDebugStackModeFromArgv(argv: readonly string[]): DebugStackMode | undefined {\n for (let index = 2; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === undefined) {\n continue;\n }\n\n if (token === \"--debug\") {\n return \"trim\";\n }\n\n if (token === \"--debug=raw\") {\n return \"raw\";\n }\n }\n\n return undefined;\n}\n\nfunction findCurrentCommanderCommand(\n program: CommanderCommand,\n argv: readonly string[]\n): CommanderCommand {\n let current = program;\n const tokens = argv.slice(2);\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === undefined || token === \"--\") {\n break;\n }\n if (token.startsWith(\"-\")) {\n const option = current.options.find(\n (candidate) => candidate.long === token || candidate.short === token\n );\n if (option?.required === true && !token.includes(\"=\")) {\n index += 1;\n }\n continue;\n }\n\n const child = current.commands.find(\n (command) => command.name() === token || command.aliases().includes(token)\n );\n if (child === undefined) {\n break;\n }\n\n current = child;\n }\n\n return current;\n}\n\nfunction findCurrentCommanderCommandPath(\n program: CommanderCommand | undefined,\n argv: readonly string[]\n): string {\n if (program === undefined) {\n return \"\";\n }\n\n let current = program;\n const pathSegments: string[] = [];\n const tokens = argv.slice(2);\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === undefined || token === \"--\" || token.startsWith(\"-\")) {\n break;\n }\n\n const child = current.commands.find(\n (command) => command.name() === token || command.aliases().includes(token)\n );\n if (child === undefined) {\n break;\n }\n\n current = child;\n pathSegments.push(child.name());\n }\n\n return pathSegments.join(\" \");\n}\n\nfunction findUnknownCommanderCommand(\n program: CommanderCommand,\n argv: readonly string[]\n): { input: string; currentCommand: CommanderCommand; commandPath: string } | undefined {\n let current = program;\n const pathSegments: string[] = [];\n const tokens = argv.slice(2);\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === undefined || token === \"--\") {\n return undefined;\n }\n if (token.startsWith(\"-\")) {\n const option = current.options.find(\n (candidate) => candidate.long === token || candidate.short === token\n );\n if (option?.required === true && !token.includes(\"=\")) {\n index += 1;\n }\n continue;\n }\n\n if (\n getToolcraftHiddenDefaultNames(current).includes(token) ||\n getToolcraftReservedChildNames(current).includes(token)\n ) {\n return {\n input: token,\n currentCommand: current,\n commandPath: pathSegments.join(\" \")\n };\n }\n\n if (current.commands.length === 0) {\n return undefined;\n }\n\n const child = current.commands.find(\n (command) => command.name() === token || command.aliases().includes(token)\n );\n if (child === undefined) {\n if (getDefaultCommanderCommandName(current) !== undefined) {\n if (shouldRejectDefaultCommandToken(current, token, pathSegments)) {\n return {\n input: token,\n currentCommand: current,\n commandPath: pathSegments.join(\" \")\n };\n }\n\n return undefined;\n }\n\n return {\n input: token,\n currentCommand: current,\n commandPath: pathSegments.join(\" \")\n };\n }\n\n current = child;\n pathSegments.push(child.name());\n }\n\n return undefined;\n}\n\nfunction shouldRejectDefaultCommandToken(\n command: CommanderCommand,\n token: string,\n pathSegments: readonly string[]\n): boolean {\n return (\n pathSegments.length === 0 &&\n isBareCommandLikeToken(token) &&\n hasNonDefaultPublicChildCommand(command)\n );\n}\n\nfunction hasNonDefaultPublicChildCommand(command: CommanderCommand): boolean {\n const defaultName = getDefaultCommanderCommandName(command);\n return command.commands.some(\n (child) =>\n child.name() !== defaultName &&\n !isToolcraftHiddenCommander(child) &&\n !getToolcraftReservedChildNames(command).includes(child.name())\n );\n}\n\nfunction isBareCommandLikeToken(token: string): boolean {\n if (token.length === 0) {\n return false;\n }\n\n for (const character of token) {\n if (!isCommandNameCharacter(character)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isCommandNameCharacter(character: string): boolean {\n const code = character.codePointAt(0);\n if (code === undefined) {\n return false;\n }\n\n const isLowercaseLetter = code >= 97 && code <= 122;\n const isUppercaseLetter = code >= 65 && code <= 90;\n const isDigit = code >= 48 && code <= 57;\n return (\n isLowercaseLetter || isUppercaseLetter || isDigit || character === \"-\" || character === \"_\"\n );\n}\n\nfunction getDefaultCommanderCommandName(command: CommanderCommand): string | undefined {\n const candidate = command as CommanderCommand & { _defaultCommandName?: unknown };\n return typeof candidate._defaultCommandName === \"string\"\n ? candidate._defaultCommandName\n : undefined;\n}\n\nfunction configureCommanderSuggestionOutput(command: CommanderCommand): void {\n command.exitOverride();\n command.configureOutput({\n outputError: (message, write) => {\n if (message.includes(\"unknown command\") || message.includes(\"unknown option\")) {\n return;\n }\n\n write(message);\n }\n });\n\n command.commands.forEach((child) => configureCommanderSuggestionOutput(child));\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 enableSourceMaps();\n const controls = resolveCLIControls(options.controls);\n const argv = controls.verbose\n ? normalizeVerboseAlias([...(options.argv ?? process.argv)])\n : [...(options.argv ?? process.argv)];\n const rootUsageName = options.rootUsageName ?? inferProgramName(argv);\n let lastActionCommand: CommanderCommand | undefined;\n let resolvedCommandPath = \"\";\n let program: CommanderCommand | undefined;\n let version: string | undefined;\n let userErrorPattern: \"definition\" | \"runtime-user\" | \"usage\" = \"definition\";\n let errorReportContext:\n | {\n command: Command<TServices, any, any, any>;\n commandPath: string;\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n }\n | undefined;\n\n try {\n const normalizedRoot = normalizeRoots(roots, argv);\n const root =\n options.approvals === true\n ? (\n await importOptionalModule<typeof import(\"./human-in-loop/approvals-commands.js\")>(\n optionalModulePaths.approvals\n )\n ).mergeApprovalsGroup(normalizedRoot)\n : normalizedRoot;\n if (hasMcpProxyConfig(root)) {\n await (\n await importOptionalModule<typeof import(\"./mcp-proxy.js\")>(optionalModulePaths.mcpProxy)\n ).resolveMcpProxies(root, { projectRoot: options.projectRoot });\n }\n const casing = options.casing ?? \"kebab\";\n const services = (options.services ?? {}) as TServices;\n const runtimeOptions = options.humanInLoop ?? {};\n const runtimeFetch = options.fetch ?? globalThis.fetch;\n version = options.version ?? findEntrypointPackageMetadata(argv[1])?.version;\n const servicesWithBuiltIns = {\n ...services,\n runtimeOptions,\n root\n } as TServices;\n const requirementOptions = {\n apiVersion: options.apiVersion,\n env: options.env\n } satisfies CommandRequirementOptions;\n\n validateServices(services as Record<string, unknown>);\n\n if (hasHelpFlag(argv)) {\n userErrorPattern = \"usage\";\n await renderGeneratedHelp(root, argv, { ...options, version });\n return;\n }\n\n if (argv.length <= 2 && root.default?.scope.includes(\"cli\") !== true) {\n userErrorPattern = \"usage\";\n await renderGeneratedHelp(root, argv, { ...options, version });\n return;\n }\n\n program = new CommanderCommand();\n program.name(root.name);\n program.exitOverride();\n program.showHelpAfterError();\n program.addHelpCommand(false);\n const presetsEnabled = options.presets === true;\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n presetsEnabled,\n version !== undefined,\n controls\n );\n addGlobalOptions(program, presetsEnabled, controls);\n\n if (version !== undefined) {\n program.version(version, \"--version\");\n }\n Reflect.set(\n program,\n \"_toolcraftReservedChildNames\",\n root.children\n .filter((child) => !isNodeVisibleInScope(child, \"cli\"))\n .flatMap((child) => getNodeCommandNames(child))\n );\n\n const execute = async (state: ExecutionState<TServices>) => {\n lastActionCommand = state.actionCommand;\n resolvedCommandPath = formatCliCommandPath(state.commandPath);\n await executeCommand(\n state,\n servicesWithBuiltIns,\n requirementOptions,\n runtimeFetch,\n runtimeOptions,\n options.env,\n options.fs,\n options.outputEmitter,\n {\n input: options.promptInput,\n output: options.promptOutput\n },\n {\n logLevel: options.logLevel,\n logger: options.logger,\n verboseControlEnabled: controls.verbose\n },\n (context) => {\n errorReportContext = context;\n }\n );\n };\n\n const rootChildNames = new Set(\n root.children\n .filter((candidate) => isNodeVisibleInScope(candidate, \"cli\"))\n .map((candidate) => candidate.name)\n );\n for (const child of root.children) {\n const command = createNodeCommand(\n child,\n casing,\n globalLongOptionFlags,\n execute,\n presetsEnabled,\n controls\n );\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 addCommanderChild(program, command, isDefaultChild, rootChildNames);\n }\n configureCommanderSuggestionOutput(program);\n\n const unknownCommand = findUnknownCommanderCommand(program, argv);\n if (unknownCommand !== undefined) {\n createLogger().error(\n appendUsagePointer(\n formatUnknownCommandMessage(unknownCommand.input, unknownCommand.currentCommand),\n {\n rootUsageName,\n commandPath: unknownCommand.commandPath\n }\n )\n );\n process.exitCode = 1;\n return;\n }\n\n userErrorPattern = \"usage\";\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof ApprovalDeclinedError) {\n renderApprovalDeclined(error);\n return;\n }\n\n const resolvedFlags = lastActionCommand ? getResolvedFlags(lastActionCommand) : undefined;\n const report = await writeErrorReport({\n argv,\n command: errorReportContext?.command,\n commandPath: errorReportContext?.commandPath ?? resolvedCommandPath,\n env: process.env,\n error,\n errorReports: options.errorReports,\n params: errorReportContext?.params,\n projectRoot: options.projectRoot,\n secrets: errorReportContext?.secrets,\n version\n });\n\n if (report !== undefined) {\n process.stderr.write(`Saved error report to ${report.displayPath}\\n`);\n }\n\n await handleRunError(error, {\n debugStackMode:\n resolvedFlags !== undefined\n ? resolveDebugStackMode(resolvedFlags.debug)\n : getDebugStackModeFromArgv(argv),\n output:\n resolvedFlags !== undefined ? resolveOutput(resolvedFlags) : resolveOutputFromArgv(argv),\n verbose: resolvedFlags ? Boolean(resolvedFlags.verbose) : argv.includes(\"--verbose\"),\n program,\n argv,\n rootUsageName,\n commandPath: resolvedCommandPath,\n outputEmitter: options.outputEmitter,\n userErrorPattern: errorReportContext?.params === undefined ? userErrorPattern : \"runtime-user\"\n });\n }\n}\n", "import type { SchemaBase } from \"./index.js\";\n\ntype JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue = JsonPrimitive | { [key: string]: JsonValue } | JsonValue[];\n\nexport interface JsonValueSchema extends SchemaBase<\"json\", JsonValue> {\n readonly kind: \"json\";\n}\n\nexport function Json(): JsonValueSchema {\n return {\n kind: \"json\",\n };\n}\n", "import type { ObjectSchema, SchemaBase, Static } from \"./index.js\";\n\ntype OneOfStatic<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string,\n> = {\n [TBranchName in keyof TBranches & string]: Omit<Static<TBranches[TBranchName]>, TDiscriminator> & {\n [TFieldName in TDiscriminator]: TBranchName;\n };\n}[keyof TBranches & string];\n\nexport interface OneOfSchema<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string = string,\n> extends SchemaBase<\"oneOf\", OneOfStatic<TBranches, TDiscriminator>> {\n readonly discriminator: TDiscriminator;\n readonly branches: TBranches;\n}\n\nfunction assertValidBranches(\n branches: Record<string, ObjectSchema<any>>,\n discriminator: string\n): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\n }\n\n for (const [branchName, branch] of Object.entries(branches)) {\n if (Object.prototype.hasOwnProperty.call(branch.shape, discriminator)) {\n throw new Error(\n `OneOf branch \"${branchName}\" must not declare discriminator field \"${discriminator}\".`\n );\n }\n }\n}\n\nexport function OneOf<\n TDiscriminator extends string,\n TBranches extends Record<string, ObjectSchema<any>>,\n>(config: {\n discriminator: TDiscriminator;\n branches: TBranches;\n}): OneOfSchema<TBranches, TDiscriminator> {\n assertValidBranches(config.branches, config.discriminator);\n\n return {\n kind: \"oneOf\",\n discriminator: config.discriminator,\n branches: config.branches,\n };\n}\n", "import type { AnySchema, SchemaBase, Static } from \"./index.js\";\n\nexport interface RecordSchema<TValue extends AnySchema>\n extends SchemaBase<\"record\", Record<string, Static<TValue>>> {\n readonly value: TValue;\n}\n\nexport function Record<TValue extends AnySchema>(value: TValue): RecordSchema<TValue> {\n return {\n kind: \"record\",\n value,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, SchemaBase, Static } from \"./index.js\";\n\ntype UnionStatic<TBranches extends readonly ObjectSchema<any>[]> = Static<TBranches[number]>;\n\nexport interface UnionSchema<TBranches extends readonly ObjectSchema<any>[]>\n extends SchemaBase<\"union\", UnionStatic<TBranches>> {\n readonly branches: TBranches;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction getRequiredKeys(schema: ObjectSchema<any>): string[] {\n return Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n}\n\nexport function getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n return getRequiredKeys(schema).join(\"+\");\n}\n\nfunction assertUniqueRequiredKeyFingerprints(branches: readonly ObjectSchema<any>[]): void {\n const fingerprints = new Map<string, { display: string; indices: number[] }>();\n\n branches.forEach((branch, index) => {\n const requiredKeys = getRequiredKeys(branch);\n const fingerprint = JSON.stringify(requiredKeys);\n const existing = fingerprints.get(fingerprint);\n\n if (existing === undefined) {\n fingerprints.set(fingerprint, {\n display: requiredKeys.join(\"+\"),\n indices: [index],\n });\n return;\n }\n\n existing.indices.push(index);\n });\n\n for (const { display, indices } of fingerprints.values()) {\n if (indices.length > 1) {\n throw new Error(\n `Union branches [${indices.join(\", \")}] share required-key fingerprint \"${display}\". Each branch must require a distinct set of keys.`\n );\n }\n }\n}\n\nfunction assertValidBranches(branches: readonly ObjectSchema<any>[]): void {\n if (branches.length === 0) {\n throw new Error(\"Union schema requires at least one branch\");\n }\n\n assertUniqueRequiredKeyFingerprints(branches);\n}\n\nexport function Union<const TBranches extends readonly ObjectSchema<any>[]>(\n branches: TBranches\n): UnionSchema<TBranches> {\n assertValidBranches(branches);\n\n return {\n kind: \"union\",\n branches,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, Static } from \"./index.js\";\nimport { getRequiredKeyFingerprint } from \"./union.js\";\n\nexport type SchemaDescriptor = AnySchema;\n\nexport type ValidationIssue = {\n path: readonly string[];\n expected: string;\n received: string;\n message: string;\n};\n\nexport type ValidationResult<T> =\n | { ok: true; value: T }\n | { ok: false; issues: readonly ValidationIssue[] };\n\ntype ValidationState = {\n issues: ValidationIssue[];\n};\n\ntype WalkResult = { present: true; value: unknown } | { present: false };\n\nconst missingValue = Symbol(\"missingValue\");\n\nexport function validate<S extends SchemaDescriptor>(\n schema: S,\n value: unknown\n): ValidationResult<Static<S>> {\n const state: ValidationState = { issues: [] };\n const result = walkSchema(schema, value, [], state);\n\n if (state.issues.length > 0) {\n return { ok: false, issues: state.issues };\n }\n\n return { ok: true, value: (result.present ? result.value : undefined) as Static<S> };\n}\n\nfunction walkSchema(\n schema: AnySchema,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (schema.kind === \"optional\") {\n return walkOptional(schema, value, path, state);\n }\n\n if (value === missingValue) {\n addIssue(\n state,\n path,\n expectedFor(schema),\n \"missing\",\n `Expected ${expectedFor(schema)} at ${formatPath(path)}`\n );\n return { present: false };\n }\n\n if (value === null && schema.nullable === true) {\n return { present: true, value };\n }\n\n switch (schema.kind) {\n case \"string\":\n return walkString(schema, value, path, state);\n\n case \"number\":\n return walkNumber(schema, value, path, state);\n\n case \"boolean\":\n return walkBoolean(value, path, state);\n\n case \"enum\":\n return walkEnum(schema, value, path, state);\n\n case \"array\":\n return walkArray(schema, value, path, state);\n\n case \"object\":\n return walkObject(schema, value, path, state);\n\n case \"oneOf\":\n return walkOneOf(schema, value, path, state);\n\n case \"union\":\n return walkUnion(schema, value, path, state);\n\n case \"record\":\n return walkRecord(schema, value, path, state);\n\n case \"json\":\n return walkJson(value, path, state);\n }\n}\n\nfunction walkOptional(\n schema: OptionalSchema<AnySchema>,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (value === missingValue || value === undefined) {\n const defaultValue = getDefault(schema.inner);\n\n if (defaultValue.present) {\n return walkSchema(schema.inner, cloneDefault(defaultValue.value), path, state);\n }\n\n return { present: false };\n }\n\n return walkSchema(schema.inner, value, path, state);\n}\n\nfunction walkString(\n schema: Extract<AnySchema, { kind: \"string\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"string\") {\n addExpectedIssue(state, path, \"string\", value);\n return { present: true, value };\n }\n\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n const expected = `string with length at least ${schema.minLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n const expected = `string with length at most ${schema.maxLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.pattern !== undefined) {\n const pattern = compilePattern(schema.pattern);\n\n if (pattern === undefined || !pattern.test(value)) {\n const expected = `string matching pattern ${schema.pattern}`;\n addIssue(state, path, expected, value, `Expected ${expected} at ${formatPath(path)}`);\n }\n }\n\n return { present: true, value };\n}\n\nfunction walkNumber(\n schema: Extract<AnySchema, { kind: \"number\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n addExpectedIssue(state, path, schema.jsonType === \"integer\" ? \"integer\" : \"number\", value);\n return { present: true, value };\n }\n\n if (schema.jsonType === \"integer\" && !Number.isInteger(value)) {\n addExpectedIssue(state, path, \"integer\", value);\n }\n\n if (schema.minimum !== undefined && value < schema.minimum) {\n const expected = `number greater than or equal to ${schema.minimum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n const expected = `number less than or equal to ${schema.maximum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n return { present: true, value };\n}\n\nfunction walkBoolean(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (typeof value !== \"boolean\") {\n addExpectedIssue(state, path, \"boolean\", value);\n }\n\n return { present: true, value };\n}\n\nfunction walkEnum(\n schema: Extract<AnySchema, { kind: \"enum\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!schema.values.includes(value as never)) {\n const expected = `one of ${schema.values.join(\", \")}`;\n addIssue(\n state,\n path,\n expected,\n receivedValue(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n return { present: true, value };\n}\n\nfunction walkArray(\n schema: Extract<AnySchema, { kind: \"array\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!Array.isArray(value)) {\n addExpectedIssue(state, path, \"array\", value);\n return { present: true, value };\n }\n\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n const expected = `array with at least ${schema.minItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n const expected = `array with at most ${schema.maxItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n const nextValue = value.map((item, index) => {\n const result = walkSchema(schema.item, item, [...path, String(index)], state);\n\n return result.present ? result.value : item;\n });\n\n return { present: true, value: nextValue };\n}\n\nfunction walkObject(\n schema: ObjectSchema<any>,\n value: unknown,\n path: readonly string[],\n state: ValidationState,\n injectedProperties: Record<string, unknown> = {}\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n const allowedKeys = new Set([...Object.keys(schema.shape), ...Object.keys(injectedProperties)]);\n\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const propertyValue = Object.hasOwn(value, key) ? value[key] : missingValue;\n const result = walkSchema(propertySchema, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n for (const [key, injectedValue] of Object.entries(injectedProperties)) {\n if (Object.hasOwn(value, key)) {\n setOwnValue(nextValue, key, value[key]);\n } else {\n setOwnValue(nextValue, key, injectedValue);\n }\n }\n\n for (const [key, propertyValue] of Object.entries(value)) {\n if (allowedKeys.has(key)) {\n continue;\n }\n\n if (schema.additionalProperties === true) {\n setOwnValue(nextValue, key, propertyValue);\n } else {\n addUnexpectedPropertyIssue(state, [...path, key]);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkOneOf(\n schema: Extract<AnySchema, { kind: \"oneOf\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const discriminatorValue = value[schema.discriminator];\n const discriminatorPath = [...path, schema.discriminator];\n const branchValues = Object.keys(schema.branches);\n const expected = `one of ${branchValues.join(\", \")}`;\n\n if (!Object.hasOwn(value, schema.discriminator)) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n \"missing\",\n `Missing discriminator \"${schema.discriminator}\" at ${formatPath(path)}. Expected one of: ${branchValues.join(\", \")}.`\n );\n return { present: true, value };\n }\n\n if (\n typeof discriminatorValue !== \"string\" ||\n !Object.hasOwn(schema.branches, discriminatorValue)\n ) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n receivedValue(discriminatorValue),\n `Expected ${expected} at ${formatPath(discriminatorPath)}, got ${formatReceivedDiscriminator(discriminatorValue)}`\n );\n return { present: true, value };\n }\n\n return walkObject(schema.branches[discriminatorValue], value, path, state, {\n [schema.discriminator]: discriminatorValue\n });\n}\n\nfunction walkUnion(\n schema: Extract<AnySchema, { kind: \"union\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (isPlainRecord(value)) {\n const candidateBranches = schema.branches.filter((branch) => hasRequiredKeys(branch, value));\n\n if (candidateBranches.length === 1) {\n return walkObject(candidateBranches[0], value, path, state);\n }\n }\n\n const matches: Array<{ fingerprint: string; value: unknown }> = [];\n\n for (const branch of schema.branches) {\n const branchState: ValidationState = { issues: [] };\n const result = walkObject(branch, value, path, branchState);\n\n if (branchState.issues.length === 0 && result.present) {\n matches.push({ fingerprint: getRequiredKeyFingerprint(branch), value: result.value });\n }\n }\n\n if (matches.length === 1) {\n return { present: true, value: matches[0].value };\n }\n\n if (matches.length === 0) {\n const branchDescriptions = schema.branches.map((branch) => getRequiredKeyFingerprint(branch));\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n \"0 matching branches\",\n `No union branch matched at ${formatPath(path)}. Tried ${schema.branches.length} branches. Expected one of: ${branchDescriptions.join(\" | \")}.`\n );\n return { present: true, value };\n }\n\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n `${matches.length} matching branches`,\n `Expected exactly one union branch at ${formatPath(path)}, but matched more than one branch: ${matches.map((match) => match.fingerprint).join(\" | \")}`\n );\n return { present: true, value };\n}\n\nfunction hasRequiredKeys(schema: ObjectSchema<any>, value: Record<string, unknown>): boolean {\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n if (propertySchema.kind !== \"optional\" && !Object.hasOwn(value, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction walkRecord(\n schema: Extract<AnySchema, { kind: \"record\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n\n for (const [key, propertyValue] of Object.entries(value)) {\n const result = walkSchema(schema.value, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkJson(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (isJsonValue(value)) {\n return { present: true, value };\n }\n\n addExpectedIssue(state, path, \"JSON value\", value);\n return { present: true, value };\n}\n\nfunction getDefault(schema: AnySchema): WalkResult {\n if (schema.default !== undefined) {\n return { present: true, value: schema.default };\n }\n\n if (schema.kind === \"optional\") {\n return getDefault(schema.inner);\n }\n\n return { present: false };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, ancestors: Set<object> = new Set()): boolean {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return typeof value !== \"number\" || Number.isFinite(value);\n }\n\n if (Array.isArray(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = value.every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n if (isPlainRecord(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n return false;\n}\n\nfunction cloneDefault(value: unknown): unknown {\n return structuredClone(value);\n}\n\nfunction setOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nfunction expectedFor(schema: AnySchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n case \"number\":\n return schema.jsonType === \"integer\" ? \"integer\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"enum\":\n return `one of ${schema.values.join(\", \")}`;\n case \"array\":\n return \"array\";\n case \"object\":\n case \"oneOf\":\n case \"record\":\n return \"object\";\n case \"union\":\n return \"exactly one union branch\";\n case \"json\":\n return \"JSON value\";\n case \"optional\":\n return expectedFor(schema.inner);\n }\n}\n\nfunction addExpectedIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n value: unknown\n): void {\n addIssue(\n state,\n path,\n expected,\n receivedType(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n}\n\nfunction addUnexpectedPropertyIssue(state: ValidationState, path: readonly string[]): void {\n addIssue(\n state,\n path,\n \"no additional properties\",\n \"unknown property\",\n `Unexpected property ${formatPath(path)}`\n );\n}\n\nfunction addIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n _message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message: formatIssueMessage(expected, path, received)\n });\n}\n\nfunction addIssueWithMessage(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message\n });\n}\n\nfunction formatIssueMessage(expected: string, path: readonly string[], received: string): string {\n return `Expected ${expected} at ${formatPath(path)}, got ${received}`;\n}\n\nfunction formatPath(path: readonly string[]): string {\n return path.length === 0 ? \"value\" : path.join(\".\");\n}\n\nfunction compilePattern(pattern: string): RegExp | undefined {\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction receivedType(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return \"integer\";\n }\n\n return typeof value;\n}\n\nfunction receivedValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return String(value);\n}\n\nfunction formatReceivedDiscriminator(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n return receivedValue(value);\n}\n", "import { Json } from \"./json.js\";\nimport { createJsonSchemaDocument } from \"./json-schema-document.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport { validate } from \"./validate.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.js\";\nimport type { ValidationIssue, ValidationResult } from \"./validate.js\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\"\n | \"oneOf\"\n | \"union\"\n | \"record\"\n | \"json\";\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 EmptyOptions = Record<never, never>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\nexport type CliOutputMode = \"rich\" | \"md\" | \"json\";\nexport interface CliMissingParameterChoice<TValue> {\n label: string;\n value: TValue;\n}\nexport interface CliMissingParameterContext {\n commandPath: string;\n params: Readonly<Record<string, unknown>>;\n output: CliOutputMode;\n stdinTTY: boolean;\n stdoutTTY: boolean;\n}\nexport interface CliMissingParameterResolution<TValue> {\n choices: readonly CliMissingParameterChoice<TValue>[];\n message?: string;\n}\nexport interface CliSchemaOptions<TValue> {\n resolveMissing?: (\n context: CliMissingParameterContext\n ) =>\n | CliMissingParameterResolution<TValue>\n | undefined\n | Promise<CliMissingParameterResolution<TValue> | undefined>;\n}\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n secret?: boolean;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n secret?: boolean;\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> =\n TSchema extends OptionalSchema<infer TInner> ? Static<TInner> : 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 cli?: CliSchemaOptions<TDefault>;\n description?: string;\n cliDescription?: string;\n cliAliases?: readonly string[];\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n global?: boolean;\n};\n\ntype WithNullable<\n TSchema extends AnySchema,\n TOptions extends { nullable?: boolean }\n> = TOptions extends { readonly nullable: true } ? TSchema & { readonly nullable: true } : TSchema;\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly cli?: CliSchemaOptions<TStatic>;\n readonly description?: string;\n readonly cliDescription?: string;\n readonly cliAliases?: readonly 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 global?: boolean;\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | JsonSchema;\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 oneOf?: JsonSchema[];\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>> extends SchemaBase<\n \"enum\",\n TValues[number]\n> {\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> extends SchemaBase<\n \"optional\",\n Static<TInner> | undefined\n> {\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 | OneOfSchema<Record<string, ObjectSchema<any>>, string>\n | UnionSchema<readonly ObjectSchema<any>[]>\n | RecordSchema<AnySchema>\n | JsonValueSchema;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends { readonly nullable: true }\n ? TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic | null\n : never\n : 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 jsonSchema.additionalProperties = schema.additionalProperties ?? false;\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 if (values.some((value) => typeof value === \"number\" && !Number.isFinite(value))) {\n throw new Error(\"Enum schema numeric values must be finite\");\n }\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n}\n\nfunction assertFiniteNumber(value: number | undefined, name: string): void {\n if (value !== undefined && !Number.isFinite(value)) {\n throw new Error(`${name} must be finite`);\n }\n}\n\nfunction assertMinMaxOrder(\n minimum: number | undefined,\n maximum: number | undefined,\n minimumName: string,\n maximumName: string\n): void {\n if (minimum !== undefined && maximum !== undefined && minimum > maximum) {\n throw new Error(`${minimumName} must be less than or equal to ${maximumName}`);\n }\n}\n\nfunction assertValidDefault(schema: AnySchema): void {\n if (schema.default === undefined) {\n return;\n }\n\n const result = validate(schema, schema.default);\n if (!result.ok) {\n throw new Error(\n `default must satisfy schema: ${result.issues[0]?.message ?? \"invalid default\"}`\n );\n }\n}\n\nfunction assertPattern(pattern: string | undefined): void {\n if (pattern === undefined) {\n return;\n }\n try {\n new RegExp(pattern);\n } catch {\n throw new Error(\"pattern must be a valid regular expression\");\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\nfunction withInjectedDiscriminator(\n schema: ObjectSchema<any>,\n discriminator: string,\n branchName: string\n): JsonSchema {\n const branchJsonSchema = toJsonSchema(schema);\n const properties = {\n ...(branchJsonSchema.properties ?? {}),\n [discriminator]: {\n type: \"string\",\n enum: [branchName]\n } satisfies JsonSchema\n };\n const required = [...new Set([...(branchJsonSchema.required ?? []), discriminator])];\n\n return {\n ...branchJsonSchema,\n type: \"object\",\n properties,\n required\n };\n}\n\nexport const S = {\n String<const TOptions extends SchemaOptions<string> & StringMetadata = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<StringSchema, TOptions> {\n assertNonNegativeInteger(options.minLength, \"minLength\");\n assertNonNegativeInteger(options.maxLength, \"maxLength\");\n assertMinMaxOrder(options.minLength, options.maxLength, \"minLength\", \"maxLength\");\n assertPattern(options.pattern);\n const schema: StringSchema = {\n kind: \"string\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<StringSchema, TOptions>;\n },\n\n Number<\n const TOptions extends SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } =\n EmptyOptions\n >(options: TOptions = {} as TOptions): WithNullable<NumberSchema, TOptions> {\n assertFiniteNumber(options.minimum, \"minimum\");\n assertFiniteNumber(options.maximum, \"maximum\");\n assertMinMaxOrder(options.minimum, options.maximum, \"minimum\", \"maximum\");\n assertFiniteNumber(options.default, \"default\");\n if (\n options.jsonType === \"integer\" &&\n options.default !== undefined &&\n !Number.isInteger(options.default)\n ) {\n throw new Error(\"default must be an integer\");\n }\n const schema: NumberSchema = {\n kind: \"number\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<NumberSchema, TOptions>;\n },\n\n Boolean<const TOptions extends SchemaOptions<boolean> = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<BooleanSchema, TOptions> {\n const schema: BooleanSchema = {\n kind: \"boolean\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<BooleanSchema, TOptions>;\n },\n\n Enum<\n const TValues extends NonEmptyReadonlyArray<EnumValue>,\n const TOptions extends 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 } = EmptyOptions\n >(\n values: TValues,\n options: TOptions = {} as TOptions\n ): WithNullable<EnumSchema<TValues>, TOptions> {\n assertValidEnumValues(values);\n if (\n options.jsonType === \"integer\" &&\n values.some((value) => typeof value !== \"number\" || !Number.isInteger(value))\n ) {\n throw new Error(\"Integer enum values must be integers\");\n }\n\n const schema: EnumSchema<TValues> = {\n kind: \"enum\",\n values,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<EnumSchema<TValues>, TOptions>;\n },\n\n Array<\n TItem extends AnySchema,\n const TOptions extends SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = EmptyOptions\n >(item: TItem, options: TOptions = {} as TOptions): WithNullable<ArraySchema<TItem>, TOptions> {\n assertNonNegativeInteger(options.minItems, \"minItems\");\n assertNonNegativeInteger(options.maxItems, \"maxItems\");\n assertMinMaxOrder(options.minItems, options.maxItems, \"minItems\", \"maxItems\");\n const schema: ArraySchema<TItem> = {\n kind: \"array\",\n item,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ArraySchema<TItem>, TOptions>;\n },\n\n Object<\n const TShape extends ObjectShape,\n const TOptions extends SchemaOptions<InferObject<TShape>> & ObjectMetadata = EmptyOptions\n >(\n shape: TShape,\n options: TOptions = {} as TOptions\n ): WithNullable<ObjectSchema<TShape>, TOptions> {\n const schema: ObjectSchema<TShape> = {\n kind: \"object\",\n shape,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ObjectSchema<TShape>, TOptions>;\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner\n };\n },\n\n OneOf,\n\n Union,\n\n Record: RecordBuilder,\n\n Json\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 Object.defineProperty(properties, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: toJsonSchema(propertySchema)\n });\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 case \"oneOf\":\n return withMetadata(unwrappedSchema, {\n oneOf: Object.entries(unwrappedSchema.branches).map(([branchName, branchSchema]) =>\n withInjectedDiscriminator(branchSchema, unwrappedSchema.discriminator, branchName)\n )\n });\n\n case \"union\":\n return withMetadata(unwrappedSchema, {\n oneOf: unwrappedSchema.branches.map((branchSchema) => toJsonSchema(branchSchema))\n });\n\n case \"record\":\n return withMetadata(unwrappedSchema, {\n type: \"object\",\n additionalProperties: toJsonSchema(unwrappedSchema.value)\n });\n\n case \"json\":\n return withMetadata(unwrappedSchema, {});\n }\n}\n\nexport function toJsonSchemaDocument(\n schema: AnySchema,\n options: JsonSchemaDocumentOptions = {}\n): JsonSchemaDocument {\n return createJsonSchemaDocument(toJsonSchema(schema), options);\n}\n\nexport { Json, OneOf, RecordBuilder as Record, Union, validate };\nexport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nexport type {\n JsonValue,\n JsonValueSchema,\n OneOfSchema,\n RecordSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n};\n", "export interface ColorSupportEnv {\n NO_COLOR?: string;\n FORCE_COLOR?: string;\n TERM?: string;\n}\n\nexport interface ColorSupportStream {\n isTTY?: boolean;\n}\n\nexport function supportsColor(\n env: ColorSupportEnv = process.env as ColorSupportEnv,\n stream: ColorSupportStream = process.stdout\n): boolean {\n if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") {\n return true;\n }\n\n if (env.NO_COLOR !== undefined) {\n return false;\n }\n\n if (stream.isTTY !== true) {\n return false;\n }\n\n return typeof env.TERM === \"string\" && env.TERM.length > 0 && env.TERM !== \"dumb\";\n}\n", "import { supportsColor } from \"../internal/color-support.js\";\n\ntype AnsiStyleName =\n | \"reset\"\n | \"bold\"\n | \"dim\"\n | \"italic\"\n | \"underline\"\n | \"inverse\"\n | \"strikethrough\"\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"gray\"\n | \"magentaBright\"\n | \"cyanBright\"\n | \"bgRed\"\n | \"bgGreen\"\n | \"bgYellow\"\n | \"bgBlue\"\n | \"bgMagenta\";\n\ninterface AnsiPair {\n open: string;\n}\n\nexport interface Color {\n (text: string): string;\n reset: Color;\n bold: Color;\n dim: Color;\n italic: Color;\n underline: Color;\n inverse: Color;\n strikethrough: Color;\n black: Color;\n red: Color;\n green: Color;\n yellow: Color;\n blue: Color;\n magenta: Color;\n cyan: Color;\n white: Color;\n gray: Color;\n magentaBright: Color;\n cyanBright: Color;\n bgRed: Color;\n bgGreen: Color;\n bgYellow: Color;\n bgBlue: Color;\n bgMagenta: Color;\n hex: (value: string) => Color;\n rgb: (red: number, green: number, blue: number) => Color;\n bgHex: (value: string) => Color;\n bgRgb: (red: number, green: number, blue: number) => Color;\n}\n\nconst reset = \"\\x1b[0m\";\n\nconst ansiStyles: Record<AnsiStyleName, AnsiPair> = {\n reset: { open: reset },\n bold: { open: \"\\x1b[1m\" },\n dim: { open: \"\\x1b[2m\" },\n italic: { open: \"\\x1b[3m\" },\n underline: { open: \"\\x1b[4m\" },\n inverse: { open: \"\\x1b[7m\" },\n strikethrough: { open: \"\\x1b[9m\" },\n black: { open: \"\\x1b[30m\" },\n red: { open: \"\\x1b[31m\" },\n green: { open: \"\\x1b[32m\" },\n yellow: { open: \"\\x1b[33m\" },\n blue: { open: \"\\x1b[34m\" },\n magenta: { open: \"\\x1b[35m\" },\n cyan: { open: \"\\x1b[36m\" },\n white: { open: \"\\x1b[37m\" },\n gray: { open: \"\\x1b[90m\" },\n magentaBright: { open: \"\\x1b[95m\" },\n cyanBright: { open: \"\\x1b[96m\" },\n bgRed: { open: \"\\x1b[41m\" },\n bgGreen: { open: \"\\x1b[42m\" },\n bgYellow: { open: \"\\x1b[43m\" },\n bgBlue: { open: \"\\x1b[44m\" },\n bgMagenta: { open: \"\\x1b[45m\" }\n};\n\nconst styleNames = Object.keys(ansiStyles) as AnsiStyleName[];\n\nfunction replaceAll(value: string, search: string, replacement: string): string {\n return value.split(search).join(replacement);\n}\n\nfunction applyStyles(text: string, styles: AnsiPair[]): string {\n if (!supportsColor() || styles.length === 0) {\n return text;\n }\n\n const open = styles.map((style) => style.open).join(\"\");\n const output = text.includes(reset) ? replaceAll(text, reset, `${reset}${open}`) : text;\n\n return `${open}${output}${reset}`;\n}\n\nfunction clampRgb(value: number): number {\n if (Number.isNaN(value)) {\n return 0;\n }\n\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction hexChannel(value: string, offset: number): number {\n return Number.parseInt(value.slice(offset, offset + 2), 16);\n}\n\nfunction normalizeHex(value: string): [number, number, number] {\n const normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\n if ((normalized.length !== 3 && normalized.length !== 6) ||\n Array.from(normalized).some((char) => !\"0123456789abcdefABCDEF\".includes(char))) {\n throw new Error(`Invalid hexadecimal color: ${value}`);\n }\n\n if (normalized.length === 3) {\n const red = normalized[0]!;\n const green = normalized[1]!;\n const blue = normalized[2]!;\n\n return [\n Number.parseInt(`${red}${red}`, 16),\n Number.parseInt(`${green}${green}`, 16),\n Number.parseInt(`${blue}${blue}`, 16)\n ];\n }\n\n return [\n hexChannel(normalized, 0),\n hexChannel(normalized, 2),\n hexChannel(normalized, 4)\n ];\n}\n\nfunction rgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[38;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction bgRgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[48;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction createColor(styles: AnsiPair[] = []): Color {\n const builder = ((text: string) => applyStyles(String(text), styles)) as Color;\n\n for (const name of styleNames) {\n Object.defineProperty(builder, name, {\n configurable: true,\n enumerable: true,\n get: () => createColor([...styles, ansiStyles[name]])\n });\n }\n\n builder.hex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, rgbStyle(red, green, blue)]);\n };\n\n builder.rgb = (red: number, green: number, blue: number) =>\n createColor([...styles, rgbStyle(red, green, blue)]);\n\n builder.bgHex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, bgRgbStyle(red, green, blue)]);\n };\n\n builder.bgRgb = (red: number, green: number, blue: number) =>\n createColor([...styles, bgRgbStyle(red, green, blue)]);\n\n return builder;\n}\n\nexport const color = createColor();\n", "export interface Brand {\n name: string;\n primary: string;\n}\n\nexport const brands: Record<string, Brand> = {\n purple: { name: \"purple\", primary: \"#a200ff\" },\n blue: { name: \"blue\", primary: \"#2f6fed\" },\n green: { name: \"green\", primary: \"#1f9d57\" }\n};\n", "import { brands } from \"../tokens/brand.js\";\n\nexport interface ThemeConfig {\n brand: string;\n label: string;\n}\n\nconst defaults: ThemeConfig = {\n brand: \"purple\",\n label: \"Poe\"\n};\n\nlet config: ThemeConfig = { ...defaults };\nlet revision = 0;\nlet brandConfigured = false;\n\nexport function configureTheme(patch: { brand?: string; label?: string }): void {\n if (patch.brand !== undefined && !Object.hasOwn(brands, patch.brand)) {\n throw new Error(`Unknown brand: ${patch.brand}`);\n }\n\n config = {\n brand: patch.brand ?? config.brand,\n label: patch.label ?? config.label\n };\n if (patch.brand !== undefined) {\n brandConfigured = true;\n }\n revision += 1;\n}\n\nexport function getThemeConfig(): ThemeConfig {\n return { ...config };\n}\n\nexport function getThemeRevision(): number {\n return revision;\n}\n\nexport function isThemeBrandConfigured(): boolean {\n return brandConfigured;\n}\n\nexport function resetTheme(): void {\n config = { ...defaults };\n brandConfigured = false;\n revision += 1;\n}\n", "import { color, type Color } from \"../components/color.js\";\nimport { getThemeConfig } from \"../internal/theme-state.js\";\nimport { brands, type Brand } from \"./brand.js\";\n\nexport const brand = brands.purple!.primary;\n\nexport type ThemeName = \"dark\" | \"light\";\n\nexport interface ThemeCellStyle {\n fg?: string;\n bold?: boolean;\n dim?: boolean;\n underline?: boolean;\n}\n\nexport interface ThemeCellStyles {\n accent: ThemeCellStyle;\n muted: ThemeCellStyle;\n success: ThemeCellStyle;\n warning: ThemeCellStyle;\n error: ThemeCellStyle;\n info: ThemeCellStyle;\n}\n\nexport interface ThemePalette {\n header: (text: string) => string;\n divider: (text: string) => string;\n prompt: (text: string) => string;\n number: (text: string) => string;\n intro: (text: string) => string;\n resolvedSymbol: string;\n errorSymbol: string;\n accent: (text: string) => string;\n muted: (text: string) => string;\n success: (text: string) => string;\n warning: (text: string) => string;\n error: (text: string) => string;\n info: (text: string) => string;\n badge: (text: string) => string;\n styles: ThemeCellStyles;\n}\n\nfunction withStyles(palette: Omit<ThemePalette, \"styles\">, styles: ThemeCellStyles): ThemePalette {\n return Object.defineProperty(palette, \"styles\", {\n value: styles,\n enumerable: false\n }) as ThemePalette;\n}\n\nfunction brandColor(activeBrand: Brand, purple: Color): Color {\n return activeBrand.name === \"purple\" ? purple : color.hex(activeBrand.primary);\n}\n\nfunction brandBackground(activeBrand: Brand, purple: Color): Color {\n return activeBrand.name === \"purple\" ? purple : color.bgHex(activeBrand.primary);\n}\n\nexport function createPalette(activeBrand: Brand, mode: ThemeName): ThemePalette {\n const isPurple = activeBrand.name === \"purple\";\n if (mode === \"light\") {\n const active = color.hex(activeBrand.primary);\n const prompt = isPurple ? color.hex(\"#006699\") : active;\n const number = isPurple ? color.hex(\"#0077cc\") : active;\n return withStyles(\n {\n header: (text: string) => active.bold(text),\n divider: (text: string) => color.hex(\"#666666\")(text),\n prompt: (text: string) => prompt.bold(text),\n number: (text: string) => number.bold(text),\n intro: (text: string) =>\n color.bgHex(activeBrand.primary).white(` ${getThemeConfig().label} - ${text} `),\n get resolvedSymbol() {\n return active(\"\u25C7\");\n },\n get errorSymbol() {\n return color.hex(\"#cc0000\")(\"\u25A0\");\n },\n accent: (text: string) => prompt.bold(text),\n muted: (text: string) => color.hex(\"#666666\")(text),\n success: (text: string) => color.hex(\"#008800\")(text),\n warning: (text: string) => color.hex(\"#cc6600\")(text),\n error: (text: string) => color.hex(\"#cc0000\")(text),\n info: (text: string) => active(text),\n badge: (text: string) => color.bgHex(\"#cc6600\").white(` ${text} `)\n },\n {\n accent: { fg: isPurple ? \"#006699\" : activeBrand.primary, bold: true },\n muted: { fg: \"#666666\" },\n success: { fg: \"#008800\" },\n warning: { fg: \"#cc6600\" },\n error: { fg: \"#cc0000\" },\n info: { fg: activeBrand.primary }\n }\n );\n }\n\n const active = brandColor(activeBrand, color.magenta);\n const activeBright = brandColor(activeBrand, color.magentaBright);\n const activeBackground = brandBackground(activeBrand, color.bgMagenta);\n const prompt = isPurple ? color.cyan : active;\n const number = isPurple ? color.cyanBright : active;\n return withStyles(\n {\n header: (text: string) => activeBright.bold(text),\n divider: (text: string) => color.dim(text),\n prompt: (text: string) => prompt(text),\n number: (text: string) => number(text),\n intro: (text: string) => activeBackground.white(` ${getThemeConfig().label} - ${text} `),\n get resolvedSymbol() {\n return active(\"\u25C7\");\n },\n get errorSymbol() {\n return color.red(\"\u25A0\");\n },\n accent: (text: string) => prompt(text),\n muted: (text: string) => color.dim(text),\n success: (text: string) => color.green(text),\n warning: (text: string) => color.yellow(text),\n error: (text: string) => color.red(text),\n info: (text: string) => active(text),\n badge: (text: string) => color.bgYellow.black(` ${text} `)\n },\n {\n accent: { fg: isPurple ? \"cyan\" : activeBrand.primary, bold: true },\n muted: { dim: true },\n success: { fg: \"green\" },\n warning: { fg: \"yellow\" },\n error: { fg: \"red\" },\n info: { fg: isPurple ? \"magenta\" : activeBrand.primary }\n }\n );\n}\n\nexport const dark = createPalette(brands.purple!, \"dark\");\nexport const light = createPalette(brands.purple!, \"light\");\n", "import { color } from \"../components/color.js\";\n\nexport const typography = {\n bold: (text: string) => color.bold(text),\n dim: (text: string) => color.dim(text),\n italic: (text: string) => color.italic(text),\n underline: (text: string) => color.underline(text),\n strikethrough: (text: string) => color.strikethrough(text)\n} as const;\n", "export const widths = {\n header: 60,\n helpColumn: 24,\n maxLine: 80\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 { getThemeConfig, getThemeRevision, isThemeBrandConfigured } from \"./theme-state.js\";\nimport { brands } from \"../tokens/brand.js\";\nimport { createPalette, dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n POE_BRAND?: 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\nconst themeCache = new Map<string, ThemePalette>();\nlet cachedRevision = -1;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n const themeName = resolveThemeName(env);\n const config = getThemeConfig();\n const requestedBrand = env?.POE_BRAND?.toLowerCase();\n const activeBrandName =\n !isThemeBrandConfigured() && requestedBrand && Object.hasOwn(brands, requestedBrand)\n ? requestedBrand\n : config.brand;\n const revision = getThemeRevision();\n if (revision !== cachedRevision) {\n themeCache.clear();\n cachedRevision = revision;\n }\n const cacheKey = `${activeBrandName}:${themeName}`;\n const cachedTheme = themeCache.get(cacheKey);\n if (cachedTheme) {\n return cachedTheme;\n }\n const activeBrand = brands[activeBrandName]!;\n const theme =\n activeBrandName === \"purple\"\n ? themeName === \"light\"\n ? light\n : dark\n : createPalette(activeBrand, themeName);\n themeCache.set(cacheKey, theme);\n return theme;\n}\n\nexport function resetThemeCache(): void {\n themeCache.clear();\n cachedRevision = getThemeRevision();\n}\n", "import { color } from \"./color.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nfunction renderMarkdownInline(content: string): string {\n return content.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction renderMarkdownCode(content: string): string {\n const value = renderMarkdownInline(content);\n let longestRun = 0;\n let currentRun = 0;\n for (const char of value) {\n if (char === \"`\") {\n currentRun += 1;\n longestRun = Math.max(longestRun, currentRun);\n continue;\n }\n currentRun = 0;\n }\n const delimiter = \"`\".repeat(longestRun + 1);\n const paddedValue = value.startsWith(\"`\") || value.endsWith(\"`\") ? ` ${value} ` : value;\n return `${delimiter}${paddedValue}${delimiter}`;\n}\n\nfunction renderMarkdownLink(content: string): string {\n const value = renderMarkdownInline(content);\n const label = value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"[\", \"\\\\[\").replaceAll(\"]\", \"\\\\]\");\n const url = value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"(\", \"\\\\(\").replaceAll(\")\", \"\\\\)\");\n return `[${label}](${url})`;\n}\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 sectionHeader(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return typography.bold(content.toUpperCase());\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return renderMarkdownCode(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 renderMarkdownCode(content);\n return color.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return renderMarkdownCode(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 renderMarkdownCode(content);\n return color.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return renderMarkdownLink(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 error(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().error(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 { color } from \"./color.js\";\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 color.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 color.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", "export function stripAnsi(value: string): string {\n let output = \"\";\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n\n if (char === \"\\u001b\") {\n index = skipEscapeSequence(value, index);\n continue;\n }\n\n if (char === \"\\u009b\") {\n index = skipCsiSequence(value, index + 1);\n continue;\n }\n\n output += char;\n index += char.length;\n }\n\n return output;\n}\n\nfunction skipEscapeSequence(value: string, index: number): number {\n const next = value[index + 1];\n\n if (next === \"[\") {\n return skipCsiSequence(value, index + 2);\n }\n\n if (next === \"]\") {\n return skipOscSequence(value, index + 2);\n }\n\n return Math.min(value.length, index + 2);\n}\n\nfunction skipCsiSequence(value: string, index: number): number {\n while (index < value.length) {\n const codePoint = value.charCodeAt(index);\n index += 1;\n\n if (codePoint >= 0x40 && codePoint <= 0x7e) {\n break;\n }\n }\n\n return index;\n}\n\nfunction skipOscSequence(value: string, index: number): number {\n while (index < value.length) {\n if (value[index] === \"\\u0007\") {\n return index + 1;\n }\n\n if (value[index] === \"\\u001b\" && value[index + 1] === \"\\\\\") {\n return index + 2;\n }\n\n index += 1;\n }\n\n return index;\n}\n", "import { color } from \"../../components/color.js\";\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 renderMarkdownInline(value: string): string {\n return stripAnsi(value).replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = color.gray(\"\u2502\"),\n secondarySymbol = color.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(`- ${renderMarkdownInline(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:** ${renderMarkdownInline(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:** ${renderMarkdownInline(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:** ${renderMarkdownInline(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: color.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${renderMarkdownInline(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: color.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "import { color } from \"./color.js\";\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 ?? color.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import { text } from \"./text.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 interface FormatColumnsOptions {\n rows: Array<{ left: string; right: string }>;\n totalWidth?: number;\n minLeftWidth?: number;\n maxLeftWidth?: number;\n gap?: number;\n indent?: number;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction normalizeInline(value: string): string {\n return value.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction readControlSequence(value: string, index: number): number | undefined {\n if (value[index] !== \"\\u001b\") {\n return undefined;\n }\n\n if (value[index + 1] === \"[\") {\n let nextIndex = index + 2;\n while (nextIndex < value.length) {\n const code = value.charCodeAt(nextIndex);\n nextIndex += 1;\n if (code >= 0x40 && code <= 0x7e) {\n return nextIndex;\n }\n }\n return value.length;\n }\n\n if (value[index + 1] === \"]\") {\n let nextIndex = index + 2;\n while (nextIndex < value.length) {\n if (value[nextIndex] === \"\\u0007\") {\n return nextIndex + 1;\n }\n if (value[nextIndex] === \"\\u001b\" && value[nextIndex + 1] === \"\\\\\") {\n return nextIndex + 2;\n }\n nextIndex += 1;\n }\n return value.length;\n }\n\n return index + 1;\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n if (codePoints.some((codePoint) => codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f))) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => {\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return width;\n }\n return width + (isWideCodePoint(codePoint) ? 2 : 1);\n }, 0);\n}\n\nfunction visibleWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n const nextIndex = readControlSequence(value, index);\n if (nextIndex !== undefined) {\n index = nextIndex;\n continue;\n }\n\n const segment = graphemeSegmenter.segment(value.slice(index))[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n const cluster = segment?.segment ?? \"\";\n width += clusterWidth(cluster);\n index += cluster.length || 1;\n }\n\n return width;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction padEndVisible(value: string, width: number): string {\n return value + \" \".repeat(Math.max(0, width - visibleWidth(value)));\n}\n\nfunction isWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\t\" || char === \"\\r\";\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let word = \"\";\n\n for (const char of value) {\n if (isWhitespace(char)) {\n if (word) {\n words.push(word);\n word = \"\";\n }\n continue;\n }\n word += char;\n }\n\n if (word) {\n words.push(word);\n }\n\n return words;\n}\n\nfunction wrapWords(value: string, width: number): string[] {\n const words = splitWords(value);\n if (words.length === 0) {\n return [\"\"];\n }\n\n const lines: string[] = [];\n let line = \"\";\n\n for (const word of words) {\n if (!line) {\n line = word;\n continue;\n }\n\n if (visibleWidth(line) + 1 + visibleWidth(word) <= width) {\n line += ` ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n\n lines.push(line);\n return lines;\n}\n\nfunction validateLayoutValue(value: number, name: keyof Omit<FormatColumnsOptions, \"rows\">): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite non-negative number.`);\n }\n}\n\nexport function formatColumns(opts: FormatColumnsOptions): string {\n const rows = opts.rows.map((row) => ({\n left: normalizeInline(row.left),\n right: row.right\n }));\n if (rows.length === 0) {\n return \"\";\n }\n\n const totalWidth = opts.totalWidth ?? process.stdout.columns ?? 100;\n const minLeftWidth = opts.minLeftWidth ?? 12;\n const maxLeftWidth = opts.maxLeftWidth ?? 32;\n const gap = opts.gap ?? 3;\n const indent = opts.indent ?? 2;\n validateLayoutValue(totalWidth, \"totalWidth\");\n validateLayoutValue(minLeftWidth, \"minLeftWidth\");\n validateLayoutValue(maxLeftWidth, \"maxLeftWidth\");\n validateLayoutValue(gap, \"gap\");\n validateLayoutValue(indent, \"indent\");\n const maxLeftContentWidth = Math.max(...rows.map((row) => visibleWidth(row.left)));\n const leftWidth = clamp(maxLeftContentWidth + gap, minLeftWidth, maxLeftWidth);\n const rightWidth = Math.max(20, totalWidth - leftWidth - indent);\n const firstIndent = \" \".repeat(indent);\n const continuationIndent = \" \".repeat(indent + leftWidth);\n\n return rows\n .flatMap((row) => {\n if (row.right.length === 0) {\n return [`${firstIndent}${row.left}`];\n }\n\n const rightLines = wrapWords(row.right, rightWidth);\n if (visibleWidth(row.left) >= leftWidth) {\n return [\n `${firstIndent}${row.left}`,\n ...rightLines.map((line) => `${continuationIndent}${line}`)\n ];\n }\n const firstLine = `${firstIndent}${padEndVisible(row.left, leftWidth)}${rightLines[0]}`;\n const continuationLines = rightLines\n .slice(1)\n .map((line) => `${continuationIndent}${line}`);\n return [firstLine, ...continuationLines];\n })\n .join(\"\\n\");\n}\n\nexport function formatCommand(name: string, description: string): string {\n return formatColumns({\n rows: [{ left: text.command(name), right: description }]\n });\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 return formatColumns({\n rows: [{ left: text.option(flags), right: description }]\n });\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return formatColumns({\n rows: commands.map((cmd) => ({\n left: text.command(cmd.name),\n right: cmd.description\n }))\n });\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return formatColumns({\n rows: options.map((opt) => ({\n left: text.option(opt.flags),\n right: opt.description\n }))\n });\n}\n\nexport const helpFormatter = {\n formatColumns,\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList\n} as const;\n", "import type {\n CommandInfo,\n FormatColumnsOptions,\n OptionInfo\n} from \"./help-formatter.js\";\n\nexport function stripAnsi(value: string): string {\n let output = \"\";\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] === \"\\u001b\") {\n if (value[index + 1] === \"[\") {\n index += 2;\n while (index < value.length) {\n const code = value.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n break;\n }\n index += 1;\n }\n }\n continue;\n }\n\n output += value[index];\n }\n return output;\n}\n\nfunction toAscii(value: string): string {\n let output = \"\";\n const stripped = stripAnsi(value);\n for (let index = 0; index < stripped.length; index += 1) {\n const code = stripped.charCodeAt(index);\n output += code <= 0x7f ? stripped[index] : \"?\";\n }\n return output;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction padEndVisible(value: string, width: number): string {\n return value + \" \".repeat(Math.max(0, width - value.length));\n}\n\nfunction isWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\t\" || char === \"\\r\";\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let word = \"\";\n\n for (const char of value) {\n if (isWhitespace(char)) {\n if (word) {\n words.push(word);\n word = \"\";\n }\n continue;\n }\n word += char;\n }\n\n if (word) {\n words.push(word);\n }\n\n return words;\n}\n\nfunction wrapWords(value: string, width: number): string[] {\n const words = splitWords(value);\n if (words.length === 0) {\n return [\"\"];\n }\n\n const lines: string[] = [];\n let line = \"\";\n\n for (const word of words) {\n if (!line) {\n line = word;\n continue;\n }\n\n if (line.length + 1 + word.length <= width) {\n line += ` ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n\n lines.push(line);\n return lines;\n}\n\nexport function formatColumns(opts: FormatColumnsOptions): string {\n const rows = opts.rows.map((row) => ({\n left: toAscii(row.left),\n right: toAscii(row.right)\n }));\n\n if (rows.length === 0) {\n return \"\";\n }\n\n const totalWidth = opts.totalWidth ?? process.stdout.columns ?? 100;\n const minLeftWidth = opts.minLeftWidth ?? 12;\n const maxLeftWidth = opts.maxLeftWidth ?? 32;\n const gap = opts.gap ?? 3;\n const indent = opts.indent ?? 2;\n const maxLeftContentWidth = Math.max(...rows.map((row) => row.left.length));\n const leftWidth = clamp(maxLeftContentWidth + gap, minLeftWidth, maxLeftWidth);\n const rightWidth = Math.max(20, totalWidth - leftWidth - indent);\n const firstIndent = \" \".repeat(indent);\n const continuationIndent = \" \".repeat(indent + leftWidth);\n\n return rows\n .flatMap((row) => {\n if (row.right.length === 0) {\n return [`${firstIndent}${row.left}`];\n }\n\n const rightLines = wrapWords(row.right, rightWidth);\n if (row.left.length >= leftWidth) {\n return [\n `${firstIndent}${row.left}`,\n ...rightLines.map((line) => `${continuationIndent}${line}`)\n ];\n }\n const firstLine = `${firstIndent}${padEndVisible(row.left, leftWidth)}${rightLines[0]}`;\n const continuationLines = rightLines\n .slice(1)\n .map((line) => `${continuationIndent}${line}`);\n return [firstLine, ...continuationLines];\n })\n .join(\"\\n\");\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return formatColumns({\n rows: commands.map((cmd) => ({\n left: cmd.name,\n right: cmd.description\n }))\n });\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return formatColumns({\n rows: options.map((opt) => ({\n left: opt.flags,\n right: opt.description\n }))\n });\n}\n", "import type { ThemePalette } from \"../tokens/colors.js\";\nimport { widths } from \"../tokens/widths.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 variant?: \"table\" | \"detail\";\n maxWidth?: number;\n}\n\ntype TableAlignment = TableColumn[\"alignment\"] | \"center\";\n\ninterface ComputedColumn {\n name: string;\n title: string;\n alignment: TableAlignment;\n width: number;\n}\n\nconst reset = \"\\x1b[0m\";\nconst ellipsis = \"\u2026\";\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction getCell(row: Record<string, string>, name: string): string {\n return Object.prototype.hasOwnProperty.call(row, name) ? row[name] ?? \"\" : \"\";\n}\n\nfunction renderMarkdownCell(value: string): string {\n return stripAnsi(value)\n .replaceAll(\"\\r\\n\", \" \")\n .replaceAll(\"\\n\", \" \")\n .replaceAll(\"\\r\", \" \")\n .replaceAll(\"|\", \"\\\\|\");\n}\n\nfunction isAnsiSequence(value: string, index: number): boolean {\n return value[index] === \"\\u001b\" && value[index + 1] === \"[\";\n}\n\nfunction readAnsiSequence(value: string, index: number): { sequence: string; nextIndex: number } {\n let nextIndex = index + 2;\n while (nextIndex < value.length && value[nextIndex] !== \"m\") {\n nextIndex += 1;\n }\n\n if (nextIndex < value.length) {\n nextIndex += 1;\n }\n\n return { sequence: value.slice(index, nextIndex), nextIndex };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction isEmojiClusterCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf)\n );\n}\n\nfunction codePointWidth(char: string): number {\n const codePoint = char.codePointAt(0) ?? 0;\n\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return 0;\n }\n\n if (\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isCombiningCodePoint(codePoint)\n ) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) ? 2 : 1;\n}\n\nfunction readPrintableCluster(value: string, index: number): string {\n const nextAnsiIndex = value.indexOf(\"\\u001b[\", index);\n const plainText = value.slice(index, nextAnsiIndex === -1 ? undefined : nextAnsiIndex);\n const firstSegment = graphemeSegmenter.segment(plainText)[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n\n return firstSegment?.segment ?? Array.from(plainText)[0] ?? \"\";\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n const isEmojiCluster =\n codePoints.length > 1 &&\n codePoints.some(\n (codePoint) =>\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isEmojiClusterCodePoint(codePoint)\n );\n\n if (isEmojiCluster) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => width + codePointWidth(String.fromCodePoint(codePoint)), 0);\n}\n\nfunction displayWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n index = readAnsiSequence(value, index).nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n width += clusterWidth(cluster);\n index += cluster.length;\n }\n\n return width;\n}\n\nfunction truncateToWidth(value: string, width: number): string {\n if (displayWidth(value) <= width) {\n return value;\n }\n\n if (width <= 0) {\n return \"\";\n }\n\n const targetWidth = width <= 1 ? 0 : width - displayWidth(ellipsis);\n let output = \"\";\n let currentWidth = 0;\n let index = 0;\n let sawAnsi = false;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n const ansi = readAnsiSequence(value, index);\n sawAnsi = true;\n output += ansi.sequence;\n index = ansi.nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n const width = clusterWidth(cluster);\n if (currentWidth + width > targetWidth) {\n break;\n }\n\n output += cluster;\n currentWidth += width;\n index += cluster.length;\n }\n\n return `${output}${ellipsis}${sawAnsi ? reset : \"\"}`;\n}\n\nfunction padCell(value: string, width: number, alignment: TableAlignment): string {\n const visibleWidth = displayWidth(value);\n const padding = Math.max(0, width - visibleWidth);\n\n if (alignment === \"right\") {\n return `${\" \".repeat(padding)}${value}`;\n }\n\n if (alignment === \"center\") {\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return `${\" \".repeat(left)}${value}${\" \".repeat(right)}`;\n }\n\n return `${value}${\" \".repeat(padding)}`;\n}\n\nfunction getAlignment(column: TableColumn): TableAlignment {\n const alignment = (column as { alignment: TableAlignment }).alignment;\n return alignment === \"right\" || alignment === \"center\" ? alignment : \"left\";\n}\n\nfunction getColumnWidth(column: TableColumn): number {\n if (!Number.isFinite(column.maxLen) || column.maxLen <= 0) {\n throw new Error(\"maxLen must be a positive finite number.\");\n }\n const configuredMin = (column as { minLen?: number }).minLen;\n const minWidth = Math.max(1, configuredMin ?? 1);\n return Math.max(minWidth, column.maxLen);\n}\n\nfunction computeColumns(columns: TableColumn[]): ComputedColumn[] {\n return columns.map((column) => ({\n name: column.name,\n title: column.title,\n alignment: getAlignment(column),\n width: getColumnWidth(column)\n }));\n}\n\nfunction renderBorder(\n columns: ComputedColumn[],\n theme: ThemePalette,\n parts: { left: string; mid: string; right: string }\n): string {\n const horizontal = theme.muted(\"\u2500\");\n const segments = columns.map((column) => horizontal.repeat(column.width + 2));\n return [\n theme.muted(parts.left),\n segments.join(theme.muted(parts.mid)),\n theme.muted(parts.right)\n ].join(\"\");\n}\n\nfunction renderTerminalRow(values: string[], columns: ComputedColumn[], theme: ThemePalette): string {\n const vertical = theme.muted(\"\u2502\");\n const cells = values.map((value, index) => {\n const column = columns[index]!;\n const truncated = truncateToWidth(value, column.width);\n return ` ${padCell(truncated, column.width, column.alignment)} `;\n });\n\n return `${vertical}${cells.join(vertical)}${vertical}`;\n}\n\nfunction wrapDetailValue(value: string, width: number): string[] {\n const lines: string[] = [];\n\n for (const paragraph of value.split(\"\\n\")) {\n let line = \"\";\n\n for (const rawWord of paragraph.split(\" \")) {\n const words: string[] = [];\n let word = rawWord;\n\n while (displayWidth(word) > width) {\n let chunk = \"\";\n let index = 0;\n\n while (index < word.length) {\n const cluster = readPrintableCluster(word, index);\n if (displayWidth(`${chunk}${cluster}`) > width) {\n break;\n }\n chunk += cluster;\n index += cluster.length;\n }\n\n words.push(chunk);\n word = word.slice(chunk.length);\n }\n\n words.push(word);\n\n for (const word of words) {\n if (line.length === 0) {\n line = word;\n continue;\n }\n\n if (displayWidth(`${line} ${word}`) <= width) {\n line = `${line} ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n }\n\n lines.push(line);\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n const computedColumns = computeColumns(columns);\n if (options.variant === \"detail\") {\n const labelColumn = computedColumns[0];\n const valueColumn = computedColumns[1];\n if (!labelColumn || !valueColumn) {\n return \"\";\n }\n\n const detailLabelWidth = widths.helpColumn + 12;\n const labelWidth = Math.min(labelColumn.width, detailLabelWidth);\n const valueWidth = Math.max(20, (options.maxWidth ?? widths.maxLine) - labelWidth - 2);\n const continuation = \" \".repeat(labelWidth + 2);\n\n return rows\n .flatMap((row) => {\n const label = truncateToWidth(getCell(row, labelColumn.name), labelWidth);\n const values = wrapDetailValue(getCell(row, valueColumn.name), valueWidth);\n if (values.length === 1 && values[0] === \"\") {\n return [theme.header(label)];\n }\n return [\n `${theme.muted(padCell(label, labelWidth, \"left\"))} ${values[0] ?? \"\"}`,\n ...values.slice(1).map((value) => `${continuation}${value}`)\n ];\n })\n .join(\"\\n\");\n }\n\n const separatorOptions = options as { rowSeparator?: boolean; rowSeparators?: boolean };\n const includeRowSeparators =\n separatorOptions.rowSeparator === true || separatorOptions.rowSeparators === true;\n\n const top = renderBorder(computedColumns, theme, { left: \"\u250C\", mid: \"\u252C\", right: \"\u2510\" });\n const header = renderTerminalRow(\n computedColumns.map((column) => theme.header(column.title)),\n computedColumns,\n theme\n );\n const headerBottom = renderBorder(computedColumns, theme, { left: \"\u251C\", mid: \"\u253C\", right: \"\u2524\" });\n const bottom = renderBorder(computedColumns, theme, { left: \"\u2514\", mid: \"\u2534\", right: \"\u2518\" });\n\n const renderedRows: string[] = [];\n for (const [index, row] of rows.entries()) {\n if (includeRowSeparators && index > 0) {\n renderedRows.push(headerBottom);\n }\n renderedRows.push(\n renderTerminalRow(\n computedColumns.map((column) => getCell(row, column.name)),\n computedColumns,\n theme\n )\n );\n }\n\n return [top, header, headerBottom, ...renderedRows, bottom].join(\"\\n\");\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => renderMarkdownCell(c.title)).join(\" | \")} |`;\n const separator = `| ${columns\n .map((c) => {\n const alignment = getAlignment(c);\n if (alignment === \"right\") {\n return \"---:\";\n }\n if (alignment === \"center\") {\n return \":---:\";\n }\n return \":---\";\n })\n .join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => renderMarkdownCell(getCell(row, c.name))).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 = Object.create(null) as Record<string, string>;\n for (const col of columns) {\n obj[col.name] = stripAnsi(getCell(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 stringWidth from \"fast-string-width\";\nimport { wrapAnsi } from \"fast-wrap-ansi\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface DetailCardRow {\n label: string;\n value: string;\n}\n\nexport interface DetailCardSection {\n title?: string;\n rows: DetailCardRow[];\n}\n\nexport interface RenderDetailCardOptions {\n theme: ThemePalette;\n title: string;\n subtitle?: string;\n badges?: string[];\n prose?: Array<{ title?: string; value: string }>;\n sections?: DetailCardSection[];\n width?: number;\n}\n\nfunction wrap(value: string, width: number): string[] {\n return wrapAnsi(value, Math.max(1, width), { hard: true, trim: true }).split(\"\\n\");\n}\n\nfunction renderRows(rows: DetailCardRow[], theme: ThemePalette, width: number): string[] {\n if (rows.length === 0) return [];\n const labelWidth = Math.max(...rows.map((row) => stringWidth(row.label)));\n const valueWidth = Math.max(20, width - labelWidth - 2);\n const continuation = \" \".repeat(labelWidth + 2);\n\n return rows.flatMap((row) => {\n const values = wrap(row.value, valueWidth);\n return [\n `${theme.muted(row.label.padEnd(labelWidth))} ${values[0] ?? \"\"}`,\n ...values.slice(1).map((value) => `${continuation}${value}`)\n ];\n });\n}\n\nexport function renderDetailCard(options: RenderDetailCardOptions): string {\n const width = options.width ?? widths.maxLine;\n const identity = [\n options.theme.header(options.title),\n options.subtitle ? options.theme.muted(options.subtitle) : undefined\n ]\n .filter((value): value is string => value !== undefined)\n .join(\" \");\n\n const hero = options.badges?.length\n ? `${identity}\\n${options.theme.muted(options.badges.map((badge) => badge[0] + badge.slice(1).toLowerCase()).join(\" \u00B7 \"))}`\n : identity;\n const blocks: string[] = [hero];\n for (const prose of options.prose ?? []) {\n blocks.push(\n prose.title\n ? [options.theme.header(prose.title), wrap(prose.value, width).join(\"\\n\")].join(\"\\n\")\n : wrap(prose.value, width).join(\"\\n\")\n );\n }\n\n for (const section of options.sections ?? []) {\n if (section.rows.length === 0) continue;\n const rows = renderRows(section.rows, options.theme, width);\n blocks.push(\n section.title ? [options.theme.header(section.title), ...rows].join(\"\\n\") : rows.join(\"\\n\")\n );\n }\n\n return blocks.join(\"\\n\\n\");\n}\n", "export type TemplateEscape = \"html\" | \"none\";\n\nexport interface RenderTemplateOptions {\n escape?: TemplateEscape;\n partials?: Record<string, string>;\n validate?: boolean;\n yield?: string;\n}\n\ntype Token =\n | { type: \"text\"; value: string; start: number }\n | { type: \"name\" | \"unescaped\"; name: string; raw: string }\n | { type: \"partial\"; name: string; indent: string }\n | {\n type: \"section\" | \"inverted\";\n name: string;\n children: Token[];\n rawStart: number;\n rawEnd: number;\n };\n\ninterface SectionFrame {\n token: Extract<Token, { type: \"section\" | \"inverted\" }>;\n parent: Token[];\n}\n\ninterface Context {\n view: unknown;\n parent?: Context;\n}\n\ntype Lambda = (...args: unknown[]) => unknown;\n\ninterface RenderState {\n escape: (value: string) => string;\n partials: Record<string, string>;\n partialStack: string[];\n preserveMissing: boolean;\n validate: boolean;\n}\n\nconst MAX_PARTIAL_DEPTH = 100;\n\nconst HTML_ESCAPE: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n};\n\nexport function renderTemplate(\n template: string,\n view: Record<string, unknown>,\n options: RenderTemplateOptions = {}\n): string {\n const prepared =\n options.yield === undefined\n ? template\n : resolveTemplatePartials(template, options.partials ?? {})\n .split(\"{{yield}}\")\n .join(options.yield);\n const tokens = parseTemplate(prepared);\n validatePartialReferences(tokens, options.partials ?? {}, []);\n if (options.validate === true) {\n const expanded = resolveTemplatePartials(prepared, options.partials ?? {});\n validateVariables(parseTemplate(expanded), { view });\n }\n const state: RenderState = {\n escape: options.escape === \"none\" ? String : escapeHtml,\n partials: options.partials ?? {},\n partialStack: [],\n preserveMissing: options.yield !== undefined && options.escape === \"none\",\n validate: options.validate === true\n };\n\n return renderTokens(tokens, { view }, prepared, state);\n}\n\nexport function getTemplatePartialNames(template: string): string[] {\n const names = new Set<string>();\n collectPartialNames(parseTemplate(template), names);\n return [...names];\n}\n\nexport function resolveTemplatePartials(\n template: string,\n partials: Record<string, string>\n): string {\n return expandTemplatePartials(template, partials, []);\n}\n\nfunction renderTemplateInContext(template: string, context: Context, state: RenderState): string {\n return renderTokens(parseTemplate(template), context, template, state);\n}\n\nfunction parseTemplate(template: string): Token[] {\n const root: Token[] = [];\n const stack: SectionFrame[] = [];\n let tokens = root;\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n appendText(tokens, template.slice(index), index);\n break;\n }\n\n appendText(tokens, template.slice(index, open), index);\n\n const parsed = parseTag(template, open);\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n if (standalone !== undefined) {\n trimTextAfter(tokens, standalone.lineStart);\n }\n\n if (parsed.kind === \"comment\") {\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"delimiter\") {\n throw new Error(\"Custom delimiters are not supported\");\n }\n\n if (parsed.kind === \"section\" || parsed.kind === \"inverted\") {\n const token: Token = {\n type: parsed.kind,\n name: parsed.name,\n children: [],\n rawStart: parsed.end,\n rawEnd: standalone?.lineStart ?? open\n };\n tokens.push(token);\n stack.push({ token, parent: tokens });\n tokens = token.children;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"partial\") {\n tokens.push({\n type: \"partial\",\n name: parsed.name,\n indent: standalone === undefined ? \"\" : template.slice(standalone.lineStart, open)\n });\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"close\") {\n const frame = stack.pop();\n if (frame === undefined) {\n throw new Error(`Closing unopened section \"${parsed.name}\"`);\n }\n if (frame.token.name !== parsed.name) {\n throw new Error(`Unclosed section \"${frame.token.name}\" before closing \"${parsed.name}\"`);\n }\n frame.token.rawEnd = open;\n tokens = frame.parent;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n tokens.push({ type: parsed.kind, name: parsed.name, raw: template.slice(open, parsed.end) });\n index = parsed.end;\n }\n\n const frame = stack.pop();\n if (frame !== undefined) {\n throw new Error(`Unclosed section \"${frame.token.name}\"`);\n }\n\n return root;\n}\n\nfunction parseTag(\n template: string,\n open: number\n): {\n kind:\n | \"name\"\n | \"unescaped\"\n | \"section\"\n | \"inverted\"\n | \"close\"\n | \"comment\"\n | \"partial\"\n | \"delimiter\";\n name: string;\n end: number;\n} {\n if (template.startsWith(\"{{{\", open)) {\n const close = template.indexOf(\"}}}\", open + 3);\n if (close === -1) {\n throw new Error(\"Unclosed unescaped tag\");\n }\n return { kind: \"unescaped\", name: template.slice(open + 3, close).trim(), end: close + 3 };\n }\n\n const close = template.indexOf(\"}}\", open + 2);\n if (close === -1) {\n throw new Error(\"Unclosed tag\");\n }\n\n const raw = template.slice(open + 2, close).trim();\n const sigil = raw[0];\n const name = sigil === undefined ? \"\" : raw.slice(1).trim();\n const end = close + 2;\n\n if (sigil === \"#\") return { kind: \"section\", name, end };\n if (sigil === \"^\") return { kind: \"inverted\", name, end };\n if (sigil === \"/\") return { kind: \"close\", name, end };\n if (sigil === \"!\") return { kind: \"comment\", name, end };\n if (sigil === \"&\") return { kind: \"unescaped\", name, end };\n if (sigil === \">\") return { kind: \"partial\", name, end };\n if (sigil === \"=\" && raw.endsWith(\"=\")) return { kind: \"delimiter\", name, end };\n\n return { kind: \"name\", name: raw, end };\n}\n\nfunction getStandalone(\n template: string,\n tagStart: number,\n tagEnd: number,\n kind: ReturnType<typeof parseTag>[\"kind\"]\n): { lineStart: number; nextIndex: number } | undefined {\n if (![\"section\", \"inverted\", \"close\", \"comment\", \"partial\", \"delimiter\"].includes(kind)) {\n return undefined;\n }\n\n const lineStart = template.lastIndexOf(\"\\n\", tagStart - 1) + 1;\n if (!isWhitespace(template.slice(lineStart, tagStart))) {\n return undefined;\n }\n\n let cursor = tagEnd;\n while (cursor < template.length && (template[cursor] === \" \" || template[cursor] === \"\\t\")) {\n cursor += 1;\n }\n\n if (template.startsWith(\"\\r\\n\", cursor)) {\n return { lineStart, nextIndex: cursor + 2 };\n }\n\n if (template[cursor] === \"\\n\") {\n return { lineStart, nextIndex: cursor + 1 };\n }\n\n if (cursor === template.length) {\n return { lineStart, nextIndex: cursor };\n }\n\n return undefined;\n}\n\nfunction renderTokens(\n tokens: Token[],\n context: Context,\n template: string,\n state: RenderState\n): string {\n let output = \"\";\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n output += token.value;\n continue;\n\n case \"name\":\n case \"unescaped\": {\n const result = lookup(context, token.name);\n if (!result.hit || result.value == null) {\n if (state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n if (state.preserveMissing) {\n output += token.raw;\n }\n continue;\n }\n const rendered = String(result.value);\n output += token.type === \"name\" ? state.escape(rendered) : rendered;\n continue;\n }\n\n case \"partial\": {\n if (!Object.hasOwn(state.partials, token.name)) {\n throw new Error(`Partial \"${token.name}\" not found.`);\n }\n if (state.partialStack.includes(token.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...state.partialStack, token.name].join(\" -> \")}.`\n );\n }\n if (state.partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n const partial = indentPartial(state.partials[token.name], token.indent);\n output += renderTokens(parseTemplate(partial), context, partial, {\n ...state,\n partialStack: [...state.partialStack, token.name]\n });\n continue;\n }\n\n case \"inverted\": {\n const result = lookup(context, token.name);\n if (!result.hit && state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n const value = result.value;\n if (!value || (Array.isArray(value) && value.length === 0)) {\n output += renderTokens(token.children, context, template, state);\n }\n continue;\n }\n\n case \"section\": {\n const result = lookup(context, token.name);\n if (!result.hit && state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n const value = result.value;\n if (!value) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n output += renderTokens(token.children, pushContext(context, item), template, state);\n }\n continue;\n }\n\n if (typeof value === \"function\") {\n const raw = template.slice(token.rawStart, token.rawEnd);\n const rendered = (value as Lambda).call(context.view, raw, (nextTemplate: string) =>\n renderTemplateInContext(nextTemplate, context, state)\n );\n if (rendered != null) {\n output += String(rendered);\n }\n continue;\n }\n\n if (typeof value === \"object\" || typeof value === \"string\" || typeof value === \"number\") {\n output += renderTokens(token.children, pushContext(context, value), template, state);\n continue;\n }\n\n output += renderTokens(token.children, context, template, state);\n }\n }\n }\n\n return output;\n}\n\nfunction lookup(context: Context, name: string): { hit: boolean; value: unknown } {\n if (name === \".\") {\n return { hit: true, value: callLambda(context.view, context.view) };\n }\n\n let cursor: Context | undefined = context;\n while (cursor !== undefined) {\n const result = name.includes(\".\")\n ? lookupDotted(cursor.view, name)\n : lookupName(cursor.view, name);\n\n if (result.hit) {\n return { hit: true, value: callLambda(result.value, cursor.view) };\n }\n\n cursor = cursor.parent;\n }\n\n return { hit: false, value: undefined };\n}\n\nfunction collectPartialNames(tokens: Token[], names: Set<string>): void {\n for (const token of tokens) {\n if (token.type === \"partial\") {\n names.add(token.name);\n continue;\n }\n if (token.type === \"section\" || token.type === \"inverted\") {\n collectPartialNames(token.children, names);\n }\n }\n}\n\nfunction validateVariables(tokens: Token[], context: Context): void {\n for (const token of tokens) {\n if (token.type === \"text\" || token.type === \"partial\") {\n continue;\n }\n if (token.type === \"name\" || token.type === \"unescaped\") {\n if (!lookup(context, token.name).hit) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n continue;\n }\n if (token.type !== \"section\" && token.type !== \"inverted\") {\n continue;\n }\n\n const result = lookup(context, token.name);\n if (!result.hit) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n if (Array.isArray(result.value) && result.value.length > 0) {\n for (const item of result.value) {\n validateVariables(token.children, pushContext(context, item));\n }\n continue;\n }\n if (\n typeof result.value === \"object\" && result.value !== null ||\n typeof result.value === \"string\" ||\n typeof result.value === \"number\"\n ) {\n validateVariables(token.children, pushContext(context, result.value));\n continue;\n }\n\n validateVariables(token.children, context);\n }\n}\n\nfunction validatePartialReferences(\n tokens: Token[],\n partials: Record<string, string>,\n partialStack: string[]\n): void {\n for (const token of tokens) {\n if (token.type === \"section\" || token.type === \"inverted\") {\n validatePartialReferences(token.children, partials, partialStack);\n continue;\n }\n if (token.type !== \"partial\") {\n continue;\n }\n if (!Object.hasOwn(partials, token.name)) {\n throw new Error(`Partial \"${token.name}\" not found.`);\n }\n if (partialStack.includes(token.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...partialStack, token.name].join(\" -> \")}.`\n );\n }\n if (partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n validatePartialReferences(parseTemplate(partials[token.name]), partials, [\n ...partialStack,\n token.name\n ]);\n }\n}\n\nfunction indentPartial(partial: string, indent: string): string {\n if (indent === \"\") {\n return partial;\n }\n\n return partial\n .split(\"\\n\")\n .map((line) => (line === \"\" ? \"\" : `${indent}${line}`))\n .join(\"\\n\");\n}\n\nfunction expandTemplatePartials(\n template: string,\n partials: Record<string, string>,\n partialStack: string[]\n): string {\n let output = \"\";\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n output += template.slice(index);\n break;\n }\n\n const parsed = parseTag(template, open);\n if (parsed.kind !== \"partial\") {\n output += template.slice(index, parsed.end);\n index = parsed.end;\n continue;\n }\n\n if (!Object.hasOwn(partials, parsed.name)) {\n throw new Error(`Partial \"${parsed.name}\" not found.`);\n }\n if (partialStack.includes(parsed.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...partialStack, parsed.name].join(\" -> \")}.`\n );\n }\n if (partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n const beforePartial =\n standalone === undefined\n ? template.slice(index, open)\n : template.slice(index, standalone.lineStart);\n const indent = standalone === undefined ? \"\" : template.slice(standalone.lineStart, open);\n const partial = indentPartial(partials[parsed.name], indent);\n output +=\n beforePartial + expandTemplatePartials(partial, partials, [...partialStack, parsed.name]);\n index = standalone?.nextIndex ?? parsed.end;\n }\n\n return output;\n}\n\nfunction lookupName(view: unknown, name: string): { hit: boolean; value: unknown } {\n if (!isPropertyContainer(view) || !hasProperty(view, name)) {\n return { hit: false, value: undefined };\n }\n\n return { hit: true, value: view[name] };\n}\n\nfunction lookupDotted(view: unknown, name: string): { hit: boolean; value: unknown } {\n const parts = name.split(\".\");\n let value = view;\n\n for (const part of parts) {\n if (!isPropertyContainer(value) || !hasProperty(value, part)) {\n return { hit: false, value: undefined };\n }\n value = Object(value)[part as keyof typeof value];\n }\n\n return { hit: true, value };\n}\n\nfunction callLambda(value: unknown, view: unknown): unknown {\n return typeof value === \"function\" ? (value as Lambda).call(view) : value;\n}\n\nfunction pushContext(parent: Context, view: unknown): Context {\n return { view, parent };\n}\n\nfunction appendText(tokens: Token[], value: string, start: number): void {\n if (value === \"\") {\n return;\n }\n\n const previous = tokens[tokens.length - 1];\n if (previous?.type === \"text\") {\n previous.value += value;\n return;\n }\n\n tokens.push({ type: \"text\", value, start });\n}\n\nfunction trimTextAfter(tokens: Token[], lineStart: number): void {\n const previous = tokens[tokens.length - 1];\n if (previous?.type !== \"text\") {\n return;\n }\n\n const keep = Math.max(0, lineStart - previous.start);\n previous.value = previous.value.slice(0, keep);\n if (previous.value === \"\") {\n tokens.pop();\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"'`=/]/g, (char) => HTML_ESCAPE[char] ?? char);\n}\n\nfunction isWhitespace(value: string): boolean {\n return value.trim() === \"\";\n}\n\nfunction isPropertyContainer(value: unknown): value is Record<string, unknown> {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nfunction hasProperty(value: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key);\n}\n", "import { spawn } from \"node:child_process\";\nimport process from \"node:process\";\n\ninterface BrowserProcess {\n once(event: \"error\", listener: (error: Error) => void): this;\n once(event: \"close\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n unref(): void;\n}\n\ntype SpawnBrowserProcess = (\n command: string,\n args: string[],\n options: { detached: true; stdio: \"ignore\" }\n) => BrowserProcess;\n\nexport interface OpenExternalOptions {\n platform?: NodeJS.Platform;\n spawnProcess?: SpawnBrowserProcess;\n}\n\nexport async function openExternal(url: string, options: OpenExternalOptions = {}): Promise<void> {\n const parsed = new URL(url);\n const { command, args } = browserCommand(parsed.href, options.platform ?? process.platform);\n await launchBrowser(command, args, options.spawnProcess ?? spawn);\n}\n\nfunction browserCommand(url: string, platform: NodeJS.Platform): { command: string; args: string[] } {\n if (platform === \"darwin\") {\n return { command: \"open\", args: [url] };\n }\n\n if (platform === \"win32\") {\n return { command: \"rundll32.exe\", args: [\"url.dll,FileProtocolHandler\", url] };\n }\n\n return { command: \"xdg-open\", args: [url] };\n}\n\nfunction launchBrowser(\n command: string,\n args: string[],\n spawnProcess: SpawnBrowserProcess\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawnProcess(command, args, { detached: true, stdio: \"ignore\" });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (code !== 0) {\n const reason = code === null ? `signal ${signal ?? \"unknown\"}` : `code ${code}`;\n reject(new Error(`Browser launcher exited with ${reason}`));\n return;\n }\n\n child.unref();\n resolve();\n });\n });\n}\n", "import { LineCounter, parse, parseDocument } from \"yaml\";\nimport { inspectFrontmatterBlock, splitFrontmatterBlock } from \"./fences.js\";\n\nexport interface ParsedFrontmatter {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface ParsedFrontmatterDocument extends ParsedFrontmatter {\n errors: readonly { message: string; pos?: [number, number] }[];\n lineCounter: LineCounter;\n}\n\nexport interface ParseFrontmatterOptions {\n uniqueKeys?: boolean;\n}\n\nexport class FrontmatterParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FrontmatterParseError\";\n }\n}\n\nexport function parseFrontmatter(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatter {\n const split = splitFrontmatter(source);\n\n if (split.raw === undefined) {\n return {\n frontmatter: {},\n body: split.body\n };\n }\n\n return {\n frontmatter: parseYamlFrontmatter(split.raw, options),\n body: split.body\n };\n}\n\nexport function parseFrontmatterDocument(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatterDocument {\n const split = inspectFrontmatterBlock(source);\n const lineCounter = createSourceLineCounter(source);\n\n if (split.kind === \"body\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [],\n lineCounter\n };\n }\n\n if (split.kind === \"missing-closing-fence\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: split.message, pos: [split.position, split.position] }],\n lineCounter\n };\n }\n\n const yamlLineCounter = new LineCounter();\n const normalizedYaml = normalizeYamlLineEndings(split.raw);\n const document = parseDocument(normalizedYaml, {\n lineCounter: yamlLineCounter,\n prettyErrors: false,\n uniqueKeys: options.uniqueKeys ?? false\n });\n const errors = document.errors.map((error) => ({\n message: error.message,\n ...(error.pos === undefined\n ? {}\n : { pos: translateYamlErrorPosition(error.pos as [number, number], split) })\n }));\n\n if (errors.length > 0) {\n return {\n frontmatter: {},\n body: split.body,\n errors,\n lineCounter\n };\n }\n\n try {\n return {\n frontmatter: normalizeYamlFrontmatter(document.toJSON()),\n body: split.body,\n errors,\n lineCounter\n };\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: error.message }],\n lineCounter\n };\n }\n\n throw error;\n }\n}\n\nfunction createSourceLineCounter(source: string): LineCounter {\n const lineCounter = new LineCounter();\n lineCounter.addNewLine(0);\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n\n if (character === \"\\n\") {\n lineCounter.addNewLine(index + 1);\n continue;\n }\n\n if (character === \"\\r\") {\n lineCounter.addNewLine(index + (source[index + 1] === \"\\n\" ? 2 : 1));\n if (source[index + 1] === \"\\n\") {\n index += 1;\n }\n }\n }\n\n return lineCounter;\n}\n\nfunction translateYamlErrorPosition(\n pos: [number, number],\n split: { raw: string; rawStart: number }\n): [number, number] {\n return pos.map((offset) => split.rawStart + normalizeYamlErrorOffset(split.raw, offset)) as [\n number,\n number\n ];\n}\n\nfunction normalizeYamlErrorOffset(raw: string, offset: number): number {\n if (offset >= raw.length && endsWithLineBreak(raw)) {\n return findPreviousLineStart(raw, raw.length);\n }\n\n return offset;\n}\n\nfunction endsWithLineBreak(value: string): boolean {\n return value.endsWith(\"\\n\") || value.endsWith(\"\\r\");\n}\n\nfunction findPreviousLineStart(value: string, end: number): number {\n let index = end - 1;\n\n if (value[index] === \"\\n\") {\n index -= 1;\n }\n\n if (value[index] === \"\\r\") {\n index -= 1;\n }\n\n while (index >= 0) {\n const character = value[index];\n\n if (character === \"\\n\" || character === \"\\r\") {\n return index + 1;\n }\n\n index -= 1;\n }\n\n return 0;\n}\n\nfunction splitFrontmatter(source: string): { raw?: string; body: string } {\n try {\n return splitFrontmatterBlock(source);\n } catch (error) {\n if (error instanceof Error) {\n throw new FrontmatterParseError(error.message);\n }\n\n throw error;\n }\n}\n\nfunction parseYamlFrontmatter(\n yamlBlock: string,\n options: ParseFrontmatterOptions\n): Record<string, unknown> {\n let parsed: unknown;\n\n try {\n parsed = parse(normalizeYamlLineEndings(yamlBlock), {\n uniqueKeys: options.uniqueKeys ?? false\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n\n return normalizeYamlFrontmatter(parsed);\n}\n\nfunction normalizeYamlLineEndings(value: string): string {\n if (!value.includes(\"\\r\")) {\n return value;\n }\n\n let normalized = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n\n if (character !== \"\\r\") {\n normalized += character;\n continue;\n }\n\n if (value[index + 1] === \"\\n\") {\n normalized += \"\\r\\n\";\n index += 1;\n continue;\n }\n\n normalized += \"\\n\";\n }\n\n return normalized;\n}\n\nfunction normalizeYamlFrontmatter(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) {\n return {};\n }\n\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n\n return normalizeYamlValue(value) as Record<string, unknown>;\n}\n\nfunction normalizeYamlValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeYamlValue(item));\n }\n\n if (!isPlainRecord(value)) {\n return value;\n }\n\n const normalized: Record<string, unknown> = {};\n\n for (const [key, entryValue] of Object.entries(value)) {\n Object.defineProperty(normalized, key, {\n configurable: true,\n enumerable: true,\n value: normalizeYamlValue(entryValue),\n writable: true\n });\n }\n\n return normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import { stringify } from \"yaml\";\nimport { FrontmatterParseError } from \"./parse.js\";\n\nexport function stringifyFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n try {\n assertFrontmatterRoot(frontmatter);\n assertAcyclic(frontmatter);\n return `---\\n${stringify(frontmatter, { aliasDuplicateObjects: false }).trimEnd()}\\n---\\n${body}`;\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : \"Unknown YAML stringify error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n}\n\nfunction assertFrontmatterRoot(value: unknown): asserts value is Record<string, unknown> {\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n}\n\nfunction assertAcyclic(value: unknown, seen: WeakSet<object> = new WeakSet()): void {\n if (typeof value !== \"object\" || value === null) {\n return;\n }\n\n if (seen.has(value)) {\n throw new FrontmatterParseError(\"Cannot stringify cyclic frontmatter.\");\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n assertAcyclic(item, seen);\n }\n } else {\n for (const item of Object.values(value)) {\n assertAcyclic(item, seen);\n }\n }\n\n seen.delete(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import type { CodeToken, CodeTokenKind, MdNode } from \"../ast.js\";\n\ntype CodeHighlightFamily = \"lexical\" | \"data\" | \"style\" | \"line\" | \"markup\";\n\ntype CodeLanguageInfo = {\n id: string;\n aliases: readonly string[];\n family?: CodeHighlightFamily;\n spec?: string;\n plain?: boolean;\n};\n\ntype CodeTokenizer = (source: string, language: CodeLanguageInfo) => CodeToken[];\n\ntype TokenEmitter = {\n push(kind: CodeTokenKind, start: number, end: number): void;\n pushPlain(start: number, end: number): void;\n};\n\ntype LexicalSpec = {\n keywords?: ReadonlySet<string>;\n types?: ReadonlySet<string>;\n constants?: ReadonlySet<string>;\n booleans?: ReadonlySet<string>;\n nulls?: ReadonlySet<string>;\n commands?: ReadonlySet<string>;\n lineComments?: readonly string[];\n blockComments?: readonly BlockCommentDelimiter[];\n stringQuotes?: readonly string[];\n templateQuotes?: boolean;\n tripleStringQuotes?: boolean;\n decorators?: boolean;\n rustAttributes?: boolean;\n variablePrefix?: \"$\";\n flags?: boolean;\n caseInsensitive?: boolean;\n};\n\ntype BlockCommentDelimiter = {\n start: string;\n end: string;\n};\n\nconst cStyleBlockComments = [{ start: \"/*\", end: \"*/\" }] as const;\n\nconst codeLanguages: readonly CodeLanguageInfo[] = [\n {\n id: \"javascript\",\n aliases: [\"js\", \"javascript\", \"mjs\", \"cjs\", \"es6\"],\n family: \"lexical\",\n spec: \"javascript\"\n },\n { id: \"javascriptreact\", aliases: [\"jsx\"], family: \"lexical\", spec: \"javascript\" },\n {\n id: \"typescript\",\n aliases: [\"ts\", \"typescript\", \"mts\", \"cts\"],\n family: \"lexical\",\n spec: \"typescript\"\n },\n { id: \"typescriptreact\", aliases: [\"tsx\"], family: \"lexical\", spec: \"typescript\" },\n { id: \"json\", aliases: [\"json\"], family: \"data\", spec: \"json\" },\n { id: \"jsonc\", aliases: [\"jsonc\"], family: \"data\", spec: \"jsonc\" },\n { id: \"jsonl\", aliases: [\"jsonl\"], family: \"data\", spec: \"json\" },\n { id: \"yaml\", aliases: [\"yaml\", \"yml\"], family: \"data\", spec: \"yaml\" },\n { id: \"css\", aliases: [\"css\"], family: \"style\", spec: \"css\" },\n { id: \"scss\", aliases: [\"scss\"], family: \"style\", spec: \"css\" },\n { id: \"sass\", aliases: [\"sass\"], family: \"style\", spec: \"css\" },\n { id: \"less\", aliases: [\"less\"], family: \"style\", spec: \"css\" },\n { id: \"postcss\", aliases: [\"postcss\"], family: \"style\", spec: \"css\" },\n { id: \"shellscript\", aliases: [\"sh\", \"bash\", \"shell\", \"shellscript\", \"zsh\", \"fish\"], family: \"lexical\", spec: \"shell\" },\n { id: \"python\", aliases: [\"py\", \"python\"], family: \"lexical\", spec: \"python\" },\n { id: \"sql\", aliases: [\"sql\", \"ddl\", \"dml\"], family: \"lexical\", spec: \"sql\" },\n { id: \"html\", aliases: [\"html\"], family: \"markup\", spec: \"html\" },\n { id: \"xml\", aliases: [\"xml\", \"svg\"], family: \"markup\", spec: \"xml\" },\n { id: \"markdown\", aliases: [\"md\", \"markdown\"], family: \"line\", spec: \"markdown\" },\n { id: \"diff\", aliases: [\"diff\", \"patch\"], family: \"line\", spec: \"diff\" },\n { id: \"dockerfile\", aliases: [\"dockerfile\", \"docker\"], family: \"line\", spec: \"dockerfile\" },\n { id: \"ini\", aliases: [\"ini\", \"properties\"], family: \"data\", spec: \"ini\" },\n { id: \"toml\", aliases: [\"toml\"], family: \"data\", spec: \"toml\" },\n { id: \"plaintext\", aliases: [\"text\", \"txt\", \"plain\", \"plaintext\"], plain: true },\n { id: \"ruby\", aliases: [\"rb\", \"ruby\"], family: \"lexical\", spec: \"ruby\" },\n { id: \"go\", aliases: [\"go\", \"golang\"], family: \"lexical\", spec: \"go\" },\n { id: \"java\", aliases: [\"java\"], family: \"lexical\", spec: \"java\" },\n { id: \"kotlin\", aliases: [\"kt\", \"kotlin\", \"kts\"], family: \"lexical\", spec: \"kotlin\" },\n { id: \"swift\", aliases: [\"swift\"], family: \"lexical\", spec: \"swift\" },\n { id: \"dart\", aliases: [\"dart\"], family: \"lexical\", spec: \"dart\" },\n { id: \"scala\", aliases: [\"scala\", \"sc\"], family: \"lexical\", spec: \"scala\" },\n { id: \"groovy\", aliases: [\"groovy\", \"gvy\", \"gy\", \"gsp\"], family: \"lexical\", spec: \"groovy\" },\n { id: \"c\", aliases: [\"c\"], family: \"lexical\", spec: \"c\" },\n { id: \"cpp\", aliases: [\"cpp\", \"c++\", \"cc\", \"cxx\"], family: \"lexical\", spec: \"cpp\" },\n { id: \"csharp\", aliases: [\"cs\", \"csharp\", \"c#\"], family: \"lexical\", spec: \"csharp\" },\n { id: \"objective-c\", aliases: [\"objc\", \"objectivec\", \"objective-c\", \"m\", \"mm\"], family: \"lexical\", spec: \"objectivec\" },\n { id: \"rust\", aliases: [\"rs\", \"rust\"], family: \"lexical\", spec: \"rust\" },\n { id: \"php\", aliases: [\"php\"], family: \"lexical\", spec: \"php\" },\n { id: \"lua\", aliases: [\"lua\"], family: \"lexical\", spec: \"lua\" },\n { id: \"perl\", aliases: [\"pl\", \"perl\", \"pm\"], family: \"lexical\", spec: \"perl\" },\n { id: \"r\", aliases: [\"r\", \"rscript\"], family: \"lexical\", spec: \"r\" },\n { id: \"powershell\", aliases: [\"ps1\", \"powershell\", \"pwsh\"], family: \"lexical\", spec: \"powershell\" },\n { id: \"elixir\", aliases: [\"ex\", \"exs\", \"elixir\"], family: \"lexical\", spec: \"elixir\" },\n { id: \"erlang\", aliases: [\"erl\", \"erlang\", \"hrl\"], family: \"lexical\", spec: \"erlang\" },\n { id: \"haskell\", aliases: [\"hs\", \"haskell\"], family: \"lexical\", spec: \"haskell\" },\n { id: \"clojure\", aliases: [\"clj\", \"cljs\", \"cljc\", \"clojure\"], family: \"lexical\", spec: \"clojure\" },\n { id: \"fsharp\", aliases: [\"fs\", \"fsi\", \"fsx\", \"fsharp\"], family: \"lexical\", spec: \"fsharp\" },\n { id: \"vb\", aliases: [\"vb\", \"vbnet\"], family: \"lexical\", spec: \"vb\" },\n { id: \"graphql\", aliases: [\"graphql\", \"gql\"], family: \"lexical\", spec: \"graphql\" },\n { id: \"protobuf\", aliases: [\"proto\", \"protobuf\"], family: \"lexical\", spec: \"protobuf\" },\n { id: \"hcl\", aliases: [\"hcl\", \"tf\", \"terraform\"], family: \"lexical\", spec: \"hcl\" },\n { id: \"nginx\", aliases: [\"nginx\", \"nginxconf\"], family: \"lexical\", spec: \"nginx\" },\n { id: \"makefile\", aliases: [\"makefile\", \"mk\"], family: \"lexical\", spec: \"makefile\" },\n { id: \"cmake\", aliases: [\"cmake\"], family: \"lexical\", spec: \"cmake\" },\n { id: \"gradle\", aliases: [\"gradle\"], family: \"lexical\", spec: \"groovy\" },\n { id: \"env\", aliases: [\"env\", \"dotenv\"], family: \"data\", spec: \"ini\" },\n { id: \"vue\", aliases: [\"vue\"], family: \"markup\", spec: \"html\" },\n { id: \"svelte\", aliases: [\"svelte\"], family: \"markup\", spec: \"html\" }\n] as const;\n\nconst languageByAlias = new Map<string, CodeLanguageInfo>();\n\nfor (const language of codeLanguages) {\n languageByAlias.set(language.id.toLowerCase(), language);\n\n for (const alias of language.aliases) {\n languageByAlias.set(alias.toLowerCase(), language);\n }\n}\n\nconst jsKeywords = new Set([\n \"as\",\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"export\",\n \"extends\",\n \"finally\",\n \"for\",\n \"from\",\n \"function\",\n \"get\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"of\",\n \"return\",\n \"set\",\n \"static\",\n \"super\",\n \"switch\",\n \"throw\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nconst tsKeywords = new Set([\n ...jsKeywords,\n \"abstract\",\n \"declare\",\n \"enum\",\n \"implements\",\n \"interface\",\n \"keyof\",\n \"namespace\",\n \"private\",\n \"protected\",\n \"public\",\n \"readonly\",\n \"satisfies\",\n \"type\"\n]);\n\nconst tsTypes = new Set([\n \"any\",\n \"bigint\",\n \"boolean\",\n \"never\",\n \"number\",\n \"object\",\n \"string\",\n \"symbol\",\n \"unknown\",\n \"void\"\n]);\n\nconst jsConstants = new Set([\"true\", \"false\", \"null\", \"undefined\", \"NaN\", \"Infinity\"]);\n\nconst pythonKeywords = new Set([\n \"and\",\n \"as\",\n \"assert\",\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"class\",\n \"continue\",\n \"def\",\n \"del\",\n \"elif\",\n \"else\",\n \"except\",\n \"finally\",\n \"for\",\n \"from\",\n \"global\",\n \"if\",\n \"import\",\n \"in\",\n \"is\",\n \"lambda\",\n \"match\",\n \"nonlocal\",\n \"not\",\n \"or\",\n \"pass\",\n \"raise\",\n \"return\",\n \"try\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nconst pythonTypes = new Set([\"Any\", \"Callable\", \"Iterable\", \"None\", \"Protocol\", \"Self\", \"TypeVar\", \"bool\", \"bytes\", \"dict\", \"float\", \"int\", \"list\", \"object\", \"set\", \"str\", \"tuple\"]);\nconst pythonBooleans = new Set([\"True\", \"False\"]);\nconst pythonNulls = new Set([\"None\", \"NotImplemented\", \"Ellipsis\"]);\n\nconst shellKeywords = new Set([\"case\", \"do\", \"done\", \"elif\", \"else\", \"esac\", \"fi\", \"for\", \"function\", \"if\", \"in\", \"select\", \"then\", \"until\", \"while\"]);\nconst shellCommands = new Set([\"awk\", \"cat\", \"cd\", \"chmod\", \"cp\", \"echo\", \"env\", \"export\", \"find\", \"grep\", \"mkdir\", \"mv\", \"printf\", \"pwd\", \"rm\", \"sed\", \"test\"]);\n\nconst sqlKeywords = new Set([\n \"add\",\n \"alter\",\n \"and\",\n \"as\",\n \"by\",\n \"case\",\n \"create\",\n \"delete\",\n \"desc\",\n \"distinct\",\n \"drop\",\n \"else\",\n \"end\",\n \"exists\",\n \"from\",\n \"group\",\n \"having\",\n \"in\",\n \"insert\",\n \"into\",\n \"is\",\n \"join\",\n \"left\",\n \"limit\",\n \"not\",\n \"null\",\n \"on\",\n \"or\",\n \"order\",\n \"outer\",\n \"primary\",\n \"references\",\n \"right\",\n \"select\",\n \"set\",\n \"table\",\n \"then\",\n \"union\",\n \"update\",\n \"values\",\n \"when\",\n \"where\"\n]);\n\nconst rubyKeywords = new Set([\"alias\", \"and\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"defined?\", \"do\", \"else\", \"elsif\", \"end\", \"ensure\", \"false\", \"for\", \"if\", \"in\", \"module\", \"next\", \"nil\", \"not\", \"or\", \"redo\", \"rescue\", \"retry\", \"return\", \"self\", \"super\", \"then\", \"true\", \"undef\", \"unless\", \"until\", \"when\", \"while\", \"yield\"]);\nconst rubyBooleans = new Set([\"true\", \"false\"]);\nconst rubyNulls = new Set([\"nil\"]);\n\nconst goKeywords = new Set([\"break\", \"case\", \"chan\", \"const\", \"continue\", \"default\", \"defer\", \"else\", \"fallthrough\", \"for\", \"func\", \"go\", \"goto\", \"if\", \"import\", \"interface\", \"map\", \"package\", \"range\", \"return\", \"select\", \"struct\", \"switch\", \"type\", \"var\"]);\nconst goTypes = new Set([\"any\", \"bool\", \"byte\", \"complex128\", \"complex64\", \"error\", \"float32\", \"float64\", \"int\", \"int16\", \"int32\", \"int64\", \"int8\", \"rune\", \"string\", \"uint\", \"uint16\", \"uint32\", \"uint64\", \"uint8\", \"uintptr\"]);\nconst goBooleans = new Set([\"true\", \"false\"]);\nconst goNulls = new Set([\"nil\"]);\n\nconst javaKeywords = new Set([\"abstract\", \"assert\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"default\", \"do\", \"else\", \"enum\", \"extends\", \"final\", \"finally\", \"for\", \"if\", \"implements\", \"import\", \"instanceof\", \"interface\", \"native\", \"new\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"static\", \"strictfp\", \"super\", \"switch\", \"synchronized\", \"this\", \"throw\", \"throws\", \"transient\", \"try\", \"volatile\", \"while\"]);\nconst javaTypes = new Set([\"Boolean\", \"Byte\", \"Character\", \"Double\", \"Float\", \"Integer\", \"Long\", \"Object\", \"Optional\", \"Short\", \"String\", \"Void\", \"boolean\", \"byte\", \"char\", \"double\", \"float\", \"int\", \"long\", \"short\", \"void\"]);\nconst javaBooleans = new Set([\"true\", \"false\"]);\nconst javaNulls = new Set([\"null\"]);\n\nconst kotlinKeywords = new Set([\"as\", \"break\", \"by\", \"catch\", \"class\", \"companion\", \"constructor\", \"continue\", \"data\", \"do\", \"else\", \"enum\", \"expect\", \"finally\", \"for\", \"fun\", \"if\", \"import\", \"in\", \"interface\", \"internal\", \"is\", \"object\", \"out\", \"override\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"sealed\", \"suspend\", \"throw\", \"try\", \"typealias\", \"val\", \"var\", \"when\", \"where\", \"while\"]);\nconst kotlinTypes = new Set([\"Any\", \"Boolean\", \"Byte\", \"Char\", \"Double\", \"Float\", \"Int\", \"List\", \"Long\", \"Map\", \"Nothing\", \"Set\", \"Short\", \"String\", \"Unit\"]);\n\nconst swiftKeywords = new Set([\"actor\", \"as\", \"associatedtype\", \"async\", \"await\", \"break\", \"case\", \"catch\", \"class\", \"continue\", \"defer\", \"deinit\", \"do\", \"else\", \"enum\", \"extension\", \"fallthrough\", \"for\", \"func\", \"guard\", \"if\", \"import\", \"in\", \"init\", \"inout\", \"let\", \"nil\", \"operator\", \"private\", \"protocol\", \"public\", \"repeat\", \"return\", \"self\", \"Self\", \"static\", \"struct\", \"subscript\", \"super\", \"switch\", \"throw\", \"throws\", \"try\", \"typealias\", \"var\", \"where\", \"while\"]);\nconst swiftTypes = new Set([\"Any\", \"Array\", \"Bool\", \"Character\", \"Dictionary\", \"Double\", \"Float\", \"Int\", \"Optional\", \"Result\", \"Set\", \"String\", \"UInt\", \"Void\"]);\n\nconst dartKeywords = new Set([\"abstract\", \"as\", \"assert\", \"async\", \"await\", \"base\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"covariant\", \"default\", \"deferred\", \"do\", \"else\", \"enum\", \"export\", \"extends\", \"extension\", \"external\", \"factory\", \"false\", \"final\", \"finally\", \"for\", \"function\", \"get\", \"hide\", \"if\", \"implements\", \"import\", \"in\", \"interface\", \"is\", \"late\", \"library\", \"mixin\", \"new\", \"null\", \"on\", \"operator\", \"part\", \"required\", \"return\", \"sealed\", \"set\", \"show\", \"static\", \"super\", \"switch\", \"sync\", \"this\", \"throw\", \"true\", \"try\", \"typedef\", \"var\", \"void\", \"when\", \"while\", \"with\", \"yield\"]);\nconst dartTypes = new Set([\"BigInt\", \"bool\", \"DateTime\", \"double\", \"Duration\", \"dynamic\", \"Future\", \"int\", \"Iterable\", \"List\", \"Map\", \"Never\", \"num\", \"Object\", \"Pattern\", \"Record\", \"Set\", \"Stream\", \"String\", \"Symbol\", \"Uri\", \"void\"]);\n\nconst scalaKeywords = new Set([\"abstract\", \"case\", \"catch\", \"class\", \"def\", \"do\", \"else\", \"enum\", \"export\", \"extends\", \"false\", \"final\", \"finally\", \"for\", \"forSome\", \"given\", \"if\", \"implicit\", \"import\", \"lazy\", \"macro\", \"match\", \"new\", \"null\", \"object\", \"override\", \"package\", \"private\", \"protected\", \"return\", \"sealed\", \"super\", \"then\", \"this\", \"throw\", \"trait\", \"true\", \"try\", \"type\", \"val\", \"var\", \"while\", \"with\", \"yield\"]);\nconst scalaTypes = new Set([\"Any\", \"Boolean\", \"Byte\", \"Char\", \"Double\", \"Either\", \"Float\", \"Int\", \"List\", \"Long\", \"Map\", \"None\", \"Option\", \"Seq\", \"Set\", \"Short\", \"Some\", \"String\", \"Unit\"]);\n\nconst groovyKeywords = new Set([\"abstract\", \"as\", \"assert\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"def\", \"default\", \"do\", \"else\", \"enum\", \"extends\", \"false\", \"final\", \"finally\", \"for\", \"goto\", \"if\", \"implements\", \"import\", \"in\", \"instanceof\", \"interface\", \"new\", \"null\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"static\", \"super\", \"switch\", \"this\", \"throw\", \"throws\", \"trait\", \"true\", \"try\", \"var\", \"void\", \"while\"]);\nconst groovyTypes = new Set([\"BigDecimal\", \"Boolean\", \"Closure\", \"Date\", \"Integer\", \"List\", \"Map\", \"Object\", \"String\", \"boolean\", \"def\", \"int\", \"long\", \"void\"]);\n\nconst cKeywords = new Set([\"auto\", \"break\", \"case\", \"const\", \"continue\", \"default\", \"do\", \"else\", \"enum\", \"extern\", \"for\", \"goto\", \"if\", \"inline\", \"register\", \"restrict\", \"return\", \"sizeof\", \"static\", \"struct\", \"switch\", \"typedef\", \"union\", \"volatile\", \"while\"]);\nconst cTypes = new Set([\"bool\", \"char\", \"double\", \"float\", \"int\", \"int16_t\", \"int32_t\", \"int64_t\", \"int8_t\", \"long\", \"short\", \"size_t\", \"uint16_t\", \"uint32_t\", \"uint64_t\", \"uint8_t\", \"void\"]);\n\nconst cppKeywords = new Set([...cKeywords, \"alignas\", \"alignof\", \"and\", \"bitand\", \"bitor\", \"catch\", \"class\", \"concept\", \"constexpr\", \"consteval\", \"constinit\", \"decltype\", \"delete\", \"explicit\", \"export\", \"friend\", \"mutable\", \"namespace\", \"new\", \"noexcept\", \"not\", \"operator\", \"or\", \"private\", \"protected\", \"public\", \"requires\", \"template\", \"this\", \"throw\", \"try\", \"typename\", \"using\", \"virtual\", \"xor\"]);\nconst cppTypes = new Set([...cTypes, \"auto\", \"bool\", \"char16_t\", \"char32_t\", \"std\", \"string\", \"wstring\"]);\nconst cppBooleans = new Set([\"true\", \"false\"]);\nconst cppNulls = new Set([\"nullptr\", \"NULL\"]);\n\nconst csharpKeywords = new Set([\"abstract\", \"as\", \"base\", \"break\", \"case\", \"catch\", \"checked\", \"class\", \"const\", \"continue\", \"default\", \"delegate\", \"do\", \"else\", \"enum\", \"event\", \"explicit\", \"extern\", \"finally\", \"fixed\", \"for\", \"foreach\", \"if\", \"implicit\", \"in\", \"interface\", \"internal\", \"is\", \"lock\", \"namespace\", \"new\", \"operator\", \"out\", \"override\", \"params\", \"private\", \"protected\", \"public\", \"readonly\", \"record\", \"ref\", \"return\", \"sealed\", \"sizeof\", \"stackalloc\", \"static\", \"struct\", \"switch\", \"this\", \"throw\", \"try\", \"typeof\", \"unchecked\", \"unsafe\", \"using\", \"virtual\", \"void\", \"volatile\", \"while\"]);\nconst csharpTypes = new Set([\"bool\", \"byte\", \"char\", \"decimal\", \"double\", \"dynamic\", \"float\", \"int\", \"long\", \"nint\", \"nuint\", \"object\", \"sbyte\", \"short\", \"string\", \"uint\", \"ulong\", \"ushort\", \"var\"]);\n\nconst objectiveCKeywords = new Set([...cKeywords, \"@autoreleasepool\", \"@catch\", \"@class\", \"@dynamic\", \"@end\", \"@finally\", \"@implementation\", \"@import\", \"@interface\", \"@optional\", \"@package\", \"@private\", \"@property\", \"@protected\", \"@protocol\", \"@public\", \"@selector\", \"@synthesize\", \"@throw\", \"@try\", \"YES\", \"NO\", \"nil\", \"self\", \"super\"]);\nconst objectiveCTypes = new Set([...cTypes, \"BOOL\", \"Class\", \"CGFloat\", \"NSInteger\", \"NSObject\", \"NSString\", \"NSUInteger\", \"SEL\", \"id\"]);\n\nconst rustKeywords = new Set([\"as\", \"async\", \"await\", \"box\", \"break\", \"const\", \"continue\", \"crate\", \"dyn\", \"else\", \"enum\", \"extern\", \"false\", \"fn\", \"for\", \"if\", \"impl\", \"in\", \"let\", \"loop\", \"match\", \"mod\", \"move\", \"mut\", \"pub\", \"ref\", \"return\", \"self\", \"Self\", \"static\", \"struct\", \"super\", \"trait\", \"true\", \"type\", \"unsafe\", \"use\", \"where\", \"while\"]);\nconst rustTypes = new Set([\"Box\", \"Option\", \"Result\", \"Some\", \"String\", \"Vec\", \"bool\", \"char\", \"f32\", \"f64\", \"i128\", \"i16\", \"i32\", \"i64\", \"i8\", \"isize\", \"str\", \"u128\", \"u16\", \"u32\", \"u64\", \"u8\", \"usize\"]);\nconst rustBooleans = new Set([\"true\", \"false\"]);\nconst rustNulls = new Set([\"None\"]);\n\nconst phpKeywords = new Set([\"abstract\", \"and\", \"array\", \"as\", \"break\", \"callable\", \"case\", \"catch\", \"class\", \"clone\", \"const\", \"continue\", \"declare\", \"default\", \"do\", \"echo\", \"else\", \"elseif\", \"empty\", \"enddeclare\", \"endfor\", \"endforeach\", \"endif\", \"endswitch\", \"endwhile\", \"enum\", \"extends\", \"final\", \"finally\", \"fn\", \"for\", \"foreach\", \"function\", \"global\", \"if\", \"implements\", \"include\", \"instanceof\", \"interface\", \"isset\", \"match\", \"namespace\", \"new\", \"or\", \"private\", \"protected\", \"public\", \"readonly\", \"require\", \"return\", \"static\", \"switch\", \"throw\", \"trait\", \"try\", \"use\", \"var\", \"while\", \"xor\", \"yield\"]);\nconst phpTypes = new Set([\"array\", \"bool\", \"callable\", \"false\", \"float\", \"int\", \"iterable\", \"mixed\", \"never\", \"null\", \"object\", \"self\", \"static\", \"string\", \"true\", \"void\"]);\n\nconst luaKeywords = new Set([\"and\", \"break\", \"do\", \"else\", \"elseif\", \"end\", \"false\", \"for\", \"function\", \"goto\", \"if\", \"in\", \"local\", \"nil\", \"not\", \"or\", \"repeat\", \"return\", \"then\", \"true\", \"until\", \"while\"]);\nconst perlKeywords = new Set([\"continue\", \"do\", \"else\", \"elsif\", \"for\", \"foreach\", \"given\", \"if\", \"last\", \"local\", \"my\", \"next\", \"our\", \"package\", \"redo\", \"require\", \"return\", \"state\", \"sub\", \"unless\", \"until\", \"use\", \"when\", \"while\"]);\nconst rKeywords = new Set([\"break\", \"else\", \"FALSE\", \"for\", \"function\", \"if\", \"Inf\", \"in\", \"NA\", \"NaN\", \"next\", \"NULL\", \"repeat\", \"return\", \"TRUE\", \"while\"]);\nconst powershellKeywords = new Set([\"begin\", \"break\", \"catch\", \"class\", \"continue\", \"data\", \"default\", \"do\", \"dynamicparam\", \"else\", \"elseif\", \"end\", \"enum\", \"exit\", \"filter\", \"finally\", \"for\", \"foreach\", \"from\", \"function\", \"if\", \"in\", \"param\", \"process\", \"return\", \"switch\", \"throw\", \"trap\", \"try\", \"until\", \"using\", \"var\", \"while\"]);\nconst elixirKeywords = new Set([\"after\", \"alias\", \"and\", \"case\", \"catch\", \"cond\", \"def\", \"defdelegate\", \"defexception\", \"defimpl\", \"defmacro\", \"defmodule\", \"defp\", \"defprotocol\", \"defstruct\", \"do\", \"else\", \"end\", \"false\", \"fn\", \"for\", \"if\", \"import\", \"in\", \"nil\", \"not\", \"or\", \"quote\", \"raise\", \"receive\", \"require\", \"rescue\", \"super\", \"throw\", \"true\", \"try\", \"unless\", \"unquote\", \"use\", \"when\", \"with\"]);\nconst erlangKeywords = new Set([\"after\", \"and\", \"andalso\", \"band\", \"begin\", \"bnot\", \"bor\", \"bsl\", \"bsr\", \"bxor\", \"case\", \"catch\", \"cond\", \"div\", \"end\", \"fun\", \"if\", \"let\", \"not\", \"of\", \"or\", \"orelse\", \"receive\", \"rem\", \"try\", \"when\", \"xor\"]);\nconst haskellKeywords = new Set([\"as\", \"case\", \"class\", \"data\", \"default\", \"deriving\", \"do\", \"else\", \"family\", \"forall\", \"foreign\", \"hiding\", \"if\", \"import\", \"in\", \"infix\", \"infixl\", \"infixr\", \"instance\", \"let\", \"module\", \"newtype\", \"of\", \"qualified\", \"then\", \"type\", \"where\"]);\nconst clojureKeywords = new Set([\"def\", \"defmacro\", \"defmethod\", \"defmulti\", \"defn\", \"defonce\", \"do\", \"doseq\", \"false\", \"fn\", \"for\", \"if\", \"let\", \"loop\", \"nil\", \"ns\", \"quote\", \"recur\", \"require\", \"true\", \"try\", \"when\"]);\nconst fsharpKeywords = new Set([\"abstract\", \"and\", \"as\", \"assert\", \"base\", \"begin\", \"class\", \"default\", \"delegate\", \"do\", \"done\", \"downcast\", \"downto\", \"elif\", \"else\", \"end\", \"exception\", \"extern\", \"false\", \"finally\", \"for\", \"fun\", \"function\", \"global\", \"if\", \"in\", \"inherit\", \"inline\", \"interface\", \"internal\", \"lazy\", \"let\", \"match\", \"member\", \"module\", \"mutable\", \"namespace\", \"new\", \"null\", \"of\", \"open\", \"or\", \"override\", \"private\", \"public\", \"rec\", \"return\", \"static\", \"struct\", \"then\", \"to\", \"true\", \"try\", \"type\", \"upcast\", \"use\", \"val\", \"void\", \"when\", \"while\", \"with\", \"yield\"]);\nconst vbKeywords = new Set([\"AddHandler\", \"And\", \"As\", \"Boolean\", \"ByRef\", \"Byte\", \"ByVal\", \"Call\", \"Case\", \"Catch\", \"Class\", \"Const\", \"Continue\", \"Date\", \"Decimal\", \"Dim\", \"Do\", \"Double\", \"Each\", \"Else\", \"ElseIf\", \"End\", \"Enum\", \"Erase\", \"Error\", \"Event\", \"Exit\", \"False\", \"Finally\", \"For\", \"Friend\", \"Function\", \"Get\", \"Global\", \"GoTo\", \"Handles\", \"If\", \"Implements\", \"Imports\", \"In\", \"Inherits\", \"Integer\", \"Interface\", \"Is\", \"Let\", \"Lib\", \"Like\", \"Long\", \"Loop\", \"Me\", \"Mod\", \"Module\", \"MustInherit\", \"MustOverride\", \"MyBase\", \"Namespace\", \"New\", \"Next\", \"Not\", \"Nothing\", \"Object\", \"Of\", \"On\", \"Option\", \"Or\", \"Overloads\", \"Overrides\", \"ParamArray\", \"Partial\", \"Private\", \"Property\", \"Protected\", \"Public\", \"RaiseEvent\", \"ReadOnly\", \"ReDim\", \"REM\", \"RemoveHandler\", \"Resume\", \"Return\", \"Select\", \"Set\", \"Shadows\", \"Shared\", \"Short\", \"Single\", \"Static\", \"Step\", \"Stop\", \"String\", \"Structure\", \"Sub\", \"SyncLock\", \"Then\", \"Throw\", \"To\", \"True\", \"Try\", \"Using\", \"Variant\", \"Wend\", \"When\", \"While\", \"With\", \"WithEvents\", \"WriteOnly\"]);\nconst graphqlKeywords = new Set([\"directive\", \"enum\", \"extend\", \"false\", \"fragment\", \"implements\", \"input\", \"interface\", \"mutation\", \"null\", \"on\", \"query\", \"repeatable\", \"scalar\", \"schema\", \"subscription\", \"true\", \"type\", \"union\"]);\nconst protobufKeywords = new Set([\"bool\", \"bytes\", \"double\", \"enum\", \"false\", \"fixed32\", \"fixed64\", \"float\", \"import\", \"int32\", \"int64\", \"map\", \"message\", \"oneof\", \"optional\", \"package\", \"proto2\", \"proto3\", \"public\", \"repeated\", \"reserved\", \"returns\", \"rpc\", \"service\", \"sfixed32\", \"sfixed64\", \"sint32\", \"sint64\", \"stream\", \"string\", \"syntax\", \"to\", \"true\", \"uint32\", \"uint64\"]);\nconst hclKeywords = new Set([\"and\", \"bool\", \"data\", \"dynamic\", \"false\", \"for\", \"if\", \"in\", \"locals\", \"module\", \"null\", \"number\", \"or\", \"output\", \"provider\", \"resource\", \"string\", \"terraform\", \"true\", \"variable\"]);\nconst nginxKeywords = new Set([\"access_log\", \"add_header\", \"deny\", \"error_log\", \"events\", \"fastcgi_pass\", \"gzip\", \"http\", \"include\", \"index\", \"listen\", \"location\", \"log_format\", \"proxy_pass\", \"return\", \"rewrite\", \"root\", \"server\", \"server_name\", \"try_files\", \"upstream\"]);\nconst makefileKeywords = new Set([\"define\", \"else\", \"endef\", \"endif\", \"export\", \"ifneq\", \"ifeq\", \"ifdef\", \"ifndef\", \"include\", \"override\", \"private\", \"sinclude\", \"undefine\", \"unexport\", \"vpath\"]);\nconst cmakeKeywords = new Set([\"add_compile_definitions\", \"add_custom_command\", \"add_custom_target\", \"add_executable\", \"add_library\", \"cmake_minimum_required\", \"else\", \"elseif\", \"endforeach\", \"endif\", \"endfunction\", \"endmacro\", \"find_package\", \"foreach\", \"function\", \"if\", \"include\", \"macro\", \"message\", \"option\", \"project\", \"return\", \"set\", \"target_compile_features\", \"target_include_directories\", \"target_link_libraries\"]);\n\nconst lexicalSpecs: Readonly<Record<string, LexicalSpec>> = {\n javascript: {\n keywords: jsKeywords,\n constants: jsConstants,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n typescript: {\n keywords: tsKeywords,\n types: tsTypes,\n constants: jsConstants,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n shell: {\n keywords: shellKeywords,\n commands: shellCommands,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n python: {\n keywords: pythonKeywords,\n types: pythonTypes,\n booleans: pythonBooleans,\n nulls: pythonNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n tripleStringQuotes: true,\n decorators: true\n },\n sql: {\n keywords: sqlKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"--\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n caseInsensitive: true\n },\n ruby: {\n keywords: rubyKeywords,\n booleans: rubyBooleans,\n nulls: rubyNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n go: {\n keywords: goKeywords,\n types: goTypes,\n booleans: goBooleans,\n nulls: goNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\", \"`\"]\n },\n java: {\n keywords: javaKeywords,\n types: javaTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n kotlin: {\n keywords: kotlinKeywords,\n types: kotlinTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n swift: {\n keywords: swiftKeywords,\n types: swiftTypes,\n booleans: cppBooleans,\n nulls: new Set([\"nil\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n dart: {\n keywords: dartKeywords,\n types: dartTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n scala: {\n keywords: scalaKeywords,\n types: scalaTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n groovy: {\n keywords: groovyKeywords,\n types: groovyTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n c: {\n keywords: cKeywords,\n types: cTypes,\n booleans: cppBooleans,\n nulls: cppNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n cpp: {\n keywords: cppKeywords,\n types: cppTypes,\n booleans: cppBooleans,\n nulls: cppNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n csharp: {\n keywords: csharpKeywords,\n types: csharpTypes,\n booleans: cppBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n objectivec: {\n keywords: objectiveCKeywords,\n types: objectiveCTypes,\n booleans: new Set([\"YES\", \"NO\", \"true\", \"false\"]),\n nulls: new Set([\"nil\", \"NULL\", \"nullptr\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n rust: {\n keywords: rustKeywords,\n types: rustTypes,\n booleans: rustBooleans,\n nulls: rustNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n rustAttributes: true\n },\n php: {\n keywords: phpKeywords,\n types: phpTypes,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\", \"#\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\"\n },\n lua: {\n keywords: luaKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\"--\"],\n stringQuotes: ['\"', \"'\"]\n },\n perl: {\n keywords: perlKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"undef\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\"\n },\n r: {\n keywords: rKeywords,\n booleans: new Set([\"TRUE\", \"FALSE\", \"T\", \"F\"]),\n nulls: new Set([\"NULL\", \"NA\", \"NaN\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n powershell: {\n keywords: powershellKeywords,\n booleans: new Set([\"$true\", \"$false\", \"true\", \"false\"]),\n nulls: new Set([\"$null\", \"null\"]),\n commands: new Set([\"Get-ChildItem\", \"Get-Content\", \"Invoke-Run\", \"Join-Path\", \"New-Item\", \"Remove-Item\", \"Set-Content\", \"Test-Path\", \"Write-Host\", \"Write-Output\"]),\n lineComments: [\"#\"],\n blockComments: [{ start: \"<#\", end: \"#>\" }],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n elixir: {\n keywords: elixirKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n erlang: {\n keywords: erlangKeywords,\n booleans: new Set([\"true\", \"false\"]),\n lineComments: [\"%\"],\n stringQuotes: ['\"', \"'\"]\n },\n haskell: {\n keywords: haskellKeywords,\n types: new Set([\"Bool\", \"Char\", \"Double\", \"Either\", \"False\", \"Float\", \"IO\", \"Int\", \"Integer\", \"Maybe\", \"Nothing\", \"String\", \"True\"]),\n booleans: new Set([\"True\", \"False\"]),\n nulls: new Set([\"Nothing\"]),\n lineComments: [\"--\"],\n blockComments: [{ start: \"{-\", end: \"-}\" }],\n stringQuotes: ['\"', \"'\"]\n },\n clojure: {\n keywords: clojureKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\";\"],\n stringQuotes: ['\"']\n },\n fsharp: {\n keywords: fsharpKeywords,\n types: new Set([\"Async\", \"bool\", \"decimal\", \"float\", \"int\", \"list\", \"Map\", \"option\", \"Result\", \"seq\", \"string\", \"unit\"]),\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\", \"None\"]),\n lineComments: [\"//\"],\n blockComments: [{ start: \"(*\", end: \"*)\" }],\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n vb: {\n keywords: vbKeywords,\n types: new Set([\"Boolean\", \"Byte\", \"Date\", \"Decimal\", \"Double\", \"Integer\", \"Long\", \"Object\", \"Short\", \"Single\", \"String\"]),\n booleans: new Set([\"True\", \"False\"]),\n nulls: new Set([\"Nothing\", \"Null\"]),\n lineComments: [\"'\"],\n stringQuotes: ['\"'],\n caseInsensitive: true\n },\n graphql: {\n keywords: graphqlKeywords,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"']\n },\n protobuf: {\n keywords: protobufKeywords,\n types: new Set([\"Any\", \"Duration\", \"Timestamp\"]),\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n hcl: {\n keywords: hclKeywords,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"#\", \"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n nginx: {\n keywords: nginxKeywords,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n makefile: {\n keywords: makefileKeywords,\n commands: shellCommands,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n cmake: {\n keywords: cmakeKeywords,\n booleans: new Set([\"ON\", \"OFF\", \"TRUE\", \"FALSE\"]),\n nulls: new Set([\"NOTFOUND\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n caseInsensitive: true\n }\n};\n\nconst tokenizers: Readonly<Record<CodeHighlightFamily, CodeTokenizer>> = {\n lexical: tokenizeLexical,\n data: tokenizeData,\n style: tokenizeStyle,\n line: tokenizeLine,\n markup: tokenizeMarkup\n};\n\nexport function highlightCodeBlock(\n node: Pick<Extract<MdNode, { type: \"code\" }>, \"lang\" | \"value\" | \"tokens\">\n): CodeToken[] | undefined {\n if (node.tokens !== undefined) {\n return node.tokens;\n }\n\n const language = resolveCodeLanguage(node.lang);\n if (\n language === undefined ||\n language.plain === true ||\n language.family === undefined ||\n node.value.length === 0\n ) {\n return undefined;\n }\n\n const tokenize = tokenizers[language.family];\n const tokens = tokenize(node.value, language);\n\n return tokens.some((token) => token.kind !== \"plain\") ? tokens : undefined;\n}\n\nfunction resolveCodeLanguage(lang: string | undefined): CodeLanguageInfo | undefined {\n if (lang === undefined || lang.length === 0) {\n return undefined;\n }\n\n return languageByAlias.get(lang.toLowerCase());\n}\n\nfunction tokenizeLexical(source: string, language: CodeLanguageInfo): CodeToken[] {\n const spec = lexicalSpecs[language.spec ?? \"\"];\n if (spec === undefined) {\n return [{ kind: \"plain\", value: source }];\n }\n\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n const char = source[index]!;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n const lineCommentEnd = readAnyLineComment(source, index, spec.lineComments ?? []);\n if (lineCommentEnd > index) {\n emitter.push(\"comment\", index, lineCommentEnd);\n index = lineCommentEnd;\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, spec.blockComments ?? []);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n\n if (spec.rustAttributes === true && source.startsWith(\"#[\", index)) {\n index = readUntil(source, index + 2, \"]\");\n emitter.push(\"decorator\", start, index);\n continue;\n }\n\n if (spec.decorators === true && char === \"@\" && isIdentifierStart(source[index + 1] ?? \"\")) {\n index = readIdentifier(source, index + 1);\n emitter.push(\"decorator\", start, index);\n continue;\n }\n\n if (spec.variablePrefix === \"$\" && char === \"$\" && isIdentifierStart(source[index + 1] ?? \"\")) {\n index = readIdentifier(source, index + 1);\n const variableKind = classifyLexicalWord(source.slice(start, index), spec);\n emitter.push(variableKind === \"plain\" ? \"variable\" : variableKind, start, index);\n continue;\n }\n\n const commandEnd = readCommandIdentifier(source, index);\n if (commandEnd > index) {\n const commandKind = classifyLexicalWord(source.slice(start, commandEnd), spec);\n if (commandKind === \"command\") {\n emitter.push(\"command\", start, commandEnd);\n index = commandEnd;\n continue;\n }\n }\n\n if (spec.flags === true && char === \"-\" && isFlagStart(source[index + 1] ?? \"\")) {\n index = readFlag(source, index + 1);\n emitter.push(\"flag\", start, index);\n continue;\n }\n\n if (\n spec.tripleStringQuotes === true &&\n (char === '\"' || char === \"'\") &&\n source.startsWith(char.repeat(3), index)\n ) {\n index = readTripleQuotedString(source, index, char);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n if ((spec.stringQuotes ?? []).includes(char)) {\n index = readQuotedString(source, index, char);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n if (spec.templateQuotes === true && char === \"`\") {\n index = readQuotedString(source, index, \"`\");\n emitter.push(\"template\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyLexicalWord(source.slice(start, index), spec), start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeData(source: string, language: CodeLanguageInfo): CodeToken[] {\n if (language.spec === \"toml\" || language.spec === \"ini\") {\n return tokenizeConfig(source);\n }\n\n return language.spec === \"yaml\" ? tokenizeYaml(source) : tokenizeJsonLike(source, language.spec === \"jsonc\");\n}\n\nfunction tokenizeJsonLike(source: string, allowComments: boolean): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n if (allowComments) {\n const lineCommentEnd = readAnyLineComment(source, index, [\"//\"]);\n if (lineCommentEnd > index) {\n emitter.push(\"comment\", index, lineCommentEnd);\n index = lineCommentEnd;\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, cStyleBlockComments);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n }\n\n if (source[index] === '\"') {\n index = readQuotedString(source, index, '\"');\n emitter.push(isJsonKey(source, index) ? \"key\" : \"string\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeYaml(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n const whitespaceEnd = readSpacesAndTabs(source, index);\n if (whitespaceEnd > index) {\n emitter.pushPlain(index, whitespaceEnd);\n index = whitespaceEnd;\n continue;\n }\n\n if (source[index] === \"#\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart) {\n const keyEnd = readYamlKey(source, index);\n if (keyEnd > index) {\n emitter.push(\"key\", index, keyEnd);\n index = keyEnd;\n atLineStart = false;\n continue;\n }\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeStyle(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, cStyleBlockComments);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n\n if (source[index] === \"@\") {\n index = readCssName(source, index + 1);\n if (index > start + 1) {\n emitter.push(\"at-rule\", start, index);\n continue;\n }\n }\n\n if (source[index] === \"#\" && isHex(source[index + 1] ?? \"\")) {\n index = readCssColor(source, index + 1);\n emitter.push(\"color\", start, index);\n continue;\n }\n\n if (source.startsWith(\"!important\", index)) {\n index += \"!important\".length;\n emitter.push(\"important\", start, index);\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readCssName(source, index);\n if (index > start) {\n emitter.push(isCssProperty(source, index) ? \"property\" : \"selector\", start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeConfig(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n index = readSpacesAndTabs(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n if (source[index] === \"#\" || source[index] === \";\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && source[index] === \"[\") {\n index = readUntil(source, index + 1, \"]\");\n emitter.push(\"selector\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart) {\n const keyEnd = readConfigKey(source, index);\n if (keyEnd > index) {\n emitter.push(\"key\", index, keyEnd);\n index = keyEnd;\n atLineStart = false;\n continue;\n }\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeLine(source: string, language: CodeLanguageInfo): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n if (atLineStart && language.spec === \"diff\" && (source[index] === \"+\" || source[index] === \"-\")) {\n index = readUntilLineEnd(source, index);\n emitter.push(source[start] === \"+\" ? \"string\" : \"important\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && language.spec === \"markdown\" && source[index] === \"#\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"keyword\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && language.spec === \"dockerfile\") {\n const directiveEnd = readIdentifier(source, index);\n if (directiveEnd > index) {\n emitter.push(\"directive\", index, directiveEnd);\n index = directiveEnd;\n atLineStart = false;\n continue;\n }\n }\n\n if (source[index] === \"#\" && language.spec !== \"diff\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeMarkup(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n if (source.startsWith(\"<!--\", index)) {\n index = readUntil(source, index + 4, \"-->\");\n emitter.push(\"comment\", start, index);\n continue;\n }\n\n if (source[index] === \"<\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n if (source[index] === \"/\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n }\n\n const tagStart = index;\n index = readIdentifier(source, index);\n if (index > tagStart) {\n emitter.push(\"tag\", tagStart, index);\n }\n\n while (index < source.length && source[index] !== \">\") {\n const innerStart = index;\n index = readWhitespace(source, index);\n if (index > innerStart) {\n emitter.pushPlain(innerStart, index);\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", innerStart, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > innerStart) {\n emitter.push(\"attribute\", innerStart, index);\n continue;\n }\n\n emitter.push(\"punctuation\", innerStart, innerStart + 1);\n index = innerStart + 1;\n }\n\n if (source[index] === \">\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n }\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction createEmitter(source: string): TokenEmitter & { tokens: CodeToken[] } {\n const tokens: CodeToken[] = [];\n\n return {\n tokens,\n push(kind, start, end) {\n pushToken(tokens, source, kind, start, end);\n },\n pushPlain(start, end) {\n pushToken(tokens, source, \"plain\", start, end);\n }\n };\n}\n\nfunction pushToken(\n tokens: CodeToken[],\n source: string,\n kind: CodeTokenKind,\n start: number,\n end: number\n): void {\n if (end <= start) {\n return;\n }\n\n const value = source.slice(start, end);\n const previous = tokens[tokens.length - 1];\n if (previous?.kind === kind) {\n previous.value += value;\n return;\n }\n\n tokens.push({ kind, value });\n}\n\nfunction classifyLexicalWord(word: string, spec: LexicalSpec): CodeTokenKind {\n const lookup = spec.caseInsensitive === true ? word.toLowerCase() : word;\n\n if (spec.booleans?.has(lookup) === true || spec.booleans?.has(word) === true) {\n return \"boolean\";\n }\n\n if (spec.nulls?.has(lookup) === true || spec.nulls?.has(word) === true) {\n return \"null\";\n }\n\n if (spec.keywords?.has(lookup) === true || spec.keywords?.has(word) === true) {\n return \"keyword\";\n }\n\n if (spec.types?.has(lookup) === true || spec.types?.has(word) === true) {\n return \"type\";\n }\n\n if (spec.commands?.has(lookup) === true || spec.commands?.has(word) === true) {\n return \"command\";\n }\n\n if (spec.constants?.has(lookup) === true || spec.constants?.has(word) === true) {\n return \"number\";\n }\n\n return \"plain\";\n}\n\nfunction classifyDataWord(word: string): CodeTokenKind {\n switch (word) {\n case \"true\":\n case \"false\":\n return \"boolean\";\n case \"null\":\n case \"Null\":\n case \"NULL\":\n case \"~\":\n return \"null\";\n default:\n return \"plain\";\n }\n}\n\nfunction readWhitespace(source: string, index: number): number {\n while (index < source.length && isWhitespace(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readSpacesAndTabs(source: string, index: number): number {\n while (index < source.length && (source[index] === \" \" || source[index] === \"\\t\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readIdentifier(source: string, index: number): number {\n if (!isIdentifierStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && isIdentifierPart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readCommandIdentifier(source: string, index: number): number {\n if (!isIdentifierStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && (isIdentifierPart(source[index]!) || source[index] === \"-\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readCssName(source: string, index: number): number {\n if (!isCssNameStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && isCssNamePart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readNumber(source: string, index: number): number {\n const start = index;\n if (source[index] === \"-\") {\n index += 1;\n }\n\n let hasDigit = false;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n hasDigit = true;\n }\n\n if (source[index] === \".\" && isDigit(source[index + 1] ?? \"\")) {\n index += 1;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n hasDigit = true;\n }\n }\n\n if (!hasDigit) {\n return start;\n }\n\n if ((source[index] === \"e\" || source[index] === \"E\") && isExponentStart(source[index + 1] ?? \"\")) {\n const exponentStart = index;\n index += 1;\n if (source[index] === \"+\" || source[index] === \"-\") {\n index += 1;\n }\n\n const digitsStart = index;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n }\n\n if (index === digitsStart) {\n return exponentStart;\n }\n }\n\n return index;\n}\n\nfunction readQuotedString(source: string, index: number, quote: string): number {\n index += 1;\n\n while (index < source.length) {\n const char = source[index]!;\n index += 1;\n\n if (char === \"\\\\\") {\n index = Math.min(source.length, index + 1);\n continue;\n }\n\n if (char === quote) {\n return index;\n }\n }\n\n return index;\n}\n\nfunction readTripleQuotedString(source: string, index: number, quote: string): number {\n const marker = quote.repeat(3);\n index += marker.length;\n\n while (index < source.length) {\n if (source.startsWith(marker, index)) {\n return index + marker.length;\n }\n\n if (source[index] === \"\\\\\") {\n index = Math.min(source.length, index + 2);\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction readAnyLineComment(\n source: string,\n index: number,\n markers: readonly string[]\n): number {\n for (const marker of markers) {\n if (source.startsWith(marker, index)) {\n return readUntilLineEnd(source, index);\n }\n }\n\n return index;\n}\n\nfunction readAnyBlockComment(\n source: string,\n index: number,\n delimiters: readonly BlockCommentDelimiter[]\n): number {\n for (const delimiter of delimiters) {\n if (source.startsWith(delimiter.start, index)) {\n return readDelimitedBlock(source, index + delimiter.start.length, delimiter.end);\n }\n }\n\n return index;\n}\n\nfunction readDelimitedBlock(source: string, index: number, endMarker: string): number {\n while (index < source.length) {\n if (source.startsWith(endMarker, index)) {\n return index + endMarker.length;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction readUntilLineEnd(source: string, index: number): number {\n while (index < source.length && source[index] !== \"\\n\") {\n index += 1;\n }\n\n return index;\n}\n\nfunction readUntil(source: string, index: number, marker: string): number {\n while (index < source.length) {\n if (source.startsWith(marker, index)) {\n return index + marker.length;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction readYamlKey(source: string, index: number): number {\n const start = index;\n while (index < source.length) {\n const char = source[index]!;\n if (char === \":\") {\n return index > start ? index : start;\n }\n\n if (char === \"\\n\" || char === \"#\" || char === \"{\" || char === \"}\" || char === \"[\" || char === \"]\") {\n return start;\n }\n\n index += 1;\n }\n\n return start;\n}\n\nfunction readConfigKey(source: string, index: number): number {\n const start = index;\n while (index < source.length) {\n const char = source[index]!;\n if (char === \"=\" || char === \":\") {\n return trimRightIndex(source, start, index);\n }\n\n if (char === \"\\n\" || char === \"#\" || char === \";\") {\n return start;\n }\n\n index += 1;\n }\n\n return start;\n}\n\nfunction readFlag(source: string, index: number): number {\n while (index < source.length && isFlagPart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction trimRightIndex(source: string, start: number, end: number): number {\n while (end > start && (source[end - 1] === \" \" || source[end - 1] === \"\\t\")) {\n end -= 1;\n }\n\n return end;\n}\n\nfunction readCssColor(source: string, index: number): number {\n let count = 0;\n\n while (index < source.length && isHex(source[index]!) && count < 8) {\n index += 1;\n count += 1;\n }\n\n return index;\n}\n\nfunction isJsonKey(source: string, index: number): boolean {\n index = readWhitespace(source, index);\n return source[index] === \":\";\n}\n\nfunction isCssProperty(source: string, index: number): boolean {\n index = readWhitespace(source, index);\n return source[index] === \":\";\n}\n\nfunction isWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\r\" || char === \"\\t\";\n}\n\nfunction isIdentifierStart(char: string): boolean {\n return isAlpha(char) || char === \"_\" || char === \"$\";\n}\n\nfunction isIdentifierPart(char: string): boolean {\n return isIdentifierStart(char) || isDigit(char);\n}\n\nfunction isCssNameStart(char: string): boolean {\n return isAlpha(char) || char === \"_\" || char === \"-\" || char === \".\";\n}\n\nfunction isCssNamePart(char: string): boolean {\n return isCssNameStart(char) || isDigit(char);\n}\n\nfunction isFlagStart(char: string): boolean {\n return isAlpha(char) || char === \"-\";\n}\n\nfunction isFlagPart(char: string): boolean {\n return isAlpha(char) || isDigit(char) || char === \"-\";\n}\n\nfunction isExponentStart(char: string): boolean {\n return isDigit(char) || char === \"+\" || char === \"-\";\n}\n\nfunction isAlpha(char: string): boolean {\n const code = char.charCodeAt(0);\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\n}\n\nfunction isDigit(char: string): boolean {\n const code = char.charCodeAt(0);\n return code >= 48 && code <= 57;\n}\n\nfunction isHex(char: string): boolean {\n const code = char.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 70) ||\n (code >= 97 && code <= 102)\n );\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function graphemes(value: string): string[] {\n return Array.from(graphemeSegmenter.segment(value), ({ segment }) => segment);\n}\n\nexport function displayWidth(value: string, startColumn = 0): number {\n let column = startColumn;\n\n for (const segment of graphemes(value)) {\n if (segment === \"\\t\") {\n column += 8 - (column % 8);\n continue;\n }\n\n column += graphemeWidth(segment);\n }\n\n return column - startColumn;\n}\n\nexport function expandTabs(value: string, startColumn = 0): string {\n let column = startColumn;\n let expanded = \"\";\n\n for (const segment of graphemes(value)) {\n if (segment === \"\\t\") {\n const spaces = 8 - (column % 8);\n expanded += \" \".repeat(spaces);\n column += spaces;\n continue;\n }\n\n expanded += segment;\n column += graphemeWidth(segment);\n }\n\n return expanded;\n}\n\nexport function graphemeWidth(segment: string): number {\n const codePoint = segment.codePointAt(0);\n\n if (codePoint === undefined || isZeroWidthCodePoint(codePoint)) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) || isFlagSegment(segment) ? 2 : 1;\n}\n\nfunction isZeroWidthCodePoint(codePoint: number): boolean {\n return (codePoint >= 0x0300 && codePoint <= 0x036f)\n || (codePoint >= 0x1ab0 && codePoint <= 0x1aff)\n || (codePoint >= 0x1dc0 && codePoint <= 0x1dff)\n || (codePoint >= 0x20d0 && codePoint <= 0x20ff)\n || (codePoint >= 0xfe20 && codePoint <= 0xfe2f);\n}\n\nfunction isFlagSegment(segment: string): boolean {\n const codePoints = [...segment].map((character) => character.codePointAt(0));\n return codePoints.length === 2\n && codePoints.every(\n (codePoint) => codePoint !== undefined && codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f)\n || codePoint === 0x2329\n || codePoint === 0x232a\n || (codePoint >= 0x2e80 && codePoint <= 0x303e)\n || (codePoint >= 0x3041 && codePoint <= 0x33bf)\n || (codePoint >= 0x3400 && codePoint <= 0x4dbf)\n || (codePoint >= 0x4e00 && codePoint <= 0xa4cf)\n || (codePoint >= 0xa960 && codePoint <= 0xa97f)\n || (codePoint >= 0xac00 && codePoint <= 0xd7af)\n || (codePoint >= 0xf900 && codePoint <= 0xfaff)\n || (codePoint >= 0xfe10 && codePoint <= 0xfe19)\n || (codePoint >= 0xfe30 && codePoint <= 0xfe6f)\n || (codePoint >= 0xff00 && codePoint <= 0xff60)\n || (codePoint >= 0xffe0 && codePoint <= 0xffe6)\n || (codePoint >= 0x1b000 && codePoint <= 0x1b0ff)\n || codePoint === 0x1f004\n || codePoint === 0x1f0cf\n || (codePoint >= 0x1f200 && codePoint <= 0x1fffd)\n || (codePoint >= 0x20000 && codePoint <= 0x2fffd)\n || (codePoint >= 0x30000 && codePoint <= 0x3fffd)\n );\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 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 on(event: \"data\", listener: (chunk: Buffer | string) => void): KeypressInput;\n off(event: \"data\", listener: (chunk: Buffer | string) => 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<(chunk: Buffer | string) => 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 = (chunk: Buffer | string) => {\n for (const event of parseKeypressChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"data\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"data\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"data\", 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 if (data.length === 1 && data[0] === 0x1b) {\n return { name: \"escape\", ctrl: false, meta: false, shift: false };\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 parseKeypressChunk(data: Buffer): KeypressEvent[] {\n const events: KeypressEvent[] = [];\n const input = data.toString(\"utf8\");\n let index = 0;\n\n while (index < input.length) {\n const sequence = nextKeySequence(input, index);\n if (sequence.length === 0) {\n break;\n }\n\n const event = parseKeypress(Buffer.from(sequence));\n if (event !== undefined) {\n events.push(event);\n }\n index += sequence.length;\n }\n\n return events;\n}\n\nfunction nextKeySequence(input: string, index: number): string {\n const character = input[index];\n if (character === undefined) {\n return \"\";\n }\n\n if (character !== \"\\u001b\") {\n return character;\n }\n\n const next = input[index + 1];\n if (next === undefined) {\n return character;\n }\n\n if (next !== \"[\") {\n return input.slice(index, index + 2);\n }\n\n for (let cursor = index + 2; cursor < input.length; cursor += 1) {\n const code = input.charCodeAt(cursor);\n if ((code >= 0x40 && code <= 0x7e) || input[cursor] === \"~\") {\n return input.slice(index, cursor + 1);\n }\n }\n\n return input.slice(index);\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const controlCharacter = controlCharacterToKeypress(key?.sequence);\n if (controlCharacter !== undefined) {\n return controlCharacter;\n }\n\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 (isSinglePrintableSequence(sequence)) {\n return sequence;\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 isSinglePrintableSequence(value: string | undefined): boolean {\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 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 controlCharacterToKeypress(sequence: string | undefined): KeypressEvent | undefined {\n if (sequence === \"\\u001f\") {\n return { ch: \"/\", ctrl: true, meta: false, shift: false };\n }\n\n if (sequence !== undefined && sequence.length === 1) {\n const code = sequence.charCodeAt(0);\n if (code >= 1 && code <= 26 && code !== 9 && code !== 10 && code !== 13) {\n return {\n name: String.fromCharCode(code + 96),\n ctrl: true,\n meta: false,\n shift: false\n };\n }\n }\n\n return undefined;\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 { resolveBindings, type ResolvedBindings } from \"./keymap.js\";\n\nexport type Tone = \"success\" | \"warning\" | \"error\" | \"info\" | \"muted\";\n\nexport interface Row {\n id: string;\n title: string;\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n group?: string; // grouped rendering; rows with same group cluster under a header\n}\n\nexport interface DetailItem {\n id: string;\n title?: string; // absent => item fills pane with no cursor / no selection chrome\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n render: (ctx: DetailCtx) => string | Promise<string>;\n renderedContent?: string;\n}\n\nexport interface Detail<R> {\n items: (row: Row, ctx: DetailCtx) => Promise<DetailItem[]>;\n actions?: Action<R>[]; // run against the focused detail item\n}\n\nexport interface DetailCtx { width: number; height: number; signal: AbortSignal; row: Row }\n\nexport interface Action<R> {\n id: string;\n label: string | (() => string); // function form re-evaluated when state changes\n key?: string | string[];\n predicate?: (ctx: ActionContext<R>) => boolean;\n handler: (ctx: ActionContext<R>) => void | Promise<void>;\n destructive?: boolean;\n primary?: boolean; // bound to Enter\n showInFooter?: boolean; // default true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ActionContext<R> {\n row: Row; // currently highlighted left-pane row\n rows: Row[]; // multi-select; falls back to [row] if no selection\n item?: DetailItem; // populated for actions declared under detail.actions\n filter: string;\n refresh: () => Promise<void>;\n suspendAnd: <T>(fn: () => Promise<T>) => Promise<T>;\n openModal: (content: { title: string; content: string }) => void;\n toast: (msg: string, tone?: Tone) => void;\n confirm: (prompt: string) => Promise<boolean>;\n exit: (after?: () => void | Promise<void>) => void;\n}\n\nexport interface ReorderContext {\n refresh: () => Promise<void>;\n toast: (msg: string, tone?: Tone) => void;\n}\n\nexport interface ExplorerConfig<R> {\n title: string;\n rows: () => Promise<Row[]>;\n refresh?: () => Promise<void>;\n detail: Detail<R>;\n actions: Action<R>[];\n reorder?: { onReorder: (orderedIds: string[], ctx?: ReorderContext) => void | Promise<void> };\n multiSelect?: boolean;\n keybindOverrides?: Record<string, string | string[]>;\n emptyHint?: string;\n initialFilter?: string;\n}\n\nexport const REGION_HEADER = 1 << 0;\nexport const REGION_LIST = 1 << 1;\nexport const REGION_DETAIL = 1 << 2;\nexport const REGION_FOOTER = 1 << 3;\nexport const REGION_MODAL = 1 << 4;\nexport const REGION_TOAST = 1 << 5;\nexport const REGION_ALL =\n REGION_HEADER |\n REGION_LIST |\n REGION_DETAIL |\n REGION_FOOTER |\n REGION_MODAL |\n REGION_TOAST;\n\nexport type Dirty = number;\n\nexport type ExplorerLayoutMode =\n | \"wide\"\n | \"medium\"\n | \"narrow-vertical\"\n | \"narrow-list-only\"\n | \"too-narrow\";\n\nexport interface ExplorerSize {\n cols: number;\n rows: number;\n}\n\nexport interface ExplorerState {\n title: string;\n emptyHint: string;\n rows: Row[];\n filtered: number[];\n matchPositions: Map<number, number[]>;\n cursor: number;\n filter: string;\n filterFocused: boolean;\n focused: \"list\" | \"detail\";\n detail: {\n rowId: string | null;\n items: DetailItem[] | null;\n cursor: number;\n scroll: number;\n token: number;\n loading: boolean;\n };\n selected: Set<string>;\n multiSelect: boolean;\n modal:\n | null\n | { kind: \"help\" }\n | { kind: \"confirm\"; action: Action<unknown>; rows: Row[]; resolver: (ok: boolean) => void }\n | { kind: \"palette\"; query: string; cursor: number }\n | { kind: \"content\"; title: string; content: string; scroll: number };\n toast: { message: string; tone: Tone; expiresAt: number } | null;\n dirty: Dirty;\n size: ExplorerSize;\n layout: ExplorerLayoutMode;\n bindings: ResolvedBindings;\n actionState: Map<string, ActionStateEntry>;\n}\n\nexport interface ActionStateEntry {\n available: boolean;\n label: string;\n running?: boolean;\n action?: Action<unknown>;\n source?: \"row\" | \"detail\";\n}\n\nexport function createInitialState<R>(\n config: ExplorerConfig<R>,\n size: ExplorerSize\n): ExplorerState {\n const normalizedSize = {\n cols: normalizeSize(size.cols),\n rows: normalizeSize(size.rows)\n };\n const multiSelect = config.multiSelect ?? true;\n\n return {\n title: config.title,\n emptyHint: config.emptyHint ?? \"No detail\",\n rows: [],\n filtered: [],\n matchPositions: new Map(),\n cursor: 0,\n filter: config.initialFilter ?? \"\",\n filterFocused: false,\n focused: \"list\",\n detail: {\n rowId: null,\n items: null,\n cursor: 0,\n scroll: 0,\n token: 0,\n loading: false\n },\n selected: new Set(),\n multiSelect,\n modal: null,\n toast: null,\n dirty: REGION_ALL,\n size: normalizedSize,\n layout: resolveExplorerLayoutMode(normalizedSize.cols),\n bindings: resolveBindings(config),\n actionState: createInitialActionState(config)\n };\n}\n\nfunction createInitialActionState<R>(\n config: ExplorerConfig<R>\n): Map<string, ActionStateEntry> {\n const state = new Map<string, ActionStateEntry>();\n\n for (const [source, actions] of [[\"row\", config.actions], [\"detail\", config.detail.actions ?? []]] as const) {\n for (const action of actions) {\n if (state.has(action.id)) {\n throw new Error(`Duplicate explorer action id: ${action.id}`);\n }\n\n state.set(action.id, {\n available: true,\n label: typeof action.label === \"function\" ? action.id : action.label,\n action: action as Action<unknown>,\n source\n });\n }\n }\n\n return state;\n}\n\nexport function resolveExplorerLayoutMode(cols: number): ExplorerLayoutMode {\n if (cols < 40) {\n return \"too-narrow\";\n }\n\n if (cols < 80) {\n return \"narrow-list-only\";\n }\n\n if (cols < 100) {\n return \"narrow-vertical\";\n }\n\n if (cols < 120) {\n return \"medium\";\n }\n\n return \"wide\";\n}\n\nfunction normalizeSize(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import { color } from \"../../components/color.js\";\nimport type { PromptStateName } from \"./core.js\";\n\nfunction supportsUnicode(): boolean {\n if (!process.platform.startsWith(\"win\")) {\n return process.env.TERM !== \"linux\";\n }\n\n return Boolean(\n process.env.CI ||\n process.env.WT_SESSION ||\n process.env.TERMINUS_SUBLIME ||\n process.env.ConEmuTask === \"{cmd::Cmder}\" ||\n process.env.TERM_PROGRAM === \"Terminus-Sublime\" ||\n process.env.TERM_PROGRAM === \"vscode\" ||\n process.env.TERM === \"xterm-256color\" ||\n process.env.TERM === \"alacritty\" ||\n process.env.TERMINAL_EMULATOR === \"JetBrains-JediTerm\"\n );\n}\n\nexport const UNICODE = supportsUnicode();\n\nfunction glyph(unicode: string, ascii: string): string {\n return UNICODE ? unicode : ascii;\n}\n\nexport const GLYPHS = {\n stepActive: glyph(\"\u25C6\", \"*\"),\n stepCancel: glyph(\"\u25A0\", \"x\"),\n stepError: glyph(\"\u25B2\", \"x\"),\n stepSubmit: glyph(\"\u25C7\", \"o\"),\n barStart: glyph(\"\u250C\", \"T\"),\n bar: glyph(\"\u2502\", \"|\"),\n barEnd: glyph(\"\u2514\", \"-\"),\n radioActive: glyph(\"\u25CF\", \">\"),\n radioInactive: glyph(\"\u25CB\", \" \"),\n checkboxActive: \"[ ]\",\n checkboxSelected: \"[x]\",\n checkboxInactive: \"[ ]\",\n passwordMask: glyph(\"\u2022\", \"*\"),\n ellipsis: \"...\"\n} as const;\n\nexport function symbol(state: PromptStateName): string {\n if (state === \"cancel\") return color.red(GLYPHS.stepCancel);\n if (state === \"error\") return color.yellow(GLYPHS.stepError);\n if (state === \"submit\") return color.green(GLYPHS.stepSubmit);\n return color.cyan(GLYPHS.stepActive);\n}\n\nexport function symbolBar(state: PromptStateName): string {\n if (state === \"cancel\") return color.red(GLYPHS.bar);\n if (state === \"error\") return color.yellow(GLYPHS.bar);\n if (state === \"submit\") return color.green(GLYPHS.bar);\n return color.cyan(GLYPHS.bar);\n}\n", "import { EventEmitter } from \"node:events\";\nimport * as readline from \"node:readline\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { mapKey, type Action } from \"./keys.js\";\nimport { wrapFrame } from \"./wrap.js\";\n\nconst cursor = {\n hide: \"\\x1b[?25l\",\n show: \"\\x1b[?25h\",\n move: (x: number, y: number) => {\n let output = \"\";\n if (x < 0) output += `\\x1b[${-x}D`;\n if (x > 0) output += `\\x1b[${x}C`;\n if (y < 0) output += `\\x1b[${-y}A`;\n if (y > 0) output += `\\x1b[${y}B`;\n return output;\n }\n};\n\nconst erase = {\n down: \"\\x1b[J\"\n};\n\nexport type PromptStateName = \"initial\" | \"active\" | \"submit\" | \"cancel\" | \"error\";\n\nexport interface PromptState<Value> {\n state: PromptStateName;\n value: Value | undefined;\n error: string;\n cursor: number;\n userInput: string;\n}\n\nexport interface PromptOptions<Value> {\n render: (state: Prompt<Value>) => string;\n initialValue?: Value;\n initialUserInput?: string;\n validate?: (value: Value | undefined) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\ntype InputStream = NodeJS.ReadableStream & {\n isTTY?: boolean;\n setRawMode?: (enabled: boolean) => void;\n unpipe?: () => void;\n};\n\ntype KeyMeta = {\n name?: string;\n ctrl?: boolean;\n};\n\nexport class Prompt<Value> extends EventEmitter {\n state: PromptStateName = \"initial\";\n value: Value | undefined;\n error = \"\";\n userInput = \"\";\n protected _cursor = 0;\n protected input: InputStream;\n protected output: NodeJS.WritableStream;\n private readonly renderFrame: (state: Prompt<Value>) => string;\n private readonly validate?: (value: Value | undefined) => string | Error | undefined;\n private readonly signal?: AbortSignal;\n private readonly trackValue: boolean;\n private previousFrame = \"\";\n private readlineInterface?: readline.Interface;\n private abortListener?: () => void;\n private closed = false;\n\n constructor(opts: PromptOptions<Value>, trackValue = true) {\n super();\n this.input = (opts.input ?? process.stdin) as InputStream;\n this.output = opts.output ?? process.stdout;\n this.renderFrame = opts.render;\n this.validate = opts.validate;\n this.signal = opts.signal;\n this.value = opts.initialValue;\n this.trackValue = trackValue;\n this.userInput = opts.initialUserInput ?? \"\";\n this._cursor = this.userInput.length;\n }\n\n get cursor(): number {\n return this._cursor;\n }\n\n prompt(): Promise<Value | typeof CANCEL> {\n if (this.signal?.aborted) {\n this.state = \"cancel\";\n return Promise.resolve(CANCEL);\n }\n\n if (this.input.isTTY !== true) {\n return this.promptNonTty();\n }\n\n return new Promise((resolve) => {\n const onSubmit = (value: Value | undefined) => resolve(value as Value);\n const onCancel = () => resolve(CANCEL);\n this.once(\"submit\", onSubmit);\n this.once(\"cancel\", onCancel);\n\n this.abortListener = () => {\n this.state = \"cancel\";\n this.emit(\"finalize\");\n this.render();\n this.close();\n };\n this.signal?.addEventListener(\"abort\", this.abortListener, { once: true });\n\n this.readlineInterface = readline.createInterface({\n input: this.input,\n output: undefined,\n tabSize: 2,\n prompt: \"\",\n escapeCodeTimeout: 50,\n terminal: true\n });\n readline.emitKeypressEvents(this.input, this.readlineInterface);\n this.readlineInterface.prompt();\n this.input.on(\"keypress\", this.onKeypress);\n if (this.input.setRawMode) {\n this.input.setRawMode(true);\n }\n this.output.on(\"resize\", this.render);\n this.render();\n });\n }\n\n protected promptNonTty(): Promise<Value | typeof CANCEL> {\n return Promise.reject(new Error(\"Interactive prompt requires a TTY. Set POE_NO_PROMPT=1 to accept defaults non-interactively.\"));\n }\n\n protected readNonTtyLine(): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: this.input, terminal: false });\n let settled = false;\n\n const settle = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n rl.close();\n resolve(value);\n };\n\n rl.once(\"line\", settle);\n rl.once(\"close\", () => settle(rl.line));\n });\n }\n\n protected setValue(value: Value | undefined): void {\n this.value = value;\n this.emit(\"value\", value);\n }\n\n protected setError(message: string): void {\n this.error = message;\n }\n\n protected setUserInput(value: string): void {\n this.userInput = value;\n this._cursor = Math.min(this._cursor, this.userInput.length);\n this.emit(\"userInput\", this.userInput);\n }\n\n protected clearUserInput(): void {\n this.userInput = \"\";\n this._cursor = 0;\n this.emit(\"userInput\", this.userInput);\n }\n\n private readonly onKeypress = (char: string | undefined, key: KeyMeta = {}) => {\n let action = mapKey(key.name, char);\n if (this.trackValue && char && char >= \" \" && key.name !== \"return\" && key.name !== \"enter\" && key.name !== \"escape\") {\n action = undefined;\n }\n\n if (this.trackValue && action !== \"enter\") {\n this.updateTrackedInput(char, key, action);\n }\n\n if (this.state === \"error\") {\n this.state = \"active\";\n this.error = \"\";\n }\n\n if (!this.trackValue && action) {\n this.emit(\"cursor\", action);\n } else if (this.trackValue && action && action !== \"enter\") {\n this.emit(\"cursor\", action);\n }\n\n if (char && /^[yn]$/i.test(char)) {\n this.emit(\"confirm\", char.toLowerCase() === \"y\");\n }\n\n if (char) {\n this.emit(\"key\", char.toLowerCase(), key);\n }\n\n if (action === \"enter\") {\n const error = this.validate?.(this.value);\n if (error) {\n this.error = error instanceof Error ? error.message : error;\n this.state = \"error\";\n } else {\n this.state = \"submit\";\n }\n }\n\n if (action === \"cancel\") {\n this.state = \"cancel\";\n }\n\n if (this.state === \"submit\" || this.state === \"cancel\") {\n this.emit(\"finalize\");\n }\n\n this.render();\n\n if (this.state === \"submit\" || this.state === \"cancel\") {\n this.close();\n }\n };\n\n private updateTrackedInput(char: string | undefined, key: KeyMeta, action: Action | undefined): void {\n if (key.ctrl) {\n if (key.name === \"a\") {\n this._cursor = 0;\n return;\n }\n if (key.name === \"e\") {\n this._cursor = this.userInput.length;\n return;\n }\n if (key.name === \"u\") {\n this.userInput = this.userInput.slice(this._cursor);\n this._cursor = 0;\n this.emit(\"userInput\", this.userInput);\n return;\n }\n if (key.name === \"k\") {\n this.userInput = this.userInput.slice(0, this._cursor);\n this.emit(\"userInput\", this.userInput);\n return;\n }\n }\n\n if (action === \"left\") {\n this._cursor = Math.max(0, this._cursor - 1);\n return;\n }\n if (action === \"right\") {\n this._cursor = Math.min(this.userInput.length, this._cursor + 1);\n return;\n }\n if (action === \"cancel\" || action === \"up\" || action === \"down\" || action === \"space\") {\n return;\n }\n if (key.name === \"backspace\" || char === \"\\b\" || char === \"\\x7f\") {\n if (this._cursor > 0) {\n this.userInput = `${this.userInput.slice(0, this._cursor - 1)}${this.userInput.slice(this._cursor)}`;\n this._cursor -= 1;\n this.emit(\"userInput\", this.userInput);\n }\n return;\n }\n if (key.name === \"delete\") {\n if (this._cursor < this.userInput.length) {\n this.userInput = `${this.userInput.slice(0, this._cursor)}${this.userInput.slice(this._cursor + 1)}`;\n this.emit(\"userInput\", this.userInput);\n }\n return;\n }\n if (!char || char < \" \" || key.ctrl) {\n return;\n }\n\n this.userInput = `${this.userInput.slice(0, this._cursor)}${char}${this.userInput.slice(this._cursor)}`;\n this._cursor += char.length;\n this.emit(\"userInput\", this.userInput);\n }\n\n protected readonly render = () => {\n if (this.closed) {\n return;\n }\n\n const frame = wrapFrame(this.output, this.renderFrame(this) ?? \"\");\n if (frame === this.previousFrame) {\n return;\n }\n\n if (!this.previousFrame) {\n this.output.write(`${cursor.hide}${frame}`);\n this.previousFrame = frame;\n if (this.state === \"initial\") {\n this.state = \"active\";\n }\n return;\n }\n\n const previousLineCount = this.previousFrame.split(\"\\n\").length - 1;\n this.output.write(`${cursor.move(-999, -previousLineCount)}${erase.down}${frame}`);\n this.previousFrame = frame;\n };\n\n protected close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.input.removeListener(\"keypress\", this.onKeypress);\n this.output.removeListener(\"resize\", this.render);\n if (this.abortListener) {\n this.signal?.removeEventListener(\"abort\", this.abortListener);\n }\n this.output.write(`${cursor.show}\\n`);\n if (!process.platform.startsWith(\"win\") && this.input.setRawMode) {\n this.input.setRawMode(false);\n }\n this.readlineInterface?.close();\n this.input.unpipe?.();\n\n if (this.state === \"cancel\") {\n this.emit(\"cancel\");\n } else {\n this.emit(\"submit\", this.value);\n }\n this.removeAllListeners();\n }\n}\n", "export const CANCEL = Symbol.for(\"poe.cancel\");\n\nexport function isCancel(value: unknown): value is typeof CANCEL {\n return value === CANCEL;\n}\n", "export type Action = \"up\" | \"down\" | \"left\" | \"right\" | \"space\" | \"enter\" | \"cancel\";\n\nconst aliases: Record<string, Action> = {\n k: \"up\",\n j: \"down\",\n h: \"left\",\n l: \"right\"\n};\n\nconst keyActions: Record<string, Action> = {\n up: \"up\",\n down: \"down\",\n left: \"left\",\n right: \"right\",\n space: \"space\",\n return: \"enter\",\n enter: \"enter\",\n escape: \"cancel\"\n};\n\nexport function mapKey(name: string | undefined, char: string | undefined): Action | undefined {\n if (char === \"\\x03\") {\n return \"cancel\";\n }\n if (char === \" \") {\n return \"space\";\n }\n if (char !== undefined && aliases[char] !== undefined) {\n return aliases[char];\n }\n\n if (!name) {\n return undefined;\n }\n\n return keyActions[name] ?? aliases[name];\n}\n", "import { wrapAnsi } from \"fast-wrap-ansi\";\nimport stringWidth from \"fast-string-width\";\n\ninterface StreamSize {\n columns?: number;\n rows?: number;\n}\n\nexport function getColumns(output: NodeJS.WritableStream): number {\n return Math.max(1, (output as StreamSize).columns ?? 80);\n}\n\nexport function getRows(output: NodeJS.WritableStream): number {\n return Math.max(1, (output as StreamSize).rows ?? 20);\n}\n\nexport function wrapTextWithPrefix(\n output: NodeJS.WritableStream,\n text: string,\n prefix: string,\n startPrefix = prefix\n): string {\n const width = Math.max(1, getColumns(output) - stringWidth(prefix));\n return wrapAnsi(text, width, { hard: true, trim: false })\n .split(\"\\n\")\n .map((line, index) => `${index === 0 ? startPrefix : prefix}${line}`)\n .join(\"\\n\");\n}\n\nexport function wrapFrame(output: NodeJS.WritableStream, frame: string): string {\n return wrapAnsi(frame, getColumns(output), { hard: true, trim: false });\n}\n", "import { color } from \"../../components/color.js\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { GLYPHS, symbol, symbolBar } from \"./glyphs.js\";\nimport { Prompt } from \"./core.js\";\nimport type { Action } from \"./keys.js\";\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nclass ConfirmPrompt extends Prompt<boolean> {\n constructor(opts: ConfirmOptions) {\n super({\n ...opts,\n initialValue: opts.initialValue ?? true,\n render: (prompt) => renderConfirmPrompt(prompt as ConfirmPrompt, opts)\n }, false);\n\n this.on(\"confirm\", (value: boolean) => {\n this.setValue(value);\n this.state = \"submit\";\n this.emit(\"finalize\");\n this.render();\n this.close();\n });\n this.on(\"cursor\", (action: Action) => {\n if (action === \"up\" || action === \"down\" || action === \"left\" || action === \"right\") {\n this.setValue(!this.value);\n }\n });\n }\n\n protected override promptNonTty(): Promise<boolean | typeof CANCEL> {\n if (process.env.POE_NO_PROMPT === \"1\") {\n return Promise.resolve(this.value ?? true);\n }\n return super.promptNonTty();\n }\n}\n\nfunction choices(value: boolean | undefined): string {\n const yes = value ? `${color.green(GLYPHS.radioActive)} ${color.bold(\"Yes\")}` : `${color.dim(GLYPHS.radioInactive)} ${color.dim(\"Yes\")}`;\n const no = value ? `${color.dim(GLYPHS.radioInactive)} ${color.dim(\"No\")}` : `${color.green(GLYPHS.radioActive)} ${color.bold(\"No\")}`;\n return `${yes} ${color.dim(\"/\")} ${no}`;\n}\n\nfunction renderConfirmPrompt(prompt: ConfirmPrompt, opts: ConfirmOptions): string {\n if (prompt.state === \"submit\") {\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${color.gray(GLYPHS.bar)} ${color.dim(prompt.value ? \"Yes\" : \"No\")}\\n${color.green(GLYPHS.barEnd)}`;\n }\n if (prompt.state === \"cancel\") {\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${color.gray(GLYPHS.bar)} ${color.dim.strikethrough(prompt.value ? \"Yes\" : \"No\")}\\n${color.red(GLYPHS.barEnd)}`;\n }\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${symbolBar(prompt.state)} ${choices(prompt.value)}\\n${color.cyan(GLYPHS.barEnd)}`;\n}\n\nexport function confirmPrompt(opts: ConfirmOptions): Promise<boolean | typeof CANCEL> {\n return new ConfirmPrompt(opts).prompt();\n}\n", "import { color } from \"../../components/color.js\";\nimport { GLYPHS } from \"./glyphs.js\";\nimport { getColumns, getRows } from \"./wrap.js\";\nimport { wrapAnsi } from \"fast-wrap-ansi\";\n\nexport interface PaginationOptions<Option> {\n cursor: number;\n options: Option[];\n style: (option: Option, active: boolean) => string;\n output: NodeJS.WritableStream;\n maxItems?: number;\n columnPadding?: number;\n rowPadding?: number;\n}\n\nfunction countLines(values: string[]): number {\n return values.reduce((sum, value) => sum + value.split(\"\\n\").length, 0);\n}\n\nfunction trimToRows(values: string[], cursorOffset: number, rows: number, hasTop: boolean, hasBottom: boolean): string[] {\n const output = [...values];\n while (countLines(output) > rows && output.length > 1) {\n const removeFromTop = hasTop && cursorOffset > 0;\n const removeFromBottom = hasBottom && cursorOffset < output.length - 1;\n if (removeFromTop) {\n output.shift();\n cursorOffset -= 1;\n } else if (removeFromBottom) {\n output.pop();\n } else {\n output.pop();\n }\n }\n return output;\n}\n\nexport function limitOptions<Option>(opts: PaginationOptions<Option>): string[] {\n const {\n cursor,\n options,\n style,\n output,\n maxItems = Number.POSITIVE_INFINITY,\n columnPadding = 0,\n rowPadding = 4\n } = opts;\n\n if (options.length === 0) {\n return [];\n }\n\n const columns = Math.max(1, getColumns(output) - columnPadding);\n const rowBudget = Math.max(getRows(output) - rowPadding, 0);\n const visibleCount = Math.max(Math.min(maxItems, rowBudget), 5);\n const cappedVisibleCount = Math.min(visibleCount, options.length);\n let start = 0;\n\n if (cursor >= cappedVisibleCount - 3) {\n start = Math.max(Math.min(cursor - cappedVisibleCount + 3, options.length - cappedVisibleCount), 0);\n }\n\n const hasTopMarker = cappedVisibleCount < options.length && start > 0;\n const hasBottomMarker = cappedVisibleCount < options.length && start + cappedVisibleCount < options.length;\n const visible = options\n .slice(start, start + cappedVisibleCount)\n .map((option, index) => wrapAnsi(style(option, start + index === cursor), columns, { hard: true, trim: false }));\n const trimmed = trimToRows(\n visible,\n Math.max(cursor - start, 0),\n Math.max(rowBudget - Number(hasTopMarker) - Number(hasBottomMarker), 1),\n hasTopMarker,\n hasBottomMarker\n );\n\n if (hasTopMarker) {\n trimmed.unshift(color.dim(GLYPHS.ellipsis));\n }\n if (hasBottomMarker) {\n trimmed.push(color.dim(GLYPHS.ellipsis));\n }\n\n return trimmed;\n}\n", "import { color } from \"../../components/color.js\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { GLYPHS, symbol } from \"./glyphs.js\";\nimport { Prompt } from \"./core.js\";\nimport { limitOptions } from \"./pagination.js\";\nimport type { Action } from \"./keys.js\";\n\nexport interface SelectOption<Value> {\n value: Value;\n label: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<SelectOption<Value>>;\n initialValue?: Value;\n maxItems?: number;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nclass SelectPrompt<Value> extends Prompt<Value> {\n private readonly options: Array<SelectOption<Value>>;\n\n constructor(opts: SelectOptions<Value>) {\n if (opts.options.length === 0) {\n throw new Error(\"Select prompt requires at least one option.\");\n }\n if (opts.options.every((option) => option.disabled)) {\n throw new Error(\"Select prompt requires at least one enabled option.\");\n }\n\n const initialIndex = Math.max(opts.options.findIndex((option) => option.value === opts.initialValue), 0);\n const cursor = findNonDisabled(initialIndex, 1, opts.options);\n super({\n ...opts,\n initialValue: opts.options[cursor]?.value,\n render: (prompt) => renderSelectPrompt(prompt as SelectPrompt<Value>, opts)\n }, false);\n this.options = opts.options;\n this._cursor = cursor;\n this.setValue(this.options[this._cursor]?.value);\n\n this.on(\"cursor\", (action: Action) => {\n if (action === \"up\" || action === \"left\") {\n this._cursor = findNonDisabled(this._cursor - 1, -1, this.options);\n } else if (action === \"down\" || action === \"right\") {\n this._cursor = findNonDisabled(this._cursor + 1, 1, this.options);\n }\n this.setValue(this.options[this._cursor]?.value);\n });\n }\n\n get visibleOptions(): Array<SelectOption<Value>> {\n return this.options;\n }\n\n protected override promptNonTty(): Promise<Value | typeof CANCEL> {\n if (process.env.POE_NO_PROMPT === \"1\") {\n return Promise.resolve(this.value as Value);\n }\n return super.promptNonTty();\n }\n}\n\nexport function findNonDisabled<Value>(\n start: number,\n direction: 1 | -1,\n options: Array<SelectOption<Value>>\n): number {\n if (options.every((option) => option.disabled)) {\n return start;\n }\n\n let index = start;\n for (let checked = 0; checked < options.length; checked += 1) {\n index = (index + options.length) % options.length;\n if (!options[index]?.disabled) {\n return index;\n }\n index += direction;\n }\n\n return start;\n}\n\nfunction renderOption<Value>(option: SelectOption<Value>, active: boolean, submitted: boolean, cancelled: boolean): string {\n const hint = option.hint ? color.dim(` (${option.hint})`) : \"\";\n if (submitted) return color.dim(option.label);\n if (cancelled) return color.dim.strikethrough(option.label);\n if (option.disabled) return `${color.gray(GLYPHS.radioInactive)} ${color.gray.strikethrough(option.label)}${hint}`;\n if (active) return `${color.green(GLYPHS.radioActive)} ${option.label}${hint}`;\n return `${color.dim(GLYPHS.radioInactive)} ${color.dim(option.label)}${hint}`;\n}\n\nfunction renderSelectPrompt<Value>(prompt: SelectPrompt<Value>, opts: SelectOptions<Value>): string {\n if (prompt.state === \"submit\" || prompt.state === \"cancel\") {\n const option = prompt.visibleOptions[prompt.cursor];\n const rendered = option ? renderOption(option, false, prompt.state === \"submit\", prompt.state === \"cancel\") : \"\";\n const end = prompt.state === \"submit\" ? color.green(GLYPHS.barEnd) : color.red(GLYPHS.barEnd);\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${color.gray(GLYPHS.bar)} ${rendered}\\n${end}`;\n }\n\n const lines = limitOptions({\n cursor: prompt.cursor,\n options: prompt.visibleOptions,\n output: opts.output ?? process.stdout,\n maxItems: opts.maxItems,\n columnPadding: 3,\n style: (option, active) => renderOption(option, active, false, false)\n }).map((line) => `${color.cyan(GLYPHS.bar)} ${line}`);\n\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${lines.join(\"\\n\")}\\n${color.cyan(GLYPHS.barEnd)}`;\n}\n\nexport function selectPrompt<Value>(opts: SelectOptions<Value>): Promise<Value | typeof CANCEL> {\n return new SelectPrompt(opts).prompt();\n}\n", "import { color } from \"../../components/color.js\";\nimport { GLYPHS, symbol, symbolBar } from \"./glyphs.js\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { Prompt, type PromptOptions } from \"./core.js\";\n\nexport interface TextOptions {\n message: string;\n placeholder?: string;\n defaultValue?: string;\n initialValue?: string;\n validate?: (value: string) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nclass TextPrompt extends Prompt<string> {\n constructor(opts: TextOptions) {\n const initialUserInput = opts.initialValue ?? \"\";\n super({\n ...opts,\n initialValue: initialUserInput,\n initialUserInput,\n render: (prompt) => renderTextPrompt(prompt as TextPrompt, opts),\n validate: opts.validate as PromptOptions<string>[\"validate\"]\n });\n this.on(\"userInput\", (value: string) => this.setValue(value));\n this.on(\"finalize\", () => {\n if (this.state === \"submit\") {\n this.setValue(this.value || opts.defaultValue || \"\");\n }\n });\n }\n\n get userInputWithCursor(): string {\n if (this.state === \"submit\") {\n return this.userInput;\n }\n\n const before = this.userInput.slice(0, this.cursor);\n const current = this.userInput[this.cursor];\n const after = this.userInput.slice(this.cursor + 1);\n\n if (current) {\n return `${before}${color.inverse(current)}${after}`;\n }\n return `${before}${color.inverse(\"\u2588\")}`;\n }\n\n protected override promptNonTty(): Promise<string | typeof CANCEL> {\n return this.readNonTtyLine();\n }\n}\n\nfunction renderHeader(prompt: Prompt<string>, message: string): string {\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${message}`;\n}\n\nfunction renderTextPrompt(prompt: TextPrompt, opts: TextOptions): string {\n const value = prompt.value ?? \"\";\n if (prompt.state === \"submit\") {\n return `${renderHeader(prompt, opts.message)}\\n${color.gray(GLYPHS.bar)} ${color.dim(value)}\\n${color.green(GLYPHS.barEnd)}`;\n }\n if (prompt.state === \"cancel\") {\n return `${renderHeader(prompt, opts.message)}\\n${color.gray(GLYPHS.bar)} ${color.dim.strikethrough(value)}\\n${color.red(GLYPHS.barEnd)}`;\n }\n\n const input = prompt.userInput.length > 0\n ? prompt.userInputWithCursor\n : opts.placeholder\n ? `${color.inverse(opts.placeholder[0] ?? \" \")}${color.dim(opts.placeholder.slice(1))}`\n : color.inverse(\"_\");\n\n if (prompt.state === \"error\") {\n return `${renderHeader(prompt, opts.message)}\\n${symbolBar(prompt.state)} ${input}\\n${color.yellow(GLYPHS.barEnd)} ${color.yellow(prompt.error)}`;\n }\n\n return `${renderHeader(prompt, opts.message)}\\n${symbolBar(prompt.state)} ${input}\\n${color.cyan(GLYPHS.barEnd)}`;\n}\n\nexport function textPrompt(opts: TextOptions): Promise<string | typeof CANCEL> {\n return new TextPrompt(opts).prompt();\n}\n", "import { color } from \"../../components/color.js\";\nexport { isCancel } from \"../interactive/cancel-symbol.js\";\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(`${color.gray(\"\u2514\")} ${color.red(msg)}\\n\\n`);\n}\n", "import { color } from \"../../components/color.js\";\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 = `${color.green(\"\u25C7\")} ${color.reset(title ?? \"\")} ${color.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 `${color.gray(\"\u2502\")} ${line}${padding}${color.gray(\"\u2502\")}`;\n });\n const bottom = color.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [color.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 ?? \"\").replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\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 { color } from \"../components/color.js\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = Object.freeze([\"\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 `- ${renderMarkdownInline(options.message)}${options.timer ? ` [${renderMarkdownInline(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 index = ((frame % SPINNER_FRAMES.length) + SPINNER_FRAMES.length) % SPINNER_FRAMES.length;\n const spinnerChar = color.magenta(SPINNER_FRAMES[index]);\n const timerSuffix = options.timer ? color.dim(` [${options.timer}]`) : \"\";\n const bar = color.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\nfunction renderMarkdownInline(value: string): string {\n return value.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${renderMarkdownInline(options.message)}${options.timer ? ` [${renderMarkdownInline(options.timer)}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n code: options.code ?? 0,\n ...(options.timer ? { timer: options.timer } : {}),\n ...(options.subtext ? { subtext: options.subtext } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? color.green(\"\u25C6\") : color.red(\"\u25A0\");\n const timerSuffix = options.timer ? color.dim(` [${options.timer}]`) : \"\";\n const bar = color.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${color.dim(options.subtext)}`;\n }\n return output;\n}\n", "import { color } from \"../components/color.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport type { CANCEL } from \"./interactive/cancel-symbol.js\";\nimport { confirmPrompt } from \"./interactive/confirm.js\";\nimport { multiselectPrompt } from \"./interactive/multiselect.js\";\nimport { passwordPrompt } from \"./interactive/password.js\";\nimport { selectPrompt, type SelectOption } from \"./interactive/select.js\";\nimport { textPrompt } from \"./interactive/text.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(`${color.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<SelectOption<Value>>;\n initialValue?: Value;\n maxItems?: number;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function select<Value>(opts: SelectOptions<Value>): Promise<Value | typeof CANCEL> {\n return selectPrompt(opts);\n}\n\nexport interface MultiselectOptions<Value> {\n message: string;\n options: Array<SelectOption<Value>>;\n initialValues?: Value[];\n required?: boolean;\n maxItems?: number;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\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[] | typeof CANCEL> {\n return multiselectPrompt(opts);\n}\n\nexport interface TextOptions {\n message: string;\n placeholder?: string;\n defaultValue?: string;\n initialValue?: string;\n validate?: (value: string) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function text(opts: TextOptions): Promise<string | typeof CANCEL> {\n return textPrompt(opts);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | typeof CANCEL> {\n return confirmPrompt(opts);\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 | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | typeof CANCEL> {\n return passwordPrompt(opts);\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 | (() => 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 const readMessage = () => (typeof message === \"function\" ? message() : message);\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(`${color.green(\"\u25C6\")} ${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(`${color.gray(\"\u2502\")} ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(readMessage());\n\n const timer = setInterval(() => {\n s.message(`${readMessage()} [${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(`${color.gray(\"\u2502\")} ${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 { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { AnySchema, ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"toolcraft-design\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type {\n HumanInLoopConfig,\n HumanInLoopPending,\n HumanInLoopRuntimeOptions\n} from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { ToolcraftBugError, UserError } from \"./user-error.js\";\nimport { suggest } from \"./suggest.js\";\nimport type { RuntimeLogger } from \"./runtime-logging.js\";\nimport type { StreamStatusEvent, ToolcraftStream } from \"./stream.js\";\n\nexport { createManagedStream } from \"./stream.js\";\nexport type {\n StreamConsumerOptions,\n StreamStatusEvent,\n StreamStatusType,\n ToolcraftStream\n} from \"./stream.js\";\n\nconst commandConfigSymbol = Symbol(\"toolcraft.command.config\");\nconst groupConfigSymbol = Symbol(\"toolcraft.group.config\");\nconst commandSourcePathSymbol = Symbol(\"toolcraft.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\ntype HumanInLoopMode = \"sync\" | \"async\";\ntype HumanInLoopModeInput = HumanInLoopMode | null | undefined;\n\nexport type Scope = ScopeValue;\n\ntype ResolveOwnHumanInLoopMode<TValue> = TValue extends {\n mode: infer TMode extends HumanInLoopMode;\n}\n ? TMode\n : TValue extends null\n ? null\n : undefined;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n exists(path: string): Promise<boolean>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n rename(fromPath: string, toPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport interface CommandExample {\n title: string;\n params: Record<string, unknown>;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n> {\n name: string;\n description?: string;\n hidden?: boolean;\n examples?: CommandExample[];\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface StreamDefinition<TEventSchema extends AnySchema = AnySchema> {\n event: TEventSchema;\n bufferSize: number;\n}\n\nexport type StreamHandlerContext<\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TServices extends object\n> = HandlerContext<TParamsSchema, TSecrets, TServices> & {\n signal: AbortSignal;\n status(event: StreamStatusEvent): void;\n refreshSecrets(): Promise<InferSecrets<TSecrets>>;\n};\n\nexport interface StreamCommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TEventSchema extends AnySchema\n> extends Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>>,\n \"handler\" | \"render\" | \"result\" | \"humanInLoop\" | \"confirm\"\n > {\n event: TEventSchema;\n handler: (\n ctx: StreamHandlerContext<TParamsSchema, TSecrets, TServices>\n ) => AsyncIterable<Static<TEventSchema>> | Promise<AsyncIterable<Static<TEventSchema>>>;\n render?: Renderers<Static<TEventSchema>>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown\n> {\n kind: \"command\";\n name: string;\n description?: string;\n hidden: boolean;\n examples: CommandExample[];\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n stream?: StreamDefinition<any>;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n hidden: boolean;\n examples: CommandExample[];\n result?: ObjectSchema<any>;\n humanInLoop?: HumanInLoopConfig<ObjectSchema<any>> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(\n requires: Requires<TContext> | undefined\n): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneCommandExamples(examples: CommandExample[] | undefined): CommandExample[] {\n return (examples ?? []).map((example) => ({\n title: example.title,\n params: { ...example.params }\n }));\n}\n\nfunction cloneStringRecord(\n values: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return values === undefined ? undefined : { ...values };\n}\n\nfunction cloneMcpServerConfig(config: McpServerConfig | undefined): McpServerConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: cloneStringArray(config.args),\n env: cloneStringRecord(config.env)\n };\n }\n\n return {\n transport: \"http\",\n url: config.url,\n headers: cloneStringRecord(config.headers)\n };\n}\n\nfunction cloneRenameMap(\n rename: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return rename === undefined ? undefined : { ...rename };\n}\n\nfunction validateRenameMap(rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const seenTargets = new Map<string, string>();\n\n for (const [upstreamName, targetPath] of Object.entries(rename)) {\n if (targetPath.length === 0) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`\n );\n }\n\n if (targetPath.split(\".\").some((segment) => segment.length === 0)) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": \"${targetPath}\" contains an empty segment.`\n );\n }\n\n const existingUpstreamName = seenTargets.get(targetPath);\n if (existingUpstreamName !== undefined) {\n throw new UserError(\n `Duplicate rename target \"${targetPath}\" for upstream tools \"${existingUpstreamName}\" and \"${upstreamName}\".`\n );\n }\n\n seenTargets.set(targetPath, upstreamName);\n }\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/toolcraft/src/index.ts\") ||\n candidate.includes(\"/packages/toolcraft/dist/index.js\") ||\n candidate.includes(\"/node_modules/toolcraft/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(\n parent: Requires<any> | undefined,\n child: Requires<any> | undefined\n): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check)\n };\n\n if (merged.auth === undefined && merged.apiVersion === undefined && merged.check === undefined) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n const candidates = Object.keys(env).filter(\n (candidate) => candidate !== secret.env && env[candidate] !== undefined\n );\n const suggestions = suggestSecretEnv(secret.env, candidates);\n const suggestionLine =\n suggestions.length > 0 ? `\\nDid you mean: ${suggestions.join(\", \")}?` : \"\";\n throw new UserError(`Missing required secret ${secret.env}${details}${suggestionLine}`);\n }\n\n Object.defineProperty(secrets, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return secrets;\n}\n\nfunction suggestSecretEnv(input: string, candidates: readonly string[]): string[] {\n const directSuggestions = suggest(input, candidates);\n if (!input.includes(\"_\")) {\n return directSuggestions;\n }\n\n const inputParts = input.split(\"_\");\n const firstPart = inputParts[0];\n const lastPart = inputParts[inputParts.length - 1];\n const relatedCandidates = candidates.filter((candidate) => {\n const candidateParts = candidate.split(\"_\");\n return (\n candidateParts[0] === firstPart && candidateParts[candidateParts.length - 1] === lastPart\n );\n });\n const expandedSuggestions = suggest(input, relatedCandidates, {\n threshold: Math.max(4, Math.floor(input.length / 4))\n });\n\n return [...new Set([...directSuggestions, ...expandedSuggestions])].slice(0, 3);\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child\n });\n}\n\nfunction resolveCommandScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n result: config.result,\n stream: undefined,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n humanInLoop: config.humanInLoop,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n result: config.result,\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath()\n } satisfies InternalCommandConfig\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(\n config: GroupConfig<TServices>\n): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(config.mcp),\n scope: cloneScope(config.scope),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n tools: cloneStringArray(config.tools),\n rename: cloneRenameMap(config.rename),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (\n command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig }\n )[commandConfigSymbol];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n result: internal.result,\n stream: command.stream,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, internal.humanInLoop),\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n result: internal.result,\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath\n } satisfies InternalCommandConfig\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath\n });\n\n return materialized;\n}\n\nfunction mergeInheritedMetadata<TServices extends object>(\n group: InternalGroupConfig<TServices>,\n inherited: InheritedMetadata\n): InheritedMetadata {\n return {\n scope: resolveGroupScope(group.scope, inherited.scope),\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, group.humanInLoop),\n secrets: mergeSecrets(inherited.secrets, group.secrets),\n requires: mergeRequires(inherited.requires, group.requires)\n };\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const mergedInherited = mergeInheritedMetadata(internal, inherited);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, mergedInherited)\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new ToolcraftBugError(\n `Default command \"${internal.default.name}\" must be listed in children.`\n );\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new ToolcraftBugError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: mergedInherited.scope,\n humanInLoop: mergedInherited.humanInLoop,\n secrets: mergedInherited.secrets,\n requires: mergedInherited.requires,\n children: materializedChildren,\n default: defaultChild\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(internal.mcp),\n scope: cloneScope(internal.scope),\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n tools: cloneStringArray(internal.tools),\n rename: cloneRenameMap(internal.rename),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<TParamsSchema> | null | undefined = undefined\n>(\n config: Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, TResult>,\n \"name\" | \"scope\" | \"humanInLoop\"\n > & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(\n createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>),\n {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }\n ) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function defineStreamCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TEventSchema extends AnySchema = AnySchema,\n TOwnScope extends ScopeInput = undefined\n>(\n config: Omit<\n StreamCommandConfig<TServices, TParamsSchema, TSecrets, TEventSchema>,\n \"name\" | \"scope\"\n > & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n ToolcraftStream<Static<TEventSchema>>,\n TOwnScope,\n undefined\n > {\n const command = defineCommand({\n ...config,\n confirm: false,\n humanInLoop: null,\n handler: config.handler as never,\n render: undefined\n } as never) as Command<\n TServices,\n TParamsSchema,\n TSecrets,\n AsyncIterable<Static<TEventSchema>>\n >;\n command.stream = {\n event: config.event,\n bufferSize: 1\n };\n command.render = config.render as never;\n return command as never;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<AnyObjectSchema> | null | undefined = undefined\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateRenameMap(config.rename);\n validateHumanInLoopOnDefine(config);\n\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }) as Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport function hasMcpProxyConfig(group: Group<any>): boolean {\n const configSymbol = Object.getOwnPropertySymbols(group).find(\n (candidate) => candidate.description === groupConfigSymbol.description\n );\n const config =\n configSymbol === undefined\n ? undefined\n : (group as unknown as Record<PropertyKey, InternalGroupConfig<any>>)[configSymbol];\n if (config?.mcp !== undefined) {\n return true;\n }\n\n const children = config?.children ?? group.children;\n return children.some(\n (child) => child.kind === \"group\" && hasMcpProxyConfig(child)\n );\n}\n\nexport { S, toJsonSchema } from \"toolcraft-schema\";\nexport {\n AuthenticationError,\n BadRequestError,\n ClientError,\n ConflictError,\n HttpError,\n InternalServerError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n UnprocessableEntityError,\n createHttpError\n} from \"./http-errors.js\";\nexport type { HttpErrorRequest, HttpErrorResponse } from \"./http-errors.js\";\nexport { ApprovalDeclinedError, ToolcraftBugError, UserError };\nexport { createRuntimeLogger, isLogLevel, shouldEmitDiagnostic } from \"./runtime-logging.js\";\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type {\n FileChangeRendererOptions,\n FileChangeResult\n} from \"./file-change-renderer.js\";\nexport type { FileChange, FileChangeDisplayMode, FileChangeKind } from \"toolcraft-design\";\nexport type {\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLogger,\n RuntimeLoggerInput\n} from \"./runtime-logging.js\";\nexport type {\n AnySchema,\n ArraySchema,\n BooleanSchema,\n EnumSchema,\n JsonSchema,\n NumberSchema,\n ObjectSchema,\n OptionalSchema,\n Static,\n StringSchema\n} from \"toolcraft-schema\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"UserError\";\n }\n}\n\nexport class ToolcraftBugError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ToolcraftBugError\";\n }\n}\n", "import type { HumanInLoopProvider } from \"@poe-code/agent-human-in-loop\";\nimport type { TaskList } from \"@poe-code/task-list\";\nimport type { ObjectSchema, Static } from \"toolcraft-schema\";\nimport { UserError } from \"../user-error.js\";\n\nexport interface HumanInLoopConfig<TParamsSchema extends ObjectSchema<any>> {\n mode: \"sync\" | \"async\";\n message: (ctx: { params: Static<TParamsSchema>; commandPath: string }) => string;\n plan?: (ctx: {\n params: Static<TParamsSchema>;\n commandPath: string;\n }) => unknown | Promise<unknown>;\n declineInputPrompt?: string;\n}\n\nexport interface HumanInLoopRuntimeOptions {\n provider?: HumanInLoopProvider;\n taskList?:\n | TaskList\n | {\n dir: string;\n format: \"markdown-dir\" | \"yaml-file\";\n };\n listName?: string;\n binPath?: {\n execPath: string;\n entryArgs: readonly string[];\n };\n}\n\nexport interface HumanInLoopPending {\n status: \"pending-approval\";\n approvalId: string;\n message: string;\n enqueuedAt: string;\n planHash?: string;\n}\n\nexport class ApprovalDeclinedError extends UserError {\n readonly reason?: string;\n readonly approvalId?: string;\n readonly commandPath: string;\n\n constructor(options: {\n commandPath: string;\n reason?: string;\n approvalId?: string;\n }) {\n super(options.reason === undefined ? \"Declined.\" : `Declined: ${options.reason}`);\n this.name = \"ApprovalDeclinedError\";\n this.reason = options.reason;\n this.approvalId = options.approvalId;\n this.commandPath = options.commandPath;\n }\n}\n\nexport type { HumanInLoopProvider } from \"@poe-code/agent-human-in-loop\";\n", "import type { ObjectSchema } from \"toolcraft-schema\";\nimport type { HumanInLoopConfig } from \"./types.js\";\n\ntype HumanInLoopValue<TParamsSchema extends ObjectSchema<any>> =\n | HumanInLoopConfig<TParamsSchema>\n | null\n | undefined;\n\nexport function validateHumanInLoopOnDefine<TParamsSchema extends ObjectSchema<any>>(config: {\n name: string;\n confirm?: boolean;\n children?: readonly unknown[];\n humanInLoop?: HumanInLoopValue<TParamsSchema>;\n}): void {\n const label = Array.isArray(config.children) ? \"group\" : \"command\";\n\n if (config.confirm === true && config.humanInLoop !== undefined && config.humanInLoop !== null) {\n throw new Error(`${label} '${config.name}': use either confirm or humanInLoop, not both`);\n }\n\n if (config.humanInLoop === undefined || config.humanInLoop === null) {\n return;\n }\n\n if (config.humanInLoop.mode !== \"sync\" && config.humanInLoop.mode !== \"async\") {\n throw new Error(`${label} '${config.name}': humanInLoop.mode must be \"sync\" or \"async\"`);\n }\n\n if (typeof config.humanInLoop.message !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.message must be a function`);\n }\n\n if (config.humanInLoop.plan !== undefined && typeof config.humanInLoop.plan !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.plan must be a function`);\n }\n}\n\nexport function mergeHumanInLoopFromGroup<\n TGroupParamsSchema extends ObjectSchema<any>,\n TChildParamsSchema extends ObjectSchema<any>,\n>(\n groupHumanInLoop: HumanInLoopValue<TGroupParamsSchema>,\n childHumanInLoop: HumanInLoopValue<TChildParamsSchema>\n): HumanInLoopValue<TChildParamsSchema> {\n if (childHumanInLoop !== undefined) {\n return childHumanInLoop;\n }\n\n return groupHumanInLoop as HumanInLoopValue<TChildParamsSchema>;\n}\n", "export function suggest(\n input: string,\n candidates: readonly string[],\n opts: { max?: number; threshold?: number } = {}\n): string[] {\n if (input.length === 0) {\n return [];\n }\n\n const max = opts.max ?? 3;\n const threshold = opts.threshold ?? Math.max(1, Math.floor(input.length / 4));\n\n return candidates\n .map((candidate) => ({\n candidate,\n distance: damerauLevenshtein(input, candidate)\n }))\n .filter(({ distance }) => distance <= threshold)\n .sort((left, right) => {\n if (left.distance !== right.distance) {\n return left.distance - right.distance;\n }\n\n return left.candidate.localeCompare(right.candidate);\n })\n .slice(0, max)\n .map(({ candidate }) => candidate);\n}\n\nfunction damerauLevenshtein(left: string, right: string): number {\n const distances = Array.from({ length: left.length + 1 }, () =>\n Array.from({ length: right.length + 1 }, () => 0)\n );\n\n for (let row = 0; row <= left.length; row += 1) {\n distances[row]![0] = row;\n }\n\n for (let column = 0; column <= right.length; column += 1) {\n distances[0]![column] = column;\n }\n\n for (let row = 1; row <= left.length; row += 1) {\n for (let column = 1; column <= right.length; column += 1) {\n const substitutionCost = left[row - 1] === right[column - 1] ? 0 : 1;\n const deletion = distances[row - 1]![column]! + 1;\n const insertion = distances[row]![column - 1]! + 1;\n const substitution = distances[row - 1]![column - 1]! + substitutionCost;\n\n distances[row]![column] = Math.min(deletion, insertion, substitution);\n\n if (\n row > 1 &&\n column > 1 &&\n left[row - 1] === right[column - 2] &&\n left[row - 2] === right[column - 1]\n ) {\n distances[row]![column] = Math.min(\n distances[row]![column]!,\n distances[row - 2]![column - 2]! + 1\n );\n }\n }\n }\n\n return distances[left.length]![right.length]!;\n}\n", "import { validate, type AnySchema, type Static } from \"toolcraft-schema\";\nimport { UserError } from \"./user-error.js\";\n\nexport type StreamStatusType = \"connected\" | \"progress\" | \"reconnecting\";\n\nexport interface StreamStatusEvent {\n type: StreamStatusType;\n message?: string;\n}\n\nexport interface StreamConsumerOptions {\n signal?: AbortSignal;\n onStatus?: (event: StreamStatusEvent) => void;\n}\n\nexport interface ToolcraftStream<TEvent> extends AsyncIterable<TEvent> {\n readonly signal: AbortSignal;\n cancel(reason?: unknown): Promise<void>;\n}\n\nexport interface ManagedStreamOptions<TSchema extends AnySchema> extends StreamConsumerOptions {\n eventSchema: TSchema;\n create(signal: AbortSignal, status: (event: StreamStatusEvent) => void): Promise<AsyncIterable<Static<TSchema>>>;\n}\n\nfunction validationMessage(schema: AnySchema, value: unknown): string | undefined {\n const result = validate(schema, value);\n return result.ok ? undefined : result.issues.map((issue) => issue.message).join(\"; \");\n}\n\nexport function createManagedStream<TSchema extends AnySchema>(\n options: ManagedStreamOptions<TSchema>\n): ToolcraftStream<Static<TSchema>> {\n const controller = new AbortController();\n let iterator: AsyncIterator<Static<TSchema>> | undefined;\n let iteratorPromise: Promise<AsyncIterator<Static<TSchema>>> | undefined;\n let closePromise: Promise<void> | undefined;\n let done = false;\n\n const getIterator = async (): Promise<AsyncIterator<Static<TSchema>>> => {\n if (iterator !== undefined) {\n return iterator;\n }\n iteratorPromise ??= options\n .create(controller.signal, (event) => options.onStatus?.(event))\n .then((iterable) => iterable[Symbol.asyncIterator]());\n iterator = await iteratorPromise;\n return iterator;\n };\n\n const close = async (reason?: unknown): Promise<void> => {\n if (closePromise !== undefined) {\n return closePromise;\n }\n closePromise = (async () => {\n controller.abort(reason);\n options.signal?.removeEventListener(\"abort\", abortFromConsumer);\n if (done || (iterator === undefined && iteratorPromise === undefined)) {\n done = true;\n return;\n }\n const activeIterator = await getIterator();\n done = true;\n await activeIterator.return?.();\n })();\n return closePromise;\n };\n\n const abortFromConsumer = (): void => {\n void close(options.signal?.reason);\n };\n if (options.signal?.aborted === true) {\n abortFromConsumer();\n } else {\n options.signal?.addEventListener(\"abort\", abortFromConsumer, { once: true });\n }\n\n const stream: ToolcraftStream<Static<TSchema>> = {\n signal: controller.signal,\n cancel: close,\n [Symbol.asyncIterator](): AsyncIterator<Static<TSchema>> {\n return {\n async next() {\n if (done || controller.signal.aborted) {\n await close(controller.signal.reason);\n return { done: true, value: undefined };\n }\n const activeIterator = await getIterator();\n let result: IteratorResult<Static<TSchema>>;\n try {\n result = await activeIterator.next();\n } catch (error) {\n await close(error);\n throw error;\n }\n if (result.done === true) {\n done = true;\n options.signal?.removeEventListener(\"abort\", abortFromConsumer);\n return { done: true, value: undefined };\n }\n const message = validationMessage(options.eventSchema, result.value);\n if (message !== undefined) {\n await close(new UserError(message));\n throw new UserError(message);\n }\n return { done: false, value: result.value };\n },\n async return() {\n await close();\n return { done: true, value: undefined };\n },\n async throw(error?: unknown) {\n await close(error);\n throw error;\n }\n };\n }\n };\n\n return stream;\n}\n", "export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DiagnosticLogEvent {\n level: Exclude<LogLevel, \"silent\">;\n message: string;\n category?: \"runtime\" | \"http\" | \"auth\" | \"retry\" | \"progress\";\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeLogger {\n level: LogLevel;\n emit(event: DiagnosticLogEvent): void;\n}\n\nexport type RuntimeLoggerInput = RuntimeLogger | ((event: DiagnosticLogEvent) => void);\n\nconst LOG_LEVEL_RANK = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5\n} as const satisfies Record<LogLevel, number>;\n\nexport const LOG_LEVELS = Object.freeze([\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n \"trace\"\n] as const satisfies readonly LogLevel[]);\n\nexport function isLogLevel(value: string): value is LogLevel {\n return (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport function shouldEmitDiagnostic(eventLevel: LogLevel, configuredLevel: LogLevel): boolean {\n if (eventLevel === \"silent\" || configuredLevel === \"silent\") {\n return false;\n }\n\n return LOG_LEVEL_RANK[eventLevel] <= LOG_LEVEL_RANK[configuredLevel];\n}\n\nexport function createRuntimeLogger(\n options: {\n level?: LogLevel;\n logger?: RuntimeLoggerInput;\n } = {}\n): RuntimeLogger {\n const level = options.level ?? \"warn\";\n const sink = options.logger;\n\n return {\n level,\n emit(event): void {\n if (!shouldEmitDiagnostic(event.level, level)) {\n return;\n }\n\n if (typeof sink === \"function\") {\n sink(event);\n return;\n }\n\n sink?.emit(event);\n }\n };\n}\n", "import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageMetadata {\n name?: string;\n path: string;\n version?: string;\n}\n\ntype PackageMetadataInput = string | URL;\n\nfunction pathFromInput(from: PackageMetadataInput): string {\n if (from instanceof URL) {\n return fileURLToPath(from);\n }\n\n if (from.startsWith(\"file:\")) {\n return fileURLToPath(from);\n }\n\n return path.resolve(from);\n}\n\nfunction getSearchDirectory(from: PackageMetadataInput): string {\n const resolved = pathFromInput(from);\n let searchPath = resolved;\n\n try {\n searchPath = realpathSync(resolved);\n } catch {\n searchPath = resolved;\n }\n\n try {\n return statSync(searchPath).isDirectory() ? searchPath : path.dirname(searchPath);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import { mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { CommanderError } from \"commander\";\nimport type { AnySchema } from \"toolcraft-schema\";\nimport type { Command, SecretDeclarations } from \"./index.js\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport { findPackageMetadata } from \"./package-metadata.js\";\nimport { findProjectRoot } from \"./project-root.js\";\nimport { isSensitiveName, redactHttpBody, redactHttpHeaderValue } from \"./redaction.js\";\nimport { UserError } from \"./user-error.js\";\n\nconst ERROR_REPORTS_ENV = \"TOOLCRAFT_ERROR_REPORTS\";\n\nexport type ErrorReportsOption = boolean | { dir?: string };\n\nexport interface ErrorReportContext {\n argv?: readonly string[];\n command?: Command<any, any, any, any>;\n commandPath?: string;\n env?: Record<string, string | undefined>;\n error: unknown;\n errorReports?: ErrorReportsOption;\n params?: unknown;\n projectRoot?: string;\n secrets?: Record<string, string | undefined>;\n version?: string;\n}\n\nexport interface ErrorReportResult {\n absolutePath: string;\n displayPath: string;\n}\n\nexport type ErrorReportRenderContext = Omit<\n ErrorReportContext,\n \"errorReports\" | \"projectRoot\"\n>;\n\nexport interface ErrorReportRenderResult {\n content: string;\n redactedKeys: string[];\n}\n\ninterface HttpErrorLike {\n name: \"HttpError\";\n message: string;\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n };\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\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 unwrapOptional(schema: AnySchema): AnySchema {\n if (schema.kind === \"optional\") {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction hasHttpContext(error: unknown): error is HttpErrorLike {\n return (\n error instanceof Error &&\n error.name === \"HttpError\" &&\n isPlainObject((error as { request?: unknown }).request) &&\n isPlainObject((error as { response?: unknown }).response)\n );\n}\n\nfunction isSkippedError(error: unknown): boolean {\n if (error instanceof ApprovalDeclinedError) {\n return true;\n }\n\n if (\n error instanceof CommanderError &&\n (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\")\n ) {\n return true;\n }\n\n return error instanceof UserError && error.cause === undefined && !hasHttpContext(error);\n}\n\nfunction reportsEnabled(\n option: ErrorReportsOption | undefined,\n env: Record<string, string | undefined>\n): boolean {\n if (env[ERROR_REPORTS_ENV] === \"1\") {\n return true;\n }\n\n return option !== undefined && option !== false;\n}\n\nfunction resolveReportDir(option: ErrorReportsOption | undefined, projectRoot: string): string {\n const configuredDir = typeof option === \"object\" ? option.dir : undefined;\n\n if (configuredDir === undefined || configuredDir.length === 0) {\n return path.join(projectRoot, \".toolcraft\", \"errors\");\n }\n\n return path.isAbsolute(configuredDir) ? configuredDir : path.join(projectRoot, configuredDir);\n}\n\nfunction reportDirMustStayWithinProject(option: ErrorReportsOption | undefined): boolean {\n const configuredDir = typeof option === \"object\" ? option.dir : undefined;\n return configuredDir === undefined || configuredDir.length === 0 || !path.isAbsolute(configuredDir);\n}\n\nfunction isWithinDirectory(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return relative === \"\" || (!path.isAbsolute(relative) && relative !== \"..\" && !relative.startsWith(`..${path.sep}`));\n}\n\nasync function assertReportDirWithinProject(projectRoot: string, reportDir: string): Promise<void> {\n if (!isWithinDirectory(path.resolve(projectRoot), path.resolve(reportDir))) {\n throw new Error(\"Error report directory resolves outside project root.\");\n }\n\n const [canonicalProjectRoot, canonicalReportDir] = await Promise.all([\n realpath(projectRoot),\n realpath(reportDir)\n ]);\n\n if (!isWithinDirectory(canonicalProjectRoot, canonicalReportDir)) {\n throw new Error(\"Error report directory resolves outside project root.\");\n }\n}\n\nfunction resolveProjectRoot(projectRoot: string | undefined): string {\n if (projectRoot !== undefined) {\n return projectRoot;\n }\n\n return findProjectRoot() ?? os.tmpdir();\n}\n\nfunction formatTimestamp(date: Date): string {\n const isoMinute = date.toISOString().slice(0, 16);\n const colonIndex = isoMinute.indexOf(\":\");\n\n if (colonIndex === -1) {\n return isoMinute;\n }\n\n return `${isoMinute.slice(0, colonIndex)}${isoMinute.slice(colonIndex + 1)}`;\n}\n\nfunction slugifyCommandPath(commandPath: string | undefined): string {\n const source = commandPath === undefined || commandPath.length === 0 ? \"root\" : commandPath;\n let output = \"\";\n let previousWasDash = false;\n\n for (const char of source) {\n const lower = char.toLowerCase();\n const isWord = (lower >= \"a\" && lower <= \"z\") || (lower >= \"0\" && lower <= \"9\");\n\n if (isWord) {\n output += lower;\n previousWasDash = false;\n continue;\n }\n\n if (!previousWasDash) {\n output += \"-\";\n previousWasDash = true;\n }\n }\n\n while (output.startsWith(\"-\")) {\n output = output.slice(1);\n }\n\n while (output.endsWith(\"-\")) {\n output = output.slice(0, -1);\n }\n\n return output.length === 0 ? \"root\" : output;\n}\n\nfunction relativeDisplayPath(projectRoot: string, absolutePath: string): string {\n const relative = path.relative(projectRoot, absolutePath);\n return relative.length === 0 || relative.startsWith(\"..\") ? absolutePath : relative;\n}\n\nfunction redactValue(value: string | undefined): string {\n if (value === undefined) {\n return \"<unset>\";\n }\n\n return `<set, ${value.length} chars>`;\n}\n\nfunction collectStringLeaves(value: unknown, output: Set<string>): void {\n if (typeof value === \"string\") {\n if (value.length > 0) {\n output.add(value);\n }\n return;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectStringLeaves(entry, output);\n }\n return;\n }\n\n if (isPlainObject(value)) {\n for (const entry of Object.values(value)) {\n collectStringLeaves(entry, output);\n }\n }\n}\n\nfunction schemaSecretValue(schema: AnySchema): boolean | undefined {\n const unwrapped = unwrapOptional(schema);\n\n if (unwrapped.kind === \"string\" || unwrapped.kind === \"number\") {\n return (unwrapped as { secret?: boolean }).secret;\n }\n\n return undefined;\n}\n\nfunction shouldRedactParam(name: string, schema: AnySchema): boolean {\n const secret = schemaSecretValue(schema);\n\n if (secret !== undefined) {\n return secret;\n }\n\n return isSensitiveName(name);\n}\n\nfunction redactParamsValue(value: unknown, schema: AnySchema, name: string): unknown {\n if (shouldRedactParam(name, schema)) {\n return \"<redacted>\";\n }\n\n const unwrapped = unwrapOptional(schema);\n\n if (unwrapped.kind === \"object\" && isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, childValue]) => {\n const childSchema = unwrapped.shape[key];\n return [\n key,\n childSchema === undefined ? childValue : redactParamsValue(childValue, childSchema, key)\n ];\n })\n );\n }\n\n if (unwrapped.kind === \"array\" && Array.isArray(value)) {\n return value.map((entry) => redactParamsValue(entry, unwrapped.item, name));\n }\n\n return value;\n}\n\nfunction redactParams(params: unknown, command: Command<any, any, any, any> | undefined): unknown {\n if (command === undefined) {\n return params;\n }\n\n return redactParamsValue(params, command.params, \"\");\n}\n\nfunction collectSensitiveParamValues(\n value: unknown,\n schema: AnySchema,\n name: string,\n output: Set<string>\n): void {\n if (shouldRedactParam(name, schema)) {\n collectStringLeaves(value, output);\n return;\n }\n\n const unwrapped = unwrapOptional(schema);\n\n if (unwrapped.kind === \"object\" && isPlainObject(value)) {\n for (const [key, childValue] of Object.entries(value)) {\n const childSchema = unwrapped.shape[key];\n if (childSchema !== undefined) {\n collectSensitiveParamValues(childValue, childSchema, key, output);\n }\n }\n return;\n }\n\n if (unwrapped.kind === \"array\" && Array.isArray(value)) {\n for (const entry of value) {\n collectSensitiveParamValues(entry, unwrapped.item, name, output);\n }\n }\n}\n\nfunction createReportStringRedactor(\n context: ErrorReportRenderContext,\n env: Record<string, string | undefined>\n): (value: string) => string {\n const values = new Set<string>();\n\n for (const value of Object.values(context.secrets ?? {})) {\n if (value !== undefined && value.length > 0) {\n values.add(value);\n }\n }\n\n for (const [name, secret] of Object.entries(context.command?.secrets ?? {})) {\n const value = context.secrets?.[name] ?? env[secret.env];\n if (value !== undefined && value.length > 0) {\n values.add(value);\n }\n }\n\n if (context.command !== undefined) {\n collectSensitiveParamValues(context.params, context.command.params, \"\", values);\n }\n\n const orderedValues = [...values].sort((left, right) => right.length - left.length);\n\n return (value: string): string => {\n let redacted = value;\n for (const secretValue of orderedValues) {\n redacted = redacted.split(secretValue).join(\"<redacted>\");\n }\n return redacted;\n };\n}\n\nfunction commandSecretEnvNames(secrets: SecretDeclarations | undefined): string[] {\n if (secrets === undefined) {\n return [];\n }\n\n return Object.values(secrets).map((secret) => secret.env);\n}\n\nfunction redactArgv(\n argv: readonly string[] | undefined,\n options: {\n command?: Command<any, any, any, any>;\n secrets?: Record<string, string | undefined>;\n }\n): string[] {\n if (argv === undefined) {\n return [];\n }\n\n const secretValues = new Set(\n Object.values(options.secrets ?? {}).filter(\n (value): value is string => value !== undefined && value.length > 0\n )\n );\n const secretNames = new Set([\n ...Object.keys(options.secrets ?? {}),\n ...commandSecretEnvNames(options.command?.secrets)\n ]);\n const output: string[] = [];\n let redactNext = false;\n\n for (const arg of argv) {\n if (redactNext) {\n output.push(\"<redacted>\");\n redactNext = false;\n continue;\n }\n\n const equalsIndex = arg.indexOf(\"=\");\n const optionName = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex);\n const normalizedOptionName = optionName.replaceAll(\"-\", \"\");\n const sensitiveByName =\n isSensitiveName(normalizedOptionName) ||\n [...secretNames].some((name) =>\n normalizedOptionName.toLowerCase().includes(name.toLowerCase())\n );\n\n if (equalsIndex !== -1 && sensitiveByName) {\n output.push(`${optionName}=<redacted>`);\n continue;\n }\n\n if (arg.startsWith(\"-\") && sensitiveByName) {\n output.push(arg);\n redactNext = true;\n continue;\n }\n\n let redactedArg = arg;\n for (const secretValue of secretValues) {\n redactedArg = redactedArg.split(secretValue).join(\"<redacted>\");\n }\n output.push(redactedArg);\n }\n\n return output;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(value, null, 2) ?? \"undefined\";\n}\n\nfunction redactStructuredErrorField(\n name: string,\n value: unknown,\n redactString: (value: string) => string\n): unknown {\n if (typeof value === \"string\") {\n const redactedHeaderValue = redactHttpHeaderValue(name, value);\n if (redactedHeaderValue !== value) {\n return redactedHeaderValue;\n }\n\n if (isSensitiveName(name)) {\n return \"<redacted>\";\n }\n\n return redactString(value);\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => redactStructuredErrorField(name, entry, redactString));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactStructuredErrorField(key, entry, redactString)\n ])\n );\n }\n\n return value;\n}\n\nfunction ownStructuredFields(\n error: Error,\n redactString: (value: string) => string\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n\n for (const key of Object.keys(error)) {\n if (key === \"name\" || key === \"message\" || key === \"stack\" || key === \"cause\") {\n continue;\n }\n\n Object.defineProperty(fields, key, {\n value: redactStructuredErrorField(\n key,\n (error as unknown as Record<string, unknown>)[key],\n redactString\n ),\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return fields;\n}\n\nfunction formatStackChain(error: unknown, redactString: (value: string) => string): string {\n const lines: string[] = [];\n let current: unknown = error;\n let index = 0;\n\n while (current !== undefined) {\n if (current instanceof Error) {\n const stack = current.stack ?? String(current);\n lines.push(redactString(index === 0 ? stack : `Caused by: ${stack}`));\n current = current.cause;\n } else {\n const message = String(current);\n lines.push(redactString(index === 0 ? message : `Caused by: ${message}`));\n current = undefined;\n }\n\n index += 1;\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatHeaderValue(\n name: string,\n value: string,\n redactString: (value: string) => string\n): string {\n return redactString(redactHttpHeaderValue(name, value));\n}\n\nfunction formatHeaders(\n headers: Record<string, string>,\n redactString: (value: string) => string\n): string {\n return Object.entries(headers)\n .map(([name, value]) => `${name}: ${formatHeaderValue(name, value, redactString)}`)\n .join(\"\\n\");\n}\n\nfunction formatBody(body: unknown, redactString: (value: string) => string): string {\n const redactedBody = redactHttpBody(body);\n\n if (typeof redactedBody === \"string\") {\n return redactString(redactedBody);\n }\n\n return redactString(stableJson(redactedBody));\n}\n\nfunction formatHttpTranscript(\n error: HttpErrorLike,\n redactString: (value: string) => string\n): string {\n const requestLines = [\n `${error.request.method} ${error.request.url}`,\n formatHeaders(error.request.headers, redactString)\n ].filter((line) => line.length > 0);\n\n if (error.request.body !== undefined) {\n requestLines.push(\"\", formatBody(error.request.body, redactString));\n }\n\n return [\n \"Request:\",\n ...requestLines,\n \"\",\n \"Response:\",\n `${error.response.status} ${error.response.statusText}`,\n formatHeaders(error.response.headers, redactString),\n \"\",\n formatBody(error.response.body, redactString)\n ].join(\"\\n\");\n}\n\nfunction resolveToolcraftVersion(version: string | undefined): string {\n return (\n version ??\n findPackageMetadata(new URL(\"./error-report.ts\", import.meta.url))?.version ??\n \"unknown\"\n );\n}\n\nfunction buildReport(context: ErrorReportRenderContext): string {\n const env = context.env ?? process.env;\n const error = context.error;\n const redactString = createReportStringRedactor(context, env);\n const errorName = error instanceof Error ? error.name : typeof error;\n const errorMessage = redactString(error instanceof Error ? error.message : String(error));\n const structuredFields = error instanceof Error ? ownStructuredFields(error, redactString) : {};\n const secretLines = Object.entries(context.command?.secrets ?? {}).map(([name, secret]) => {\n const value = context.secrets?.[name] ?? env[secret.env];\n return `${secret.env}=${redactValue(value)}`;\n });\n const lines = [\n \"Toolcraft Error Report\",\n \"\",\n \"Runtime\",\n `toolcraft version: ${resolveToolcraftVersion(context.version)}`,\n `node version: ${process.version}`,\n `platform: ${process.platform} ${process.arch}`,\n \"\",\n \"Argv\",\n redactString(\n stableJson(redactArgv(context.argv, { command: context.command, secrets: context.secrets }))\n ),\n \"\",\n \"Resolved Secrets\",\n ...(secretLines.length === 0 ? [\"<none>\"] : secretLines),\n \"\",\n \"Command Path\",\n context.commandPath === undefined || context.commandPath.length === 0\n ? \"root\"\n : context.commandPath,\n \"\",\n \"Parsed Params\",\n redactString(stableJson(redactParams(context.params, context.command))),\n \"\",\n \"Error\",\n `name: ${errorName}`,\n `message: ${errorMessage}`,\n \"structured fields:\",\n redactString(stableJson(structuredFields)),\n \"\",\n \"Stack\",\n formatStackChain(error, redactString)\n ];\n\n if (hasHttpContext(error)) {\n lines.push(\"\", \"HTTP Transcript\", formatHttpTranscript(error, redactString));\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Renders the exact redacted content used by `writeErrorReport` without checking report enablement\n * or writing to the filesystem. `redactedKeys` lists every environment variable declared by the\n * command's secrets in declaration order, including variables that are currently unset.\n */\nexport function renderErrorReport(\n context: ErrorReportRenderContext\n): ErrorReportRenderResult {\n return {\n content: buildReport(context),\n redactedKeys: commandSecretEnvNames(context.command?.secrets)\n };\n}\n\nexport async function writeErrorReport(\n context: ErrorReportContext\n): Promise<ErrorReportResult | undefined> {\n const env = context.env ?? process.env;\n\n if (!reportsEnabled(context.errorReports, env) || isSkippedError(context.error)) {\n return undefined;\n }\n\n const projectRoot = resolveProjectRoot(context.projectRoot);\n const reportDir = resolveReportDir(context.errorReports, projectRoot);\n const fileName = `${formatTimestamp(new Date())}-${slugifyCommandPath(context.commandPath)}-${randomUUID()}.log`;\n const absolutePath = path.join(reportDir, fileName);\n\n await mkdir(reportDir, { recursive: true });\n if (reportDirMustStayWithinProject(context.errorReports)) {\n await assertReportDirWithinProject(projectRoot, reportDir);\n }\n await writeFile(absolutePath, renderErrorReport(context).content);\n\n return {\n absolutePath,\n displayPath: relativeDisplayPath(projectRoot, absolutePath)\n };\n}\n\nexport { hasHttpContext };\n", "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport function findProjectRoot(from: string = process.cwd()): string | undefined {\n let current = from === process.cwd() ? process.cwd() : path.resolve(from);\n\n while (true) {\n if (existsSync(path.join(current, \"package.json\"))) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n", "const REDACTED_VALUE = \"<redacted>\";\nconst SENSITIVE_NAME_PARTS = [\"password\", \"token\", \"apikey\", \"secret\"];\nconst AUTHORIZATION_HEADER_NAMES = new Set([\"authorization\", \"proxyauthorization\"]);\nconst SECRET_HEADER_NAMES = new Set([\"cookie\", \"setcookie\"]);\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeName(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nexport function isSensitiveName(name: string): boolean {\n const normalized = normalizeName(name);\n return SENSITIVE_NAME_PARTS.some((candidate) => normalized.includes(candidate));\n}\n\nfunction redactSecretLikeFieldsValue(\n value: unknown,\n name: string,\n seen: WeakSet<object>\n): unknown {\n if (name.length > 0 && isSensitiveName(name)) {\n return REDACTED_VALUE;\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n return value.map((entry) => redactSecretLikeFieldsValue(entry, name, seen));\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactSecretLikeFieldsValue(entry, key, seen)\n ])\n );\n }\n\n return value;\n}\n\nexport function redactSecretLikeFields(value: unknown, name = \"\"): unknown {\n return redactSecretLikeFieldsValue(value, name, new WeakSet<object>());\n}\n\nfunction parseJsonObjectOrArray(value: string): unknown | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return isPlainObject(parsed) || Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function redactHttpBody(body: unknown): unknown {\n if (typeof body === \"string\") {\n const parsed = parseJsonObjectOrArray(body);\n return parsed === undefined ? body : redactSecretLikeFields(parsed);\n }\n\n return redactSecretLikeFields(body);\n}\n\nexport function redactHttpHeaderValue(name: string, value: string): string {\n const normalized = normalizeName(name);\n\n if (AUTHORIZATION_HEADER_NAMES.has(normalized)) {\n return \"Bearer ****\";\n }\n\n if (SECRET_HEADER_NAMES.has(normalized) || isSensitiveName(name)) {\n return REDACTED_VALUE;\n }\n\n return value;\n}\n", "import type { NumberSchema } from \"toolcraft-schema\";\n\nexport function isValidNumberSchemaValue(value: unknown, schema: NumberSchema): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value)) &&\n (schema.minimum === undefined || value >= schema.minimum) &&\n (schema.maximum === undefined || value <= schema.maximum)\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n const type = schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n const bounds = [\n schema.minimum === undefined ? undefined : `greater than or equal to ${schema.minimum}`,\n schema.maximum === undefined ? undefined : `less than or equal to ${schema.maximum}`\n ].filter((bound): bound is string => bound !== undefined);\n\n return bounds.length === 0 ? type : `${type} ${bounds.join(\" and \")}`;\n}\n", "import { redactHttpBody } from \"./redaction.js\";\n\nexport interface HttpErrorLike {\n name: string;\n message: string;\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n };\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\n };\n}\n\nexport interface ApiErrorSummary {\n status: number;\n statusText: string;\n requestMethod: string;\n requestUrl: string;\n requestId?: string;\n code?: string;\n message?: string;\n fieldErrors?: Array<{ path: string; message: string }>;\n retryAfter?: string;\n hint?: string;\n}\n\nexport interface ToolcraftErrorEnvelope {\n kind: \"http\";\n message: string;\n code?: string;\n requestId?: string;\n http: {\n method: string;\n url: string;\n status: number;\n statusText: string;\n };\n fieldErrors?: Array<{ path: string; message: string }>;\n retryAfter?: string;\n hint?: string;\n reportPath?: string;\n}\n\nconst REQUEST_ID_FIELDS = [\"request_id\", \"requestId\", \"id\"];\nconst CODE_FIELDS = [\"code\", \"error_code\", \"errorCode\", \"error\"];\nconst MESSAGE_FIELDS = [\"message\", \"detail\", \"title\", \"error_description\"];\n\nexport function isHttpErrorLike(error: unknown): error is HttpErrorLike {\n if (!isPlainObject(error)) {\n return false;\n }\n\n if (typeof error.name !== \"string\" || typeof error.message !== \"string\") {\n return false;\n }\n\n const request = error.request;\n const response = error.response;\n\n return (\n isPlainObject(request) &&\n typeof request.method === \"string\" &&\n typeof request.url === \"string\" &&\n isStringRecord(request.headers) &&\n isPlainObject(response) &&\n typeof response.status === \"number\" &&\n typeof response.statusText === \"string\" &&\n isStringRecord(response.headers) &&\n hasOwnProperty(response, \"body\")\n );\n}\n\nexport function summarizeHttpError(error: HttpErrorLike): ApiErrorSummary {\n const body = redactHttpBody(error.response.body);\n const retryAfter = getHeader(error.response.headers, \"retry-after\");\n const message = extractMessage(body);\n const summary: ApiErrorSummary = {\n status: error.response.status,\n statusText: error.response.statusText,\n requestMethod: error.request.method,\n requestUrl: error.request.url,\n ...(message === undefined ? {} : { message }),\n ...optionalString(\"requestId\", getHeader(error.response.headers, \"x-request-id\") ?? extractFirstString(body, REQUEST_ID_FIELDS)),\n ...optionalString(\"code\", extractCode(body)),\n ...optionalString(\"retryAfter\", retryAfter),\n ...optionalArray(\"fieldErrors\", extractFieldErrors(body)),\n ...optionalString(\"hint\", createHttpErrorHint(error.response.status, retryAfter))\n };\n\n return summary;\n}\n\nexport function createHttpErrorEnvelope(\n error: HttpErrorLike,\n reportPath?: string\n): ToolcraftErrorEnvelope {\n const summary = summarizeHttpError(error);\n return {\n kind: \"http\",\n message: summary.message ?? error.message,\n ...(summary.code === undefined ? {} : { code: summary.code }),\n ...(summary.requestId === undefined ? {} : { requestId: summary.requestId }),\n http: {\n method: summary.requestMethod,\n url: summary.requestUrl,\n status: summary.status,\n statusText: summary.statusText\n },\n ...(summary.fieldErrors === undefined ? {} : { fieldErrors: summary.fieldErrors }),\n ...(summary.retryAfter === undefined ? {} : { retryAfter: summary.retryAfter }),\n ...(summary.hint === undefined ? {} : { hint: summary.hint }),\n ...(reportPath === undefined ? {} : { reportPath })\n };\n}\n\nfunction createHttpErrorHint(status: number, retryAfter: string | undefined): string | undefined {\n if (status === 401 || status === 403) {\n return \"Check the configured API credentials and permissions.\";\n }\n\n if ((status === 429 || status === 503) && retryAfter !== undefined) {\n return `Retry after ${retryAfter}.`;\n }\n\n return undefined;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n const graphqlMessage = extractGraphQlMessage(body);\n if (graphqlMessage !== undefined) {\n return graphqlMessage;\n }\n\n return extractFirstString(body, MESSAGE_FIELDS);\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n const graphqlCode = extractGraphQlCode(body);\n if (graphqlCode !== undefined) {\n return graphqlCode;\n }\n\n return extractFirstString(body, CODE_FIELDS);\n}\n\nfunction extractGraphQlMessage(body: Record<string, unknown>): string | undefined {\n const [first] = Array.isArray(body.errors) ? body.errors : [];\n return isPlainObject(first) && typeof first.message === \"string\" ? first.message : undefined;\n}\n\nfunction extractGraphQlCode(body: Record<string, unknown>): string | undefined {\n const [first] = Array.isArray(body.errors) ? body.errors : [];\n if (!isPlainObject(first) || !isPlainObject(first.extensions)) {\n return undefined;\n }\n\n return typeof first.extensions.code === \"string\" ? first.extensions.code : undefined;\n}\n\nfunction extractFieldErrors(body: unknown): Array<{ path: string; message: string }> | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n const candidates = [body.field_errors, body.fieldErrors, body.errors, body.non_field_errors];\n const flattened = candidates.flatMap((candidate) => flattenFieldErrors(candidate, []));\n return flattened.length === 0 ? undefined : flattened;\n}\n\nfunction flattenFieldErrors(value: unknown, path: string[]): Array<{ path: string; message: string }> {\n if (typeof value === \"string\") {\n return [{ path: formatPath(path), message: value }];\n }\n\n if (Array.isArray(value)) {\n if (value.every((entry) => typeof entry === \"string\")) {\n return value.map((message) => ({ path: formatPath(path), message }));\n }\n\n return value.flatMap((entry, index) => flattenFieldErrors(entry, [...path, String(index)]));\n }\n\n if (!isPlainObject(value)) {\n return [];\n }\n\n return Object.entries(value).flatMap(([key, nested]) => flattenFieldErrors(nested, [...path, key]));\n}\n\nfunction formatPath(path: string[]): string {\n return path.length === 0 ? \"error\" : path.join(\".\");\n}\n\nfunction extractFirstString(\n body: unknown,\n fields: readonly string[]\n): string | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n for (const field of fields) {\n const value = body[field];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction getHeader(headers: Record<string, string>, name: string): string | undefined {\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === lowerName && value.length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction optionalString<Name extends string>(\n name: Name,\n value: string | undefined\n): Record<Name, string> | Record<string, never> {\n return value === undefined ? {} : { [name]: value } as Record<Name, string>;\n}\n\nfunction optionalArray<Name extends string, TValue>(\n name: Name,\n value: TValue[] | undefined\n): Record<Name, TValue[]> | Record<string, never> {\n return value === undefined ? {} : { [name]: value } as Record<Name, TValue[]>;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isPlainObject(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n", "import YAML from \"yaml\";\nimport { renderDetailCard } from \"toolcraft-design\";\nimport type { Command, RenderPrimitives } from \"./index.js\";\n\nexport type OutputMode = \"rich\" | \"md\" | \"json\";\n\ntype WriteStream = \"stdout\" | \"stderr\";\ntype WriteFn = (chunk: string, stream?: WriteStream) => void;\n\nexport interface RenderResultStatus {\n mcpError: boolean;\n}\n\ninterface McpCallToolResult {\n content?: unknown[];\n structuredContent?: unknown;\n isError?: boolean;\n _meta?: unknown;\n}\n\ninterface McpTextContent {\n type: \"text\";\n text: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isMcpCallToolResult(value: unknown): value is McpCallToolResult {\n if (!isObject(value)) {\n return false;\n }\n\n const hasContent = Array.isArray(value.content);\n const hasStructured = value.structuredContent !== undefined;\n if (!hasContent && !hasStructured) {\n return false;\n }\n\n return Object.keys(value).every(\n (key) =>\n key === \"content\" || key === \"structuredContent\" || key === \"isError\" || key === \"_meta\"\n );\n}\n\nfunction isMcpTextContent(value: unknown): value is McpTextContent {\n return isObject(value) && value.type === \"text\" && typeof value.text === \"string\";\n}\n\nfunction extractMcpPayload(envelope: McpCallToolResult): unknown {\n const structuredContent = envelope.structuredContent;\n if (isObject(structuredContent) && \"result\" in structuredContent) {\n return structuredContent.result;\n }\n\n if (structuredContent !== undefined) {\n return structuredContent;\n }\n\n if (Array.isArray(envelope.content)) {\n const text = envelope.content\n .filter(isMcpTextContent)\n .map((block) => block.text)\n .join(\"\\n\");\n\n return text.length > 0 ? text : undefined;\n }\n\n return undefined;\n}\n\nfunction unwrapMcpEnvelope(result: unknown): { result: unknown; mcpError: boolean } {\n if (!isMcpCallToolResult(result)) {\n return { result, mcpError: false };\n }\n\n return {\n result: extractMcpPayload(result),\n mcpError: result.isError === true,\n };\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 isNonEmptyArrayOfObjects(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.length > 0 && 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 humanizeKey(key: string): string {\n let output = \"\";\n let capitalizeNext = true;\n\n for (const char of key) {\n if (char === \"_\" || char === \"-\") {\n output += \" \";\n capitalizeNext = false;\n continue;\n }\n\n if (char >= \"A\" && char <= \"Z\" && output.length > 0 && !output.endsWith(\" \")) {\n output += \" \";\n }\n\n if (capitalizeNext) {\n output += char.toUpperCase();\n capitalizeNext = false;\n continue;\n }\n\n output += char;\n }\n\n return output;\n}\n\nfunction detailRows(\n result: Record<string, unknown>,\n depth = 0\n): Array<{ label: string; value: string }> {\n const rows: Array<{ label: string; value: string }> = [];\n\n for (const [key, value] of Object.entries(result)) {\n const label = `${\" \".repeat(depth)}${humanizeKey(key)}`;\n\n if (isObject(value)) {\n if (Object.keys(value).length === 0) {\n rows.push({ label, value: \"{}\" });\n continue;\n }\n\n rows.push({ label, value: \"\" });\n rows.push(...detailRows(value, depth + 1));\n continue;\n }\n\n if (isNonEmptyArrayOfObjects(value)) {\n rows.push({ label, value: \"\" });\n rows.push(...arrayObjectDetailRows(value, depth + 1));\n continue;\n }\n\n rows.push({ label, value: displayScalar(value) });\n }\n\n return rows;\n}\n\nfunction arrayObjectDetailRows(\n value: Array<Record<string, unknown>>,\n depth: number\n): Array<{ label: string; value: string }> {\n return value.flatMap((entry, index) => {\n if (value.length === 1) {\n return detailRows(entry, depth);\n }\n\n return [\n { label: `${\" \".repeat(depth)}${index + 1}`, value: \"\" },\n ...detailRows(entry, depth + 1)\n ];\n });\n}\n\nfunction displayScalar(value: unknown): string {\n if (typeof value === \"boolean\") {\n return value ? \"Yes\" : \"No\";\n }\n if (Array.isArray(value) && value.every((entry) => !isObject(entry) && !Array.isArray(entry))) {\n return value.map((entry) => displayScalar(entry)).join(\", \") || \"\u2014\";\n }\n return stringifyValue(value) || \"\u2014\";\n}\n\nfunction isUrl(value: unknown): value is string {\n return typeof value === \"string\" && (value.startsWith(\"https://\") || value.startsWith(\"http://\"));\n}\n\nfunction compactUrl(value: string): string {\n try {\n const url = new URL(value);\n const tail = url.pathname.split(\"/\").filter(Boolean).at(-1);\n return tail ? `${url.hostname}/\u2026/${tail}` : url.hostname;\n } catch {\n return value;\n }\n}\n\nfunction displayRowValue(value: unknown): string {\n return isUrl(value) ? compactUrl(value) : displayScalar(value);\n}\n\nfunction directScalarRows(result: Record<string, unknown>): Array<{ label: string; value: string }> {\n return Object.entries(result)\n .filter(([, value]) => !isObject(value) && !Array.isArray(value))\n .map(([key, value]) => ({ label: humanizeKey(key), value: displayRowValue(value) }));\n}\n\nfunction directObjectSections(result: Record<string, unknown>): Array<{ title: string; rows: Array<{ label: string; value: string }> }> {\n return Object.entries(result)\n .filter(([, value]) => isObject(value))\n .map(([key, value]) => ({ title: humanizeKey(key), rows: detailRows(value as Record<string, unknown>) }))\n .filter((section) => section.rows.length > 0);\n}\n\nfunction directArrayObjectSections(\n result: Record<string, unknown>\n): Array<{ title: string; rows: Array<{ label: string; value: string }> }> {\n return Object.entries(result).flatMap(([key, value]) => {\n if (!isNonEmptyArrayOfObjects(value)) {\n return [];\n }\n\n const title = humanizeKey(key);\n return value\n .map((entry, index) => ({\n title: value.length === 1 ? title : `${title} ${index + 1}`,\n rows: detailRows(entry)\n }))\n .filter((section) => section.rows.length > 0);\n });\n}\n\nfunction renderObjectCard(\n result: Record<string, unknown>,\n primitives: RenderPrimitives,\n title: string\n): string {\n const scalarRows = directScalarRows(result);\n const nestedSections = directObjectSections(result);\n const arrayObjectSections = directArrayObjectSections(result);\n const listRows = Object.entries(result)\n .filter(([, value]) => Array.isArray(value) && !isNonEmptyArrayOfObjects(value))\n .map(([key, value]) => ({ label: humanizeKey(key), value: displayScalar(value) }));\n\n return renderDetailCard({\n theme: primitives.getTheme(),\n title,\n sections: [\n { rows: scalarRows },\n ...nestedSections,\n { title: \"Lists\", rows: listRows },\n ...arrayObjectSections\n ]\n });\n}\n\nfunction richResultTitle(command: Command<any, any, any, any>): string {\n const description = command.description?.trim();\n if (description && !description.includes(\"\\n\") && description.length <= 64) {\n return description;\n }\n return command.name ? humanizeKey(command.name) : \"Result\";\n}\n\nexport function renderObjectTable(result: Record<string, unknown>, primitives: RenderPrimitives): string {\n const rows = detailRows(result);\n if (rows.length === 0) {\n return \"{}\";\n }\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n variant: \"detail\",\n columns: [\n {\n name: \"label\",\n title: \"Label\",\n alignment: \"left\",\n maxLen: Math.max(\"Label\".length, ...rows.map((row) => row.label.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\nexport function 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) =>\n Object.prototype.hasOwnProperty.call(row, name) ? stringifyValue(row[name]).length : 0\n )\n ),\n })),\n rows: result.map((row) =>\n Object.fromEntries(\n columnNames.map((name) => [\n name,\n Object.prototype.hasOwnProperty.call(row, name) ? stringifyValue(row[name]) : \"\"\n ])\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) =>\n Object.prototype.hasOwnProperty.call(row, name)\n ? stringifyValue(row[name]).replaceAll(\"|\", \"\\\\|\")\n : \"\"\n )\n .join(\" | \")} |`\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction autoRender(\n command: Command<any, any, any, any>,\n result: unknown,\n output: OutputMode,\n primitives: RenderPrimitives\n): 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 (output === \"rich\" && Array.isArray(result) && result.every((value) => typeof value === \"string\")) {\n return result.join(\"\\n\");\n }\n\n if (isObject(result)) {\n if (output === \"md\") {\n return renderObjectMarkdown(result);\n }\n\n if (output === \"json\") {\n return stringifyJson(result, 2);\n }\n\n return renderObjectCard(result, primitives, richResultTitle(command));\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 if (output === \"rich\") {\n return YAML.stringify(result);\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, stream = \"stdout\") => {\n if (stream === \"stderr\") {\n process.stderr.write(chunk);\n return;\n }\n\n process.stdout.write(chunk);\n }\n): RenderResultStatus {\n const unwrapped = unwrapMcpEnvelope(result);\n result = unwrapped.result;\n\n if (unwrapped.mcpError) {\n const payload = autoRender(command, result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`, \"stderr\");\n }\n return { mcpError: true };\n }\n\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 { mcpError: false };\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 { mcpError: false };\n }\n\n if (output === \"rich\" && command.render?.rich) {\n command.render.rich(result, primitives);\n return { mcpError: false };\n }\n\n const payload = autoRender(command, result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`);\n }\n return { mcpError: false };\n}\n", "import { text } from \"toolcraft-design\";\n\nexport interface SourceSnippetOptions {\n source: string;\n line: number;\n column?: number;\n context?: number;\n filePath?: string;\n}\n\nexport function renderSourceSnippet(opts: SourceSnippetOptions): string {\n const lines = opts.source.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\").split(\"\\n\");\n const line = clampInteger(opts.line, 1, Math.max(lines.length, 1));\n const context = Math.max(0, Math.floor(opts.context ?? 2));\n const startLine = Math.max(1, line - context);\n const endLine = Math.min(lines.length, line + context);\n const gutterWidth = String(endLine).length;\n const output: string[] = [];\n\n if (opts.filePath !== undefined) {\n output.push(\n muted(\n `--> ${opts.filePath}:${line}${opts.column === undefined ? \"\" : `:${Math.max(1, opts.column)}`}`\n )\n );\n }\n\n output.push(renderDivider(gutterWidth));\n\n for (let currentLine = startLine; currentLine <= endLine; currentLine += 1) {\n const sourceLine = lines[currentLine - 1] ?? \"\";\n output.push(`${muted(String(currentLine).padStart(gutterWidth, \" \"))} | ${sourceLine}`);\n\n if (currentLine === line && opts.column !== undefined) {\n const column = Math.max(1, Math.floor(opts.column));\n output.push(`${muted(\" \".repeat(gutterWidth))} | ${\" \".repeat(column - 1)}${error(\"^\")}`);\n }\n }\n\n output.push(renderDivider(gutterWidth));\n\n return output.join(\"\\n\");\n}\n\nfunction renderDivider(gutterWidth: number): string {\n return `${muted(\" \".repeat(gutterWidth))} |`;\n}\n\nfunction clampInteger(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\nfunction muted(value: string): string {\n return shouldStyleStderr() ? text.muted(value) : value;\n}\n\nfunction error(value: string): string {\n return shouldStyleStderr() ? text.error(value) : value;\n}\n\nfunction shouldStyleStderr(): boolean {\n return process.stderr.isTTY === true;\n}\n", "export type DebugStackMode = \"trim\" | \"raw\";\n\nconst HIDDEN_FRAME_SUMMARY_PREFIX = \" \u2026 (\";\nconst HIDDEN_FRAME_SUMMARY_SUFFIX = \" hidden \u2014 pass --debug=raw to show)\";\n\ninterface StackSection {\n header: string;\n lines: string[];\n}\n\nexport function enableSourceMaps(): void {\n process.setSourceMapsEnabled?.(true);\n}\n\nexport function formatDebugStack(stack: string, mode: DebugStackMode): string {\n return mode === \"raw\" ? stack : trimStack(stack);\n}\n\nexport function trimStack(stack: string): string {\n const sections = splitStackSections(stack);\n const trimmed = sections.map((section) => trimStackSection(section));\n const hiddenFrameCount = trimmed.reduce((count, section) => count + section.hiddenFrameCount, 0);\n\n if (hiddenFrameCount === 0) {\n return stack;\n }\n\n return trimmed.flatMap((section) => section.lines).join(\"\\n\");\n}\n\nfunction splitStackSections(stack: string): StackSection[] {\n const lines = stack.split(\"\\n\");\n const firstLine = lines[0];\n if (firstLine === undefined) {\n return [];\n }\n\n const sections: StackSection[] = [{ header: firstLine, lines: [] }];\n\n for (const line of lines.slice(1)) {\n if (isCauseHeader(line)) {\n sections.push({ header: line, lines: [] });\n continue;\n }\n\n sections[sections.length - 1]?.lines.push(line);\n }\n\n return sections;\n}\n\nfunction trimStackSection(section: StackSection): { lines: string[]; hiddenFrameCount: number } {\n const userFrames: string[] = [];\n const skippedFrames: string[] = [];\n\n for (const line of section.lines) {\n if (isFrameworkOrRuntimeFrame(line)) {\n skippedFrames.push(line);\n continue;\n }\n\n userFrames.push(line);\n }\n\n if (skippedFrames.length === 0) {\n return {\n lines: [section.header, ...section.lines],\n hiddenFrameCount: 0\n };\n }\n\n return {\n lines: [section.header, ...userFrames, formatHiddenFrameSummary(skippedFrames.length)],\n hiddenFrameCount: skippedFrames.length\n };\n}\n\nfunction isCauseHeader(line: string): boolean {\n return line.trimStart().startsWith(\"[cause]:\");\n}\n\nfunction isFrameworkOrRuntimeFrame(line: string): boolean {\n const normalized = line.replaceAll(\"\\\\\", \"/\");\n return (\n normalized.includes(\"node_modules/toolcraft/\") ||\n normalized.includes(\"node_modules/toolcraft-openapi/\") ||\n normalized.includes(\"node_modules/toolcraft-schema/\") ||\n normalized.includes(\"node_modules/commander/\") ||\n normalized.includes(\"node:internal/\") ||\n normalized.includes(\"/packages/toolcraft/src/\")\n );\n}\n\nfunction formatHiddenFrameSummary(count: number): string {\n const plural = count === 1 ? \"\" : \"s\";\n return `${HIDDEN_FRAME_SUMMARY_PREFIX}${count} framework / runtime frame${plural}${HIDDEN_FRAME_SUMMARY_SUFFIX}`;\n}\n", "import { UserError } from \"./user-error.js\";\n\nexport type ValidationError = {\n path: string;\n message: string;\n};\n\nconst MAX_RENDERED_VALIDATION_ERRORS = 10;\n\nexport function throwValidationErrors(errors: readonly ValidationError[]): void {\n if (errors.length === 0) {\n return;\n }\n\n if (errors.length === 1) {\n throw new UserError(errors[0]?.message ?? \"Invalid parameters.\");\n }\n\n const rendered = errors\n .slice(0, MAX_RENDERED_VALIDATION_ERRORS)\n .map((error) => ` - ${error.path}: ${error.message}`);\n const remaining = errors.length - rendered.length;\n\n if (remaining > 0) {\n rendered.push(` \u2026 and ${remaining} more`);\n }\n\n throw new UserError(`${errors.length} parameter errors:\\n${rendered.join(\"\\n\")}`);\n}\n", "import { access, lstat, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport type { HandlerEnv, HandlerFs } from \"../index.js\";\n\nexport const RESERVED_SERVICE_NAMES = new Set([\n \"params\",\n \"secrets\",\n \"fetch\",\n \"fs\",\n \"env\",\n \"diagnostics\",\n \"progress\",\n \"runtimeOptions\",\n \"root\"\n]);\n\nconst RESERVED_SERVICE_NAMES_MESSAGE =\n \"Available reserved names: params, secrets, fetch, fs, env, diagnostics, progress, runtimeOptions, root.\";\n\nexport function createFs(fs?: HandlerFs): HandlerFs {\n if (fs !== undefined) {\n return fs;\n }\n\n return {\n readFile: async (path: string, encoding = \"utf8\") => readFile(path, { encoding }),\n writeFile: async (\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ) => {\n await writeFile(path, contents, options);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n lstat: async (path: string) => lstat(path),\n rename: async (fromPath: string, toPath: string) => rename(fromPath, toPath),\n unlink: async (path: string) => unlink(path)\n };\n}\n\nexport function 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\nexport function validateServices(services: object): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(\n `Service name \"${name}\" is reserved. Choose a different name. ${RESERVED_SERVICE_NAMES_MESSAGE}`\n );\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 await Promise.all(\n sessions.map(async (session) => {\n await session.close();\n this.sessionMap.delete(session.id);\n })\n );\n }\n}\n", "import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\nconst CLOSE_AFTER_SIGKILL_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n scope?: \"history\" | \"screen\";\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closePromise: Promise<number> | null = null;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n assertTerminalGeometry(cols, rows);\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" has already exited.`);\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const scope = opts?.scope ?? \"history\";\n assertTimeout(timeout);\n assertWaitScope(scope);\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const source = scope === \"screen\" ? (await this.screen()).text : this.rawBuffer;\n const matched = matchPattern(source, pattern);\n if (matched !== null) {\n return matched;\n }\n\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" exited before matching pattern: ${String(pattern)}`);\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n assertQuietPeriod(ms);\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n if (!Number.isInteger(opts.last) || opts.last < 0) {\n throw new Error(\"History last must be a non-negative integer.\");\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n assertTerminalGeometry(cols, rows);\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (opts?.timeout !== undefined) {\n assertTimeout(opts.timeout);\n }\n\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n this.closePromise ??= this.closeProcess().catch((error: unknown) => {\n this.closePromise = null;\n throw error;\n });\n return this.closePromise;\n }\n\n private async closeProcess(): Promise<number> {\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n const afterSigkill = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGKILL_MS);\n if (afterSigkill !== null) {\n return afterSigkill;\n }\n }\n\n throw new Error(\"Timed out waiting for process to exit after SIGKILL.\");\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction assertTerminalGeometry(cols: number, rows: number): void {\n if (!Number.isInteger(cols) || cols <= 0 || !Number.isInteger(rows) || rows <= 0) {\n throw new Error(\"Terminal columns and rows must be positive integers.\");\n }\n}\n\nfunction assertTimeout(timeout: number): void {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new Error(\"Timeout must be a finite non-negative number.\");\n }\n}\n\nfunction assertWaitScope(scope: string): void {\n if (scope !== \"history\" && scope !== \"screen\") {\n throw new Error('Wait scope must be either \"history\" or \"screen\".');\n }\n}\n\nfunction assertQuietPeriod(duration: number): void {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new Error(\"Quiet period must be a finite non-negative number.\");\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n let line = \"\";\n let cursor = 0;\n\n for (const character of input) {\n if (character === \"\\r\") {\n cursor = 0;\n continue;\n }\n\n if (character === \"\\b\") {\n cursor = Math.max(0, cursor - 1);\n continue;\n }\n\n if (character === \"\\n\") {\n output += `${line}\\n`;\n line = \"\";\n cursor = 0;\n continue;\n }\n\n line = `${line.slice(0, cursor)}${character}${line.slice(cursor + 1)}`;\n cursor += 1;\n }\n\n return output + line;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n conceal: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\ninterface SavedCursorState {\n x: number;\n y: number;\n autoWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\ninterface PrimaryScreenState {\n screen: Row[];\n cursorX: number;\n cursorY: number;\n pendingWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst DEC_SPECIAL_GRAPHICS: Record<string, string> = {\n j: \"\u2518\",\n k: \"\u2510\",\n l: \"\u250C\",\n m: \"\u2514\",\n n: \"\u253C\",\n q: \"\u2500\",\n t: \"\u251C\",\n u: \"\u2524\",\n v: \"\u2534\",\n w: \"\u252C\",\n x: \"\u2502\"\n};\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n StringEscape,\n EscCharset,\n EscHash\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _primaryScreen: PrimaryScreenState | null = null;\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor: SavedCursorState;\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _pendingWrap = false;\n private _originMode = false;\n private _insertMode = false;\n private _tabStops: Set<number>;\n private _lastPrintedChar: string | null = null;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n private _stringState = State.Normal;\n private _charsetTarget: \"g0\" | \"g1\" | null = null;\n private _g0Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _g1Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _shiftOut = false;\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n this._tabStops = this._createDefaultTabStops(cols);\n this._savedCursor = this._createSavedCursorState();\n\n this.displayBuffer = Object.defineProperties(\n {} as {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true }\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = this._clamp(this._scrollTop, 0, rows - 1);\n this._scrollBottom = this._clamp(this._scrollBottom, 0, rows - 1);\n if (this._scrollTop >= this._scrollBottom) {\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n }\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _createDefaultTabStops(cols: number): Set<number> {\n const tabStops = new Set<number>();\n for (let column = 8; column < cols; column += 8) {\n tabStops.add(column);\n }\n return tabStops;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _createSavedCursorState(): SavedCursorState {\n return {\n x: this._cursorX,\n y: this._cursorY,\n autoWrap: this._autoWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n }\n\n private _saveCursor(): void {\n this._savedCursor = this._createSavedCursorState();\n }\n\n private _restoreCursor(): void {\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n this._autoWrap = this._savedCursor.autoWrap;\n this._style = {\n ...this._savedCursor.style,\n fg: this._savedCursor.style.fg?.slice(),\n bg: this._savedCursor.style.bg?.slice()\n };\n this._styleSequence = this._savedCursor.styleSequence;\n }\n\n private _resetModes(): void {\n this._autoWrap = true;\n this._originMode = false;\n this._insertMode = false;\n this._pendingWrap = false;\n this._tabStops = this._createDefaultTabStops(this._cols);\n this._g0Charset = \"ascii\";\n this._g1Charset = \"ascii\";\n this._shiftOut = false;\n this._resetStyle();\n }\n\n private _writePrintable(ch: string): void {\n const width = this._cellWidth(ch);\n\n if (width === 0) {\n this._appendCombiningMark(ch);\n return;\n }\n\n if (this._autoWrap && this._pendingWrap) {\n this._cursorX = 0;\n this._newline();\n } else if (this._autoWrap && this._cursorX + width > this._cols) {\n this._cursorX = 0;\n this._newline();\n }\n\n if (this._insertMode) {\n const row = this._screen[this._cursorY];\n if (row) {\n row.splice(this._cursorX, 0, ...(Array(width).fill(null) as Cell[]));\n row.splice(this._cols);\n }\n }\n\n this._setChar(this._cursorY, this._cursorX, ch);\n for (let column = 1; column < width && this._cursorX + column < this._cols; column += 1) {\n const row = this._screen[this._cursorY];\n if (row) row[this._cursorX + column] = null;\n }\n this._lastPrintedChar = ch;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX + width, this._cols - 1);\n this._pendingWrap = false;\n } else if (this._cursorX + width >= this._cols) {\n this._cursorX = this._cols - 1;\n this._pendingWrap = true;\n } else {\n this._cursorX += width;\n this._pendingWrap = false;\n }\n }\n\n private _cellWidth(ch: string): number {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) return 0;\n if (isCombiningCodePoint(codePoint)) {\n return 0;\n }\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x303e) ||\n (codePoint >= 0x3041 && codePoint <= 0x33bf) ||\n (codePoint >= 0x3400 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4cf) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7af) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1fffd) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return Math.min(2, this._cols);\n }\n return 1;\n }\n\n private _appendCombiningMark(ch: string): void {\n const target = this._findCombiningTarget();\n if (target === null) {\n return;\n }\n\n const cell = this._screen[target.y]?.[target.x];\n if (cell === null || cell === undefined) {\n return;\n }\n\n cell[1] += ch;\n }\n\n private _findCombiningTarget(): { x: number; y: number } | null {\n const startX = this._pendingWrap ? this._cursorX : this._cursorX - 1;\n\n for (let y = this._cursorY; y >= 0; y -= 1) {\n const row = this._screen[y];\n if (row === undefined) {\n continue;\n }\n\n for (let x = y === this._cursorY ? startX : this._cols - 1; x >= 0; x -= 1) {\n if (row[x] !== null) {\n return { x, y };\n }\n }\n }\n\n return null;\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const renderedChar = this._style.conceal ? \" \" : ch;\n const cell = [renderedChar.charCodeAt(0), renderedChar] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n this._pendingWrap = false;\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n const values = this._csiParams\n .split(\";\")\n .flatMap((segment) => segment.split(\":\"))\n .map((segment) => (segment === \"\" ? 0 : parseInt(segment, 10)));\n if ((values[0] === 38 || values[0] === 48) && values[1] === 2 && values[2] === 0) {\n values.splice(2, 1);\n }\n return values;\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(6)) {\n this._originMode = final === \"h\";\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._primaryScreen = {\n screen: this._screen,\n cursorX: this._cursorX,\n cursorY: this._cursorY,\n pendingWrap: this._pendingWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._pendingWrap = false;\n } else {\n if (this._primaryScreen !== null) {\n this._screen = this._primaryScreen.screen;\n this._cursorX = this._primaryScreen.cursorX;\n this._cursorY = this._primaryScreen.cursorY;\n this._pendingWrap = this._primaryScreen.pendingWrap;\n this._style = this._primaryScreen.style;\n this._styleSequence = this._primaryScreen.styleSequence;\n this._primaryScreen = null;\n }\n }\n if (final === \"h\") this._resetStyle();\n }\n }\n return;\n }\n\n if ((final === \"h\" || final === \"l\") && params.includes(4)) {\n this._insertMode = final === \"h\";\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._originMode\n ? this._clamp(this._scrollTop + Math.max(1, p0) - 1, this._scrollTop, this._scrollBottom)\n : this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++)\n this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": {\n // insert lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": {\n // delete lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": {\n // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": {\n // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": {\n // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"b\": // repeat preceding character\n if (this._lastPrintedChar !== null) {\n for (let index = 0; index < Math.max(1, p0); index += 1) {\n this._writePrintable(this._lastPrintedChar);\n }\n }\n break;\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": {\n // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n break;\n }\n case \"s\": // save cursor\n this._saveCursor();\n break;\n case \"u\": // restore cursor\n this._restoreCursor();\n break;\n case \"p\":\n if (this._csiPrivate === \"!\") {\n this._resetModes();\n }\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n if (this._state !== State.Normal && (code === 0x18 || code === 0x1a)) {\n this._state = State.Normal;\n return;\n }\n\n if (this._state === State.Csi && code === 0x1b) {\n this._state = State.Escape;\n return;\n }\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ST\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Osc;\n this._state = State.StringEscape;\n }\n break;\n case State.Str:\n // consume until ST\n if (code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Str;\n this._state = State.StringEscape;\n }\n break;\n case State.StringEscape:\n this._state = ch === \"\\\\\" ? State.Normal : this._stringState;\n break;\n case State.EscCharset:\n if (this._charsetTarget === \"g0\") this._g0Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n if (this._charsetTarget === \"g1\") this._g1Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n this._charsetTarget = null;\n this._state = State.Normal;\n break;\n case State.EscHash:\n if (ch === \"8\") {\n for (let row = 0; row < this._rows; row += 1) {\n for (let column = 0; column < this._cols; column += 1) {\n this._setChar(row, column, \"E\");\n }\n }\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x85) {\n // C1 NEL = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x9c) {\n // C1 ST outside a string has no visible effect\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n this._pendingWrap = false;\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL \u2014 ignore in displayed output\n } else if (code === 0x09) {\n // HT\n const nextTabStop = [...this._tabStops]\n .sort((left, right) => left - right)\n .find((tabStop) => tabStop > this._cursorX);\n this._cursorX = nextTabStop ?? this._cols - 1;\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._pendingWrap = false;\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 shift between G1 and G0 character sets\n this._shiftOut = code === 0x0e;\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n const charset = this._shiftOut ? this._g1Charset : this._g0Charset;\n this._writePrintable(charset === \"graphics\" ? (DEC_SPECIAL_GRAPHICS[ch] ?? ch) : ch);\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (\n code === 0x28 ||\n code === 0x29 ||\n code === 0x2a ||\n code === 0x2b ||\n code === 0x2d ||\n code === 0x2e\n ) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._charsetTarget = code === 0x28 ? \"g0\" : code === 0x29 ? \"g1\" : null;\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._saveCursor();\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._restoreCursor();\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = horizontal tab set\n this._tabStops.add(this._cursorX);\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetModes();\n this._savedCursor = this._createSavedCursorState();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b || code === 0x3a) {\n // Digit, semicolon, or colon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 8:\n this._style.conceal = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 28:\n this._style.conceal = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n conceal: false,\n strikethrough: false\n };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.conceal) {\n codes.push(8);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\nconst NAMED_KEY_PATTERN = Object.keys(NAMED_KEY_SEQUENCES).map(caseInsensitivePattern).join(\"|\");\n\nexport const TERMINAL_KEY_PATTERN = `^(?:${NAMED_KEY_PATTERN}|.|[Cc][Oo][Nn][Tt][Rr][Oo][Ll]\\\\+[A-Za-z]|[Aa][Ll][Tt]\\\\+.+)$`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n\nfunction caseInsensitivePattern(value: string): string {\n let pattern = \"\";\n\n for (const character of value) {\n const lower = character.toLowerCase();\n const upper = character.toUpperCase();\n pattern += lower === upper ? escapePatternCharacter(character) : `[${upper}${lower}]`;\n }\n\n return pattern;\n}\n\nfunction escapePatternCharacter(character: string): string {\n return character.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"toolcraft\";\nimport type { HandlerEnv } from \"toolcraft\";\nimport type { TerminalPilotInstallerServices } from \"./installer.js\";\nimport { TerminalPilot, type NewSessionOptions } from \"../terminal-pilot.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nexport const SESSION_ENV_VAR = \"TERMINAL_PILOT_SESSION\";\n\ntype SessionLike = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\ntype PilotLike = Pick<TerminalPilot, \"newSession\" | \"getSession\" | \"deleteSession\" | \"sessions\">;\ntype ClosablePilotLike = PilotLike & Pick<TerminalPilot, \"close\">;\n\ntype NamedSession = {\n name: string;\n session: SessionLike;\n};\n\ntype CreateSessionParams = NewSessionOptions & {\n session?: string;\n};\n\nexport interface TerminalPilotRuntime {\n createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession>;\n resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession>;\n closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n hasRetainedSessions(): Promise<boolean>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n const pendingNames = new Set<string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n const requestedName = name ?? env?.get(SESSION_ENV_VAR);\n\n if (requestedName !== undefined && requestedName.trim().length === 0) {\n throw new UserError(\"Session name must not be empty.\");\n }\n\n return requestedName;\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`) || pendingNames.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n if (nameToId.get(name) === sessionId) {\n nameToId.delete(name);\n }\n if (idToName.get(sessionId) === name) {\n idToName.delete(sessionId);\n }\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n async function discardExitedSessionName(name: string): Promise<void> {\n const sessionId = nameToId.get(name);\n if (sessionId === undefined) {\n return;\n }\n\n const pilot = await getPilot();\n try {\n const session = pilot.getSession(sessionId);\n if (session.exitCode === null) {\n return;\n }\n pilot.deleteSession(sessionId);\n } catch {\n // Missing sessions no longer reserve public names.\n }\n forgetSession(name, sessionId);\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n if (params.command.trim().length === 0) {\n throw new UserError(\"Command must not be empty.\");\n }\n\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n await discardExitedSessionName(requestedName);\n\n if (nameToId.has(requestedName) || pendingNames.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n pendingNames.add(requestedName);\n try {\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n } finally {\n pendingNames.delete(requestedName);\n }\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async hasRetainedSessions(): Promise<boolean> {\n return nameToId.size > 0 || pendingNames.size > 0;\n },\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n pendingNames.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n return { exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n command: S.String({ description: \"Command to execute\", minLength: 1, pattern: \"\\\\S\" }),\n args: S.Optional(S.Array(S.String(), { description: \"Command arguments\" })),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n cwd: S.Optional(S.String({ description: \"Working directory\" })),\n cols: S.Optional(\n S.Number({ description: \"Terminal width in columns\", jsonType: \"integer\", minimum: 1 })\n ),\n rows: S.Optional(\n S.Number({ description: \"Terminal height in rows\", jsonType: \"integer\", minimum: 1 })\n ),\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(\n params,\n env\n );\n return { session: namedSession.name, pid: namedSession.session.pid };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\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(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.fill(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\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 cursor: {\n globalSkillDir: \"~/.cursor/skills-cursor\",\n localSkillDir: \".cursor/skills\"\n },\n \"gemini-cli\": {\n globalSkillDir: \"~/.gemini/skills\",\n localSkillDir: \".gemini/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.freeze(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: { ...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, homeDir: string = os.homedir()): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return 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 ? homeDir : path.join(homeDir, remainder);\n}\n\nexport function resolveSkillDir(\n config: AgentSkillConfig,\n scope: SkillScope,\n cwd: string,\n homeDir?: string\n): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir, homeDir));\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 apiShapes: [\"anthropic-messages\"],\n otelCapture: {\n env: {\n CLAUDE_CODE_ENABLE_TELEMETRY: \"1\"\n }\n },\n configPath: \"~/.claude.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: \"~/.config/Claude/claude_desktop_config.json\",\n configPaths: {\n darwin: \"~/Library/Application Support/Claude/claude_desktop_config.json\",\n linux: \"~/.config/Claude/claude_desktop_config.json\",\n win32: \"~/AppData/Roaming/Claude/claude_desktop_config.json\"\n },\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 apiShapes: [\"openai-responses\"],\n otelCapture: {\n args: (endpoint, content) => [\n \"-c\",\n `otel.trace_exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/traces`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/logs`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.log_user_prompt=${content}`\n ]\n },\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 cursorAgent: AgentDefinition = {\n id: \"cursor\",\n name: \"cursor\",\n aliases: [\"cursor-agent\"],\n label: \"Cursor\",\n summary: \"Cursor's CLI coding agent.\",\n binaryName: \"cursor-agent\",\n configPath: \"~/.cursor/mcp.json\",\n branding: {\n colors: {\n dark: \"#FFFFFF\",\n light: \"#000000\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const geminiCliAgent: AgentDefinition = {\n id: \"gemini-cli\",\n name: \"gemini-cli\",\n aliases: [\"gemini\"],\n label: \"Gemini CLI\",\n summary: \"Configure Google's Gemini CLI to use a compatible Google generations API.\",\n binaryName: \"gemini\",\n configPath: \"~/.gemini/settings.json\",\n apiShapes: [\"google-generations\"],\n branding: {\n colors: {\n dark: \"#8AB4F8\",\n light: \"#1A73E8\"\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 apiShapes: [\"openai-chat-completions\"],\n otelCapture: {\n env: {\n OPENCODE_CONFIG_CONTENT: '{\"experimental\":{\"openTelemetry\":true}}'\n }\n },\n configPath: \"~/.config/opencode/opencode.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 apiShapes: [\"openai-chat-completions\"],\n configPath: \"~/.kimi/mcp.json\",\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 apiShapes: [\"openai-chat-completions\"],\n otelCapture: {},\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 apiShapes: [\"openai-responses\", \"openai-chat-completions\"],\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 cursorAgent,\n geminiCliAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nfunction freezeAgent(agent: AgentDefinition): AgentDefinition {\n if (agent.aliases !== undefined) {\n Object.freeze(agent.aliases);\n }\n if (agent.apiShapes !== undefined) {\n Object.freeze(agent.apiShapes);\n }\n if (agent.otelCapture?.env !== undefined) {\n Object.freeze(agent.otelCapture.env);\n }\n if (agent.otelCapture !== undefined) {\n Object.freeze(agent.otelCapture);\n }\n Object.freeze(agent.branding.colors);\n Object.freeze(agent.branding);\n return Object.freeze(agent);\n}\n\nexport const allAgents: readonly AgentDefinition[] = Object.freeze([\n freezeAgent(claudeCodeAgent),\n freezeAgent(claudeDesktopAgent),\n freezeAgent(codexAgent),\n freezeAgent(cursorAgent),\n freezeAgent(geminiCliAgent),\n freezeAgent(openCodeAgent),\n freezeAgent(kimiAgent),\n freezeAgent(gooseAgent),\n freezeAgent(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.trim().toLowerCase());\n}\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n RestoreBackupMutation,\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 /** Keep the first baseline only, including an originally missing target. */\n once?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RestoreBackupOptions {\n /** Target file path whose latest generated backup should be restored. */\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 once: options.once,\n label: options.label\n };\n}\n\nfunction restoreBackup(options: RestoreBackupOptions): RestoreBackupMutation {\n return {\n kind: \"restoreBackup\",\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 restoreBackup\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 renderTemplate() */\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 renderTemplate() */\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 renderTemplate() */\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 { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { renderTemplate } from \"toolcraft-design\";\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 { cloneConfigObject, setConfigEntry } from \"../formats/object.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\nimport { hasOwnErrorCode } from \"../error-codes.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 context: MutationContext,\n targetPath: string,\n content: string\n): Promise<void> {\n const baseBackupPath = createInvalidDocumentBackupPath(targetPath);\n let attempt = 0;\n while (true) {\n const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;\n await assertRegularWriteTarget(context, backupPath);\n try {\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\", flag: \"wx\" });\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await context.fs.unlink(backupPath).catch(() => undefined);\n throw error;\n }\n attempt += 1;\n }\n }\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nasync function assertRegularWriteTarget(\n context: MutationContext,\n targetPath: string\n): Promise<void> {\n // Symlinks inside the managed home directory are untrusted: an attacker could\n // plant one to redirect a credential/config write outside it. Symlinks at or\n // above home are legitimate system links (e.g. /tmp -> /private/tmp on macOS,\n // /var -> /private/var) and must not block writes, so bound the walk at home.\n const boundary = path.dirname(path.resolve(context.homeDir));\n let currentPath = path.resolve(targetPath);\n while (currentPath !== boundary) {\n try {\n if ((await context.fs.lstat(currentPath)).isSymbolicLink()) {\n throw new Error(`Refusing mutation write through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n\n const parentPath = path.dirname(currentPath);\n if (parentPath === currentPath) {\n return;\n }\n currentPath = parentPath;\n }\n}\n\nasync function writeAtomically(\n context: MutationContext,\n targetPath: string,\n content: string\n): Promise<void> {\n await assertRegularWriteTarget(context, targetPath);\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const tempPath = `${targetPath}.mutation-tmp-${process.pid}-${randomUUID()}`;\n let tempCreated = false;\n try {\n await assertRegularWriteTarget(context, tempPath);\n await context.fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n await context.fs.rename(tempPath, targetPath);\n tempCreated = false;\n return;\n } catch (error) {\n const alreadyExists = isAlreadyExists(error);\n if (tempCreated || !alreadyExists) {\n try {\n await context.fs.unlink(tempPath);\n } catch (cleanupError) {\n if (!isNotFound(cleanupError)) {\n void cleanupError;\n }\n }\n }\n\n if (alreadyExists) {\n continue;\n }\n\n throw error;\n }\n }\n\n throw new Error(`Unable to create temporary mutation file for ${targetPath}.`);\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 \"restoreBackup\":\n return `Restore ${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 mutationTargetPath(\n mutation: Mutation,\n options: MutationOptions\n): string | undefined {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n case \"removeDirectory\":\n return resolveValue(mutation.path, options);\n case \"removeFile\":\n case \"chmod\":\n case \"backup\":\n case \"restoreBackup\":\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateWrite\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return resolveValue(mutation.target, options);\n default:\n return undefined;\n }\n}\n\nexport function resolveMutationDetails(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): MutationDetails {\n try {\n const rawTarget = mutationTargetPath(mutation, options);\n if (rawTarget === undefined) {\n return {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind\n };\n }\n\n try {\n const targetPath = resolvePath(rawTarget, context.homeDir, context.pathMapper);\n return {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n } catch {\n return {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, rawTarget),\n targetPath: undefined\n };\n }\n } catch {\n return {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind\n };\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 setConfigEntry(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 = cloneConfigObject(base);\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n\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 setConfigEntry(result, key, mergePrunedConfigObject(pruned, value));\n } else {\n setConfigEntry(result, key, mergeWithPruneByPrefix(current, value, prefixMap));\n }\n continue;\n }\n setConfigEntry(result, key, value);\n }\n return result;\n}\n\nfunction mergePrunedConfigObject(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result = cloneConfigObject(base);\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n\n setConfigEntry(result, key, value);\n }\n\n return result;\n}\n\nfunction serializeConfigUpdate(\n format: ReturnType<typeof getConfigFormat>,\n rawContent: string | null,\n current: ConfigObject,\n next: ConfigObject\n): string {\n if (rawContent !== null && format.serializeUpdate) {\n return format.serializeUpdate(rawContent, current, next);\n }\n return format.serialize(next);\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 \"restoreBackup\":\n return applyRestoreBackup(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 await assertRegularWriteTarget(context, targetPath);\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) {\n mutation.whenContentMatches.lastIndex = 0;\n }\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 await assertRegularWriteTarget(context, targetPath);\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 await assertRegularWriteTarget(context, targetPath);\n if (mutation.once && (await findLatestGeneratedBackup(context.fs, targetPath)) !== null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null && !mutation.once) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const baseBackupPath = `${targetPath}.backup-${createTimestamp()}${content === null ? \".missing\" : \"\"}`;\n let attempt = 0;\n while (true) {\n const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;\n try {\n await assertRegularWriteTarget(context, backupPath);\n await context.fs.writeFile(backupPath, content ?? \"\", { encoding: \"utf8\", flag: \"wx\" });\n break;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await context.fs.unlink(backupPath).catch(() => undefined);\n throw error;\n }\n attempt += 1;\n }\n }\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\nasync function applyRestoreBackup(\n mutation: Extract<Mutation, { kind: \"restoreBackup\" }>,\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 const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n const backup = await findLatestGeneratedBackup(context.fs, targetPath);\n\n if (backup === null) {\n return { outcome: { changed: false, effect: \"none\", detail: \"noop\" }, details };\n }\n\n if (!context.dryRun) {\n await assertRegularWriteTarget(context, backup.path);\n if (backup.originallyMissing) {\n try {\n await context.fs.unlink(targetPath);\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n } else {\n const content = await context.fs.readFile(backup.path, \"utf8\");\n await writeAtomically(context, targetPath, content);\n }\n await context.fs.unlink(backup.path);\n }\n\n return { outcome: { changed: true, effect: \"copy\", detail: \"restore\" }, details };\n}\n\nasync function findLatestGeneratedBackup(\n fs: FileSystem,\n targetPath: string\n): Promise<{ path: string; originallyMissing: boolean } | null> {\n const separatorIndex = targetPath.lastIndexOf(\"/\");\n const directoryPath = separatorIndex <= 0 ? \"/\" : targetPath.slice(0, separatorIndex);\n const targetName = targetPath.slice(separatorIndex + 1);\n let entries: string[];\n\n try {\n entries = await fs.readdir(directoryPath);\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n\n const backupName = entries\n .filter((entry) => isGeneratedBackupName(entry, targetName))\n .sort()\n .at(-1);\n return backupName === undefined\n ? null\n : {\n path: `${directoryPath}/${backupName}`,\n originallyMissing: backupName.endsWith(\".missing\")\n };\n}\n\nfunction isGeneratedBackupName(entry: string, targetName: string): boolean {\n const prefix = `${targetName}.backup-`;\n if (!entry.startsWith(prefix)) {\n return false;\n }\n\n const suffix = entry.slice(prefix.length);\n const timestamp = suffix.slice(0, 24);\n if (timestamp.length !== 24 || timestamp[4] !== \"-\" || timestamp[7] !== \"-\" || timestamp[10] !== \"T\" || timestamp[13] !== \"-\" || timestamp[16] !== \"-\" || timestamp[19] !== \"-\" || timestamp[23] !== \"Z\") {\n return false;\n }\n const parsedTimestamp = `${timestamp.slice(0, 13)}:${timestamp.slice(14, 16)}:${timestamp.slice(17, 19)}.${timestamp.slice(20)}`;\n if (Number.isNaN(Date.parse(parsedTimestamp))) {\n return false;\n }\n const collisionSuffix = suffix.slice(24);\n if (collisionSuffix.length === 0) {\n return true;\n }\n if (collisionSuffix === \".missing\") {\n return true;\n }\n return collisionSuffix[0] === \"-\" && collisionSuffix.slice(1).length > 0 && [...collisionSuffix.slice(1)].every((character) => character >= \"0\" && character <= \"9\");\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 preserveContent = rawContent;\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 && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n preserveContent = null;\n }\n\n const value = resolveValue(mutation.value, options);\n if (!isConfigObject(value)) {\n throw new Error(`configMerge value must be an object for \"${rawPath}\".`);\n }\n\n // Keep prefix pruning on the same proto-safe object-write path as normal merges.\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 = serializeConfigUpdate(format, preserveContent, current, merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\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 = serializeConfigUpdate(format, rawContent, current, result);\n if (!context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\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 preserveContent = rawContent;\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n preserveContent = null;\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 = serializeConfigUpdate(format, preserveContent, current, transformed);\n const serializedChanged = serialized !== rawContent;\n if (!serializedChanged) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\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 = renderTemplate(template, templateContext);\n\n const current = await readFileIfExists(context.fs, targetPath);\n const changed = current !== rendered;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, rendered);\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (current === null ? \"create\" : \"update\") : \"noop\"\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 = renderTemplate(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 && !context.dryRun) {\n await backupInvalidDocument(context, 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 writeAtomically(context, targetPath, serialized);\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\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.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 cloneConfigObject(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 = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(result, key, value as ConfigValue);\n }\n return result;\n}\n\nfunction configValuesEqual(left: ConfigValue | undefined, right: ConfigValue | undefined): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\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 setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (isConfigObject(pattern) && Object.keys(pattern).length > 0) {\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 const current = parse(content);\n return serializeUpdate(content || \"{}\", current, merge(current, patch));\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\nfunction serializeUpdate(\n content: string,\n current: ConfigObject,\n next: ConfigObject\n): string {\n let result = content || \"{}\";\n result = applyObjectUpdate(result, [], current, next);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\nfunction applyObjectUpdate(\n content: string,\n path: (string | number)[],\n current: ConfigObject,\n next: ConfigObject\n): string {\n let result = content;\n\n for (const key of Object.keys(current)) {\n if (!hasConfigEntry(next, key)) {\n result = removeAtPath(result, [...path, key]);\n }\n }\n\n for (const [key, nextValue] of Object.entries(next)) {\n const nextPath = [...path, key];\n const hasCurrent = hasConfigEntry(current, key);\n const currentValue = hasCurrent ? current[key] : undefined;\n\n if (hasCurrent && isConfigObject(currentValue) && isConfigObject(nextValue)) {\n result = applyObjectUpdate(result, nextPath, currentValue, nextValue);\n continue;\n }\n\n if (!hasCurrent || !configValuesEqual(currentValue, nextValue)) {\n result = modifyAtPath(result, nextPath, nextValue as ConfigValue);\n }\n }\n\n return result;\n}\n\nexport {\n detectIndent,\n modifyAtPath,\n mergePreservingComments,\n removeAtPath,\n serializeUpdate\n};\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n serializeUpdate,\n merge,\n prune\n};\n", "import type { ConfigObject, ConfigValue } from \"../types.js\";\n\nexport function cloneConfigObject(value: ConfigObject): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, entry] of Object.entries(value)) {\n setConfigEntry(result, key, cloneConfigValue(entry));\n }\n return result;\n}\n\nexport function setConfigEntry(target: ConfigObject, key: string, value: ConfigValue): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nexport function hasConfigEntry(target: ConfigObject, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction cloneConfigValue(value: ConfigValue): ConfigValue {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneConfigValue(entry));\n }\n if (value && typeof value === \"object\" && !(value instanceof Date)) {\n return cloneConfigObject(value as ConfigObject);\n }\n return value;\n}\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.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 cloneConfigObject(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 = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(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 = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\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 setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (!isConfigObject(pattern) || Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n }\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\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.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 cloneConfigObject(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 = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(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 = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\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 setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (!isConfigObject(pattern) || Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n }\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 (Object.prototype.hasOwnProperty.call(formatRegistry, pathOrFormat)) {\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 const canonicalHome = path.resolve(homeDir);\n const canonicalExpanded = path.resolve(expanded);\n const relative = path.relative(canonicalHome, canonicalExpanded);\n if (relative === \"..\" || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {\n throw new Error(`Target path resolves outside home directory: \"${rawPath}\"`);\n }\n\n if (!pathMapper) {\n return canonicalExpanded;\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", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import type { FileSystem } from \"./types.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\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 MutationDetails,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation, resolveMutationDetails } 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: MutationDetails }> {\n const pendingDetails = resolveMutationDetails(mutation, context, options);\n\n // Call onStart observer\n context.observers?.onStart?.(pendingDetails);\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?.(pendingDetails, error);\n\n // Re-throw the error\n throw error;\n }\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "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\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\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 (hasOwnErrorCode(error, \"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 { hasOwnErrorCode } from \"./error-codes.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\nasync function pathExists(fs: ApplyOptions[\"fs\"], targetPath: string): Promise<boolean> {\n try {\n await fs.stat(targetPath);\n return true;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\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 const templateLoader = createTemplateLoader();\n\n for (const templateId of bundledSkillTemplateIds) {\n const targetPath = `${scope === \"global\" ? options.homeDir : options.cwd}/${skillDir.slice(2)}/${templateId}`;\n if (await pathExists(options.fs, targetPath)) {\n const existing = await options.fs.readFile(targetPath, \"utf8\");\n if (existing !== (await templateLoader(templateId))) {\n throw new Error(`Skill already exists: ${targetPath}`);\n }\n }\n }\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: templateLoader\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 const templateLoader = createTemplateLoader();\n const removeBundledSkills = [];\n\n for (const templateId of bundledSkillTemplateIds) {\n const targetPath = `${scope === \"global\" ? options.homeDir : options.cwd}/${skillDir.slice(2)}/${templateId}`;\n if (await pathExists(options.fs, targetPath)) {\n const existing = await options.fs.readFile(targetPath, \"utf8\");\n if (existing === (await templateLoader(templateId))) {\n removeBundledSkills.push(\n fileMutation.remove({\n target: `${skillDir}/${templateId}`,\n label: `Remove bundled skill ${templateId} from ${skillDir}`\n })\n );\n }\n }\n }\n\n await runMutations(\n [\n ...removeBundledSkills,\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 if (\n skill.name.length === 0 ||\n skill.name !== skill.name.trim() ||\n skill.name === \".\" ||\n skill.name === \"..\" ||\n skill.name.includes(\"/\") ||\n skill.name.includes(\"\\\\\") ||\n skill.name.includes(\"\\n\") ||\n skill.name.includes(\"\\r\")\n ) {\n throw new Error(`Invalid skill name: ${skill.name}`);\n }\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 const absoluteSkillPath = `${scope === \"global\" ? options.homeDir : options.cwd}/${skillFilePath.slice(2)}`;\n\n if (await pathExists(options.fs, absoluteSkillPath)) {\n throw new Error(`Skill already exists: ${displayPath}`);\n }\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: absoluteSkillPath, displayPath };\n}\n", "import * as fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getAgentConfig, resolveAgentSupport, resolveSkillDir } from \"./configs.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\nexport interface SkillSource {\n kind: \"resolved\";\n ref: string;\n name: string;\n sourceAgentId?: string;\n sourcePath: string;\n scope: \"project\" | \"user\";\n}\n\nexport type SkillResolutionFailure =\n | { kind: \"malformed\"; ref: string }\n | { kind: \"unknown-agent\"; ref: string; agentInput: string }\n | { kind: \"not-found\"; ref: string; searchedPaths: string[] };\n\nexport type SkillResolution = SkillSource | SkillResolutionFailure;\n\ninterface SearchTier {\n scope: \"project\" | \"user\";\n sourcePath: string;\n}\n\nfunction isMalformedSegment(segment: string): boolean {\n return (\n segment.length === 0 ||\n segment !== segment.trim() ||\n segment === \".\" ||\n segment === \"..\" ||\n segment.includes(\"\\n\") ||\n segment.includes(\"\\r\")\n );\n}\n\nfunction isDirectory(targetPath: string): boolean {\n try {\n return fs.statSync(targetPath).isDirectory();\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\") || hasOwnErrorCode(error, \"ENOTDIR\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction findSkill(\n ref: string,\n name: string,\n tiers: SearchTier[],\n sourceAgentId?: string\n): SkillResolution {\n for (const tier of tiers) {\n if (isDirectory(tier.sourcePath)) {\n return {\n kind: \"resolved\",\n ref,\n name,\n ...(sourceAgentId ? { sourceAgentId } : {}),\n sourcePath: tier.sourcePath,\n scope: tier.scope\n };\n }\n }\n\n return {\n kind: \"not-found\",\n ref,\n searchedPaths: tiers.map((tier) => tier.sourcePath)\n };\n}\n\nexport function resolveSkillReference(ref: string, cwd: string, homeDir: string): SkillResolution {\n const slashIndex = ref.indexOf(\"/\");\n const hasPrefix = slashIndex !== -1;\n\n if (\n ref.length === 0 ||\n ref !== ref.trim() ||\n (hasPrefix && ref.indexOf(\"/\", slashIndex + 1) !== -1)\n ) {\n return { kind: \"malformed\", ref };\n }\n\n if (!hasPrefix) {\n if (isMalformedSegment(ref)) {\n return { kind: \"malformed\", ref };\n }\n\n const tiers: SearchTier[] = [\n {\n scope: \"project\",\n sourcePath: path.resolve(cwd, \".poe-code/skills\", ref)\n },\n {\n scope: \"user\",\n sourcePath: path.resolve(homeDir, \".poe-code/skills\", ref)\n }\n ];\n\n return findSkill(ref, ref, tiers);\n }\n\n const agentInput = ref.slice(0, slashIndex);\n const name = ref.slice(slashIndex + 1);\n if (isMalformedSegment(agentInput) || isMalformedSegment(name)) {\n return { kind: \"malformed\", ref };\n }\n\n const support = resolveAgentSupport(agentInput);\n if (support.status !== \"supported\" || !support.id) {\n return { kind: \"unknown-agent\", ref, agentInput };\n }\n\n const config = getAgentConfig(support.id);\n if (!config) {\n return { kind: \"unknown-agent\", ref, agentInput };\n }\n\n const tiers: SearchTier[] = [\n {\n scope: \"project\",\n sourcePath: path.resolve(resolveSkillDir(config, \"local\", cwd), name)\n },\n {\n scope: \"user\",\n sourcePath: path.resolve(resolveSkillDir(config, \"global\", cwd, homeDir), name)\n }\n ];\n\n return findSkill(ref, name, tiers, support.id);\n}\n", "import { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\nexport type GitDirRunner = (cwd: string) => string | undefined;\n\nconst defaultMarkerPrefix = \"poe-code-spawn-skills\";\n\nfunction defaultGitDirRunner(cwd: string): string | undefined {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--git-dir\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return undefined;\n }\n}\n\nlet gitDirRunner: GitDirRunner = defaultGitDirRunner;\n\nexport function setGitDirRunnerForTest(runner: GitDirRunner): () => void {\n const previous = gitDirRunner;\n gitDirRunner = runner;\n return () => {\n gitDirRunner = previous;\n };\n}\n\nfunction resolveExcludePath(cwd: string): string | undefined {\n const gitDir = gitDirRunner(cwd);\n if (gitDir === undefined || gitDir.length === 0) {\n return undefined;\n }\n\n return path.join(path.isAbsolute(gitDir) ? gitDir : path.resolve(cwd, gitDir), \"info/exclude\");\n}\n\nfunction markers(runId: string, markerPrefix: string): { begin: string; end: string } {\n return {\n begin: `# ${markerPrefix}:${runId} begin`,\n end: `# ${markerPrefix}:${runId} end`\n };\n}\n\nfunction assertSingleLine(value: string, label: string): void {\n if (value.includes(\"\\n\") || value.includes(\"\\r\")) {\n throw new Error(`${label} must be a single line`);\n }\n}\n\nfunction readExcludeFile(excludePath: string): string | undefined {\n try {\n return fs.readFileSync(excludePath, \"utf8\");\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction assertNoSymbolicLink(targetPath: string): void {\n const parsed = path.parse(path.resolve(targetPath));\n let current = parsed.root;\n\n for (const segment of path.resolve(targetPath).slice(parsed.root.length).split(path.sep)) {\n if (segment.length === 0) {\n continue;\n }\n current = path.join(current, segment);\n try {\n if (fs.lstatSync(current).isSymbolicLink()) {\n throw new Error(`Refusing to update Git exclude path through symbolic link: ${current}`);\n }\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n }\n}\n\nfunction writeExcludeFile(excludePath: string, content: string): void {\n assertNoSymbolicLink(excludePath);\n fs.mkdirSync(path.dirname(excludePath), { recursive: true });\n assertNoSymbolicLink(excludePath);\n const tempPath = `${excludePath}.poe-code-${process.pid}-${randomUUID()}.tmp`;\n let tempCreated = false;\n try {\n assertNoSymbolicLink(tempPath);\n fs.writeFileSync(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n fs.renameSync(tempPath, excludePath);\n } catch (error) {\n if (tempCreated || !isAlreadyExistsError(error)) {\n try {\n fs.rmSync(tempPath, { force: true });\n } catch (cleanupError) {\n void cleanupError;\n }\n }\n throw error;\n }\n}\n\nfunction removeBlock(content: string, runId: string, markerPrefix: string): string {\n const { begin, end } = markers(runId, markerPrefix);\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n if (lines[index] === begin) {\n const endIndex = lines.indexOf(end, index + 1);\n if (endIndex !== -1) {\n index = endIndex;\n continue;\n }\n }\n\n result.push(lines[index]);\n }\n\n return result.join(\"\\n\");\n}\n\nfunction appendBlock(\n content: string | undefined,\n runId: string,\n entries: string[],\n markerPrefix: string\n): string {\n const { begin, end } = markers(runId, markerPrefix);\n const existing = content ?? \"\";\n const prefix = existing.length === 0 || existing.endsWith(\"\\n\") ? existing : `${existing}\\n`;\n return `${prefix}${[begin, ...entries, end, \"\"].join(\"\\n\")}`;\n}\n\nfunction nextBlockId(content: string | undefined, runId: string, markerPrefix: string): string {\n if (content === undefined || !content.includes(markers(runId, markerPrefix).begin)) {\n return runId;\n }\n\n let suffix = 1;\n while (content.includes(markers(`${runId}:${suffix}`, markerPrefix).begin)) {\n suffix += 1;\n }\n return `${runId}:${suffix}`;\n}\n\nexport function appendExcludeBlock(\n cwd: string,\n runId: string,\n entries: string[],\n opts?: { markerPrefix?: string }\n): string | undefined {\n assertSingleLine(runId, \"runId\");\n assertSingleLine(opts?.markerPrefix ?? defaultMarkerPrefix, \"markerPrefix\");\n for (const entry of entries) {\n assertSingleLine(entry, \"exclude entry\");\n }\n const excludePath = resolveExcludePath(cwd);\n if (excludePath === undefined) {\n return undefined;\n }\n\n assertNoSymbolicLink(excludePath);\n const content = readExcludeFile(excludePath);\n const markerPrefix = opts?.markerPrefix ?? defaultMarkerPrefix;\n const blockId = nextBlockId(content, runId, markerPrefix);\n writeExcludeFile(excludePath, appendBlock(content, blockId, entries, markerPrefix));\n return blockId;\n}\n\nexport function removeExcludeBlock(\n cwd: string,\n runId: string,\n opts?: { markerPrefix?: string }\n): void {\n assertSingleLine(runId, \"runId\");\n assertSingleLine(opts?.markerPrefix ?? defaultMarkerPrefix, \"markerPrefix\");\n const excludePath = resolveExcludePath(cwd);\n if (excludePath === undefined) {\n return;\n }\n\n const content = readExcludeFile(excludePath);\n if (content === undefined) {\n return;\n }\n\n writeExcludeFile(excludePath, removeBlock(content, runId, opts?.markerPrefix ?? defaultMarkerPrefix));\n}\n", "import * as fs from \"node:fs\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n getAgentConfig,\n resolveAgentSupport,\n resolveSkillDir,\n supportedAgents\n} from \"./configs.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport { appendExcludeBlock, removeExcludeBlock } from \"./git-exclude.js\";\nimport { resolveSkillReference, type SkillResolutionFailure } from \"./resolve-skill-reference.js\";\n\nexport interface BridgeEntry {\n ref: string;\n sourcePath: string;\n targetPath: string;\n createdParents: string[];\n}\n\nexport type BridgeWarningKind =\n | \"local-collision\"\n | \"global-collision\"\n | \"self-reference\"\n | \"intra-batch-collision\";\n\nexport interface BridgeWarning {\n kind: BridgeWarningKind;\n ref: string;\n sourcePath: string;\n conflictingPath: string;\n message: string;\n}\n\nexport interface BridgeManifest {\n spawnAgentId: string;\n cwd: string;\n runId: string;\n excludeBlockId?: string;\n entries: BridgeEntry[];\n warnings: BridgeWarning[];\n}\n\ninterface ActiveTarget {\n createdParents: string[];\n fingerprint: string;\n sourceFingerprint: string;\n sourcePath: string;\n references: number;\n token: string;\n}\n\ninterface ManifestState {\n excludeBlockId?: string;\n cleaned?: boolean;\n}\n\nconst activeTargets = new Map<string, ActiveTarget>();\nconst manifestStates = new WeakMap<BridgeManifest, ManifestState>();\nconst ownershipFileName = \".poe-code-bridge-owner\";\n\ntype ResolvedSkill = Extract<ReturnType<typeof resolveSkillReference>, { kind: \"resolved\" }>;\n\ninterface ResolvedBridgeSource {\n ref: string;\n source: ResolvedSkill;\n targetPath: string;\n globalTargetPath: string;\n}\n\nfunction pathExists(targetPath: string): boolean {\n try {\n fs.statSync(targetPath);\n return true;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction assertNoSymbolicLinkUnder(rootPath: string, targetPath: string): void {\n const root = path.resolve(rootPath);\n const target = path.resolve(targetPath);\n const relative = path.relative(root, target);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Refusing to bridge skills outside root ${root}: ${target}`);\n }\n\n let current = root;\n const segments = relative.length === 0 ? [] : relative.split(path.sep);\n\n for (const segment of segments) {\n if (segment.length === 0) {\n continue;\n }\n current = path.join(current, segment);\n try {\n if (fs.lstatSync(current).isSymbolicLink()) {\n throw new Error(`Refusing to bridge skills through symbolic link: ${current}`);\n }\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n }\n}\n\nfunction isDirectory(targetPath: string): boolean {\n try {\n return fs.statSync(targetPath).isDirectory();\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction formatResolutionFailureError(failures: SkillResolutionFailure[]): Error {\n const malformed = failures.filter((failure) => failure.kind === \"malformed\");\n const unknownAgent = failures.filter((failure) => failure.kind === \"unknown-agent\");\n const notFound = failures.filter((failure) => failure.kind === \"not-found\");\n const lines = [\n `Failed to bridge active skills: ${failures.length} skill reference(s) could not be resolved.`\n ];\n\n if (malformed.length > 0) {\n lines.push(\"\", \"Malformed skill references:\");\n for (const failure of malformed) {\n lines.push(`- ${failure.ref}`);\n }\n lines.push('Expected syntax: \"<name>\" or \"<agentId>/<name>\".');\n }\n\n if (unknownAgent.length > 0) {\n lines.push(\"\", \"Unknown agent references:\");\n for (const failure of unknownAgent) {\n lines.push(`- ${failure.ref} (agent token: ${failure.agentInput})`);\n }\n lines.push(`Supported agents: ${supportedAgents.join(\", \")}.`);\n }\n\n if (notFound.length > 0) {\n lines.push(\"\", \"Not found skill references.\");\n for (const failure of notFound) {\n lines.push(`- ${failure.ref}`);\n lines.push(\" searched paths:\");\n for (const searchedPath of failure.searchedPaths) {\n lines.push(` - ${searchedPath}`);\n }\n }\n }\n\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction copyDirectory(sourcePath: string, targetPath: string): void {\n fs.mkdirSync(targetPath, { recursive: true });\n for (const dirent of fs.readdirSync(sourcePath, { withFileTypes: true })) {\n const childSource = path.join(sourcePath, dirent.name);\n const childTarget = path.join(targetPath, dirent.name);\n\n if (dirent.isSymbolicLink()) {\n throw new Error(`Refusing to bridge skill containing symbolic link: ${childSource}`);\n }\n\n if (dirent.isDirectory()) {\n copyDirectory(childSource, childTarget);\n continue;\n }\n\n if (dirent.isFile()) {\n fs.copyFileSync(childSource, childTarget);\n continue;\n }\n\n throw new Error(`Refusing to bridge unsupported filesystem entry: ${childSource}`);\n }\n}\n\nfunction directoryFingerprint(targetPath: string): string {\n const hash = createHash(\"sha256\");\n\n function visit(currentPath: string, relativePath: string): void {\n const stats = fs.lstatSync(currentPath);\n if (stats.isSymbolicLink()) {\n throw new Error(`Refusing to inspect bridged skill through symbolic link: ${currentPath}`);\n }\n if (stats.isDirectory()) {\n hash.update(`d:${relativePath}\\n`);\n for (const name of fs.readdirSync(currentPath).sort()) {\n visit(path.join(currentPath, name), path.join(relativePath, name));\n }\n return;\n }\n if (stats.isFile()) {\n hash.update(`f:${relativePath}\\n`);\n hash.update(fs.readFileSync(currentPath));\n return;\n }\n throw new Error(`Refusing to bridge unsupported filesystem entry: ${currentPath}`);\n }\n\n visit(targetPath, \".\");\n return hash.digest(\"hex\");\n}\n\nfunction ownershipPath(targetPath: string): string {\n return path.join(targetPath, ownershipFileName);\n}\n\nfunction hasOwnershipToken(targetPath: string, token: string): boolean {\n try {\n return fs.readFileSync(ownershipPath(targetPath), \"utf8\") === token;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction collectMissingParents(targetPath: string): string[] {\n const parents: string[] = [];\n let current = path.dirname(targetPath);\n\n while (!pathExists(current)) {\n parents.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return parents.reverse();\n}\n\nfunction removeDirectoryIfEmpty(targetPath: string): void {\n try {\n fs.rmdirSync(targetPath);\n } catch (error) {\n if (\n hasOwnErrorCode(error, \"ENOENT\") ||\n hasOwnErrorCode(error, \"ENOTEMPTY\") ||\n hasOwnErrorCode(error, \"EEXIST\")\n ) {\n return;\n }\n throw error;\n }\n}\n\nfunction removeTarget(targetPath: string): void {\n fs.rmSync(targetPath, { recursive: true, force: true });\n}\n\nfunction rollbackEntries(entries: BridgeEntry[]): void {\n for (const entry of [...entries].reverse()) {\n const activeTarget = activeTargets.get(entry.targetPath);\n if (activeTarget && activeTarget.references > 1) {\n activeTarget.references -= 1;\n continue;\n }\n activeTargets.delete(entry.targetPath);\n removeTarget(entry.targetPath);\n for (const parent of [...(activeTarget?.createdParents ?? entry.createdParents)].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n}\n\nfunction toCwdRelative(cwd: string, targetPath: string): string {\n return path.relative(cwd, targetPath);\n}\n\nfunction warning(\n kind: BridgeWarningKind,\n ref: string,\n sourcePath: string,\n conflictingPath: string\n): BridgeWarning {\n const messages: Record<BridgeWarningKind, string> = {\n \"intra-batch-collision\": `Skipping ${ref}: an earlier bridged skill already targets ${conflictingPath}.`,\n \"local-collision\": `Skipping ${ref}: local skill already exists at ${conflictingPath}.`,\n \"global-collision\": `Skipping ${ref}: global skill already exists at ${conflictingPath}.`,\n \"self-reference\": `Skipping ${ref}: spawning agent already sees this native skill at ${conflictingPath}.`\n };\n\n return {\n kind,\n ref,\n sourcePath,\n conflictingPath,\n message: messages[kind]\n };\n}\n\nexport function bridgeActiveSkills(\n spawnAgentId: string,\n cwd: string,\n refs: string[],\n homeDir: string,\n runId: string\n): BridgeManifest {\n const spawnConfig = getAgentConfig(spawnAgentId);\n const spawnSupport = resolveAgentSupport(spawnAgentId);\n if (!spawnConfig || spawnSupport.status !== \"supported\" || !spawnSupport.id) {\n throw new Error(\n `Unsupported spawn agent \"${spawnAgentId}\". Supported agents: ${supportedAgents.join(\", \")}.`\n );\n }\n\n const targetDir = resolveSkillDir(spawnConfig, \"local\", cwd);\n const globalTargetDir = resolveSkillDir(spawnConfig, \"global\", cwd, homeDir);\n const resolutions = refs.map((ref) => resolveSkillReference(ref, cwd, homeDir));\n const failures = resolutions.filter(\n (resolution): resolution is SkillResolutionFailure => resolution.kind !== \"resolved\"\n );\n if (failures.length > 0) {\n throw formatResolutionFailureError(failures);\n }\n\n const sources: ResolvedBridgeSource[] = resolutions.map((source, index) => ({\n ref: refs[index]!,\n source: source as ResolvedSkill,\n targetPath: path.resolve(targetDir, (source as ResolvedSkill).name),\n globalTargetPath: path.resolve(globalTargetDir, (source as ResolvedSkill).name)\n }));\n\n const entries: BridgeEntry[] = [];\n const warnings: BridgeWarning[] = [];\n const claimedTargets = new Set<string>();\n\n try {\n for (const item of sources) {\n if (claimedTargets.has(item.targetPath)) {\n warnings.push(\n warning(\"intra-batch-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n\n if (item.source.sourceAgentId === spawnSupport.id) {\n warnings.push(\n warning(\"self-reference\", item.ref, item.source.sourcePath, item.source.sourcePath)\n );\n continue;\n }\n\n const activeTarget = activeTargets.get(item.targetPath);\n if (activeTarget && pathExists(item.targetPath)) {\n if (activeTarget.sourcePath === item.source.sourcePath) {\n const sourceRoot = item.source.scope === \"project\" ? cwd : homeDir;\n assertNoSymbolicLinkUnder(sourceRoot, item.source.sourcePath);\n const sourceFingerprint = directoryFingerprint(item.source.sourcePath);\n if (\n sourceFingerprint === activeTarget.sourceFingerprint &&\n hasOwnershipToken(item.targetPath, activeTarget.token) &&\n directoryFingerprint(item.targetPath) === activeTarget.fingerprint\n ) {\n activeTarget.references += 1;\n claimedTargets.add(item.targetPath);\n entries.push({\n ref: item.ref,\n sourcePath: item.source.sourcePath,\n targetPath: item.targetPath,\n createdParents: []\n });\n continue;\n }\n\n warnings.push(\n warning(\"local-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n activeTargets.delete(item.targetPath);\n }\n\n if (pathExists(item.targetPath)) {\n warnings.push(\n warning(\"local-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n\n if (isDirectory(item.globalTargetPath)) {\n warnings.push(\n warning(\"global-collision\", item.ref, item.source.sourcePath, item.globalTargetPath)\n );\n continue;\n }\n\n const sourceRoot = item.source.scope === \"project\" ? cwd : homeDir;\n assertNoSymbolicLinkUnder(sourceRoot, item.source.sourcePath);\n const sourceFingerprint = directoryFingerprint(item.source.sourcePath);\n const createdParents = collectMissingParents(item.targetPath);\n assertNoSymbolicLinkUnder(cwd, path.dirname(item.targetPath));\n fs.mkdirSync(path.dirname(item.targetPath), { recursive: true });\n const token = randomUUID();\n try {\n copyDirectory(item.source.sourcePath, item.targetPath);\n fs.writeFileSync(ownershipPath(item.targetPath), token, \"utf8\");\n const fingerprint = directoryFingerprint(item.targetPath);\n claimedTargets.add(item.targetPath);\n entries.push({\n ref: item.ref,\n sourcePath: item.source.sourcePath,\n targetPath: item.targetPath,\n createdParents\n });\n activeTargets.set(item.targetPath, {\n createdParents,\n fingerprint,\n sourceFingerprint,\n sourcePath: item.source.sourcePath,\n references: 1,\n token\n });\n } catch (error) {\n removeTarget(item.targetPath);\n for (const parent of [...createdParents].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n throw error;\n }\n }\n\n let excludeBlockId: string | undefined;\n if (entries.length > 0) {\n excludeBlockId = appendExcludeBlock(\n cwd,\n runId,\n entries.map((entry) => toCwdRelative(cwd, entry.targetPath))\n );\n }\n\n const manifest = {\n spawnAgentId,\n cwd,\n runId,\n ...(excludeBlockId !== undefined && excludeBlockId !== runId ? { excludeBlockId } : {}),\n entries,\n warnings\n };\n manifestStates.set(manifest, { excludeBlockId });\n return manifest;\n } catch (error) {\n rollbackEntries(entries);\n throw error;\n }\n}\n\nexport function cleanupBridgedSkills(manifest: BridgeManifest): void {\n const state = manifestStates.get(manifest);\n if (state?.cleaned) {\n return;\n }\n removeExcludeBlock(\n manifest.cwd,\n state?.excludeBlockId ?? manifest.excludeBlockId ?? manifest.runId\n );\n for (const entry of manifest.entries) {\n const activeTarget = activeTargets.get(entry.targetPath);\n if (!activeTarget) {\n continue;\n }\n if (activeTarget.references > 1) {\n activeTarget.references -= 1;\n continue;\n }\n activeTargets.delete(entry.targetPath);\n if (\n pathExists(entry.targetPath) &&\n hasOwnershipToken(entry.targetPath, activeTarget.token) &&\n directoryFingerprint(entry.targetPath) === activeTarget.fingerprint\n ) {\n removeTarget(entry.targetPath);\n for (const parent of [...activeTarget.createdParents].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n }\n if (state) {\n state.cleaned = true;\n }\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { UserError } from \"toolcraft\";\nimport {\n getAgentConfig,\n resolveAgentSupport as resolveSkillAgentSupport,\n supportedAgents as skillSupportedAgents\n} from \"@poe-code/agent-skill-config\";\nimport { hasOwnErrorCode } from \"../errors.js\";\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 rename(oldPath: string, newPath: string): 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 lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\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 hasOwnErrorCode(error, \"ENOENT\");\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 try {\n terminalPilotTemplateCache = await nodeFs.readFile(\n new URL(\"../templates/terminal-pilot.md\", import.meta.url),\n \"utf8\"\n );\n return terminalPilotTemplateCache;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\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 await assertNoSymbolicLinkPath(fs, folderPath);\n\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\nexport async function assertNoSymbolicLinkPath(\n fs: Pick<TerminalPilotInstallerFileSystem, \"lstat\">,\n targetPath: string\n): Promise<void> {\n const rootPath = path.parse(targetPath).root;\n let currentPath = targetPath;\n\n while (currentPath !== rootPath) {\n try {\n if ((await fs.lstat(currentPath)).isSymbolicLink()) {\n throw new UserError(`Refusing terminal-pilot skill operation through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n\n currentPath = path.dirname(currentPath);\n }\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { defineCommand, S } from \"toolcraft\";\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 \"toolcraft\";\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 { UserError, defineCommand, S } from \"toolcraft\";\nimport { TERMINAL_KEY_PATTERN, keyToSequence, type TerminalKey } from \"../keys.js\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n key: S.String({ description: \"Named key to press\", pattern: TERMINAL_KEY_PATTERN }),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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 assertTerminalKey(params.key);\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(\n params.session,\n env\n );\n await namedSession.session.press(params.key as TerminalKey);\n return undefined;\n }\n});\n\nfunction assertTerminalKey(key: string): asserts key is TerminalKey {\n try {\n keyToSequence(key as TerminalKey);\n } catch (error) {\n throw new UserError(error instanceof Error ? error.message : String(error));\n }\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n last: S.Optional(\n S.Number({\n short: \"n\",\n description: \"Return only the last N lines\",\n jsonType: \"integer\",\n minimum: 0\n })\n )\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(\n params.session,\n env\n );\n const lines = await namedSession.session.history({ last: params.last });\n return { lines, exitCode: namedSession.session.exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\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 \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n cols: S.Number({ description: \"Terminal width in columns\", jsonType: \"integer\", minimum: 1 }),\n rows: S.Number({ description: \"Terminal height in rows\", jsonType: \"integer\", minimum: 1 }),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.resize(params.cols, params.rows);\n return undefined;\n }\n});\n", "import { randomUUID } from \"node:crypto\";\nimport { rename, rm, writeFile } from \"node:fs/promises\";\nimport { parseAnsi } from \"./ansi-parser.js\";\nimport { hasOwnErrorCode } from \"./error-codes.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 if (\n options.padding !== undefined &&\n (!Number.isInteger(options.padding) || options.padding < 0)\n ) {\n throw new Error(\"Padding must be a non-negative integer.\");\n }\n if (options.output !== undefined && options.output.length === 0) {\n throw new Error(\"Output path must not be empty.\");\n }\n\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 !== undefined) {\n const temporaryPath = `${options.output}.${randomUUID()}.tmp`;\n let temporaryCreated = false;\n try {\n await writeFile(temporaryPath, png, { flag: \"wx\" });\n temporaryCreated = true;\n await rename(temporaryPath, options.output);\n } catch (error) {\n if (temporaryCreated || !isAlreadyExistsError(error)) {\n try {\n await rm(temporaryPath, { force: true });\n } catch (cleanupError) {\n void cleanupError;\n }\n }\n throw error;\n }\n }\n\n return png;\n}\n\nfunction isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && hasOwnErrorCode(error, \"EEXIST\");\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 inverse: boolean;\n conceal: boolean;\n};\n\ntype StyleState = Omit<StyledRun, \"text\">;\n\nconst ESC = \"\\u001b\";\nconst TAB_WIDTH = 8;\nconst MAX_TERMINAL_ROWS = 1000;\nconst MAX_TERMINAL_COLUMNS = 1000;\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 inverse: false,\n conceal: 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 left.inverse === right.inverse &&\n left.conceal === right.conceal &&\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 inverse: style.inverse,\n conceal: style.conceal\n });\n}\n\nfunction parseCsi(\n input: string,\n start: number,\n prefixLength: number\n): { end: number; final: string | null; params: string } {\n let index = start + prefixLength;\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 + prefixLength, index)\n };\n }\n\n index += 1;\n }\n\n return {\n end: input.length,\n final: null,\n params: input.slice(start + prefixLength)\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\n for (let index = 0; index < rawParams.length; index += 1) {\n const rawParam = rawParams[index] ?? \"\";\n const colonColor = applyColonExtendedColor(rawParam);\n if (colonColor !== undefined) {\n if (colonColor !== null) {\n if (colonColor.target === 38) {\n nextStyle.fg = colonColor.color;\n } else {\n nextStyle.bg = colonColor.color;\n }\n }\n continue;\n }\n\n const value = rawParam.length === 0 ? 0 : toInteger(rawParam);\n if (value === null) {\n return nextStyle;\n }\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 === 7) {\n nextStyle.inverse = true;\n continue;\n }\n\n if (value === 27) {\n nextStyle.inverse = false;\n continue;\n }\n\n if (value === 8) {\n nextStyle.conceal = true;\n continue;\n }\n\n if (value === 28) {\n nextStyle.conceal = 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 params = rawParams.map((param) => toInteger(param));\n const extended = params.every((param) => param !== null)\n ? applyExtendedColor(params as number[], index + 1)\n : null;\n if (!extended) {\n if (rawParams[index + 1] === \"2\" || rawParams[index + 1] === \"5\") {\n break;\n }\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\nfunction applyColonExtendedColor(\n rawParam: string\n): { target: 38 | 48; color: Color } | null | undefined {\n if (!rawParam.includes(\":\")) {\n return undefined;\n }\n\n const segments = rawParam.split(\":\");\n const target = toInteger(segments[0]);\n if (target !== 38 && target !== 48) {\n return null;\n }\n\n const mode = toInteger(segments[1]);\n if (mode === 5) {\n const index = toInteger(segments[2]);\n return index === null ? null : { target, color: { type: \"ansi8\", index: clampByte(index) } };\n }\n\n if (mode !== 2) {\n return null;\n }\n\n const offset = segments[2] === \"\" ? 3 : 2;\n const r = toInteger(segments[offset]);\n const g = toInteger(segments[offset + 1]);\n const b = toInteger(segments[offset + 2]);\n if (r === null || g === null || b === null) {\n return null;\n }\n\n return { target, color: { type: \"rgb\", r: clampByte(r), g: clampByte(g), b: clampByte(b) } };\n}\n\ntype DisplayCell = { text: string; style: StyleState };\n\nfunction parseOscEnd(input: string, start: number): number {\n let index = start + 2;\n while (index < input.length) {\n if (input[index] === \"\\u0007\") {\n return index + 1;\n }\n if (input[index] === ESC && input[index + 1] === \"\\\\\") {\n return index + 2;\n }\n index += 1;\n }\n return input.length;\n}\n\nfunction positionParameter(params: string, index: number, fallback: number): number {\n const value = toInteger(params.split(\";\")[index]);\n return value === null || value < 1 ? fallback : value;\n}\n\nfunction modeParameter(params: string, fallback: number): number {\n const value = toInteger(params.split(\";\")[0]);\n return value === null ? fallback : value;\n}\n\nfunction displayWidth(text: string): number {\n if (text === \"\\t\") {\n return TAB_WIDTH;\n }\n\n const codePoint = text.codePointAt(0);\n if (codePoint === undefined) {\n return 0;\n }\n\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1f64f) ||\n (codePoint >= 0x1f900 && codePoint <= 0x1f9ff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return 2;\n }\n\n return 1;\n}\n\nfunction hasRenderableCell(line: DisplayCell[] | undefined): boolean {\n return (line ?? []).some((cell) => cell !== undefined && cell.text.length > 0);\n}\n\nfunction buildRuns(\n lines: DisplayCell[][],\n lineBreakStyles: Array<StyleState | undefined>\n): StyledRun[] {\n const runs: StyledRun[] = [];\n const defaultStyle = createDefaultStyle();\n let lastRow = lines.length - 1;\n while (\n lastRow > 0 &&\n !hasRenderableCell(lines[lastRow]) &&\n lineBreakStyles[lastRow - 1] === undefined\n ) {\n lastRow -= 1;\n }\n\n for (let row = 0; row <= lastRow; row += 1) {\n const line = lines[row] ?? [];\n let lastCell = line.length - 1;\n while (lastCell >= 0 && line[lastCell] === undefined) {\n lastCell -= 1;\n }\n for (let column = 0; column <= lastCell; column += 1) {\n const cell = line[column] ?? { text: \" \", style: defaultStyle };\n pushRun(runs, cell.style, cell.text);\n }\n if (row < lastRow) {\n pushRun(runs, lineBreakStyles[row] ?? defaultStyle, \"\\n\");\n }\n }\n\n return runs;\n}\n\nexport function parseAnsi(input: string): StyledRun[] {\n const lines: DisplayCell[][] = [[]];\n const lineBreakStyles: Array<StyleState | undefined> = [];\n let style = createDefaultStyle();\n let row = 0;\n let column = 0;\n let savedRow = 0;\n let savedColumn = 0;\n let index = 0;\n\n const clampRow = (nextRow: number): number => {\n if (nextRow < 0) {\n return 0;\n }\n return Math.min(nextRow, MAX_TERMINAL_ROWS - 1);\n };\n\n const clampColumn = (nextColumn: number): number => {\n if (nextColumn < 0) {\n return 0;\n }\n return Math.min(nextColumn, MAX_TERMINAL_COLUMNS - 1);\n };\n\n const ensureLine = (): void => {\n while (lines.length <= row) {\n lines.push([]);\n }\n };\n\n const moveDown = (keepColumn: boolean): void => {\n lineBreakStyles[row] = cloneStyle(style);\n row = clampRow(row + 1);\n if (!keepColumn) {\n column = 0;\n }\n ensureLine();\n };\n\n const eraseLine = (mode: number): void => {\n const line = lines[row] ?? [];\n if (mode === 1) {\n for (let cell = 0; cell <= column; cell += 1) {\n delete line[cell];\n }\n return;\n }\n if (mode === 2) {\n lines[row] = [];\n return;\n }\n line.splice(column);\n };\n\n const eraseDisplay = (mode: number): void => {\n if (mode === 1) {\n for (let lineRow = 0; lineRow < row; lineRow += 1) {\n lines[lineRow] = [];\n }\n eraseLine(1);\n return;\n }\n if (mode === 2 || mode === 3) {\n lines.length = 0;\n lineBreakStyles.length = 0;\n ensureLine();\n return;\n }\n\n eraseLine(0);\n lines.splice(row + 1);\n lineBreakStyles.splice(row);\n };\n\n const saveCursor = (): void => {\n savedRow = row;\n savedColumn = column;\n };\n\n const restoreCursor = (): void => {\n row = clampRow(savedRow);\n column = clampColumn(savedColumn);\n ensureLine();\n };\n\n const writeText = (text: string): void => {\n const width = displayWidth(text);\n if (width === 0) {\n return;\n }\n\n lines[row]![column] = { text, style: cloneStyle(style) };\n for (let offset = 1; offset < width && column + offset < MAX_TERMINAL_COLUMNS; offset += 1) {\n lines[row]![column + offset] = { text: \"\", style: cloneStyle(style) };\n }\n column = clampColumn(column + width);\n };\n\n while (index < input.length) {\n const char = input[index];\n\n if (char === \"\\n\") {\n moveDown(false);\n index += 1;\n continue;\n }\n if (char === \"\\v\") {\n moveDown(true);\n index += 1;\n continue;\n }\n if (char === \"\\r\") {\n column = 0;\n index += 1;\n continue;\n }\n if (char === \"\\b\") {\n column = Math.max(0, column - 1);\n index += 1;\n continue;\n }\n if (char === \"\\t\") {\n const nextTabStop = Math.min(\n Math.floor(column / TAB_WIDTH) * TAB_WIDTH + TAB_WIDTH,\n MAX_TERMINAL_COLUMNS\n );\n while (column < nextTabStop) {\n writeText(\" \");\n }\n index += 1;\n continue;\n }\n if (char === ESC && input[index + 1] === \"]\") {\n index = parseOscEnd(input, index);\n continue;\n }\n if (char === ESC && input[index + 1] === \"7\") {\n saveCursor();\n index += 2;\n continue;\n }\n if (char === ESC && input[index + 1] === \"8\") {\n restoreCursor();\n index += 2;\n continue;\n }\n\n const csiPrefixLength =\n char === \"\\u009b\" ? 1 : char === ESC && input[index + 1] === \"[\" ? 2 : null;\n if (csiPrefixLength !== null) {\n const sequence = parseCsi(input, index, csiPrefixLength);\n if (sequence.final === \"m\") {\n style = applySgr(style, sequence.params);\n } else if (sequence.final === \"G\") {\n column = clampColumn(positionParameter(sequence.params, 0, 1) - 1);\n } else if (sequence.final === \"C\") {\n column = clampColumn(column + positionParameter(sequence.params, 0, 1));\n } else if (sequence.final === \"D\") {\n column = Math.max(0, column - positionParameter(sequence.params, 0, 1));\n } else if (sequence.final === \"A\") {\n row = clampRow(row - positionParameter(sequence.params, 0, 1));\n } else if (sequence.final === \"B\") {\n row = clampRow(row + positionParameter(sequence.params, 0, 1));\n ensureLine();\n } else if (sequence.final === \"E\") {\n row = clampRow(row + positionParameter(sequence.params, 0, 1));\n column = 0;\n ensureLine();\n } else if (sequence.final === \"F\") {\n row = clampRow(row - positionParameter(sequence.params, 0, 1));\n column = 0;\n } else if (sequence.final === \"H\" || sequence.final === \"f\") {\n row = clampRow(positionParameter(sequence.params, 0, 1) - 1);\n column = clampColumn(positionParameter(sequence.params, 1, 1) - 1);\n ensureLine();\n } else if (sequence.final === \"K\") {\n eraseLine(modeParameter(sequence.params, 0));\n } else if (sequence.final === \"J\") {\n eraseDisplay(modeParameter(sequence.params, 0));\n } else if (sequence.final === \"s\") {\n saveCursor();\n } else if (sequence.final === \"u\") {\n restoreCursor();\n }\n index = sequence.end;\n continue;\n }\n\n const codePoint = input.codePointAt(index);\n const text = codePoint === undefined ? \"\" : String.fromCodePoint(codePoint);\n writeText(text);\n index += text.length;\n }\n\n return buildRuns(lines, lineBreakStyles);\n}\n", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\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 = Object.freeze([\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) => displayWidth(line.map((run) => run.text).join(\"\")) * CHARACTER_WIDTH),\n 0\n );\n}\n\nfunction displayWidth(text: string, startColumn = 0): number {\n const segmenter = new Intl.Segmenter();\n let column = startColumn;\n\n for (const { segment } of segmenter.segment(text)) {\n if (segment === \"\\t\") {\n column += 8 - (column % 8);\n continue;\n }\n\n const cp = segment.codePointAt(0);\n if (cp !== undefined && isZeroWidthCodePoint(cp)) {\n continue;\n }\n\n column += cp !== undefined && (isWideCodePoint(cp) || isFlagSegment(segment)) ? 2 : 1;\n }\n\n return column - startColumn;\n}\n\nfunction isZeroWidthCodePoint(cp: number): boolean {\n return (cp >= 0x0300 && cp <= 0x036f) || (cp >= 0x1ab0 && cp <= 0x1aff) || (cp >= 0x1dc0 && cp <= 0x1dff) || (cp >= 0x20d0 && cp <= 0x20ff) || (cp >= 0xfe20 && cp <= 0xfe2f);\n}\n\nfunction isFlagSegment(segment: string): boolean {\n const codePoints = [...segment].map((character) => character.codePointAt(0));\n return codePoints.length === 2 && codePoints.every((cp) => cp !== undefined && cp >= 0x1f1e6 && cp <= 0x1f1ff);\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 renderBackgrounds(line, textStartX, textStartY + (index * lineHeightPx) - lineHeightPx, lineHeightPx),\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 renderBackgrounds(line: StyledRun[], startX: number, y: number, height: number): string {\n let column = 0;\n const rectangles: string[] = [];\n\n for (const run of line) {\n const width = displayWidth(run.text, column);\n const background = resolveBackgroundColor(run);\n if (background !== BACKGROUND && width > 0) {\n rectangles.push(`<rect x=\"${formatNumber(startX + (column * CHARACTER_WIDTH))}\" y=\"${formatNumber(y)}\" width=\"${formatNumber(width * CHARACTER_WIDTH)}\" height=\"${formatNumber(height)}\" fill=\"${escapeXmlAttribute(background)}\" />`);\n }\n column += width;\n }\n\n return rectangles.join(\"\");\n}\n\nfunction renderRun(run: StyledRun): string {\n const attributes = ['xml:space=\"preserve\"'];\n const color = resolveForegroundColor(run);\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 const text = run.conceal ? \" \".repeat(displayWidth(run.text)) : run.text;\n return `<tspan ${attributes.join(\" \")}>${escapeXmlText(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 resolveForegroundColor(run: StyledRun): string {\n return run.inverse ? resolveColorOrDefault(run.bg, BACKGROUND) : resolveColor(run.fg);\n}\n\nfunction resolveBackgroundColor(run: StyledRun): string {\n return run.inverse ? resolveColor(run.fg) : resolveColorOrDefault(run.bg, BACKGROUND);\n}\n\nfunction resolveColorOrDefault(color: Color | null, defaultColor: string): string {\n return color === null ? defaultColor : resolveColor(color);\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n}\n\nfunction formatNumber(value: number): string {\n return value.toFixed(2);\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { renderTerminalPng } from \"terminal-png\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\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(\n S.Number({\n short: \"p\",\n description: \"Padding around terminal content\",\n jsonType: \"integer\",\n minimum: 0\n })\n )\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(\n params.session,\n env\n );\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 \"toolcraft\";\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(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.signal(params.signal);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\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(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.type(params.text);\n return undefined;\n }\n});\n", "import { randomUUID } from \"node:crypto\";\nimport { defineCommand, S } from \"toolcraft\";\nimport { hasOwnErrorCode } from \"../errors.js\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n assertNoSymbolicLinkPath,\n getSkillFolderWithHome,\n installableAgents,\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 skills = [localSkill, globalSkill];\n const staged: Array<{ fullPath: string; stagingPath: string; displayPath: string }> = [];\n\n try {\n for (const skill of skills) {\n await assertNoSymbolicLinkPath(services.fs, skill.fullPath);\n\n if (!(await folderExists(services.fs, skill.fullPath))) {\n continue;\n }\n\n const stagingPath = `${skill.fullPath}.removing-${randomUUID()}`;\n await services.fs.rename(skill.fullPath, stagingPath);\n staged.push({ ...skill, stagingPath });\n }\n } catch (error) {\n for (const skill of staged.reverse()) {\n await services.fs.rename(skill.stagingPath, skill.fullPath);\n }\n throw error;\n }\n\n if (typeof services.fs.rm === \"function\") {\n await Promise.allSettled(\n staged.map((skill) => services.fs.rm!(skill.stagingPath, { recursive: true, force: true }))\n );\n }\n\n return {\n agent,\n removedSkillPaths: staged.map((skill) => skill.displayPath)\n };\n }\n});\n\nasync function folderExists(\n fs: ReturnType<typeof resolveInstallerServices>[\"fs\"],\n folderPath: string\n): Promise<boolean> {\n try {\n await fs.stat(folderPath);\n return true;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n\n throw error;\n }\n}\n", "import { UserError, defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n pattern: S.String({\n description: \"Regular expression pattern to wait for\",\n minLength: 1,\n pattern: \"\\\\S\"\n }),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n timeout: S.Optional(\n S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\", minimum: 0 })\n ),\n scope: S.Optional(\n S.Enum([\"history\", \"screen\"], {\n description: \"Search all captured output or only the current visible screen\"\n })\n ),\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 if (params.pattern.trim().length === 0) {\n throw new UserError(\"Wait pattern must not be empty.\");\n }\n assertTimeout(params.timeout);\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(\n params.session,\n env\n );\n const pattern = params.literal === true ? params.pattern : new RegExp(params.pattern);\n const options =\n params.timeout === undefined && params.scope === undefined\n ? undefined\n : {\n ...(params.timeout === undefined ? {} : { timeout: params.timeout }),\n ...(params.scope === undefined ? {} : { scope: params.scope })\n };\n const line = await namedSession.session.waitFor(pattern, options);\n\n return { matched: true, line };\n }\n});\n\nfunction assertTimeout(timeout: number | undefined): void {\n if (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) {\n throw new UserError(\"Timeout must be a finite non-negative number.\");\n }\n}\n", "import { UserError, defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n timeout: S.Optional(\n S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\", minimum: 0 })\n )\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 if (params.timeout !== undefined && (!Number.isFinite(params.timeout) || params.timeout < 0)) {\n throw new UserError(\"Timeout must be a finite non-negative number.\");\n }\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(\n params.session,\n env\n );\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 \"toolcraft\";\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 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 install,\n uninstall\n] as const;\n\nexport function createTerminalPilotGroup() {\n return defineGroup<TerminalPilotCommandServices, \"terminal-pilot\", typeof children, readonly [\"cli\", \"mcp\", \"sdk\"]>({\n name: \"terminal-pilot\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n children: [...children] as unknown as typeof children\n });\n}\n\nexport const terminalPilotGroup = Object.freeze(createTerminalPilotGroup());\n", "import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { UserError } from \"toolcraft\";\nimport {\n SESSION_ENV_VAR,\n createTerminalPilotRuntime,\n type TerminalPilotRuntime\n} from \"./runtime.js\";\nimport type { TerminalKey } from \"../keys.js\";\nimport type { TerminalSession, WaitForOptions } from \"../terminal-session.js\";\n\nconst RUNTIME_DIR_ENV = \"TERMINAL_PILOT_RUNTIME_DIR\";\nconst DAEMON_ARG = \"__daemon\";\nconst START_TIMEOUT_MS = 5_000;\nconst IDLE_SHUTDOWN_MS = 1_000;\n\ntype SessionInfo = {\n id: string;\n command: string;\n pid: number;\n exitCode: number | null;\n};\n\ntype RpcRequest = {\n id: number;\n method: string;\n params?: unknown;\n};\n\ntype RpcResponse =\n | {\n id: number;\n ok: true;\n result: unknown;\n }\n | {\n id: number;\n ok: false;\n error: { message: string };\n };\n\ntype HandlerEnvLike = {\n get(key: string): string | undefined;\n};\n\ntype SessionProxy = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\nexport function isTerminalPilotDaemonArgv(argv: string[]): boolean {\n return argv[2] === DAEMON_ARG;\n}\n\nexport async function runTerminalPilotDaemon(): Promise<void> {\n const runtime = createTerminalPilotRuntime();\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n const server = net.createServer((socket) => {\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n void handleRequestLine(runtime, line).then((response) => {\n socket.write(`${JSON.stringify(response)}\\n`);\n scheduleIdleShutdown();\n });\n }\n });\n });\n\n async function shutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n await runtime.close();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n }\n\n async function scheduleIdleShutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n\n if (await runtime.hasRetainedSessions()) {\n return;\n }\n\n idleTimer = setTimeout(() => {\n void shutdown().then(() => {\n process.exit(0);\n });\n }, IDLE_SHUTDOWN_MS);\n }\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(socketPath, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n}\n\nexport function createDaemonTerminalPilotRuntime(): TerminalPilotRuntime {\n let nextId = 1;\n\n async function request<T>(method: string, params?: unknown): Promise<T> {\n await ensureDaemon();\n return sendRequest<T>(method, params, nextId++);\n }\n\n function proxySession(name: string, info: SessionInfo): SessionProxy {\n return {\n id: info.id,\n command: info.command,\n pid: info.pid,\n exitCode: info.exitCode,\n fill: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"fill\", args: [text] });\n },\n type: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"type\", args: [text] });\n },\n press: async (key: string) => {\n await request(\"sessionAction\", { name, action: \"press\", args: [key] });\n },\n signal: async (signal: string) => {\n await request(\"sessionAction\", { name, action: \"signal\", args: [signal] });\n },\n waitFor: async (pattern: string | RegExp, options?: WaitForOptions) =>\n request(\"sessionAction\", {\n name,\n action: \"waitFor\",\n args: [serializePattern(pattern), options]\n }),\n waitForExit: async (options?: { timeout?: number }) =>\n request(\"sessionAction\", { name, action: \"waitForExit\", args: [options] }),\n screen: async () => request(\"sessionAction\", { name, action: \"screen\", args: [] }),\n history: async (options?: { last?: number }) =>\n request(\"sessionAction\", { name, action: \"history\", args: [options] }),\n resize: async (cols: number, rows: number) => {\n await request(\"sessionAction\", { name, action: \"resize\", args: [cols, rows] });\n },\n close: async () => {\n const result = await request<{ exitCode: number }>(\"closeSession\", { name });\n return result.exitCode;\n }\n };\n }\n\n return {\n async createSession(params, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"createSession\", {\n params: {\n ...params,\n cwd: params.cwd ?? process.cwd()\n },\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async resolveSession(name, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"resolveSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async closeSession(name, env) {\n return request(\"closeSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n },\n\n async listSessions() {\n const sessions = await request<Array<{ name: string; session: SessionInfo }>>(\"listSessions\");\n return sessions.map((entry) => ({\n name: entry.name,\n session: proxySession(entry.name, entry.session)\n }));\n },\n\n async hasRetainedSessions() {\n return request(\"hasRetainedSessions\");\n },\n\n async close() {\n await request(\"shutdown\").catch(() => undefined);\n }\n };\n}\n\nasync function handleRequestLine(\n runtime: TerminalPilotRuntime,\n line: string\n): Promise<RpcResponse> {\n let request: RpcRequest;\n try {\n request = JSON.parse(line) as RpcRequest;\n } catch (error) {\n return {\n id: 0,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Invalid request\" }\n };\n }\n\n try {\n const result = await handleRequest(runtime, request);\n return { id: request.id, ok: true, result };\n } catch (error) {\n return {\n id: request.id,\n ok: false,\n error: { message: error instanceof Error ? error.message : String(error) }\n };\n }\n}\n\nasync function handleRequest(runtime: TerminalPilotRuntime, request: RpcRequest): Promise<unknown> {\n const params = isRecord(request.params) ? request.params : {};\n\n if (request.method === \"ping\") {\n return { ok: true };\n }\n\n if (request.method === \"createSession\") {\n const createParams = isRecord(params.params) ? params.params : {};\n const namedSession = await runtime.createSession(\n createParams as unknown as Parameters<TerminalPilotRuntime[\"createSession\"]>[0],\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"resolveSession\") {\n const namedSession = await runtime.resolveSession(\n optionalString(params.name),\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"listSessions\") {\n const sessions = await runtime.listSessions();\n return sessions.map(formatNamedSession);\n }\n\n if (request.method === \"hasRetainedSessions\") {\n return runtime.hasRetainedSessions();\n }\n\n if (request.method === \"closeSession\") {\n return runtime.closeSession(optionalString(params.name), envFromValue(params.envSession));\n }\n\n if (request.method === \"sessionAction\") {\n return runSessionAction(runtime, params);\n }\n\n if (request.method === \"shutdown\") {\n await runtime.close();\n process.exit(0);\n }\n\n throw new UserError(`Unknown terminal-pilot daemon method: ${request.method}`);\n}\n\nasync function runSessionAction(\n runtime: TerminalPilotRuntime,\n params: Record<string, unknown>\n): Promise<unknown> {\n const name = optionalString(params.name);\n const action = optionalString(params.action);\n const args = Array.isArray(params.args) ? params.args : [];\n const namedSession = await runtime.resolveSession(name);\n const session = namedSession.session;\n\n if (action === \"fill\") {\n await session.fill(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"type\") {\n await session.type(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"press\") {\n await session.press(String(args[0] ?? \"\") as TerminalKey);\n return undefined;\n }\n if (action === \"signal\") {\n await session.signal(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"waitFor\") {\n return session.waitFor(deserializePattern(args[0]), optionalRecord(args[1]));\n }\n if (action === \"waitForExit\") {\n return session.waitForExit(optionalRecord(args[0]));\n }\n if (action === \"screen\") {\n const screen = await session.screen();\n return {\n lines: [...screen.lines],\n rawLines: [...screen.rawLines],\n cursor: { ...screen.cursor },\n size: { ...screen.size }\n };\n }\n if (action === \"history\") {\n return session.history(optionalRecord(args[0]));\n }\n if (action === \"resize\") {\n await session.resize(Number(args[0]), Number(args[1]));\n return undefined;\n }\n\n throw new UserError(`Unknown terminal-pilot session action: ${action ?? \"<missing>\"}`);\n}\n\nasync function ensureDaemon(): Promise<void> {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n // Start below.\n }\n\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n const entryPoint = process.argv[1];\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n throw new UserError(\"Cannot start terminal-pilot daemon: entrypoint is unknown.\");\n }\n\n const child = spawn(process.execPath, [...process.execArgv, entryPoint, DAEMON_ARG], {\n detached: true,\n stdio: \"ignore\",\n env: process.env\n });\n child.unref();\n\n const startedAt = Date.now();\n while (Date.now() - startedAt <= START_TIMEOUT_MS) {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n await sleep(50);\n }\n }\n\n throw new UserError(\"Timed out waiting for terminal-pilot daemon to start.\");\n}\n\nfunction sendRequest<T>(\n method: string,\n params: unknown,\n id: number,\n options: { start?: boolean } = {}\n): Promise<T> {\n const socketPath = resolveSocketPath(process.env);\n return new Promise<T>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"connect\", () => {\n const request: RpcRequest = { id, method, params };\n socket.write(`${JSON.stringify(request)}\\n`);\n });\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n\n const line = buffer.slice(0, newlineIndex);\n socket.end();\n try {\n const response = JSON.parse(line) as RpcResponse;\n if (response.ok) {\n resolve(response.result as T);\n } else {\n reject(new UserError(response.error.message));\n }\n } catch (error) {\n reject(error);\n }\n });\n socket.on(\"error\", (error) => {\n if (options.start === false) {\n reject(error);\n return;\n }\n reject(new UserError(error.message));\n });\n });\n}\n\nfunction resolveSocketPath(env: NodeJS.ProcessEnv): string {\n const runtimeDir =\n env[RUNTIME_DIR_ENV] ??\n path.join(os.tmpdir(), `terminal-pilot-${process.getuid?.() ?? \"user\"}`);\n\n if (process.platform === \"win32\") {\n const hash = createHash(\"sha256\").update(runtimeDir).digest(\"hex\").slice(0, 16);\n return `\\\\\\\\.\\\\pipe\\\\terminal-pilot-${hash}`;\n }\n\n return path.join(runtimeDir, \"daemon.sock\");\n}\n\nfunction formatNamedSession(\n namedSession: Awaited<ReturnType<TerminalPilotRuntime[\"resolveSession\"]>>\n) {\n return {\n name: namedSession.name,\n session: formatSession(namedSession.session)\n };\n}\n\nfunction formatSession(\n session: Pick<TerminalSession, \"id\" | \"command\" | \"pid\" | \"exitCode\">\n): SessionInfo {\n return {\n id: session.id,\n command: session.command,\n pid: session.pid,\n exitCode: session.exitCode\n };\n}\n\nfunction envFromValue(value: unknown): HandlerEnvLike | undefined {\n const sessionName = optionalString(value);\n if (sessionName === undefined) {\n return undefined;\n }\n\n return {\n get(key: string): string | undefined {\n return key === SESSION_ENV_VAR ? sessionName : undefined;\n }\n };\n}\n\nfunction serializePattern(pattern: string | RegExp): unknown {\n if (typeof pattern === \"string\") {\n return { kind: \"literal\", value: pattern };\n }\n\n return { kind: \"regex\", source: pattern.source, flags: pattern.flags };\n}\n\nfunction deserializePattern(value: unknown): string | RegExp {\n if (!isRecord(value)) {\n return String(value ?? \"\");\n }\n if (value.kind === \"regex\") {\n return new RegExp(String(value.source ?? \"\"), String(value.flags ?? \"\"));\n }\n return String(value.value ?? \"\");\n}\n\nfunction optionalRecord(value: unknown): Record<string, never> | undefined {\n return isRecord(value) ? (value as Record<string, never>) : undefined;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { runCLI } from \"toolcraft/cli\";\nimport { configureTheme } from \"toolcraft/design\";\nimport { createTerminalPilotGroup } from \"./commands/index.js\";\nimport {\n createDaemonTerminalPilotRuntime,\n isTerminalPilotDaemonArgv,\n runTerminalPilotDaemon\n} from \"./commands/daemon-runtime.js\";\nimport type { TerminalPilotRuntime } from \"./commands/runtime.js\";\n\nconfigureTheme({ brand: \"green\", label: \"Terminal Pilot\" });\n\ndeclare const __TERMINAL_PILOT_VERSION__: string | undefined;\n\nfunction getBundledPackageVersion(): string | undefined {\n return typeof __TERMINAL_PILOT_VERSION__ === \"string\"\n ? __TERMINAL_PILOT_VERSION__\n : undefined;\n}\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(\n argv: string[] = process.argv,\n options: { terminalPilotRuntime?: TerminalPilotRuntime; packageVersion?: string } = {}\n): Promise<void> {\n if (isTerminalPilotDaemonArgv(argv)) {\n await runTerminalPilotDaemon();\n return;\n }\n\n const originalArgv = process.argv;\n process.argv = normalizeArgv(argv);\n\n try {\n const packageVersion = options.packageVersion ?? getBundledPackageVersion();\n await runCLI(createTerminalPilotGroup(), {\n services: {\n terminalPilotRuntime: options.terminalPilotRuntime ?? createDaemonTerminalPilotRuntime()\n },\n controls: {\n debug: true,\n output: true,\n verbose: true,\n yes: true\n },\n ...(packageVersion === undefined ? {} : { version: packageVersion })\n });\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 { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nconst globalWithRequire = globalThis as typeof globalThis & {\n require?: NodeJS.Require;\n};\n\nglobalWithRequire.require ??= createRequire(path.join(process.cwd(), \"package.json\"));\n", "import \"./node-require-shim.js\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n Command as CommanderCommand,\n CommanderError,\n InvalidArgumentError,\n Option\n} from \"commander\";\nimport type {\n AnySchema,\n ArraySchema,\n CliMissingParameterContext,\n EnumSchema,\n JsonValueSchema,\n ObjectSchema,\n RecordSchema\n} from \"toolcraft-schema\";\nimport { validate as validateSchema } from \"toolcraft-schema\";\nimport {\n cancel,\n configureTheme,\n confirm,\n createLogger,\n formatCommandList,\n formatOptionList,\n getTheme,\n helpFormatterPlain,\n isCancel,\n note,\n promptText,\n renderTable,\n resetOutputFormatCache,\n select,\n text\n} from \"toolcraft-design\";\nimport type {\n Command,\n CommandRequirementOptions,\n Group,\n HandlerContext,\n HandlerEnv,\n HandlerFs,\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLoggerInput,\n SecretDeclarations,\n SecretDefinition,\n Scope\n} from \"./index.js\";\nimport {\n ApprovalDeclinedError,\n UserError,\n assertCommandRequirements,\n getCommandSourcePath,\n hasMcpProxyConfig,\n resolveCommandSecrets\n} from \"./index.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport { writeErrorReport, type ErrorReportsOption } from \"./error-report.js\";\nimport type { HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./human-in-loop/types.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { findEntrypointPackageMetadata } from \"./package-metadata.js\";\nimport { redactHttpBody, redactHttpHeaderValue } from \"./redaction.js\";\nimport { createRuntimeLogger, isLogLevel, LOG_LEVELS } from \"./runtime-logging.js\";\nimport { summarizeHttpError } from \"./api-error-summary.js\";\nimport { renderResult } from \"./renderer.js\";\nimport type { OutputMode } from \"./renderer.js\";\nimport { renderSourceSnippet } from \"./source-snippet.js\";\nimport { enableSourceMaps, formatDebugStack, type DebugStackMode } from \"./stack-trim.js\";\nimport { suggest } from \"./suggest.js\";\nimport { throwValidationErrors, type ValidationError } from \"./validation-errors.js\";\nimport { RESERVED_SERVICE_NAMES, createEnv, createFs, validateServices } from \"./runtime/io.js\";\nimport { createManagedStream } from \"./stream.js\";\n\nexport { renderErrorReport } from \"./error-report.js\";\nexport type { ErrorReportRenderContext, ErrorReportRenderResult } from \"./error-report.js\";\n\nconfigureTheme({ brand: \"blue\", label: \"Toolcraft\" });\n\nexport { configureTheme };\n\nconst NULL_OPTION_VALUE = Symbol(\"toolcraft.cli.null\");\nconst optionalModulePaths = {\n approvals: \"./human-in-loop/approvals-commands.js\",\n humanInLoop: \"./human-in-loop/gate.js\",\n mcpProxy: \"./mcp-proxy.js\"\n} as const;\n\nfunction importOptionalModule<T>(specifier: string): Promise<T> {\n return import(specifier) as Promise<T>;\n}\n\ntype Casing = \"kebab\" | \"snake\";\ntype ScalarSchema = Extract<AnySchema, { kind: \"string\" | \"number\" | \"boolean\" | \"enum\" }>;\ntype FieldSchema = ScalarSchema | ArraySchema<any> | JsonValueSchema;\n\ninterface ResolvedFlags {\n json?: boolean;\n preset?: string;\n yes?: boolean;\n output?: OutputMode;\n debug?: DebugStackMode | boolean;\n logLevel?: LogLevel;\n verbose?: boolean;\n}\n\ninterface FieldDefinition {\n id: string;\n path: string[];\n displayPath: string;\n optionAttribute: string;\n commanderOptionAttribute: string;\n optionFlag: string;\n longAliases: string[];\n shortFlag?: string;\n schema: FieldSchema;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n requiredWhenActive: boolean;\n global?: boolean;\n synthetic?: boolean;\n variantId?: string;\n variantBranchId?: string;\n positionalIndex?: number;\n variadicPosition?: boolean;\n}\n\ninterface DynamicFieldDefinition {\n id: string;\n path: string[];\n displayPath: string;\n optionPath: string[];\n optionPathDisplay: string;\n optionFlag: string;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n requiredWhenActive: boolean;\n schema: RecordSchema<any> | ArraySchema<ObjectSchema<any>>;\n variantId?: string;\n variantBranchId?: string;\n}\n\ninterface VariantBranchDefinition {\n branchId: string;\n dynamicFieldIds: string[];\n fieldIds: string[];\n requiredDynamicFieldIds: string[];\n requiredFieldIds: string[];\n}\n\ninterface VariantDefinition {\n id: string;\n controlDisplayPath: string;\n controlFieldId: string;\n optional: boolean;\n branches: VariantBranchDefinition[];\n}\n\ninterface CollectedCliSchema {\n dynamicFields: DynamicFieldDefinition[];\n fields: FieldDefinition[];\n variants: VariantDefinition[];\n}\n\ninterface ExecutionState<TServices extends object> {\n command: Command<TServices, any, any, any>;\n commandPath: string;\n casing: Casing;\n dynamicFields: DynamicFieldDefinition[];\n fields: FieldDefinition[];\n positionalValues: unknown[];\n presetsEnabled: boolean;\n rawArgv: string[];\n actionCommand: CommanderCommand;\n variants: VariantDefinition[];\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\ninterface JsonHelpOption {\n name: string;\n flags: string[];\n type: string;\n description?: string;\n required: boolean;\n default?: unknown;\n positional?: boolean;\n}\n\nexport interface CLIControls {\n debug?: boolean;\n logLevel?: boolean;\n output?: boolean;\n verbose?: boolean;\n yes?: boolean;\n}\n\nexport interface RunCLIOptions<TServices extends object = Record<string, unknown>> {\n apiVersion?: string;\n approvals?: boolean;\n argv?: readonly string[];\n casing?: Casing;\n controls?: CLIControls;\n env?: Record<string, string>;\n fetch?: typeof globalThis.fetch;\n fs?: HandlerFs;\n humanInLoop?: HumanInLoopRuntimeOptions;\n logLevel?: LogLevel;\n logger?: RuntimeLoggerInput;\n outputEmitter?: (entry: string) => void;\n promptInput?: NodeJS.ReadableStream;\n promptOutput?: NodeJS.WritableStream;\n projectRoot?: string;\n rootDisplayName?: string;\n rootUsageName?: string;\n services?: TServices;\n version?: string;\n presets?: boolean;\n errorReports?: ErrorReportsOption;\n}\n\nexport interface CLICommandTreeSnapshotOption {\n name: string;\n flags: string[];\n type: string;\n required: boolean;\n hidden: boolean;\n description?: string;\n default?: unknown;\n positional?: boolean;\n global?: boolean;\n dynamic?: boolean;\n}\n\nexport interface CLICommandTreeSnapshotCommand {\n kind: \"command\";\n name: string;\n path: string[];\n aliases: string[];\n hidden: boolean;\n default: boolean;\n description?: string;\n options: CLICommandTreeSnapshotOption[];\n}\n\nexport interface CLICommandTreeSnapshotGroup {\n kind: \"group\";\n name: string;\n path: string[];\n aliases: string[];\n hidden: false;\n default: boolean;\n description?: string;\n children: CLICommandTreeSnapshotNode[];\n}\n\nexport type CLICommandTreeSnapshotNode =\n | CLICommandTreeSnapshotCommand\n | CLICommandTreeSnapshotGroup;\n\nexport interface CLICommandTreeSnapshot {\n schemaVersion: 1;\n globalOptions: CLICommandTreeSnapshotOption[];\n root: CLICommandTreeSnapshotGroup;\n}\n\nexport interface CLICommandTreeSnapshotOptions {\n approvals?: boolean;\n argv?: readonly string[];\n casing?: Casing;\n controls?: CLIControls;\n presets?: boolean;\n version?: string;\n}\n\n/**\n * Returns the resolved CLI command surface as deterministic plain data.\n *\n * Schema version 1 is independent of human-facing help layout. Nodes and options retain\n * declaration order, paths exclude the root name, non-CLI nodes are omitted, hidden commands\n * remain present, and Toolcraft-controlled global options are reported separately. A future\n * incompatible shape change will increment `schemaVersion`.\n */\nexport async function createCLICommandTreeSnapshot<TServices extends object>(\n roots: Group<TServices> | Group<TServices>[],\n options: CLICommandTreeSnapshotOptions = {}\n): Promise<CLICommandTreeSnapshot> {\n const argv = [...(options.argv ?? [\"node\", \"toolcraft\"])];\n const normalizedRoot = normalizeRoots(roots, argv);\n const root =\n options.approvals === true\n ? (\n await importOptionalModule<typeof import(\"./human-in-loop/approvals-commands.js\")>(\n optionalModulePaths.approvals\n )\n ).mergeApprovalsGroup(normalizedRoot)\n : normalizedRoot;\n const controls = resolveCLIControls(options.controls);\n const presetsEnabled = options.presets === true;\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n presetsEnabled,\n options.version !== undefined,\n controls\n );\n\n return {\n schemaVersion: 1,\n globalOptions: createGlobalSnapshotOptions(\n presetsEnabled,\n options.version !== undefined,\n controls\n ),\n root: createSnapshotGroup(root, options.casing ?? \"kebab\", globalLongOptionFlags, [], false)\n };\n}\n\nfunction inferProgramName(argv: string[]): string {\n const entrypoint = argv[1];\n\n if (typeof entrypoint !== \"string\" || entrypoint.length === 0) {\n return \"toolcraft\";\n }\n\n const parsed = path.parse(entrypoint);\n return parsed.name.length > 0 ? parsed.name : \"toolcraft\";\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 =\n previous !== undefined &&\n previous === previous.toLowerCase() &&\n previous !== previous.toUpperCase();\n const nextIsLowercase =\n 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 toUnionKindControlPath(path: string[]): string[] {\n if (path.length === 0) {\n return [\"kind\"];\n }\n\n const head = path.slice(0, -1);\n const tail = path[path.length - 1] ?? \"\";\n return [...head, `${tail}Kind`];\n}\n\nfunction toUnionKindDisplayPath(path: string[]): string {\n if (path.length === 0) {\n return \"kind\";\n }\n\n const head = path.slice(0, -1);\n const tail = path[path.length - 1] ?? \"\";\n return [...head, `${tail}-kind`].join(\".\");\n}\n\nfunction createSyntheticEnumSchema(values: string[]): EnumSchema<[string, ...string[]]> {\n if (values.length === 0) {\n throw new Error(\"Synthetic enum schema requires at least one value.\");\n }\n\n return {\n kind: \"enum\",\n values: values as [string, ...string[]]\n };\n}\n\nfunction getRequiredBranchFingerprint(branch: ObjectSchema<any>, casing: Casing): string {\n const requiredKeys = (Object.entries(branch.shape) as Array<[string, AnySchema]>)\n .filter(([, schema]) => schema.kind !== \"optional\")\n .map(([key]) => formatSegment(key, casing))\n .sort();\n\n return requiredKeys.join(\"+\");\n}\n\nfunction collectFields(\n schema: ObjectSchema<any>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n path: string[] = [],\n inheritedOptional = false,\n variantContext?: {\n branchId: string;\n id: string;\n }\n): CollectedCliSchema {\n const collected: CollectedCliSchema = {\n dynamicFields: [],\n fields: [],\n variants: []\n };\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const nextPath = [...path, key];\n const runtimeOptional = inheritedOptional || rawChildSchema.kind === \"optional\";\n const childSchema = unwrapOptional(rawChildSchema);\n const requiredWhenActive =\n rawChildSchema.kind !== \"optional\" && childSchema.default === undefined;\n\n if (childSchema.kind === \"object\") {\n const nested = collectFields(\n childSchema,\n casing,\n globalLongOptionFlags,\n nextPath,\n runtimeOptional,\n variantContext\n );\n collected.dynamicFields.push(...nested.dynamicFields);\n collected.fields.push(...nested.fields);\n collected.variants.push(...nested.variants);\n continue;\n }\n\n if (childSchema.kind === \"oneOf\") {\n const variantId = `${toDisplayPath(nextPath)}:oneOf`;\n const branchIds = Object.keys(childSchema.branches);\n const controlField: FieldDefinition = {\n id: toDisplayPath([...nextPath, childSchema.discriminator]),\n path: [...nextPath, childSchema.discriminator],\n displayPath: toDisplayPath([...nextPath, childSchema.discriminator]),\n optionAttribute: toOptionAttribute([...nextPath, childSchema.discriminator], casing),\n commanderOptionAttribute: toCommanderOptionAttribute(\n [...nextPath, childSchema.discriminator],\n casing,\n globalLongOptionFlags\n ),\n optionFlag: toOptionFlag([...nextPath, childSchema.discriminator], casing),\n longAliases: [],\n shortFlag: undefined,\n schema: createSyntheticEnumSchema(branchIds),\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: false,\n defaultValue: undefined,\n requiredWhenActive\n };\n collected.fields.push(controlField);\n\n const branches: VariantBranchDefinition[] = [];\n\n for (const [branchId, branchSchema] of Object.entries(childSchema.branches)) {\n const branch = collectFields(branchSchema, casing, globalLongOptionFlags, nextPath, true, {\n id: variantId,\n branchId\n });\n collected.dynamicFields.push(...branch.dynamicFields);\n collected.fields.push(...branch.fields);\n collected.variants.push(...branch.variants);\n branches.push({\n branchId,\n dynamicFieldIds: branch.dynamicFields.map((field) => field.id),\n fieldIds: branch.fields.map((field) => field.id),\n requiredDynamicFieldIds: branch.dynamicFields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id),\n requiredFieldIds: branch.fields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id)\n });\n }\n\n collected.variants.push({\n id: variantId,\n controlDisplayPath: controlField.displayPath,\n controlFieldId: controlField.id,\n optional: runtimeOptional,\n branches\n });\n continue;\n }\n\n if (childSchema.kind === \"union\") {\n const variantId = `${toDisplayPath(nextPath)}:union`;\n const controlPath = toUnionKindControlPath(nextPath);\n const controlDisplayPath = toUnionKindDisplayPath(nextPath);\n const branchIds = childSchema.branches.map((branch) =>\n getRequiredBranchFingerprint(branch, casing)\n );\n const controlField: FieldDefinition = {\n id: controlDisplayPath,\n path: controlPath,\n displayPath: controlDisplayPath,\n optionAttribute: toOptionAttribute(controlPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(\n controlPath,\n casing,\n globalLongOptionFlags\n ),\n optionFlag: toOptionFlag(controlPath, casing),\n longAliases: [],\n shortFlag: undefined,\n schema: createSyntheticEnumSchema(branchIds),\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: false,\n defaultValue: undefined,\n requiredWhenActive,\n synthetic: true\n };\n collected.fields.push(controlField);\n\n const branches: VariantBranchDefinition[] = [];\n\n childSchema.branches.forEach((branchSchema, index) => {\n const branchId = branchIds[index] ?? \"\";\n const branch = collectFields(branchSchema, casing, globalLongOptionFlags, nextPath, true, {\n id: variantId,\n branchId\n });\n collected.dynamicFields.push(...branch.dynamicFields);\n collected.fields.push(...branch.fields);\n collected.variants.push(...branch.variants);\n branches.push({\n branchId,\n dynamicFieldIds: branch.dynamicFields.map((field) => field.id),\n fieldIds: branch.fields.map((field) => field.id),\n requiredDynamicFieldIds: branch.dynamicFields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id),\n requiredFieldIds: branch.fields\n .filter((field) => field.requiredWhenActive)\n .map((field) => field.id)\n });\n });\n\n collected.variants.push({\n id: variantId,\n controlDisplayPath,\n controlFieldId: controlField.id,\n optional: runtimeOptional,\n branches\n });\n continue;\n }\n\n if (childSchema.kind === \"record\") {\n collected.dynamicFields.push({\n id: toDisplayPath(nextPath),\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionPath: nextPath,\n optionPathDisplay: `${toDisplayPath(nextPath)}.<key>`,\n optionFlag: `${toOptionFlag(nextPath, casing)}.<key>`,\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n schema: childSchema,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId\n });\n continue;\n }\n\n if (childSchema.kind === \"array\" && unwrapOptional(childSchema.item).kind === \"object\") {\n collected.dynamicFields.push({\n id: toDisplayPath(nextPath),\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionPath: nextPath,\n optionPathDisplay: `${toDisplayPath(nextPath)}.<index>`,\n optionFlag: `${toOptionFlag(nextPath, casing)}.<index>`,\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n schema: childSchema as ArraySchema<ObjectSchema<any>>,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId\n });\n continue;\n }\n\n collected.fields.push({\n id: toDisplayPath(nextPath),\n path: nextPath,\n displayPath: toDisplayPath(nextPath),\n optionAttribute: toOptionAttribute(nextPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(nextPath, casing, globalLongOptionFlags),\n optionFlag: toOptionFlag(nextPath, casing),\n longAliases: [...(childSchema.cliAliases ?? [])].map((alias) =>\n alias.startsWith(\"--\") ? alias : `--${alias}`\n ),\n shortFlag: childSchema.short,\n schema: childSchema as FieldSchema,\n description: childSchema.cliDescription ?? childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n global: childSchema.global === true ? true : undefined,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId\n });\n }\n\n return collected;\n}\n\nfunction toCommanderOptionAttribute(\n path: string[],\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const optionAttribute = toOptionAttribute(path, casing);\n const optionFlag = toOptionFlag(path, casing);\n\n if (!globalLongOptionFlags.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(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const collidesWithGlobalFlag = globalLongOptionFlags.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, ...field.longAliases].join(\", \");\n }\n\n return [`-${field.shortFlag}`, field.optionFlag, ...field.longAliases].join(\", \");\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(\n `Invalid value for \"${label}\". Expected true or false, got ${describeReceived(value)}.`\n );\n}\n\nfunction parseEnumValue(\n value: string,\n values: ReadonlyArray<string | number | boolean>,\n label: string\n): string | number | boolean {\n const match = values.find((candidate) => String(candidate) === value);\n\n if (match === undefined) {\n const suggestions = suggest(\n value,\n values.map((candidate) => String(candidate))\n );\n const suggestionLine =\n suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}?\\n` : \" \";\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\".${suggestionLine}Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}, got ${describeReceived(value)}.`\n );\n }\n\n return match;\n}\n\nfunction validateStringPattern(\n value: string,\n schema: Extract<ScalarSchema, { kind: \"string\" }>,\n label: string\n): string {\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected a string with length at least ${schema.minLength}, got string with length ${value.length}.`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected a string with length at most ${schema.maxLength}, got string with length ${value.length}.`\n );\n }\n\n if (schema.pattern !== undefined && !matchesStringPattern(value, schema.pattern)) {\n throw new UserError(\n `Invalid value for \"${label}\": \"${value}\" does not match pattern \"${schema.pattern}\".`\n );\n }\n\n return value;\n}\n\nfunction matchesStringPattern(value: string, pattern: string): boolean {\n return new RegExp(pattern).test(value);\n}\n\nfunction parseJsonText(value: string, label: string): unknown {\n try {\n return JSON.parse(value);\n } catch (error) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected valid JSON, got ${describeReceived(value)} (parser: ${getErrorMessage(error)}).`\n );\n }\n}\n\nfunction describeReceived(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"missing\";\n if (Array.isArray(value)) return `array(${value.length})`;\n if (typeof value === \"object\") return \"object\";\n if (typeof value === \"string\") {\n const s = value.length > 40 ? `${value.slice(0, 40)}\u2026` : value;\n return `${JSON.stringify(s)}`;\n }\n return JSON.stringify(value);\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatJsonParseUserErrorMessage(\n label: string,\n filePath: string,\n source: string,\n error: unknown,\n options: { quotePath: boolean }\n): string {\n const location = getJsonParseErrorLocation(error, source);\n const message =\n location === null\n ? getErrorMessage(error)\n : removeNativeJsonParseLocation(getErrorMessage(error), location);\n const positionText =\n location === null ? \"\" : ` at line ${location.line} column ${location.column}`;\n const formattedPath = options.quotePath ? `\"${filePath}\"` : filePath;\n const snippet =\n location === null\n ? \"\"\n : `\\n${renderSourceSnippet({\n source,\n line: location.line,\n column: location.column,\n filePath\n })}`;\n\n return `${label} ${formattedPath} is not valid JSON: ${message}${positionText}.${snippet}`;\n}\n\nfunction removeNativeJsonParseLocation(\n message: string,\n location: { line: number; column: number }\n): string {\n const nativeSuffix = ` (line ${location.line} column ${location.column})`;\n\n return message.endsWith(nativeSuffix) ? message.slice(0, -nativeSuffix.length) : message;\n}\n\nfunction getJsonParseErrorLocation(\n error: unknown,\n source: string\n): { line: number; column: number } | null {\n const causeLocation = getJsonParseCauseLocation(error);\n\n if (causeLocation !== null) {\n return causeLocation;\n }\n\n const directPosition = getNumericProperty(error, \"position\");\n\n if (directPosition !== null) {\n return getSourceOffsetLocation(source, directPosition);\n }\n\n const messagePosition = getJsonParseMessagePosition(getErrorMessage(error));\n\n if (messagePosition !== null) {\n return getSourceOffsetLocation(source, messagePosition);\n }\n\n return null;\n}\n\nfunction getJsonParseCauseLocation(error: unknown): { line: number; column: number } | null {\n if (typeof error !== \"object\" || error === null || !hasOwnProperty(error, \"cause\")) {\n return null;\n }\n\n const cause = error.cause;\n const line = getNumericProperty(cause, \"line\");\n const column = getNumericProperty(cause, \"column\") ?? getNumericProperty(cause, \"col\");\n\n if (line === null || column === null) {\n return null;\n }\n\n return { line, column };\n}\n\nfunction getNumericProperty(value: unknown, key: string): number | null {\n if (typeof value !== \"object\" || value === null || !hasOwnProperty(value, key)) {\n return null;\n }\n\n const propertyValue = value[key];\n\n return typeof propertyValue === \"number\" && Number.isFinite(propertyValue) ? propertyValue : null;\n}\n\nfunction getJsonParseMessagePosition(message: string): number | null {\n const marker = \" at position \";\n const markerIndex = message.indexOf(marker);\n\n if (markerIndex === -1) {\n return null;\n }\n\n const startIndex = markerIndex + marker.length;\n let endIndex = startIndex;\n\n while (endIndex < message.length && isAsciiDigit(message[endIndex] ?? \"\")) {\n endIndex += 1;\n }\n\n if (endIndex === startIndex) {\n return null;\n }\n\n return Number.parseInt(message.slice(startIndex, endIndex), 10);\n}\n\nfunction getSourceOffsetLocation(source: string, offset: number): { line: number; column: number } {\n let line = 1;\n let column = 1;\n const boundedOffset = Math.max(0, Math.floor(offset));\n\n for (let index = 0; index < boundedOffset && index < source.length; index += 1) {\n if (source[index] === \"\\n\") {\n line += 1;\n column = 1;\n continue;\n }\n\n column += 1;\n }\n\n return { line, column };\n}\n\nfunction isAsciiDigit(value: string): boolean {\n return value >= \"0\" && value <= \"9\";\n}\n\nfunction formatAvailableList(values: Iterable<string>): string {\n return `Available: ${[...values].sort().join(\", \")}.`;\n}\n\nfunction normalizeCommanderOptionValue(value: unknown): unknown {\n return value === NULL_OPTION_VALUE ? null : value;\n}\n\nfunction parseScalarValue(\n value: string,\n schema: ScalarSchema,\n label: string\n): string | number | boolean {\n if (value === \"null\" && schema.nullable === true) {\n return null as unknown as string | number | boolean;\n }\n\n switch (schema.kind) {\n case \"string\":\n return validateStringPattern(value, schema, label);\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)}, got ${describeReceived(value)}.`\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\n throw new UserError(\n `Unsupported CLI schema kind. ${formatAvailableList([\"boolean\", \"enum\", \"number\", \"string\"])}`\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 if (value === \"null\" && schema.nullable === true) {\n return null as unknown as unknown[];\n }\n\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) =>\n parseScalarValue(item, itemSchema as ScalarSchema, label)\n );\n}\n\nfunction isNegativeNumericArrayToken(token: string, schema: ArraySchema<any>): boolean {\n if (!token.startsWith(\"-\") || token.startsWith(\"--\")) {\n return false;\n }\n\n const itemSchema = unwrapOptional(schema.item);\n if (itemSchema.kind !== \"number\") {\n return false;\n }\n\n const items = splitArrayInput(token);\n return (\n items.length > 0 && items.every((item) => isValidNumberSchemaValue(Number(item), itemSchema))\n );\n}\n\nfunction isNextArrayOptionToken(token: string, schema: ArraySchema<any>): boolean {\n return token.startsWith(\"-\") && !isNegativeNumericArrayToken(token, schema);\n}\n\nfunction validateArrayBounds(value: unknown[], schema: ArraySchema<any>, label: string): void {\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected an array with at least ${schema.minItems} items, got array(${value.length}).`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n throw new UserError(\n `Invalid value for \"${label}\". Expected an array with at most ${schema.maxItems} items, got array(${value.length}).`\n );\n }\n}\n\nfunction createOption(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): Option[] {\n const flags = formatOptionFlags(field, globalLongOptionFlags);\n const collidesWithGlobalFlag = globalLongOptionFlags.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) => (typeof value === \"boolean\" ? value : value));\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: string[] = []) => [...previous, value]\n )\n ];\n }\n\n if (field.schema.kind === \"json\") {\n return [createCommanderOption(`${flags} <json>`, field.description, field)];\n }\n\n const option = createCommanderOption(`${flags} <value>`, field.description, field);\n return [option];\n}\n\ninterface ResolvedCLIControls {\n debug: boolean;\n logLevel: boolean;\n output: boolean;\n verbose: boolean;\n yes: boolean;\n}\n\nfunction resolveCLIControls(controls: CLIControls | undefined): ResolvedCLIControls {\n return {\n debug: controls?.debug === true,\n logLevel: controls?.logLevel === true,\n output: controls?.output === true,\n verbose: controls?.verbose === true,\n yes: controls?.yes === true\n };\n}\n\nfunction getGlobalLongOptionFlags(\n presetsEnabled: boolean,\n versionEnabled: boolean,\n controls: ResolvedCLIControls\n): ReadonlySet<string> {\n const flags: string[] = [];\n\n if (presetsEnabled) {\n flags.push(\"--preset\");\n }\n if (controls.yes) {\n flags.push(\"--yes\");\n }\n if (controls.output) {\n flags.push(\"--output\");\n }\n if (controls.debug) {\n flags.push(\"--debug\");\n }\n if (controls.logLevel) {\n flags.push(\"--log-level\");\n }\n if (controls.verbose) {\n flags.push(\"--verbose\");\n }\n\n if (versionEnabled) {\n flags.push(\"--version\");\n }\n\n return new Set(flags);\n}\n\nfunction validateUniqueOptionFlags(\n fields: FieldDefinition[],\n globalLongOptionFlags: ReadonlySet<string>\n): void {\n const fieldsByFlag = new Map<string, FieldDefinition>();\n\n for (const field of fields) {\n if (field.positionalIndex !== undefined) {\n continue;\n }\n\n for (const flag of [field.optionFlag, ...field.longAliases]) {\n if (globalLongOptionFlags.has(flag)) {\n if (flag === field.optionFlag && field.shortFlag !== undefined) {\n continue;\n }\n\n throw new UserError(\n `Parameter \"${field.displayPath}\" uses reserved CLI flag \"${flag}\". Add a short flag or rename the parameter.`\n );\n }\n\n const existing = fieldsByFlag.get(flag);\n if (existing !== undefined) {\n throw new UserError(\n `Parameters \"${existing.displayPath}\" and \"${field.displayPath}\" use conflicting CLI flag \"${flag}\".`\n );\n }\n\n fieldsByFlag.set(flag, field);\n }\n }\n}\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 || field.longAliases.length > 0) {\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 normalizeVerboseAlias(argv: string[]): string[] {\n return argv.map((token) => (token === \"-v\" ? \"--verbose\" : 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>(\n group: Group<TServices>,\n scope: Scope\n): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return group.children.filter((child) => isNodeVisibleInScope(child, scope));\n}\n\nfunction getHelpChildren<TServices extends object>(\n group: Group<TServices>,\n scope: Scope\n): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return getVisibleChildren(group, scope).filter((child) => {\n if (child.kind === \"command\") {\n return child.hidden !== true;\n }\n\n return true;\n });\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 rootUsageName: string,\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 =\n findVisibleChild(current, token, scope);\n if (child === undefined) {\n throw new UserError(\n formatUnknownHelpCommandMessage(current, token, scope, rootUsageName, breadcrumb)\n );\n }\n\n breadcrumb.push(child.name);\n current = child;\n }\n\n return {\n breadcrumb,\n node: current\n };\n}\n\nfunction formatUnknownHelpCommandMessage<TServices extends object>(\n group: Group<TServices>,\n input: string,\n scope: Scope,\n rootUsageName: string,\n breadcrumb: string[]\n): string {\n const suggestions = suggest(\n input,\n getHelpChildren(group, scope).map((child) => child.name)\n );\n const commandPath = breadcrumb.slice(1).join(\" \");\n const helpTarget = commandPath.length === 0 ? rootUsageName : `${rootUsageName} ${commandPath}`;\n\n return `${formatSuggestionMessage(`Unknown command \"${input}\".`, suggestions)}\\nRun ${helpTarget} --help for usage.`;\n}\n\nfunction formatHelpFieldFlags(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n if (field.positionalIndex !== undefined) {\n return formatPositionalToken(field);\n }\n\n if (field.schema.kind === \"boolean\") {\n if (field.defaultValue === true) {\n return `--no-${field.optionFlag.slice(2)}`;\n }\n\n return formatOptionFlags(field, globalLongOptionFlags);\n }\n\n return `${formatOptionFlags(field, globalLongOptionFlags)} <${describeHelpValueToken(\n field.schema,\n {\n displayPath: field.displayPath,\n optionFlag: field.optionFlag\n }\n )}>`;\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.schema.kind === \"enum\" && field.schema.values.length <= 8) {\n const values = field.schema.values.map((value) => String(value)).join(\", \");\n if (values.length <= 120) {\n metadata.push(`values: ${values}`);\n }\n }\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 describeKnownStringFormat(format: string | undefined): string | undefined {\n switch (format) {\n case \"date\":\n return \"date\";\n\n case \"date-time\":\n return \"datetime\";\n\n case \"uri\":\n return \"url\";\n\n case \"email\":\n return \"email\";\n\n default:\n return undefined;\n }\n}\n\nfunction describeKnownStringPattern(pattern: string | undefined): string | undefined {\n if (pattern === undefined) {\n return undefined;\n }\n\n if (pattern === \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\") {\n return \"YYYY-MM-DD\";\n }\n\n if (pattern.startsWith(\"^\\\\d{4}-\\\\d{2}-\\\\d{2}T\")) {\n return \"YYYY-MM-DDTHH:MM:SS\";\n }\n\n return undefined;\n}\n\nfunction stripLongOptionPrefix(optionFlag: string): string {\n return optionFlag.startsWith(\"--\") ? optionFlag.slice(2) : optionFlag;\n}\n\nfunction getLastSegment(value: string, separator: string): string {\n const segments = value.split(separator);\n return segments[segments.length - 1] ?? value;\n}\n\nfunction matchesFieldNameSuffix(name: string, suffix: string): boolean {\n const lowerName = name.toLowerCase();\n const lowerSuffix = suffix.toLowerCase();\n\n return (\n lowerName === lowerSuffix ||\n name.endsWith(suffix) ||\n lowerName.endsWith(`-${lowerSuffix}`) ||\n lowerName.endsWith(`_${lowerSuffix}`)\n );\n}\n\nfunction describeFieldNameValueToken(displayPath: string, optionFlag: string): string | undefined {\n const displayName = getLastSegment(displayPath, \".\");\n const optionName = getLastSegment(stripLongOptionPrefix(optionFlag), \".\");\n const candidates = [displayName, optionName];\n const suffixTokens = [\n [\"Path\", \"path\"],\n [\"Paths\", \"path\"],\n [\"File\", \"path\"],\n [\"Files\", \"path\"],\n [\"Url\", \"url\"],\n [\"Email\", \"email\"],\n [\"Name\", \"name\"],\n [\"Id\", \"id\"]\n ] as const;\n\n for (const [suffix, token] of suffixTokens) {\n if (candidates.some((candidate) => matchesFieldNameSuffix(candidate, suffix))) {\n return token;\n }\n }\n\n return undefined;\n}\n\nfunction describeHelpValueToken(\n schema: FieldSchema,\n field: {\n displayPath: string;\n optionFlag: string;\n }\n): string {\n if (schema.kind === \"array\") {\n const itemSchema = unwrapOptional(schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n return \"value...\";\n }\n\n return `${describeHelpValueToken(itemSchema as FieldSchema, field)}...`;\n }\n\n if (schema.kind === \"json\") {\n return \"json\";\n }\n\n if (schema.kind === \"string\") {\n const metadataToken =\n describeKnownStringFormat(schema.format) ?? describeKnownStringPattern(schema.pattern);\n\n if (metadataToken !== undefined) {\n return metadataToken;\n }\n }\n\n if (schema.kind === \"enum\") {\n return \"value\";\n }\n\n return describeFieldNameValueToken(field.displayPath, field.optionFlag) ?? \"value\";\n}\n\nfunction formatCompactEnumSignatureToken(schema: FieldSchema): string | undefined {\n if (schema.kind !== \"enum\" || schema.values.length < 2 || schema.values.length > 3) {\n return undefined;\n }\n\n const tokens = schema.values.map((value) => String(value));\n const compact = tokens.every(\n (token) =>\n token.length > 0 &&\n token.length <= 24 &&\n token.trim() === token &&\n !token.includes(\"|\") &&\n !token.includes(\"\\t\") &&\n !token.includes(\"\\n\") &&\n !token.includes(\"\\r\") &&\n !token.includes(\" \")\n );\n\n return compact ? tokens.join(\"|\") : undefined;\n}\n\nfunction formatCommandParameterFieldFlags(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n if (field.positionalIndex !== undefined || field.schema.kind === \"boolean\") {\n return formatHelpFieldFlags(field, globalLongOptionFlags);\n }\n\n const enumToken = formatCompactEnumSignatureToken(field.schema);\n if (enumToken !== undefined) {\n return `${formatOptionFlags(field, globalLongOptionFlags)} ${enumToken}`;\n }\n\n return formatHelpFieldFlags(field, globalLongOptionFlags);\n}\n\nfunction describeDynamicFieldType(field: DynamicFieldDefinition): string {\n if (field.schema.kind === \"record\") {\n const valueSchema = unwrapOptional(field.schema.value);\n\n if (valueSchema.kind === \"json\") {\n return \"json\";\n }\n\n if (valueSchema.kind === \"array\") {\n return describeHelpValueToken(valueSchema as FieldSchema, {\n displayPath: field.optionPathDisplay,\n optionFlag: field.optionFlag\n });\n }\n\n if (valueSchema.kind === \"object\") {\n return \"value\";\n }\n\n return describeHelpValueToken(valueSchema as FieldSchema, {\n displayPath: field.optionPathDisplay,\n optionFlag: field.optionFlag\n });\n }\n\n return \"value\";\n}\n\nfunction formatDynamicHelpMetadata(field: DynamicFieldDefinition): string[] {\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 metadata;\n}\n\nfunction collectDynamicObjectHelpRows(\n schema: ObjectSchema<any>,\n casing: Casing,\n optionPrefix: string,\n displayPrefix: string,\n metadata: string[]\n): HelpOptionRow[] {\n const rows: HelpOptionRow[] = [];\n\n for (const [key, rawChildSchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const childSchema = unwrapOptional(rawChildSchema);\n const optionFlag = `${optionPrefix}.${formatSegment(key, casing)}`;\n const displayPath = `${displayPrefix}.${key}`;\n const description = childSchema.description ?? displayPath;\n\n if (childSchema.kind === \"object\") {\n rows.push(\n ...collectDynamicObjectHelpRows(childSchema, casing, optionFlag, displayPath, metadata)\n );\n continue;\n }\n\n if (childSchema.kind === \"record\") {\n rows.push({\n flags: `${optionFlag}.<key> <${describeDynamicFieldType({\n ...({\n id: displayPath,\n path: [],\n displayPath,\n optionPath: [],\n optionPathDisplay: `${displayPath}.<key>`,\n optionFlag: `${optionFlag}.<key>`,\n optional: false,\n hasDefault: false,\n defaultValue: undefined,\n requiredWhenActive: false,\n schema: childSchema\n } satisfies DynamicFieldDefinition)\n })}>`,\n description: appendHelpMetadata(description, metadata)\n });\n continue;\n }\n\n if (childSchema.kind === \"array\" && unwrapOptional(childSchema.item).kind === \"object\") {\n rows.push(\n ...collectDynamicObjectHelpRows(\n unwrapOptional(childSchema.item) as ObjectSchema<any>,\n casing,\n `${optionFlag}.<index>`,\n `${displayPath}.<index>`,\n metadata\n )\n );\n continue;\n }\n\n rows.push({\n flags:\n childSchema.kind === \"boolean\"\n ? childSchema.default === true\n ? `--no-${optionFlag.slice(2)}`\n : optionFlag\n : `${optionFlag} <${describeHelpValueToken(childSchema as FieldSchema, {\n displayPath,\n optionFlag\n })}>`,\n description: appendHelpMetadata(description, metadata)\n });\n }\n\n return rows;\n}\n\nfunction formatDynamicHelpFields(field: DynamicFieldDefinition, casing: Casing): HelpOptionRow[] {\n const metadata = formatDynamicHelpMetadata(field);\n\n if (field.schema.kind === \"record\") {\n const valueSchema = unwrapOptional(field.schema.value);\n if (valueSchema.kind === \"object\") {\n return collectDynamicObjectHelpRows(\n valueSchema,\n casing,\n `${field.optionFlag}`,\n `${field.optionPathDisplay}`,\n metadata\n );\n }\n }\n\n if (field.schema.kind === \"array\") {\n const itemSchema = unwrapOptional(field.schema.item);\n if (itemSchema.kind === \"object\") {\n return collectDynamicObjectHelpRows(\n itemSchema,\n casing,\n `${field.optionFlag}`,\n `${field.optionPathDisplay}`,\n metadata\n );\n }\n }\n\n return [\n {\n flags: `${field.optionFlag} <${describeDynamicFieldType(field)}>`,\n description: appendHelpMetadata(field.description ?? field.optionPathDisplay, metadata)\n }\n ];\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 formatExampleValue(value: unknown): string {\n if (typeof value === \"string\" && value.length > 0 && !value.includes(\" \")) {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nfunction formatExampleCommand(\n breadcrumb: string[],\n rootUsageName: string,\n params: Record<string, unknown>\n): string {\n const commandPath = buildUsageLine(breadcrumb, rootUsageName, \"\");\n const flags = Object.entries(params).map(([key, value]) => {\n const flag = `--${key}`;\n return typeof value === \"boolean\"\n ? value\n ? flag\n : `--no-${key}`\n : `${flag} ${formatExampleValue(value)}`;\n });\n\n return [commandPath, ...flags].filter((token) => token.length > 0).join(\" \");\n}\n\nfunction formatExampleRows(\n examples: Command<any, any, any, any>[\"examples\"],\n breadcrumb: string[],\n rootUsageName: string\n): string[] {\n return examples.map(\n (example) =>\n `${example.title}\\n ${formatExampleCommand(breadcrumb, rootUsageName, example.params)}`\n );\n}\n\nfunction wrapOptionalCommandParameterToken(token: string, optional: boolean): string {\n return optional ? `[${token}]` : token;\n}\n\nfunction formatCommandDynamicParameterTokens(\n field: DynamicFieldDefinition,\n casing: Casing\n): string[] {\n const optional = field.optional || field.hasDefault;\n return formatDynamicHelpFields(field, casing).map((row) =>\n wrapOptionalCommandParameterToken(row.flags, optional)\n );\n}\n\nfunction formatCommandParameterTokens<TServices extends object>(\n command: Command<TServices, any, any, any>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string[] {\n const collected = collectFields(command.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, command.positional);\n\n return fields\n .filter((field) => field.global !== true)\n .map((field) =>\n wrapOptionalCommandParameterToken(\n formatCommandParameterFieldFlags(field, globalLongOptionFlags),\n field.positionalIndex === undefined && (field.optional || field.hasDefault)\n )\n )\n .concat(\n collected.dynamicFields.flatMap((field) => formatCommandDynamicParameterTokens(field, casing))\n );\n}\n\nfunction formatCommandRowName<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const baseName =\n node.aliases.length === 0 ? node.name : `${node.name} (${node.aliases.join(\", \")})`;\n const parameterTokens =\n node.kind === \"command\"\n ? formatCommandParameterTokens(node, casing, globalLongOptionFlags)\n : [];\n const name = parameterTokens.length === 0 ? baseName : `${baseName} ${parameterTokens.join(\" \")}`;\n return name;\n}\n\nfunction formatCommandRows<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): HelpCommandRow[] {\n return getHelpChildren(group, scope).map((child) => ({\n name: formatCommandRowName(child, casing, globalLongOptionFlags),\n description: child.description ?? \"\"\n }));\n}\n\nfunction formatGlobalOptionsLine(ctx: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n}): string {\n const flags: string[] = [];\n\n if (ctx.presetsEnabled) {\n flags.push(\"--preset <path>\");\n }\n\n if (ctx.controls.yes) {\n flags.push(\"--yes\");\n }\n if (ctx.controls.output) {\n flags.push(\"--output <format>\");\n }\n if (ctx.controls.verbose) {\n flags.push(\"-v, --verbose\");\n }\n\n if (ctx.showVersion) {\n flags.push(\"--version\");\n }\n\n return flags.length > 0 ? `${text.section(\"Options:\")} ${flags.join(\" \")}` : \"\";\n}\n\nfunction formatLeafGlobalOptionsLine(ctx: { controls: ResolvedCLIControls }): string {\n return ctx.controls.verbose ? `${text.section(\"Options:\")} -v, --verbose` : \"\";\n}\n\nfunction collectSchemaGlobalFieldRows<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): HelpOptionRow[] {\n const seen = new Map<string, HelpOptionRow>();\n\n const visit = (node: Command<TServices, any, any, any> | Group<TServices>): void => {\n if (node.kind === \"command\") {\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n for (const field of collected.fields) {\n if (field.global !== true) {\n continue;\n }\n\n if (globalLongOptionFlags.has(field.optionFlag)) {\n continue;\n }\n\n const dedupeKey = `${field.optionFlag}|${field.shortFlag ?? \"\"}`;\n if (seen.has(dedupeKey)) {\n continue;\n }\n\n seen.set(dedupeKey, {\n flags: formatHelpFieldFlags(field, globalLongOptionFlags),\n description: formatHelpFieldDescription(field)\n });\n }\n return;\n }\n\n for (const child of getHelpChildren(node, scope)) {\n visit(child);\n }\n };\n\n visit(group);\n return [...seen.values()];\n}\n\nfunction renderHelpSections(sections: string[]): string {\n return sections.filter((section) => section.length > 0).join(\"\\n\\n\");\n}\n\nfunction formatHelpCommandList(rows: HelpCommandRow[]): string {\n return process.stdout.isTTY !== true\n ? helpFormatterPlain.formatCommandList(rows)\n : formatCommandList(rows);\n}\n\nfunction formatHelpOptionList(rows: HelpOptionRow[]): string {\n return process.stdout.isTTY !== true\n ? helpFormatterPlain.formatOptionList(rows)\n : formatOptionList(rows);\n}\n\nfunction buildUsageLine(breadcrumb: string[], rootUsageName: string, suffix: string): string {\n const visibleBreadcrumb = breadcrumb.filter((segment) => segment.length > 0);\n const usageBreadcrumb =\n breadcrumb[0] === \"\" ? [rootUsageName, ...visibleBreadcrumb] : visibleBreadcrumb;\n const subPath = usageBreadcrumb.slice(1).join(\" \");\n const tokens = [rootUsageName, subPath, suffix].filter((segment) => segment.length > 0);\n return tokens.join(\" \");\n}\n\nfunction formatGroupUsageSuffix<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n if (\n group.default !== undefined &&\n group.default.hidden === true &&\n group.default.scope.includes(scope)\n ) {\n const parameterTokens = formatCommandParameterTokens(\n group.default,\n casing,\n globalLongOptionFlags\n );\n return [\"[command]\", \"[OPTIONS]\", ...parameterTokens].join(\" \");\n }\n\n return \"[command] [OPTIONS]\";\n}\n\nfunction renderGroupHelp<TServices extends object>(\n group: Group<TServices>,\n breadcrumb: string[],\n scope: Scope,\n casing: Casing,\n globalOptions: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n },\n rootUsageName: string,\n isRoot: boolean\n): string {\n const sections: string[] = [];\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n globalOptions.presetsEnabled,\n globalOptions.showVersion,\n globalOptions.controls\n );\n const commandRows = formatCommandRows(group, scope, casing, globalLongOptionFlags);\n\n if (commandRows.length > 0) {\n sections.push(`${text.sectionHeader(\"Commands\")}\\n${formatHelpCommandList(commandRows)}`);\n }\n\n if (isRoot) {\n const schemaGlobalRows = collectSchemaGlobalFieldRows(\n group,\n scope,\n casing,\n globalLongOptionFlags\n );\n const builtInLine = formatGlobalOptionsLine(globalOptions);\n\n if (schemaGlobalRows.length > 0) {\n sections.push(\n `${text.sectionHeader(\"Options\")}\\n${formatHelpOptionList(schemaGlobalRows)}\\n${builtInLine}`\n );\n } else {\n sections.push(builtInLine);\n }\n }\n\n return renderHelpDocument({\n breadcrumb,\n rootUsageName,\n usageLine: buildUsageLine(\n breadcrumb,\n rootUsageName,\n formatGroupUsageSuffix(group, scope, casing, globalLongOptionFlags)\n ),\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 globalOptions: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n },\n rootUsageName: string\n): string {\n const sections: string[] = [];\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n globalOptions.presetsEnabled,\n globalOptions.showVersion,\n globalOptions.controls\n );\n const collected = collectFields(command.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, command.positional);\n const optionRows = fields\n .filter((field) => field.global !== true)\n .map((field) => ({\n flags: formatHelpFieldFlags(field, globalLongOptionFlags),\n description: formatHelpFieldDescription(field)\n }))\n .concat(collected.dynamicFields.flatMap((field) => formatDynamicHelpFields(field, casing)));\n\n if (optionRows.length > 0) {\n sections.push(`${text.sectionHeader(\"Options\")}\\n${formatHelpOptionList(optionRows)}`);\n }\n\n const builtInLine = formatLeafGlobalOptionsLine(globalOptions);\n if (builtInLine.length > 0) {\n sections.push(builtInLine);\n }\n\n const secretRows = formatSecretRows(command.secrets);\n if (secretRows.length > 0) {\n sections.push(\n `${text.sectionHeader(\"Secrets (environment)\")}\\n${formatHelpOptionList(secretRows)}`\n );\n }\n\n if (command.examples.length > 0) {\n sections.push(\n `${text.sectionHeader(\"Examples\")}\\n${formatExampleRows(command.examples, breadcrumb, rootUsageName).join(\"\\n\")}`\n );\n }\n\n const positionalFields = fields.filter((f) => f.positionalIndex !== undefined);\n const usageSuffix =\n positionalFields.length > 0\n ? `[OPTIONS] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[OPTIONS]\";\n\n return renderHelpDocument({\n breadcrumb,\n rootUsageName,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, usageSuffix),\n description: command.description,\n requiresAuth: command.requires?.auth === true,\n sections\n });\n}\n\nfunction renderJsonHelp<TServices extends object>(\n target: ResolvedHelpTarget<TServices>,\n root: Group<TServices>,\n casing: Casing,\n globalOptions: {\n controls: ResolvedCLIControls;\n showVersion: boolean;\n presetsEnabled: boolean;\n },\n rootUsageName: string\n): string {\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n globalOptions.presetsEnabled,\n globalOptions.showVersion,\n globalOptions.controls\n );\n const node = target.node;\n\n if (node.kind === \"group\") {\n const commandRows = formatCommandRows(node, \"cli\", casing, globalLongOptionFlags);\n const isRoot = node === root;\n return `${JSON.stringify(\n {\n schemaVersion: 1,\n kind: \"group\",\n name: target.breadcrumb.at(-1) ?? rootUsageName,\n path: target.breadcrumb.filter((segment) => segment.length > 0),\n usage: buildUsageLine(\n target.breadcrumb,\n rootUsageName,\n formatGroupUsageSuffix(node, \"cli\", casing, globalLongOptionFlags)\n ),\n ...(node.description === undefined ? {} : { description: node.description }),\n commands: commandRows.map((row) => ({ name: row.name, description: row.description })),\n options: isRoot\n ? collectSchemaGlobalFieldRows(node, \"cli\", casing, globalLongOptionFlags).map((row) => ({\n name: row.flags.split(/[ ,]+/)[0]?.replace(/^--/, \"\") ?? row.flags,\n flags: row.flags.split(\", \"),\n type: \"unknown\",\n description: row.description,\n required: false\n }))\n : []\n },\n null,\n 2\n )}\\n`;\n }\n\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n const positionalFields = fields.filter((field) => field.positionalIndex !== undefined);\n const usageSuffix =\n positionalFields.length > 0\n ? `[OPTIONS] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[OPTIONS]\";\n\n return `${JSON.stringify(\n {\n schemaVersion: 1,\n kind: \"command\",\n name: node.name,\n path: target.breadcrumb.filter((segment) => segment.length > 0),\n usage: buildUsageLine(target.breadcrumb, rootUsageName, usageSuffix),\n ...(node.description === undefined ? {} : { description: node.description }),\n options: fields\n .filter((field) => field.global !== true)\n .map((field) => formatJsonHelpOption(field, globalLongOptionFlags)),\n secrets: Object.entries(node.secrets).map(([name, secret]) => ({\n name,\n env: secret.env,\n required: secret.optional !== true,\n ...(secret.description === undefined ? {} : { description: secret.description })\n })),\n examples: node.examples\n },\n null,\n 2\n )}\\n`;\n}\n\nfunction formatJsonHelpOption(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): JsonHelpOption {\n return {\n name: field.displayPath,\n flags: formatHelpFieldFlags(field, globalLongOptionFlags).split(\", \"),\n type: formatJsonHelpSchemaType(field.schema),\n ...(field.description === undefined ? {} : { description: field.description }),\n required: field.requiredWhenActive,\n ...(field.hasDefault ? { default: field.defaultValue } : {}),\n ...(field.positionalIndex === undefined ? {} : { positional: true })\n };\n}\n\nfunction formatJsonHelpSchemaType(schema: FieldSchema): string {\n if (schema.kind === \"enum\") {\n return \"enum\";\n }\n\n if (schema.kind === \"array\") {\n return \"array\";\n }\n\n if (schema.kind === \"json\") {\n return \"json\";\n }\n\n return schema.kind;\n}\n\nfunction renderHelpDocument(input: {\n breadcrumb: string[];\n rootUsageName: string;\n usageLine: string;\n description?: string;\n requiresAuth: boolean;\n sections: string[];\n}): string {\n const title =\n input.breadcrumb.filter((segment) => segment.length > 0).join(\" \") || input.rootUsageName;\n const description = input.description ?? \"\";\n const sentenceEndIndex = description.indexOf(\". \");\n const headingDescription =\n sentenceEndIndex === -1 ? description : description.slice(0, sentenceEndIndex + 1);\n const remainingDescription =\n sentenceEndIndex === -1 ? \"\" : description.slice(sentenceEndIndex + 2);\n const heading = headingDescription.length > 0 ? `${title} \u2014 ${headingDescription}` : title;\n const lines = [text.heading(heading), \"\"];\n\n if (remainingDescription.length > 0) {\n lines.push(remainingDescription, \"\");\n }\n\n lines.push(`Usage: ${text.usageCommand(input.usageLine)}`, \"\");\n\n if (input.requiresAuth) {\n lines.push(\"Requires: authentication\");\n }\n\n if (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 output = resolveHelpOutput(argv);\n const casing = options.casing ?? \"kebab\";\n const rootUsageName = options.rootUsageName ?? inferProgramName(argv);\n const target = resolveHelpTarget(root, argv, \"cli\", rootUsageName, options.rootDisplayName);\n const controls = resolveCLIControls(options.controls);\n\n if (output === \"json\") {\n process.stdout.write(\n renderJsonHelp(\n target,\n root,\n casing,\n {\n controls,\n showVersion: options.version !== undefined,\n presetsEnabled: options.presets === true\n },\n rootUsageName\n )\n );\n return;\n }\n\n await withOutputFormat(output, async () => {\n const rendered =\n target.node.kind === \"group\"\n ? renderGroupHelp(\n target.node,\n target.breadcrumb,\n \"cli\",\n casing,\n {\n controls,\n showVersion: options.version !== undefined,\n presetsEnabled: options.presets === true\n },\n rootUsageName,\n target.node === root\n )\n : renderLeafHelp(\n target.node,\n target.breadcrumb,\n casing,\n {\n controls,\n showVersion: options.version !== undefined,\n presetsEnabled: options.presets === true\n },\n rootUsageName\n );\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 globalLongOptionFlags: ReadonlySet<string>,\n execute: (state: ExecutionState<TServices>) => Promise<void>,\n presetsEnabled: boolean,\n controls: ResolvedCLIControls,\n pathSegments: string[] = []\n): CommanderCommand | null {\n const nextPathSegments = [...pathSegments, node.name];\n\n if (node.kind === \"command\") {\n if (!node.scope.includes(\"cli\")) {\n return null;\n }\n\n const command = new CommanderCommand(node.name);\n Reflect.set(command, \"_toolcraftHidden\", node.hidden);\n Reflect.set(command, \"_toolcraftOriginalName\", node.name);\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n validateUniqueOptionFlags(fields, globalLongOptionFlags);\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, presetsEnabled, controls);\n command.allowExcessArguments(true);\n\n if (collected.dynamicFields.length > 0) {\n command.allowUnknownOption(true);\n }\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, globalLongOptionFlags)) {\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 commandPath: nextPathSegments.join(\".\"),\n casing,\n dynamicFields: collected.dynamicFields,\n fields,\n positionalValues,\n presetsEnabled,\n rawArgv: actionCommand.args,\n actionCommand,\n variants: collected.variants\n });\n });\n\n return command;\n }\n\n if (!isNodeVisibleInScope(node, \"cli\")) {\n return null;\n }\n\n const reservedChildNames = node.children\n .filter((child) => !isNodeVisibleInScope(child, \"cli\"))\n .flatMap((child) => getNodeCommandNames(child));\n const visibleChildren = node.children\n .map((child) =>\n createNodeCommand(\n child,\n casing,\n globalLongOptionFlags,\n execute,\n presetsEnabled,\n controls,\n nextPathSegments\n )\n )\n .filter((child): child is CommanderCommand => child !== null);\n\n const group = new CommanderCommand(node.name);\n Reflect.set(group, \"_toolcraftReservedChildNames\", reservedChildNames);\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, presetsEnabled, controls);\n const childNames = new Set(visibleChildren.map((child) => child.name()));\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 addCommanderChild(group, child, isDefaultChild, childNames);\n }\n\n return group;\n}\n\nfunction addCommanderChild(\n parent: CommanderCommand,\n child: CommanderCommand,\n isDefault: boolean,\n siblingNames: ReadonlySet<string>\n): void {\n if (isDefault && (child.name().length === 0 || isToolcraftHiddenCommander(child))) {\n let internalName = \"__toolcraft_default__\";\n let suffix = 2;\n\n while (siblingNames.has(internalName)) {\n internalName = `__toolcraft_default_${suffix}`;\n suffix += 1;\n }\n\n child.name(internalName);\n Reflect.set(\n parent,\n \"_toolcraftHiddenDefaultNames\",\n getToolcraftHiddenDefaultNames(parent).concat([\n ...new Set(\n [Reflect.get(child, \"_toolcraftOriginalName\"), ...child.aliases()].filter(\n (name): name is string => typeof name === \"string\" && name.length > 0\n )\n )\n ])\n );\n parent.addCommand(child, { hidden: true, isDefault: true });\n return;\n }\n\n const options = {\n ...(isDefault ? { isDefault: true } : {}),\n ...(isToolcraftHiddenCommander(child) ? { hidden: true } : {})\n };\n parent.addCommand(child, Object.keys(options).length > 0 ? options : undefined);\n}\n\nfunction isToolcraftHiddenCommander(command: CommanderCommand): boolean {\n return Reflect.get(command, \"_toolcraftHidden\") === true;\n}\n\nfunction getToolcraftHiddenDefaultNames(command: CommanderCommand): string[] {\n const value = Reflect.get(command, \"_toolcraftHiddenDefaultNames\");\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\nfunction getToolcraftReservedChildNames(command: CommanderCommand): string[] {\n const value = Reflect.get(command, \"_toolcraftReservedChildNames\");\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\nfunction getNodeCommandNames<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>\n): string[] {\n return [node.name, ...node.aliases].filter((name) => name.length > 0);\n}\n\nfunction createGlobalSnapshotOptions(\n presetsEnabled: boolean,\n versionEnabled: boolean,\n controls: ResolvedCLIControls\n): CLICommandTreeSnapshotOption[] {\n const options: CLICommandTreeSnapshotOption[] = [\n {\n name: \"help\",\n flags: [\"-h\", \"--help\"],\n type: \"boolean\",\n required: false,\n hidden: false,\n description: \"Display help for command.\"\n }\n ];\n\n if (presetsEnabled) {\n options.push({\n name: \"preset\",\n flags: [\"--preset\"],\n type: \"string\",\n required: false,\n hidden: true,\n description: \"Load parameter defaults from a JSON file.\"\n });\n }\n if (controls.yes) {\n options.push({\n name: \"yes\",\n flags: [\"--yes\"],\n type: \"boolean\",\n required: false,\n hidden: true,\n description: \"Accept defaults and skip prompts.\"\n });\n }\n if (controls.output) {\n options.push({\n name: \"output\",\n flags: [\"--output\"],\n type: \"enum\",\n required: false,\n hidden: true,\n description: \"Output format.\"\n });\n }\n if (controls.debug) {\n options.push({\n name: \"debug\",\n flags: [\"--debug\"],\n type: \"enum\",\n required: false,\n hidden: true,\n description: \"Print stack traces for unexpected errors.\"\n });\n }\n if (controls.logLevel) {\n options.push({\n name: \"logLevel\",\n flags: [\"--log-level\"],\n type: \"enum\",\n required: false,\n hidden: true,\n description: \"Set runtime diagnostic log level.\"\n });\n }\n if (controls.verbose) {\n options.push({\n name: \"verbose\",\n flags: [\"-v\", \"--verbose\"],\n type: \"boolean\",\n required: false,\n hidden: true,\n description: \"Print detailed runtime diagnostics.\"\n });\n }\n if (versionEnabled) {\n options.push({\n name: \"version\",\n flags: [\"--version\"],\n type: \"boolean\",\n required: false,\n hidden: false,\n description: \"Output the version number.\"\n });\n }\n\n return options;\n}\n\nfunction createSnapshotGroup<TServices extends object>(\n group: Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n pathSegments: string[],\n isDefault: boolean\n): CLICommandTreeSnapshotGroup {\n const children = group.children\n .filter((child) => isNodeVisibleInScope(child, \"cli\"))\n .map((child) =>\n createSnapshotNode(\n child,\n casing,\n globalLongOptionFlags,\n [...pathSegments, child.name],\n group.default === child\n )\n );\n\n return {\n kind: \"group\",\n name: group.name,\n path: pathSegments,\n aliases: [...group.aliases],\n hidden: false,\n default: isDefault,\n ...(group.description === undefined ? {} : { description: group.description }),\n children\n };\n}\n\nfunction createSnapshotNode<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n pathSegments: string[],\n isDefault: boolean\n): CLICommandTreeSnapshotNode {\n if (node.kind === \"group\") {\n return createSnapshotGroup(node, casing, globalLongOptionFlags, pathSegments, isDefault);\n }\n\n const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n validateUniqueOptionFlags(fields, globalLongOptionFlags);\n\n return {\n kind: \"command\",\n name: node.name,\n path: pathSegments,\n aliases: [...node.aliases],\n hidden: node.hidden,\n default: isDefault,\n ...(node.description === undefined ? {} : { description: node.description }),\n options: [\n ...fields.map((field) => createFieldSnapshotOption(field, globalLongOptionFlags)),\n ...collected.dynamicFields.flatMap((field) => createDynamicSnapshotOptions(field, casing))\n ]\n };\n}\n\nfunction createFieldSnapshotOption(\n field: FieldDefinition,\n globalLongOptionFlags: ReadonlySet<string>\n): CLICommandTreeSnapshotOption {\n return {\n name: field.displayPath,\n flags: formatHelpFieldFlags(field, globalLongOptionFlags).split(\", \"),\n type: formatJsonHelpSchemaType(field.schema),\n required: field.requiredWhenActive,\n hidden: false,\n ...(field.description === undefined ? {} : { description: field.description }),\n ...(field.hasDefault ? { default: field.defaultValue } : {}),\n ...(field.positionalIndex === undefined ? {} : { positional: true }),\n ...(field.global === true ? { global: true } : {})\n };\n}\n\nfunction createDynamicSnapshotOptions(\n field: DynamicFieldDefinition,\n casing: Casing\n): CLICommandTreeSnapshotOption[] {\n return formatDynamicHelpFields(field, casing).map((row) => ({\n name: field.displayPath,\n flags: [row.flags],\n type: describeDynamicFieldType(field),\n required: field.requiredWhenActive,\n hidden: false,\n ...(field.description === undefined ? {} : { description: field.description }),\n ...(field.hasDefault ? { default: field.defaultValue } : {}),\n dynamic: true\n }));\n}\n\nfunction addGlobalOptions(\n command: CommanderCommand,\n presetsEnabled: boolean,\n controls: ResolvedCLIControls\n): void {\n const options: Option[] = [];\n\n if (presetsEnabled) {\n options.push(new Option(\"--preset <path>\", \"Load parameter defaults from a JSON file.\"));\n }\n\n if (controls.yes) {\n options.push(new Option(\"--yes\", \"Accept defaults and skip prompts.\"));\n }\n if (controls.output) {\n options.push(\n new Option(\"--output <format>\", \"Output format.\").argParser((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(\n formatInvalidEnumMessage(\"--output\", value, [\"rich\", \"md\", \"markdown\", \"json\"], {\n candidates: [\"rich\", \"markdown\", \"json\"],\n threshold: 3\n })\n );\n })\n );\n }\n if (controls.debug) {\n options.push(\n new Option(\"--debug [mode]\", \"Print stack traces for unexpected errors.\")\n .preset(\"trim\")\n .argParser(parseDebugStackMode)\n );\n }\n if (controls.logLevel) {\n options.push(\n new Option(\"--log-level <level>\", \"Set runtime diagnostic log level.\").argParser(\n parseLogLevel\n )\n );\n }\n if (controls.verbose) {\n options.push(new Option(\"--verbose\", \"Print detailed runtime diagnostics.\"));\n }\n\n for (const option of options) {\n option.hideHelp(true);\n command.addOption(option);\n }\n}\n\nfunction parseDebugStackMode(value: string | boolean): DebugStackMode {\n if (value === true || value === \"trim\") {\n return \"trim\";\n }\n\n if (value === \"raw\") {\n return \"raw\";\n }\n\n throw new InvalidArgumentError(\n formatInvalidEnumMessage(\"--debug\", String(value), [\"raw\"], { candidates: [\"raw\"] })\n );\n}\n\nfunction parseLogLevel(value: string): LogLevel {\n if (isLogLevel(value)) {\n return value;\n }\n\n throw new InvalidArgumentError(\n formatInvalidEnumMessage(\"--log-level\", value, [...LOG_LEVELS], {\n candidates: [\"warn\", \"debug\", \"trace\"],\n threshold: 3\n })\n );\n}\n\nfunction writeCLIDiagnosticEvent(event: DiagnosticLogEvent): void {\n const transcript = event.data?.transcript;\n if (typeof transcript === \"string\") {\n process.stderr.write(transcript);\n return;\n }\n\n if (event.category === \"progress\" || event.level === \"trace\") {\n return;\n }\n\n process.stderr.write(`${event.message}\\n`);\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 = Object.prototype.hasOwnProperty.call(cursor, segment)\n ? cursor[segment]\n : undefined;\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 Object.defineProperty(cursor, segment, {\n value: next,\n enumerable: true,\n configurable: true,\n writable: true\n });\n cursor = next;\n }\n\n const leaf = path[path.length - 1];\n if (leaf !== undefined) {\n Object.defineProperty(cursor, leaf, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\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\nfunction fieldPromptLabel(field: FieldDefinition): string {\n return field.positionalIndex === undefined ? field.optionFlag : `<${field.displayPath}>`;\n}\n\nfunction enumOptionLabel(schema: Extract<FieldSchema, { kind: \"enum\" }>, value: unknown): string {\n const key = String(value);\n\n if (schema.labels === undefined || !Object.prototype.hasOwnProperty.call(schema.labels, key)) {\n return key;\n }\n\n return schema.labels[key] ?? key;\n}\n\ninterface PromptStreams {\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nfunction withPromptStreams<T extends object>(options: T, streams: PromptStreams): T & PromptStreams {\n return {\n ...options,\n ...(streams.input === undefined ? {} : { input: streams.input }),\n ...(streams.output === undefined ? {} : { output: streams.output })\n };\n}\n\nfunction throwPromptCancellation(): never {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n}\n\nasync function promptForField(\n field: FieldDefinition,\n streams: PromptStreams = {}\n): 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: enumOptionLabel(schema, value),\n value\n }));\n const selected = await select(\n withPromptStreams(\n {\n message: field.description ?? fieldPromptLabel(field),\n options,\n initialValue: field.hasDefault ? field.defaultValue : undefined\n },\n streams\n )\n );\n\n if (isCancel(selected)) {\n throwPromptCancellation();\n }\n\n return selected;\n }\n\n if (field.schema.kind === \"boolean\") {\n const selected = await confirm(\n withPromptStreams(\n {\n message: fieldPromptLabel(field),\n initialValue: field.hasDefault ? Boolean(field.defaultValue) : undefined\n },\n streams\n )\n );\n\n if (isCancel(selected)) {\n throwPromptCancellation();\n }\n\n return selected;\n }\n\n const entered = await promptText(\n withPromptStreams(\n {\n message: fieldPromptLabel(field),\n initialValue:\n field.hasDefault && field.defaultValue !== undefined\n ? formatResolvedValue(field.defaultValue)\n : undefined\n },\n streams\n )\n );\n\n if (isCancel(entered)) {\n throwPromptCancellation();\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 if (field.schema.kind === \"json\") {\n if (entered === \"null\" && field.schema.nullable === true) {\n return null;\n }\n\n return parseJsonText(entered, 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\nfunction resolveOutputFromArgv(argv: readonly string[]): OutputMode {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index] ?? \"\";\n\n if (token === \"--json\") {\n return \"json\";\n }\n if (token === \"--md\" || token === \"--markdown\") {\n return \"md\";\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 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\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 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 === \"number\") {\n return getExpectedNumberDescription(schema);\n }\n\n if (schema.kind === \"json\") {\n return \"valid JSON\";\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 if (schema.minLength !== undefined && value.length < schema.minLength) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected a string with length at least ${schema.minLength}, got string with length ${value.length}.`\n );\n }\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected a string with length at most ${schema.maxLength}, got string with length ${value.length}.`\n );\n }\n if (schema.pattern !== undefined && !matchesStringPattern(value, schema.pattern)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\": \"${value}\" does not match pattern \"${schema.pattern}\".`\n );\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\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected ${describeExpectedPresetValue(schema)}, got ${describeReceived(value)}.`\n );\n}\n\nfunction validatePresetFieldValue(\n value: unknown,\n field: FieldDefinition,\n presetPath: string\n): unknown {\n if (field.schema.kind === \"json\") {\n return value;\n }\n\n if (field.schema.kind !== \"array\") {\n return validatePresetScalarValue(\n value,\n field.schema as ScalarSchema,\n field.displayPath,\n presetPath\n );\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, got ${describeReceived(value)}.`\n );\n }\n\n if (field.schema.minItems !== undefined && value.length < field.schema.minItems) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array with at least ${field.schema.minItems} items, got array(${value.length}).`\n );\n }\n\n if (field.schema.maxItems !== undefined && value.length > field.schema.maxItems) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array with at most ${field.schema.maxItems} items, got array(${value.length}).`\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 (hasOwnErrorCode(error, \"ENOENT\")) {\n throw new UserError(`Preset file \"${presetPath}\" was not found.`);\n }\n\n const message =\n error instanceof Error && error.message.length > 0 ? error.message : \"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 (error) {\n throw new UserError(\n formatJsonParseUserErrorMessage(\"Preset file\", presetPath, rawPreset, error, {\n quotePath: true\n }),\n { cause: error }\n );\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, got ${describeReceived(value)}.`\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]) =>\n matchesFixtureValue(value, actual[key])\n );\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(\n init?.method ?? (input instanceof Request ? input.method : undefined)\n );\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 lstat: async () => ({ isSymbolicLink: () => false }),\n rename: async () => undefined,\n unlink: async () => undefined\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(\n ([key]) => key !== \"result\" && key !== \"response\" && key !== \"error\"\n )\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 (\n typeof firstArg === \"string\" &&\n Object.prototype.hasOwnProperty.call(definition, firstArg)\n ) {\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[]) =>\n 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(\n scenarios: FixtureScenario[],\n selector: string,\n fixturePath: string\n): 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 const names = scenarios\n .map((entry) => entry.name)\n .filter((name): name is string => typeof name === \"string\" && name.length > 0);\n const available =\n names.length === 0\n ? `No fixtures are declared in ${fixturePath}.`\n : formatAvailableList(names);\n throw new UserError(`Fixture scenario \"${selector}\" was not found. ${available}`);\n }\n\n return scenario;\n}\n\nasync function loadFixtureScenario(\n command: Command<any, any, any, any>,\n selector: string\n): Promise<FixtureScenario> {\n const commandPath = getCommandSourcePath(command);\n\n if (commandPath === undefined) {\n throw new UserError(\n `Fixture mode could not determine the source file for command \"${command.name}\".`\n );\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 (error) {\n throw new UserError(\n formatJsonParseUserErrorMessage(\"Fixture file\", fixturePath, rawFixture, error, {\n quotePath: false\n }),\n { cause: error }\n );\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, fixturePath);\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(\n command: Command<any, any, any, any>\n): 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 runtimeFetch: typeof globalThis.fetch,\n runtimeEnv?: Record<string, string>,\n runtimeFs?: HandlerFs\n): Promise<ResolvedFixtureRuntime<TServices>> {\n const selector = process.env.TOOLCRAFT_FIXTURE;\n\n if (selector === undefined || selector.length === 0) {\n return {\n env: createEnv(runtimeEnv),\n fetch: runtimeFetch,\n fs: createFs(runtimeFs),\n isFixture: false,\n requirementOptions,\n secrets: resolveCommandSecrets(command, runtimeEnv),\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 isHumanInLoopPending(result: unknown): result is HumanInLoopPending {\n return (\n typeof result === \"object\" &&\n result !== null &&\n (result as { status?: unknown }).status === \"pending-approval\" &&\n typeof (result as { approvalId?: unknown }).approvalId === \"string\" &&\n typeof (result as { message?: unknown }).message === \"string\" &&\n typeof (result as { enqueuedAt?: unknown }).enqueuedAt === \"string\"\n );\n}\n\nfunction renderHumanInLoopPending(pending: HumanInLoopPending): void {\n process.stdout.write(\n `\u2713 Queued for human approval (id: ${pending.approvalId})\\n` +\n ` Message: ${pending.message}\\n` +\n ` Track: toolcraft approvals show ${pending.approvalId}\\n`\n );\n}\n\nfunction renderApprovalDeclined(error: ApprovalDeclinedError): void {\n const logger = createLogger();\n logger.error(error.message);\n process.exitCode = 1;\n}\n\ntype CliErrorPattern =\n | {\n kind: \"usage\";\n message: string;\n rootUsageName: string;\n commandPath: string;\n }\n | {\n kind: \"runtime-user\";\n message: string;\n }\n | {\n kind: \"definition\";\n error: Error;\n debugStackMode: DebugStackMode | undefined;\n }\n | {\n kind: \"toolcraft-bug\";\n error: Error;\n debugStackMode: DebugStackMode | undefined;\n }\n | {\n kind: \"unexpected\";\n message: string;\n stack: string | undefined;\n debugStackMode: DebugStackMode | undefined;\n };\n\nfunction renderCliErrorPattern(\n pattern: CliErrorPattern,\n outputEmitter?: (entry: string) => void\n): void {\n const logger = createLogger(outputEmitter);\n\n if (pattern.kind === \"usage\") {\n logger.error(\n appendUsagePointer(pattern.message, {\n rootUsageName: pattern.rootUsageName,\n commandPath: pattern.commandPath\n })\n );\n process.exitCode = 1;\n return;\n }\n\n if (pattern.kind === \"runtime-user\") {\n logger.error(pattern.message);\n process.exitCode = 1;\n return;\n }\n\n if (pattern.kind === \"definition\") {\n logger.error(\n `Command definition error: ${pattern.error.message}\\n` +\n \"This is a bug in the generated command definition, not in your command arguments.\\n\" +\n \"Run with --debug for a stack trace.\"\n );\n if (pattern.debugStackMode !== undefined && pattern.error.stack) {\n process.stderr.write(`${formatDebugStack(pattern.error.stack, pattern.debugStackMode)}\\n`);\n }\n process.exitCode = 1;\n return;\n }\n\n if (pattern.kind === \"toolcraft-bug\") {\n logger.error(\n `toolcraft hit an internal invariant: ${pattern.error.message}\\n` +\n `This is a bug in toolcraft or in the command definition; ` +\n `it cannot be worked around by changing argv. ` +\n `Re-run with --debug for a stack trace and file an issue.`\n );\n if (pattern.debugStackMode !== undefined && pattern.error.stack) {\n process.stderr.write(`${formatDebugStack(pattern.error.stack, pattern.debugStackMode)}\\n`);\n }\n process.exitCode = 1;\n return;\n }\n\n logger.error(\n pattern.debugStackMode !== undefined\n ? pattern.message\n : `${pattern.message} Use --debug for a stack trace.`\n );\n if (pattern.debugStackMode !== undefined && pattern.stack !== undefined) {\n process.stderr.write(`${formatDebugStack(pattern.stack, pattern.debugStackMode)}\\n`);\n }\n process.exitCode = 1;\n}\n\nfunction getNestedValue(target: Record<string, unknown>, path: string[]): unknown {\n return path.reduce<unknown>(\n (current, segment) =>\n current !== null && typeof current === \"object\"\n ? (current as Record<string, unknown>)[segment]\n : undefined,\n target\n );\n}\n\nfunction parseFieldInputValue(value: string, schema: FieldSchema, label: string): unknown {\n if (schema.kind === \"array\") {\n return parseArrayValue(value, schema, label);\n }\n\n if (schema.kind === \"json\") {\n if (value === \"null\" && schema.nullable === true) {\n return null;\n }\n\n return parseJsonText(value, label);\n }\n\n return parseScalarValue(value, schema, label);\n}\n\nfunction parseOptionFieldValue(\n field: FieldDefinition,\n value: unknown,\n errors: ValidationError[]\n): { ok: true; value: unknown } | { ok: false } {\n try {\n if (value === null) {\n return { ok: true, value };\n }\n\n if (field.schema.kind === \"array\" && Array.isArray(value)) {\n const parsedValues: unknown[] = [];\n\n for (const item of value) {\n const parsed = parseArrayValue(String(item), field.schema, field.displayPath);\n if (parsed === null) {\n return { ok: true, value: null };\n }\n\n parsedValues.push(...parsed);\n }\n\n validateArrayBounds(parsedValues, field.schema, field.displayPath);\n return { ok: true, value: parsedValues };\n }\n\n if (typeof value !== \"string\") {\n return { ok: true, value };\n }\n\n const parsedValue = parseFieldInputValue(value, field.schema, field.displayPath);\n if (field.schema.kind === \"array\" && Array.isArray(parsedValue)) {\n validateArrayBounds(parsedValue, field.schema, field.displayPath);\n }\n\n return { ok: true, value: parsedValue };\n } catch (error) {\n if (error instanceof UserError || error instanceof InvalidArgumentError) {\n errors.push({\n path: field.displayPath,\n message: error.message\n });\n return { ok: false };\n }\n\n throw error;\n }\n}\n\nfunction consumeFieldValue(\n args: string[],\n index: number,\n schema: FieldSchema,\n label: string,\n inlineValue?: string\n): {\n nextIndex: number;\n value: unknown;\n} {\n if (schema.kind === \"boolean\") {\n if (inlineValue !== undefined) {\n return {\n nextIndex: index,\n value: parseScalarValue(inlineValue, schema, label)\n };\n }\n\n const next = args[index + 1];\n if (next === \"true\" || next === \"false\" || (schema.nullable === true && next === \"null\")) {\n return {\n nextIndex: index + 1,\n value: parseScalarValue(next, schema, label)\n };\n }\n\n return {\n nextIndex: index,\n value: true\n };\n }\n\n if (inlineValue !== undefined) {\n return {\n nextIndex: index,\n value: parseFieldInputValue(inlineValue, schema, label)\n };\n }\n\n if (schema.kind === \"array\") {\n const values: unknown[] = [];\n let nextIndex = index;\n let cursor = index + 1;\n\n while (cursor < args.length) {\n const token = args[cursor] ?? \"\";\n if (isNextArrayOptionToken(token, schema)) {\n break;\n }\n\n const parsed = parseArrayValue(token, schema, label);\n if (parsed === null) {\n return {\n nextIndex: cursor,\n value: null\n };\n }\n\n values.push(...parsed);\n nextIndex = cursor;\n cursor += 1;\n }\n\n if (values.length === 0) {\n throw new InvalidArgumentError(`option '${label}' argument missing`);\n }\n\n validateArrayBounds(values, schema, label);\n\n return {\n nextIndex,\n value: values\n };\n }\n\n const next = args[index + 1];\n if (next === undefined) {\n throw new InvalidArgumentError(`option '${label}' argument missing`);\n }\n\n return {\n nextIndex: index + 1,\n value: parseFieldInputValue(next, schema, label)\n };\n}\n\nfunction resolveDynamicLeaf(\n schema: AnySchema,\n rawSegments: string[],\n casing: Casing,\n outputPath: string[] = [],\n displayPath: string[] = [],\n displayPathPrefix = \"\"\n): {\n displayPath: string;\n path: string[];\n schema: FieldSchema;\n} {\n const unwrappedSchema = unwrapOptional(schema);\n const kind = formatCliSchemaKind(unwrappedSchema.kind);\n\n if (rawSegments.length === 0) {\n if (\n unwrappedSchema.kind === \"json\" ||\n unwrappedSchema.kind === \"array\" ||\n unwrappedSchema.kind === \"string\" ||\n unwrappedSchema.kind === \"number\" ||\n unwrappedSchema.kind === \"boolean\" ||\n unwrappedSchema.kind === \"enum\"\n ) {\n return {\n displayPath: toDisplayPath(displayPath),\n path: outputPath,\n schema: unwrappedSchema as FieldSchema\n };\n }\n\n throw new UserError(\n formatUnsupportedDynamicSchemaMessage(\n kind,\n qualifyDisplayPath(displayPathPrefix, toDisplayPath(displayPath))\n )\n );\n }\n\n switch (unwrappedSchema.kind) {\n case \"object\": {\n const [head, ...rest] = rawSegments;\n\n for (const [key, childSchema] of Object.entries(unwrappedSchema.shape) as Array<\n [string, AnySchema]\n >) {\n if (formatSegment(key, casing) !== head) {\n continue;\n }\n\n return resolveDynamicLeaf(\n childSchema,\n rest,\n casing,\n [...outputPath, key],\n [...displayPath, key],\n displayPathPrefix\n );\n }\n\n throw new UserError(\n `Unknown parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n [...displayPath, head].join(\".\")\n )}\". ${formatAvailableList(\n Object.keys(unwrappedSchema.shape).map((key) =>\n qualifyDisplayPath(\n displayPathPrefix,\n toDisplayPath([...displayPath, formatSegment(key, casing)])\n )\n )\n )}`\n );\n }\n\n case \"record\": {\n const [head, ...rest] = rawSegments;\n return resolveDynamicLeaf(\n unwrappedSchema.value,\n rest,\n casing,\n [...outputPath, head ?? \"\"],\n [...displayPath, head ?? \"\"],\n displayPathPrefix\n );\n }\n\n case \"array\": {\n const itemSchema = unwrapOptional(unwrappedSchema.item);\n if (itemSchema.kind !== \"object\") {\n throw new UserError(\n `Array parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n toDisplayPath(displayPath)\n )}\" must use object items.`\n );\n }\n\n const [head, ...rest] = rawSegments;\n if (head === undefined || !isNumericFixtureSelector(head)) {\n throw new UserError(\n `Array parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n toDisplayPath(displayPath)\n )}\" must use numeric indices.`\n );\n }\n\n return resolveDynamicLeaf(\n itemSchema,\n rest,\n casing,\n [...outputPath, head],\n [...displayPath, head],\n displayPathPrefix\n );\n }\n\n default:\n throw new UserError(\n `Unknown parameter \"${qualifyDisplayPath(\n displayPathPrefix,\n [...displayPath, ...rawSegments].join(\".\")\n )}\". ${formatAvailableList(\n displayPath.length === 0\n ? []\n : [qualifyDisplayPath(displayPathPrefix, toDisplayPath(displayPath))]\n )}`\n );\n }\n}\n\nfunction finalizeDynamicValue(\n schema: AnySchema,\n value: unknown,\n displayPath: string,\n errors: ValidationError[]\n): unknown {\n const unwrappedSchema = unwrapOptional(schema);\n\n if (value === undefined) {\n return undefined;\n }\n\n if (value === null && unwrappedSchema.nullable === true) {\n return null;\n }\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"enum\":\n case \"json\":\n return value;\n\n case \"array\": {\n const itemSchema = unwrapOptional(unwrappedSchema.item);\n if (itemSchema.kind !== \"object\") {\n return value;\n }\n\n if (!isPlainObject(value)) {\n errors.push({\n path: displayPath,\n message: `Invalid value for \"${displayPath}\". Expected indexed object entries, got ${describeReceived(value)}.`\n });\n return value;\n }\n\n const entries = Object.entries(value);\n const indices = entries.map(([key]) => Number(key)).sort((left, right) => left - right);\n\n if (indices.some((index) => !Number.isInteger(index) || index < 0)) {\n errors.push({\n path: displayPath,\n message: `Array parameter \"${displayPath}\" must use numeric indices.`\n });\n return value;\n }\n\n for (let index = 0; index < indices.length; index += 1) {\n if (indices[index] !== index) {\n errors.push({\n path: displayPath,\n message: `Array parameter \"${displayPath}\" must use contiguous indices starting at 0.`\n });\n return value;\n }\n }\n\n return indices.map((index) =>\n finalizeDynamicValue(\n unwrappedSchema.item,\n (value as Record<string, unknown>)[String(index)],\n `${displayPath}.${index}`,\n errors\n )\n );\n }\n\n case \"object\": {\n if (!isPlainObject(value)) {\n errors.push({\n path: displayPath,\n message: `Invalid value for \"${displayPath}\". Expected an object, got ${describeReceived(value)}.`\n });\n return value;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, rawChildSchema] of Object.entries(unwrappedSchema.shape) as Array<\n [string, AnySchema]\n >) {\n const childSchema = unwrapOptional(rawChildSchema);\n const childValue = value[key];\n const childDisplayPath = displayPath.length === 0 ? key : `${displayPath}.${key}`;\n\n if (childValue === undefined) {\n if (childSchema.default !== undefined) {\n result[key] = childSchema.default;\n continue;\n }\n\n if (rawChildSchema.kind === \"optional\") {\n continue;\n }\n\n errors.push({\n path: childDisplayPath,\n message: `Missing required parameter \"${childDisplayPath}\".`\n });\n continue;\n }\n\n result[key] = finalizeDynamicValue(rawChildSchema, childValue, childDisplayPath, errors);\n }\n\n return result;\n }\n\n case \"record\": {\n if (!isPlainObject(value)) {\n errors.push({\n path: displayPath,\n message: `Invalid value for \"${displayPath}\". Expected an object, got ${describeReceived(value)}.`\n });\n return value;\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entryValue]) => [\n key,\n finalizeDynamicValue(\n unwrappedSchema.value,\n entryValue,\n displayPath.length === 0 ? key : `${displayPath}.${key}`,\n errors\n )\n ])\n );\n }\n\n default:\n errors.push({\n path: displayPath,\n message: formatUnsupportedDynamicSchemaMessage(\n formatCliSchemaKind(unwrappedSchema.kind),\n displayPath\n )\n });\n return value;\n }\n}\n\nfunction formatCliSchemaKind(kind: string): string {\n return kind === \"oneOf\" ? \"oneof\" : kind;\n}\n\nfunction formatUnsupportedDynamicSchemaMessage(kind: string, displayPath: string): string {\n return `Unsupported parameter type \"${kind}\" for \"${displayPath}\". Supported types: string, number, integer, boolean, array, object, enum, oneof.`;\n}\n\nfunction qualifyDisplayPath(prefix: string, displayPath: string): string {\n if (prefix.length === 0) {\n return displayPath;\n }\n\n if (displayPath.length === 0) {\n return prefix;\n }\n\n return `${prefix}.${displayPath}`;\n}\n\nfunction parseDynamicValues(\n dynamicFields: DynamicFieldDefinition[],\n rawArgv: string[],\n casing: Casing,\n errors: ValidationError[]\n): {\n providedFieldIds: Set<string>;\n values: Map<string, unknown>;\n} {\n const rawValues = new Map<string, Record<string, unknown>>();\n const providedFieldIds = new Set<string>();\n const sortedFields = [...dynamicFields].sort(\n (left, right) => right.optionPath.length - left.optionPath.length\n );\n\n for (let index = 0; index < rawArgv.length; index += 1) {\n const token = rawArgv[index] ?? \"\";\n if (!token.startsWith(\"--\")) {\n continue;\n }\n\n const negated = token.startsWith(\"--no-\");\n const normalized = negated ? `--${token.slice(\"--no-\".length)}` : token;\n const equalsIndex = normalized.indexOf(\"=\");\n const flagName = equalsIndex >= 0 ? normalized.slice(2, equalsIndex) : normalized.slice(2);\n const inlineValue = equalsIndex >= 0 ? normalized.slice(equalsIndex + 1) : undefined;\n const flagPath = flagName.split(\".\");\n const match = sortedFields.find((field) => {\n const optionPath = field.optionPath.map((segment) => formatSegment(segment, casing));\n return (\n flagPath.length > optionPath.length &&\n optionPath.every((segment, segmentIndex) => flagPath[segmentIndex] === segment)\n );\n });\n\n if (match === undefined) {\n throw new UserError(\n `Unknown parameter \"${flagName}\". ${formatAvailableList(\n dynamicFields.map((field) => field.optionPathDisplay)\n )}`\n );\n }\n\n const optionPath = match.optionPath.map((segment) => formatSegment(segment, casing));\n const remainder = flagPath.slice(optionPath.length);\n const leaf = resolveDynamicLeaf(match.schema, remainder, casing, [], [], match.displayPath);\n const rawStore = rawValues.get(match.id) ?? {};\n const label = `${match.displayPath}.${leaf.displayPath}`.replace(/^\\./u, \"\");\n const parsed =\n negated && leaf.schema.kind === \"boolean\"\n ? {\n nextIndex: index,\n value: false\n }\n : consumeFieldValue(rawArgv, index, leaf.schema, label, inlineValue);\n\n setNestedValue(rawStore, leaf.path, parsed.value);\n rawValues.set(match.id, rawStore);\n providedFieldIds.add(match.id);\n index = parsed.nextIndex;\n }\n\n return {\n providedFieldIds,\n values: new Map(\n dynamicFields\n .filter((field) => rawValues.has(field.id))\n .map((field) => [\n field.id,\n finalizeDynamicValue(\n field.schema.kind === \"record\" ? field.schema : field.schema,\n rawValues.get(field.id),\n field.displayPath,\n errors\n )\n ])\n )\n };\n}\n\nasync function enforceVariantConstraints(\n params: Record<string, unknown>,\n fields: FieldDefinition[],\n dynamicFields: DynamicFieldDefinition[],\n variants: VariantDefinition[],\n resolvedFieldValues: Map<string, unknown>,\n providedDynamicFieldIds: Set<string>,\n providedFieldIds: Set<string>,\n shouldPrompt: boolean,\n errors: ValidationError[]\n): Promise<void> {\n const fieldById = new Map(fields.map((field) => [field.id, field]));\n const dynamicFieldById = new Map(dynamicFields.map((field) => [field.id, field]));\n const getAvailableBranchParameters = (branch: VariantBranchDefinition): string[] => [\n ...branch.fieldIds\n .map((fieldId) => fieldById.get(fieldId))\n .filter((field): field is FieldDefinition => field !== undefined && field.synthetic !== true)\n .map((field) => field.displayPath),\n ...branch.dynamicFieldIds\n .map((fieldId) => dynamicFieldById.get(fieldId))\n .filter((field): field is DynamicFieldDefinition => field !== undefined)\n .map((field) => field.optionPathDisplay)\n ];\n\n for (const variant of variants) {\n let selectedBranchId = resolvedFieldValues.get(variant.controlFieldId);\n\n if (selectedBranchId === undefined && shouldPrompt) {\n const controlField = fieldById.get(variant.controlFieldId);\n if (controlField !== undefined) {\n selectedBranchId = await promptForField(controlField);\n resolvedFieldValues.set(controlField.id, selectedBranchId);\n if (!controlField.synthetic) {\n setNestedValue(params, controlField.path, selectedBranchId);\n }\n }\n }\n\n if (selectedBranchId === undefined) {\n if (variant.optional) {\n continue;\n }\n\n errors.push({\n path: variant.controlDisplayPath,\n message: `Missing required parameter \"${variant.controlDisplayPath}\".`\n });\n continue;\n }\n\n const selectedBranch = variant.branches.find((branch) => branch.branchId === selectedBranchId);\n if (selectedBranch === undefined) {\n errors.push({\n path: variant.controlDisplayPath,\n message: `Invalid value for \"${variant.controlDisplayPath}\". Expected one of: ${variant.branches.map((branch) => branch.branchId).join(\", \")}, got ${describeReceived(selectedBranchId)}.`\n });\n continue;\n }\n\n let hasInvalidBranchParameter = false;\n\n for (const branch of variant.branches) {\n if (branch.branchId === selectedBranch.branchId) {\n continue;\n }\n\n const invalidFieldId = branch.fieldIds.find((fieldId) => providedFieldIds.has(fieldId));\n if (invalidFieldId !== undefined) {\n const field = fieldById.get(invalidFieldId);\n if (field !== undefined) {\n errors.push({\n path: field.displayPath,\n message: `Unknown parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n hasInvalidBranchParameter = true;\n }\n }\n\n const invalidDynamicFieldId = branch.dynamicFieldIds.find((fieldId) =>\n providedDynamicFieldIds.has(fieldId)\n );\n if (invalidDynamicFieldId !== undefined) {\n const field = dynamicFieldById.get(invalidDynamicFieldId);\n if (field !== undefined) {\n errors.push({\n path: field.displayPath,\n message: `Unknown parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n hasInvalidBranchParameter = true;\n }\n }\n }\n\n if (hasInvalidBranchParameter) {\n continue;\n }\n\n for (const fieldId of selectedBranch.requiredFieldIds) {\n const field = fieldById.get(fieldId);\n if (field === undefined || field.synthetic) {\n continue;\n }\n\n if (getNestedValue(params, field.path) !== undefined) {\n continue;\n }\n\n if (shouldPrompt) {\n const promptedValue = await promptForField(field);\n resolvedFieldValues.set(field.id, promptedValue);\n setNestedValue(params, field.path, promptedValue);\n providedFieldIds.add(field.id);\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n }\n\n for (const fieldId of selectedBranch.requiredDynamicFieldIds) {\n const field = dynamicFieldById.get(fieldId);\n if (field === undefined) {\n continue;\n }\n\n if (getNestedValue(params, field.path) !== undefined) {\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\" for ${variant.controlDisplayPath}=\"${selectedBranch.branchId}\". ${formatAvailableList(\n getAvailableBranchParameters(selectedBranch)\n )}`\n });\n }\n }\n}\n\nasync function resolveParams(\n fields: FieldDefinition[],\n dynamicFields: DynamicFieldDefinition[],\n variants: VariantDefinition[],\n positionalValues: unknown[],\n optionValues: Record<string, unknown>,\n rawArgv: string[],\n casing: Casing,\n presetPath: string | undefined,\n shouldPrompt: boolean,\n missingParameterContext: CliMissingParameterContext | undefined,\n promptStreams: PromptStreams\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 const providedFieldIds = new Set<string>();\n const resolvedFieldValues = new Map<string, unknown>();\n const errors: ValidationError[] = [];\n\n for (const field of fields) {\n let value: unknown;\n let resolvedMissing = false;\n let source: \"default\" | \"option\" | \"positional\" | \"preset\" | \"prompt\" | undefined;\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 source = \"positional\";\n }\n } else if (typeof positionalValue === \"string\" && positionalValue.length > 0) {\n value = parseFieldInputValue(positionalValue, field.schema, field.displayPath);\n source = \"positional\";\n }\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(optionValues, field.commanderOptionAttribute) &&\n hasFieldValue(optionValues[field.commanderOptionAttribute])\n ) {\n value = normalizeCommanderOptionValue(optionValues[field.commanderOptionAttribute]);\n source = \"option\";\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 = normalizeCommanderOptionValue(optionValues[field.optionAttribute]);\n source = \"option\";\n }\n\n if (\n value === undefined &&\n field.optionFlag === \"--verbose\" &&\n Object.prototype.hasOwnProperty.call(optionValues, field.optionAttribute) &&\n hasFieldValue(optionValues[field.optionAttribute])\n ) {\n value = normalizeCommanderOptionValue(optionValues[field.optionAttribute]);\n source = \"option\";\n }\n\n if (\n value === undefined &&\n Object.prototype.hasOwnProperty.call(presetValues, field.optionAttribute)\n ) {\n value = presetValues[field.optionAttribute];\n source = \"preset\";\n }\n\n if (source === \"option\") {\n const parsed = parseOptionFieldValue(field, value, errors);\n if (!parsed.ok) {\n continue;\n }\n\n value = parsed.value;\n }\n\n if (\n value === undefined &&\n field.optional &&\n missingParameterContext !== undefined &&\n field.schema.cli?.resolveMissing !== undefined\n ) {\n const resolution = await field.schema.cli.resolveMissing({\n ...missingParameterContext,\n params: { ...params }\n });\n const choices = resolution?.choices ?? [];\n\n if (choices.length === 1) {\n value = choices[0]?.value;\n resolvedMissing = true;\n source = \"prompt\";\n } else if (choices.length > 1) {\n const selected = await select<unknown>(\n withPromptStreams(\n {\n message: resolution?.message ?? field.description ?? fieldPromptLabel(field),\n options: choices.map((choice) => ({\n label: choice.label,\n value: choice.value as unknown\n }))\n },\n promptStreams\n )\n );\n\n if (isCancel(selected)) {\n throwPromptCancellation();\n }\n\n value = selected;\n resolvedMissing = true;\n source = \"prompt\";\n }\n }\n\n if (resolvedMissing) {\n const validation = validateSchema(field.schema, value);\n if (!validation.ok) {\n errors.push(\n ...validation.issues.map((issue) => ({\n path: field.displayPath,\n message: issue.message\n }))\n );\n continue;\n }\n value = validation.value;\n }\n\n if (value === undefined && shouldPrompt && !field.optional) {\n value = await promptForField(field, promptStreams);\n source = \"prompt\";\n }\n\n if (value === undefined && field.hasDefault) {\n value = field.defaultValue;\n source = \"default\";\n }\n\n if (value === undefined) {\n if (field.optional) {\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\".`\n });\n continue;\n }\n\n resolvedFieldValues.set(field.id, value);\n if (source !== undefined && source !== \"default\") {\n providedFieldIds.add(field.id);\n }\n\n if (!field.synthetic) {\n setNestedValue(params, field.path, value);\n }\n }\n\n const dynamicResults =\n dynamicFields.length > 0\n ? parseDynamicValues(dynamicFields, rawArgv, casing, errors)\n : {\n providedFieldIds: new Set<string>(),\n values: new Map<string, unknown>()\n };\n\n for (const field of dynamicFields) {\n let value = dynamicResults.values.get(field.id);\n\n if (value === undefined && field.hasDefault) {\n value = field.defaultValue;\n }\n\n if (value === undefined) {\n if (field.optional || field.variantId !== undefined) {\n continue;\n }\n\n errors.push({\n path: field.displayPath,\n message: `Missing required parameter \"${field.displayPath}\".`\n });\n continue;\n }\n\n setNestedValue(params, field.path, value);\n }\n\n await enforceVariantConstraints(\n params,\n fields,\n dynamicFields,\n variants,\n resolvedFieldValues,\n dynamicResults.providedFieldIds,\n providedFieldIds,\n shouldPrompt,\n errors\n );\n\n throwValidationErrors(errors);\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 runtimeFetch: typeof globalThis.fetch,\n runtimeOptions: HumanInLoopRuntimeOptions | undefined,\n runtimeEnv: Record<string, string> | undefined,\n runtimeFs: HandlerFs | undefined,\n outputEmitter: ((entry: string) => void) | undefined,\n promptStreams: PromptStreams,\n diagnosticsOptions: {\n logLevel?: LogLevel;\n logger?: RuntimeLoggerInput;\n verboseControlEnabled: boolean;\n },\n onErrorReportContext?: (context: {\n command: Command<TServices, any, any, any>;\n commandPath: string;\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n }) => void\n): Promise<void> {\n const logger = createLogger(outputEmitter);\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 diagnostics = createRuntimeLogger({\n level:\n resolvedFlags.logLevel ??\n (diagnosticsOptions.verboseControlEnabled && resolvedFlags.verbose\n ? \"trace\"\n : diagnosticsOptions.logLevel),\n logger: diagnosticsOptions.logger ?? writeCLIDiagnosticEvent\n });\n const promptInput = promptStreams.input ?? process.stdin;\n const promptOutput = promptStreams.output ?? process.stdout;\n const stdinTTY = Boolean((promptInput as NodeJS.ReadStream).isTTY);\n const stdoutTTY = Boolean((promptOutput as NodeJS.WriteStream).isTTY);\n const shouldPrompt = !resolvedFlags.yes && stdinTTY;\n const missingParameterContext: CliMissingParameterContext | undefined =\n !resolvedFlags.yes && output === \"rich\" && stdinTTY && stdoutTTY\n ? {\n commandPath: state.commandPath,\n params: {},\n output,\n stdinTTY,\n stdoutTTY\n }\n : undefined;\n const runtime = await resolveFixtureRuntime(\n state.command,\n services,\n requirementOptions,\n runtimeFetch,\n runtimeEnv,\n runtimeFs\n );\n const preflightContext = {\n ...runtime.services,\n secrets: runtime.secrets,\n fetch: runtime.fetch,\n fs: runtime.fs,\n env: runtime.env,\n diagnostics,\n progress(message: string): void {\n diagnostics.emit({ level: \"info\", message, category: \"progress\" });\n logger.info(message);\n }\n };\n\n let runtimeSecrets: Record<string, string | undefined> | undefined;\n let resolvedParams: unknown;\n\n try {\n await withOutputFormat(output, async () => {\n await assertCommandRequirements(state.command, preflightContext, runtime.requirementOptions);\n\n const params = await resolveParams(\n state.fields,\n state.dynamicFields,\n state.variants,\n state.positionalValues,\n optionValues,\n state.rawArgv,\n state.casing,\n state.presetsEnabled ? resolvedFlags.preset : undefined,\n shouldPrompt,\n missingParameterContext,\n promptStreams\n );\n resolvedParams = params;\n runtimeSecrets = runtime.secrets;\n\n const context = {\n ...preflightContext,\n params\n } as HandlerContext<any, any, TServices>;\n\n if (state.command.stream !== undefined) {\n const stream = createManagedStream({\n eventSchema: state.command.stream.event,\n onStatus(event) {\n diagnostics.emit({\n level: \"info\",\n message: event.message ?? event.type,\n category: \"runtime\"\n });\n if (output === \"rich\" && event.message !== undefined) {\n logger.info(event.message);\n }\n },\n async create(signal, status) {\n return await state.command.handler({\n ...context,\n signal,\n status,\n async refreshSecrets() {\n return resolveCommandSecrets(state.command, runtimeEnv);\n }\n } as never);\n }\n });\n const interrupt = (): void => {\n void stream.cancel(new UserError(\"Operation cancelled.\"));\n };\n process.once(\"SIGINT\", interrupt);\n try {\n for await (const event of stream) {\n if (output === \"json\") {\n const line = JSON.stringify(event);\n if (outputEmitter === undefined) {\n process.stdout.write(`${line}\\n`);\n } else {\n outputEmitter(line);\n }\n } else {\n renderResult(\n state.command,\n event,\n output,\n primitives,\n outputEmitter === undefined\n ? undefined\n : (chunk) => outputEmitter(chunk.endsWith(\"\\n\") ? chunk.slice(0, -1) : chunk)\n );\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", interrupt);\n await stream.cancel();\n }\n return;\n }\n\n if (\n state.command.confirm &&\n !state.command.humanInLoop &&\n !resolvedFlags.yes &&\n process.stdin.isTTY\n ) {\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 = state.command.humanInLoop\n ? await (\n await importOptionalModule<typeof import(\"./human-in-loop/gate.js\")>(\n optionalModulePaths.humanInLoop\n )\n ).invokeWithHumanInLoop(state.command, context, runtimeOptions, state.commandPath)\n : await state.command.handler(context);\n\n if (output === \"rich\" && runtime.isFixture) {\n writeRichHeader(`${state.command.name} (fixture)`);\n }\n\n if (isHumanInLoopPending(result)) {\n renderHumanInLoopPending(result);\n return;\n }\n\n const renderStatus = renderResult(\n state.command,\n result,\n output,\n primitives,\n outputEmitter === undefined\n ? undefined\n : (chunk) => outputEmitter(chunk.endsWith(\"\\n\") ? chunk.slice(0, -1) : chunk)\n );\n if (renderStatus.mcpError) {\n process.exitCode = 1;\n }\n });\n } catch (error) {\n onErrorReportContext?.({\n command: state.command,\n commandPath: state.commandPath,\n params: resolvedParams,\n secrets: runtimeSecrets ?? runtime.secrets\n });\n throw error;\n }\n}\n\ntype HttpErrorLike = {\n name: string;\n message: string;\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n };\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\n };\n};\n\ntype ProblemDetailsLike = {\n type?: string;\n title?: string;\n status?: number;\n detail?: string;\n instance?: string;\n};\n\ntype GraphQLErrorEnvelopeLike = {\n errors: Array<{\n message: string;\n path?: Array<string | number>;\n extensions?: {\n code?: string;\n };\n }>;\n};\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isPlainObject(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\nfunction isHttpErrorLike(error: unknown): error is HttpErrorLike {\n if (!isPlainObject(error)) {\n return false;\n }\n\n if (typeof error.name !== \"string\" || typeof error.message !== \"string\") {\n return false;\n }\n\n const request = error.request;\n const response = error.response;\n\n return (\n isPlainObject(request) &&\n typeof request.method === \"string\" &&\n typeof request.url === \"string\" &&\n isStringRecord(request.headers) &&\n isPlainObject(response) &&\n typeof response.status === \"number\" &&\n typeof response.statusText === \"string\" &&\n isStringRecord(response.headers) &&\n hasOwnProperty(response, \"body\")\n );\n}\n\nfunction hasTypedOptionalField(\n value: Record<string, unknown>,\n field: string,\n type: \"number\" | \"string\"\n): boolean {\n return !hasOwnProperty(value, field) || typeof value[field] === type;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction isProblemDetailsLike(body: unknown): body is ProblemDetailsLike {\n if (!isPlainObject(body)) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"type\", \"string\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"title\", \"string\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"status\", \"number\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"detail\", \"string\")) {\n return false;\n }\n\n if (!hasTypedOptionalField(body, \"instance\", \"string\")) {\n return false;\n }\n\n return hasOwnNonEmptyString(body, \"title\") || hasOwnNonEmptyString(body, \"detail\");\n}\n\nfunction isGraphQLErrorEnvelopeLike(body: unknown): body is GraphQLErrorEnvelopeLike {\n if (!isPlainObject(body) || !Array.isArray(body.errors) || body.errors.length === 0) {\n return false;\n }\n\n return body.errors.every((error) => {\n if (!isPlainObject(error) || typeof error.message !== \"string\") {\n return false;\n }\n\n if (hasOwnProperty(error, \"path\")) {\n const pathValue = error.path;\n if (\n !Array.isArray(pathValue) ||\n !pathValue.every((entry) => typeof entry === \"string\" || typeof entry === \"number\")\n ) {\n return false;\n }\n }\n\n if (hasOwnProperty(error, \"extensions\")) {\n if (!isPlainObject(error.extensions)) {\n return false;\n }\n\n if (hasOwnProperty(error.extensions, \"code\") && typeof error.extensions.code !== \"string\") {\n return false;\n }\n }\n\n return true;\n });\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n\nfunction hasOwnNonEmptyString<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, string> {\n return hasOwnProperty(value, name) && isNonEmptyString(value[name]);\n}\n\nfunction styleHttpErrorLine(value: string, style: (line: string) => string): string {\n return process.stdout.isTTY !== true ? value : style(value);\n}\n\nfunction formatHttpErrorStatus(value: string): string {\n return styleHttpErrorLine(value, text.error);\n}\n\nfunction formatProblemDetailsBody(body: ProblemDetailsLike): string {\n const lines: string[] = [];\n\n if (hasOwnNonEmptyString(body, \"title\")) {\n lines.push(`Problem: ${body.title}`);\n }\n\n if (hasOwnNonEmptyString(body, \"detail\")) {\n lines.push(`Detail: ${body.detail}`);\n }\n\n if (hasOwnProperty(body, \"type\") && body.type !== undefined) {\n lines.push(`Type: ${body.type}`);\n }\n\n if (hasOwnProperty(body, \"instance\") && body.instance !== undefined) {\n lines.push(`Instance: ${body.instance}`);\n }\n\n if (hasOwnProperty(body, \"status\") && body.status !== undefined) {\n lines.push(`Status: ${body.status}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatGraphQLErrorEnvelopeBody(body: GraphQLErrorEnvelopeLike): string {\n return body.errors\n .map((error) => {\n const lines = [`GraphQL error: ${error.message}`];\n\n if (hasOwnProperty(error, \"path\") && error.path !== undefined) {\n lines.push(` at path: ${error.path.join(\".\")}`);\n }\n\n if (\n hasOwnProperty(error, \"extensions\") &&\n error.extensions !== undefined &&\n hasOwnProperty(error.extensions, \"code\") &&\n error.extensions.code !== undefined\n ) {\n lines.push(` code: ${error.extensions.code}`);\n }\n\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatHttpErrorBody(body: unknown): string {\n const redactedBody = redactHttpBody(body);\n\n if (typeof redactedBody === \"string\") {\n return redactedBody;\n }\n\n if (isProblemDetailsLike(redactedBody)) {\n return formatProblemDetailsBody(redactedBody);\n }\n\n if (isGraphQLErrorEnvelopeLike(redactedBody)) {\n return formatGraphQLErrorEnvelopeBody(redactedBody);\n }\n\n const serialized = JSON.stringify(redactedBody, null, 2);\n return serialized === undefined ? String(redactedBody) : serialized;\n}\n\nfunction indentHttpErrorBlock(value: string): string {\n return value\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n\nfunction formatHttpHeaderValue(name: string, value: string): string {\n return redactHttpHeaderValue(name, value);\n}\n\nfunction formatHttpErrorHeaders(headers: Record<string, string>): string[] {\n return Object.entries(headers).map(\n ([name, value]) => ` ${name}: ${formatHttpHeaderValue(name, value)}`\n );\n}\n\nfunction formatHttpErrorSnippet(body: unknown): string {\n return formatHttpErrorBody(body).replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nfunction renderHttpError(\n error: HttpErrorLike,\n options: { debugStackMode: DebugStackMode | undefined; verbose: boolean }\n): void {\n const detailed = options.verbose || options.debugStackMode !== undefined;\n const summary = summarizeHttpError(error);\n const lines: string[] = [\n styleHttpErrorLine(`Request: ${error.request.method} ${error.request.url}`, text.muted)\n ];\n\n if (detailed) {\n lines.push(\"\", \"Request headers:\", ...formatHttpErrorHeaders(error.request.headers), \"\");\n\n if (error.request.body !== undefined) {\n lines.push(\n \"Request body:\",\n indentHttpErrorBlock(formatHttpErrorBody(error.request.body)),\n \"\"\n );\n }\n }\n\n lines.push(\n formatHttpErrorStatus(`Status: ${error.response.status} ${error.response.statusText}`)\n );\n\n if (detailed) {\n lines.push(\n \"\",\n \"Response headers:\",\n ...formatHttpErrorHeaders(error.response.headers),\n \"\",\n \"Response body:\",\n indentHttpErrorBlock(formatHttpErrorBody(error.response.body))\n );\n } else {\n const summaryLines = [\n summary.code === undefined ? undefined : `Code: ${summary.code}`,\n summary.message === undefined ? undefined : `Message: ${summary.message}`,\n summary.requestId === undefined ? undefined : `Request id: ${summary.requestId}`,\n summary.retryAfter === undefined ? undefined : `Retry after: ${summary.retryAfter}`,\n summary.hint === undefined ? undefined : `Hint: ${summary.hint}`\n ].filter((line): line is string => line !== undefined);\n\n if (summary.fieldErrors !== undefined && summary.fieldErrors.length > 0) {\n summaryLines.push(\n \"\",\n \"Field errors:\",\n ...summary.fieldErrors.map((fieldError) => ` ${fieldError.path}: ${fieldError.message}`)\n );\n }\n\n lines.push(\"\");\n if (summaryLines.length > 0) {\n lines.push(...summaryLines);\n } else {\n lines.push(`Response body: ${formatHttpErrorSnippet(error.response.body)}`);\n }\n lines.push(\"Re-run with --verbose to see headers and full body.\");\n }\n\n process.stderr.write(`${lines.join(\"\\n\")}\\n`);\n\n const stack = error instanceof Error ? (error as Error).stack : undefined;\n if (options.debugStackMode !== undefined && stack) {\n process.stderr.write(`${formatDebugStack(stack, options.debugStackMode)}\\n`);\n }\n}\n\nasync function handleRunError(\n error: unknown,\n options: {\n debugStackMode: DebugStackMode | undefined;\n output: OutputMode;\n verbose: boolean;\n program?: CommanderCommand;\n argv?: readonly string[];\n rootUsageName: string;\n commandPath: string;\n outputEmitter?: (entry: string) => void;\n userErrorPattern: \"definition\" | \"runtime-user\" | \"usage\";\n }\n): Promise<void> {\n const logger = createLogger(options.outputEmitter);\n\n await withOutputFormat(options.output, async () => {\n if (error instanceof UserError) {\n renderCliErrorPattern(\n options.userErrorPattern === \"definition\"\n ? {\n kind: \"definition\",\n error,\n debugStackMode: options.debugStackMode\n }\n : options.userErrorPattern === \"usage\"\n ? {\n kind: \"usage\",\n message: error.message,\n rootUsageName: options.rootUsageName,\n commandPath: options.commandPath\n }\n : {\n kind: \"runtime-user\",\n message: error.message\n },\n options.outputEmitter\n );\n return;\n }\n\n if (error instanceof Error && error.name === \"ToolcraftBugError\") {\n renderCliErrorPattern(\n {\n kind: \"toolcraft-bug\",\n error,\n debugStackMode: options.debugStackMode\n },\n options.outputEmitter\n );\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 if (error.code === \"commander.unknownCommand\") {\n logger.error(\n appendUsagePointer(\n formatUnknownCommandError(error, options.program, options.argv ?? process.argv),\n {\n rootUsageName: options.rootUsageName,\n commandPath: options.commandPath\n }\n )\n );\n return;\n }\n if (error.code === \"commander.unknownOption\") {\n const argv = options.argv ?? process.argv;\n logger.error(\n appendUsagePointer(formatUnknownOptionError(error, options.program, argv), {\n rootUsageName: options.rootUsageName,\n commandPath:\n options.commandPath.length > 0\n ? options.commandPath\n : findCurrentCommanderCommandPath(options.program, argv)\n })\n );\n return;\n }\n logger.error(\n appendUsagePointer(formatCommanderErrorMessage(error), {\n rootUsageName: options.rootUsageName,\n commandPath:\n options.commandPath.length > 0\n ? options.commandPath\n : findCurrentCommanderCommandPath(options.program, options.argv ?? process.argv)\n })\n );\n return;\n }\n\n if (isHttpErrorLike(error)) {\n renderHttpError(error, options);\n process.exitCode = 1;\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n renderCliErrorPattern(\n {\n kind: \"unexpected\",\n message,\n stack: error instanceof Error ? error.stack : undefined,\n debugStackMode: options.debugStackMode\n },\n options.outputEmitter\n );\n });\n}\n\nfunction formatCommanderErrorMessage(error: CommanderError): string {\n return error.message.startsWith(\"error:\") ? error.message : `error: ${error.message}`;\n}\n\nfunction formatInvalidEnumMessage(\n label: string,\n value: string,\n values: ReadonlyArray<string | number | boolean>,\n opts: { candidates?: readonly string[]; threshold?: number } = {}\n): string {\n const suggestions = suggest(\n value,\n opts.candidates ?? values.map((candidate) => String(candidate)),\n opts\n );\n const suggestionLine =\n suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}?\\n` : \" \";\n return `Invalid value for \"${label}\".${suggestionLine}Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}, got ${describeReceived(value)}.`;\n}\n\nfunction formatUnknownCommandError(\n error: CommanderError,\n program: CommanderCommand | undefined,\n argv: readonly string[]\n): string {\n const input = extractQuotedCommanderValue(error.message) ?? \"\";\n const currentCommand =\n program === undefined ? undefined : findCurrentCommanderCommand(program, argv);\n return formatUnknownCommandMessage(input, currentCommand);\n}\n\nfunction appendUsagePointer(\n message: string,\n options: {\n rootUsageName: string;\n commandPath: string;\n }\n): string {\n if (message.includes(\"--help\")) {\n return message;\n }\n\n const helpTarget =\n options.commandPath.length === 0\n ? options.rootUsageName\n : `${options.rootUsageName} ${options.commandPath}`;\n return `${message}\\nRun ${helpTarget} --help for usage.`;\n}\n\nfunction formatCliCommandPath(commandPath: string): string {\n return commandPath\n .split(\".\")\n .filter((segment) => segment.length > 0)\n .join(\" \");\n}\n\nfunction formatUnknownCommandMessage(\n input: string,\n currentCommand: CommanderCommand | undefined\n): string {\n const suggestions =\n currentCommand === undefined\n ? []\n : suggest(\n input,\n currentCommand.commands.map((command) => command.name())\n );\n return formatSuggestionMessage(`Unknown command \"${input}\".`, suggestions);\n}\n\nfunction formatUnknownOptionError(\n error: CommanderError,\n program: CommanderCommand | undefined,\n argv: readonly string[]\n): string {\n const input = extractQuotedCommanderValue(error.message) ?? \"\";\n const currentCommand =\n program === undefined ? undefined : findCurrentCommanderCommand(program, argv);\n const suggestions =\n currentCommand === undefined\n ? []\n : suggest(\n input,\n currentCommand.options\n .map((option) => option.long)\n .filter((flag): flag is string => flag !== undefined)\n );\n return formatSuggestionMessage(`Unknown option \"${input}\".`, suggestions);\n}\n\nfunction formatSuggestionMessage(message: string, suggestions: readonly string[]): string {\n if (suggestions.length === 0) {\n return message;\n }\n\n return `${message}\\nDid you mean: ${suggestions.join(\", \")}?`;\n}\n\nfunction extractQuotedCommanderValue(message: string): string | undefined {\n const singleQuoted = extractBetweenQuotes(message, \"'\");\n if (singleQuoted !== undefined) {\n return singleQuoted;\n }\n\n return extractBetweenQuotes(message, '\"');\n}\n\nfunction extractBetweenQuotes(message: string, quote: \"'\" | '\"'): string | undefined {\n const start = message.indexOf(quote);\n if (start === -1) {\n return undefined;\n }\n\n const end = message.indexOf(quote, start + 1);\n if (end === -1) {\n return undefined;\n }\n\n return message.slice(start + 1, end);\n}\n\nfunction resolveDebugStackMode(value: unknown): DebugStackMode | undefined {\n if (value === true || value === \"trim\") {\n return \"trim\";\n }\n\n if (value === \"raw\") {\n return \"raw\";\n }\n\n return undefined;\n}\n\nfunction getDebugStackModeFromArgv(argv: readonly string[]): DebugStackMode | undefined {\n for (let index = 2; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === undefined) {\n continue;\n }\n\n if (token === \"--debug\") {\n return \"trim\";\n }\n\n if (token === \"--debug=raw\") {\n return \"raw\";\n }\n }\n\n return undefined;\n}\n\nfunction findCurrentCommanderCommand(\n program: CommanderCommand,\n argv: readonly string[]\n): CommanderCommand {\n let current = program;\n const tokens = argv.slice(2);\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === undefined || token === \"--\") {\n break;\n }\n if (token.startsWith(\"-\")) {\n const option = current.options.find(\n (candidate) => candidate.long === token || candidate.short === token\n );\n if (option?.required === true && !token.includes(\"=\")) {\n index += 1;\n }\n continue;\n }\n\n const child = current.commands.find(\n (command) => command.name() === token || command.aliases().includes(token)\n );\n if (child === undefined) {\n break;\n }\n\n current = child;\n }\n\n return current;\n}\n\nfunction findCurrentCommanderCommandPath(\n program: CommanderCommand | undefined,\n argv: readonly string[]\n): string {\n if (program === undefined) {\n return \"\";\n }\n\n let current = program;\n const pathSegments: string[] = [];\n const tokens = argv.slice(2);\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === undefined || token === \"--\" || token.startsWith(\"-\")) {\n break;\n }\n\n const child = current.commands.find(\n (command) => command.name() === token || command.aliases().includes(token)\n );\n if (child === undefined) {\n break;\n }\n\n current = child;\n pathSegments.push(child.name());\n }\n\n return pathSegments.join(\" \");\n}\n\nfunction findUnknownCommanderCommand(\n program: CommanderCommand,\n argv: readonly string[]\n): { input: string; currentCommand: CommanderCommand; commandPath: string } | undefined {\n let current = program;\n const pathSegments: string[] = [];\n const tokens = argv.slice(2);\n\n for (let index = 0; index < tokens.length; index += 1) {\n const token = tokens[index];\n if (token === undefined || token === \"--\") {\n return undefined;\n }\n if (token.startsWith(\"-\")) {\n const option = current.options.find(\n (candidate) => candidate.long === token || candidate.short === token\n );\n if (option?.required === true && !token.includes(\"=\")) {\n index += 1;\n }\n continue;\n }\n\n if (\n getToolcraftHiddenDefaultNames(current).includes(token) ||\n getToolcraftReservedChildNames(current).includes(token)\n ) {\n return {\n input: token,\n currentCommand: current,\n commandPath: pathSegments.join(\" \")\n };\n }\n\n if (current.commands.length === 0) {\n return undefined;\n }\n\n const child = current.commands.find(\n (command) => command.name() === token || command.aliases().includes(token)\n );\n if (child === undefined) {\n if (getDefaultCommanderCommandName(current) !== undefined) {\n if (shouldRejectDefaultCommandToken(current, token, pathSegments)) {\n return {\n input: token,\n currentCommand: current,\n commandPath: pathSegments.join(\" \")\n };\n }\n\n return undefined;\n }\n\n return {\n input: token,\n currentCommand: current,\n commandPath: pathSegments.join(\" \")\n };\n }\n\n current = child;\n pathSegments.push(child.name());\n }\n\n return undefined;\n}\n\nfunction shouldRejectDefaultCommandToken(\n command: CommanderCommand,\n token: string,\n pathSegments: readonly string[]\n): boolean {\n return (\n pathSegments.length === 0 &&\n isBareCommandLikeToken(token) &&\n hasNonDefaultPublicChildCommand(command)\n );\n}\n\nfunction hasNonDefaultPublicChildCommand(command: CommanderCommand): boolean {\n const defaultName = getDefaultCommanderCommandName(command);\n return command.commands.some(\n (child) =>\n child.name() !== defaultName &&\n !isToolcraftHiddenCommander(child) &&\n !getToolcraftReservedChildNames(command).includes(child.name())\n );\n}\n\nfunction isBareCommandLikeToken(token: string): boolean {\n if (token.length === 0) {\n return false;\n }\n\n for (const character of token) {\n if (!isCommandNameCharacter(character)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isCommandNameCharacter(character: string): boolean {\n const code = character.codePointAt(0);\n if (code === undefined) {\n return false;\n }\n\n const isLowercaseLetter = code >= 97 && code <= 122;\n const isUppercaseLetter = code >= 65 && code <= 90;\n const isDigit = code >= 48 && code <= 57;\n return (\n isLowercaseLetter || isUppercaseLetter || isDigit || character === \"-\" || character === \"_\"\n );\n}\n\nfunction getDefaultCommanderCommandName(command: CommanderCommand): string | undefined {\n const candidate = command as CommanderCommand & { _defaultCommandName?: unknown };\n return typeof candidate._defaultCommandName === \"string\"\n ? candidate._defaultCommandName\n : undefined;\n}\n\nfunction configureCommanderSuggestionOutput(command: CommanderCommand): void {\n command.exitOverride();\n command.configureOutput({\n outputError: (message, write) => {\n if (message.includes(\"unknown command\") || message.includes(\"unknown option\")) {\n return;\n }\n\n write(message);\n }\n });\n\n command.commands.forEach((child) => configureCommanderSuggestionOutput(child));\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 enableSourceMaps();\n const controls = resolveCLIControls(options.controls);\n const argv = controls.verbose\n ? normalizeVerboseAlias([...(options.argv ?? process.argv)])\n : [...(options.argv ?? process.argv)];\n const rootUsageName = options.rootUsageName ?? inferProgramName(argv);\n let lastActionCommand: CommanderCommand | undefined;\n let resolvedCommandPath = \"\";\n let program: CommanderCommand | undefined;\n let version: string | undefined;\n let userErrorPattern: \"definition\" | \"runtime-user\" | \"usage\" = \"definition\";\n let errorReportContext:\n | {\n command: Command<TServices, any, any, any>;\n commandPath: string;\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n }\n | undefined;\n\n try {\n const normalizedRoot = normalizeRoots(roots, argv);\n const root =\n options.approvals === true\n ? (\n await importOptionalModule<typeof import(\"./human-in-loop/approvals-commands.js\")>(\n optionalModulePaths.approvals\n )\n ).mergeApprovalsGroup(normalizedRoot)\n : normalizedRoot;\n if (hasMcpProxyConfig(root)) {\n await (\n await importOptionalModule<typeof import(\"./mcp-proxy.js\")>(optionalModulePaths.mcpProxy)\n ).resolveMcpProxies(root, { projectRoot: options.projectRoot });\n }\n const casing = options.casing ?? \"kebab\";\n const services = (options.services ?? {}) as TServices;\n const runtimeOptions = options.humanInLoop ?? {};\n const runtimeFetch = options.fetch ?? globalThis.fetch;\n version = options.version ?? findEntrypointPackageMetadata(argv[1])?.version;\n const servicesWithBuiltIns = {\n ...services,\n runtimeOptions,\n root\n } as TServices;\n const requirementOptions = {\n apiVersion: options.apiVersion,\n env: options.env\n } satisfies CommandRequirementOptions;\n\n validateServices(services as Record<string, unknown>);\n\n if (hasHelpFlag(argv)) {\n userErrorPattern = \"usage\";\n await renderGeneratedHelp(root, argv, { ...options, version });\n return;\n }\n\n if (argv.length <= 2 && root.default?.scope.includes(\"cli\") !== true) {\n userErrorPattern = \"usage\";\n await renderGeneratedHelp(root, argv, { ...options, version });\n return;\n }\n\n program = new CommanderCommand();\n program.name(root.name);\n program.exitOverride();\n program.showHelpAfterError();\n program.addHelpCommand(false);\n const presetsEnabled = options.presets === true;\n const globalLongOptionFlags = getGlobalLongOptionFlags(\n presetsEnabled,\n version !== undefined,\n controls\n );\n addGlobalOptions(program, presetsEnabled, controls);\n\n if (version !== undefined) {\n program.version(version, \"--version\");\n }\n Reflect.set(\n program,\n \"_toolcraftReservedChildNames\",\n root.children\n .filter((child) => !isNodeVisibleInScope(child, \"cli\"))\n .flatMap((child) => getNodeCommandNames(child))\n );\n\n const execute = async (state: ExecutionState<TServices>) => {\n lastActionCommand = state.actionCommand;\n resolvedCommandPath = formatCliCommandPath(state.commandPath);\n await executeCommand(\n state,\n servicesWithBuiltIns,\n requirementOptions,\n runtimeFetch,\n runtimeOptions,\n options.env,\n options.fs,\n options.outputEmitter,\n {\n input: options.promptInput,\n output: options.promptOutput\n },\n {\n logLevel: options.logLevel,\n logger: options.logger,\n verboseControlEnabled: controls.verbose\n },\n (context) => {\n errorReportContext = context;\n }\n );\n };\n\n const rootChildNames = new Set(\n root.children\n .filter((candidate) => isNodeVisibleInScope(candidate, \"cli\"))\n .map((candidate) => candidate.name)\n );\n for (const child of root.children) {\n const command = createNodeCommand(\n child,\n casing,\n globalLongOptionFlags,\n execute,\n presetsEnabled,\n controls\n );\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 addCommanderChild(program, command, isDefaultChild, rootChildNames);\n }\n configureCommanderSuggestionOutput(program);\n\n const unknownCommand = findUnknownCommanderCommand(program, argv);\n if (unknownCommand !== undefined) {\n createLogger().error(\n appendUsagePointer(\n formatUnknownCommandMessage(unknownCommand.input, unknownCommand.currentCommand),\n {\n rootUsageName,\n commandPath: unknownCommand.commandPath\n }\n )\n );\n process.exitCode = 1;\n return;\n }\n\n userErrorPattern = \"usage\";\n await program.parseAsync(argv);\n } catch (error) {\n if (error instanceof ApprovalDeclinedError) {\n renderApprovalDeclined(error);\n return;\n }\n\n const resolvedFlags = lastActionCommand ? getResolvedFlags(lastActionCommand) : undefined;\n const report = await writeErrorReport({\n argv,\n command: errorReportContext?.command,\n commandPath: errorReportContext?.commandPath ?? resolvedCommandPath,\n env: process.env,\n error,\n errorReports: options.errorReports,\n params: errorReportContext?.params,\n projectRoot: options.projectRoot,\n secrets: errorReportContext?.secrets,\n version\n });\n\n if (report !== undefined) {\n process.stderr.write(`Saved error report to ${report.displayPath}\\n`);\n }\n\n await handleRunError(error, {\n debugStackMode:\n resolvedFlags !== undefined\n ? resolveDebugStackMode(resolvedFlags.debug)\n : getDebugStackModeFromArgv(argv),\n output:\n resolvedFlags !== undefined ? resolveOutput(resolvedFlags) : resolveOutputFromArgv(argv),\n verbose: resolvedFlags ? Boolean(resolvedFlags.verbose) : argv.includes(\"--verbose\"),\n program,\n argv,\n rootUsageName,\n commandPath: resolvedCommandPath,\n outputEmitter: options.outputEmitter,\n userErrorPattern: errorReportContext?.params === undefined ? userErrorPattern : \"runtime-user\"\n });\n }\n}\n", "import type { SchemaBase } from \"./index.js\";\n\ntype JsonPrimitive = string | number | boolean | null;\n\nexport type JsonValue = JsonPrimitive | { [key: string]: JsonValue } | JsonValue[];\n\nexport interface JsonValueSchema extends SchemaBase<\"json\", JsonValue> {\n readonly kind: \"json\";\n}\n\nexport function Json(): JsonValueSchema {\n return {\n kind: \"json\",\n };\n}\n", "import type { ObjectSchema, SchemaBase, Static } from \"./index.js\";\n\ntype OneOfStatic<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string,\n> = {\n [TBranchName in keyof TBranches & string]: Omit<Static<TBranches[TBranchName]>, TDiscriminator> & {\n [TFieldName in TDiscriminator]: TBranchName;\n };\n}[keyof TBranches & string];\n\nexport interface OneOfSchema<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string = string,\n> extends SchemaBase<\"oneOf\", OneOfStatic<TBranches, TDiscriminator>> {\n readonly discriminator: TDiscriminator;\n readonly branches: TBranches;\n}\n\nfunction assertValidBranches(\n branches: Record<string, ObjectSchema<any>>,\n discriminator: string\n): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\n }\n\n for (const [branchName, branch] of Object.entries(branches)) {\n if (Object.prototype.hasOwnProperty.call(branch.shape, discriminator)) {\n throw new Error(\n `OneOf branch \"${branchName}\" must not declare discriminator field \"${discriminator}\".`\n );\n }\n }\n}\n\nexport function OneOf<\n TDiscriminator extends string,\n TBranches extends Record<string, ObjectSchema<any>>,\n>(config: {\n discriminator: TDiscriminator;\n branches: TBranches;\n}): OneOfSchema<TBranches, TDiscriminator> {\n assertValidBranches(config.branches, config.discriminator);\n\n return {\n kind: \"oneOf\",\n discriminator: config.discriminator,\n branches: config.branches,\n };\n}\n", "import type { AnySchema, SchemaBase, Static } from \"./index.js\";\n\nexport interface RecordSchema<TValue extends AnySchema>\n extends SchemaBase<\"record\", Record<string, Static<TValue>>> {\n readonly value: TValue;\n}\n\nexport function Record<TValue extends AnySchema>(value: TValue): RecordSchema<TValue> {\n return {\n kind: \"record\",\n value,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, SchemaBase, Static } from \"./index.js\";\n\ntype UnionStatic<TBranches extends readonly ObjectSchema<any>[]> = Static<TBranches[number]>;\n\nexport interface UnionSchema<TBranches extends readonly ObjectSchema<any>[]>\n extends SchemaBase<\"union\", UnionStatic<TBranches>> {\n readonly branches: TBranches;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction getRequiredKeys(schema: ObjectSchema<any>): string[] {\n return Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n}\n\nexport function getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n return getRequiredKeys(schema).join(\"+\");\n}\n\nfunction assertUniqueRequiredKeyFingerprints(branches: readonly ObjectSchema<any>[]): void {\n const fingerprints = new Map<string, { display: string; indices: number[] }>();\n\n branches.forEach((branch, index) => {\n const requiredKeys = getRequiredKeys(branch);\n const fingerprint = JSON.stringify(requiredKeys);\n const existing = fingerprints.get(fingerprint);\n\n if (existing === undefined) {\n fingerprints.set(fingerprint, {\n display: requiredKeys.join(\"+\"),\n indices: [index],\n });\n return;\n }\n\n existing.indices.push(index);\n });\n\n for (const { display, indices } of fingerprints.values()) {\n if (indices.length > 1) {\n throw new Error(\n `Union branches [${indices.join(\", \")}] share required-key fingerprint \"${display}\". Each branch must require a distinct set of keys.`\n );\n }\n }\n}\n\nfunction assertValidBranches(branches: readonly ObjectSchema<any>[]): void {\n if (branches.length === 0) {\n throw new Error(\"Union schema requires at least one branch\");\n }\n\n assertUniqueRequiredKeyFingerprints(branches);\n}\n\nexport function Union<const TBranches extends readonly ObjectSchema<any>[]>(\n branches: TBranches\n): UnionSchema<TBranches> {\n assertValidBranches(branches);\n\n return {\n kind: \"union\",\n branches,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, Static } from \"./index.js\";\nimport { getRequiredKeyFingerprint } from \"./union.js\";\n\nexport type SchemaDescriptor = AnySchema;\n\nexport type ValidationIssue = {\n path: readonly string[];\n expected: string;\n received: string;\n message: string;\n};\n\nexport type ValidationResult<T> =\n | { ok: true; value: T }\n | { ok: false; issues: readonly ValidationIssue[] };\n\ntype ValidationState = {\n issues: ValidationIssue[];\n};\n\ntype WalkResult = { present: true; value: unknown } | { present: false };\n\nconst missingValue = Symbol(\"missingValue\");\n\nexport function validate<S extends SchemaDescriptor>(\n schema: S,\n value: unknown\n): ValidationResult<Static<S>> {\n const state: ValidationState = { issues: [] };\n const result = walkSchema(schema, value, [], state);\n\n if (state.issues.length > 0) {\n return { ok: false, issues: state.issues };\n }\n\n return { ok: true, value: (result.present ? result.value : undefined) as Static<S> };\n}\n\nfunction walkSchema(\n schema: AnySchema,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (schema.kind === \"optional\") {\n return walkOptional(schema, value, path, state);\n }\n\n if (value === missingValue) {\n addIssue(\n state,\n path,\n expectedFor(schema),\n \"missing\",\n `Expected ${expectedFor(schema)} at ${formatPath(path)}`\n );\n return { present: false };\n }\n\n if (value === null && schema.nullable === true) {\n return { present: true, value };\n }\n\n switch (schema.kind) {\n case \"string\":\n return walkString(schema, value, path, state);\n\n case \"number\":\n return walkNumber(schema, value, path, state);\n\n case \"boolean\":\n return walkBoolean(value, path, state);\n\n case \"enum\":\n return walkEnum(schema, value, path, state);\n\n case \"array\":\n return walkArray(schema, value, path, state);\n\n case \"object\":\n return walkObject(schema, value, path, state);\n\n case \"oneOf\":\n return walkOneOf(schema, value, path, state);\n\n case \"union\":\n return walkUnion(schema, value, path, state);\n\n case \"record\":\n return walkRecord(schema, value, path, state);\n\n case \"json\":\n return walkJson(value, path, state);\n }\n}\n\nfunction walkOptional(\n schema: OptionalSchema<AnySchema>,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (value === missingValue || value === undefined) {\n const defaultValue = getDefault(schema.inner);\n\n if (defaultValue.present) {\n return walkSchema(schema.inner, cloneDefault(defaultValue.value), path, state);\n }\n\n return { present: false };\n }\n\n return walkSchema(schema.inner, value, path, state);\n}\n\nfunction walkString(\n schema: Extract<AnySchema, { kind: \"string\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"string\") {\n addExpectedIssue(state, path, \"string\", value);\n return { present: true, value };\n }\n\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n const expected = `string with length at least ${schema.minLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n const expected = `string with length at most ${schema.maxLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.pattern !== undefined) {\n const pattern = compilePattern(schema.pattern);\n\n if (pattern === undefined || !pattern.test(value)) {\n const expected = `string matching pattern ${schema.pattern}`;\n addIssue(state, path, expected, value, `Expected ${expected} at ${formatPath(path)}`);\n }\n }\n\n return { present: true, value };\n}\n\nfunction walkNumber(\n schema: Extract<AnySchema, { kind: \"number\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n addExpectedIssue(state, path, schema.jsonType === \"integer\" ? \"integer\" : \"number\", value);\n return { present: true, value };\n }\n\n if (schema.jsonType === \"integer\" && !Number.isInteger(value)) {\n addExpectedIssue(state, path, \"integer\", value);\n }\n\n if (schema.minimum !== undefined && value < schema.minimum) {\n const expected = `number greater than or equal to ${schema.minimum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n const expected = `number less than or equal to ${schema.maximum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n return { present: true, value };\n}\n\nfunction walkBoolean(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (typeof value !== \"boolean\") {\n addExpectedIssue(state, path, \"boolean\", value);\n }\n\n return { present: true, value };\n}\n\nfunction walkEnum(\n schema: Extract<AnySchema, { kind: \"enum\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!schema.values.includes(value as never)) {\n const expected = `one of ${schema.values.join(\", \")}`;\n addIssue(\n state,\n path,\n expected,\n receivedValue(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n return { present: true, value };\n}\n\nfunction walkArray(\n schema: Extract<AnySchema, { kind: \"array\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!Array.isArray(value)) {\n addExpectedIssue(state, path, \"array\", value);\n return { present: true, value };\n }\n\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n const expected = `array with at least ${schema.minItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n const expected = `array with at most ${schema.maxItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n const nextValue = value.map((item, index) => {\n const result = walkSchema(schema.item, item, [...path, String(index)], state);\n\n return result.present ? result.value : item;\n });\n\n return { present: true, value: nextValue };\n}\n\nfunction walkObject(\n schema: ObjectSchema<any>,\n value: unknown,\n path: readonly string[],\n state: ValidationState,\n injectedProperties: Record<string, unknown> = {}\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n const allowedKeys = new Set([...Object.keys(schema.shape), ...Object.keys(injectedProperties)]);\n\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const propertyValue = Object.hasOwn(value, key) ? value[key] : missingValue;\n const result = walkSchema(propertySchema, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n for (const [key, injectedValue] of Object.entries(injectedProperties)) {\n if (Object.hasOwn(value, key)) {\n setOwnValue(nextValue, key, value[key]);\n } else {\n setOwnValue(nextValue, key, injectedValue);\n }\n }\n\n for (const [key, propertyValue] of Object.entries(value)) {\n if (allowedKeys.has(key)) {\n continue;\n }\n\n if (schema.additionalProperties === true) {\n setOwnValue(nextValue, key, propertyValue);\n } else {\n addUnexpectedPropertyIssue(state, [...path, key]);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkOneOf(\n schema: Extract<AnySchema, { kind: \"oneOf\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const discriminatorValue = value[schema.discriminator];\n const discriminatorPath = [...path, schema.discriminator];\n const branchValues = Object.keys(schema.branches);\n const expected = `one of ${branchValues.join(\", \")}`;\n\n if (!Object.hasOwn(value, schema.discriminator)) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n \"missing\",\n `Missing discriminator \"${schema.discriminator}\" at ${formatPath(path)}. Expected one of: ${branchValues.join(\", \")}.`\n );\n return { present: true, value };\n }\n\n if (\n typeof discriminatorValue !== \"string\" ||\n !Object.hasOwn(schema.branches, discriminatorValue)\n ) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n receivedValue(discriminatorValue),\n `Expected ${expected} at ${formatPath(discriminatorPath)}, got ${formatReceivedDiscriminator(discriminatorValue)}`\n );\n return { present: true, value };\n }\n\n return walkObject(schema.branches[discriminatorValue], value, path, state, {\n [schema.discriminator]: discriminatorValue\n });\n}\n\nfunction walkUnion(\n schema: Extract<AnySchema, { kind: \"union\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (isPlainRecord(value)) {\n const candidateBranches = schema.branches.filter((branch) => hasRequiredKeys(branch, value));\n\n if (candidateBranches.length === 1) {\n return walkObject(candidateBranches[0], value, path, state);\n }\n }\n\n const matches: Array<{ fingerprint: string; value: unknown }> = [];\n\n for (const branch of schema.branches) {\n const branchState: ValidationState = { issues: [] };\n const result = walkObject(branch, value, path, branchState);\n\n if (branchState.issues.length === 0 && result.present) {\n matches.push({ fingerprint: getRequiredKeyFingerprint(branch), value: result.value });\n }\n }\n\n if (matches.length === 1) {\n return { present: true, value: matches[0].value };\n }\n\n if (matches.length === 0) {\n const branchDescriptions = schema.branches.map((branch) => getRequiredKeyFingerprint(branch));\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n \"0 matching branches\",\n `No union branch matched at ${formatPath(path)}. Tried ${schema.branches.length} branches. Expected one of: ${branchDescriptions.join(\" | \")}.`\n );\n return { present: true, value };\n }\n\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n `${matches.length} matching branches`,\n `Expected exactly one union branch at ${formatPath(path)}, but matched more than one branch: ${matches.map((match) => match.fingerprint).join(\" | \")}`\n );\n return { present: true, value };\n}\n\nfunction hasRequiredKeys(schema: ObjectSchema<any>, value: Record<string, unknown>): boolean {\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n if (propertySchema.kind !== \"optional\" && !Object.hasOwn(value, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction walkRecord(\n schema: Extract<AnySchema, { kind: \"record\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n\n for (const [key, propertyValue] of Object.entries(value)) {\n const result = walkSchema(schema.value, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkJson(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (isJsonValue(value)) {\n return { present: true, value };\n }\n\n addExpectedIssue(state, path, \"JSON value\", value);\n return { present: true, value };\n}\n\nfunction getDefault(schema: AnySchema): WalkResult {\n if (schema.default !== undefined) {\n return { present: true, value: schema.default };\n }\n\n if (schema.kind === \"optional\") {\n return getDefault(schema.inner);\n }\n\n return { present: false };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, ancestors: Set<object> = new Set()): boolean {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return typeof value !== \"number\" || Number.isFinite(value);\n }\n\n if (Array.isArray(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = value.every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n if (isPlainRecord(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n return false;\n}\n\nfunction cloneDefault(value: unknown): unknown {\n return structuredClone(value);\n}\n\nfunction setOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nfunction expectedFor(schema: AnySchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n case \"number\":\n return schema.jsonType === \"integer\" ? \"integer\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"enum\":\n return `one of ${schema.values.join(\", \")}`;\n case \"array\":\n return \"array\";\n case \"object\":\n case \"oneOf\":\n case \"record\":\n return \"object\";\n case \"union\":\n return \"exactly one union branch\";\n case \"json\":\n return \"JSON value\";\n case \"optional\":\n return expectedFor(schema.inner);\n }\n}\n\nfunction addExpectedIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n value: unknown\n): void {\n addIssue(\n state,\n path,\n expected,\n receivedType(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n}\n\nfunction addUnexpectedPropertyIssue(state: ValidationState, path: readonly string[]): void {\n addIssue(\n state,\n path,\n \"no additional properties\",\n \"unknown property\",\n `Unexpected property ${formatPath(path)}`\n );\n}\n\nfunction addIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n _message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message: formatIssueMessage(expected, path, received)\n });\n}\n\nfunction addIssueWithMessage(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message\n });\n}\n\nfunction formatIssueMessage(expected: string, path: readonly string[], received: string): string {\n return `Expected ${expected} at ${formatPath(path)}, got ${received}`;\n}\n\nfunction formatPath(path: readonly string[]): string {\n return path.length === 0 ? \"value\" : path.join(\".\");\n}\n\nfunction compilePattern(pattern: string): RegExp | undefined {\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction receivedType(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return \"integer\";\n }\n\n return typeof value;\n}\n\nfunction receivedValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return String(value);\n}\n\nfunction formatReceivedDiscriminator(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n return receivedValue(value);\n}\n", "import { Json } from \"./json.js\";\nimport { createJsonSchemaDocument } from \"./json-schema-document.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport { validate } from \"./validate.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.js\";\nimport type { ValidationIssue, ValidationResult } from \"./validate.js\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\"\n | \"oneOf\"\n | \"union\"\n | \"record\"\n | \"json\";\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 EmptyOptions = Record<never, never>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\nexport type CliOutputMode = \"rich\" | \"md\" | \"json\";\nexport interface CliMissingParameterChoice<TValue> {\n label: string;\n value: TValue;\n}\nexport interface CliMissingParameterContext {\n commandPath: string;\n params: Readonly<Record<string, unknown>>;\n output: CliOutputMode;\n stdinTTY: boolean;\n stdoutTTY: boolean;\n}\nexport interface CliMissingParameterResolution<TValue> {\n choices: readonly CliMissingParameterChoice<TValue>[];\n message?: string;\n}\nexport interface CliSchemaOptions<TValue> {\n resolveMissing?: (\n context: CliMissingParameterContext\n ) =>\n | CliMissingParameterResolution<TValue>\n | undefined\n | Promise<CliMissingParameterResolution<TValue> | undefined>;\n}\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n secret?: boolean;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n secret?: boolean;\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> =\n TSchema extends OptionalSchema<infer TInner> ? Static<TInner> : 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 cli?: CliSchemaOptions<TDefault>;\n description?: string;\n cliDescription?: string;\n cliAliases?: readonly string[];\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n global?: boolean;\n};\n\ntype WithNullable<\n TSchema extends AnySchema,\n TOptions extends { nullable?: boolean }\n> = TOptions extends { readonly nullable: true } ? TSchema & { readonly nullable: true } : TSchema;\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly cli?: CliSchemaOptions<TStatic>;\n readonly description?: string;\n readonly cliDescription?: string;\n readonly cliAliases?: readonly 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 global?: boolean;\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | JsonSchema;\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 oneOf?: JsonSchema[];\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>> extends SchemaBase<\n \"enum\",\n TValues[number]\n> {\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> extends SchemaBase<\n \"optional\",\n Static<TInner> | undefined\n> {\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 | OneOfSchema<Record<string, ObjectSchema<any>>, string>\n | UnionSchema<readonly ObjectSchema<any>[]>\n | RecordSchema<AnySchema>\n | JsonValueSchema;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends { readonly nullable: true }\n ? TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic | null\n : never\n : 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 jsonSchema.additionalProperties = schema.additionalProperties ?? false;\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 if (values.some((value) => typeof value === \"number\" && !Number.isFinite(value))) {\n throw new Error(\"Enum schema numeric values must be finite\");\n }\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n}\n\nfunction assertFiniteNumber(value: number | undefined, name: string): void {\n if (value !== undefined && !Number.isFinite(value)) {\n throw new Error(`${name} must be finite`);\n }\n}\n\nfunction assertMinMaxOrder(\n minimum: number | undefined,\n maximum: number | undefined,\n minimumName: string,\n maximumName: string\n): void {\n if (minimum !== undefined && maximum !== undefined && minimum > maximum) {\n throw new Error(`${minimumName} must be less than or equal to ${maximumName}`);\n }\n}\n\nfunction assertValidDefault(schema: AnySchema): void {\n if (schema.default === undefined) {\n return;\n }\n\n const result = validate(schema, schema.default);\n if (!result.ok) {\n throw new Error(\n `default must satisfy schema: ${result.issues[0]?.message ?? \"invalid default\"}`\n );\n }\n}\n\nfunction assertPattern(pattern: string | undefined): void {\n if (pattern === undefined) {\n return;\n }\n try {\n new RegExp(pattern);\n } catch {\n throw new Error(\"pattern must be a valid regular expression\");\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\nfunction withInjectedDiscriminator(\n schema: ObjectSchema<any>,\n discriminator: string,\n branchName: string\n): JsonSchema {\n const branchJsonSchema = toJsonSchema(schema);\n const properties = {\n ...(branchJsonSchema.properties ?? {}),\n [discriminator]: {\n type: \"string\",\n enum: [branchName]\n } satisfies JsonSchema\n };\n const required = [...new Set([...(branchJsonSchema.required ?? []), discriminator])];\n\n return {\n ...branchJsonSchema,\n type: \"object\",\n properties,\n required\n };\n}\n\nexport const S = {\n String<const TOptions extends SchemaOptions<string> & StringMetadata = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<StringSchema, TOptions> {\n assertNonNegativeInteger(options.minLength, \"minLength\");\n assertNonNegativeInteger(options.maxLength, \"maxLength\");\n assertMinMaxOrder(options.minLength, options.maxLength, \"minLength\", \"maxLength\");\n assertPattern(options.pattern);\n const schema: StringSchema = {\n kind: \"string\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<StringSchema, TOptions>;\n },\n\n Number<\n const TOptions extends SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } =\n EmptyOptions\n >(options: TOptions = {} as TOptions): WithNullable<NumberSchema, TOptions> {\n assertFiniteNumber(options.minimum, \"minimum\");\n assertFiniteNumber(options.maximum, \"maximum\");\n assertMinMaxOrder(options.minimum, options.maximum, \"minimum\", \"maximum\");\n assertFiniteNumber(options.default, \"default\");\n if (\n options.jsonType === \"integer\" &&\n options.default !== undefined &&\n !Number.isInteger(options.default)\n ) {\n throw new Error(\"default must be an integer\");\n }\n const schema: NumberSchema = {\n kind: \"number\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<NumberSchema, TOptions>;\n },\n\n Boolean<const TOptions extends SchemaOptions<boolean> = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<BooleanSchema, TOptions> {\n const schema: BooleanSchema = {\n kind: \"boolean\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<BooleanSchema, TOptions>;\n },\n\n Enum<\n const TValues extends NonEmptyReadonlyArray<EnumValue>,\n const TOptions extends 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 } = EmptyOptions\n >(\n values: TValues,\n options: TOptions = {} as TOptions\n ): WithNullable<EnumSchema<TValues>, TOptions> {\n assertValidEnumValues(values);\n if (\n options.jsonType === \"integer\" &&\n values.some((value) => typeof value !== \"number\" || !Number.isInteger(value))\n ) {\n throw new Error(\"Integer enum values must be integers\");\n }\n\n const schema: EnumSchema<TValues> = {\n kind: \"enum\",\n values,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<EnumSchema<TValues>, TOptions>;\n },\n\n Array<\n TItem extends AnySchema,\n const TOptions extends SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = EmptyOptions\n >(item: TItem, options: TOptions = {} as TOptions): WithNullable<ArraySchema<TItem>, TOptions> {\n assertNonNegativeInteger(options.minItems, \"minItems\");\n assertNonNegativeInteger(options.maxItems, \"maxItems\");\n assertMinMaxOrder(options.minItems, options.maxItems, \"minItems\", \"maxItems\");\n const schema: ArraySchema<TItem> = {\n kind: \"array\",\n item,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ArraySchema<TItem>, TOptions>;\n },\n\n Object<\n const TShape extends ObjectShape,\n const TOptions extends SchemaOptions<InferObject<TShape>> & ObjectMetadata = EmptyOptions\n >(\n shape: TShape,\n options: TOptions = {} as TOptions\n ): WithNullable<ObjectSchema<TShape>, TOptions> {\n const schema: ObjectSchema<TShape> = {\n kind: \"object\",\n shape,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ObjectSchema<TShape>, TOptions>;\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner\n };\n },\n\n OneOf,\n\n Union,\n\n Record: RecordBuilder,\n\n Json\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 Object.defineProperty(properties, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: toJsonSchema(propertySchema)\n });\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 case \"oneOf\":\n return withMetadata(unwrappedSchema, {\n oneOf: Object.entries(unwrappedSchema.branches).map(([branchName, branchSchema]) =>\n withInjectedDiscriminator(branchSchema, unwrappedSchema.discriminator, branchName)\n )\n });\n\n case \"union\":\n return withMetadata(unwrappedSchema, {\n oneOf: unwrappedSchema.branches.map((branchSchema) => toJsonSchema(branchSchema))\n });\n\n case \"record\":\n return withMetadata(unwrappedSchema, {\n type: \"object\",\n additionalProperties: toJsonSchema(unwrappedSchema.value)\n });\n\n case \"json\":\n return withMetadata(unwrappedSchema, {});\n }\n}\n\nexport function toJsonSchemaDocument(\n schema: AnySchema,\n options: JsonSchemaDocumentOptions = {}\n): JsonSchemaDocument {\n return createJsonSchemaDocument(toJsonSchema(schema), options);\n}\n\nexport { Json, OneOf, RecordBuilder as Record, Union, validate };\nexport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nexport type {\n JsonValue,\n JsonValueSchema,\n OneOfSchema,\n RecordSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n};\n", "export interface ColorSupportEnv {\n NO_COLOR?: string;\n FORCE_COLOR?: string;\n TERM?: string;\n}\n\nexport interface ColorSupportStream {\n isTTY?: boolean;\n}\n\nexport function supportsColor(\n env: ColorSupportEnv = process.env as ColorSupportEnv,\n stream: ColorSupportStream = process.stdout\n): boolean {\n if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") {\n return true;\n }\n\n if (env.NO_COLOR !== undefined) {\n return false;\n }\n\n if (stream.isTTY !== true) {\n return false;\n }\n\n return typeof env.TERM === \"string\" && env.TERM.length > 0 && env.TERM !== \"dumb\";\n}\n", "import { supportsColor } from \"../internal/color-support.js\";\n\ntype AnsiStyleName =\n | \"reset\"\n | \"bold\"\n | \"dim\"\n | \"italic\"\n | \"underline\"\n | \"inverse\"\n | \"strikethrough\"\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"gray\"\n | \"magentaBright\"\n | \"cyanBright\"\n | \"bgRed\"\n | \"bgGreen\"\n | \"bgYellow\"\n | \"bgBlue\"\n | \"bgMagenta\";\n\ninterface AnsiPair {\n open: string;\n}\n\nexport interface Color {\n (text: string): string;\n reset: Color;\n bold: Color;\n dim: Color;\n italic: Color;\n underline: Color;\n inverse: Color;\n strikethrough: Color;\n black: Color;\n red: Color;\n green: Color;\n yellow: Color;\n blue: Color;\n magenta: Color;\n cyan: Color;\n white: Color;\n gray: Color;\n magentaBright: Color;\n cyanBright: Color;\n bgRed: Color;\n bgGreen: Color;\n bgYellow: Color;\n bgBlue: Color;\n bgMagenta: Color;\n hex: (value: string) => Color;\n rgb: (red: number, green: number, blue: number) => Color;\n bgHex: (value: string) => Color;\n bgRgb: (red: number, green: number, blue: number) => Color;\n}\n\nconst reset = \"\\x1b[0m\";\n\nconst ansiStyles: Record<AnsiStyleName, AnsiPair> = {\n reset: { open: reset },\n bold: { open: \"\\x1b[1m\" },\n dim: { open: \"\\x1b[2m\" },\n italic: { open: \"\\x1b[3m\" },\n underline: { open: \"\\x1b[4m\" },\n inverse: { open: \"\\x1b[7m\" },\n strikethrough: { open: \"\\x1b[9m\" },\n black: { open: \"\\x1b[30m\" },\n red: { open: \"\\x1b[31m\" },\n green: { open: \"\\x1b[32m\" },\n yellow: { open: \"\\x1b[33m\" },\n blue: { open: \"\\x1b[34m\" },\n magenta: { open: \"\\x1b[35m\" },\n cyan: { open: \"\\x1b[36m\" },\n white: { open: \"\\x1b[37m\" },\n gray: { open: \"\\x1b[90m\" },\n magentaBright: { open: \"\\x1b[95m\" },\n cyanBright: { open: \"\\x1b[96m\" },\n bgRed: { open: \"\\x1b[41m\" },\n bgGreen: { open: \"\\x1b[42m\" },\n bgYellow: { open: \"\\x1b[43m\" },\n bgBlue: { open: \"\\x1b[44m\" },\n bgMagenta: { open: \"\\x1b[45m\" }\n};\n\nconst styleNames = Object.keys(ansiStyles) as AnsiStyleName[];\n\nfunction replaceAll(value: string, search: string, replacement: string): string {\n return value.split(search).join(replacement);\n}\n\nfunction applyStyles(text: string, styles: AnsiPair[]): string {\n if (!supportsColor() || styles.length === 0) {\n return text;\n }\n\n const open = styles.map((style) => style.open).join(\"\");\n const output = text.includes(reset) ? replaceAll(text, reset, `${reset}${open}`) : text;\n\n return `${open}${output}${reset}`;\n}\n\nfunction clampRgb(value: number): number {\n if (Number.isNaN(value)) {\n return 0;\n }\n\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction hexChannel(value: string, offset: number): number {\n return Number.parseInt(value.slice(offset, offset + 2), 16);\n}\n\nfunction normalizeHex(value: string): [number, number, number] {\n const normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\n if ((normalized.length !== 3 && normalized.length !== 6) ||\n Array.from(normalized).some((char) => !\"0123456789abcdefABCDEF\".includes(char))) {\n throw new Error(`Invalid hexadecimal color: ${value}`);\n }\n\n if (normalized.length === 3) {\n const red = normalized[0]!;\n const green = normalized[1]!;\n const blue = normalized[2]!;\n\n return [\n Number.parseInt(`${red}${red}`, 16),\n Number.parseInt(`${green}${green}`, 16),\n Number.parseInt(`${blue}${blue}`, 16)\n ];\n }\n\n return [\n hexChannel(normalized, 0),\n hexChannel(normalized, 2),\n hexChannel(normalized, 4)\n ];\n}\n\nfunction rgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[38;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction bgRgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[48;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction createColor(styles: AnsiPair[] = []): Color {\n const builder = ((text: string) => applyStyles(String(text), styles)) as Color;\n\n for (const name of styleNames) {\n Object.defineProperty(builder, name, {\n configurable: true,\n enumerable: true,\n get: () => createColor([...styles, ansiStyles[name]])\n });\n }\n\n builder.hex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, rgbStyle(red, green, blue)]);\n };\n\n builder.rgb = (red: number, green: number, blue: number) =>\n createColor([...styles, rgbStyle(red, green, blue)]);\n\n builder.bgHex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, bgRgbStyle(red, green, blue)]);\n };\n\n builder.bgRgb = (red: number, green: number, blue: number) =>\n createColor([...styles, bgRgbStyle(red, green, blue)]);\n\n return builder;\n}\n\nexport const color = createColor();\n", "export interface Brand {\n name: string;\n primary: string;\n}\n\nexport const brands: Record<string, Brand> = {\n purple: { name: \"purple\", primary: \"#a200ff\" },\n blue: { name: \"blue\", primary: \"#2f6fed\" },\n green: { name: \"green\", primary: \"#1f9d57\" }\n};\n", "import { brands } from \"../tokens/brand.js\";\n\nexport interface ThemeConfig {\n brand: string;\n label: string;\n}\n\nconst defaults: ThemeConfig = {\n brand: \"purple\",\n label: \"Poe\"\n};\n\nlet config: ThemeConfig = { ...defaults };\nlet revision = 0;\nlet brandConfigured = false;\n\nexport function configureTheme(patch: { brand?: string; label?: string }): void {\n if (patch.brand !== undefined && !Object.hasOwn(brands, patch.brand)) {\n throw new Error(`Unknown brand: ${patch.brand}`);\n }\n\n config = {\n brand: patch.brand ?? config.brand,\n label: patch.label ?? config.label\n };\n if (patch.brand !== undefined) {\n brandConfigured = true;\n }\n revision += 1;\n}\n\nexport function getThemeConfig(): ThemeConfig {\n return { ...config };\n}\n\nexport function getThemeRevision(): number {\n return revision;\n}\n\nexport function isThemeBrandConfigured(): boolean {\n return brandConfigured;\n}\n\nexport function resetTheme(): void {\n config = { ...defaults };\n brandConfigured = false;\n revision += 1;\n}\n", "import { color, type Color } from \"../components/color.js\";\nimport { getThemeConfig } from \"../internal/theme-state.js\";\nimport { brands, type Brand } from \"./brand.js\";\n\nexport const brand = brands.purple!.primary;\n\nexport type ThemeName = \"dark\" | \"light\";\n\nexport interface ThemeCellStyle {\n fg?: string;\n bold?: boolean;\n dim?: boolean;\n underline?: boolean;\n}\n\nexport interface ThemeCellStyles {\n accent: ThemeCellStyle;\n muted: ThemeCellStyle;\n success: ThemeCellStyle;\n warning: ThemeCellStyle;\n error: ThemeCellStyle;\n info: ThemeCellStyle;\n}\n\nexport interface ThemePalette {\n header: (text: string) => string;\n divider: (text: string) => string;\n prompt: (text: string) => string;\n number: (text: string) => string;\n intro: (text: string) => string;\n resolvedSymbol: string;\n errorSymbol: string;\n accent: (text: string) => string;\n muted: (text: string) => string;\n success: (text: string) => string;\n warning: (text: string) => string;\n error: (text: string) => string;\n info: (text: string) => string;\n badge: (text: string) => string;\n styles: ThemeCellStyles;\n}\n\nfunction withStyles(palette: Omit<ThemePalette, \"styles\">, styles: ThemeCellStyles): ThemePalette {\n return Object.defineProperty(palette, \"styles\", {\n value: styles,\n enumerable: false\n }) as ThemePalette;\n}\n\nfunction brandColor(activeBrand: Brand, purple: Color): Color {\n return activeBrand.name === \"purple\" ? purple : color.hex(activeBrand.primary);\n}\n\nfunction brandBackground(activeBrand: Brand, purple: Color): Color {\n return activeBrand.name === \"purple\" ? purple : color.bgHex(activeBrand.primary);\n}\n\nexport function createPalette(activeBrand: Brand, mode: ThemeName): ThemePalette {\n const isPurple = activeBrand.name === \"purple\";\n if (mode === \"light\") {\n const active = color.hex(activeBrand.primary);\n const prompt = isPurple ? color.hex(\"#006699\") : active;\n const number = isPurple ? color.hex(\"#0077cc\") : active;\n return withStyles(\n {\n header: (text: string) => active.bold(text),\n divider: (text: string) => color.hex(\"#666666\")(text),\n prompt: (text: string) => prompt.bold(text),\n number: (text: string) => number.bold(text),\n intro: (text: string) =>\n color.bgHex(activeBrand.primary).white(` ${getThemeConfig().label} - ${text} `),\n get resolvedSymbol() {\n return active(\"\u25C7\");\n },\n get errorSymbol() {\n return color.hex(\"#cc0000\")(\"\u25A0\");\n },\n accent: (text: string) => prompt.bold(text),\n muted: (text: string) => color.hex(\"#666666\")(text),\n success: (text: string) => color.hex(\"#008800\")(text),\n warning: (text: string) => color.hex(\"#cc6600\")(text),\n error: (text: string) => color.hex(\"#cc0000\")(text),\n info: (text: string) => active(text),\n badge: (text: string) => color.bgHex(\"#cc6600\").white(` ${text} `)\n },\n {\n accent: { fg: isPurple ? \"#006699\" : activeBrand.primary, bold: true },\n muted: { fg: \"#666666\" },\n success: { fg: \"#008800\" },\n warning: { fg: \"#cc6600\" },\n error: { fg: \"#cc0000\" },\n info: { fg: activeBrand.primary }\n }\n );\n }\n\n const active = brandColor(activeBrand, color.magenta);\n const activeBright = brandColor(activeBrand, color.magentaBright);\n const activeBackground = brandBackground(activeBrand, color.bgMagenta);\n const prompt = isPurple ? color.cyan : active;\n const number = isPurple ? color.cyanBright : active;\n return withStyles(\n {\n header: (text: string) => activeBright.bold(text),\n divider: (text: string) => color.dim(text),\n prompt: (text: string) => prompt(text),\n number: (text: string) => number(text),\n intro: (text: string) => activeBackground.white(` ${getThemeConfig().label} - ${text} `),\n get resolvedSymbol() {\n return active(\"\u25C7\");\n },\n get errorSymbol() {\n return color.red(\"\u25A0\");\n },\n accent: (text: string) => prompt(text),\n muted: (text: string) => color.dim(text),\n success: (text: string) => color.green(text),\n warning: (text: string) => color.yellow(text),\n error: (text: string) => color.red(text),\n info: (text: string) => active(text),\n badge: (text: string) => color.bgYellow.black(` ${text} `)\n },\n {\n accent: { fg: isPurple ? \"cyan\" : activeBrand.primary, bold: true },\n muted: { dim: true },\n success: { fg: \"green\" },\n warning: { fg: \"yellow\" },\n error: { fg: \"red\" },\n info: { fg: isPurple ? \"magenta\" : activeBrand.primary }\n }\n );\n}\n\nexport const dark = createPalette(brands.purple!, \"dark\");\nexport const light = createPalette(brands.purple!, \"light\");\n", "import { color } from \"../components/color.js\";\n\nexport const typography = {\n bold: (text: string) => color.bold(text),\n dim: (text: string) => color.dim(text),\n italic: (text: string) => color.italic(text),\n underline: (text: string) => color.underline(text),\n strikethrough: (text: string) => color.strikethrough(text)\n} as const;\n", "export const widths = {\n header: 60,\n helpColumn: 24,\n maxLine: 80\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 { getThemeConfig, getThemeRevision, isThemeBrandConfigured } from \"./theme-state.js\";\nimport { brands } from \"../tokens/brand.js\";\nimport { createPalette, dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n POE_BRAND?: 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\nconst themeCache = new Map<string, ThemePalette>();\nlet cachedRevision = -1;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n const themeName = resolveThemeName(env);\n const config = getThemeConfig();\n const requestedBrand = env?.POE_BRAND?.toLowerCase();\n const activeBrandName =\n !isThemeBrandConfigured() && requestedBrand && Object.hasOwn(brands, requestedBrand)\n ? requestedBrand\n : config.brand;\n const revision = getThemeRevision();\n if (revision !== cachedRevision) {\n themeCache.clear();\n cachedRevision = revision;\n }\n const cacheKey = `${activeBrandName}:${themeName}`;\n const cachedTheme = themeCache.get(cacheKey);\n if (cachedTheme) {\n return cachedTheme;\n }\n const activeBrand = brands[activeBrandName]!;\n const theme =\n activeBrandName === \"purple\"\n ? themeName === \"light\"\n ? light\n : dark\n : createPalette(activeBrand, themeName);\n themeCache.set(cacheKey, theme);\n return theme;\n}\n\nexport function resetThemeCache(): void {\n themeCache.clear();\n cachedRevision = getThemeRevision();\n}\n", "import { color } from \"./color.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nfunction renderMarkdownInline(content: string): string {\n return content.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction renderMarkdownCode(content: string): string {\n const value = renderMarkdownInline(content);\n let longestRun = 0;\n let currentRun = 0;\n for (const char of value) {\n if (char === \"`\") {\n currentRun += 1;\n longestRun = Math.max(longestRun, currentRun);\n continue;\n }\n currentRun = 0;\n }\n const delimiter = \"`\".repeat(longestRun + 1);\n const paddedValue = value.startsWith(\"`\") || value.endsWith(\"`\") ? ` ${value} ` : value;\n return `${delimiter}${paddedValue}${delimiter}`;\n}\n\nfunction renderMarkdownLink(content: string): string {\n const value = renderMarkdownInline(content);\n const label = value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"[\", \"\\\\[\").replaceAll(\"]\", \"\\\\]\");\n const url = value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"(\", \"\\\\(\").replaceAll(\")\", \"\\\\)\");\n return `[${label}](${url})`;\n}\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 sectionHeader(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return typography.bold(content.toUpperCase());\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return renderMarkdownCode(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 renderMarkdownCode(content);\n return color.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return renderMarkdownCode(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 renderMarkdownCode(content);\n return color.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return renderMarkdownLink(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 error(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().error(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 { color } from \"./color.js\";\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 color.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 color.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", "export function stripAnsi(value: string): string {\n let output = \"\";\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n\n if (char === \"\\u001b\") {\n index = skipEscapeSequence(value, index);\n continue;\n }\n\n if (char === \"\\u009b\") {\n index = skipCsiSequence(value, index + 1);\n continue;\n }\n\n output += char;\n index += char.length;\n }\n\n return output;\n}\n\nfunction skipEscapeSequence(value: string, index: number): number {\n const next = value[index + 1];\n\n if (next === \"[\") {\n return skipCsiSequence(value, index + 2);\n }\n\n if (next === \"]\") {\n return skipOscSequence(value, index + 2);\n }\n\n return Math.min(value.length, index + 2);\n}\n\nfunction skipCsiSequence(value: string, index: number): number {\n while (index < value.length) {\n const codePoint = value.charCodeAt(index);\n index += 1;\n\n if (codePoint >= 0x40 && codePoint <= 0x7e) {\n break;\n }\n }\n\n return index;\n}\n\nfunction skipOscSequence(value: string, index: number): number {\n while (index < value.length) {\n if (value[index] === \"\\u0007\") {\n return index + 1;\n }\n\n if (value[index] === \"\\u001b\" && value[index + 1] === \"\\\\\") {\n return index + 2;\n }\n\n index += 1;\n }\n\n return index;\n}\n", "import { color } from \"../../components/color.js\";\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 renderMarkdownInline(value: string): string {\n return stripAnsi(value).replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = color.gray(\"\u2502\"),\n secondarySymbol = color.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(`- ${renderMarkdownInline(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:** ${renderMarkdownInline(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:** ${renderMarkdownInline(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:** ${renderMarkdownInline(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: color.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${renderMarkdownInline(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: color.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "import { color } from \"./color.js\";\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 ?? color.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import { text } from \"./text.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 interface FormatColumnsOptions {\n rows: Array<{ left: string; right: string }>;\n totalWidth?: number;\n minLeftWidth?: number;\n maxLeftWidth?: number;\n gap?: number;\n indent?: number;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction normalizeInline(value: string): string {\n return value.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction readControlSequence(value: string, index: number): number | undefined {\n if (value[index] !== \"\\u001b\") {\n return undefined;\n }\n\n if (value[index + 1] === \"[\") {\n let nextIndex = index + 2;\n while (nextIndex < value.length) {\n const code = value.charCodeAt(nextIndex);\n nextIndex += 1;\n if (code >= 0x40 && code <= 0x7e) {\n return nextIndex;\n }\n }\n return value.length;\n }\n\n if (value[index + 1] === \"]\") {\n let nextIndex = index + 2;\n while (nextIndex < value.length) {\n if (value[nextIndex] === \"\\u0007\") {\n return nextIndex + 1;\n }\n if (value[nextIndex] === \"\\u001b\" && value[nextIndex + 1] === \"\\\\\") {\n return nextIndex + 2;\n }\n nextIndex += 1;\n }\n return value.length;\n }\n\n return index + 1;\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n if (codePoints.some((codePoint) => codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f))) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => {\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return width;\n }\n return width + (isWideCodePoint(codePoint) ? 2 : 1);\n }, 0);\n}\n\nfunction visibleWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n const nextIndex = readControlSequence(value, index);\n if (nextIndex !== undefined) {\n index = nextIndex;\n continue;\n }\n\n const segment = graphemeSegmenter.segment(value.slice(index))[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n const cluster = segment?.segment ?? \"\";\n width += clusterWidth(cluster);\n index += cluster.length || 1;\n }\n\n return width;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction padEndVisible(value: string, width: number): string {\n return value + \" \".repeat(Math.max(0, width - visibleWidth(value)));\n}\n\nfunction isWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\t\" || char === \"\\r\";\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let word = \"\";\n\n for (const char of value) {\n if (isWhitespace(char)) {\n if (word) {\n words.push(word);\n word = \"\";\n }\n continue;\n }\n word += char;\n }\n\n if (word) {\n words.push(word);\n }\n\n return words;\n}\n\nfunction wrapWords(value: string, width: number): string[] {\n const words = splitWords(value);\n if (words.length === 0) {\n return [\"\"];\n }\n\n const lines: string[] = [];\n let line = \"\";\n\n for (const word of words) {\n if (!line) {\n line = word;\n continue;\n }\n\n if (visibleWidth(line) + 1 + visibleWidth(word) <= width) {\n line += ` ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n\n lines.push(line);\n return lines;\n}\n\nfunction validateLayoutValue(value: number, name: keyof Omit<FormatColumnsOptions, \"rows\">): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite non-negative number.`);\n }\n}\n\nexport function formatColumns(opts: FormatColumnsOptions): string {\n const rows = opts.rows.map((row) => ({\n left: normalizeInline(row.left),\n right: row.right\n }));\n if (rows.length === 0) {\n return \"\";\n }\n\n const totalWidth = opts.totalWidth ?? process.stdout.columns ?? 100;\n const minLeftWidth = opts.minLeftWidth ?? 12;\n const maxLeftWidth = opts.maxLeftWidth ?? 32;\n const gap = opts.gap ?? 3;\n const indent = opts.indent ?? 2;\n validateLayoutValue(totalWidth, \"totalWidth\");\n validateLayoutValue(minLeftWidth, \"minLeftWidth\");\n validateLayoutValue(maxLeftWidth, \"maxLeftWidth\");\n validateLayoutValue(gap, \"gap\");\n validateLayoutValue(indent, \"indent\");\n const maxLeftContentWidth = Math.max(...rows.map((row) => visibleWidth(row.left)));\n const leftWidth = clamp(maxLeftContentWidth + gap, minLeftWidth, maxLeftWidth);\n const rightWidth = Math.max(20, totalWidth - leftWidth - indent);\n const firstIndent = \" \".repeat(indent);\n const continuationIndent = \" \".repeat(indent + leftWidth);\n\n return rows\n .flatMap((row) => {\n if (row.right.length === 0) {\n return [`${firstIndent}${row.left}`];\n }\n\n const rightLines = wrapWords(row.right, rightWidth);\n if (visibleWidth(row.left) >= leftWidth) {\n return [\n `${firstIndent}${row.left}`,\n ...rightLines.map((line) => `${continuationIndent}${line}`)\n ];\n }\n const firstLine = `${firstIndent}${padEndVisible(row.left, leftWidth)}${rightLines[0]}`;\n const continuationLines = rightLines\n .slice(1)\n .map((line) => `${continuationIndent}${line}`);\n return [firstLine, ...continuationLines];\n })\n .join(\"\\n\");\n}\n\nexport function formatCommand(name: string, description: string): string {\n return formatColumns({\n rows: [{ left: text.command(name), right: description }]\n });\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 return formatColumns({\n rows: [{ left: text.option(flags), right: description }]\n });\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return formatColumns({\n rows: commands.map((cmd) => ({\n left: text.command(cmd.name),\n right: cmd.description\n }))\n });\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return formatColumns({\n rows: options.map((opt) => ({\n left: text.option(opt.flags),\n right: opt.description\n }))\n });\n}\n\nexport const helpFormatter = {\n formatColumns,\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList\n} as const;\n", "import type {\n CommandInfo,\n FormatColumnsOptions,\n OptionInfo\n} from \"./help-formatter.js\";\n\nexport function stripAnsi(value: string): string {\n let output = \"\";\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] === \"\\u001b\") {\n if (value[index + 1] === \"[\") {\n index += 2;\n while (index < value.length) {\n const code = value.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n break;\n }\n index += 1;\n }\n }\n continue;\n }\n\n output += value[index];\n }\n return output;\n}\n\nfunction toAscii(value: string): string {\n let output = \"\";\n const stripped = stripAnsi(value);\n for (let index = 0; index < stripped.length; index += 1) {\n const code = stripped.charCodeAt(index);\n output += code <= 0x7f ? stripped[index] : \"?\";\n }\n return output;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction padEndVisible(value: string, width: number): string {\n return value + \" \".repeat(Math.max(0, width - value.length));\n}\n\nfunction isWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\t\" || char === \"\\r\";\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let word = \"\";\n\n for (const char of value) {\n if (isWhitespace(char)) {\n if (word) {\n words.push(word);\n word = \"\";\n }\n continue;\n }\n word += char;\n }\n\n if (word) {\n words.push(word);\n }\n\n return words;\n}\n\nfunction wrapWords(value: string, width: number): string[] {\n const words = splitWords(value);\n if (words.length === 0) {\n return [\"\"];\n }\n\n const lines: string[] = [];\n let line = \"\";\n\n for (const word of words) {\n if (!line) {\n line = word;\n continue;\n }\n\n if (line.length + 1 + word.length <= width) {\n line += ` ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n\n lines.push(line);\n return lines;\n}\n\nexport function formatColumns(opts: FormatColumnsOptions): string {\n const rows = opts.rows.map((row) => ({\n left: toAscii(row.left),\n right: toAscii(row.right)\n }));\n\n if (rows.length === 0) {\n return \"\";\n }\n\n const totalWidth = opts.totalWidth ?? process.stdout.columns ?? 100;\n const minLeftWidth = opts.minLeftWidth ?? 12;\n const maxLeftWidth = opts.maxLeftWidth ?? 32;\n const gap = opts.gap ?? 3;\n const indent = opts.indent ?? 2;\n const maxLeftContentWidth = Math.max(...rows.map((row) => row.left.length));\n const leftWidth = clamp(maxLeftContentWidth + gap, minLeftWidth, maxLeftWidth);\n const rightWidth = Math.max(20, totalWidth - leftWidth - indent);\n const firstIndent = \" \".repeat(indent);\n const continuationIndent = \" \".repeat(indent + leftWidth);\n\n return rows\n .flatMap((row) => {\n if (row.right.length === 0) {\n return [`${firstIndent}${row.left}`];\n }\n\n const rightLines = wrapWords(row.right, rightWidth);\n if (row.left.length >= leftWidth) {\n return [\n `${firstIndent}${row.left}`,\n ...rightLines.map((line) => `${continuationIndent}${line}`)\n ];\n }\n const firstLine = `${firstIndent}${padEndVisible(row.left, leftWidth)}${rightLines[0]}`;\n const continuationLines = rightLines\n .slice(1)\n .map((line) => `${continuationIndent}${line}`);\n return [firstLine, ...continuationLines];\n })\n .join(\"\\n\");\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return formatColumns({\n rows: commands.map((cmd) => ({\n left: cmd.name,\n right: cmd.description\n }))\n });\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return formatColumns({\n rows: options.map((opt) => ({\n left: opt.flags,\n right: opt.description\n }))\n });\n}\n", "import type { ThemePalette } from \"../tokens/colors.js\";\nimport { widths } from \"../tokens/widths.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 variant?: \"table\" | \"detail\";\n maxWidth?: number;\n}\n\ntype TableAlignment = TableColumn[\"alignment\"] | \"center\";\n\ninterface ComputedColumn {\n name: string;\n title: string;\n alignment: TableAlignment;\n width: number;\n}\n\nconst reset = \"\\x1b[0m\";\nconst ellipsis = \"\u2026\";\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction getCell(row: Record<string, string>, name: string): string {\n return Object.prototype.hasOwnProperty.call(row, name) ? row[name] ?? \"\" : \"\";\n}\n\nfunction renderMarkdownCell(value: string): string {\n return stripAnsi(value)\n .replaceAll(\"\\r\\n\", \" \")\n .replaceAll(\"\\n\", \" \")\n .replaceAll(\"\\r\", \" \")\n .replaceAll(\"|\", \"\\\\|\");\n}\n\nfunction isAnsiSequence(value: string, index: number): boolean {\n return value[index] === \"\\u001b\" && value[index + 1] === \"[\";\n}\n\nfunction readAnsiSequence(value: string, index: number): { sequence: string; nextIndex: number } {\n let nextIndex = index + 2;\n while (nextIndex < value.length && value[nextIndex] !== \"m\") {\n nextIndex += 1;\n }\n\n if (nextIndex < value.length) {\n nextIndex += 1;\n }\n\n return { sequence: value.slice(index, nextIndex), nextIndex };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction isEmojiClusterCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf)\n );\n}\n\nfunction codePointWidth(char: string): number {\n const codePoint = char.codePointAt(0) ?? 0;\n\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return 0;\n }\n\n if (\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isCombiningCodePoint(codePoint)\n ) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) ? 2 : 1;\n}\n\nfunction readPrintableCluster(value: string, index: number): string {\n const nextAnsiIndex = value.indexOf(\"\\u001b[\", index);\n const plainText = value.slice(index, nextAnsiIndex === -1 ? undefined : nextAnsiIndex);\n const firstSegment = graphemeSegmenter.segment(plainText)[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n\n return firstSegment?.segment ?? Array.from(plainText)[0] ?? \"\";\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n const isEmojiCluster =\n codePoints.length > 1 &&\n codePoints.some(\n (codePoint) =>\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isEmojiClusterCodePoint(codePoint)\n );\n\n if (isEmojiCluster) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => width + codePointWidth(String.fromCodePoint(codePoint)), 0);\n}\n\nfunction displayWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n index = readAnsiSequence(value, index).nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n width += clusterWidth(cluster);\n index += cluster.length;\n }\n\n return width;\n}\n\nfunction truncateToWidth(value: string, width: number): string {\n if (displayWidth(value) <= width) {\n return value;\n }\n\n if (width <= 0) {\n return \"\";\n }\n\n const targetWidth = width <= 1 ? 0 : width - displayWidth(ellipsis);\n let output = \"\";\n let currentWidth = 0;\n let index = 0;\n let sawAnsi = false;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n const ansi = readAnsiSequence(value, index);\n sawAnsi = true;\n output += ansi.sequence;\n index = ansi.nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n const width = clusterWidth(cluster);\n if (currentWidth + width > targetWidth) {\n break;\n }\n\n output += cluster;\n currentWidth += width;\n index += cluster.length;\n }\n\n return `${output}${ellipsis}${sawAnsi ? reset : \"\"}`;\n}\n\nfunction padCell(value: string, width: number, alignment: TableAlignment): string {\n const visibleWidth = displayWidth(value);\n const padding = Math.max(0, width - visibleWidth);\n\n if (alignment === \"right\") {\n return `${\" \".repeat(padding)}${value}`;\n }\n\n if (alignment === \"center\") {\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return `${\" \".repeat(left)}${value}${\" \".repeat(right)}`;\n }\n\n return `${value}${\" \".repeat(padding)}`;\n}\n\nfunction getAlignment(column: TableColumn): TableAlignment {\n const alignment = (column as { alignment: TableAlignment }).alignment;\n return alignment === \"right\" || alignment === \"center\" ? alignment : \"left\";\n}\n\nfunction getColumnWidth(column: TableColumn): number {\n if (!Number.isFinite(column.maxLen) || column.maxLen <= 0) {\n throw new Error(\"maxLen must be a positive finite number.\");\n }\n const configuredMin = (column as { minLen?: number }).minLen;\n const minWidth = Math.max(1, configuredMin ?? 1);\n return Math.max(minWidth, column.maxLen);\n}\n\nfunction computeColumns(columns: TableColumn[]): ComputedColumn[] {\n return columns.map((column) => ({\n name: column.name,\n title: column.title,\n alignment: getAlignment(column),\n width: getColumnWidth(column)\n }));\n}\n\nfunction renderBorder(\n columns: ComputedColumn[],\n theme: ThemePalette,\n parts: { left: string; mid: string; right: string }\n): string {\n const horizontal = theme.muted(\"\u2500\");\n const segments = columns.map((column) => horizontal.repeat(column.width + 2));\n return [\n theme.muted(parts.left),\n segments.join(theme.muted(parts.mid)),\n theme.muted(parts.right)\n ].join(\"\");\n}\n\nfunction renderTerminalRow(values: string[], columns: ComputedColumn[], theme: ThemePalette): string {\n const vertical = theme.muted(\"\u2502\");\n const cells = values.map((value, index) => {\n const column = columns[index]!;\n const truncated = truncateToWidth(value, column.width);\n return ` ${padCell(truncated, column.width, column.alignment)} `;\n });\n\n return `${vertical}${cells.join(vertical)}${vertical}`;\n}\n\nfunction wrapDetailValue(value: string, width: number): string[] {\n const lines: string[] = [];\n\n for (const paragraph of value.split(\"\\n\")) {\n let line = \"\";\n\n for (const rawWord of paragraph.split(\" \")) {\n const words: string[] = [];\n let word = rawWord;\n\n while (displayWidth(word) > width) {\n let chunk = \"\";\n let index = 0;\n\n while (index < word.length) {\n const cluster = readPrintableCluster(word, index);\n if (displayWidth(`${chunk}${cluster}`) > width) {\n break;\n }\n chunk += cluster;\n index += cluster.length;\n }\n\n words.push(chunk);\n word = word.slice(chunk.length);\n }\n\n words.push(word);\n\n for (const word of words) {\n if (line.length === 0) {\n line = word;\n continue;\n }\n\n if (displayWidth(`${line} ${word}`) <= width) {\n line = `${line} ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n }\n\n lines.push(line);\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n const computedColumns = computeColumns(columns);\n if (options.variant === \"detail\") {\n const labelColumn = computedColumns[0];\n const valueColumn = computedColumns[1];\n if (!labelColumn || !valueColumn) {\n return \"\";\n }\n\n const detailLabelWidth = widths.helpColumn + 12;\n const labelWidth = Math.min(labelColumn.width, detailLabelWidth);\n const valueWidth = Math.max(20, (options.maxWidth ?? widths.maxLine) - labelWidth - 2);\n const continuation = \" \".repeat(labelWidth + 2);\n\n return rows\n .flatMap((row) => {\n const label = truncateToWidth(getCell(row, labelColumn.name), labelWidth);\n const values = wrapDetailValue(getCell(row, valueColumn.name), valueWidth);\n if (values.length === 1 && values[0] === \"\") {\n return [theme.header(label)];\n }\n return [\n `${theme.muted(padCell(label, labelWidth, \"left\"))} ${values[0] ?? \"\"}`,\n ...values.slice(1).map((value) => `${continuation}${value}`)\n ];\n })\n .join(\"\\n\");\n }\n\n const separatorOptions = options as { rowSeparator?: boolean; rowSeparators?: boolean };\n const includeRowSeparators =\n separatorOptions.rowSeparator === true || separatorOptions.rowSeparators === true;\n\n const top = renderBorder(computedColumns, theme, { left: \"\u250C\", mid: \"\u252C\", right: \"\u2510\" });\n const header = renderTerminalRow(\n computedColumns.map((column) => theme.header(column.title)),\n computedColumns,\n theme\n );\n const headerBottom = renderBorder(computedColumns, theme, { left: \"\u251C\", mid: \"\u253C\", right: \"\u2524\" });\n const bottom = renderBorder(computedColumns, theme, { left: \"\u2514\", mid: \"\u2534\", right: \"\u2518\" });\n\n const renderedRows: string[] = [];\n for (const [index, row] of rows.entries()) {\n if (includeRowSeparators && index > 0) {\n renderedRows.push(headerBottom);\n }\n renderedRows.push(\n renderTerminalRow(\n computedColumns.map((column) => getCell(row, column.name)),\n computedColumns,\n theme\n )\n );\n }\n\n return [top, header, headerBottom, ...renderedRows, bottom].join(\"\\n\");\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => renderMarkdownCell(c.title)).join(\" | \")} |`;\n const separator = `| ${columns\n .map((c) => {\n const alignment = getAlignment(c);\n if (alignment === \"right\") {\n return \"---:\";\n }\n if (alignment === \"center\") {\n return \":---:\";\n }\n return \":---\";\n })\n .join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => renderMarkdownCell(getCell(row, c.name))).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 = Object.create(null) as Record<string, string>;\n for (const col of columns) {\n obj[col.name] = stripAnsi(getCell(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 stringWidth from \"fast-string-width\";\nimport { wrapAnsi } from \"fast-wrap-ansi\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface DetailCardRow {\n label: string;\n value: string;\n}\n\nexport interface DetailCardSection {\n title?: string;\n rows: DetailCardRow[];\n}\n\nexport interface RenderDetailCardOptions {\n theme: ThemePalette;\n title: string;\n subtitle?: string;\n badges?: string[];\n prose?: Array<{ title?: string; value: string }>;\n sections?: DetailCardSection[];\n width?: number;\n}\n\nfunction wrap(value: string, width: number): string[] {\n return wrapAnsi(value, Math.max(1, width), { hard: true, trim: true }).split(\"\\n\");\n}\n\nfunction renderRows(rows: DetailCardRow[], theme: ThemePalette, width: number): string[] {\n if (rows.length === 0) return [];\n const labelWidth = Math.max(...rows.map((row) => stringWidth(row.label)));\n const valueWidth = Math.max(20, width - labelWidth - 2);\n const continuation = \" \".repeat(labelWidth + 2);\n\n return rows.flatMap((row) => {\n const values = wrap(row.value, valueWidth);\n return [\n `${theme.muted(row.label.padEnd(labelWidth))} ${values[0] ?? \"\"}`,\n ...values.slice(1).map((value) => `${continuation}${value}`)\n ];\n });\n}\n\nexport function renderDetailCard(options: RenderDetailCardOptions): string {\n const width = options.width ?? widths.maxLine;\n const identity = [\n options.theme.header(options.title),\n options.subtitle ? options.theme.muted(options.subtitle) : undefined\n ]\n .filter((value): value is string => value !== undefined)\n .join(\" \");\n\n const hero = options.badges?.length\n ? `${identity}\\n${options.theme.muted(options.badges.map((badge) => badge[0] + badge.slice(1).toLowerCase()).join(\" \u00B7 \"))}`\n : identity;\n const blocks: string[] = [hero];\n for (const prose of options.prose ?? []) {\n blocks.push(\n prose.title\n ? [options.theme.header(prose.title), wrap(prose.value, width).join(\"\\n\")].join(\"\\n\")\n : wrap(prose.value, width).join(\"\\n\")\n );\n }\n\n for (const section of options.sections ?? []) {\n if (section.rows.length === 0) continue;\n const rows = renderRows(section.rows, options.theme, width);\n blocks.push(\n section.title ? [options.theme.header(section.title), ...rows].join(\"\\n\") : rows.join(\"\\n\")\n );\n }\n\n return blocks.join(\"\\n\\n\");\n}\n", "export type TemplateEscape = \"html\" | \"none\";\n\nexport interface RenderTemplateOptions {\n escape?: TemplateEscape;\n partials?: Record<string, string>;\n validate?: boolean;\n yield?: string;\n}\n\ntype Token =\n | { type: \"text\"; value: string; start: number }\n | { type: \"name\" | \"unescaped\"; name: string; raw: string }\n | { type: \"partial\"; name: string; indent: string }\n | {\n type: \"section\" | \"inverted\";\n name: string;\n children: Token[];\n rawStart: number;\n rawEnd: number;\n };\n\ninterface SectionFrame {\n token: Extract<Token, { type: \"section\" | \"inverted\" }>;\n parent: Token[];\n}\n\ninterface Context {\n view: unknown;\n parent?: Context;\n}\n\ntype Lambda = (...args: unknown[]) => unknown;\n\ninterface RenderState {\n escape: (value: string) => string;\n partials: Record<string, string>;\n partialStack: string[];\n preserveMissing: boolean;\n validate: boolean;\n}\n\nconst MAX_PARTIAL_DEPTH = 100;\n\nconst HTML_ESCAPE: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n};\n\nexport function renderTemplate(\n template: string,\n view: Record<string, unknown>,\n options: RenderTemplateOptions = {}\n): string {\n const prepared =\n options.yield === undefined\n ? template\n : resolveTemplatePartials(template, options.partials ?? {})\n .split(\"{{yield}}\")\n .join(options.yield);\n const tokens = parseTemplate(prepared);\n validatePartialReferences(tokens, options.partials ?? {}, []);\n if (options.validate === true) {\n const expanded = resolveTemplatePartials(prepared, options.partials ?? {});\n validateVariables(parseTemplate(expanded), { view });\n }\n const state: RenderState = {\n escape: options.escape === \"none\" ? String : escapeHtml,\n partials: options.partials ?? {},\n partialStack: [],\n preserveMissing: options.yield !== undefined && options.escape === \"none\",\n validate: options.validate === true\n };\n\n return renderTokens(tokens, { view }, prepared, state);\n}\n\nexport function getTemplatePartialNames(template: string): string[] {\n const names = new Set<string>();\n collectPartialNames(parseTemplate(template), names);\n return [...names];\n}\n\nexport function resolveTemplatePartials(\n template: string,\n partials: Record<string, string>\n): string {\n return expandTemplatePartials(template, partials, []);\n}\n\nfunction renderTemplateInContext(template: string, context: Context, state: RenderState): string {\n return renderTokens(parseTemplate(template), context, template, state);\n}\n\nfunction parseTemplate(template: string): Token[] {\n const root: Token[] = [];\n const stack: SectionFrame[] = [];\n let tokens = root;\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n appendText(tokens, template.slice(index), index);\n break;\n }\n\n appendText(tokens, template.slice(index, open), index);\n\n const parsed = parseTag(template, open);\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n if (standalone !== undefined) {\n trimTextAfter(tokens, standalone.lineStart);\n }\n\n if (parsed.kind === \"comment\") {\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"delimiter\") {\n throw new Error(\"Custom delimiters are not supported\");\n }\n\n if (parsed.kind === \"section\" || parsed.kind === \"inverted\") {\n const token: Token = {\n type: parsed.kind,\n name: parsed.name,\n children: [],\n rawStart: parsed.end,\n rawEnd: standalone?.lineStart ?? open\n };\n tokens.push(token);\n stack.push({ token, parent: tokens });\n tokens = token.children;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"partial\") {\n tokens.push({\n type: \"partial\",\n name: parsed.name,\n indent: standalone === undefined ? \"\" : template.slice(standalone.lineStart, open)\n });\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"close\") {\n const frame = stack.pop();\n if (frame === undefined) {\n throw new Error(`Closing unopened section \"${parsed.name}\"`);\n }\n if (frame.token.name !== parsed.name) {\n throw new Error(`Unclosed section \"${frame.token.name}\" before closing \"${parsed.name}\"`);\n }\n frame.token.rawEnd = open;\n tokens = frame.parent;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n tokens.push({ type: parsed.kind, name: parsed.name, raw: template.slice(open, parsed.end) });\n index = parsed.end;\n }\n\n const frame = stack.pop();\n if (frame !== undefined) {\n throw new Error(`Unclosed section \"${frame.token.name}\"`);\n }\n\n return root;\n}\n\nfunction parseTag(\n template: string,\n open: number\n): {\n kind:\n | \"name\"\n | \"unescaped\"\n | \"section\"\n | \"inverted\"\n | \"close\"\n | \"comment\"\n | \"partial\"\n | \"delimiter\";\n name: string;\n end: number;\n} {\n if (template.startsWith(\"{{{\", open)) {\n const close = template.indexOf(\"}}}\", open + 3);\n if (close === -1) {\n throw new Error(\"Unclosed unescaped tag\");\n }\n return { kind: \"unescaped\", name: template.slice(open + 3, close).trim(), end: close + 3 };\n }\n\n const close = template.indexOf(\"}}\", open + 2);\n if (close === -1) {\n throw new Error(\"Unclosed tag\");\n }\n\n const raw = template.slice(open + 2, close).trim();\n const sigil = raw[0];\n const name = sigil === undefined ? \"\" : raw.slice(1).trim();\n const end = close + 2;\n\n if (sigil === \"#\") return { kind: \"section\", name, end };\n if (sigil === \"^\") return { kind: \"inverted\", name, end };\n if (sigil === \"/\") return { kind: \"close\", name, end };\n if (sigil === \"!\") return { kind: \"comment\", name, end };\n if (sigil === \"&\") return { kind: \"unescaped\", name, end };\n if (sigil === \">\") return { kind: \"partial\", name, end };\n if (sigil === \"=\" && raw.endsWith(\"=\")) return { kind: \"delimiter\", name, end };\n\n return { kind: \"name\", name: raw, end };\n}\n\nfunction getStandalone(\n template: string,\n tagStart: number,\n tagEnd: number,\n kind: ReturnType<typeof parseTag>[\"kind\"]\n): { lineStart: number; nextIndex: number } | undefined {\n if (![\"section\", \"inverted\", \"close\", \"comment\", \"partial\", \"delimiter\"].includes(kind)) {\n return undefined;\n }\n\n const lineStart = template.lastIndexOf(\"\\n\", tagStart - 1) + 1;\n if (!isWhitespace(template.slice(lineStart, tagStart))) {\n return undefined;\n }\n\n let cursor = tagEnd;\n while (cursor < template.length && (template[cursor] === \" \" || template[cursor] === \"\\t\")) {\n cursor += 1;\n }\n\n if (template.startsWith(\"\\r\\n\", cursor)) {\n return { lineStart, nextIndex: cursor + 2 };\n }\n\n if (template[cursor] === \"\\n\") {\n return { lineStart, nextIndex: cursor + 1 };\n }\n\n if (cursor === template.length) {\n return { lineStart, nextIndex: cursor };\n }\n\n return undefined;\n}\n\nfunction renderTokens(\n tokens: Token[],\n context: Context,\n template: string,\n state: RenderState\n): string {\n let output = \"\";\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n output += token.value;\n continue;\n\n case \"name\":\n case \"unescaped\": {\n const result = lookup(context, token.name);\n if (!result.hit || result.value == null) {\n if (state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n if (state.preserveMissing) {\n output += token.raw;\n }\n continue;\n }\n const rendered = String(result.value);\n output += token.type === \"name\" ? state.escape(rendered) : rendered;\n continue;\n }\n\n case \"partial\": {\n if (!Object.hasOwn(state.partials, token.name)) {\n throw new Error(`Partial \"${token.name}\" not found.`);\n }\n if (state.partialStack.includes(token.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...state.partialStack, token.name].join(\" -> \")}.`\n );\n }\n if (state.partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n const partial = indentPartial(state.partials[token.name], token.indent);\n output += renderTokens(parseTemplate(partial), context, partial, {\n ...state,\n partialStack: [...state.partialStack, token.name]\n });\n continue;\n }\n\n case \"inverted\": {\n const result = lookup(context, token.name);\n if (!result.hit && state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n const value = result.value;\n if (!value || (Array.isArray(value) && value.length === 0)) {\n output += renderTokens(token.children, context, template, state);\n }\n continue;\n }\n\n case \"section\": {\n const result = lookup(context, token.name);\n if (!result.hit && state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n const value = result.value;\n if (!value) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n output += renderTokens(token.children, pushContext(context, item), template, state);\n }\n continue;\n }\n\n if (typeof value === \"function\") {\n const raw = template.slice(token.rawStart, token.rawEnd);\n const rendered = (value as Lambda).call(context.view, raw, (nextTemplate: string) =>\n renderTemplateInContext(nextTemplate, context, state)\n );\n if (rendered != null) {\n output += String(rendered);\n }\n continue;\n }\n\n if (typeof value === \"object\" || typeof value === \"string\" || typeof value === \"number\") {\n output += renderTokens(token.children, pushContext(context, value), template, state);\n continue;\n }\n\n output += renderTokens(token.children, context, template, state);\n }\n }\n }\n\n return output;\n}\n\nfunction lookup(context: Context, name: string): { hit: boolean; value: unknown } {\n if (name === \".\") {\n return { hit: true, value: callLambda(context.view, context.view) };\n }\n\n let cursor: Context | undefined = context;\n while (cursor !== undefined) {\n const result = name.includes(\".\")\n ? lookupDotted(cursor.view, name)\n : lookupName(cursor.view, name);\n\n if (result.hit) {\n return { hit: true, value: callLambda(result.value, cursor.view) };\n }\n\n cursor = cursor.parent;\n }\n\n return { hit: false, value: undefined };\n}\n\nfunction collectPartialNames(tokens: Token[], names: Set<string>): void {\n for (const token of tokens) {\n if (token.type === \"partial\") {\n names.add(token.name);\n continue;\n }\n if (token.type === \"section\" || token.type === \"inverted\") {\n collectPartialNames(token.children, names);\n }\n }\n}\n\nfunction validateVariables(tokens: Token[], context: Context): void {\n for (const token of tokens) {\n if (token.type === \"text\" || token.type === \"partial\") {\n continue;\n }\n if (token.type === \"name\" || token.type === \"unescaped\") {\n if (!lookup(context, token.name).hit) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n continue;\n }\n if (token.type !== \"section\" && token.type !== \"inverted\") {\n continue;\n }\n\n const result = lookup(context, token.name);\n if (!result.hit) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n if (Array.isArray(result.value) && result.value.length > 0) {\n for (const item of result.value) {\n validateVariables(token.children, pushContext(context, item));\n }\n continue;\n }\n if (\n typeof result.value === \"object\" && result.value !== null ||\n typeof result.value === \"string\" ||\n typeof result.value === \"number\"\n ) {\n validateVariables(token.children, pushContext(context, result.value));\n continue;\n }\n\n validateVariables(token.children, context);\n }\n}\n\nfunction validatePartialReferences(\n tokens: Token[],\n partials: Record<string, string>,\n partialStack: string[]\n): void {\n for (const token of tokens) {\n if (token.type === \"section\" || token.type === \"inverted\") {\n validatePartialReferences(token.children, partials, partialStack);\n continue;\n }\n if (token.type !== \"partial\") {\n continue;\n }\n if (!Object.hasOwn(partials, token.name)) {\n throw new Error(`Partial \"${token.name}\" not found.`);\n }\n if (partialStack.includes(token.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...partialStack, token.name].join(\" -> \")}.`\n );\n }\n if (partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n validatePartialReferences(parseTemplate(partials[token.name]), partials, [\n ...partialStack,\n token.name\n ]);\n }\n}\n\nfunction indentPartial(partial: string, indent: string): string {\n if (indent === \"\") {\n return partial;\n }\n\n return partial\n .split(\"\\n\")\n .map((line) => (line === \"\" ? \"\" : `${indent}${line}`))\n .join(\"\\n\");\n}\n\nfunction expandTemplatePartials(\n template: string,\n partials: Record<string, string>,\n partialStack: string[]\n): string {\n let output = \"\";\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n output += template.slice(index);\n break;\n }\n\n const parsed = parseTag(template, open);\n if (parsed.kind !== \"partial\") {\n output += template.slice(index, parsed.end);\n index = parsed.end;\n continue;\n }\n\n if (!Object.hasOwn(partials, parsed.name)) {\n throw new Error(`Partial \"${parsed.name}\" not found.`);\n }\n if (partialStack.includes(parsed.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...partialStack, parsed.name].join(\" -> \")}.`\n );\n }\n if (partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n const beforePartial =\n standalone === undefined\n ? template.slice(index, open)\n : template.slice(index, standalone.lineStart);\n const indent = standalone === undefined ? \"\" : template.slice(standalone.lineStart, open);\n const partial = indentPartial(partials[parsed.name], indent);\n output +=\n beforePartial + expandTemplatePartials(partial, partials, [...partialStack, parsed.name]);\n index = standalone?.nextIndex ?? parsed.end;\n }\n\n return output;\n}\n\nfunction lookupName(view: unknown, name: string): { hit: boolean; value: unknown } {\n if (!isPropertyContainer(view) || !hasProperty(view, name)) {\n return { hit: false, value: undefined };\n }\n\n return { hit: true, value: view[name] };\n}\n\nfunction lookupDotted(view: unknown, name: string): { hit: boolean; value: unknown } {\n const parts = name.split(\".\");\n let value = view;\n\n for (const part of parts) {\n if (!isPropertyContainer(value) || !hasProperty(value, part)) {\n return { hit: false, value: undefined };\n }\n value = Object(value)[part as keyof typeof value];\n }\n\n return { hit: true, value };\n}\n\nfunction callLambda(value: unknown, view: unknown): unknown {\n return typeof value === \"function\" ? (value as Lambda).call(view) : value;\n}\n\nfunction pushContext(parent: Context, view: unknown): Context {\n return { view, parent };\n}\n\nfunction appendText(tokens: Token[], value: string, start: number): void {\n if (value === \"\") {\n return;\n }\n\n const previous = tokens[tokens.length - 1];\n if (previous?.type === \"text\") {\n previous.value += value;\n return;\n }\n\n tokens.push({ type: \"text\", value, start });\n}\n\nfunction trimTextAfter(tokens: Token[], lineStart: number): void {\n const previous = tokens[tokens.length - 1];\n if (previous?.type !== \"text\") {\n return;\n }\n\n const keep = Math.max(0, lineStart - previous.start);\n previous.value = previous.value.slice(0, keep);\n if (previous.value === \"\") {\n tokens.pop();\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"'`=/]/g, (char) => HTML_ESCAPE[char] ?? char);\n}\n\nfunction isWhitespace(value: string): boolean {\n return value.trim() === \"\";\n}\n\nfunction isPropertyContainer(value: unknown): value is Record<string, unknown> {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nfunction hasProperty(value: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key);\n}\n", "import { spawn } from \"node:child_process\";\nimport process from \"node:process\";\n\ninterface BrowserProcess {\n once(event: \"error\", listener: (error: Error) => void): this;\n once(event: \"close\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n unref(): void;\n}\n\ntype SpawnBrowserProcess = (\n command: string,\n args: string[],\n options: { detached: true; stdio: \"ignore\" }\n) => BrowserProcess;\n\nexport interface OpenExternalOptions {\n platform?: NodeJS.Platform;\n spawnProcess?: SpawnBrowserProcess;\n}\n\nexport async function openExternal(url: string, options: OpenExternalOptions = {}): Promise<void> {\n const parsed = new URL(url);\n const { command, args } = browserCommand(parsed.href, options.platform ?? process.platform);\n await launchBrowser(command, args, options.spawnProcess ?? spawn);\n}\n\nfunction browserCommand(url: string, platform: NodeJS.Platform): { command: string; args: string[] } {\n if (platform === \"darwin\") {\n return { command: \"open\", args: [url] };\n }\n\n if (platform === \"win32\") {\n return { command: \"rundll32.exe\", args: [\"url.dll,FileProtocolHandler\", url] };\n }\n\n return { command: \"xdg-open\", args: [url] };\n}\n\nfunction launchBrowser(\n command: string,\n args: string[],\n spawnProcess: SpawnBrowserProcess\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawnProcess(command, args, { detached: true, stdio: \"ignore\" });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (code !== 0) {\n const reason = code === null ? `signal ${signal ?? \"unknown\"}` : `code ${code}`;\n reject(new Error(`Browser launcher exited with ${reason}`));\n return;\n }\n\n child.unref();\n resolve();\n });\n });\n}\n", "import { LineCounter, parse, parseDocument } from \"yaml\";\nimport { inspectFrontmatterBlock, splitFrontmatterBlock } from \"./fences.js\";\n\nexport interface ParsedFrontmatter {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface ParsedFrontmatterDocument extends ParsedFrontmatter {\n errors: readonly { message: string; pos?: [number, number] }[];\n lineCounter: LineCounter;\n}\n\nexport interface ParseFrontmatterOptions {\n uniqueKeys?: boolean;\n}\n\nexport class FrontmatterParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FrontmatterParseError\";\n }\n}\n\nexport function parseFrontmatter(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatter {\n const split = splitFrontmatter(source);\n\n if (split.raw === undefined) {\n return {\n frontmatter: {},\n body: split.body\n };\n }\n\n return {\n frontmatter: parseYamlFrontmatter(split.raw, options),\n body: split.body\n };\n}\n\nexport function parseFrontmatterDocument(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatterDocument {\n const split = inspectFrontmatterBlock(source);\n const lineCounter = createSourceLineCounter(source);\n\n if (split.kind === \"body\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [],\n lineCounter\n };\n }\n\n if (split.kind === \"missing-closing-fence\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: split.message, pos: [split.position, split.position] }],\n lineCounter\n };\n }\n\n const yamlLineCounter = new LineCounter();\n const normalizedYaml = normalizeYamlLineEndings(split.raw);\n const document = parseDocument(normalizedYaml, {\n lineCounter: yamlLineCounter,\n prettyErrors: false,\n uniqueKeys: options.uniqueKeys ?? false\n });\n const errors = document.errors.map((error) => ({\n message: error.message,\n ...(error.pos === undefined\n ? {}\n : { pos: translateYamlErrorPosition(error.pos as [number, number], split) })\n }));\n\n if (errors.length > 0) {\n return {\n frontmatter: {},\n body: split.body,\n errors,\n lineCounter\n };\n }\n\n try {\n return {\n frontmatter: normalizeYamlFrontmatter(document.toJSON()),\n body: split.body,\n errors,\n lineCounter\n };\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: error.message }],\n lineCounter\n };\n }\n\n throw error;\n }\n}\n\nfunction createSourceLineCounter(source: string): LineCounter {\n const lineCounter = new LineCounter();\n lineCounter.addNewLine(0);\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n\n if (character === \"\\n\") {\n lineCounter.addNewLine(index + 1);\n continue;\n }\n\n if (character === \"\\r\") {\n lineCounter.addNewLine(index + (source[index + 1] === \"\\n\" ? 2 : 1));\n if (source[index + 1] === \"\\n\") {\n index += 1;\n }\n }\n }\n\n return lineCounter;\n}\n\nfunction translateYamlErrorPosition(\n pos: [number, number],\n split: { raw: string; rawStart: number }\n): [number, number] {\n return pos.map((offset) => split.rawStart + normalizeYamlErrorOffset(split.raw, offset)) as [\n number,\n number\n ];\n}\n\nfunction normalizeYamlErrorOffset(raw: string, offset: number): number {\n if (offset >= raw.length && endsWithLineBreak(raw)) {\n return findPreviousLineStart(raw, raw.length);\n }\n\n return offset;\n}\n\nfunction endsWithLineBreak(value: string): boolean {\n return value.endsWith(\"\\n\") || value.endsWith(\"\\r\");\n}\n\nfunction findPreviousLineStart(value: string, end: number): number {\n let index = end - 1;\n\n if (value[index] === \"\\n\") {\n index -= 1;\n }\n\n if (value[index] === \"\\r\") {\n index -= 1;\n }\n\n while (index >= 0) {\n const character = value[index];\n\n if (character === \"\\n\" || character === \"\\r\") {\n return index + 1;\n }\n\n index -= 1;\n }\n\n return 0;\n}\n\nfunction splitFrontmatter(source: string): { raw?: string; body: string } {\n try {\n return splitFrontmatterBlock(source);\n } catch (error) {\n if (error instanceof Error) {\n throw new FrontmatterParseError(error.message);\n }\n\n throw error;\n }\n}\n\nfunction parseYamlFrontmatter(\n yamlBlock: string,\n options: ParseFrontmatterOptions\n): Record<string, unknown> {\n let parsed: unknown;\n\n try {\n parsed = parse(normalizeYamlLineEndings(yamlBlock), {\n uniqueKeys: options.uniqueKeys ?? false\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n\n return normalizeYamlFrontmatter(parsed);\n}\n\nfunction normalizeYamlLineEndings(value: string): string {\n if (!value.includes(\"\\r\")) {\n return value;\n }\n\n let normalized = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n\n if (character !== \"\\r\") {\n normalized += character;\n continue;\n }\n\n if (value[index + 1] === \"\\n\") {\n normalized += \"\\r\\n\";\n index += 1;\n continue;\n }\n\n normalized += \"\\n\";\n }\n\n return normalized;\n}\n\nfunction normalizeYamlFrontmatter(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) {\n return {};\n }\n\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n\n return normalizeYamlValue(value) as Record<string, unknown>;\n}\n\nfunction normalizeYamlValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeYamlValue(item));\n }\n\n if (!isPlainRecord(value)) {\n return value;\n }\n\n const normalized: Record<string, unknown> = {};\n\n for (const [key, entryValue] of Object.entries(value)) {\n Object.defineProperty(normalized, key, {\n configurable: true,\n enumerable: true,\n value: normalizeYamlValue(entryValue),\n writable: true\n });\n }\n\n return normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import { stringify } from \"yaml\";\nimport { FrontmatterParseError } from \"./parse.js\";\n\nexport function stringifyFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n try {\n assertFrontmatterRoot(frontmatter);\n assertAcyclic(frontmatter);\n return `---\\n${stringify(frontmatter, { aliasDuplicateObjects: false }).trimEnd()}\\n---\\n${body}`;\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : \"Unknown YAML stringify error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n}\n\nfunction assertFrontmatterRoot(value: unknown): asserts value is Record<string, unknown> {\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n}\n\nfunction assertAcyclic(value: unknown, seen: WeakSet<object> = new WeakSet()): void {\n if (typeof value !== \"object\" || value === null) {\n return;\n }\n\n if (seen.has(value)) {\n throw new FrontmatterParseError(\"Cannot stringify cyclic frontmatter.\");\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n assertAcyclic(item, seen);\n }\n } else {\n for (const item of Object.values(value)) {\n assertAcyclic(item, seen);\n }\n }\n\n seen.delete(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import type { CodeToken, CodeTokenKind, MdNode } from \"../ast.js\";\n\ntype CodeHighlightFamily = \"lexical\" | \"data\" | \"style\" | \"line\" | \"markup\";\n\ntype CodeLanguageInfo = {\n id: string;\n aliases: readonly string[];\n family?: CodeHighlightFamily;\n spec?: string;\n plain?: boolean;\n};\n\ntype CodeTokenizer = (source: string, language: CodeLanguageInfo) => CodeToken[];\n\ntype TokenEmitter = {\n push(kind: CodeTokenKind, start: number, end: number): void;\n pushPlain(start: number, end: number): void;\n};\n\ntype LexicalSpec = {\n keywords?: ReadonlySet<string>;\n types?: ReadonlySet<string>;\n constants?: ReadonlySet<string>;\n booleans?: ReadonlySet<string>;\n nulls?: ReadonlySet<string>;\n commands?: ReadonlySet<string>;\n lineComments?: readonly string[];\n blockComments?: readonly BlockCommentDelimiter[];\n stringQuotes?: readonly string[];\n templateQuotes?: boolean;\n tripleStringQuotes?: boolean;\n decorators?: boolean;\n rustAttributes?: boolean;\n variablePrefix?: \"$\";\n flags?: boolean;\n caseInsensitive?: boolean;\n};\n\ntype BlockCommentDelimiter = {\n start: string;\n end: string;\n};\n\nconst cStyleBlockComments = [{ start: \"/*\", end: \"*/\" }] as const;\n\nconst codeLanguages: readonly CodeLanguageInfo[] = [\n {\n id: \"javascript\",\n aliases: [\"js\", \"javascript\", \"mjs\", \"cjs\", \"es6\"],\n family: \"lexical\",\n spec: \"javascript\"\n },\n { id: \"javascriptreact\", aliases: [\"jsx\"], family: \"lexical\", spec: \"javascript\" },\n {\n id: \"typescript\",\n aliases: [\"ts\", \"typescript\", \"mts\", \"cts\"],\n family: \"lexical\",\n spec: \"typescript\"\n },\n { id: \"typescriptreact\", aliases: [\"tsx\"], family: \"lexical\", spec: \"typescript\" },\n { id: \"json\", aliases: [\"json\"], family: \"data\", spec: \"json\" },\n { id: \"jsonc\", aliases: [\"jsonc\"], family: \"data\", spec: \"jsonc\" },\n { id: \"jsonl\", aliases: [\"jsonl\"], family: \"data\", spec: \"json\" },\n { id: \"yaml\", aliases: [\"yaml\", \"yml\"], family: \"data\", spec: \"yaml\" },\n { id: \"css\", aliases: [\"css\"], family: \"style\", spec: \"css\" },\n { id: \"scss\", aliases: [\"scss\"], family: \"style\", spec: \"css\" },\n { id: \"sass\", aliases: [\"sass\"], family: \"style\", spec: \"css\" },\n { id: \"less\", aliases: [\"less\"], family: \"style\", spec: \"css\" },\n { id: \"postcss\", aliases: [\"postcss\"], family: \"style\", spec: \"css\" },\n { id: \"shellscript\", aliases: [\"sh\", \"bash\", \"shell\", \"shellscript\", \"zsh\", \"fish\"], family: \"lexical\", spec: \"shell\" },\n { id: \"python\", aliases: [\"py\", \"python\"], family: \"lexical\", spec: \"python\" },\n { id: \"sql\", aliases: [\"sql\", \"ddl\", \"dml\"], family: \"lexical\", spec: \"sql\" },\n { id: \"html\", aliases: [\"html\"], family: \"markup\", spec: \"html\" },\n { id: \"xml\", aliases: [\"xml\", \"svg\"], family: \"markup\", spec: \"xml\" },\n { id: \"markdown\", aliases: [\"md\", \"markdown\"], family: \"line\", spec: \"markdown\" },\n { id: \"diff\", aliases: [\"diff\", \"patch\"], family: \"line\", spec: \"diff\" },\n { id: \"dockerfile\", aliases: [\"dockerfile\", \"docker\"], family: \"line\", spec: \"dockerfile\" },\n { id: \"ini\", aliases: [\"ini\", \"properties\"], family: \"data\", spec: \"ini\" },\n { id: \"toml\", aliases: [\"toml\"], family: \"data\", spec: \"toml\" },\n { id: \"plaintext\", aliases: [\"text\", \"txt\", \"plain\", \"plaintext\"], plain: true },\n { id: \"ruby\", aliases: [\"rb\", \"ruby\"], family: \"lexical\", spec: \"ruby\" },\n { id: \"go\", aliases: [\"go\", \"golang\"], family: \"lexical\", spec: \"go\" },\n { id: \"java\", aliases: [\"java\"], family: \"lexical\", spec: \"java\" },\n { id: \"kotlin\", aliases: [\"kt\", \"kotlin\", \"kts\"], family: \"lexical\", spec: \"kotlin\" },\n { id: \"swift\", aliases: [\"swift\"], family: \"lexical\", spec: \"swift\" },\n { id: \"dart\", aliases: [\"dart\"], family: \"lexical\", spec: \"dart\" },\n { id: \"scala\", aliases: [\"scala\", \"sc\"], family: \"lexical\", spec: \"scala\" },\n { id: \"groovy\", aliases: [\"groovy\", \"gvy\", \"gy\", \"gsp\"], family: \"lexical\", spec: \"groovy\" },\n { id: \"c\", aliases: [\"c\"], family: \"lexical\", spec: \"c\" },\n { id: \"cpp\", aliases: [\"cpp\", \"c++\", \"cc\", \"cxx\"], family: \"lexical\", spec: \"cpp\" },\n { id: \"csharp\", aliases: [\"cs\", \"csharp\", \"c#\"], family: \"lexical\", spec: \"csharp\" },\n { id: \"objective-c\", aliases: [\"objc\", \"objectivec\", \"objective-c\", \"m\", \"mm\"], family: \"lexical\", spec: \"objectivec\" },\n { id: \"rust\", aliases: [\"rs\", \"rust\"], family: \"lexical\", spec: \"rust\" },\n { id: \"php\", aliases: [\"php\"], family: \"lexical\", spec: \"php\" },\n { id: \"lua\", aliases: [\"lua\"], family: \"lexical\", spec: \"lua\" },\n { id: \"perl\", aliases: [\"pl\", \"perl\", \"pm\"], family: \"lexical\", spec: \"perl\" },\n { id: \"r\", aliases: [\"r\", \"rscript\"], family: \"lexical\", spec: \"r\" },\n { id: \"powershell\", aliases: [\"ps1\", \"powershell\", \"pwsh\"], family: \"lexical\", spec: \"powershell\" },\n { id: \"elixir\", aliases: [\"ex\", \"exs\", \"elixir\"], family: \"lexical\", spec: \"elixir\" },\n { id: \"erlang\", aliases: [\"erl\", \"erlang\", \"hrl\"], family: \"lexical\", spec: \"erlang\" },\n { id: \"haskell\", aliases: [\"hs\", \"haskell\"], family: \"lexical\", spec: \"haskell\" },\n { id: \"clojure\", aliases: [\"clj\", \"cljs\", \"cljc\", \"clojure\"], family: \"lexical\", spec: \"clojure\" },\n { id: \"fsharp\", aliases: [\"fs\", \"fsi\", \"fsx\", \"fsharp\"], family: \"lexical\", spec: \"fsharp\" },\n { id: \"vb\", aliases: [\"vb\", \"vbnet\"], family: \"lexical\", spec: \"vb\" },\n { id: \"graphql\", aliases: [\"graphql\", \"gql\"], family: \"lexical\", spec: \"graphql\" },\n { id: \"protobuf\", aliases: [\"proto\", \"protobuf\"], family: \"lexical\", spec: \"protobuf\" },\n { id: \"hcl\", aliases: [\"hcl\", \"tf\", \"terraform\"], family: \"lexical\", spec: \"hcl\" },\n { id: \"nginx\", aliases: [\"nginx\", \"nginxconf\"], family: \"lexical\", spec: \"nginx\" },\n { id: \"makefile\", aliases: [\"makefile\", \"mk\"], family: \"lexical\", spec: \"makefile\" },\n { id: \"cmake\", aliases: [\"cmake\"], family: \"lexical\", spec: \"cmake\" },\n { id: \"gradle\", aliases: [\"gradle\"], family: \"lexical\", spec: \"groovy\" },\n { id: \"env\", aliases: [\"env\", \"dotenv\"], family: \"data\", spec: \"ini\" },\n { id: \"vue\", aliases: [\"vue\"], family: \"markup\", spec: \"html\" },\n { id: \"svelte\", aliases: [\"svelte\"], family: \"markup\", spec: \"html\" }\n] as const;\n\nconst languageByAlias = new Map<string, CodeLanguageInfo>();\n\nfor (const language of codeLanguages) {\n languageByAlias.set(language.id.toLowerCase(), language);\n\n for (const alias of language.aliases) {\n languageByAlias.set(alias.toLowerCase(), language);\n }\n}\n\nconst jsKeywords = new Set([\n \"as\",\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"export\",\n \"extends\",\n \"finally\",\n \"for\",\n \"from\",\n \"function\",\n \"get\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"of\",\n \"return\",\n \"set\",\n \"static\",\n \"super\",\n \"switch\",\n \"throw\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nconst tsKeywords = new Set([\n ...jsKeywords,\n \"abstract\",\n \"declare\",\n \"enum\",\n \"implements\",\n \"interface\",\n \"keyof\",\n \"namespace\",\n \"private\",\n \"protected\",\n \"public\",\n \"readonly\",\n \"satisfies\",\n \"type\"\n]);\n\nconst tsTypes = new Set([\n \"any\",\n \"bigint\",\n \"boolean\",\n \"never\",\n \"number\",\n \"object\",\n \"string\",\n \"symbol\",\n \"unknown\",\n \"void\"\n]);\n\nconst jsConstants = new Set([\"true\", \"false\", \"null\", \"undefined\", \"NaN\", \"Infinity\"]);\n\nconst pythonKeywords = new Set([\n \"and\",\n \"as\",\n \"assert\",\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"class\",\n \"continue\",\n \"def\",\n \"del\",\n \"elif\",\n \"else\",\n \"except\",\n \"finally\",\n \"for\",\n \"from\",\n \"global\",\n \"if\",\n \"import\",\n \"in\",\n \"is\",\n \"lambda\",\n \"match\",\n \"nonlocal\",\n \"not\",\n \"or\",\n \"pass\",\n \"raise\",\n \"return\",\n \"try\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nconst pythonTypes = new Set([\"Any\", \"Callable\", \"Iterable\", \"None\", \"Protocol\", \"Self\", \"TypeVar\", \"bool\", \"bytes\", \"dict\", \"float\", \"int\", \"list\", \"object\", \"set\", \"str\", \"tuple\"]);\nconst pythonBooleans = new Set([\"True\", \"False\"]);\nconst pythonNulls = new Set([\"None\", \"NotImplemented\", \"Ellipsis\"]);\n\nconst shellKeywords = new Set([\"case\", \"do\", \"done\", \"elif\", \"else\", \"esac\", \"fi\", \"for\", \"function\", \"if\", \"in\", \"select\", \"then\", \"until\", \"while\"]);\nconst shellCommands = new Set([\"awk\", \"cat\", \"cd\", \"chmod\", \"cp\", \"echo\", \"env\", \"export\", \"find\", \"grep\", \"mkdir\", \"mv\", \"printf\", \"pwd\", \"rm\", \"sed\", \"test\"]);\n\nconst sqlKeywords = new Set([\n \"add\",\n \"alter\",\n \"and\",\n \"as\",\n \"by\",\n \"case\",\n \"create\",\n \"delete\",\n \"desc\",\n \"distinct\",\n \"drop\",\n \"else\",\n \"end\",\n \"exists\",\n \"from\",\n \"group\",\n \"having\",\n \"in\",\n \"insert\",\n \"into\",\n \"is\",\n \"join\",\n \"left\",\n \"limit\",\n \"not\",\n \"null\",\n \"on\",\n \"or\",\n \"order\",\n \"outer\",\n \"primary\",\n \"references\",\n \"right\",\n \"select\",\n \"set\",\n \"table\",\n \"then\",\n \"union\",\n \"update\",\n \"values\",\n \"when\",\n \"where\"\n]);\n\nconst rubyKeywords = new Set([\"alias\", \"and\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"defined?\", \"do\", \"else\", \"elsif\", \"end\", \"ensure\", \"false\", \"for\", \"if\", \"in\", \"module\", \"next\", \"nil\", \"not\", \"or\", \"redo\", \"rescue\", \"retry\", \"return\", \"self\", \"super\", \"then\", \"true\", \"undef\", \"unless\", \"until\", \"when\", \"while\", \"yield\"]);\nconst rubyBooleans = new Set([\"true\", \"false\"]);\nconst rubyNulls = new Set([\"nil\"]);\n\nconst goKeywords = new Set([\"break\", \"case\", \"chan\", \"const\", \"continue\", \"default\", \"defer\", \"else\", \"fallthrough\", \"for\", \"func\", \"go\", \"goto\", \"if\", \"import\", \"interface\", \"map\", \"package\", \"range\", \"return\", \"select\", \"struct\", \"switch\", \"type\", \"var\"]);\nconst goTypes = new Set([\"any\", \"bool\", \"byte\", \"complex128\", \"complex64\", \"error\", \"float32\", \"float64\", \"int\", \"int16\", \"int32\", \"int64\", \"int8\", \"rune\", \"string\", \"uint\", \"uint16\", \"uint32\", \"uint64\", \"uint8\", \"uintptr\"]);\nconst goBooleans = new Set([\"true\", \"false\"]);\nconst goNulls = new Set([\"nil\"]);\n\nconst javaKeywords = new Set([\"abstract\", \"assert\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"default\", \"do\", \"else\", \"enum\", \"extends\", \"final\", \"finally\", \"for\", \"if\", \"implements\", \"import\", \"instanceof\", \"interface\", \"native\", \"new\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"static\", \"strictfp\", \"super\", \"switch\", \"synchronized\", \"this\", \"throw\", \"throws\", \"transient\", \"try\", \"volatile\", \"while\"]);\nconst javaTypes = new Set([\"Boolean\", \"Byte\", \"Character\", \"Double\", \"Float\", \"Integer\", \"Long\", \"Object\", \"Optional\", \"Short\", \"String\", \"Void\", \"boolean\", \"byte\", \"char\", \"double\", \"float\", \"int\", \"long\", \"short\", \"void\"]);\nconst javaBooleans = new Set([\"true\", \"false\"]);\nconst javaNulls = new Set([\"null\"]);\n\nconst kotlinKeywords = new Set([\"as\", \"break\", \"by\", \"catch\", \"class\", \"companion\", \"constructor\", \"continue\", \"data\", \"do\", \"else\", \"enum\", \"expect\", \"finally\", \"for\", \"fun\", \"if\", \"import\", \"in\", \"interface\", \"internal\", \"is\", \"object\", \"out\", \"override\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"sealed\", \"suspend\", \"throw\", \"try\", \"typealias\", \"val\", \"var\", \"when\", \"where\", \"while\"]);\nconst kotlinTypes = new Set([\"Any\", \"Boolean\", \"Byte\", \"Char\", \"Double\", \"Float\", \"Int\", \"List\", \"Long\", \"Map\", \"Nothing\", \"Set\", \"Short\", \"String\", \"Unit\"]);\n\nconst swiftKeywords = new Set([\"actor\", \"as\", \"associatedtype\", \"async\", \"await\", \"break\", \"case\", \"catch\", \"class\", \"continue\", \"defer\", \"deinit\", \"do\", \"else\", \"enum\", \"extension\", \"fallthrough\", \"for\", \"func\", \"guard\", \"if\", \"import\", \"in\", \"init\", \"inout\", \"let\", \"nil\", \"operator\", \"private\", \"protocol\", \"public\", \"repeat\", \"return\", \"self\", \"Self\", \"static\", \"struct\", \"subscript\", \"super\", \"switch\", \"throw\", \"throws\", \"try\", \"typealias\", \"var\", \"where\", \"while\"]);\nconst swiftTypes = new Set([\"Any\", \"Array\", \"Bool\", \"Character\", \"Dictionary\", \"Double\", \"Float\", \"Int\", \"Optional\", \"Result\", \"Set\", \"String\", \"UInt\", \"Void\"]);\n\nconst dartKeywords = new Set([\"abstract\", \"as\", \"assert\", \"async\", \"await\", \"base\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"covariant\", \"default\", \"deferred\", \"do\", \"else\", \"enum\", \"export\", \"extends\", \"extension\", \"external\", \"factory\", \"false\", \"final\", \"finally\", \"for\", \"function\", \"get\", \"hide\", \"if\", \"implements\", \"import\", \"in\", \"interface\", \"is\", \"late\", \"library\", \"mixin\", \"new\", \"null\", \"on\", \"operator\", \"part\", \"required\", \"return\", \"sealed\", \"set\", \"show\", \"static\", \"super\", \"switch\", \"sync\", \"this\", \"throw\", \"true\", \"try\", \"typedef\", \"var\", \"void\", \"when\", \"while\", \"with\", \"yield\"]);\nconst dartTypes = new Set([\"BigInt\", \"bool\", \"DateTime\", \"double\", \"Duration\", \"dynamic\", \"Future\", \"int\", \"Iterable\", \"List\", \"Map\", \"Never\", \"num\", \"Object\", \"Pattern\", \"Record\", \"Set\", \"Stream\", \"String\", \"Symbol\", \"Uri\", \"void\"]);\n\nconst scalaKeywords = new Set([\"abstract\", \"case\", \"catch\", \"class\", \"def\", \"do\", \"else\", \"enum\", \"export\", \"extends\", \"false\", \"final\", \"finally\", \"for\", \"forSome\", \"given\", \"if\", \"implicit\", \"import\", \"lazy\", \"macro\", \"match\", \"new\", \"null\", \"object\", \"override\", \"package\", \"private\", \"protected\", \"return\", \"sealed\", \"super\", \"then\", \"this\", \"throw\", \"trait\", \"true\", \"try\", \"type\", \"val\", \"var\", \"while\", \"with\", \"yield\"]);\nconst scalaTypes = new Set([\"Any\", \"Boolean\", \"Byte\", \"Char\", \"Double\", \"Either\", \"Float\", \"Int\", \"List\", \"Long\", \"Map\", \"None\", \"Option\", \"Seq\", \"Set\", \"Short\", \"Some\", \"String\", \"Unit\"]);\n\nconst groovyKeywords = new Set([\"abstract\", \"as\", \"assert\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"def\", \"default\", \"do\", \"else\", \"enum\", \"extends\", \"false\", \"final\", \"finally\", \"for\", \"goto\", \"if\", \"implements\", \"import\", \"in\", \"instanceof\", \"interface\", \"new\", \"null\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"static\", \"super\", \"switch\", \"this\", \"throw\", \"throws\", \"trait\", \"true\", \"try\", \"var\", \"void\", \"while\"]);\nconst groovyTypes = new Set([\"BigDecimal\", \"Boolean\", \"Closure\", \"Date\", \"Integer\", \"List\", \"Map\", \"Object\", \"String\", \"boolean\", \"def\", \"int\", \"long\", \"void\"]);\n\nconst cKeywords = new Set([\"auto\", \"break\", \"case\", \"const\", \"continue\", \"default\", \"do\", \"else\", \"enum\", \"extern\", \"for\", \"goto\", \"if\", \"inline\", \"register\", \"restrict\", \"return\", \"sizeof\", \"static\", \"struct\", \"switch\", \"typedef\", \"union\", \"volatile\", \"while\"]);\nconst cTypes = new Set([\"bool\", \"char\", \"double\", \"float\", \"int\", \"int16_t\", \"int32_t\", \"int64_t\", \"int8_t\", \"long\", \"short\", \"size_t\", \"uint16_t\", \"uint32_t\", \"uint64_t\", \"uint8_t\", \"void\"]);\n\nconst cppKeywords = new Set([...cKeywords, \"alignas\", \"alignof\", \"and\", \"bitand\", \"bitor\", \"catch\", \"class\", \"concept\", \"constexpr\", \"consteval\", \"constinit\", \"decltype\", \"delete\", \"explicit\", \"export\", \"friend\", \"mutable\", \"namespace\", \"new\", \"noexcept\", \"not\", \"operator\", \"or\", \"private\", \"protected\", \"public\", \"requires\", \"template\", \"this\", \"throw\", \"try\", \"typename\", \"using\", \"virtual\", \"xor\"]);\nconst cppTypes = new Set([...cTypes, \"auto\", \"bool\", \"char16_t\", \"char32_t\", \"std\", \"string\", \"wstring\"]);\nconst cppBooleans = new Set([\"true\", \"false\"]);\nconst cppNulls = new Set([\"nullptr\", \"NULL\"]);\n\nconst csharpKeywords = new Set([\"abstract\", \"as\", \"base\", \"break\", \"case\", \"catch\", \"checked\", \"class\", \"const\", \"continue\", \"default\", \"delegate\", \"do\", \"else\", \"enum\", \"event\", \"explicit\", \"extern\", \"finally\", \"fixed\", \"for\", \"foreach\", \"if\", \"implicit\", \"in\", \"interface\", \"internal\", \"is\", \"lock\", \"namespace\", \"new\", \"operator\", \"out\", \"override\", \"params\", \"private\", \"protected\", \"public\", \"readonly\", \"record\", \"ref\", \"return\", \"sealed\", \"sizeof\", \"stackalloc\", \"static\", \"struct\", \"switch\", \"this\", \"throw\", \"try\", \"typeof\", \"unchecked\", \"unsafe\", \"using\", \"virtual\", \"void\", \"volatile\", \"while\"]);\nconst csharpTypes = new Set([\"bool\", \"byte\", \"char\", \"decimal\", \"double\", \"dynamic\", \"float\", \"int\", \"long\", \"nint\", \"nuint\", \"object\", \"sbyte\", \"short\", \"string\", \"uint\", \"ulong\", \"ushort\", \"var\"]);\n\nconst objectiveCKeywords = new Set([...cKeywords, \"@autoreleasepool\", \"@catch\", \"@class\", \"@dynamic\", \"@end\", \"@finally\", \"@implementation\", \"@import\", \"@interface\", \"@optional\", \"@package\", \"@private\", \"@property\", \"@protected\", \"@protocol\", \"@public\", \"@selector\", \"@synthesize\", \"@throw\", \"@try\", \"YES\", \"NO\", \"nil\", \"self\", \"super\"]);\nconst objectiveCTypes = new Set([...cTypes, \"BOOL\", \"Class\", \"CGFloat\", \"NSInteger\", \"NSObject\", \"NSString\", \"NSUInteger\", \"SEL\", \"id\"]);\n\nconst rustKeywords = new Set([\"as\", \"async\", \"await\", \"box\", \"break\", \"const\", \"continue\", \"crate\", \"dyn\", \"else\", \"enum\", \"extern\", \"false\", \"fn\", \"for\", \"if\", \"impl\", \"in\", \"let\", \"loop\", \"match\", \"mod\", \"move\", \"mut\", \"pub\", \"ref\", \"return\", \"self\", \"Self\", \"static\", \"struct\", \"super\", \"trait\", \"true\", \"type\", \"unsafe\", \"use\", \"where\", \"while\"]);\nconst rustTypes = new Set([\"Box\", \"Option\", \"Result\", \"Some\", \"String\", \"Vec\", \"bool\", \"char\", \"f32\", \"f64\", \"i128\", \"i16\", \"i32\", \"i64\", \"i8\", \"isize\", \"str\", \"u128\", \"u16\", \"u32\", \"u64\", \"u8\", \"usize\"]);\nconst rustBooleans = new Set([\"true\", \"false\"]);\nconst rustNulls = new Set([\"None\"]);\n\nconst phpKeywords = new Set([\"abstract\", \"and\", \"array\", \"as\", \"break\", \"callable\", \"case\", \"catch\", \"class\", \"clone\", \"const\", \"continue\", \"declare\", \"default\", \"do\", \"echo\", \"else\", \"elseif\", \"empty\", \"enddeclare\", \"endfor\", \"endforeach\", \"endif\", \"endswitch\", \"endwhile\", \"enum\", \"extends\", \"final\", \"finally\", \"fn\", \"for\", \"foreach\", \"function\", \"global\", \"if\", \"implements\", \"include\", \"instanceof\", \"interface\", \"isset\", \"match\", \"namespace\", \"new\", \"or\", \"private\", \"protected\", \"public\", \"readonly\", \"require\", \"return\", \"static\", \"switch\", \"throw\", \"trait\", \"try\", \"use\", \"var\", \"while\", \"xor\", \"yield\"]);\nconst phpTypes = new Set([\"array\", \"bool\", \"callable\", \"false\", \"float\", \"int\", \"iterable\", \"mixed\", \"never\", \"null\", \"object\", \"self\", \"static\", \"string\", \"true\", \"void\"]);\n\nconst luaKeywords = new Set([\"and\", \"break\", \"do\", \"else\", \"elseif\", \"end\", \"false\", \"for\", \"function\", \"goto\", \"if\", \"in\", \"local\", \"nil\", \"not\", \"or\", \"repeat\", \"return\", \"then\", \"true\", \"until\", \"while\"]);\nconst perlKeywords = new Set([\"continue\", \"do\", \"else\", \"elsif\", \"for\", \"foreach\", \"given\", \"if\", \"last\", \"local\", \"my\", \"next\", \"our\", \"package\", \"redo\", \"require\", \"return\", \"state\", \"sub\", \"unless\", \"until\", \"use\", \"when\", \"while\"]);\nconst rKeywords = new Set([\"break\", \"else\", \"FALSE\", \"for\", \"function\", \"if\", \"Inf\", \"in\", \"NA\", \"NaN\", \"next\", \"NULL\", \"repeat\", \"return\", \"TRUE\", \"while\"]);\nconst powershellKeywords = new Set([\"begin\", \"break\", \"catch\", \"class\", \"continue\", \"data\", \"default\", \"do\", \"dynamicparam\", \"else\", \"elseif\", \"end\", \"enum\", \"exit\", \"filter\", \"finally\", \"for\", \"foreach\", \"from\", \"function\", \"if\", \"in\", \"param\", \"process\", \"return\", \"switch\", \"throw\", \"trap\", \"try\", \"until\", \"using\", \"var\", \"while\"]);\nconst elixirKeywords = new Set([\"after\", \"alias\", \"and\", \"case\", \"catch\", \"cond\", \"def\", \"defdelegate\", \"defexception\", \"defimpl\", \"defmacro\", \"defmodule\", \"defp\", \"defprotocol\", \"defstruct\", \"do\", \"else\", \"end\", \"false\", \"fn\", \"for\", \"if\", \"import\", \"in\", \"nil\", \"not\", \"or\", \"quote\", \"raise\", \"receive\", \"require\", \"rescue\", \"super\", \"throw\", \"true\", \"try\", \"unless\", \"unquote\", \"use\", \"when\", \"with\"]);\nconst erlangKeywords = new Set([\"after\", \"and\", \"andalso\", \"band\", \"begin\", \"bnot\", \"bor\", \"bsl\", \"bsr\", \"bxor\", \"case\", \"catch\", \"cond\", \"div\", \"end\", \"fun\", \"if\", \"let\", \"not\", \"of\", \"or\", \"orelse\", \"receive\", \"rem\", \"try\", \"when\", \"xor\"]);\nconst haskellKeywords = new Set([\"as\", \"case\", \"class\", \"data\", \"default\", \"deriving\", \"do\", \"else\", \"family\", \"forall\", \"foreign\", \"hiding\", \"if\", \"import\", \"in\", \"infix\", \"infixl\", \"infixr\", \"instance\", \"let\", \"module\", \"newtype\", \"of\", \"qualified\", \"then\", \"type\", \"where\"]);\nconst clojureKeywords = new Set([\"def\", \"defmacro\", \"defmethod\", \"defmulti\", \"defn\", \"defonce\", \"do\", \"doseq\", \"false\", \"fn\", \"for\", \"if\", \"let\", \"loop\", \"nil\", \"ns\", \"quote\", \"recur\", \"require\", \"true\", \"try\", \"when\"]);\nconst fsharpKeywords = new Set([\"abstract\", \"and\", \"as\", \"assert\", \"base\", \"begin\", \"class\", \"default\", \"delegate\", \"do\", \"done\", \"downcast\", \"downto\", \"elif\", \"else\", \"end\", \"exception\", \"extern\", \"false\", \"finally\", \"for\", \"fun\", \"function\", \"global\", \"if\", \"in\", \"inherit\", \"inline\", \"interface\", \"internal\", \"lazy\", \"let\", \"match\", \"member\", \"module\", \"mutable\", \"namespace\", \"new\", \"null\", \"of\", \"open\", \"or\", \"override\", \"private\", \"public\", \"rec\", \"return\", \"static\", \"struct\", \"then\", \"to\", \"true\", \"try\", \"type\", \"upcast\", \"use\", \"val\", \"void\", \"when\", \"while\", \"with\", \"yield\"]);\nconst vbKeywords = new Set([\"AddHandler\", \"And\", \"As\", \"Boolean\", \"ByRef\", \"Byte\", \"ByVal\", \"Call\", \"Case\", \"Catch\", \"Class\", \"Const\", \"Continue\", \"Date\", \"Decimal\", \"Dim\", \"Do\", \"Double\", \"Each\", \"Else\", \"ElseIf\", \"End\", \"Enum\", \"Erase\", \"Error\", \"Event\", \"Exit\", \"False\", \"Finally\", \"For\", \"Friend\", \"Function\", \"Get\", \"Global\", \"GoTo\", \"Handles\", \"If\", \"Implements\", \"Imports\", \"In\", \"Inherits\", \"Integer\", \"Interface\", \"Is\", \"Let\", \"Lib\", \"Like\", \"Long\", \"Loop\", \"Me\", \"Mod\", \"Module\", \"MustInherit\", \"MustOverride\", \"MyBase\", \"Namespace\", \"New\", \"Next\", \"Not\", \"Nothing\", \"Object\", \"Of\", \"On\", \"Option\", \"Or\", \"Overloads\", \"Overrides\", \"ParamArray\", \"Partial\", \"Private\", \"Property\", \"Protected\", \"Public\", \"RaiseEvent\", \"ReadOnly\", \"ReDim\", \"REM\", \"RemoveHandler\", \"Resume\", \"Return\", \"Select\", \"Set\", \"Shadows\", \"Shared\", \"Short\", \"Single\", \"Static\", \"Step\", \"Stop\", \"String\", \"Structure\", \"Sub\", \"SyncLock\", \"Then\", \"Throw\", \"To\", \"True\", \"Try\", \"Using\", \"Variant\", \"Wend\", \"When\", \"While\", \"With\", \"WithEvents\", \"WriteOnly\"]);\nconst graphqlKeywords = new Set([\"directive\", \"enum\", \"extend\", \"false\", \"fragment\", \"implements\", \"input\", \"interface\", \"mutation\", \"null\", \"on\", \"query\", \"repeatable\", \"scalar\", \"schema\", \"subscription\", \"true\", \"type\", \"union\"]);\nconst protobufKeywords = new Set([\"bool\", \"bytes\", \"double\", \"enum\", \"false\", \"fixed32\", \"fixed64\", \"float\", \"import\", \"int32\", \"int64\", \"map\", \"message\", \"oneof\", \"optional\", \"package\", \"proto2\", \"proto3\", \"public\", \"repeated\", \"reserved\", \"returns\", \"rpc\", \"service\", \"sfixed32\", \"sfixed64\", \"sint32\", \"sint64\", \"stream\", \"string\", \"syntax\", \"to\", \"true\", \"uint32\", \"uint64\"]);\nconst hclKeywords = new Set([\"and\", \"bool\", \"data\", \"dynamic\", \"false\", \"for\", \"if\", \"in\", \"locals\", \"module\", \"null\", \"number\", \"or\", \"output\", \"provider\", \"resource\", \"string\", \"terraform\", \"true\", \"variable\"]);\nconst nginxKeywords = new Set([\"access_log\", \"add_header\", \"deny\", \"error_log\", \"events\", \"fastcgi_pass\", \"gzip\", \"http\", \"include\", \"index\", \"listen\", \"location\", \"log_format\", \"proxy_pass\", \"return\", \"rewrite\", \"root\", \"server\", \"server_name\", \"try_files\", \"upstream\"]);\nconst makefileKeywords = new Set([\"define\", \"else\", \"endef\", \"endif\", \"export\", \"ifneq\", \"ifeq\", \"ifdef\", \"ifndef\", \"include\", \"override\", \"private\", \"sinclude\", \"undefine\", \"unexport\", \"vpath\"]);\nconst cmakeKeywords = new Set([\"add_compile_definitions\", \"add_custom_command\", \"add_custom_target\", \"add_executable\", \"add_library\", \"cmake_minimum_required\", \"else\", \"elseif\", \"endforeach\", \"endif\", \"endfunction\", \"endmacro\", \"find_package\", \"foreach\", \"function\", \"if\", \"include\", \"macro\", \"message\", \"option\", \"project\", \"return\", \"set\", \"target_compile_features\", \"target_include_directories\", \"target_link_libraries\"]);\n\nconst lexicalSpecs: Readonly<Record<string, LexicalSpec>> = {\n javascript: {\n keywords: jsKeywords,\n constants: jsConstants,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n typescript: {\n keywords: tsKeywords,\n types: tsTypes,\n constants: jsConstants,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n shell: {\n keywords: shellKeywords,\n commands: shellCommands,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n python: {\n keywords: pythonKeywords,\n types: pythonTypes,\n booleans: pythonBooleans,\n nulls: pythonNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n tripleStringQuotes: true,\n decorators: true\n },\n sql: {\n keywords: sqlKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"--\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n caseInsensitive: true\n },\n ruby: {\n keywords: rubyKeywords,\n booleans: rubyBooleans,\n nulls: rubyNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n go: {\n keywords: goKeywords,\n types: goTypes,\n booleans: goBooleans,\n nulls: goNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\", \"`\"]\n },\n java: {\n keywords: javaKeywords,\n types: javaTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n kotlin: {\n keywords: kotlinKeywords,\n types: kotlinTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n swift: {\n keywords: swiftKeywords,\n types: swiftTypes,\n booleans: cppBooleans,\n nulls: new Set([\"nil\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n dart: {\n keywords: dartKeywords,\n types: dartTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n scala: {\n keywords: scalaKeywords,\n types: scalaTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n groovy: {\n keywords: groovyKeywords,\n types: groovyTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n c: {\n keywords: cKeywords,\n types: cTypes,\n booleans: cppBooleans,\n nulls: cppNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n cpp: {\n keywords: cppKeywords,\n types: cppTypes,\n booleans: cppBooleans,\n nulls: cppNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n csharp: {\n keywords: csharpKeywords,\n types: csharpTypes,\n booleans: cppBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n objectivec: {\n keywords: objectiveCKeywords,\n types: objectiveCTypes,\n booleans: new Set([\"YES\", \"NO\", \"true\", \"false\"]),\n nulls: new Set([\"nil\", \"NULL\", \"nullptr\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n rust: {\n keywords: rustKeywords,\n types: rustTypes,\n booleans: rustBooleans,\n nulls: rustNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n rustAttributes: true\n },\n php: {\n keywords: phpKeywords,\n types: phpTypes,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\", \"#\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\"\n },\n lua: {\n keywords: luaKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\"--\"],\n stringQuotes: ['\"', \"'\"]\n },\n perl: {\n keywords: perlKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"undef\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\"\n },\n r: {\n keywords: rKeywords,\n booleans: new Set([\"TRUE\", \"FALSE\", \"T\", \"F\"]),\n nulls: new Set([\"NULL\", \"NA\", \"NaN\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n powershell: {\n keywords: powershellKeywords,\n booleans: new Set([\"$true\", \"$false\", \"true\", \"false\"]),\n nulls: new Set([\"$null\", \"null\"]),\n commands: new Set([\"Get-ChildItem\", \"Get-Content\", \"Invoke-Run\", \"Join-Path\", \"New-Item\", \"Remove-Item\", \"Set-Content\", \"Test-Path\", \"Write-Host\", \"Write-Output\"]),\n lineComments: [\"#\"],\n blockComments: [{ start: \"<#\", end: \"#>\" }],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n elixir: {\n keywords: elixirKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n erlang: {\n keywords: erlangKeywords,\n booleans: new Set([\"true\", \"false\"]),\n lineComments: [\"%\"],\n stringQuotes: ['\"', \"'\"]\n },\n haskell: {\n keywords: haskellKeywords,\n types: new Set([\"Bool\", \"Char\", \"Double\", \"Either\", \"False\", \"Float\", \"IO\", \"Int\", \"Integer\", \"Maybe\", \"Nothing\", \"String\", \"True\"]),\n booleans: new Set([\"True\", \"False\"]),\n nulls: new Set([\"Nothing\"]),\n lineComments: [\"--\"],\n blockComments: [{ start: \"{-\", end: \"-}\" }],\n stringQuotes: ['\"', \"'\"]\n },\n clojure: {\n keywords: clojureKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\";\"],\n stringQuotes: ['\"']\n },\n fsharp: {\n keywords: fsharpKeywords,\n types: new Set([\"Async\", \"bool\", \"decimal\", \"float\", \"int\", \"list\", \"Map\", \"option\", \"Result\", \"seq\", \"string\", \"unit\"]),\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\", \"None\"]),\n lineComments: [\"//\"],\n blockComments: [{ start: \"(*\", end: \"*)\" }],\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n vb: {\n keywords: vbKeywords,\n types: new Set([\"Boolean\", \"Byte\", \"Date\", \"Decimal\", \"Double\", \"Integer\", \"Long\", \"Object\", \"Short\", \"Single\", \"String\"]),\n booleans: new Set([\"True\", \"False\"]),\n nulls: new Set([\"Nothing\", \"Null\"]),\n lineComments: [\"'\"],\n stringQuotes: ['\"'],\n caseInsensitive: true\n },\n graphql: {\n keywords: graphqlKeywords,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"']\n },\n protobuf: {\n keywords: protobufKeywords,\n types: new Set([\"Any\", \"Duration\", \"Timestamp\"]),\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n hcl: {\n keywords: hclKeywords,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"#\", \"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n nginx: {\n keywords: nginxKeywords,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n makefile: {\n keywords: makefileKeywords,\n commands: shellCommands,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n cmake: {\n keywords: cmakeKeywords,\n booleans: new Set([\"ON\", \"OFF\", \"TRUE\", \"FALSE\"]),\n nulls: new Set([\"NOTFOUND\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n caseInsensitive: true\n }\n};\n\nconst tokenizers: Readonly<Record<CodeHighlightFamily, CodeTokenizer>> = {\n lexical: tokenizeLexical,\n data: tokenizeData,\n style: tokenizeStyle,\n line: tokenizeLine,\n markup: tokenizeMarkup\n};\n\nexport function highlightCodeBlock(\n node: Pick<Extract<MdNode, { type: \"code\" }>, \"lang\" | \"value\" | \"tokens\">\n): CodeToken[] | undefined {\n if (node.tokens !== undefined) {\n return node.tokens;\n }\n\n const language = resolveCodeLanguage(node.lang);\n if (\n language === undefined ||\n language.plain === true ||\n language.family === undefined ||\n node.value.length === 0\n ) {\n return undefined;\n }\n\n const tokenize = tokenizers[language.family];\n const tokens = tokenize(node.value, language);\n\n return tokens.some((token) => token.kind !== \"plain\") ? tokens : undefined;\n}\n\nfunction resolveCodeLanguage(lang: string | undefined): CodeLanguageInfo | undefined {\n if (lang === undefined || lang.length === 0) {\n return undefined;\n }\n\n return languageByAlias.get(lang.toLowerCase());\n}\n\nfunction tokenizeLexical(source: string, language: CodeLanguageInfo): CodeToken[] {\n const spec = lexicalSpecs[language.spec ?? \"\"];\n if (spec === undefined) {\n return [{ kind: \"plain\", value: source }];\n }\n\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n const char = source[index]!;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n const lineCommentEnd = readAnyLineComment(source, index, spec.lineComments ?? []);\n if (lineCommentEnd > index) {\n emitter.push(\"comment\", index, lineCommentEnd);\n index = lineCommentEnd;\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, spec.blockComments ?? []);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n\n if (spec.rustAttributes === true && source.startsWith(\"#[\", index)) {\n index = readUntil(source, index + 2, \"]\");\n emitter.push(\"decorator\", start, index);\n continue;\n }\n\n if (spec.decorators === true && char === \"@\" && isIdentifierStart(source[index + 1] ?? \"\")) {\n index = readIdentifier(source, index + 1);\n emitter.push(\"decorator\", start, index);\n continue;\n }\n\n if (spec.variablePrefix === \"$\" && char === \"$\" && isIdentifierStart(source[index + 1] ?? \"\")) {\n index = readIdentifier(source, index + 1);\n const variableKind = classifyLexicalWord(source.slice(start, index), spec);\n emitter.push(variableKind === \"plain\" ? \"variable\" : variableKind, start, index);\n continue;\n }\n\n const commandEnd = readCommandIdentifier(source, index);\n if (commandEnd > index) {\n const commandKind = classifyLexicalWord(source.slice(start, commandEnd), spec);\n if (commandKind === \"command\") {\n emitter.push(\"command\", start, commandEnd);\n index = commandEnd;\n continue;\n }\n }\n\n if (spec.flags === true && char === \"-\" && isFlagStart(source[index + 1] ?? \"\")) {\n index = readFlag(source, index + 1);\n emitter.push(\"flag\", start, index);\n continue;\n }\n\n if (\n spec.tripleStringQuotes === true &&\n (char === '\"' || char === \"'\") &&\n source.startsWith(char.repeat(3), index)\n ) {\n index = readTripleQuotedString(source, index, char);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n if ((spec.stringQuotes ?? []).includes(char)) {\n index = readQuotedString(source, index, char);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n if (spec.templateQuotes === true && char === \"`\") {\n index = readQuotedString(source, index, \"`\");\n emitter.push(\"template\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyLexicalWord(source.slice(start, index), spec), start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeData(source: string, language: CodeLanguageInfo): CodeToken[] {\n if (language.spec === \"toml\" || language.spec === \"ini\") {\n return tokenizeConfig(source);\n }\n\n return language.spec === \"yaml\" ? tokenizeYaml(source) : tokenizeJsonLike(source, language.spec === \"jsonc\");\n}\n\nfunction tokenizeJsonLike(source: string, allowComments: boolean): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n if (allowComments) {\n const lineCommentEnd = readAnyLineComment(source, index, [\"//\"]);\n if (lineCommentEnd > index) {\n emitter.push(\"comment\", index, lineCommentEnd);\n index = lineCommentEnd;\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, cStyleBlockComments);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n }\n\n if (source[index] === '\"') {\n index = readQuotedString(source, index, '\"');\n emitter.push(isJsonKey(source, index) ? \"key\" : \"string\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeYaml(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n const whitespaceEnd = readSpacesAndTabs(source, index);\n if (whitespaceEnd > index) {\n emitter.pushPlain(index, whitespaceEnd);\n index = whitespaceEnd;\n continue;\n }\n\n if (source[index] === \"#\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart) {\n const keyEnd = readYamlKey(source, index);\n if (keyEnd > index) {\n emitter.push(\"key\", index, keyEnd);\n index = keyEnd;\n atLineStart = false;\n continue;\n }\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeStyle(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, cStyleBlockComments);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n\n if (source[index] === \"@\") {\n index = readCssName(source, index + 1);\n if (index > start + 1) {\n emitter.push(\"at-rule\", start, index);\n continue;\n }\n }\n\n if (source[index] === \"#\" && isHex(source[index + 1] ?? \"\")) {\n index = readCssColor(source, index + 1);\n emitter.push(\"color\", start, index);\n continue;\n }\n\n if (source.startsWith(\"!important\", index)) {\n index += \"!important\".length;\n emitter.push(\"important\", start, index);\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readCssName(source, index);\n if (index > start) {\n emitter.push(isCssProperty(source, index) ? \"property\" : \"selector\", start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeConfig(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n index = readSpacesAndTabs(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n if (source[index] === \"#\" || source[index] === \";\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && source[index] === \"[\") {\n index = readUntil(source, index + 1, \"]\");\n emitter.push(\"selector\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart) {\n const keyEnd = readConfigKey(source, index);\n if (keyEnd > index) {\n emitter.push(\"key\", index, keyEnd);\n index = keyEnd;\n atLineStart = false;\n continue;\n }\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeLine(source: string, language: CodeLanguageInfo): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n if (atLineStart && language.spec === \"diff\" && (source[index] === \"+\" || source[index] === \"-\")) {\n index = readUntilLineEnd(source, index);\n emitter.push(source[start] === \"+\" ? \"string\" : \"important\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && language.spec === \"markdown\" && source[index] === \"#\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"keyword\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && language.spec === \"dockerfile\") {\n const directiveEnd = readIdentifier(source, index);\n if (directiveEnd > index) {\n emitter.push(\"directive\", index, directiveEnd);\n index = directiveEnd;\n atLineStart = false;\n continue;\n }\n }\n\n if (source[index] === \"#\" && language.spec !== \"diff\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeMarkup(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n if (source.startsWith(\"<!--\", index)) {\n index = readUntil(source, index + 4, \"-->\");\n emitter.push(\"comment\", start, index);\n continue;\n }\n\n if (source[index] === \"<\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n if (source[index] === \"/\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n }\n\n const tagStart = index;\n index = readIdentifier(source, index);\n if (index > tagStart) {\n emitter.push(\"tag\", tagStart, index);\n }\n\n while (index < source.length && source[index] !== \">\") {\n const innerStart = index;\n index = readWhitespace(source, index);\n if (index > innerStart) {\n emitter.pushPlain(innerStart, index);\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", innerStart, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > innerStart) {\n emitter.push(\"attribute\", innerStart, index);\n continue;\n }\n\n emitter.push(\"punctuation\", innerStart, innerStart + 1);\n index = innerStart + 1;\n }\n\n if (source[index] === \">\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n }\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction createEmitter(source: string): TokenEmitter & { tokens: CodeToken[] } {\n const tokens: CodeToken[] = [];\n\n return {\n tokens,\n push(kind, start, end) {\n pushToken(tokens, source, kind, start, end);\n },\n pushPlain(start, end) {\n pushToken(tokens, source, \"plain\", start, end);\n }\n };\n}\n\nfunction pushToken(\n tokens: CodeToken[],\n source: string,\n kind: CodeTokenKind,\n start: number,\n end: number\n): void {\n if (end <= start) {\n return;\n }\n\n const value = source.slice(start, end);\n const previous = tokens[tokens.length - 1];\n if (previous?.kind === kind) {\n previous.value += value;\n return;\n }\n\n tokens.push({ kind, value });\n}\n\nfunction classifyLexicalWord(word: string, spec: LexicalSpec): CodeTokenKind {\n const lookup = spec.caseInsensitive === true ? word.toLowerCase() : word;\n\n if (spec.booleans?.has(lookup) === true || spec.booleans?.has(word) === true) {\n return \"boolean\";\n }\n\n if (spec.nulls?.has(lookup) === true || spec.nulls?.has(word) === true) {\n return \"null\";\n }\n\n if (spec.keywords?.has(lookup) === true || spec.keywords?.has(word) === true) {\n return \"keyword\";\n }\n\n if (spec.types?.has(lookup) === true || spec.types?.has(word) === true) {\n return \"type\";\n }\n\n if (spec.commands?.has(lookup) === true || spec.commands?.has(word) === true) {\n return \"command\";\n }\n\n if (spec.constants?.has(lookup) === true || spec.constants?.has(word) === true) {\n return \"number\";\n }\n\n return \"plain\";\n}\n\nfunction classifyDataWord(word: string): CodeTokenKind {\n switch (word) {\n case \"true\":\n case \"false\":\n return \"boolean\";\n case \"null\":\n case \"Null\":\n case \"NULL\":\n case \"~\":\n return \"null\";\n default:\n return \"plain\";\n }\n}\n\nfunction readWhitespace(source: string, index: number): number {\n while (index < source.length && isWhitespace(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readSpacesAndTabs(source: string, index: number): number {\n while (index < source.length && (source[index] === \" \" || source[index] === \"\\t\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readIdentifier(source: string, index: number): number {\n if (!isIdentifierStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && isIdentifierPart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readCommandIdentifier(source: string, index: number): number {\n if (!isIdentifierStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && (isIdentifierPart(source[index]!) || source[index] === \"-\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readCssName(source: string, index: number): number {\n if (!isCssNameStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && isCssNamePart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readNumber(source: string, index: number): number {\n const start = index;\n if (source[index] === \"-\") {\n index += 1;\n }\n\n let hasDigit = false;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n hasDigit = true;\n }\n\n if (source[index] === \".\" && isDigit(source[index + 1] ?? \"\")) {\n index += 1;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n hasDigit = true;\n }\n }\n\n if (!hasDigit) {\n return start;\n }\n\n if ((source[index] === \"e\" || source[index] === \"E\") && isExponentStart(source[index + 1] ?? \"\")) {\n const exponentStart = index;\n index += 1;\n if (source[index] === \"+\" || source[index] === \"-\") {\n index += 1;\n }\n\n const digitsStart = index;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n }\n\n if (index === digitsStart) {\n return exponentStart;\n }\n }\n\n return index;\n}\n\nfunction readQuotedString(source: string, index: number, quote: string): number {\n index += 1;\n\n while (index < source.length) {\n const char = source[index]!;\n index += 1;\n\n if (char === \"\\\\\") {\n index = Math.min(source.length, index + 1);\n continue;\n }\n\n if (char === quote) {\n return index;\n }\n }\n\n return index;\n}\n\nfunction readTripleQuotedString(source: string, index: number, quote: string): number {\n const marker = quote.repeat(3);\n index += marker.length;\n\n while (index < source.length) {\n if (source.startsWith(marker, index)) {\n return index + marker.length;\n }\n\n if (source[index] === \"\\\\\") {\n index = Math.min(source.length, index + 2);\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction readAnyLineComment(\n source: string,\n index: number,\n markers: readonly string[]\n): number {\n for (const marker of markers) {\n if (source.startsWith(marker, index)) {\n return readUntilLineEnd(source, index);\n }\n }\n\n return index;\n}\n\nfunction readAnyBlockComment(\n source: string,\n index: number,\n delimiters: readonly BlockCommentDelimiter[]\n): number {\n for (const delimiter of delimiters) {\n if (source.startsWith(delimiter.start, index)) {\n return readDelimitedBlock(source, index + delimiter.start.length, delimiter.end);\n }\n }\n\n return index;\n}\n\nfunction readDelimitedBlock(source: string, index: number, endMarker: string): number {\n while (index < source.length) {\n if (source.startsWith(endMarker, index)) {\n return index + endMarker.length;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction readUntilLineEnd(source: string, index: number): number {\n while (index < source.length && source[index] !== \"\\n\") {\n index += 1;\n }\n\n return index;\n}\n\nfunction readUntil(source: string, index: number, marker: string): number {\n while (index < source.length) {\n if (source.startsWith(marker, index)) {\n return index + marker.length;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction readYamlKey(source: string, index: number): number {\n const start = index;\n while (index < source.length) {\n const char = source[index]!;\n if (char === \":\") {\n return index > start ? index : start;\n }\n\n if (char === \"\\n\" || char === \"#\" || char === \"{\" || char === \"}\" || char === \"[\" || char === \"]\") {\n return start;\n }\n\n index += 1;\n }\n\n return start;\n}\n\nfunction readConfigKey(source: string, index: number): number {\n const start = index;\n while (index < source.length) {\n const char = source[index]!;\n if (char === \"=\" || char === \":\") {\n return trimRightIndex(source, start, index);\n }\n\n if (char === \"\\n\" || char === \"#\" || char === \";\") {\n return start;\n }\n\n index += 1;\n }\n\n return start;\n}\n\nfunction readFlag(source: string, index: number): number {\n while (index < source.length && isFlagPart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction trimRightIndex(source: string, start: number, end: number): number {\n while (end > start && (source[end - 1] === \" \" || source[end - 1] === \"\\t\")) {\n end -= 1;\n }\n\n return end;\n}\n\nfunction readCssColor(source: string, index: number): number {\n let count = 0;\n\n while (index < source.length && isHex(source[index]!) && count < 8) {\n index += 1;\n count += 1;\n }\n\n return index;\n}\n\nfunction isJsonKey(source: string, index: number): boolean {\n index = readWhitespace(source, index);\n return source[index] === \":\";\n}\n\nfunction isCssProperty(source: string, index: number): boolean {\n index = readWhitespace(source, index);\n return source[index] === \":\";\n}\n\nfunction isWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\r\" || char === \"\\t\";\n}\n\nfunction isIdentifierStart(char: string): boolean {\n return isAlpha(char) || char === \"_\" || char === \"$\";\n}\n\nfunction isIdentifierPart(char: string): boolean {\n return isIdentifierStart(char) || isDigit(char);\n}\n\nfunction isCssNameStart(char: string): boolean {\n return isAlpha(char) || char === \"_\" || char === \"-\" || char === \".\";\n}\n\nfunction isCssNamePart(char: string): boolean {\n return isCssNameStart(char) || isDigit(char);\n}\n\nfunction isFlagStart(char: string): boolean {\n return isAlpha(char) || char === \"-\";\n}\n\nfunction isFlagPart(char: string): boolean {\n return isAlpha(char) || isDigit(char) || char === \"-\";\n}\n\nfunction isExponentStart(char: string): boolean {\n return isDigit(char) || char === \"+\" || char === \"-\";\n}\n\nfunction isAlpha(char: string): boolean {\n const code = char.charCodeAt(0);\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\n}\n\nfunction isDigit(char: string): boolean {\n const code = char.charCodeAt(0);\n return code >= 48 && code <= 57;\n}\n\nfunction isHex(char: string): boolean {\n const code = char.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 70) ||\n (code >= 97 && code <= 102)\n );\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function graphemes(value: string): string[] {\n return Array.from(graphemeSegmenter.segment(value), ({ segment }) => segment);\n}\n\nexport function displayWidth(value: string, startColumn = 0): number {\n let column = startColumn;\n\n for (const segment of graphemes(value)) {\n if (segment === \"\\t\") {\n column += 8 - (column % 8);\n continue;\n }\n\n column += graphemeWidth(segment);\n }\n\n return column - startColumn;\n}\n\nexport function expandTabs(value: string, startColumn = 0): string {\n let column = startColumn;\n let expanded = \"\";\n\n for (const segment of graphemes(value)) {\n if (segment === \"\\t\") {\n const spaces = 8 - (column % 8);\n expanded += \" \".repeat(spaces);\n column += spaces;\n continue;\n }\n\n expanded += segment;\n column += graphemeWidth(segment);\n }\n\n return expanded;\n}\n\nexport function graphemeWidth(segment: string): number {\n const codePoint = segment.codePointAt(0);\n\n if (codePoint === undefined || isZeroWidthCodePoint(codePoint)) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) || isFlagSegment(segment) ? 2 : 1;\n}\n\nfunction isZeroWidthCodePoint(codePoint: number): boolean {\n return (codePoint >= 0x0300 && codePoint <= 0x036f)\n || (codePoint >= 0x1ab0 && codePoint <= 0x1aff)\n || (codePoint >= 0x1dc0 && codePoint <= 0x1dff)\n || (codePoint >= 0x20d0 && codePoint <= 0x20ff)\n || (codePoint >= 0xfe20 && codePoint <= 0xfe2f);\n}\n\nfunction isFlagSegment(segment: string): boolean {\n const codePoints = [...segment].map((character) => character.codePointAt(0));\n return codePoints.length === 2\n && codePoints.every(\n (codePoint) => codePoint !== undefined && codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f)\n || codePoint === 0x2329\n || codePoint === 0x232a\n || (codePoint >= 0x2e80 && codePoint <= 0x303e)\n || (codePoint >= 0x3041 && codePoint <= 0x33bf)\n || (codePoint >= 0x3400 && codePoint <= 0x4dbf)\n || (codePoint >= 0x4e00 && codePoint <= 0xa4cf)\n || (codePoint >= 0xa960 && codePoint <= 0xa97f)\n || (codePoint >= 0xac00 && codePoint <= 0xd7af)\n || (codePoint >= 0xf900 && codePoint <= 0xfaff)\n || (codePoint >= 0xfe10 && codePoint <= 0xfe19)\n || (codePoint >= 0xfe30 && codePoint <= 0xfe6f)\n || (codePoint >= 0xff00 && codePoint <= 0xff60)\n || (codePoint >= 0xffe0 && codePoint <= 0xffe6)\n || (codePoint >= 0x1b000 && codePoint <= 0x1b0ff)\n || codePoint === 0x1f004\n || codePoint === 0x1f0cf\n || (codePoint >= 0x1f200 && codePoint <= 0x1fffd)\n || (codePoint >= 0x20000 && codePoint <= 0x2fffd)\n || (codePoint >= 0x30000 && codePoint <= 0x3fffd)\n );\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 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 on(event: \"data\", listener: (chunk: Buffer | string) => void): KeypressInput;\n off(event: \"data\", listener: (chunk: Buffer | string) => 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<(chunk: Buffer | string) => 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 = (chunk: Buffer | string) => {\n for (const event of parseKeypressChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"data\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"data\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"data\", 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 if (data.length === 1 && data[0] === 0x1b) {\n return { name: \"escape\", ctrl: false, meta: false, shift: false };\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 parseKeypressChunk(data: Buffer): KeypressEvent[] {\n const events: KeypressEvent[] = [];\n const input = data.toString(\"utf8\");\n let index = 0;\n\n while (index < input.length) {\n const sequence = nextKeySequence(input, index);\n if (sequence.length === 0) {\n break;\n }\n\n const event = parseKeypress(Buffer.from(sequence));\n if (event !== undefined) {\n events.push(event);\n }\n index += sequence.length;\n }\n\n return events;\n}\n\nfunction nextKeySequence(input: string, index: number): string {\n const character = input[index];\n if (character === undefined) {\n return \"\";\n }\n\n if (character !== \"\\u001b\") {\n return character;\n }\n\n const next = input[index + 1];\n if (next === undefined) {\n return character;\n }\n\n if (next !== \"[\") {\n return input.slice(index, index + 2);\n }\n\n for (let cursor = index + 2; cursor < input.length; cursor += 1) {\n const code = input.charCodeAt(cursor);\n if ((code >= 0x40 && code <= 0x7e) || input[cursor] === \"~\") {\n return input.slice(index, cursor + 1);\n }\n }\n\n return input.slice(index);\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const controlCharacter = controlCharacterToKeypress(key?.sequence);\n if (controlCharacter !== undefined) {\n return controlCharacter;\n }\n\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 (isSinglePrintableSequence(sequence)) {\n return sequence;\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 isSinglePrintableSequence(value: string | undefined): boolean {\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 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 controlCharacterToKeypress(sequence: string | undefined): KeypressEvent | undefined {\n if (sequence === \"\\u001f\") {\n return { ch: \"/\", ctrl: true, meta: false, shift: false };\n }\n\n if (sequence !== undefined && sequence.length === 1) {\n const code = sequence.charCodeAt(0);\n if (code >= 1 && code <= 26 && code !== 9 && code !== 10 && code !== 13) {\n return {\n name: String.fromCharCode(code + 96),\n ctrl: true,\n meta: false,\n shift: false\n };\n }\n }\n\n return undefined;\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 { resolveBindings, type ResolvedBindings } from \"./keymap.js\";\n\nexport type Tone = \"success\" | \"warning\" | \"error\" | \"info\" | \"muted\";\n\nexport interface Row {\n id: string;\n title: string;\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n group?: string; // grouped rendering; rows with same group cluster under a header\n}\n\nexport interface DetailItem {\n id: string;\n title?: string; // absent => item fills pane with no cursor / no selection chrome\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n render: (ctx: DetailCtx) => string | Promise<string>;\n renderedContent?: string;\n}\n\nexport interface Detail<R> {\n items: (row: Row, ctx: DetailCtx) => Promise<DetailItem[]>;\n actions?: Action<R>[]; // run against the focused detail item\n}\n\nexport interface DetailCtx { width: number; height: number; signal: AbortSignal; row: Row }\n\nexport interface Action<R> {\n id: string;\n label: string | (() => string); // function form re-evaluated when state changes\n key?: string | string[];\n predicate?: (ctx: ActionContext<R>) => boolean;\n handler: (ctx: ActionContext<R>) => void | Promise<void>;\n destructive?: boolean;\n primary?: boolean; // bound to Enter\n showInFooter?: boolean; // default true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ActionContext<R> {\n row: Row; // currently highlighted left-pane row\n rows: Row[]; // multi-select; falls back to [row] if no selection\n item?: DetailItem; // populated for actions declared under detail.actions\n filter: string;\n refresh: () => Promise<void>;\n suspendAnd: <T>(fn: () => Promise<T>) => Promise<T>;\n openModal: (content: { title: string; content: string }) => void;\n toast: (msg: string, tone?: Tone) => void;\n confirm: (prompt: string) => Promise<boolean>;\n exit: (after?: () => void | Promise<void>) => void;\n}\n\nexport interface ReorderContext {\n refresh: () => Promise<void>;\n toast: (msg: string, tone?: Tone) => void;\n}\n\nexport interface ExplorerConfig<R> {\n title: string;\n rows: () => Promise<Row[]>;\n refresh?: () => Promise<void>;\n detail: Detail<R>;\n actions: Action<R>[];\n reorder?: { onReorder: (orderedIds: string[], ctx?: ReorderContext) => void | Promise<void> };\n multiSelect?: boolean;\n keybindOverrides?: Record<string, string | string[]>;\n emptyHint?: string;\n initialFilter?: string;\n}\n\nexport const REGION_HEADER = 1 << 0;\nexport const REGION_LIST = 1 << 1;\nexport const REGION_DETAIL = 1 << 2;\nexport const REGION_FOOTER = 1 << 3;\nexport const REGION_MODAL = 1 << 4;\nexport const REGION_TOAST = 1 << 5;\nexport const REGION_ALL =\n REGION_HEADER |\n REGION_LIST |\n REGION_DETAIL |\n REGION_FOOTER |\n REGION_MODAL |\n REGION_TOAST;\n\nexport type Dirty = number;\n\nexport type ExplorerLayoutMode =\n | \"wide\"\n | \"medium\"\n | \"narrow-vertical\"\n | \"narrow-list-only\"\n | \"too-narrow\";\n\nexport interface ExplorerSize {\n cols: number;\n rows: number;\n}\n\nexport interface ExplorerState {\n title: string;\n emptyHint: string;\n rows: Row[];\n filtered: number[];\n matchPositions: Map<number, number[]>;\n cursor: number;\n filter: string;\n filterFocused: boolean;\n focused: \"list\" | \"detail\";\n detail: {\n rowId: string | null;\n items: DetailItem[] | null;\n cursor: number;\n scroll: number;\n token: number;\n loading: boolean;\n };\n selected: Set<string>;\n multiSelect: boolean;\n modal:\n | null\n | { kind: \"help\" }\n | { kind: \"confirm\"; action: Action<unknown>; rows: Row[]; resolver: (ok: boolean) => void }\n | { kind: \"palette\"; query: string; cursor: number }\n | { kind: \"content\"; title: string; content: string; scroll: number };\n toast: { message: string; tone: Tone; expiresAt: number } | null;\n dirty: Dirty;\n size: ExplorerSize;\n layout: ExplorerLayoutMode;\n bindings: ResolvedBindings;\n actionState: Map<string, ActionStateEntry>;\n}\n\nexport interface ActionStateEntry {\n available: boolean;\n label: string;\n running?: boolean;\n action?: Action<unknown>;\n source?: \"row\" | \"detail\";\n}\n\nexport function createInitialState<R>(\n config: ExplorerConfig<R>,\n size: ExplorerSize\n): ExplorerState {\n const normalizedSize = {\n cols: normalizeSize(size.cols),\n rows: normalizeSize(size.rows)\n };\n const multiSelect = config.multiSelect ?? true;\n\n return {\n title: config.title,\n emptyHint: config.emptyHint ?? \"No detail\",\n rows: [],\n filtered: [],\n matchPositions: new Map(),\n cursor: 0,\n filter: config.initialFilter ?? \"\",\n filterFocused: false,\n focused: \"list\",\n detail: {\n rowId: null,\n items: null,\n cursor: 0,\n scroll: 0,\n token: 0,\n loading: false\n },\n selected: new Set(),\n multiSelect,\n modal: null,\n toast: null,\n dirty: REGION_ALL,\n size: normalizedSize,\n layout: resolveExplorerLayoutMode(normalizedSize.cols),\n bindings: resolveBindings(config),\n actionState: createInitialActionState(config)\n };\n}\n\nfunction createInitialActionState<R>(\n config: ExplorerConfig<R>\n): Map<string, ActionStateEntry> {\n const state = new Map<string, ActionStateEntry>();\n\n for (const [source, actions] of [[\"row\", config.actions], [\"detail\", config.detail.actions ?? []]] as const) {\n for (const action of actions) {\n if (state.has(action.id)) {\n throw new Error(`Duplicate explorer action id: ${action.id}`);\n }\n\n state.set(action.id, {\n available: true,\n label: typeof action.label === \"function\" ? action.id : action.label,\n action: action as Action<unknown>,\n source\n });\n }\n }\n\n return state;\n}\n\nexport function resolveExplorerLayoutMode(cols: number): ExplorerLayoutMode {\n if (cols < 40) {\n return \"too-narrow\";\n }\n\n if (cols < 80) {\n return \"narrow-list-only\";\n }\n\n if (cols < 100) {\n return \"narrow-vertical\";\n }\n\n if (cols < 120) {\n return \"medium\";\n }\n\n return \"wide\";\n}\n\nfunction normalizeSize(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import { color } from \"../../components/color.js\";\nimport type { PromptStateName } from \"./core.js\";\n\nfunction supportsUnicode(): boolean {\n if (!process.platform.startsWith(\"win\")) {\n return process.env.TERM !== \"linux\";\n }\n\n return Boolean(\n process.env.CI ||\n process.env.WT_SESSION ||\n process.env.TERMINUS_SUBLIME ||\n process.env.ConEmuTask === \"{cmd::Cmder}\" ||\n process.env.TERM_PROGRAM === \"Terminus-Sublime\" ||\n process.env.TERM_PROGRAM === \"vscode\" ||\n process.env.TERM === \"xterm-256color\" ||\n process.env.TERM === \"alacritty\" ||\n process.env.TERMINAL_EMULATOR === \"JetBrains-JediTerm\"\n );\n}\n\nexport const UNICODE = supportsUnicode();\n\nfunction glyph(unicode: string, ascii: string): string {\n return UNICODE ? unicode : ascii;\n}\n\nexport const GLYPHS = {\n stepActive: glyph(\"\u25C6\", \"*\"),\n stepCancel: glyph(\"\u25A0\", \"x\"),\n stepError: glyph(\"\u25B2\", \"x\"),\n stepSubmit: glyph(\"\u25C7\", \"o\"),\n barStart: glyph(\"\u250C\", \"T\"),\n bar: glyph(\"\u2502\", \"|\"),\n barEnd: glyph(\"\u2514\", \"-\"),\n radioActive: glyph(\"\u25CF\", \">\"),\n radioInactive: glyph(\"\u25CB\", \" \"),\n checkboxActive: \"[ ]\",\n checkboxSelected: \"[x]\",\n checkboxInactive: \"[ ]\",\n passwordMask: glyph(\"\u2022\", \"*\"),\n ellipsis: \"...\"\n} as const;\n\nexport function symbol(state: PromptStateName): string {\n if (state === \"cancel\") return color.red(GLYPHS.stepCancel);\n if (state === \"error\") return color.yellow(GLYPHS.stepError);\n if (state === \"submit\") return color.green(GLYPHS.stepSubmit);\n return color.cyan(GLYPHS.stepActive);\n}\n\nexport function symbolBar(state: PromptStateName): string {\n if (state === \"cancel\") return color.red(GLYPHS.bar);\n if (state === \"error\") return color.yellow(GLYPHS.bar);\n if (state === \"submit\") return color.green(GLYPHS.bar);\n return color.cyan(GLYPHS.bar);\n}\n", "import { EventEmitter } from \"node:events\";\nimport * as readline from \"node:readline\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { mapKey, type Action } from \"./keys.js\";\nimport { wrapFrame } from \"./wrap.js\";\n\nconst cursor = {\n hide: \"\\x1b[?25l\",\n show: \"\\x1b[?25h\",\n move: (x: number, y: number) => {\n let output = \"\";\n if (x < 0) output += `\\x1b[${-x}D`;\n if (x > 0) output += `\\x1b[${x}C`;\n if (y < 0) output += `\\x1b[${-y}A`;\n if (y > 0) output += `\\x1b[${y}B`;\n return output;\n }\n};\n\nconst erase = {\n down: \"\\x1b[J\"\n};\n\nexport type PromptStateName = \"initial\" | \"active\" | \"submit\" | \"cancel\" | \"error\";\n\nexport interface PromptState<Value> {\n state: PromptStateName;\n value: Value | undefined;\n error: string;\n cursor: number;\n userInput: string;\n}\n\nexport interface PromptOptions<Value> {\n render: (state: Prompt<Value>) => string;\n initialValue?: Value;\n initialUserInput?: string;\n validate?: (value: Value | undefined) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\ntype InputStream = NodeJS.ReadableStream & {\n isTTY?: boolean;\n setRawMode?: (enabled: boolean) => void;\n unpipe?: () => void;\n};\n\ntype KeyMeta = {\n name?: string;\n ctrl?: boolean;\n};\n\nexport class Prompt<Value> extends EventEmitter {\n state: PromptStateName = \"initial\";\n value: Value | undefined;\n error = \"\";\n userInput = \"\";\n protected _cursor = 0;\n protected input: InputStream;\n protected output: NodeJS.WritableStream;\n private readonly renderFrame: (state: Prompt<Value>) => string;\n private readonly validate?: (value: Value | undefined) => string | Error | undefined;\n private readonly signal?: AbortSignal;\n private readonly trackValue: boolean;\n private previousFrame = \"\";\n private readlineInterface?: readline.Interface;\n private abortListener?: () => void;\n private closed = false;\n\n constructor(opts: PromptOptions<Value>, trackValue = true) {\n super();\n this.input = (opts.input ?? process.stdin) as InputStream;\n this.output = opts.output ?? process.stdout;\n this.renderFrame = opts.render;\n this.validate = opts.validate;\n this.signal = opts.signal;\n this.value = opts.initialValue;\n this.trackValue = trackValue;\n this.userInput = opts.initialUserInput ?? \"\";\n this._cursor = this.userInput.length;\n }\n\n get cursor(): number {\n return this._cursor;\n }\n\n prompt(): Promise<Value | typeof CANCEL> {\n if (this.signal?.aborted) {\n this.state = \"cancel\";\n return Promise.resolve(CANCEL);\n }\n\n if (this.input.isTTY !== true) {\n return this.promptNonTty();\n }\n\n return new Promise((resolve) => {\n const onSubmit = (value: Value | undefined) => resolve(value as Value);\n const onCancel = () => resolve(CANCEL);\n this.once(\"submit\", onSubmit);\n this.once(\"cancel\", onCancel);\n\n this.abortListener = () => {\n this.state = \"cancel\";\n this.emit(\"finalize\");\n this.render();\n this.close();\n };\n this.signal?.addEventListener(\"abort\", this.abortListener, { once: true });\n\n this.readlineInterface = readline.createInterface({\n input: this.input,\n output: undefined,\n tabSize: 2,\n prompt: \"\",\n escapeCodeTimeout: 50,\n terminal: true\n });\n readline.emitKeypressEvents(this.input, this.readlineInterface);\n this.readlineInterface.prompt();\n this.input.on(\"keypress\", this.onKeypress);\n if (this.input.setRawMode) {\n this.input.setRawMode(true);\n }\n this.output.on(\"resize\", this.render);\n this.render();\n });\n }\n\n protected promptNonTty(): Promise<Value | typeof CANCEL> {\n return Promise.reject(new Error(\"Interactive prompt requires a TTY. Set POE_NO_PROMPT=1 to accept defaults non-interactively.\"));\n }\n\n protected readNonTtyLine(): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: this.input, terminal: false });\n let settled = false;\n\n const settle = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n rl.close();\n resolve(value);\n };\n\n rl.once(\"line\", settle);\n rl.once(\"close\", () => settle(rl.line));\n });\n }\n\n protected setValue(value: Value | undefined): void {\n this.value = value;\n this.emit(\"value\", value);\n }\n\n protected setError(message: string): void {\n this.error = message;\n }\n\n protected setUserInput(value: string): void {\n this.userInput = value;\n this._cursor = Math.min(this._cursor, this.userInput.length);\n this.emit(\"userInput\", this.userInput);\n }\n\n protected clearUserInput(): void {\n this.userInput = \"\";\n this._cursor = 0;\n this.emit(\"userInput\", this.userInput);\n }\n\n private readonly onKeypress = (char: string | undefined, key: KeyMeta = {}) => {\n let action = mapKey(key.name, char);\n if (this.trackValue && char && char >= \" \" && key.name !== \"return\" && key.name !== \"enter\" && key.name !== \"escape\") {\n action = undefined;\n }\n\n if (this.trackValue && action !== \"enter\") {\n this.updateTrackedInput(char, key, action);\n }\n\n if (this.state === \"error\") {\n this.state = \"active\";\n this.error = \"\";\n }\n\n if (!this.trackValue && action) {\n this.emit(\"cursor\", action);\n } else if (this.trackValue && action && action !== \"enter\") {\n this.emit(\"cursor\", action);\n }\n\n if (char && /^[yn]$/i.test(char)) {\n this.emit(\"confirm\", char.toLowerCase() === \"y\");\n }\n\n if (char) {\n this.emit(\"key\", char.toLowerCase(), key);\n }\n\n if (action === \"enter\") {\n const error = this.validate?.(this.value);\n if (error) {\n this.error = error instanceof Error ? error.message : error;\n this.state = \"error\";\n } else {\n this.state = \"submit\";\n }\n }\n\n if (action === \"cancel\") {\n this.state = \"cancel\";\n }\n\n if (this.state === \"submit\" || this.state === \"cancel\") {\n this.emit(\"finalize\");\n }\n\n this.render();\n\n if (this.state === \"submit\" || this.state === \"cancel\") {\n this.close();\n }\n };\n\n private updateTrackedInput(char: string | undefined, key: KeyMeta, action: Action | undefined): void {\n if (key.ctrl) {\n if (key.name === \"a\") {\n this._cursor = 0;\n return;\n }\n if (key.name === \"e\") {\n this._cursor = this.userInput.length;\n return;\n }\n if (key.name === \"u\") {\n this.userInput = this.userInput.slice(this._cursor);\n this._cursor = 0;\n this.emit(\"userInput\", this.userInput);\n return;\n }\n if (key.name === \"k\") {\n this.userInput = this.userInput.slice(0, this._cursor);\n this.emit(\"userInput\", this.userInput);\n return;\n }\n }\n\n if (action === \"left\") {\n this._cursor = Math.max(0, this._cursor - 1);\n return;\n }\n if (action === \"right\") {\n this._cursor = Math.min(this.userInput.length, this._cursor + 1);\n return;\n }\n if (action === \"cancel\" || action === \"up\" || action === \"down\" || action === \"space\") {\n return;\n }\n if (key.name === \"backspace\" || char === \"\\b\" || char === \"\\x7f\") {\n if (this._cursor > 0) {\n this.userInput = `${this.userInput.slice(0, this._cursor - 1)}${this.userInput.slice(this._cursor)}`;\n this._cursor -= 1;\n this.emit(\"userInput\", this.userInput);\n }\n return;\n }\n if (key.name === \"delete\") {\n if (this._cursor < this.userInput.length) {\n this.userInput = `${this.userInput.slice(0, this._cursor)}${this.userInput.slice(this._cursor + 1)}`;\n this.emit(\"userInput\", this.userInput);\n }\n return;\n }\n if (!char || char < \" \" || key.ctrl) {\n return;\n }\n\n this.userInput = `${this.userInput.slice(0, this._cursor)}${char}${this.userInput.slice(this._cursor)}`;\n this._cursor += char.length;\n this.emit(\"userInput\", this.userInput);\n }\n\n protected readonly render = () => {\n if (this.closed) {\n return;\n }\n\n const frame = wrapFrame(this.output, this.renderFrame(this) ?? \"\");\n if (frame === this.previousFrame) {\n return;\n }\n\n if (!this.previousFrame) {\n this.output.write(`${cursor.hide}${frame}`);\n this.previousFrame = frame;\n if (this.state === \"initial\") {\n this.state = \"active\";\n }\n return;\n }\n\n const previousLineCount = this.previousFrame.split(\"\\n\").length - 1;\n this.output.write(`${cursor.move(-999, -previousLineCount)}${erase.down}${frame}`);\n this.previousFrame = frame;\n };\n\n protected close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.input.removeListener(\"keypress\", this.onKeypress);\n this.output.removeListener(\"resize\", this.render);\n if (this.abortListener) {\n this.signal?.removeEventListener(\"abort\", this.abortListener);\n }\n this.output.write(`${cursor.show}\\n`);\n if (!process.platform.startsWith(\"win\") && this.input.setRawMode) {\n this.input.setRawMode(false);\n }\n this.readlineInterface?.close();\n this.input.unpipe?.();\n\n if (this.state === \"cancel\") {\n this.emit(\"cancel\");\n } else {\n this.emit(\"submit\", this.value);\n }\n this.removeAllListeners();\n }\n}\n", "export const CANCEL = Symbol.for(\"poe.cancel\");\n\nexport function isCancel(value: unknown): value is typeof CANCEL {\n return value === CANCEL;\n}\n", "export type Action = \"up\" | \"down\" | \"left\" | \"right\" | \"space\" | \"enter\" | \"cancel\";\n\nconst aliases: Record<string, Action> = {\n k: \"up\",\n j: \"down\",\n h: \"left\",\n l: \"right\"\n};\n\nconst keyActions: Record<string, Action> = {\n up: \"up\",\n down: \"down\",\n left: \"left\",\n right: \"right\",\n space: \"space\",\n return: \"enter\",\n enter: \"enter\",\n escape: \"cancel\"\n};\n\nexport function mapKey(name: string | undefined, char: string | undefined): Action | undefined {\n if (char === \"\\x03\") {\n return \"cancel\";\n }\n if (char === \" \") {\n return \"space\";\n }\n if (char !== undefined && aliases[char] !== undefined) {\n return aliases[char];\n }\n\n if (!name) {\n return undefined;\n }\n\n return keyActions[name] ?? aliases[name];\n}\n", "import { wrapAnsi } from \"fast-wrap-ansi\";\nimport stringWidth from \"fast-string-width\";\n\ninterface StreamSize {\n columns?: number;\n rows?: number;\n}\n\nexport function getColumns(output: NodeJS.WritableStream): number {\n return Math.max(1, (output as StreamSize).columns ?? 80);\n}\n\nexport function getRows(output: NodeJS.WritableStream): number {\n return Math.max(1, (output as StreamSize).rows ?? 20);\n}\n\nexport function wrapTextWithPrefix(\n output: NodeJS.WritableStream,\n text: string,\n prefix: string,\n startPrefix = prefix\n): string {\n const width = Math.max(1, getColumns(output) - stringWidth(prefix));\n return wrapAnsi(text, width, { hard: true, trim: false })\n .split(\"\\n\")\n .map((line, index) => `${index === 0 ? startPrefix : prefix}${line}`)\n .join(\"\\n\");\n}\n\nexport function wrapFrame(output: NodeJS.WritableStream, frame: string): string {\n return wrapAnsi(frame, getColumns(output), { hard: true, trim: false });\n}\n", "import { color } from \"../../components/color.js\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { GLYPHS, symbol, symbolBar } from \"./glyphs.js\";\nimport { Prompt } from \"./core.js\";\nimport type { Action } from \"./keys.js\";\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nclass ConfirmPrompt extends Prompt<boolean> {\n constructor(opts: ConfirmOptions) {\n super({\n ...opts,\n initialValue: opts.initialValue ?? true,\n render: (prompt) => renderConfirmPrompt(prompt as ConfirmPrompt, opts)\n }, false);\n\n this.on(\"confirm\", (value: boolean) => {\n this.setValue(value);\n this.state = \"submit\";\n this.emit(\"finalize\");\n this.render();\n this.close();\n });\n this.on(\"cursor\", (action: Action) => {\n if (action === \"up\" || action === \"down\" || action === \"left\" || action === \"right\") {\n this.setValue(!this.value);\n }\n });\n }\n\n protected override promptNonTty(): Promise<boolean | typeof CANCEL> {\n if (process.env.POE_NO_PROMPT === \"1\") {\n return Promise.resolve(this.value ?? true);\n }\n return super.promptNonTty();\n }\n}\n\nfunction choices(value: boolean | undefined): string {\n const yes = value ? `${color.green(GLYPHS.radioActive)} ${color.bold(\"Yes\")}` : `${color.dim(GLYPHS.radioInactive)} ${color.dim(\"Yes\")}`;\n const no = value ? `${color.dim(GLYPHS.radioInactive)} ${color.dim(\"No\")}` : `${color.green(GLYPHS.radioActive)} ${color.bold(\"No\")}`;\n return `${yes} ${color.dim(\"/\")} ${no}`;\n}\n\nfunction renderConfirmPrompt(prompt: ConfirmPrompt, opts: ConfirmOptions): string {\n if (prompt.state === \"submit\") {\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${color.gray(GLYPHS.bar)} ${color.dim(prompt.value ? \"Yes\" : \"No\")}\\n${color.green(GLYPHS.barEnd)}`;\n }\n if (prompt.state === \"cancel\") {\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${color.gray(GLYPHS.bar)} ${color.dim.strikethrough(prompt.value ? \"Yes\" : \"No\")}\\n${color.red(GLYPHS.barEnd)}`;\n }\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${symbolBar(prompt.state)} ${choices(prompt.value)}\\n${color.cyan(GLYPHS.barEnd)}`;\n}\n\nexport function confirmPrompt(opts: ConfirmOptions): Promise<boolean | typeof CANCEL> {\n return new ConfirmPrompt(opts).prompt();\n}\n", "import { color } from \"../../components/color.js\";\nimport { GLYPHS } from \"./glyphs.js\";\nimport { getColumns, getRows } from \"./wrap.js\";\nimport { wrapAnsi } from \"fast-wrap-ansi\";\n\nexport interface PaginationOptions<Option> {\n cursor: number;\n options: Option[];\n style: (option: Option, active: boolean) => string;\n output: NodeJS.WritableStream;\n maxItems?: number;\n columnPadding?: number;\n rowPadding?: number;\n}\n\nfunction countLines(values: string[]): number {\n return values.reduce((sum, value) => sum + value.split(\"\\n\").length, 0);\n}\n\nfunction trimToRows(values: string[], cursorOffset: number, rows: number, hasTop: boolean, hasBottom: boolean): string[] {\n const output = [...values];\n while (countLines(output) > rows && output.length > 1) {\n const removeFromTop = hasTop && cursorOffset > 0;\n const removeFromBottom = hasBottom && cursorOffset < output.length - 1;\n if (removeFromTop) {\n output.shift();\n cursorOffset -= 1;\n } else if (removeFromBottom) {\n output.pop();\n } else {\n output.pop();\n }\n }\n return output;\n}\n\nexport function limitOptions<Option>(opts: PaginationOptions<Option>): string[] {\n const {\n cursor,\n options,\n style,\n output,\n maxItems = Number.POSITIVE_INFINITY,\n columnPadding = 0,\n rowPadding = 4\n } = opts;\n\n if (options.length === 0) {\n return [];\n }\n\n const columns = Math.max(1, getColumns(output) - columnPadding);\n const rowBudget = Math.max(getRows(output) - rowPadding, 0);\n const visibleCount = Math.max(Math.min(maxItems, rowBudget), 5);\n const cappedVisibleCount = Math.min(visibleCount, options.length);\n let start = 0;\n\n if (cursor >= cappedVisibleCount - 3) {\n start = Math.max(Math.min(cursor - cappedVisibleCount + 3, options.length - cappedVisibleCount), 0);\n }\n\n const hasTopMarker = cappedVisibleCount < options.length && start > 0;\n const hasBottomMarker = cappedVisibleCount < options.length && start + cappedVisibleCount < options.length;\n const visible = options\n .slice(start, start + cappedVisibleCount)\n .map((option, index) => wrapAnsi(style(option, start + index === cursor), columns, { hard: true, trim: false }));\n const trimmed = trimToRows(\n visible,\n Math.max(cursor - start, 0),\n Math.max(rowBudget - Number(hasTopMarker) - Number(hasBottomMarker), 1),\n hasTopMarker,\n hasBottomMarker\n );\n\n if (hasTopMarker) {\n trimmed.unshift(color.dim(GLYPHS.ellipsis));\n }\n if (hasBottomMarker) {\n trimmed.push(color.dim(GLYPHS.ellipsis));\n }\n\n return trimmed;\n}\n", "import { color } from \"../../components/color.js\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { GLYPHS, symbol } from \"./glyphs.js\";\nimport { Prompt } from \"./core.js\";\nimport { limitOptions } from \"./pagination.js\";\nimport type { Action } from \"./keys.js\";\n\nexport interface SelectOption<Value> {\n value: Value;\n label: string;\n hint?: string;\n disabled?: boolean;\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<SelectOption<Value>>;\n initialValue?: Value;\n maxItems?: number;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nclass SelectPrompt<Value> extends Prompt<Value> {\n private readonly options: Array<SelectOption<Value>>;\n\n constructor(opts: SelectOptions<Value>) {\n if (opts.options.length === 0) {\n throw new Error(\"Select prompt requires at least one option.\");\n }\n if (opts.options.every((option) => option.disabled)) {\n throw new Error(\"Select prompt requires at least one enabled option.\");\n }\n\n const initialIndex = Math.max(opts.options.findIndex((option) => option.value === opts.initialValue), 0);\n const cursor = findNonDisabled(initialIndex, 1, opts.options);\n super({\n ...opts,\n initialValue: opts.options[cursor]?.value,\n render: (prompt) => renderSelectPrompt(prompt as SelectPrompt<Value>, opts)\n }, false);\n this.options = opts.options;\n this._cursor = cursor;\n this.setValue(this.options[this._cursor]?.value);\n\n this.on(\"cursor\", (action: Action) => {\n if (action === \"up\" || action === \"left\") {\n this._cursor = findNonDisabled(this._cursor - 1, -1, this.options);\n } else if (action === \"down\" || action === \"right\") {\n this._cursor = findNonDisabled(this._cursor + 1, 1, this.options);\n }\n this.setValue(this.options[this._cursor]?.value);\n });\n }\n\n get visibleOptions(): Array<SelectOption<Value>> {\n return this.options;\n }\n\n protected override promptNonTty(): Promise<Value | typeof CANCEL> {\n if (process.env.POE_NO_PROMPT === \"1\") {\n return Promise.resolve(this.value as Value);\n }\n return super.promptNonTty();\n }\n}\n\nexport function findNonDisabled<Value>(\n start: number,\n direction: 1 | -1,\n options: Array<SelectOption<Value>>\n): number {\n if (options.every((option) => option.disabled)) {\n return start;\n }\n\n let index = start;\n for (let checked = 0; checked < options.length; checked += 1) {\n index = (index + options.length) % options.length;\n if (!options[index]?.disabled) {\n return index;\n }\n index += direction;\n }\n\n return start;\n}\n\nfunction renderOption<Value>(option: SelectOption<Value>, active: boolean, submitted: boolean, cancelled: boolean): string {\n const hint = option.hint ? color.dim(` (${option.hint})`) : \"\";\n if (submitted) return color.dim(option.label);\n if (cancelled) return color.dim.strikethrough(option.label);\n if (option.disabled) return `${color.gray(GLYPHS.radioInactive)} ${color.gray.strikethrough(option.label)}${hint}`;\n if (active) return `${color.green(GLYPHS.radioActive)} ${option.label}${hint}`;\n return `${color.dim(GLYPHS.radioInactive)} ${color.dim(option.label)}${hint}`;\n}\n\nfunction renderSelectPrompt<Value>(prompt: SelectPrompt<Value>, opts: SelectOptions<Value>): string {\n if (prompt.state === \"submit\" || prompt.state === \"cancel\") {\n const option = prompt.visibleOptions[prompt.cursor];\n const rendered = option ? renderOption(option, false, prompt.state === \"submit\", prompt.state === \"cancel\") : \"\";\n const end = prompt.state === \"submit\" ? color.green(GLYPHS.barEnd) : color.red(GLYPHS.barEnd);\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${color.gray(GLYPHS.bar)} ${rendered}\\n${end}`;\n }\n\n const lines = limitOptions({\n cursor: prompt.cursor,\n options: prompt.visibleOptions,\n output: opts.output ?? process.stdout,\n maxItems: opts.maxItems,\n columnPadding: 3,\n style: (option, active) => renderOption(option, active, false, false)\n }).map((line) => `${color.cyan(GLYPHS.bar)} ${line}`);\n\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${opts.message}\\n${lines.join(\"\\n\")}\\n${color.cyan(GLYPHS.barEnd)}`;\n}\n\nexport function selectPrompt<Value>(opts: SelectOptions<Value>): Promise<Value | typeof CANCEL> {\n return new SelectPrompt(opts).prompt();\n}\n", "import { color } from \"../../components/color.js\";\nimport { GLYPHS, symbol, symbolBar } from \"./glyphs.js\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { Prompt, type PromptOptions } from \"./core.js\";\n\nexport interface TextOptions {\n message: string;\n placeholder?: string;\n defaultValue?: string;\n initialValue?: string;\n validate?: (value: string) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nclass TextPrompt extends Prompt<string> {\n constructor(opts: TextOptions) {\n const initialUserInput = opts.initialValue ?? \"\";\n super({\n ...opts,\n initialValue: initialUserInput,\n initialUserInput,\n render: (prompt) => renderTextPrompt(prompt as TextPrompt, opts),\n validate: opts.validate as PromptOptions<string>[\"validate\"]\n });\n this.on(\"userInput\", (value: string) => this.setValue(value));\n this.on(\"finalize\", () => {\n if (this.state === \"submit\") {\n this.setValue(this.value || opts.defaultValue || \"\");\n }\n });\n }\n\n get userInputWithCursor(): string {\n if (this.state === \"submit\") {\n return this.userInput;\n }\n\n const before = this.userInput.slice(0, this.cursor);\n const current = this.userInput[this.cursor];\n const after = this.userInput.slice(this.cursor + 1);\n\n if (current) {\n return `${before}${color.inverse(current)}${after}`;\n }\n return `${before}${color.inverse(\"\u2588\")}`;\n }\n\n protected override promptNonTty(): Promise<string | typeof CANCEL> {\n return this.readNonTtyLine();\n }\n}\n\nfunction renderHeader(prompt: Prompt<string>, message: string): string {\n return `${color.gray(GLYPHS.barStart)} ${symbol(prompt.state)} ${message}`;\n}\n\nfunction renderTextPrompt(prompt: TextPrompt, opts: TextOptions): string {\n const value = prompt.value ?? \"\";\n if (prompt.state === \"submit\") {\n return `${renderHeader(prompt, opts.message)}\\n${color.gray(GLYPHS.bar)} ${color.dim(value)}\\n${color.green(GLYPHS.barEnd)}`;\n }\n if (prompt.state === \"cancel\") {\n return `${renderHeader(prompt, opts.message)}\\n${color.gray(GLYPHS.bar)} ${color.dim.strikethrough(value)}\\n${color.red(GLYPHS.barEnd)}`;\n }\n\n const input = prompt.userInput.length > 0\n ? prompt.userInputWithCursor\n : opts.placeholder\n ? `${color.inverse(opts.placeholder[0] ?? \" \")}${color.dim(opts.placeholder.slice(1))}`\n : color.inverse(\"_\");\n\n if (prompt.state === \"error\") {\n return `${renderHeader(prompt, opts.message)}\\n${symbolBar(prompt.state)} ${input}\\n${color.yellow(GLYPHS.barEnd)} ${color.yellow(prompt.error)}`;\n }\n\n return `${renderHeader(prompt, opts.message)}\\n${symbolBar(prompt.state)} ${input}\\n${color.cyan(GLYPHS.barEnd)}`;\n}\n\nexport function textPrompt(opts: TextOptions): Promise<string | typeof CANCEL> {\n return new TextPrompt(opts).prompt();\n}\n", "import { color } from \"../../components/color.js\";\nexport { isCancel } from \"../interactive/cancel-symbol.js\";\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(`${color.gray(\"\u2514\")} ${color.red(msg)}\\n\\n`);\n}\n", "import { color } from \"../../components/color.js\";\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 = `${color.green(\"\u25C7\")} ${color.reset(title ?? \"\")} ${color.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 `${color.gray(\"\u2502\")} ${line}${padding}${color.gray(\"\u2502\")}`;\n });\n const bottom = color.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [color.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 ?? \"\").replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\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 { color } from \"../components/color.js\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = Object.freeze([\"\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 `- ${renderMarkdownInline(options.message)}${options.timer ? ` [${renderMarkdownInline(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 index = ((frame % SPINNER_FRAMES.length) + SPINNER_FRAMES.length) % SPINNER_FRAMES.length;\n const spinnerChar = color.magenta(SPINNER_FRAMES[index]);\n const timerSuffix = options.timer ? color.dim(` [${options.timer}]`) : \"\";\n const bar = color.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\nfunction renderMarkdownInline(value: string): string {\n return value.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${renderMarkdownInline(options.message)}${options.timer ? ` [${renderMarkdownInline(options.timer)}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n code: options.code ?? 0,\n ...(options.timer ? { timer: options.timer } : {}),\n ...(options.subtext ? { subtext: options.subtext } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? color.green(\"\u25C6\") : color.red(\"\u25A0\");\n const timerSuffix = options.timer ? color.dim(` [${options.timer}]`) : \"\";\n const bar = color.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${color.dim(options.subtext)}`;\n }\n return output;\n}\n", "import { color } from \"../components/color.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport type { CANCEL } from \"./interactive/cancel-symbol.js\";\nimport { confirmPrompt } from \"./interactive/confirm.js\";\nimport { multiselectPrompt } from \"./interactive/multiselect.js\";\nimport { passwordPrompt } from \"./interactive/password.js\";\nimport { selectPrompt, type SelectOption } from \"./interactive/select.js\";\nimport { textPrompt } from \"./interactive/text.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(`${color.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<SelectOption<Value>>;\n initialValue?: Value;\n maxItems?: number;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function select<Value>(opts: SelectOptions<Value>): Promise<Value | typeof CANCEL> {\n return selectPrompt(opts);\n}\n\nexport interface MultiselectOptions<Value> {\n message: string;\n options: Array<SelectOption<Value>>;\n initialValues?: Value[];\n required?: boolean;\n maxItems?: number;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\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[] | typeof CANCEL> {\n return multiselectPrompt(opts);\n}\n\nexport interface TextOptions {\n message: string;\n placeholder?: string;\n defaultValue?: string;\n initialValue?: string;\n validate?: (value: string) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function text(opts: TextOptions): Promise<string | typeof CANCEL> {\n return textPrompt(opts);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | typeof CANCEL> {\n return confirmPrompt(opts);\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 | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | typeof CANCEL> {\n return passwordPrompt(opts);\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 | (() => 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 const readMessage = () => (typeof message === \"function\" ? message() : message);\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(`${color.green(\"\u25C6\")} ${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(`${color.gray(\"\u2502\")} ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(readMessage());\n\n const timer = setInterval(() => {\n s.message(`${readMessage()} [${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(`${color.gray(\"\u2502\")} ${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 { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { AnySchema, ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"toolcraft-design\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type {\n HumanInLoopConfig,\n HumanInLoopPending,\n HumanInLoopRuntimeOptions\n} from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { ToolcraftBugError, UserError } from \"./user-error.js\";\nimport { suggest } from \"./suggest.js\";\nimport type { RuntimeLogger } from \"./runtime-logging.js\";\nimport type { StreamStatusEvent, ToolcraftStream } from \"./stream.js\";\n\nexport { createManagedStream } from \"./stream.js\";\nexport type {\n StreamConsumerOptions,\n StreamStatusEvent,\n StreamStatusType,\n ToolcraftStream\n} from \"./stream.js\";\n\nconst commandConfigSymbol = Symbol(\"toolcraft.command.config\");\nconst groupConfigSymbol = Symbol(\"toolcraft.group.config\");\nconst commandSourcePathSymbol = Symbol(\"toolcraft.command.sourcePath\");\n\ntype ScopeValue = \"cli\" | \"mcp\" | \"sdk\";\ntype AnyObjectSchema = ObjectSchema<Record<string, never>>;\ntype EmptyServices = Record<string, never>;\ntype ScopeInput = readonly Scope[] | undefined;\ntype HumanInLoopMode = \"sync\" | \"async\";\ntype HumanInLoopModeInput = HumanInLoopMode | null | undefined;\n\nexport type Scope = ScopeValue;\n\ntype ResolveOwnHumanInLoopMode<TValue> = TValue extends {\n mode: infer TMode extends HumanInLoopMode;\n}\n ? TMode\n : TValue extends null\n ? null\n : undefined;\n\nexport interface SecretDefinition {\n env: string;\n description?: string;\n optional?: boolean;\n}\n\nexport type SecretDeclarations = Record<string, SecretDefinition>;\n\ntype OptionalSecretKeys<TSecrets extends SecretDeclarations> = {\n [TKey in keyof TSecrets]: TSecrets[TKey] extends { optional: true } ? TKey : never;\n}[keyof TSecrets];\n\ntype RequiredSecretKeys<TSecrets extends SecretDeclarations> = Exclude<\n keyof TSecrets,\n OptionalSecretKeys<TSecrets>\n>;\n\nexport type InferSecrets<TSecrets extends SecretDeclarations | undefined> =\n TSecrets extends SecretDeclarations\n ? { [TKey in RequiredSecretKeys<TSecrets>]: string } & {\n [TKey in OptionalSecretKeys<TSecrets>]?: string;\n }\n : Record<string, never>;\n\nexport interface HandlerFs {\n readFile(path: string, encoding?: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n exists(path: string): Promise<boolean>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n rename(fromPath: string, toPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport interface CommandExample {\n title: string;\n params: Record<string, unknown>;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n diagnostics: RuntimeLogger;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n> {\n name: string;\n description?: string;\n hidden?: boolean;\n examples?: CommandExample[];\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface StreamDefinition<TEventSchema extends AnySchema = AnySchema> {\n event: TEventSchema;\n bufferSize: number;\n}\n\nexport type StreamHandlerContext<\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TServices extends object\n> = HandlerContext<TParamsSchema, TSecrets, TServices> & {\n signal: AbortSignal;\n status(event: StreamStatusEvent): void;\n refreshSecrets(): Promise<InferSecrets<TSecrets>>;\n};\n\nexport interface StreamCommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TEventSchema extends AnySchema\n> extends Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>>,\n \"handler\" | \"render\" | \"result\" | \"humanInLoop\" | \"confirm\"\n > {\n event: TEventSchema;\n handler: (\n ctx: StreamHandlerContext<TParamsSchema, TSecrets, TServices>\n ) => AsyncIterable<Static<TEventSchema>> | Promise<AsyncIterable<Static<TEventSchema>>>;\n render?: Renderers<Static<TEventSchema>>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown\n> {\n kind: \"command\";\n name: string;\n description?: string;\n hidden: boolean;\n examples: CommandExample[];\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n result?: ObjectSchema<any>;\n stream?: StreamDefinition<any>;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult> | TResult;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n hidden: boolean;\n examples: CommandExample[];\n result?: ObjectSchema<any>;\n humanInLoop?: HumanInLoopConfig<ObjectSchema<any>> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n sourcePath?: string;\n}\n\ninterface InternalGroupConfig<TServices extends object> {\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\ninterface InheritedMetadata {\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n}\n\nexport interface CommandRequirementOptions {\n apiVersion?: string;\n authEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction cloneSecretDefinition(secret: SecretDefinition): SecretDefinition {\n return {\n env: secret.env,\n description: secret.description,\n optional: secret.optional\n };\n}\n\nfunction cloneSecrets(secrets: SecretDeclarations | undefined): SecretDeclarations {\n if (secrets === undefined) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(secrets).map(([key, secret]) => [key, cloneSecretDefinition(secret)])\n );\n}\n\nfunction cloneRequires<TContext>(\n requires: Requires<TContext> | undefined\n): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneCommandExamples(examples: CommandExample[] | undefined): CommandExample[] {\n return (examples ?? []).map((example) => ({\n title: example.title,\n params: { ...example.params }\n }));\n}\n\nfunction cloneStringRecord(\n values: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return values === undefined ? undefined : { ...values };\n}\n\nfunction cloneMcpServerConfig(config: McpServerConfig | undefined): McpServerConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (config.transport === \"stdio\") {\n return {\n transport: \"stdio\",\n command: config.command,\n args: cloneStringArray(config.args),\n env: cloneStringRecord(config.env)\n };\n }\n\n return {\n transport: \"http\",\n url: config.url,\n headers: cloneStringRecord(config.headers)\n };\n}\n\nfunction cloneRenameMap(\n rename: Record<string, string> | undefined\n): Record<string, string> | undefined {\n return rename === undefined ? undefined : { ...rename };\n}\n\nfunction validateRenameMap(rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const seenTargets = new Map<string, string>();\n\n for (const [upstreamName, targetPath] of Object.entries(rename)) {\n if (targetPath.length === 0) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`\n );\n }\n\n if (targetPath.split(\".\").some((segment) => segment.length === 0)) {\n throw new UserError(\n `Invalid rename target for upstream tool \"${upstreamName}\": \"${targetPath}\" contains an empty segment.`\n );\n }\n\n const existingUpstreamName = seenTargets.get(targetPath);\n if (existingUpstreamName !== undefined) {\n throw new UserError(\n `Duplicate rename target \"${targetPath}\" for upstream tools \"${existingUpstreamName}\" and \"${upstreamName}\".`\n );\n }\n\n seenTargets.set(targetPath, upstreamName);\n }\n}\n\nfunction parseStackPath(candidate: string): string | undefined {\n if (candidate.startsWith(\"file://\")) {\n try {\n return fileURLToPath(candidate);\n } catch {\n return undefined;\n }\n }\n\n if (candidate.startsWith(\"/\")) {\n return candidate;\n }\n\n return undefined;\n}\n\nfunction extractStackPath(line: string): string | undefined {\n const trimmed = line.trim();\n const fileIndex = trimmed.indexOf(\"file://\");\n\n if (fileIndex >= 0) {\n const location = trimmed.slice(fileIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex =\n separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/toolcraft/src/index.ts\") ||\n candidate.includes(\"/packages/toolcraft/dist/index.js\") ||\n candidate.includes(\"/node_modules/toolcraft/dist/index.js\")\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return undefined;\n}\n\nfunction composeChecks(\n parentCheck: Requires<any>[\"check\"] | undefined,\n childCheck: Requires<any>[\"check\"] | undefined\n): Requires<any>[\"check\"] | undefined {\n if (parentCheck === undefined) {\n return childCheck;\n }\n\n if (childCheck === undefined) {\n return parentCheck;\n }\n\n return async (ctx) => {\n const parentResult = await parentCheck(ctx);\n if (!parentResult.ok) {\n return parentResult;\n }\n\n return childCheck(ctx);\n };\n}\n\nfunction mergeRequires(\n parent: Requires<any> | undefined,\n child: Requires<any> | undefined\n): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check)\n };\n\n if (merged.auth === undefined && merged.apiVersion === undefined && merged.check === undefined) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n const candidates = Object.keys(env).filter(\n (candidate) => candidate !== secret.env && env[candidate] !== undefined\n );\n const suggestions = suggestSecretEnv(secret.env, candidates);\n const suggestionLine =\n suggestions.length > 0 ? `\\nDid you mean: ${suggestions.join(\", \")}?` : \"\";\n throw new UserError(`Missing required secret ${secret.env}${details}${suggestionLine}`);\n }\n\n Object.defineProperty(secrets, name, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return secrets;\n}\n\nfunction suggestSecretEnv(input: string, candidates: readonly string[]): string[] {\n const directSuggestions = suggest(input, candidates);\n if (!input.includes(\"_\")) {\n return directSuggestions;\n }\n\n const inputParts = input.split(\"_\");\n const firstPart = inputParts[0];\n const lastPart = inputParts[inputParts.length - 1];\n const relatedCandidates = candidates.filter((candidate) => {\n const candidateParts = candidate.split(\"_\");\n return (\n candidateParts[0] === firstPart && candidateParts[candidateParts.length - 1] === lastPart\n );\n });\n const expandedSuggestions = suggest(input, relatedCandidates, {\n threshold: Math.max(4, Math.floor(input.length / 4))\n });\n\n return [...new Set([...directSuggestions, ...expandedSuggestions])].slice(0, 3);\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child\n });\n}\n\nfunction resolveCommandScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(\n ownScope: Scope[] | undefined,\n inheritedScope: Scope[] | undefined\n): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n result: config.result,\n stream: undefined,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n humanInLoop: config.humanInLoop,\n requires: cloneRequires(config.requires),\n handler: config.handler,\n render: config.render\n };\n\n Object.defineProperty(command, commandConfigSymbol, {\n value: {\n scope: cloneScope(config.scope),\n hidden: config.hidden ?? false,\n examples: cloneCommandExamples(config.examples),\n result: config.result,\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n sourcePath: inferCommandSourcePath()\n } satisfies InternalCommandConfig\n });\n\n return command;\n}\n\nfunction createBaseGroup<TServices extends object>(\n config: GroupConfig<TServices>\n): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n requires: cloneRequires(config.requires),\n children: [],\n default: undefined\n };\n\n Object.defineProperty(group, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(config.mcp),\n scope: cloneScope(config.scope),\n humanInLoop: config.humanInLoop,\n secrets: cloneSecrets(config.secrets),\n tools: cloneStringArray(config.tools),\n rename: cloneRenameMap(config.rename),\n requires: cloneRequires(config.requires),\n children: [...config.children],\n default: config.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return group;\n}\n\nfunction getInternalCommandConfig(command: Command<any, any, any, any>): InternalCommandConfig {\n return (\n command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig }\n )[commandConfigSymbol];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n result: internal.result,\n stream: command.stream,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, internal.humanInLoop),\n requires: mergeRequires(inherited.requires, internal.requires),\n handler: command.handler,\n render: command.render\n };\n\n Object.defineProperty(materialized, commandConfigSymbol, {\n value: {\n scope: cloneScope(internal.scope),\n hidden: internal.hidden,\n examples: cloneCommandExamples(internal.examples),\n result: internal.result,\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n requires: cloneRequires(internal.requires),\n sourcePath: internal.sourcePath\n } satisfies InternalCommandConfig\n });\n\n Object.defineProperty(materialized, commandSourcePathSymbol, {\n value: internal.sourcePath\n });\n\n return materialized;\n}\n\nfunction mergeInheritedMetadata<TServices extends object>(\n group: InternalGroupConfig<TServices>,\n inherited: InheritedMetadata\n): InheritedMetadata {\n return {\n scope: resolveGroupScope(group.scope, inherited.scope),\n humanInLoop: mergeHumanInLoopFromGroup(inherited.humanInLoop, group.humanInLoop),\n secrets: mergeSecrets(inherited.secrets, group.secrets),\n requires: mergeRequires(inherited.requires, group.requires)\n };\n}\n\nfunction materializeGroup<TServices extends object>(\n group: Group<TServices>,\n inherited: InheritedMetadata\n): Group<TServices> {\n const internal = getInternalGroupConfig(group);\n const mergedInherited = mergeInheritedMetadata(internal, inherited);\n const materializedChildren = internal.children.map((child) =>\n materializeNode(child, mergedInherited)\n );\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new ToolcraftBugError(\n `Default command \"${internal.default.name}\" must be listed in children.`\n );\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new ToolcraftBugError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: mergedInherited.scope,\n humanInLoop: mergedInherited.humanInLoop,\n secrets: mergedInherited.secrets,\n requires: mergedInherited.requires,\n children: materializedChildren,\n default: defaultChild\n };\n\n Object.defineProperty(materialized, groupConfigSymbol, {\n value: {\n mcp: cloneMcpServerConfig(internal.mcp),\n scope: cloneScope(internal.scope),\n humanInLoop: internal.humanInLoop,\n secrets: cloneSecrets(internal.secrets),\n tools: cloneStringArray(internal.tools),\n rename: cloneRenameMap(internal.rename),\n requires: cloneRequires(internal.requires),\n children: [...internal.children],\n default: internal.default\n } satisfies InternalGroupConfig<TServices>\n });\n\n return materialized;\n}\n\nfunction materializeNode<TServices extends object>(\n node: CommandNode<TServices>,\n inherited: InheritedMetadata\n): CommandNode<TServices> {\n if (node.kind === \"command\") {\n return materializeCommand(node, inherited);\n }\n\n return materializeGroup(node, inherited);\n}\n\nexport function defineCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<TParamsSchema> | null | undefined = undefined\n>(\n config: Omit<\n CommandConfig<TServices, TParamsSchema, TSecrets, TResult>,\n \"name\" | \"scope\" | \"humanInLoop\"\n > & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(\n createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>),\n {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }\n ) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function defineStreamCommand<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TEventSchema extends AnySchema = AnySchema,\n TOwnScope extends ScopeInput = undefined\n>(\n config: Omit<\n StreamCommandConfig<TServices, TParamsSchema, TSecrets, TEventSchema>,\n \"name\" | \"scope\"\n > & {\n name: TName;\n scope?: TOwnScope;\n }\n): Command<TServices, TParamsSchema, TSecrets, AsyncIterable<Static<TEventSchema>>> &\n TypedCommandMetadata<\n TName,\n TParamsSchema,\n ToolcraftStream<Static<TEventSchema>>,\n TOwnScope,\n undefined\n > {\n const command = defineCommand({\n ...config,\n confirm: false,\n humanInLoop: null,\n handler: config.handler as never,\n render: undefined\n } as never) as Command<\n TServices,\n TParamsSchema,\n TSecrets,\n AsyncIterable<Static<TEventSchema>>\n >;\n command.stream = {\n event: config.event,\n bufferSize: 1\n };\n command.render = config.render as never;\n return command as never;\n}\n\nexport function defineGroup<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = undefined,\n TOwnHumanInLoop extends HumanInLoopConfig<AnyObjectSchema> | null | undefined = undefined\n>(\n config: Omit<GroupConfig<TServices>, \"name\" | \"children\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n children: TChildren & readonly CommandNode<TServices>[];\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n > {\n validateRenameMap(config.rename);\n validateHumanInLoopOnDefine(config);\n\n return materializeGroup(createBaseGroup(config as unknown as GroupConfig<TServices>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined\n }) as Group<TServices> &\n TypedGroupMetadata<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n ResolveOwnHumanInLoopMode<TOwnHumanInLoop>\n >;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport function hasMcpProxyConfig(group: Group<any>): boolean {\n const configSymbol = Object.getOwnPropertySymbols(group).find(\n (candidate) => candidate.description === groupConfigSymbol.description\n );\n const config =\n configSymbol === undefined\n ? undefined\n : (group as unknown as Record<PropertyKey, InternalGroupConfig<any>>)[configSymbol];\n if (config?.mcp !== undefined) {\n return true;\n }\n\n const children = config?.children ?? group.children;\n return children.some(\n (child) => child.kind === \"group\" && hasMcpProxyConfig(child)\n );\n}\n\nexport { S, toJsonSchema } from \"./schema.js\";\nexport {\n AuthenticationError,\n BadRequestError,\n ClientError,\n ConflictError,\n HttpError,\n InternalServerError,\n NotFoundError,\n PermissionDeniedError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n UnprocessableEntityError,\n createHttpError\n} from \"./http-errors.js\";\nexport type { HttpErrorRequest, HttpErrorResponse } from \"./http-errors.js\";\nexport { ApprovalDeclinedError, ToolcraftBugError, UserError };\nexport { createRuntimeLogger, isLogLevel, shouldEmitDiagnostic } from \"./runtime-logging.js\";\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type {\n FileChangeRendererOptions,\n FileChangeResult\n} from \"./file-change-renderer.js\";\nexport type { FileChange, FileChangeDisplayMode, FileChangeKind } from \"toolcraft-design\";\nexport type {\n DiagnosticLogEvent,\n LogLevel,\n RuntimeLogger,\n RuntimeLoggerInput\n} from \"./runtime-logging.js\";\nexport type {\n AnySchema,\n ArraySchema,\n BooleanSchema,\n CliMissingParameterChoice,\n CliMissingParameterContext,\n CliMissingParameterResolution,\n CliOutputMode,\n CliSchemaOptions,\n EnumSchema,\n JsonSchema,\n JsonSchemaDocument,\n JsonSchemaDocumentOptions,\n JsonValue,\n JsonValueSchema,\n NumberSchema,\n ObjectSchema,\n OneOfSchema,\n OptionalSchema,\n RecordSchema,\n SchemaBase,\n Static,\n StringSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n} from \"./schema.js\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"UserError\";\n }\n}\n\nexport class ToolcraftBugError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ToolcraftBugError\";\n }\n}\n", "import type { HumanInLoopProvider } from \"@poe-code/agent-human-in-loop\";\nimport type { TaskList } from \"@poe-code/task-list\";\nimport type { ObjectSchema, Static } from \"toolcraft-schema\";\nimport { UserError } from \"../user-error.js\";\n\nexport interface HumanInLoopConfig<TParamsSchema extends ObjectSchema<any>> {\n mode: \"sync\" | \"async\";\n message: (ctx: { params: Static<TParamsSchema>; commandPath: string }) => string;\n plan?: (ctx: {\n params: Static<TParamsSchema>;\n commandPath: string;\n }) => unknown | Promise<unknown>;\n declineInputPrompt?: string;\n}\n\nexport interface HumanInLoopRuntimeOptions {\n provider?: HumanInLoopProvider;\n taskList?:\n | TaskList\n | {\n dir: string;\n format: \"markdown-dir\" | \"yaml-file\";\n };\n listName?: string;\n binPath?: {\n execPath: string;\n entryArgs: readonly string[];\n };\n}\n\nexport interface HumanInLoopPending {\n status: \"pending-approval\";\n approvalId: string;\n message: string;\n enqueuedAt: string;\n planHash?: string;\n}\n\nexport class ApprovalDeclinedError extends UserError {\n readonly reason?: string;\n readonly approvalId?: string;\n readonly commandPath: string;\n\n constructor(options: {\n commandPath: string;\n reason?: string;\n approvalId?: string;\n }) {\n super(options.reason === undefined ? \"Declined.\" : `Declined: ${options.reason}`);\n this.name = \"ApprovalDeclinedError\";\n this.reason = options.reason;\n this.approvalId = options.approvalId;\n this.commandPath = options.commandPath;\n }\n}\n\nexport type { HumanInLoopProvider } from \"@poe-code/agent-human-in-loop\";\n", "import type { ObjectSchema } from \"toolcraft-schema\";\nimport type { HumanInLoopConfig } from \"./types.js\";\n\ntype HumanInLoopValue<TParamsSchema extends ObjectSchema<any>> =\n | HumanInLoopConfig<TParamsSchema>\n | null\n | undefined;\n\nexport function validateHumanInLoopOnDefine<TParamsSchema extends ObjectSchema<any>>(config: {\n name: string;\n confirm?: boolean;\n children?: readonly unknown[];\n humanInLoop?: HumanInLoopValue<TParamsSchema>;\n}): void {\n const label = Array.isArray(config.children) ? \"group\" : \"command\";\n\n if (config.confirm === true && config.humanInLoop !== undefined && config.humanInLoop !== null) {\n throw new Error(`${label} '${config.name}': use either confirm or humanInLoop, not both`);\n }\n\n if (config.humanInLoop === undefined || config.humanInLoop === null) {\n return;\n }\n\n if (config.humanInLoop.mode !== \"sync\" && config.humanInLoop.mode !== \"async\") {\n throw new Error(`${label} '${config.name}': humanInLoop.mode must be \"sync\" or \"async\"`);\n }\n\n if (typeof config.humanInLoop.message !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.message must be a function`);\n }\n\n if (config.humanInLoop.plan !== undefined && typeof config.humanInLoop.plan !== \"function\") {\n throw new Error(`${label} '${config.name}': humanInLoop.plan must be a function`);\n }\n}\n\nexport function mergeHumanInLoopFromGroup<\n TGroupParamsSchema extends ObjectSchema<any>,\n TChildParamsSchema extends ObjectSchema<any>,\n>(\n groupHumanInLoop: HumanInLoopValue<TGroupParamsSchema>,\n childHumanInLoop: HumanInLoopValue<TChildParamsSchema>\n): HumanInLoopValue<TChildParamsSchema> {\n if (childHumanInLoop !== undefined) {\n return childHumanInLoop;\n }\n\n return groupHumanInLoop as HumanInLoopValue<TChildParamsSchema>;\n}\n", "export function suggest(\n input: string,\n candidates: readonly string[],\n opts: { max?: number; threshold?: number } = {}\n): string[] {\n if (input.length === 0) {\n return [];\n }\n\n const max = opts.max ?? 3;\n const threshold = opts.threshold ?? Math.max(1, Math.floor(input.length / 4));\n\n return candidates\n .map((candidate) => ({\n candidate,\n distance: damerauLevenshtein(input, candidate)\n }))\n .filter(({ distance }) => distance <= threshold)\n .sort((left, right) => {\n if (left.distance !== right.distance) {\n return left.distance - right.distance;\n }\n\n return left.candidate.localeCompare(right.candidate);\n })\n .slice(0, max)\n .map(({ candidate }) => candidate);\n}\n\nfunction damerauLevenshtein(left: string, right: string): number {\n const distances = Array.from({ length: left.length + 1 }, () =>\n Array.from({ length: right.length + 1 }, () => 0)\n );\n\n for (let row = 0; row <= left.length; row += 1) {\n distances[row]![0] = row;\n }\n\n for (let column = 0; column <= right.length; column += 1) {\n distances[0]![column] = column;\n }\n\n for (let row = 1; row <= left.length; row += 1) {\n for (let column = 1; column <= right.length; column += 1) {\n const substitutionCost = left[row - 1] === right[column - 1] ? 0 : 1;\n const deletion = distances[row - 1]![column]! + 1;\n const insertion = distances[row]![column - 1]! + 1;\n const substitution = distances[row - 1]![column - 1]! + substitutionCost;\n\n distances[row]![column] = Math.min(deletion, insertion, substitution);\n\n if (\n row > 1 &&\n column > 1 &&\n left[row - 1] === right[column - 2] &&\n left[row - 2] === right[column - 1]\n ) {\n distances[row]![column] = Math.min(\n distances[row]![column]!,\n distances[row - 2]![column - 2]! + 1\n );\n }\n }\n }\n\n return distances[left.length]![right.length]!;\n}\n", "import { validate, type AnySchema, type Static } from \"toolcraft-schema\";\nimport { UserError } from \"./user-error.js\";\n\nexport type StreamStatusType = \"connected\" | \"progress\" | \"reconnecting\";\n\nexport interface StreamStatusEvent {\n type: StreamStatusType;\n message?: string;\n}\n\nexport interface StreamConsumerOptions {\n signal?: AbortSignal;\n onStatus?: (event: StreamStatusEvent) => void;\n}\n\nexport interface ToolcraftStream<TEvent> extends AsyncIterable<TEvent> {\n readonly signal: AbortSignal;\n cancel(reason?: unknown): Promise<void>;\n}\n\nexport interface ManagedStreamOptions<TSchema extends AnySchema> extends StreamConsumerOptions {\n eventSchema: TSchema;\n create(signal: AbortSignal, status: (event: StreamStatusEvent) => void): Promise<AsyncIterable<Static<TSchema>>>;\n}\n\nfunction validationMessage(schema: AnySchema, value: unknown): string | undefined {\n const result = validate(schema, value);\n return result.ok ? undefined : result.issues.map((issue) => issue.message).join(\"; \");\n}\n\nexport function createManagedStream<TSchema extends AnySchema>(\n options: ManagedStreamOptions<TSchema>\n): ToolcraftStream<Static<TSchema>> {\n const controller = new AbortController();\n let iterator: AsyncIterator<Static<TSchema>> | undefined;\n let iteratorPromise: Promise<AsyncIterator<Static<TSchema>>> | undefined;\n let closePromise: Promise<void> | undefined;\n let done = false;\n\n const getIterator = async (): Promise<AsyncIterator<Static<TSchema>>> => {\n if (iterator !== undefined) {\n return iterator;\n }\n iteratorPromise ??= options\n .create(controller.signal, (event) => options.onStatus?.(event))\n .then((iterable) => iterable[Symbol.asyncIterator]());\n iterator = await iteratorPromise;\n return iterator;\n };\n\n const close = async (reason?: unknown): Promise<void> => {\n if (closePromise !== undefined) {\n return closePromise;\n }\n closePromise = (async () => {\n controller.abort(reason);\n options.signal?.removeEventListener(\"abort\", abortFromConsumer);\n if (done || (iterator === undefined && iteratorPromise === undefined)) {\n done = true;\n return;\n }\n const activeIterator = await getIterator();\n done = true;\n await activeIterator.return?.();\n })();\n return closePromise;\n };\n\n const abortFromConsumer = (): void => {\n void close(options.signal?.reason);\n };\n if (options.signal?.aborted === true) {\n abortFromConsumer();\n } else {\n options.signal?.addEventListener(\"abort\", abortFromConsumer, { once: true });\n }\n\n const stream: ToolcraftStream<Static<TSchema>> = {\n signal: controller.signal,\n cancel: close,\n [Symbol.asyncIterator](): AsyncIterator<Static<TSchema>> {\n return {\n async next() {\n if (done || controller.signal.aborted) {\n await close(controller.signal.reason);\n return { done: true, value: undefined };\n }\n const activeIterator = await getIterator();\n let result: IteratorResult<Static<TSchema>>;\n try {\n result = await activeIterator.next();\n } catch (error) {\n await close(error);\n throw error;\n }\n if (result.done === true) {\n done = true;\n options.signal?.removeEventListener(\"abort\", abortFromConsumer);\n return { done: true, value: undefined };\n }\n const message = validationMessage(options.eventSchema, result.value);\n if (message !== undefined) {\n await close(new UserError(message));\n throw new UserError(message);\n }\n return { done: false, value: result.value };\n },\n async return() {\n await close();\n return { done: true, value: undefined };\n },\n async throw(error?: unknown) {\n await close(error);\n throw error;\n }\n };\n }\n };\n\n return stream;\n}\n", "export type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nexport interface DiagnosticLogEvent {\n level: Exclude<LogLevel, \"silent\">;\n message: string;\n category?: \"runtime\" | \"http\" | \"auth\" | \"retry\" | \"progress\";\n data?: Record<string, unknown>;\n}\n\nexport interface RuntimeLogger {\n level: LogLevel;\n emit(event: DiagnosticLogEvent): void;\n}\n\nexport type RuntimeLoggerInput = RuntimeLogger | ((event: DiagnosticLogEvent) => void);\n\nconst LOG_LEVEL_RANK = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5\n} as const satisfies Record<LogLevel, number>;\n\nexport const LOG_LEVELS = Object.freeze([\n \"silent\",\n \"error\",\n \"warn\",\n \"info\",\n \"debug\",\n \"trace\"\n] as const satisfies readonly LogLevel[]);\n\nexport function isLogLevel(value: string): value is LogLevel {\n return (LOG_LEVELS as readonly string[]).includes(value);\n}\n\nexport function shouldEmitDiagnostic(eventLevel: LogLevel, configuredLevel: LogLevel): boolean {\n if (eventLevel === \"silent\" || configuredLevel === \"silent\") {\n return false;\n }\n\n return LOG_LEVEL_RANK[eventLevel] <= LOG_LEVEL_RANK[configuredLevel];\n}\n\nexport function createRuntimeLogger(\n options: {\n level?: LogLevel;\n logger?: RuntimeLoggerInput;\n } = {}\n): RuntimeLogger {\n const level = options.level ?? \"warn\";\n const sink = options.logger;\n\n return {\n level,\n emit(event): void {\n if (!shouldEmitDiagnostic(event.level, level)) {\n return;\n }\n\n if (typeof sink === \"function\") {\n sink(event);\n return;\n }\n\n sink?.emit(event);\n }\n };\n}\n", "import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport interface PackageMetadata {\n name?: string;\n path: string;\n version?: string;\n}\n\ntype PackageMetadataInput = string | URL;\n\nfunction pathFromInput(from: PackageMetadataInput): string {\n if (from instanceof URL) {\n return fileURLToPath(from);\n }\n\n if (from.startsWith(\"file:\")) {\n return fileURLToPath(from);\n }\n\n return path.resolve(from);\n}\n\nfunction getSearchDirectory(from: PackageMetadataInput): string {\n const resolved = pathFromInput(from);\n let searchPath = resolved;\n\n try {\n searchPath = realpathSync(resolved);\n } catch {\n searchPath = resolved;\n }\n\n try {\n return statSync(searchPath).isDirectory() ? searchPath : path.dirname(searchPath);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import { mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { CommanderError } from \"commander\";\nimport type { AnySchema } from \"toolcraft-schema\";\nimport type { Command, SecretDeclarations } from \"./index.js\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport { findPackageMetadata } from \"./package-metadata.js\";\nimport { findProjectRoot } from \"./project-root.js\";\nimport { isSensitiveName, redactHttpBody, redactHttpHeaderValue } from \"./redaction.js\";\nimport { UserError } from \"./user-error.js\";\n\nconst ERROR_REPORTS_ENV = \"TOOLCRAFT_ERROR_REPORTS\";\n\nexport type ErrorReportsOption = boolean | { dir?: string };\n\nexport interface ErrorReportContext {\n argv?: readonly string[];\n command?: Command<any, any, any, any>;\n commandPath?: string;\n env?: Record<string, string | undefined>;\n error: unknown;\n errorReports?: ErrorReportsOption;\n params?: unknown;\n projectRoot?: string;\n secrets?: Record<string, string | undefined>;\n version?: string;\n}\n\nexport interface ErrorReportResult {\n absolutePath: string;\n displayPath: string;\n}\n\nexport type ErrorReportRenderContext = Omit<\n ErrorReportContext,\n \"errorReports\" | \"projectRoot\"\n>;\n\nexport interface ErrorReportRenderResult {\n content: string;\n redactedKeys: string[];\n}\n\ninterface HttpErrorLike {\n name: \"HttpError\";\n message: string;\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n };\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\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 unwrapOptional(schema: AnySchema): AnySchema {\n if (schema.kind === \"optional\") {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction hasHttpContext(error: unknown): error is HttpErrorLike {\n return (\n error instanceof Error &&\n error.name === \"HttpError\" &&\n isPlainObject((error as { request?: unknown }).request) &&\n isPlainObject((error as { response?: unknown }).response)\n );\n}\n\nfunction isSkippedError(error: unknown): boolean {\n if (error instanceof ApprovalDeclinedError) {\n return true;\n }\n\n if (\n error instanceof CommanderError &&\n (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\")\n ) {\n return true;\n }\n\n return error instanceof UserError && error.cause === undefined && !hasHttpContext(error);\n}\n\nfunction reportsEnabled(\n option: ErrorReportsOption | undefined,\n env: Record<string, string | undefined>\n): boolean {\n if (env[ERROR_REPORTS_ENV] === \"1\") {\n return true;\n }\n\n return option !== undefined && option !== false;\n}\n\nfunction resolveReportDir(option: ErrorReportsOption | undefined, projectRoot: string): string {\n const configuredDir = typeof option === \"object\" ? option.dir : undefined;\n\n if (configuredDir === undefined || configuredDir.length === 0) {\n return path.join(projectRoot, \".toolcraft\", \"errors\");\n }\n\n return path.isAbsolute(configuredDir) ? configuredDir : path.join(projectRoot, configuredDir);\n}\n\nfunction reportDirMustStayWithinProject(option: ErrorReportsOption | undefined): boolean {\n const configuredDir = typeof option === \"object\" ? option.dir : undefined;\n return configuredDir === undefined || configuredDir.length === 0 || !path.isAbsolute(configuredDir);\n}\n\nfunction isWithinDirectory(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return relative === \"\" || (!path.isAbsolute(relative) && relative !== \"..\" && !relative.startsWith(`..${path.sep}`));\n}\n\nasync function assertReportDirWithinProject(projectRoot: string, reportDir: string): Promise<void> {\n if (!isWithinDirectory(path.resolve(projectRoot), path.resolve(reportDir))) {\n throw new Error(\"Error report directory resolves outside project root.\");\n }\n\n const [canonicalProjectRoot, canonicalReportDir] = await Promise.all([\n realpath(projectRoot),\n realpath(reportDir)\n ]);\n\n if (!isWithinDirectory(canonicalProjectRoot, canonicalReportDir)) {\n throw new Error(\"Error report directory resolves outside project root.\");\n }\n}\n\nfunction resolveProjectRoot(projectRoot: string | undefined): string {\n if (projectRoot !== undefined) {\n return projectRoot;\n }\n\n return findProjectRoot() ?? os.tmpdir();\n}\n\nfunction formatTimestamp(date: Date): string {\n const isoMinute = date.toISOString().slice(0, 16);\n const colonIndex = isoMinute.indexOf(\":\");\n\n if (colonIndex === -1) {\n return isoMinute;\n }\n\n return `${isoMinute.slice(0, colonIndex)}${isoMinute.slice(colonIndex + 1)}`;\n}\n\nfunction slugifyCommandPath(commandPath: string | undefined): string {\n const source = commandPath === undefined || commandPath.length === 0 ? \"root\" : commandPath;\n let output = \"\";\n let previousWasDash = false;\n\n for (const char of source) {\n const lower = char.toLowerCase();\n const isWord = (lower >= \"a\" && lower <= \"z\") || (lower >= \"0\" && lower <= \"9\");\n\n if (isWord) {\n output += lower;\n previousWasDash = false;\n continue;\n }\n\n if (!previousWasDash) {\n output += \"-\";\n previousWasDash = true;\n }\n }\n\n while (output.startsWith(\"-\")) {\n output = output.slice(1);\n }\n\n while (output.endsWith(\"-\")) {\n output = output.slice(0, -1);\n }\n\n return output.length === 0 ? \"root\" : output;\n}\n\nfunction relativeDisplayPath(projectRoot: string, absolutePath: string): string {\n const relative = path.relative(projectRoot, absolutePath);\n return relative.length === 0 || relative.startsWith(\"..\") ? absolutePath : relative;\n}\n\nfunction redactValue(value: string | undefined): string {\n if (value === undefined) {\n return \"<unset>\";\n }\n\n return `<set, ${value.length} chars>`;\n}\n\nfunction collectStringLeaves(value: unknown, output: Set<string>): void {\n if (typeof value === \"string\") {\n if (value.length > 0) {\n output.add(value);\n }\n return;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectStringLeaves(entry, output);\n }\n return;\n }\n\n if (isPlainObject(value)) {\n for (const entry of Object.values(value)) {\n collectStringLeaves(entry, output);\n }\n }\n}\n\nfunction schemaSecretValue(schema: AnySchema): boolean | undefined {\n const unwrapped = unwrapOptional(schema);\n\n if (unwrapped.kind === \"string\" || unwrapped.kind === \"number\") {\n return (unwrapped as { secret?: boolean }).secret;\n }\n\n return undefined;\n}\n\nfunction shouldRedactParam(name: string, schema: AnySchema): boolean {\n const secret = schemaSecretValue(schema);\n\n if (secret !== undefined) {\n return secret;\n }\n\n return isSensitiveName(name);\n}\n\nfunction redactParamsValue(value: unknown, schema: AnySchema, name: string): unknown {\n if (shouldRedactParam(name, schema)) {\n return \"<redacted>\";\n }\n\n const unwrapped = unwrapOptional(schema);\n\n if (unwrapped.kind === \"object\" && isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, childValue]) => {\n const childSchema = unwrapped.shape[key];\n return [\n key,\n childSchema === undefined ? childValue : redactParamsValue(childValue, childSchema, key)\n ];\n })\n );\n }\n\n if (unwrapped.kind === \"array\" && Array.isArray(value)) {\n return value.map((entry) => redactParamsValue(entry, unwrapped.item, name));\n }\n\n return value;\n}\n\nfunction redactParams(params: unknown, command: Command<any, any, any, any> | undefined): unknown {\n if (command === undefined) {\n return params;\n }\n\n return redactParamsValue(params, command.params, \"\");\n}\n\nfunction collectSensitiveParamValues(\n value: unknown,\n schema: AnySchema,\n name: string,\n output: Set<string>\n): void {\n if (shouldRedactParam(name, schema)) {\n collectStringLeaves(value, output);\n return;\n }\n\n const unwrapped = unwrapOptional(schema);\n\n if (unwrapped.kind === \"object\" && isPlainObject(value)) {\n for (const [key, childValue] of Object.entries(value)) {\n const childSchema = unwrapped.shape[key];\n if (childSchema !== undefined) {\n collectSensitiveParamValues(childValue, childSchema, key, output);\n }\n }\n return;\n }\n\n if (unwrapped.kind === \"array\" && Array.isArray(value)) {\n for (const entry of value) {\n collectSensitiveParamValues(entry, unwrapped.item, name, output);\n }\n }\n}\n\nfunction createReportStringRedactor(\n context: ErrorReportRenderContext,\n env: Record<string, string | undefined>\n): (value: string) => string {\n const values = new Set<string>();\n\n for (const value of Object.values(context.secrets ?? {})) {\n if (value !== undefined && value.length > 0) {\n values.add(value);\n }\n }\n\n for (const [name, secret] of Object.entries(context.command?.secrets ?? {})) {\n const value = context.secrets?.[name] ?? env[secret.env];\n if (value !== undefined && value.length > 0) {\n values.add(value);\n }\n }\n\n if (context.command !== undefined) {\n collectSensitiveParamValues(context.params, context.command.params, \"\", values);\n }\n\n const orderedValues = [...values].sort((left, right) => right.length - left.length);\n\n return (value: string): string => {\n let redacted = value;\n for (const secretValue of orderedValues) {\n redacted = redacted.split(secretValue).join(\"<redacted>\");\n }\n return redacted;\n };\n}\n\nfunction commandSecretEnvNames(secrets: SecretDeclarations | undefined): string[] {\n if (secrets === undefined) {\n return [];\n }\n\n return Object.values(secrets).map((secret) => secret.env);\n}\n\nfunction redactArgv(\n argv: readonly string[] | undefined,\n options: {\n command?: Command<any, any, any, any>;\n secrets?: Record<string, string | undefined>;\n }\n): string[] {\n if (argv === undefined) {\n return [];\n }\n\n const secretValues = new Set(\n Object.values(options.secrets ?? {}).filter(\n (value): value is string => value !== undefined && value.length > 0\n )\n );\n const secretNames = new Set([\n ...Object.keys(options.secrets ?? {}),\n ...commandSecretEnvNames(options.command?.secrets)\n ]);\n const output: string[] = [];\n let redactNext = false;\n\n for (const arg of argv) {\n if (redactNext) {\n output.push(\"<redacted>\");\n redactNext = false;\n continue;\n }\n\n const equalsIndex = arg.indexOf(\"=\");\n const optionName = equalsIndex === -1 ? arg : arg.slice(0, equalsIndex);\n const normalizedOptionName = optionName.replaceAll(\"-\", \"\");\n const sensitiveByName =\n isSensitiveName(normalizedOptionName) ||\n [...secretNames].some((name) =>\n normalizedOptionName.toLowerCase().includes(name.toLowerCase())\n );\n\n if (equalsIndex !== -1 && sensitiveByName) {\n output.push(`${optionName}=<redacted>`);\n continue;\n }\n\n if (arg.startsWith(\"-\") && sensitiveByName) {\n output.push(arg);\n redactNext = true;\n continue;\n }\n\n let redactedArg = arg;\n for (const secretValue of secretValues) {\n redactedArg = redactedArg.split(secretValue).join(\"<redacted>\");\n }\n output.push(redactedArg);\n }\n\n return output;\n}\n\nfunction stableJson(value: unknown): string {\n return JSON.stringify(value, null, 2) ?? \"undefined\";\n}\n\nfunction redactStructuredErrorField(\n name: string,\n value: unknown,\n redactString: (value: string) => string\n): unknown {\n if (typeof value === \"string\") {\n const redactedHeaderValue = redactHttpHeaderValue(name, value);\n if (redactedHeaderValue !== value) {\n return redactedHeaderValue;\n }\n\n if (isSensitiveName(name)) {\n return \"<redacted>\";\n }\n\n return redactString(value);\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => redactStructuredErrorField(name, entry, redactString));\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactStructuredErrorField(key, entry, redactString)\n ])\n );\n }\n\n return value;\n}\n\nfunction ownStructuredFields(\n error: Error,\n redactString: (value: string) => string\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n\n for (const key of Object.keys(error)) {\n if (key === \"name\" || key === \"message\" || key === \"stack\" || key === \"cause\") {\n continue;\n }\n\n Object.defineProperty(fields, key, {\n value: redactStructuredErrorField(\n key,\n (error as unknown as Record<string, unknown>)[key],\n redactString\n ),\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n\n return fields;\n}\n\nfunction formatStackChain(error: unknown, redactString: (value: string) => string): string {\n const lines: string[] = [];\n let current: unknown = error;\n let index = 0;\n\n while (current !== undefined) {\n if (current instanceof Error) {\n const stack = current.stack ?? String(current);\n lines.push(redactString(index === 0 ? stack : `Caused by: ${stack}`));\n current = current.cause;\n } else {\n const message = String(current);\n lines.push(redactString(index === 0 ? message : `Caused by: ${message}`));\n current = undefined;\n }\n\n index += 1;\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatHeaderValue(\n name: string,\n value: string,\n redactString: (value: string) => string\n): string {\n return redactString(redactHttpHeaderValue(name, value));\n}\n\nfunction formatHeaders(\n headers: Record<string, string>,\n redactString: (value: string) => string\n): string {\n return Object.entries(headers)\n .map(([name, value]) => `${name}: ${formatHeaderValue(name, value, redactString)}`)\n .join(\"\\n\");\n}\n\nfunction formatBody(body: unknown, redactString: (value: string) => string): string {\n const redactedBody = redactHttpBody(body);\n\n if (typeof redactedBody === \"string\") {\n return redactString(redactedBody);\n }\n\n return redactString(stableJson(redactedBody));\n}\n\nfunction formatHttpTranscript(\n error: HttpErrorLike,\n redactString: (value: string) => string\n): string {\n const requestLines = [\n `${error.request.method} ${error.request.url}`,\n formatHeaders(error.request.headers, redactString)\n ].filter((line) => line.length > 0);\n\n if (error.request.body !== undefined) {\n requestLines.push(\"\", formatBody(error.request.body, redactString));\n }\n\n return [\n \"Request:\",\n ...requestLines,\n \"\",\n \"Response:\",\n `${error.response.status} ${error.response.statusText}`,\n formatHeaders(error.response.headers, redactString),\n \"\",\n formatBody(error.response.body, redactString)\n ].join(\"\\n\");\n}\n\nfunction resolveToolcraftVersion(version: string | undefined): string {\n return (\n version ??\n findPackageMetadata(new URL(\"./error-report.ts\", import.meta.url))?.version ??\n \"unknown\"\n );\n}\n\nfunction buildReport(context: ErrorReportRenderContext): string {\n const env = context.env ?? process.env;\n const error = context.error;\n const redactString = createReportStringRedactor(context, env);\n const errorName = error instanceof Error ? error.name : typeof error;\n const errorMessage = redactString(error instanceof Error ? error.message : String(error));\n const structuredFields = error instanceof Error ? ownStructuredFields(error, redactString) : {};\n const secretLines = Object.entries(context.command?.secrets ?? {}).map(([name, secret]) => {\n const value = context.secrets?.[name] ?? env[secret.env];\n return `${secret.env}=${redactValue(value)}`;\n });\n const lines = [\n \"Toolcraft Error Report\",\n \"\",\n \"Runtime\",\n `toolcraft version: ${resolveToolcraftVersion(context.version)}`,\n `node version: ${process.version}`,\n `platform: ${process.platform} ${process.arch}`,\n \"\",\n \"Argv\",\n redactString(\n stableJson(redactArgv(context.argv, { command: context.command, secrets: context.secrets }))\n ),\n \"\",\n \"Resolved Secrets\",\n ...(secretLines.length === 0 ? [\"<none>\"] : secretLines),\n \"\",\n \"Command Path\",\n context.commandPath === undefined || context.commandPath.length === 0\n ? \"root\"\n : context.commandPath,\n \"\",\n \"Parsed Params\",\n redactString(stableJson(redactParams(context.params, context.command))),\n \"\",\n \"Error\",\n `name: ${errorName}`,\n `message: ${errorMessage}`,\n \"structured fields:\",\n redactString(stableJson(structuredFields)),\n \"\",\n \"Stack\",\n formatStackChain(error, redactString)\n ];\n\n if (hasHttpContext(error)) {\n lines.push(\"\", \"HTTP Transcript\", formatHttpTranscript(error, redactString));\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/**\n * Renders the exact redacted content used by `writeErrorReport` without checking report enablement\n * or writing to the filesystem. `redactedKeys` lists every environment variable declared by the\n * command's secrets in declaration order, including variables that are currently unset.\n */\nexport function renderErrorReport(\n context: ErrorReportRenderContext\n): ErrorReportRenderResult {\n return {\n content: buildReport(context),\n redactedKeys: commandSecretEnvNames(context.command?.secrets)\n };\n}\n\nexport async function writeErrorReport(\n context: ErrorReportContext\n): Promise<ErrorReportResult | undefined> {\n const env = context.env ?? process.env;\n\n if (!reportsEnabled(context.errorReports, env) || isSkippedError(context.error)) {\n return undefined;\n }\n\n const projectRoot = resolveProjectRoot(context.projectRoot);\n const reportDir = resolveReportDir(context.errorReports, projectRoot);\n const fileName = `${formatTimestamp(new Date())}-${slugifyCommandPath(context.commandPath)}-${randomUUID()}.log`;\n const absolutePath = path.join(reportDir, fileName);\n\n await mkdir(reportDir, { recursive: true });\n if (reportDirMustStayWithinProject(context.errorReports)) {\n await assertReportDirWithinProject(projectRoot, reportDir);\n }\n await writeFile(absolutePath, renderErrorReport(context).content);\n\n return {\n absolutePath,\n displayPath: relativeDisplayPath(projectRoot, absolutePath)\n };\n}\n\nexport { hasHttpContext };\n", "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport function findProjectRoot(from: string = process.cwd()): string | undefined {\n let current = from === process.cwd() ? process.cwd() : path.resolve(from);\n\n while (true) {\n if (existsSync(path.join(current, \"package.json\"))) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n", "const REDACTED_VALUE = \"<redacted>\";\nconst SENSITIVE_NAME_PARTS = [\"password\", \"token\", \"apikey\", \"secret\"];\nconst AUTHORIZATION_HEADER_NAMES = new Set([\"authorization\", \"proxyauthorization\"]);\nconst SECRET_HEADER_NAMES = new Set([\"cookie\", \"setcookie\"]);\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeName(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nexport function isSensitiveName(name: string): boolean {\n const normalized = normalizeName(name);\n return SENSITIVE_NAME_PARTS.some((candidate) => normalized.includes(candidate));\n}\n\nfunction redactSecretLikeFieldsValue(\n value: unknown,\n name: string,\n seen: WeakSet<object>\n): unknown {\n if (name.length > 0 && isSensitiveName(name)) {\n return REDACTED_VALUE;\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n return value.map((entry) => redactSecretLikeFieldsValue(entry, name, seen));\n }\n\n if (isPlainObject(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactSecretLikeFieldsValue(entry, key, seen)\n ])\n );\n }\n\n return value;\n}\n\nexport function redactSecretLikeFields(value: unknown, name = \"\"): unknown {\n return redactSecretLikeFieldsValue(value, name, new WeakSet<object>());\n}\n\nfunction parseJsonObjectOrArray(value: string): unknown | undefined {\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return isPlainObject(parsed) || Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function redactHttpBody(body: unknown): unknown {\n if (typeof body === \"string\") {\n const parsed = parseJsonObjectOrArray(body);\n return parsed === undefined ? body : redactSecretLikeFields(parsed);\n }\n\n return redactSecretLikeFields(body);\n}\n\nexport function redactHttpHeaderValue(name: string, value: string): string {\n const normalized = normalizeName(name);\n\n if (AUTHORIZATION_HEADER_NAMES.has(normalized)) {\n return \"Bearer ****\";\n }\n\n if (SECRET_HEADER_NAMES.has(normalized) || isSensitiveName(name)) {\n return REDACTED_VALUE;\n }\n\n return value;\n}\n", "import type { NumberSchema } from \"toolcraft-schema\";\n\nexport function isValidNumberSchemaValue(value: unknown, schema: NumberSchema): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value)) &&\n (schema.minimum === undefined || value >= schema.minimum) &&\n (schema.maximum === undefined || value <= schema.maximum)\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n const type = schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n const bounds = [\n schema.minimum === undefined ? undefined : `greater than or equal to ${schema.minimum}`,\n schema.maximum === undefined ? undefined : `less than or equal to ${schema.maximum}`\n ].filter((bound): bound is string => bound !== undefined);\n\n return bounds.length === 0 ? type : `${type} ${bounds.join(\" and \")}`;\n}\n", "import { redactHttpBody } from \"./redaction.js\";\n\nexport interface HttpErrorLike {\n name: string;\n message: string;\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: unknown;\n };\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\n };\n}\n\nexport interface ApiErrorSummary {\n status: number;\n statusText: string;\n requestMethod: string;\n requestUrl: string;\n requestId?: string;\n code?: string;\n message?: string;\n fieldErrors?: Array<{ path: string; message: string }>;\n retryAfter?: string;\n hint?: string;\n}\n\nexport interface ToolcraftErrorEnvelope {\n kind: \"http\";\n message: string;\n code?: string;\n requestId?: string;\n http: {\n method: string;\n url: string;\n status: number;\n statusText: string;\n };\n fieldErrors?: Array<{ path: string; message: string }>;\n retryAfter?: string;\n hint?: string;\n reportPath?: string;\n}\n\nconst REQUEST_ID_FIELDS = [\"request_id\", \"requestId\", \"id\"];\nconst CODE_FIELDS = [\"code\", \"error_code\", \"errorCode\", \"error\"];\nconst MESSAGE_FIELDS = [\"message\", \"detail\", \"title\", \"error_description\"];\n\nexport function isHttpErrorLike(error: unknown): error is HttpErrorLike {\n if (!isPlainObject(error)) {\n return false;\n }\n\n if (typeof error.name !== \"string\" || typeof error.message !== \"string\") {\n return false;\n }\n\n const request = error.request;\n const response = error.response;\n\n return (\n isPlainObject(request) &&\n typeof request.method === \"string\" &&\n typeof request.url === \"string\" &&\n isStringRecord(request.headers) &&\n isPlainObject(response) &&\n typeof response.status === \"number\" &&\n typeof response.statusText === \"string\" &&\n isStringRecord(response.headers) &&\n hasOwnProperty(response, \"body\")\n );\n}\n\nexport function summarizeHttpError(error: HttpErrorLike): ApiErrorSummary {\n const body = redactHttpBody(error.response.body);\n const retryAfter = getHeader(error.response.headers, \"retry-after\");\n const message = extractMessage(body);\n const summary: ApiErrorSummary = {\n status: error.response.status,\n statusText: error.response.statusText,\n requestMethod: error.request.method,\n requestUrl: error.request.url,\n ...(message === undefined ? {} : { message }),\n ...optionalString(\"requestId\", getHeader(error.response.headers, \"x-request-id\") ?? extractFirstString(body, REQUEST_ID_FIELDS)),\n ...optionalString(\"code\", extractCode(body)),\n ...optionalString(\"retryAfter\", retryAfter),\n ...optionalArray(\"fieldErrors\", extractFieldErrors(body)),\n ...optionalString(\"hint\", createHttpErrorHint(error.response.status, retryAfter))\n };\n\n return summary;\n}\n\nexport function createHttpErrorEnvelope(\n error: HttpErrorLike,\n reportPath?: string\n): ToolcraftErrorEnvelope {\n const summary = summarizeHttpError(error);\n return {\n kind: \"http\",\n message: summary.message ?? error.message,\n ...(summary.code === undefined ? {} : { code: summary.code }),\n ...(summary.requestId === undefined ? {} : { requestId: summary.requestId }),\n http: {\n method: summary.requestMethod,\n url: summary.requestUrl,\n status: summary.status,\n statusText: summary.statusText\n },\n ...(summary.fieldErrors === undefined ? {} : { fieldErrors: summary.fieldErrors }),\n ...(summary.retryAfter === undefined ? {} : { retryAfter: summary.retryAfter }),\n ...(summary.hint === undefined ? {} : { hint: summary.hint }),\n ...(reportPath === undefined ? {} : { reportPath })\n };\n}\n\nfunction createHttpErrorHint(status: number, retryAfter: string | undefined): string | undefined {\n if (status === 401 || status === 403) {\n return \"Check the configured API credentials and permissions.\";\n }\n\n if ((status === 429 || status === 503) && retryAfter !== undefined) {\n return `Retry after ${retryAfter}.`;\n }\n\n return undefined;\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n const graphqlMessage = extractGraphQlMessage(body);\n if (graphqlMessage !== undefined) {\n return graphqlMessage;\n }\n\n return extractFirstString(body, MESSAGE_FIELDS);\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n const graphqlCode = extractGraphQlCode(body);\n if (graphqlCode !== undefined) {\n return graphqlCode;\n }\n\n return extractFirstString(body, CODE_FIELDS);\n}\n\nfunction extractGraphQlMessage(body: Record<string, unknown>): string | undefined {\n const [first] = Array.isArray(body.errors) ? body.errors : [];\n return isPlainObject(first) && typeof first.message === \"string\" ? first.message : undefined;\n}\n\nfunction extractGraphQlCode(body: Record<string, unknown>): string | undefined {\n const [first] = Array.isArray(body.errors) ? body.errors : [];\n if (!isPlainObject(first) || !isPlainObject(first.extensions)) {\n return undefined;\n }\n\n return typeof first.extensions.code === \"string\" ? first.extensions.code : undefined;\n}\n\nfunction extractFieldErrors(body: unknown): Array<{ path: string; message: string }> | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n const candidates = [body.field_errors, body.fieldErrors, body.errors, body.non_field_errors];\n const flattened = candidates.flatMap((candidate) => flattenFieldErrors(candidate, []));\n return flattened.length === 0 ? undefined : flattened;\n}\n\nfunction flattenFieldErrors(value: unknown, path: string[]): Array<{ path: string; message: string }> {\n if (typeof value === \"string\") {\n return [{ path: formatPath(path), message: value }];\n }\n\n if (Array.isArray(value)) {\n if (value.every((entry) => typeof entry === \"string\")) {\n return value.map((message) => ({ path: formatPath(path), message }));\n }\n\n return value.flatMap((entry, index) => flattenFieldErrors(entry, [...path, String(index)]));\n }\n\n if (!isPlainObject(value)) {\n return [];\n }\n\n return Object.entries(value).flatMap(([key, nested]) => flattenFieldErrors(nested, [...path, key]));\n}\n\nfunction formatPath(path: string[]): string {\n return path.length === 0 ? \"error\" : path.join(\".\");\n}\n\nfunction extractFirstString(\n body: unknown,\n fields: readonly string[]\n): string | undefined {\n if (!isPlainObject(body)) {\n return undefined;\n }\n\n for (const field of fields) {\n const value = body[field];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction getHeader(headers: Record<string, string>, name: string): string | undefined {\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === lowerName && value.length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction optionalString<Name extends string>(\n name: Name,\n value: string | undefined\n): Record<Name, string> | Record<string, never> {\n return value === undefined ? {} : { [name]: value } as Record<Name, string>;\n}\n\nfunction optionalArray<Name extends string, TValue>(\n name: Name,\n value: TValue[] | undefined\n): Record<Name, TValue[]> | Record<string, never> {\n return value === undefined ? {} : { [name]: value } as Record<Name, TValue[]>;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n return isPlainObject(value) && Object.values(value).every((entry) => typeof entry === \"string\");\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n", "import YAML from \"yaml\";\nimport { renderDetailCard } from \"toolcraft-design\";\nimport type { Command, RenderPrimitives } from \"./index.js\";\n\nexport type OutputMode = \"rich\" | \"md\" | \"json\";\n\ntype WriteStream = \"stdout\" | \"stderr\";\ntype WriteFn = (chunk: string, stream?: WriteStream) => void;\n\nexport interface RenderResultStatus {\n mcpError: boolean;\n}\n\ninterface McpCallToolResult {\n content?: unknown[];\n structuredContent?: unknown;\n isError?: boolean;\n _meta?: unknown;\n}\n\ninterface McpTextContent {\n type: \"text\";\n text: string;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isMcpCallToolResult(value: unknown): value is McpCallToolResult {\n if (!isObject(value)) {\n return false;\n }\n\n const hasContent = Array.isArray(value.content);\n const hasStructured = value.structuredContent !== undefined;\n if (!hasContent && !hasStructured) {\n return false;\n }\n\n return Object.keys(value).every(\n (key) =>\n key === \"content\" || key === \"structuredContent\" || key === \"isError\" || key === \"_meta\"\n );\n}\n\nfunction isMcpTextContent(value: unknown): value is McpTextContent {\n return isObject(value) && value.type === \"text\" && typeof value.text === \"string\";\n}\n\nfunction extractMcpPayload(envelope: McpCallToolResult): unknown {\n const structuredContent = envelope.structuredContent;\n if (isObject(structuredContent) && \"result\" in structuredContent) {\n return structuredContent.result;\n }\n\n if (structuredContent !== undefined) {\n return structuredContent;\n }\n\n if (Array.isArray(envelope.content)) {\n const text = envelope.content\n .filter(isMcpTextContent)\n .map((block) => block.text)\n .join(\"\\n\");\n\n return text.length > 0 ? text : undefined;\n }\n\n return undefined;\n}\n\nfunction unwrapMcpEnvelope(result: unknown): { result: unknown; mcpError: boolean } {\n if (!isMcpCallToolResult(result)) {\n return { result, mcpError: false };\n }\n\n return {\n result: extractMcpPayload(result),\n mcpError: result.isError === true,\n };\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 isNonEmptyArrayOfObjects(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.length > 0 && 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 humanizeKey(key: string): string {\n let output = \"\";\n let capitalizeNext = true;\n\n for (const char of key) {\n if (char === \"_\" || char === \"-\") {\n output += \" \";\n capitalizeNext = false;\n continue;\n }\n\n if (char >= \"A\" && char <= \"Z\" && output.length > 0 && !output.endsWith(\" \")) {\n output += \" \";\n }\n\n if (capitalizeNext) {\n output += char.toUpperCase();\n capitalizeNext = false;\n continue;\n }\n\n output += char;\n }\n\n return output;\n}\n\nfunction detailRows(\n result: Record<string, unknown>,\n depth = 0\n): Array<{ label: string; value: string }> {\n const rows: Array<{ label: string; value: string }> = [];\n\n for (const [key, value] of Object.entries(result)) {\n const label = `${\" \".repeat(depth)}${humanizeKey(key)}`;\n\n if (isObject(value)) {\n if (Object.keys(value).length === 0) {\n rows.push({ label, value: \"{}\" });\n continue;\n }\n\n rows.push({ label, value: \"\" });\n rows.push(...detailRows(value, depth + 1));\n continue;\n }\n\n if (isNonEmptyArrayOfObjects(value)) {\n rows.push({ label, value: \"\" });\n rows.push(...arrayObjectDetailRows(value, depth + 1));\n continue;\n }\n\n rows.push({ label, value: displayScalar(value) });\n }\n\n return rows;\n}\n\nfunction arrayObjectDetailRows(\n value: Array<Record<string, unknown>>,\n depth: number\n): Array<{ label: string; value: string }> {\n return value.flatMap((entry, index) => {\n if (value.length === 1) {\n return detailRows(entry, depth);\n }\n\n return [\n { label: `${\" \".repeat(depth)}${index + 1}`, value: \"\" },\n ...detailRows(entry, depth + 1)\n ];\n });\n}\n\nfunction displayScalar(value: unknown): string {\n if (typeof value === \"boolean\") {\n return value ? \"Yes\" : \"No\";\n }\n if (Array.isArray(value) && value.every((entry) => !isObject(entry) && !Array.isArray(entry))) {\n return value.map((entry) => displayScalar(entry)).join(\", \") || \"\u2014\";\n }\n return stringifyValue(value) || \"\u2014\";\n}\n\nfunction isUrl(value: unknown): value is string {\n return typeof value === \"string\" && (value.startsWith(\"https://\") || value.startsWith(\"http://\"));\n}\n\nfunction compactUrl(value: string): string {\n try {\n const url = new URL(value);\n const tail = url.pathname.split(\"/\").filter(Boolean).at(-1);\n return tail ? `${url.hostname}/\u2026/${tail}` : url.hostname;\n } catch {\n return value;\n }\n}\n\nfunction displayRowValue(value: unknown): string {\n return isUrl(value) ? compactUrl(value) : displayScalar(value);\n}\n\nfunction directScalarRows(result: Record<string, unknown>): Array<{ label: string; value: string }> {\n return Object.entries(result)\n .filter(([, value]) => !isObject(value) && !Array.isArray(value))\n .map(([key, value]) => ({ label: humanizeKey(key), value: displayRowValue(value) }));\n}\n\nfunction directObjectSections(result: Record<string, unknown>): Array<{ title: string; rows: Array<{ label: string; value: string }> }> {\n return Object.entries(result)\n .filter(([, value]) => isObject(value))\n .map(([key, value]) => ({ title: humanizeKey(key), rows: detailRows(value as Record<string, unknown>) }))\n .filter((section) => section.rows.length > 0);\n}\n\nfunction directArrayObjectSections(\n result: Record<string, unknown>\n): Array<{ title: string; rows: Array<{ label: string; value: string }> }> {\n return Object.entries(result).flatMap(([key, value]) => {\n if (!isNonEmptyArrayOfObjects(value)) {\n return [];\n }\n\n const title = humanizeKey(key);\n return value\n .map((entry, index) => ({\n title: value.length === 1 ? title : `${title} ${index + 1}`,\n rows: detailRows(entry)\n }))\n .filter((section) => section.rows.length > 0);\n });\n}\n\nfunction renderObjectCard(\n result: Record<string, unknown>,\n primitives: RenderPrimitives,\n title: string\n): string {\n const scalarRows = directScalarRows(result);\n const nestedSections = directObjectSections(result);\n const arrayObjectSections = directArrayObjectSections(result);\n const listRows = Object.entries(result)\n .filter(([, value]) => Array.isArray(value) && !isNonEmptyArrayOfObjects(value))\n .map(([key, value]) => ({ label: humanizeKey(key), value: displayScalar(value) }));\n\n return renderDetailCard({\n theme: primitives.getTheme(),\n title,\n sections: [\n { rows: scalarRows },\n ...nestedSections,\n { title: \"Lists\", rows: listRows },\n ...arrayObjectSections\n ]\n });\n}\n\nfunction richResultTitle(command: Command<any, any, any, any>): string {\n const description = command.description?.trim();\n if (description && !description.includes(\"\\n\") && description.length <= 64) {\n return description;\n }\n return command.name ? humanizeKey(command.name) : \"Result\";\n}\n\nexport function renderObjectTable(result: Record<string, unknown>, primitives: RenderPrimitives): string {\n const rows = detailRows(result);\n if (rows.length === 0) {\n return \"{}\";\n }\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n variant: \"detail\",\n columns: [\n {\n name: \"label\",\n title: \"Label\",\n alignment: \"left\",\n maxLen: Math.max(\"Label\".length, ...rows.map((row) => row.label.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\nexport function 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) =>\n Object.prototype.hasOwnProperty.call(row, name) ? stringifyValue(row[name]).length : 0\n )\n ),\n })),\n rows: result.map((row) =>\n Object.fromEntries(\n columnNames.map((name) => [\n name,\n Object.prototype.hasOwnProperty.call(row, name) ? stringifyValue(row[name]) : \"\"\n ])\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) =>\n Object.prototype.hasOwnProperty.call(row, name)\n ? stringifyValue(row[name]).replaceAll(\"|\", \"\\\\|\")\n : \"\"\n )\n .join(\" | \")} |`\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction autoRender(\n command: Command<any, any, any, any>,\n result: unknown,\n output: OutputMode,\n primitives: RenderPrimitives\n): 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 (output === \"rich\" && Array.isArray(result) && result.every((value) => typeof value === \"string\")) {\n return result.join(\"\\n\");\n }\n\n if (isObject(result)) {\n if (output === \"md\") {\n return renderObjectMarkdown(result);\n }\n\n if (output === \"json\") {\n return stringifyJson(result, 2);\n }\n\n return renderObjectCard(result, primitives, richResultTitle(command));\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 if (output === \"rich\") {\n return YAML.stringify(result);\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, stream = \"stdout\") => {\n if (stream === \"stderr\") {\n process.stderr.write(chunk);\n return;\n }\n\n process.stdout.write(chunk);\n }\n): RenderResultStatus {\n const unwrapped = unwrapMcpEnvelope(result);\n result = unwrapped.result;\n\n if (unwrapped.mcpError) {\n const payload = autoRender(command, result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`, \"stderr\");\n }\n return { mcpError: true };\n }\n\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 { mcpError: false };\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 { mcpError: false };\n }\n\n if (output === \"rich\" && command.render?.rich) {\n command.render.rich(result, primitives);\n return { mcpError: false };\n }\n\n const payload = autoRender(command, result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`);\n }\n return { mcpError: false };\n}\n", "import { text } from \"toolcraft-design\";\n\nexport interface SourceSnippetOptions {\n source: string;\n line: number;\n column?: number;\n context?: number;\n filePath?: string;\n}\n\nexport function renderSourceSnippet(opts: SourceSnippetOptions): string {\n const lines = opts.source.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\").split(\"\\n\");\n const line = clampInteger(opts.line, 1, Math.max(lines.length, 1));\n const context = Math.max(0, Math.floor(opts.context ?? 2));\n const startLine = Math.max(1, line - context);\n const endLine = Math.min(lines.length, line + context);\n const gutterWidth = String(endLine).length;\n const output: string[] = [];\n\n if (opts.filePath !== undefined) {\n output.push(\n muted(\n `--> ${opts.filePath}:${line}${opts.column === undefined ? \"\" : `:${Math.max(1, opts.column)}`}`\n )\n );\n }\n\n output.push(renderDivider(gutterWidth));\n\n for (let currentLine = startLine; currentLine <= endLine; currentLine += 1) {\n const sourceLine = lines[currentLine - 1] ?? \"\";\n output.push(`${muted(String(currentLine).padStart(gutterWidth, \" \"))} | ${sourceLine}`);\n\n if (currentLine === line && opts.column !== undefined) {\n const column = Math.max(1, Math.floor(opts.column));\n output.push(`${muted(\" \".repeat(gutterWidth))} | ${\" \".repeat(column - 1)}${error(\"^\")}`);\n }\n }\n\n output.push(renderDivider(gutterWidth));\n\n return output.join(\"\\n\");\n}\n\nfunction renderDivider(gutterWidth: number): string {\n return `${muted(\" \".repeat(gutterWidth))} |`;\n}\n\nfunction clampInteger(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) {\n return min;\n }\n\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\nfunction muted(value: string): string {\n return shouldStyleStderr() ? text.muted(value) : value;\n}\n\nfunction error(value: string): string {\n return shouldStyleStderr() ? text.error(value) : value;\n}\n\nfunction shouldStyleStderr(): boolean {\n return process.stderr.isTTY === true;\n}\n", "export type DebugStackMode = \"trim\" | \"raw\";\n\nconst HIDDEN_FRAME_SUMMARY_PREFIX = \" \u2026 (\";\nconst HIDDEN_FRAME_SUMMARY_SUFFIX = \" hidden \u2014 pass --debug=raw to show)\";\n\ninterface StackSection {\n header: string;\n lines: string[];\n}\n\nexport function enableSourceMaps(): void {\n process.setSourceMapsEnabled?.(true);\n}\n\nexport function formatDebugStack(stack: string, mode: DebugStackMode): string {\n return mode === \"raw\" ? stack : trimStack(stack);\n}\n\nexport function trimStack(stack: string): string {\n const sections = splitStackSections(stack);\n const trimmed = sections.map((section) => trimStackSection(section));\n const hiddenFrameCount = trimmed.reduce((count, section) => count + section.hiddenFrameCount, 0);\n\n if (hiddenFrameCount === 0) {\n return stack;\n }\n\n return trimmed.flatMap((section) => section.lines).join(\"\\n\");\n}\n\nfunction splitStackSections(stack: string): StackSection[] {\n const lines = stack.split(\"\\n\");\n const firstLine = lines[0];\n if (firstLine === undefined) {\n return [];\n }\n\n const sections: StackSection[] = [{ header: firstLine, lines: [] }];\n\n for (const line of lines.slice(1)) {\n if (isCauseHeader(line)) {\n sections.push({ header: line, lines: [] });\n continue;\n }\n\n sections[sections.length - 1]?.lines.push(line);\n }\n\n return sections;\n}\n\nfunction trimStackSection(section: StackSection): { lines: string[]; hiddenFrameCount: number } {\n const userFrames: string[] = [];\n const skippedFrames: string[] = [];\n\n for (const line of section.lines) {\n if (isFrameworkOrRuntimeFrame(line)) {\n skippedFrames.push(line);\n continue;\n }\n\n userFrames.push(line);\n }\n\n if (skippedFrames.length === 0) {\n return {\n lines: [section.header, ...section.lines],\n hiddenFrameCount: 0\n };\n }\n\n return {\n lines: [section.header, ...userFrames, formatHiddenFrameSummary(skippedFrames.length)],\n hiddenFrameCount: skippedFrames.length\n };\n}\n\nfunction isCauseHeader(line: string): boolean {\n return line.trimStart().startsWith(\"[cause]:\");\n}\n\nfunction isFrameworkOrRuntimeFrame(line: string): boolean {\n const normalized = line.replaceAll(\"\\\\\", \"/\");\n return (\n normalized.includes(\"node_modules/toolcraft/\") ||\n normalized.includes(\"node_modules/toolcraft-openapi/\") ||\n normalized.includes(\"node_modules/toolcraft-schema/\") ||\n normalized.includes(\"node_modules/commander/\") ||\n normalized.includes(\"node:internal/\") ||\n normalized.includes(\"/packages/toolcraft/src/\")\n );\n}\n\nfunction formatHiddenFrameSummary(count: number): string {\n const plural = count === 1 ? \"\" : \"s\";\n return `${HIDDEN_FRAME_SUMMARY_PREFIX}${count} framework / runtime frame${plural}${HIDDEN_FRAME_SUMMARY_SUFFIX}`;\n}\n", "import { UserError } from \"./user-error.js\";\n\nexport type ValidationError = {\n path: string;\n message: string;\n};\n\nconst MAX_RENDERED_VALIDATION_ERRORS = 10;\n\nexport function throwValidationErrors(errors: readonly ValidationError[]): void {\n if (errors.length === 0) {\n return;\n }\n\n if (errors.length === 1) {\n throw new UserError(errors[0]?.message ?? \"Invalid parameters.\");\n }\n\n const rendered = errors\n .slice(0, MAX_RENDERED_VALIDATION_ERRORS)\n .map((error) => ` - ${error.path}: ${error.message}`);\n const remaining = errors.length - rendered.length;\n\n if (remaining > 0) {\n rendered.push(` \u2026 and ${remaining} more`);\n }\n\n throw new UserError(`${errors.length} parameter errors:\\n${rendered.join(\"\\n\")}`);\n}\n", "import { access, lstat, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport type { HandlerEnv, HandlerFs } from \"../index.js\";\n\nexport const RESERVED_SERVICE_NAMES = new Set([\n \"params\",\n \"secrets\",\n \"fetch\",\n \"fs\",\n \"env\",\n \"diagnostics\",\n \"progress\",\n \"runtimeOptions\",\n \"root\"\n]);\n\nconst RESERVED_SERVICE_NAMES_MESSAGE =\n \"Available reserved names: params, secrets, fetch, fs, env, diagnostics, progress, runtimeOptions, root.\";\n\nexport function createFs(fs?: HandlerFs): HandlerFs {\n if (fs !== undefined) {\n return fs;\n }\n\n return {\n readFile: async (path: string, encoding = \"utf8\") => readFile(path, { encoding }),\n writeFile: async (\n path: string,\n contents: string,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ) => {\n await writeFile(path, contents, options);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n lstat: async (path: string) => lstat(path),\n rename: async (fromPath: string, toPath: string) => rename(fromPath, toPath),\n unlink: async (path: string) => unlink(path)\n };\n}\n\nexport function 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\nexport function validateServices(services: object): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(\n `Service name \"${name}\" is reserved. Choose a different name. ${RESERVED_SERVICE_NAMES_MESSAGE}`\n );\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 await Promise.all(\n sessions.map(async (session) => {\n await session.close();\n this.sessionMap.delete(session.id);\n })\n );\n }\n}\n", "import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\nconst CLOSE_AFTER_SIGKILL_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n scope?: \"history\" | \"screen\";\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closePromise: Promise<number> | null = null;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n assertTerminalGeometry(cols, rows);\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" has already exited.`);\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const scope = opts?.scope ?? \"history\";\n assertTimeout(timeout);\n assertWaitScope(scope);\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const source = scope === \"screen\" ? (await this.screen()).text : this.rawBuffer;\n const matched = matchPattern(source, pattern);\n if (matched !== null) {\n return matched;\n }\n\n if (this.exitCode !== null) {\n throw new Error(`Terminal session \"${this.id}\" exited before matching pattern: ${String(pattern)}`);\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n assertQuietPeriod(ms);\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n if (!Number.isInteger(opts.last) || opts.last < 0) {\n throw new Error(\"History last must be a non-negative integer.\");\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n assertTerminalGeometry(cols, rows);\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (opts?.timeout !== undefined) {\n assertTimeout(opts.timeout);\n }\n\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n this.closePromise ??= this.closeProcess().catch((error: unknown) => {\n this.closePromise = null;\n throw error;\n });\n return this.closePromise;\n }\n\n private async closeProcess(): Promise<number> {\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n const afterSigkill = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGKILL_MS);\n if (afterSigkill !== null) {\n return afterSigkill;\n }\n }\n\n throw new Error(\"Timed out waiting for process to exit after SIGKILL.\");\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction assertTerminalGeometry(cols: number, rows: number): void {\n if (!Number.isInteger(cols) || cols <= 0 || !Number.isInteger(rows) || rows <= 0) {\n throw new Error(\"Terminal columns and rows must be positive integers.\");\n }\n}\n\nfunction assertTimeout(timeout: number): void {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new Error(\"Timeout must be a finite non-negative number.\");\n }\n}\n\nfunction assertWaitScope(scope: string): void {\n if (scope !== \"history\" && scope !== \"screen\") {\n throw new Error('Wait scope must be either \"history\" or \"screen\".');\n }\n}\n\nfunction assertQuietPeriod(duration: number): void {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new Error(\"Quiet period must be a finite non-negative number.\");\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n let line = \"\";\n let cursor = 0;\n\n for (const character of input) {\n if (character === \"\\r\") {\n cursor = 0;\n continue;\n }\n\n if (character === \"\\b\") {\n cursor = Math.max(0, cursor - 1);\n continue;\n }\n\n if (character === \"\\n\") {\n output += `${line}\\n`;\n line = \"\";\n cursor = 0;\n continue;\n }\n\n line = `${line.slice(0, cursor)}${character}${line.slice(cursor + 1)}`;\n cursor += 1;\n }\n\n return output + line;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n conceal: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\ninterface SavedCursorState {\n x: number;\n y: number;\n autoWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\ninterface PrimaryScreenState {\n screen: Row[];\n cursorX: number;\n cursorY: number;\n pendingWrap: boolean;\n style: SgrStyleState;\n styleSequence: string;\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\nconst DEC_SPECIAL_GRAPHICS: Record<string, string> = {\n j: \"\u2518\",\n k: \"\u2510\",\n l: \"\u250C\",\n m: \"\u2514\",\n n: \"\u253C\",\n q: \"\u2500\",\n t: \"\u251C\",\n u: \"\u2524\",\n v: \"\u2534\",\n w: \"\u252C\",\n x: \"\u2502\"\n};\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n StringEscape,\n EscCharset,\n EscHash\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _primaryScreen: PrimaryScreenState | null = null;\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor: SavedCursorState;\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _pendingWrap = false;\n private _originMode = false;\n private _insertMode = false;\n private _tabStops: Set<number>;\n private _lastPrintedChar: string | null = null;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n private _stringState = State.Normal;\n private _charsetTarget: \"g0\" | \"g1\" | null = null;\n private _g0Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _g1Charset: \"ascii\" | \"graphics\" = \"ascii\";\n private _shiftOut = false;\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n this._tabStops = this._createDefaultTabStops(cols);\n this._savedCursor = this._createSavedCursorState();\n\n this.displayBuffer = Object.defineProperties(\n {} as {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true }\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = this._clamp(this._scrollTop, 0, rows - 1);\n this._scrollBottom = this._clamp(this._scrollBottom, 0, rows - 1);\n if (this._scrollTop >= this._scrollBottom) {\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n }\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _createDefaultTabStops(cols: number): Set<number> {\n const tabStops = new Set<number>();\n for (let column = 8; column < cols; column += 8) {\n tabStops.add(column);\n }\n return tabStops;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _createSavedCursorState(): SavedCursorState {\n return {\n x: this._cursorX,\n y: this._cursorY,\n autoWrap: this._autoWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n }\n\n private _saveCursor(): void {\n this._savedCursor = this._createSavedCursorState();\n }\n\n private _restoreCursor(): void {\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n this._autoWrap = this._savedCursor.autoWrap;\n this._style = {\n ...this._savedCursor.style,\n fg: this._savedCursor.style.fg?.slice(),\n bg: this._savedCursor.style.bg?.slice()\n };\n this._styleSequence = this._savedCursor.styleSequence;\n }\n\n private _resetModes(): void {\n this._autoWrap = true;\n this._originMode = false;\n this._insertMode = false;\n this._pendingWrap = false;\n this._tabStops = this._createDefaultTabStops(this._cols);\n this._g0Charset = \"ascii\";\n this._g1Charset = \"ascii\";\n this._shiftOut = false;\n this._resetStyle();\n }\n\n private _writePrintable(ch: string): void {\n const width = this._cellWidth(ch);\n\n if (width === 0) {\n this._appendCombiningMark(ch);\n return;\n }\n\n if (this._autoWrap && this._pendingWrap) {\n this._cursorX = 0;\n this._newline();\n } else if (this._autoWrap && this._cursorX + width > this._cols) {\n this._cursorX = 0;\n this._newline();\n }\n\n if (this._insertMode) {\n const row = this._screen[this._cursorY];\n if (row) {\n row.splice(this._cursorX, 0, ...(Array(width).fill(null) as Cell[]));\n row.splice(this._cols);\n }\n }\n\n this._setChar(this._cursorY, this._cursorX, ch);\n for (let column = 1; column < width && this._cursorX + column < this._cols; column += 1) {\n const row = this._screen[this._cursorY];\n if (row) row[this._cursorX + column] = null;\n }\n this._lastPrintedChar = ch;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX + width, this._cols - 1);\n this._pendingWrap = false;\n } else if (this._cursorX + width >= this._cols) {\n this._cursorX = this._cols - 1;\n this._pendingWrap = true;\n } else {\n this._cursorX += width;\n this._pendingWrap = false;\n }\n }\n\n private _cellWidth(ch: string): number {\n const codePoint = ch.codePointAt(0);\n if (codePoint === undefined) return 0;\n if (isCombiningCodePoint(codePoint)) {\n return 0;\n }\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x303e) ||\n (codePoint >= 0x3041 && codePoint <= 0x33bf) ||\n (codePoint >= 0x3400 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4cf) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7af) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1fffd) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return Math.min(2, this._cols);\n }\n return 1;\n }\n\n private _appendCombiningMark(ch: string): void {\n const target = this._findCombiningTarget();\n if (target === null) {\n return;\n }\n\n const cell = this._screen[target.y]?.[target.x];\n if (cell === null || cell === undefined) {\n return;\n }\n\n cell[1] += ch;\n }\n\n private _findCombiningTarget(): { x: number; y: number } | null {\n const startX = this._pendingWrap ? this._cursorX : this._cursorX - 1;\n\n for (let y = this._cursorY; y >= 0; y -= 1) {\n const row = this._screen[y];\n if (row === undefined) {\n continue;\n }\n\n for (let x = y === this._cursorY ? startX : this._cols - 1; x >= 0; x -= 1) {\n if (row[x] !== null) {\n return { x, y };\n }\n }\n }\n\n return null;\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const renderedChar = this._style.conceal ? \" \" : ch;\n const cell = [renderedChar.charCodeAt(0), renderedChar] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n this._pendingWrap = false;\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n const values = this._csiParams\n .split(\";\")\n .flatMap((segment) => segment.split(\":\"))\n .map((segment) => (segment === \"\" ? 0 : parseInt(segment, 10)));\n if ((values[0] === 38 || values[0] === 48) && values[1] === 2 && values[2] === 0) {\n values.splice(2, 1);\n }\n return values;\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(6)) {\n this._originMode = final === \"h\";\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._primaryScreen = {\n screen: this._screen,\n cursorX: this._cursorX,\n cursorY: this._cursorY,\n pendingWrap: this._pendingWrap,\n style: { ...this._style, fg: this._style.fg?.slice(), bg: this._style.bg?.slice() },\n styleSequence: this._styleSequence\n };\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._pendingWrap = false;\n } else {\n if (this._primaryScreen !== null) {\n this._screen = this._primaryScreen.screen;\n this._cursorX = this._primaryScreen.cursorX;\n this._cursorY = this._primaryScreen.cursorY;\n this._pendingWrap = this._primaryScreen.pendingWrap;\n this._style = this._primaryScreen.style;\n this._styleSequence = this._primaryScreen.styleSequence;\n this._primaryScreen = null;\n }\n }\n if (final === \"h\") this._resetStyle();\n }\n }\n return;\n }\n\n if ((final === \"h\" || final === \"l\") && params.includes(4)) {\n this._insertMode = final === \"h\";\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._originMode\n ? this._clamp(this._scrollTop + Math.max(1, p0) - 1, this._scrollTop, this._scrollBottom)\n : this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++)\n this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": {\n // insert lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": {\n // delete lines\n if (this._cursorY < this._scrollTop || this._cursorY > this._scrollBottom) {\n break;\n }\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": {\n // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": {\n // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": {\n // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"b\": // repeat preceding character\n if (this._lastPrintedChar !== null) {\n for (let index = 0; index < Math.max(1, p0); index += 1) {\n this._writePrintable(this._lastPrintedChar);\n }\n }\n break;\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": {\n // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = this._originMode ? this._scrollTop : 0;\n break;\n }\n case \"s\": // save cursor\n this._saveCursor();\n break;\n case \"u\": // restore cursor\n this._restoreCursor();\n break;\n case \"p\":\n if (this._csiPrivate === \"!\") {\n this._resetModes();\n }\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n if (this._state !== State.Normal && (code === 0x18 || code === 0x1a)) {\n this._state = State.Normal;\n return;\n }\n\n if (this._state === State.Csi && code === 0x1b) {\n this._state = State.Escape;\n return;\n }\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ST\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Osc;\n this._state = State.StringEscape;\n }\n break;\n case State.Str:\n // consume until ST\n if (code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._stringState = State.Str;\n this._state = State.StringEscape;\n }\n break;\n case State.StringEscape:\n this._state = ch === \"\\\\\" ? State.Normal : this._stringState;\n break;\n case State.EscCharset:\n if (this._charsetTarget === \"g0\") this._g0Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n if (this._charsetTarget === \"g1\") this._g1Charset = ch === \"0\" ? \"graphics\" : \"ascii\";\n this._charsetTarget = null;\n this._state = State.Normal;\n break;\n case State.EscHash:\n if (ch === \"8\") {\n for (let row = 0; row < this._rows; row += 1) {\n for (let column = 0; column < this._cols; column += 1) {\n this._setChar(row, column, \"E\");\n }\n }\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x85) {\n // C1 NEL = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x9c) {\n // C1 ST outside a string has no visible effect\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n this._pendingWrap = false;\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL \u2014 ignore in displayed output\n } else if (code === 0x09) {\n // HT\n const nextTabStop = [...this._tabStops]\n .sort((left, right) => left - right)\n .find((tabStop) => tabStop > this._cursorX);\n this._cursorX = nextTabStop ?? this._cols - 1;\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._pendingWrap = false;\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 shift between G1 and G0 character sets\n this._shiftOut = code === 0x0e;\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n const charset = this._shiftOut ? this._g1Charset : this._g0Charset;\n this._writePrintable(charset === \"graphics\" ? (DEC_SPECIAL_GRAPHICS[ch] ?? ch) : ch);\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (\n code === 0x28 ||\n code === 0x29 ||\n code === 0x2a ||\n code === 0x2b ||\n code === 0x2d ||\n code === 0x2e\n ) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._charsetTarget = code === 0x28 ? \"g0\" : code === 0x29 ? \"g1\" : null;\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._saveCursor();\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._restoreCursor();\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = horizontal tab set\n this._tabStops.add(this._cursorX);\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetModes();\n this._savedCursor = this._createSavedCursorState();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b || code === 0x3a) {\n // Digit, semicolon, or colon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 8:\n this._style.conceal = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 28:\n this._style.conceal = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n conceal: false,\n strikethrough: false\n };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.conceal) {\n codes.push(8);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\nconst NAMED_KEY_PATTERN = Object.keys(NAMED_KEY_SEQUENCES).map(caseInsensitivePattern).join(\"|\");\n\nexport const TERMINAL_KEY_PATTERN = `^(?:${NAMED_KEY_PATTERN}|.|[Cc][Oo][Nn][Tt][Rr][Oo][Ll]\\\\+[A-Za-z]|[Aa][Ll][Tt]\\\\+.+)$`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n\nfunction caseInsensitivePattern(value: string): string {\n let pattern = \"\";\n\n for (const character of value) {\n const lower = character.toLowerCase();\n const upper = character.toUpperCase();\n pattern += lower === upper ? escapePatternCharacter(character) : `[${upper}${lower}]`;\n }\n\n return pattern;\n}\n\nfunction escapePatternCharacter(character: string): string {\n return character.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"toolcraft\";\nimport type { HandlerEnv } from \"toolcraft\";\nimport type { TerminalPilotInstallerServices } from \"./installer.js\";\nimport { TerminalPilot, type NewSessionOptions } from \"../terminal-pilot.js\";\nimport type { TerminalSession } from \"../terminal-session.js\";\n\nexport const SESSION_ENV_VAR = \"TERMINAL_PILOT_SESSION\";\n\ntype SessionLike = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\ntype PilotLike = Pick<TerminalPilot, \"newSession\" | \"getSession\" | \"deleteSession\" | \"sessions\">;\ntype ClosablePilotLike = PilotLike & Pick<TerminalPilot, \"close\">;\n\ntype NamedSession = {\n name: string;\n session: SessionLike;\n};\n\ntype CreateSessionParams = NewSessionOptions & {\n session?: string;\n};\n\nexport interface TerminalPilotRuntime {\n createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession>;\n resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession>;\n closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n hasRetainedSessions(): Promise<boolean>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n const pendingNames = new Set<string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n const requestedName = name ?? env?.get(SESSION_ENV_VAR);\n\n if (requestedName !== undefined && requestedName.trim().length === 0) {\n throw new UserError(\"Session name must not be empty.\");\n }\n\n return requestedName;\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`) || pendingNames.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n if (nameToId.get(name) === sessionId) {\n nameToId.delete(name);\n }\n if (idToName.get(sessionId) === name) {\n idToName.delete(sessionId);\n }\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(\n `Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n async function discardExitedSessionName(name: string): Promise<void> {\n const sessionId = nameToId.get(name);\n if (sessionId === undefined) {\n return;\n }\n\n const pilot = await getPilot();\n try {\n const session = pilot.getSession(sessionId);\n if (session.exitCode === null) {\n return;\n }\n pilot.deleteSession(sessionId);\n } catch {\n // Missing sessions no longer reserve public names.\n }\n forgetSession(name, sessionId);\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n if (params.command.trim().length === 0) {\n throw new UserError(\"Command must not be empty.\");\n }\n\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n await discardExitedSessionName(requestedName);\n\n if (nameToId.has(requestedName) || pendingNames.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n pendingNames.add(requestedName);\n try {\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n } finally {\n pendingNames.delete(requestedName);\n }\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(\n name: string | undefined,\n env?: HandlerEnv\n ): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async hasRetainedSessions(): Promise<boolean> {\n return nameToId.size > 0 || pendingNames.size > 0;\n },\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n pendingNames.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n return { exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n command: S.String({ description: \"Command to execute\", minLength: 1, pattern: \"\\\\S\" }),\n args: S.Optional(S.Array(S.String(), { description: \"Command arguments\" })),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n cwd: S.Optional(S.String({ description: \"Working directory\" })),\n cols: S.Optional(\n S.Number({ description: \"Terminal width in columns\", jsonType: \"integer\", minimum: 1 })\n ),\n rows: S.Optional(\n S.Number({ description: \"Terminal height in rows\", jsonType: \"integer\", minimum: 1 })\n ),\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(\n params,\n env\n );\n return { session: namedSession.name, pid: namedSession.session.pid };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\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(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.fill(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\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 cursor: {\n globalSkillDir: \"~/.cursor/skills-cursor\",\n localSkillDir: \".cursor/skills\"\n },\n \"gemini-cli\": {\n globalSkillDir: \"~/.gemini/skills\",\n localSkillDir: \".gemini/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.freeze(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: { ...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, homeDir: string = os.homedir()): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return 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 ? homeDir : path.join(homeDir, remainder);\n}\n\nexport function resolveSkillDir(\n config: AgentSkillConfig,\n scope: SkillScope,\n cwd: string,\n homeDir?: string\n): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir, homeDir));\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 apiShapes: [\"anthropic-messages\"],\n otelCapture: {\n env: {\n CLAUDE_CODE_ENABLE_TELEMETRY: \"1\"\n }\n },\n configPath: \"~/.claude.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: \"~/.config/Claude/claude_desktop_config.json\",\n configPaths: {\n darwin: \"~/Library/Application Support/Claude/claude_desktop_config.json\",\n linux: \"~/.config/Claude/claude_desktop_config.json\",\n win32: \"~/AppData/Roaming/Claude/claude_desktop_config.json\"\n },\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 apiShapes: [\"openai-responses\"],\n otelCapture: {\n args: (endpoint, content) => [\n \"-c\",\n `otel.trace_exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/traces`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/logs`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.log_user_prompt=${content}`\n ]\n },\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 cursorAgent: AgentDefinition = {\n id: \"cursor\",\n name: \"cursor\",\n aliases: [\"cursor-agent\"],\n label: \"Cursor\",\n summary: \"Cursor's CLI coding agent.\",\n binaryName: \"cursor-agent\",\n configPath: \"~/.cursor/mcp.json\",\n branding: {\n colors: {\n dark: \"#FFFFFF\",\n light: \"#000000\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const geminiCliAgent: AgentDefinition = {\n id: \"gemini-cli\",\n name: \"gemini-cli\",\n aliases: [\"gemini\"],\n label: \"Gemini CLI\",\n summary: \"Configure Google's Gemini CLI to use a compatible Google generations API.\",\n binaryName: \"gemini\",\n configPath: \"~/.gemini/settings.json\",\n apiShapes: [\"google-generations\"],\n branding: {\n colors: {\n dark: \"#8AB4F8\",\n light: \"#1A73E8\"\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 apiShapes: [\"openai-chat-completions\"],\n otelCapture: {\n env: {\n OPENCODE_CONFIG_CONTENT: '{\"experimental\":{\"openTelemetry\":true}}'\n }\n },\n configPath: \"~/.config/opencode/opencode.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 apiShapes: [\"openai-chat-completions\"],\n configPath: \"~/.kimi/mcp.json\",\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 apiShapes: [\"openai-chat-completions\"],\n otelCapture: {},\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 apiShapes: [\"openai-responses\", \"openai-chat-completions\"],\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 cursorAgent,\n geminiCliAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nfunction freezeAgent(agent: AgentDefinition): AgentDefinition {\n if (agent.aliases !== undefined) {\n Object.freeze(agent.aliases);\n }\n if (agent.apiShapes !== undefined) {\n Object.freeze(agent.apiShapes);\n }\n if (agent.otelCapture?.env !== undefined) {\n Object.freeze(agent.otelCapture.env);\n }\n if (agent.otelCapture !== undefined) {\n Object.freeze(agent.otelCapture);\n }\n Object.freeze(agent.branding.colors);\n Object.freeze(agent.branding);\n return Object.freeze(agent);\n}\n\nexport const allAgents: readonly AgentDefinition[] = Object.freeze([\n freezeAgent(claudeCodeAgent),\n freezeAgent(claudeDesktopAgent),\n freezeAgent(codexAgent),\n freezeAgent(cursorAgent),\n freezeAgent(geminiCliAgent),\n freezeAgent(openCodeAgent),\n freezeAgent(kimiAgent),\n freezeAgent(gooseAgent),\n freezeAgent(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.trim().toLowerCase());\n}\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n RestoreBackupMutation,\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 /** Keep the first baseline only, including an originally missing target. */\n once?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RestoreBackupOptions {\n /** Target file path whose latest generated backup should be restored. */\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 once: options.once,\n label: options.label\n };\n}\n\nfunction restoreBackup(options: RestoreBackupOptions): RestoreBackupMutation {\n return {\n kind: \"restoreBackup\",\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 restoreBackup\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 renderTemplate() */\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 renderTemplate() */\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 renderTemplate() */\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 { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { renderTemplate } from \"toolcraft-design\";\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 { cloneConfigObject, setConfigEntry } from \"../formats/object.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\nimport { hasOwnErrorCode } from \"../error-codes.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 context: MutationContext,\n targetPath: string,\n content: string\n): Promise<void> {\n const baseBackupPath = createInvalidDocumentBackupPath(targetPath);\n let attempt = 0;\n while (true) {\n const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;\n await assertRegularWriteTarget(context, backupPath);\n try {\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\", flag: \"wx\" });\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await context.fs.unlink(backupPath).catch(() => undefined);\n throw error;\n }\n attempt += 1;\n }\n }\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nasync function assertRegularWriteTarget(\n context: MutationContext,\n targetPath: string\n): Promise<void> {\n // Symlinks inside the managed home directory are untrusted: an attacker could\n // plant one to redirect a credential/config write outside it. Symlinks at or\n // above home are legitimate system links (e.g. /tmp -> /private/tmp on macOS,\n // /var -> /private/var) and must not block writes, so bound the walk at home.\n const boundary = path.dirname(path.resolve(context.homeDir));\n let currentPath = path.resolve(targetPath);\n while (currentPath !== boundary) {\n try {\n if ((await context.fs.lstat(currentPath)).isSymbolicLink()) {\n throw new Error(`Refusing mutation write through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n\n const parentPath = path.dirname(currentPath);\n if (parentPath === currentPath) {\n return;\n }\n currentPath = parentPath;\n }\n}\n\nasync function writeAtomically(\n context: MutationContext,\n targetPath: string,\n content: string\n): Promise<void> {\n await assertRegularWriteTarget(context, targetPath);\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const tempPath = `${targetPath}.mutation-tmp-${process.pid}-${randomUUID()}`;\n let tempCreated = false;\n try {\n await assertRegularWriteTarget(context, tempPath);\n await context.fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n await context.fs.rename(tempPath, targetPath);\n tempCreated = false;\n return;\n } catch (error) {\n const alreadyExists = isAlreadyExists(error);\n if (tempCreated || !alreadyExists) {\n try {\n await context.fs.unlink(tempPath);\n } catch (cleanupError) {\n if (!isNotFound(cleanupError)) {\n void cleanupError;\n }\n }\n }\n\n if (alreadyExists) {\n continue;\n }\n\n throw error;\n }\n }\n\n throw new Error(`Unable to create temporary mutation file for ${targetPath}.`);\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 \"restoreBackup\":\n return `Restore ${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 mutationTargetPath(\n mutation: Mutation,\n options: MutationOptions\n): string | undefined {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n case \"removeDirectory\":\n return resolveValue(mutation.path, options);\n case \"removeFile\":\n case \"chmod\":\n case \"backup\":\n case \"restoreBackup\":\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateWrite\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return resolveValue(mutation.target, options);\n default:\n return undefined;\n }\n}\n\nexport function resolveMutationDetails(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): MutationDetails {\n try {\n const rawTarget = mutationTargetPath(mutation, options);\n if (rawTarget === undefined) {\n return {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind\n };\n }\n\n try {\n const targetPath = resolvePath(rawTarget, context.homeDir, context.pathMapper);\n return {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n } catch {\n return {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, rawTarget),\n targetPath: undefined\n };\n }\n } catch {\n return {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind\n };\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 setConfigEntry(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 = cloneConfigObject(base);\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n\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 setConfigEntry(result, key, mergePrunedConfigObject(pruned, value));\n } else {\n setConfigEntry(result, key, mergeWithPruneByPrefix(current, value, prefixMap));\n }\n continue;\n }\n setConfigEntry(result, key, value);\n }\n return result;\n}\n\nfunction mergePrunedConfigObject(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result = cloneConfigObject(base);\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n\n setConfigEntry(result, key, value);\n }\n\n return result;\n}\n\nfunction serializeConfigUpdate(\n format: ReturnType<typeof getConfigFormat>,\n rawContent: string | null,\n current: ConfigObject,\n next: ConfigObject\n): string {\n if (rawContent !== null && format.serializeUpdate) {\n return format.serializeUpdate(rawContent, current, next);\n }\n return format.serialize(next);\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 \"restoreBackup\":\n return applyRestoreBackup(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 await assertRegularWriteTarget(context, targetPath);\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) {\n mutation.whenContentMatches.lastIndex = 0;\n }\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 await assertRegularWriteTarget(context, targetPath);\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 await assertRegularWriteTarget(context, targetPath);\n if (mutation.once && (await findLatestGeneratedBackup(context.fs, targetPath)) !== null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null && !mutation.once) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const baseBackupPath = `${targetPath}.backup-${createTimestamp()}${content === null ? \".missing\" : \"\"}`;\n let attempt = 0;\n while (true) {\n const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;\n try {\n await assertRegularWriteTarget(context, backupPath);\n await context.fs.writeFile(backupPath, content ?? \"\", { encoding: \"utf8\", flag: \"wx\" });\n break;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await context.fs.unlink(backupPath).catch(() => undefined);\n throw error;\n }\n attempt += 1;\n }\n }\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\nasync function applyRestoreBackup(\n mutation: Extract<Mutation, { kind: \"restoreBackup\" }>,\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 const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n const backup = await findLatestGeneratedBackup(context.fs, targetPath);\n\n if (backup === null) {\n return { outcome: { changed: false, effect: \"none\", detail: \"noop\" }, details };\n }\n\n if (!context.dryRun) {\n await assertRegularWriteTarget(context, backup.path);\n if (backup.originallyMissing) {\n try {\n await context.fs.unlink(targetPath);\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n } else {\n const content = await context.fs.readFile(backup.path, \"utf8\");\n await writeAtomically(context, targetPath, content);\n }\n await context.fs.unlink(backup.path);\n }\n\n return { outcome: { changed: true, effect: \"copy\", detail: \"restore\" }, details };\n}\n\nasync function findLatestGeneratedBackup(\n fs: FileSystem,\n targetPath: string\n): Promise<{ path: string; originallyMissing: boolean } | null> {\n const separatorIndex = targetPath.lastIndexOf(\"/\");\n const directoryPath = separatorIndex <= 0 ? \"/\" : targetPath.slice(0, separatorIndex);\n const targetName = targetPath.slice(separatorIndex + 1);\n let entries: string[];\n\n try {\n entries = await fs.readdir(directoryPath);\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n\n const backupName = entries\n .filter((entry) => isGeneratedBackupName(entry, targetName))\n .sort()\n .at(-1);\n return backupName === undefined\n ? null\n : {\n path: `${directoryPath}/${backupName}`,\n originallyMissing: backupName.endsWith(\".missing\")\n };\n}\n\nfunction isGeneratedBackupName(entry: string, targetName: string): boolean {\n const prefix = `${targetName}.backup-`;\n if (!entry.startsWith(prefix)) {\n return false;\n }\n\n const suffix = entry.slice(prefix.length);\n const timestamp = suffix.slice(0, 24);\n if (timestamp.length !== 24 || timestamp[4] !== \"-\" || timestamp[7] !== \"-\" || timestamp[10] !== \"T\" || timestamp[13] !== \"-\" || timestamp[16] !== \"-\" || timestamp[19] !== \"-\" || timestamp[23] !== \"Z\") {\n return false;\n }\n const parsedTimestamp = `${timestamp.slice(0, 13)}:${timestamp.slice(14, 16)}:${timestamp.slice(17, 19)}.${timestamp.slice(20)}`;\n if (Number.isNaN(Date.parse(parsedTimestamp))) {\n return false;\n }\n const collisionSuffix = suffix.slice(24);\n if (collisionSuffix.length === 0) {\n return true;\n }\n if (collisionSuffix === \".missing\") {\n return true;\n }\n return collisionSuffix[0] === \"-\" && collisionSuffix.slice(1).length > 0 && [...collisionSuffix.slice(1)].every((character) => character >= \"0\" && character <= \"9\");\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 preserveContent = rawContent;\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 && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n preserveContent = null;\n }\n\n const value = resolveValue(mutation.value, options);\n if (!isConfigObject(value)) {\n throw new Error(`configMerge value must be an object for \"${rawPath}\".`);\n }\n\n // Keep prefix pruning on the same proto-safe object-write path as normal merges.\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 = serializeConfigUpdate(format, preserveContent, current, merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\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 = serializeConfigUpdate(format, rawContent, current, result);\n if (!context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\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 preserveContent = rawContent;\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n preserveContent = null;\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 = serializeConfigUpdate(format, preserveContent, current, transformed);\n const serializedChanged = serialized !== rawContent;\n if (!serializedChanged) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\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 = renderTemplate(template, templateContext);\n\n const current = await readFileIfExists(context.fs, targetPath);\n const changed = current !== rendered;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, rendered);\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (current === null ? \"create\" : \"update\") : \"noop\"\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 = renderTemplate(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 && !context.dryRun) {\n await backupInvalidDocument(context, 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 writeAtomically(context, targetPath, serialized);\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\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.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 cloneConfigObject(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 = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(result, key, value as ConfigValue);\n }\n return result;\n}\n\nfunction configValuesEqual(left: ConfigValue | undefined, right: ConfigValue | undefined): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\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 setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (isConfigObject(pattern) && Object.keys(pattern).length > 0) {\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 const current = parse(content);\n return serializeUpdate(content || \"{}\", current, merge(current, patch));\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\nfunction serializeUpdate(\n content: string,\n current: ConfigObject,\n next: ConfigObject\n): string {\n let result = content || \"{}\";\n result = applyObjectUpdate(result, [], current, next);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\nfunction applyObjectUpdate(\n content: string,\n path: (string | number)[],\n current: ConfigObject,\n next: ConfigObject\n): string {\n let result = content;\n\n for (const key of Object.keys(current)) {\n if (!hasConfigEntry(next, key)) {\n result = removeAtPath(result, [...path, key]);\n }\n }\n\n for (const [key, nextValue] of Object.entries(next)) {\n const nextPath = [...path, key];\n const hasCurrent = hasConfigEntry(current, key);\n const currentValue = hasCurrent ? current[key] : undefined;\n\n if (hasCurrent && isConfigObject(currentValue) && isConfigObject(nextValue)) {\n result = applyObjectUpdate(result, nextPath, currentValue, nextValue);\n continue;\n }\n\n if (!hasCurrent || !configValuesEqual(currentValue, nextValue)) {\n result = modifyAtPath(result, nextPath, nextValue as ConfigValue);\n }\n }\n\n return result;\n}\n\nexport {\n detectIndent,\n modifyAtPath,\n mergePreservingComments,\n removeAtPath,\n serializeUpdate\n};\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n serializeUpdate,\n merge,\n prune\n};\n", "import type { ConfigObject, ConfigValue } from \"../types.js\";\n\nexport function cloneConfigObject(value: ConfigObject): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, entry] of Object.entries(value)) {\n setConfigEntry(result, key, cloneConfigValue(entry));\n }\n return result;\n}\n\nexport function setConfigEntry(target: ConfigObject, key: string, value: ConfigValue): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nexport function hasConfigEntry(target: ConfigObject, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction cloneConfigValue(value: ConfigValue): ConfigValue {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneConfigValue(entry));\n }\n if (value && typeof value === \"object\" && !(value instanceof Date)) {\n return cloneConfigObject(value as ConfigObject);\n }\n return value;\n}\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.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 cloneConfigObject(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 = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(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 = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\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 setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (!isConfigObject(pattern) || Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n }\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\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.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 cloneConfigObject(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 = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(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 = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\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 setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (!isConfigObject(pattern) || Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n }\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 (Object.prototype.hasOwnProperty.call(formatRegistry, pathOrFormat)) {\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 const canonicalHome = path.resolve(homeDir);\n const canonicalExpanded = path.resolve(expanded);\n const relative = path.relative(canonicalHome, canonicalExpanded);\n if (relative === \"..\" || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {\n throw new Error(`Target path resolves outside home directory: \"${rawPath}\"`);\n }\n\n if (!pathMapper) {\n return canonicalExpanded;\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", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import type { FileSystem } from \"./types.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\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 MutationDetails,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation, resolveMutationDetails } 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: MutationDetails }> {\n const pendingDetails = resolveMutationDetails(mutation, context, options);\n\n // Call onStart observer\n context.observers?.onStart?.(pendingDetails);\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?.(pendingDetails, error);\n\n // Re-throw the error\n throw error;\n }\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "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\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\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 (hasOwnErrorCode(error, \"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 { hasOwnErrorCode } from \"./error-codes.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\nasync function pathExists(fs: ApplyOptions[\"fs\"], targetPath: string): Promise<boolean> {\n try {\n await fs.stat(targetPath);\n return true;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\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 const templateLoader = createTemplateLoader();\n\n for (const templateId of bundledSkillTemplateIds) {\n const targetPath = `${scope === \"global\" ? options.homeDir : options.cwd}/${skillDir.slice(2)}/${templateId}`;\n if (await pathExists(options.fs, targetPath)) {\n const existing = await options.fs.readFile(targetPath, \"utf8\");\n if (existing !== (await templateLoader(templateId))) {\n throw new Error(`Skill already exists: ${targetPath}`);\n }\n }\n }\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: templateLoader\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 const templateLoader = createTemplateLoader();\n const removeBundledSkills = [];\n\n for (const templateId of bundledSkillTemplateIds) {\n const targetPath = `${scope === \"global\" ? options.homeDir : options.cwd}/${skillDir.slice(2)}/${templateId}`;\n if (await pathExists(options.fs, targetPath)) {\n const existing = await options.fs.readFile(targetPath, \"utf8\");\n if (existing === (await templateLoader(templateId))) {\n removeBundledSkills.push(\n fileMutation.remove({\n target: `${skillDir}/${templateId}`,\n label: `Remove bundled skill ${templateId} from ${skillDir}`\n })\n );\n }\n }\n }\n\n await runMutations(\n [\n ...removeBundledSkills,\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 if (\n skill.name.length === 0 ||\n skill.name !== skill.name.trim() ||\n skill.name === \".\" ||\n skill.name === \"..\" ||\n skill.name.includes(\"/\") ||\n skill.name.includes(\"\\\\\") ||\n skill.name.includes(\"\\n\") ||\n skill.name.includes(\"\\r\")\n ) {\n throw new Error(`Invalid skill name: ${skill.name}`);\n }\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 const absoluteSkillPath = `${scope === \"global\" ? options.homeDir : options.cwd}/${skillFilePath.slice(2)}`;\n\n if (await pathExists(options.fs, absoluteSkillPath)) {\n throw new Error(`Skill already exists: ${displayPath}`);\n }\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: absoluteSkillPath, displayPath };\n}\n", "import * as fs from \"node:fs\";\nimport path from \"node:path\";\nimport { getAgentConfig, resolveAgentSupport, resolveSkillDir } from \"./configs.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\nexport interface SkillSource {\n kind: \"resolved\";\n ref: string;\n name: string;\n sourceAgentId?: string;\n sourcePath: string;\n scope: \"project\" | \"user\";\n}\n\nexport type SkillResolutionFailure =\n | { kind: \"malformed\"; ref: string }\n | { kind: \"unknown-agent\"; ref: string; agentInput: string }\n | { kind: \"not-found\"; ref: string; searchedPaths: string[] };\n\nexport type SkillResolution = SkillSource | SkillResolutionFailure;\n\ninterface SearchTier {\n scope: \"project\" | \"user\";\n sourcePath: string;\n}\n\nfunction isMalformedSegment(segment: string): boolean {\n return (\n segment.length === 0 ||\n segment !== segment.trim() ||\n segment === \".\" ||\n segment === \"..\" ||\n segment.includes(\"\\n\") ||\n segment.includes(\"\\r\")\n );\n}\n\nfunction isDirectory(targetPath: string): boolean {\n try {\n return fs.statSync(targetPath).isDirectory();\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\") || hasOwnErrorCode(error, \"ENOTDIR\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction findSkill(\n ref: string,\n name: string,\n tiers: SearchTier[],\n sourceAgentId?: string\n): SkillResolution {\n for (const tier of tiers) {\n if (isDirectory(tier.sourcePath)) {\n return {\n kind: \"resolved\",\n ref,\n name,\n ...(sourceAgentId ? { sourceAgentId } : {}),\n sourcePath: tier.sourcePath,\n scope: tier.scope\n };\n }\n }\n\n return {\n kind: \"not-found\",\n ref,\n searchedPaths: tiers.map((tier) => tier.sourcePath)\n };\n}\n\nexport function resolveSkillReference(ref: string, cwd: string, homeDir: string): SkillResolution {\n const slashIndex = ref.indexOf(\"/\");\n const hasPrefix = slashIndex !== -1;\n\n if (\n ref.length === 0 ||\n ref !== ref.trim() ||\n (hasPrefix && ref.indexOf(\"/\", slashIndex + 1) !== -1)\n ) {\n return { kind: \"malformed\", ref };\n }\n\n if (!hasPrefix) {\n if (isMalformedSegment(ref)) {\n return { kind: \"malformed\", ref };\n }\n\n const tiers: SearchTier[] = [\n {\n scope: \"project\",\n sourcePath: path.resolve(cwd, \".poe-code/skills\", ref)\n },\n {\n scope: \"user\",\n sourcePath: path.resolve(homeDir, \".poe-code/skills\", ref)\n }\n ];\n\n return findSkill(ref, ref, tiers);\n }\n\n const agentInput = ref.slice(0, slashIndex);\n const name = ref.slice(slashIndex + 1);\n if (isMalformedSegment(agentInput) || isMalformedSegment(name)) {\n return { kind: \"malformed\", ref };\n }\n\n const support = resolveAgentSupport(agentInput);\n if (support.status !== \"supported\" || !support.id) {\n return { kind: \"unknown-agent\", ref, agentInput };\n }\n\n const config = getAgentConfig(support.id);\n if (!config) {\n return { kind: \"unknown-agent\", ref, agentInput };\n }\n\n const tiers: SearchTier[] = [\n {\n scope: \"project\",\n sourcePath: path.resolve(resolveSkillDir(config, \"local\", cwd), name)\n },\n {\n scope: \"user\",\n sourcePath: path.resolve(resolveSkillDir(config, \"global\", cwd, homeDir), name)\n }\n ];\n\n return findSkill(ref, name, tiers, support.id);\n}\n", "import { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\nexport type GitDirRunner = (cwd: string) => string | undefined;\n\nconst defaultMarkerPrefix = \"poe-code-spawn-skills\";\n\nfunction defaultGitDirRunner(cwd: string): string | undefined {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--git-dir\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return undefined;\n }\n}\n\nlet gitDirRunner: GitDirRunner = defaultGitDirRunner;\n\nexport function setGitDirRunnerForTest(runner: GitDirRunner): () => void {\n const previous = gitDirRunner;\n gitDirRunner = runner;\n return () => {\n gitDirRunner = previous;\n };\n}\n\nfunction resolveExcludePath(cwd: string): string | undefined {\n const gitDir = gitDirRunner(cwd);\n if (gitDir === undefined || gitDir.length === 0) {\n return undefined;\n }\n\n return path.join(path.isAbsolute(gitDir) ? gitDir : path.resolve(cwd, gitDir), \"info/exclude\");\n}\n\nfunction markers(runId: string, markerPrefix: string): { begin: string; end: string } {\n return {\n begin: `# ${markerPrefix}:${runId} begin`,\n end: `# ${markerPrefix}:${runId} end`\n };\n}\n\nfunction assertSingleLine(value: string, label: string): void {\n if (value.includes(\"\\n\") || value.includes(\"\\r\")) {\n throw new Error(`${label} must be a single line`);\n }\n}\n\nfunction readExcludeFile(excludePath: string): string | undefined {\n try {\n return fs.readFileSync(excludePath, \"utf8\");\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction assertNoSymbolicLink(targetPath: string): void {\n const parsed = path.parse(path.resolve(targetPath));\n let current = parsed.root;\n\n for (const segment of path.resolve(targetPath).slice(parsed.root.length).split(path.sep)) {\n if (segment.length === 0) {\n continue;\n }\n current = path.join(current, segment);\n try {\n if (fs.lstatSync(current).isSymbolicLink()) {\n throw new Error(`Refusing to update Git exclude path through symbolic link: ${current}`);\n }\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n }\n}\n\nfunction writeExcludeFile(excludePath: string, content: string): void {\n assertNoSymbolicLink(excludePath);\n fs.mkdirSync(path.dirname(excludePath), { recursive: true });\n assertNoSymbolicLink(excludePath);\n const tempPath = `${excludePath}.poe-code-${process.pid}-${randomUUID()}.tmp`;\n let tempCreated = false;\n try {\n assertNoSymbolicLink(tempPath);\n fs.writeFileSync(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n fs.renameSync(tempPath, excludePath);\n } catch (error) {\n if (tempCreated || !isAlreadyExistsError(error)) {\n try {\n fs.rmSync(tempPath, { force: true });\n } catch (cleanupError) {\n void cleanupError;\n }\n }\n throw error;\n }\n}\n\nfunction removeBlock(content: string, runId: string, markerPrefix: string): string {\n const { begin, end } = markers(runId, markerPrefix);\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n if (lines[index] === begin) {\n const endIndex = lines.indexOf(end, index + 1);\n if (endIndex !== -1) {\n index = endIndex;\n continue;\n }\n }\n\n result.push(lines[index]);\n }\n\n return result.join(\"\\n\");\n}\n\nfunction appendBlock(\n content: string | undefined,\n runId: string,\n entries: string[],\n markerPrefix: string\n): string {\n const { begin, end } = markers(runId, markerPrefix);\n const existing = content ?? \"\";\n const prefix = existing.length === 0 || existing.endsWith(\"\\n\") ? existing : `${existing}\\n`;\n return `${prefix}${[begin, ...entries, end, \"\"].join(\"\\n\")}`;\n}\n\nfunction nextBlockId(content: string | undefined, runId: string, markerPrefix: string): string {\n if (content === undefined || !content.includes(markers(runId, markerPrefix).begin)) {\n return runId;\n }\n\n let suffix = 1;\n while (content.includes(markers(`${runId}:${suffix}`, markerPrefix).begin)) {\n suffix += 1;\n }\n return `${runId}:${suffix}`;\n}\n\nexport function appendExcludeBlock(\n cwd: string,\n runId: string,\n entries: string[],\n opts?: { markerPrefix?: string }\n): string | undefined {\n assertSingleLine(runId, \"runId\");\n assertSingleLine(opts?.markerPrefix ?? defaultMarkerPrefix, \"markerPrefix\");\n for (const entry of entries) {\n assertSingleLine(entry, \"exclude entry\");\n }\n const excludePath = resolveExcludePath(cwd);\n if (excludePath === undefined) {\n return undefined;\n }\n\n assertNoSymbolicLink(excludePath);\n const content = readExcludeFile(excludePath);\n const markerPrefix = opts?.markerPrefix ?? defaultMarkerPrefix;\n const blockId = nextBlockId(content, runId, markerPrefix);\n writeExcludeFile(excludePath, appendBlock(content, blockId, entries, markerPrefix));\n return blockId;\n}\n\nexport function removeExcludeBlock(\n cwd: string,\n runId: string,\n opts?: { markerPrefix?: string }\n): void {\n assertSingleLine(runId, \"runId\");\n assertSingleLine(opts?.markerPrefix ?? defaultMarkerPrefix, \"markerPrefix\");\n const excludePath = resolveExcludePath(cwd);\n if (excludePath === undefined) {\n return;\n }\n\n const content = readExcludeFile(excludePath);\n if (content === undefined) {\n return;\n }\n\n writeExcludeFile(excludePath, removeBlock(content, runId, opts?.markerPrefix ?? defaultMarkerPrefix));\n}\n", "import * as fs from \"node:fs\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n getAgentConfig,\n resolveAgentSupport,\n resolveSkillDir,\n supportedAgents\n} from \"./configs.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport { appendExcludeBlock, removeExcludeBlock } from \"./git-exclude.js\";\nimport { resolveSkillReference, type SkillResolutionFailure } from \"./resolve-skill-reference.js\";\n\nexport interface BridgeEntry {\n ref: string;\n sourcePath: string;\n targetPath: string;\n createdParents: string[];\n}\n\nexport type BridgeWarningKind =\n | \"local-collision\"\n | \"global-collision\"\n | \"self-reference\"\n | \"intra-batch-collision\";\n\nexport interface BridgeWarning {\n kind: BridgeWarningKind;\n ref: string;\n sourcePath: string;\n conflictingPath: string;\n message: string;\n}\n\nexport interface BridgeManifest {\n spawnAgentId: string;\n cwd: string;\n runId: string;\n excludeBlockId?: string;\n entries: BridgeEntry[];\n warnings: BridgeWarning[];\n}\n\ninterface ActiveTarget {\n createdParents: string[];\n fingerprint: string;\n sourceFingerprint: string;\n sourcePath: string;\n references: number;\n token: string;\n}\n\ninterface ManifestState {\n excludeBlockId?: string;\n cleaned?: boolean;\n}\n\nconst activeTargets = new Map<string, ActiveTarget>();\nconst manifestStates = new WeakMap<BridgeManifest, ManifestState>();\nconst ownershipFileName = \".poe-code-bridge-owner\";\n\ntype ResolvedSkill = Extract<ReturnType<typeof resolveSkillReference>, { kind: \"resolved\" }>;\n\ninterface ResolvedBridgeSource {\n ref: string;\n source: ResolvedSkill;\n targetPath: string;\n globalTargetPath: string;\n}\n\nfunction pathExists(targetPath: string): boolean {\n try {\n fs.statSync(targetPath);\n return true;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction assertNoSymbolicLinkUnder(rootPath: string, targetPath: string): void {\n const root = path.resolve(rootPath);\n const target = path.resolve(targetPath);\n const relative = path.relative(root, target);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Refusing to bridge skills outside root ${root}: ${target}`);\n }\n\n let current = root;\n const segments = relative.length === 0 ? [] : relative.split(path.sep);\n\n for (const segment of segments) {\n if (segment.length === 0) {\n continue;\n }\n current = path.join(current, segment);\n try {\n if (fs.lstatSync(current).isSymbolicLink()) {\n throw new Error(`Refusing to bridge skills through symbolic link: ${current}`);\n }\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n }\n}\n\nfunction isDirectory(targetPath: string): boolean {\n try {\n return fs.statSync(targetPath).isDirectory();\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction formatResolutionFailureError(failures: SkillResolutionFailure[]): Error {\n const malformed = failures.filter((failure) => failure.kind === \"malformed\");\n const unknownAgent = failures.filter((failure) => failure.kind === \"unknown-agent\");\n const notFound = failures.filter((failure) => failure.kind === \"not-found\");\n const lines = [\n `Failed to bridge active skills: ${failures.length} skill reference(s) could not be resolved.`\n ];\n\n if (malformed.length > 0) {\n lines.push(\"\", \"Malformed skill references:\");\n for (const failure of malformed) {\n lines.push(`- ${failure.ref}`);\n }\n lines.push('Expected syntax: \"<name>\" or \"<agentId>/<name>\".');\n }\n\n if (unknownAgent.length > 0) {\n lines.push(\"\", \"Unknown agent references:\");\n for (const failure of unknownAgent) {\n lines.push(`- ${failure.ref} (agent token: ${failure.agentInput})`);\n }\n lines.push(`Supported agents: ${supportedAgents.join(\", \")}.`);\n }\n\n if (notFound.length > 0) {\n lines.push(\"\", \"Not found skill references.\");\n for (const failure of notFound) {\n lines.push(`- ${failure.ref}`);\n lines.push(\" searched paths:\");\n for (const searchedPath of failure.searchedPaths) {\n lines.push(` - ${searchedPath}`);\n }\n }\n }\n\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction copyDirectory(sourcePath: string, targetPath: string): void {\n fs.mkdirSync(targetPath, { recursive: true });\n for (const dirent of fs.readdirSync(sourcePath, { withFileTypes: true })) {\n const childSource = path.join(sourcePath, dirent.name);\n const childTarget = path.join(targetPath, dirent.name);\n\n if (dirent.isSymbolicLink()) {\n throw new Error(`Refusing to bridge skill containing symbolic link: ${childSource}`);\n }\n\n if (dirent.isDirectory()) {\n copyDirectory(childSource, childTarget);\n continue;\n }\n\n if (dirent.isFile()) {\n fs.copyFileSync(childSource, childTarget);\n continue;\n }\n\n throw new Error(`Refusing to bridge unsupported filesystem entry: ${childSource}`);\n }\n}\n\nfunction directoryFingerprint(targetPath: string): string {\n const hash = createHash(\"sha256\");\n\n function visit(currentPath: string, relativePath: string): void {\n const stats = fs.lstatSync(currentPath);\n if (stats.isSymbolicLink()) {\n throw new Error(`Refusing to inspect bridged skill through symbolic link: ${currentPath}`);\n }\n if (stats.isDirectory()) {\n hash.update(`d:${relativePath}\\n`);\n for (const name of fs.readdirSync(currentPath).sort()) {\n visit(path.join(currentPath, name), path.join(relativePath, name));\n }\n return;\n }\n if (stats.isFile()) {\n hash.update(`f:${relativePath}\\n`);\n hash.update(fs.readFileSync(currentPath));\n return;\n }\n throw new Error(`Refusing to bridge unsupported filesystem entry: ${currentPath}`);\n }\n\n visit(targetPath, \".\");\n return hash.digest(\"hex\");\n}\n\nfunction ownershipPath(targetPath: string): string {\n return path.join(targetPath, ownershipFileName);\n}\n\nfunction hasOwnershipToken(targetPath: string, token: string): boolean {\n try {\n return fs.readFileSync(ownershipPath(targetPath), \"utf8\") === token;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n throw error;\n }\n}\n\nfunction collectMissingParents(targetPath: string): string[] {\n const parents: string[] = [];\n let current = path.dirname(targetPath);\n\n while (!pathExists(current)) {\n parents.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return parents.reverse();\n}\n\nfunction removeDirectoryIfEmpty(targetPath: string): void {\n try {\n fs.rmdirSync(targetPath);\n } catch (error) {\n if (\n hasOwnErrorCode(error, \"ENOENT\") ||\n hasOwnErrorCode(error, \"ENOTEMPTY\") ||\n hasOwnErrorCode(error, \"EEXIST\")\n ) {\n return;\n }\n throw error;\n }\n}\n\nfunction removeTarget(targetPath: string): void {\n fs.rmSync(targetPath, { recursive: true, force: true });\n}\n\nfunction rollbackEntries(entries: BridgeEntry[]): void {\n for (const entry of [...entries].reverse()) {\n const activeTarget = activeTargets.get(entry.targetPath);\n if (activeTarget && activeTarget.references > 1) {\n activeTarget.references -= 1;\n continue;\n }\n activeTargets.delete(entry.targetPath);\n removeTarget(entry.targetPath);\n for (const parent of [...(activeTarget?.createdParents ?? entry.createdParents)].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n}\n\nfunction toCwdRelative(cwd: string, targetPath: string): string {\n return path.relative(cwd, targetPath);\n}\n\nfunction warning(\n kind: BridgeWarningKind,\n ref: string,\n sourcePath: string,\n conflictingPath: string\n): BridgeWarning {\n const messages: Record<BridgeWarningKind, string> = {\n \"intra-batch-collision\": `Skipping ${ref}: an earlier bridged skill already targets ${conflictingPath}.`,\n \"local-collision\": `Skipping ${ref}: local skill already exists at ${conflictingPath}.`,\n \"global-collision\": `Skipping ${ref}: global skill already exists at ${conflictingPath}.`,\n \"self-reference\": `Skipping ${ref}: spawning agent already sees this native skill at ${conflictingPath}.`\n };\n\n return {\n kind,\n ref,\n sourcePath,\n conflictingPath,\n message: messages[kind]\n };\n}\n\nexport function bridgeActiveSkills(\n spawnAgentId: string,\n cwd: string,\n refs: string[],\n homeDir: string,\n runId: string\n): BridgeManifest {\n const spawnConfig = getAgentConfig(spawnAgentId);\n const spawnSupport = resolveAgentSupport(spawnAgentId);\n if (!spawnConfig || spawnSupport.status !== \"supported\" || !spawnSupport.id) {\n throw new Error(\n `Unsupported spawn agent \"${spawnAgentId}\". Supported agents: ${supportedAgents.join(\", \")}.`\n );\n }\n\n const targetDir = resolveSkillDir(spawnConfig, \"local\", cwd);\n const globalTargetDir = resolveSkillDir(spawnConfig, \"global\", cwd, homeDir);\n const resolutions = refs.map((ref) => resolveSkillReference(ref, cwd, homeDir));\n const failures = resolutions.filter(\n (resolution): resolution is SkillResolutionFailure => resolution.kind !== \"resolved\"\n );\n if (failures.length > 0) {\n throw formatResolutionFailureError(failures);\n }\n\n const sources: ResolvedBridgeSource[] = resolutions.map((source, index) => ({\n ref: refs[index]!,\n source: source as ResolvedSkill,\n targetPath: path.resolve(targetDir, (source as ResolvedSkill).name),\n globalTargetPath: path.resolve(globalTargetDir, (source as ResolvedSkill).name)\n }));\n\n const entries: BridgeEntry[] = [];\n const warnings: BridgeWarning[] = [];\n const claimedTargets = new Set<string>();\n\n try {\n for (const item of sources) {\n if (claimedTargets.has(item.targetPath)) {\n warnings.push(\n warning(\"intra-batch-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n\n if (item.source.sourceAgentId === spawnSupport.id) {\n warnings.push(\n warning(\"self-reference\", item.ref, item.source.sourcePath, item.source.sourcePath)\n );\n continue;\n }\n\n const activeTarget = activeTargets.get(item.targetPath);\n if (activeTarget && pathExists(item.targetPath)) {\n if (activeTarget.sourcePath === item.source.sourcePath) {\n const sourceRoot = item.source.scope === \"project\" ? cwd : homeDir;\n assertNoSymbolicLinkUnder(sourceRoot, item.source.sourcePath);\n const sourceFingerprint = directoryFingerprint(item.source.sourcePath);\n if (\n sourceFingerprint === activeTarget.sourceFingerprint &&\n hasOwnershipToken(item.targetPath, activeTarget.token) &&\n directoryFingerprint(item.targetPath) === activeTarget.fingerprint\n ) {\n activeTarget.references += 1;\n claimedTargets.add(item.targetPath);\n entries.push({\n ref: item.ref,\n sourcePath: item.source.sourcePath,\n targetPath: item.targetPath,\n createdParents: []\n });\n continue;\n }\n\n warnings.push(\n warning(\"local-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n activeTargets.delete(item.targetPath);\n }\n\n if (pathExists(item.targetPath)) {\n warnings.push(\n warning(\"local-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n\n if (isDirectory(item.globalTargetPath)) {\n warnings.push(\n warning(\"global-collision\", item.ref, item.source.sourcePath, item.globalTargetPath)\n );\n continue;\n }\n\n const sourceRoot = item.source.scope === \"project\" ? cwd : homeDir;\n assertNoSymbolicLinkUnder(sourceRoot, item.source.sourcePath);\n const sourceFingerprint = directoryFingerprint(item.source.sourcePath);\n const createdParents = collectMissingParents(item.targetPath);\n assertNoSymbolicLinkUnder(cwd, path.dirname(item.targetPath));\n fs.mkdirSync(path.dirname(item.targetPath), { recursive: true });\n const token = randomUUID();\n try {\n copyDirectory(item.source.sourcePath, item.targetPath);\n fs.writeFileSync(ownershipPath(item.targetPath), token, \"utf8\");\n const fingerprint = directoryFingerprint(item.targetPath);\n claimedTargets.add(item.targetPath);\n entries.push({\n ref: item.ref,\n sourcePath: item.source.sourcePath,\n targetPath: item.targetPath,\n createdParents\n });\n activeTargets.set(item.targetPath, {\n createdParents,\n fingerprint,\n sourceFingerprint,\n sourcePath: item.source.sourcePath,\n references: 1,\n token\n });\n } catch (error) {\n removeTarget(item.targetPath);\n for (const parent of [...createdParents].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n throw error;\n }\n }\n\n let excludeBlockId: string | undefined;\n if (entries.length > 0) {\n excludeBlockId = appendExcludeBlock(\n cwd,\n runId,\n entries.map((entry) => toCwdRelative(cwd, entry.targetPath))\n );\n }\n\n const manifest = {\n spawnAgentId,\n cwd,\n runId,\n ...(excludeBlockId !== undefined && excludeBlockId !== runId ? { excludeBlockId } : {}),\n entries,\n warnings\n };\n manifestStates.set(manifest, { excludeBlockId });\n return manifest;\n } catch (error) {\n rollbackEntries(entries);\n throw error;\n }\n}\n\nexport function cleanupBridgedSkills(manifest: BridgeManifest): void {\n const state = manifestStates.get(manifest);\n if (state?.cleaned) {\n return;\n }\n removeExcludeBlock(\n manifest.cwd,\n state?.excludeBlockId ?? manifest.excludeBlockId ?? manifest.runId\n );\n for (const entry of manifest.entries) {\n const activeTarget = activeTargets.get(entry.targetPath);\n if (!activeTarget) {\n continue;\n }\n if (activeTarget.references > 1) {\n activeTarget.references -= 1;\n continue;\n }\n activeTargets.delete(entry.targetPath);\n if (\n pathExists(entry.targetPath) &&\n hasOwnershipToken(entry.targetPath, activeTarget.token) &&\n directoryFingerprint(entry.targetPath) === activeTarget.fingerprint\n ) {\n removeTarget(entry.targetPath);\n for (const parent of [...activeTarget.createdParents].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n }\n if (state) {\n state.cleaned = true;\n }\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { UserError } from \"toolcraft\";\nimport {\n getAgentConfig,\n resolveAgentSupport as resolveSkillAgentSupport,\n supportedAgents as skillSupportedAgents\n} from \"@poe-code/agent-skill-config\";\nimport { hasOwnErrorCode } from \"../errors.js\";\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 rename(oldPath: string, newPath: string): 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 lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\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 hasOwnErrorCode(error, \"ENOENT\");\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 try {\n terminalPilotTemplateCache = await nodeFs.readFile(\n new URL(\"../templates/terminal-pilot.md\", import.meta.url),\n \"utf8\"\n );\n return terminalPilotTemplateCache;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\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 await assertNoSymbolicLinkPath(fs, folderPath);\n\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\nexport async function assertNoSymbolicLinkPath(\n fs: Pick<TerminalPilotInstallerFileSystem, \"lstat\">,\n targetPath: string\n): Promise<void> {\n const rootPath = path.parse(targetPath).root;\n let currentPath = targetPath;\n\n while (currentPath !== rootPath) {\n try {\n if ((await fs.lstat(currentPath)).isSymbolicLink()) {\n throw new UserError(`Refusing terminal-pilot skill operation through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n\n currentPath = path.dirname(currentPath);\n }\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { defineCommand, S } from \"toolcraft\";\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 \"toolcraft\";\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 { UserError, defineCommand, S } from \"toolcraft\";\nimport { TERMINAL_KEY_PATTERN, keyToSequence, type TerminalKey } from \"../keys.js\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n key: S.String({ description: \"Named key to press\", pattern: TERMINAL_KEY_PATTERN }),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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 assertTerminalKey(params.key);\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(\n params.session,\n env\n );\n await namedSession.session.press(params.key as TerminalKey);\n return undefined;\n }\n});\n\nfunction assertTerminalKey(key: string): asserts key is TerminalKey {\n try {\n keyToSequence(key as TerminalKey);\n } catch (error) {\n throw new UserError(error instanceof Error ? error.message : String(error));\n }\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n last: S.Optional(\n S.Number({\n short: \"n\",\n description: \"Return only the last N lines\",\n jsonType: \"integer\",\n minimum: 0\n })\n )\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(\n params.session,\n env\n );\n const lines = await namedSession.session.history({ last: params.last });\n return { lines, exitCode: namedSession.session.exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\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 \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n cols: S.Number({ description: \"Terminal width in columns\", jsonType: \"integer\", minimum: 1 }),\n rows: S.Number({ description: \"Terminal height in rows\", jsonType: \"integer\", minimum: 1 }),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.resize(params.cols, params.rows);\n return undefined;\n }\n});\n", "import { randomUUID } from \"node:crypto\";\nimport { rename, rm, writeFile } from \"node:fs/promises\";\nimport { parseAnsi } from \"./ansi-parser.js\";\nimport { hasOwnErrorCode } from \"./error-codes.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 if (\n options.padding !== undefined &&\n (!Number.isInteger(options.padding) || options.padding < 0)\n ) {\n throw new Error(\"Padding must be a non-negative integer.\");\n }\n if (options.output !== undefined && options.output.length === 0) {\n throw new Error(\"Output path must not be empty.\");\n }\n\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 !== undefined) {\n const temporaryPath = `${options.output}.${randomUUID()}.tmp`;\n let temporaryCreated = false;\n try {\n await writeFile(temporaryPath, png, { flag: \"wx\" });\n temporaryCreated = true;\n await rename(temporaryPath, options.output);\n } catch (error) {\n if (temporaryCreated || !isAlreadyExistsError(error)) {\n try {\n await rm(temporaryPath, { force: true });\n } catch (cleanupError) {\n void cleanupError;\n }\n }\n throw error;\n }\n }\n\n return png;\n}\n\nfunction isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && hasOwnErrorCode(error, \"EEXIST\");\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 inverse: boolean;\n conceal: boolean;\n};\n\ntype StyleState = Omit<StyledRun, \"text\">;\n\nconst ESC = \"\\u001b\";\nconst TAB_WIDTH = 8;\nconst MAX_TERMINAL_ROWS = 1000;\nconst MAX_TERMINAL_COLUMNS = 1000;\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 inverse: false,\n conceal: 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 left.inverse === right.inverse &&\n left.conceal === right.conceal &&\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 inverse: style.inverse,\n conceal: style.conceal\n });\n}\n\nfunction parseCsi(\n input: string,\n start: number,\n prefixLength: number\n): { end: number; final: string | null; params: string } {\n let index = start + prefixLength;\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 + prefixLength, index)\n };\n }\n\n index += 1;\n }\n\n return {\n end: input.length,\n final: null,\n params: input.slice(start + prefixLength)\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\n for (let index = 0; index < rawParams.length; index += 1) {\n const rawParam = rawParams[index] ?? \"\";\n const colonColor = applyColonExtendedColor(rawParam);\n if (colonColor !== undefined) {\n if (colonColor !== null) {\n if (colonColor.target === 38) {\n nextStyle.fg = colonColor.color;\n } else {\n nextStyle.bg = colonColor.color;\n }\n }\n continue;\n }\n\n const value = rawParam.length === 0 ? 0 : toInteger(rawParam);\n if (value === null) {\n return nextStyle;\n }\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 === 7) {\n nextStyle.inverse = true;\n continue;\n }\n\n if (value === 27) {\n nextStyle.inverse = false;\n continue;\n }\n\n if (value === 8) {\n nextStyle.conceal = true;\n continue;\n }\n\n if (value === 28) {\n nextStyle.conceal = 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 params = rawParams.map((param) => toInteger(param));\n const extended = params.every((param) => param !== null)\n ? applyExtendedColor(params as number[], index + 1)\n : null;\n if (!extended) {\n if (rawParams[index + 1] === \"2\" || rawParams[index + 1] === \"5\") {\n break;\n }\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\nfunction applyColonExtendedColor(\n rawParam: string\n): { target: 38 | 48; color: Color } | null | undefined {\n if (!rawParam.includes(\":\")) {\n return undefined;\n }\n\n const segments = rawParam.split(\":\");\n const target = toInteger(segments[0]);\n if (target !== 38 && target !== 48) {\n return null;\n }\n\n const mode = toInteger(segments[1]);\n if (mode === 5) {\n const index = toInteger(segments[2]);\n return index === null ? null : { target, color: { type: \"ansi8\", index: clampByte(index) } };\n }\n\n if (mode !== 2) {\n return null;\n }\n\n const offset = segments[2] === \"\" ? 3 : 2;\n const r = toInteger(segments[offset]);\n const g = toInteger(segments[offset + 1]);\n const b = toInteger(segments[offset + 2]);\n if (r === null || g === null || b === null) {\n return null;\n }\n\n return { target, color: { type: \"rgb\", r: clampByte(r), g: clampByte(g), b: clampByte(b) } };\n}\n\ntype DisplayCell = { text: string; style: StyleState };\n\nfunction parseOscEnd(input: string, start: number): number {\n let index = start + 2;\n while (index < input.length) {\n if (input[index] === \"\\u0007\") {\n return index + 1;\n }\n if (input[index] === ESC && input[index + 1] === \"\\\\\") {\n return index + 2;\n }\n index += 1;\n }\n return input.length;\n}\n\nfunction positionParameter(params: string, index: number, fallback: number): number {\n const value = toInteger(params.split(\";\")[index]);\n return value === null || value < 1 ? fallback : value;\n}\n\nfunction modeParameter(params: string, fallback: number): number {\n const value = toInteger(params.split(\";\")[0]);\n return value === null ? fallback : value;\n}\n\nfunction displayWidth(text: string): number {\n if (text === \"\\t\") {\n return TAB_WIDTH;\n }\n\n const codePoint = text.codePointAt(0);\n if (codePoint === undefined) {\n return 0;\n }\n\n if (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1f64f) ||\n (codePoint >= 0x1f900 && codePoint <= 0x1f9ff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n ) {\n return 2;\n }\n\n return 1;\n}\n\nfunction hasRenderableCell(line: DisplayCell[] | undefined): boolean {\n return (line ?? []).some((cell) => cell !== undefined && cell.text.length > 0);\n}\n\nfunction buildRuns(\n lines: DisplayCell[][],\n lineBreakStyles: Array<StyleState | undefined>\n): StyledRun[] {\n const runs: StyledRun[] = [];\n const defaultStyle = createDefaultStyle();\n let lastRow = lines.length - 1;\n while (\n lastRow > 0 &&\n !hasRenderableCell(lines[lastRow]) &&\n lineBreakStyles[lastRow - 1] === undefined\n ) {\n lastRow -= 1;\n }\n\n for (let row = 0; row <= lastRow; row += 1) {\n const line = lines[row] ?? [];\n let lastCell = line.length - 1;\n while (lastCell >= 0 && line[lastCell] === undefined) {\n lastCell -= 1;\n }\n for (let column = 0; column <= lastCell; column += 1) {\n const cell = line[column] ?? { text: \" \", style: defaultStyle };\n pushRun(runs, cell.style, cell.text);\n }\n if (row < lastRow) {\n pushRun(runs, lineBreakStyles[row] ?? defaultStyle, \"\\n\");\n }\n }\n\n return runs;\n}\n\nexport function parseAnsi(input: string): StyledRun[] {\n const lines: DisplayCell[][] = [[]];\n const lineBreakStyles: Array<StyleState | undefined> = [];\n let style = createDefaultStyle();\n let row = 0;\n let column = 0;\n let savedRow = 0;\n let savedColumn = 0;\n let index = 0;\n\n const clampRow = (nextRow: number): number => {\n if (nextRow < 0) {\n return 0;\n }\n return Math.min(nextRow, MAX_TERMINAL_ROWS - 1);\n };\n\n const clampColumn = (nextColumn: number): number => {\n if (nextColumn < 0) {\n return 0;\n }\n return Math.min(nextColumn, MAX_TERMINAL_COLUMNS - 1);\n };\n\n const ensureLine = (): void => {\n while (lines.length <= row) {\n lines.push([]);\n }\n };\n\n const moveDown = (keepColumn: boolean): void => {\n lineBreakStyles[row] = cloneStyle(style);\n row = clampRow(row + 1);\n if (!keepColumn) {\n column = 0;\n }\n ensureLine();\n };\n\n const eraseLine = (mode: number): void => {\n const line = lines[row] ?? [];\n if (mode === 1) {\n for (let cell = 0; cell <= column; cell += 1) {\n delete line[cell];\n }\n return;\n }\n if (mode === 2) {\n lines[row] = [];\n return;\n }\n line.splice(column);\n };\n\n const eraseDisplay = (mode: number): void => {\n if (mode === 1) {\n for (let lineRow = 0; lineRow < row; lineRow += 1) {\n lines[lineRow] = [];\n }\n eraseLine(1);\n return;\n }\n if (mode === 2 || mode === 3) {\n lines.length = 0;\n lineBreakStyles.length = 0;\n ensureLine();\n return;\n }\n\n eraseLine(0);\n lines.splice(row + 1);\n lineBreakStyles.splice(row);\n };\n\n const saveCursor = (): void => {\n savedRow = row;\n savedColumn = column;\n };\n\n const restoreCursor = (): void => {\n row = clampRow(savedRow);\n column = clampColumn(savedColumn);\n ensureLine();\n };\n\n const writeText = (text: string): void => {\n const width = displayWidth(text);\n if (width === 0) {\n return;\n }\n\n lines[row]![column] = { text, style: cloneStyle(style) };\n for (let offset = 1; offset < width && column + offset < MAX_TERMINAL_COLUMNS; offset += 1) {\n lines[row]![column + offset] = { text: \"\", style: cloneStyle(style) };\n }\n column = clampColumn(column + width);\n };\n\n while (index < input.length) {\n const char = input[index];\n\n if (char === \"\\n\") {\n moveDown(false);\n index += 1;\n continue;\n }\n if (char === \"\\v\") {\n moveDown(true);\n index += 1;\n continue;\n }\n if (char === \"\\r\") {\n column = 0;\n index += 1;\n continue;\n }\n if (char === \"\\b\") {\n column = Math.max(0, column - 1);\n index += 1;\n continue;\n }\n if (char === \"\\t\") {\n const nextTabStop = Math.min(\n Math.floor(column / TAB_WIDTH) * TAB_WIDTH + TAB_WIDTH,\n MAX_TERMINAL_COLUMNS\n );\n while (column < nextTabStop) {\n writeText(\" \");\n }\n index += 1;\n continue;\n }\n if (char === ESC && input[index + 1] === \"]\") {\n index = parseOscEnd(input, index);\n continue;\n }\n if (char === ESC && input[index + 1] === \"7\") {\n saveCursor();\n index += 2;\n continue;\n }\n if (char === ESC && input[index + 1] === \"8\") {\n restoreCursor();\n index += 2;\n continue;\n }\n\n const csiPrefixLength =\n char === \"\\u009b\" ? 1 : char === ESC && input[index + 1] === \"[\" ? 2 : null;\n if (csiPrefixLength !== null) {\n const sequence = parseCsi(input, index, csiPrefixLength);\n if (sequence.final === \"m\") {\n style = applySgr(style, sequence.params);\n } else if (sequence.final === \"G\") {\n column = clampColumn(positionParameter(sequence.params, 0, 1) - 1);\n } else if (sequence.final === \"C\") {\n column = clampColumn(column + positionParameter(sequence.params, 0, 1));\n } else if (sequence.final === \"D\") {\n column = Math.max(0, column - positionParameter(sequence.params, 0, 1));\n } else if (sequence.final === \"A\") {\n row = clampRow(row - positionParameter(sequence.params, 0, 1));\n } else if (sequence.final === \"B\") {\n row = clampRow(row + positionParameter(sequence.params, 0, 1));\n ensureLine();\n } else if (sequence.final === \"E\") {\n row = clampRow(row + positionParameter(sequence.params, 0, 1));\n column = 0;\n ensureLine();\n } else if (sequence.final === \"F\") {\n row = clampRow(row - positionParameter(sequence.params, 0, 1));\n column = 0;\n } else if (sequence.final === \"H\" || sequence.final === \"f\") {\n row = clampRow(positionParameter(sequence.params, 0, 1) - 1);\n column = clampColumn(positionParameter(sequence.params, 1, 1) - 1);\n ensureLine();\n } else if (sequence.final === \"K\") {\n eraseLine(modeParameter(sequence.params, 0));\n } else if (sequence.final === \"J\") {\n eraseDisplay(modeParameter(sequence.params, 0));\n } else if (sequence.final === \"s\") {\n saveCursor();\n } else if (sequence.final === \"u\") {\n restoreCursor();\n }\n index = sequence.end;\n continue;\n }\n\n const codePoint = input.codePointAt(index);\n const text = codePoint === undefined ? \"\" : String.fromCodePoint(codePoint);\n writeText(text);\n index += text.length;\n }\n\n return buildRuns(lines, lineBreakStyles);\n}\n", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\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 = Object.freeze([\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) => displayWidth(line.map((run) => run.text).join(\"\")) * CHARACTER_WIDTH),\n 0\n );\n}\n\nfunction displayWidth(text: string, startColumn = 0): number {\n const segmenter = new Intl.Segmenter();\n let column = startColumn;\n\n for (const { segment } of segmenter.segment(text)) {\n if (segment === \"\\t\") {\n column += 8 - (column % 8);\n continue;\n }\n\n const cp = segment.codePointAt(0);\n if (cp !== undefined && isZeroWidthCodePoint(cp)) {\n continue;\n }\n\n column += cp !== undefined && (isWideCodePoint(cp) || isFlagSegment(segment)) ? 2 : 1;\n }\n\n return column - startColumn;\n}\n\nfunction isZeroWidthCodePoint(cp: number): boolean {\n return (cp >= 0x0300 && cp <= 0x036f) || (cp >= 0x1ab0 && cp <= 0x1aff) || (cp >= 0x1dc0 && cp <= 0x1dff) || (cp >= 0x20d0 && cp <= 0x20ff) || (cp >= 0xfe20 && cp <= 0xfe2f);\n}\n\nfunction isFlagSegment(segment: string): boolean {\n const codePoints = [...segment].map((character) => character.codePointAt(0));\n return codePoints.length === 2 && codePoints.every((cp) => cp !== undefined && cp >= 0x1f1e6 && cp <= 0x1f1ff);\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 renderBackgrounds(line, textStartX, textStartY + (index * lineHeightPx) - lineHeightPx, lineHeightPx),\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 renderBackgrounds(line: StyledRun[], startX: number, y: number, height: number): string {\n let column = 0;\n const rectangles: string[] = [];\n\n for (const run of line) {\n const width = displayWidth(run.text, column);\n const background = resolveBackgroundColor(run);\n if (background !== BACKGROUND && width > 0) {\n rectangles.push(`<rect x=\"${formatNumber(startX + (column * CHARACTER_WIDTH))}\" y=\"${formatNumber(y)}\" width=\"${formatNumber(width * CHARACTER_WIDTH)}\" height=\"${formatNumber(height)}\" fill=\"${escapeXmlAttribute(background)}\" />`);\n }\n column += width;\n }\n\n return rectangles.join(\"\");\n}\n\nfunction renderRun(run: StyledRun): string {\n const attributes = ['xml:space=\"preserve\"'];\n const color = resolveForegroundColor(run);\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 const text = run.conceal ? \" \".repeat(displayWidth(run.text)) : run.text;\n return `<tspan ${attributes.join(\" \")}>${escapeXmlText(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 resolveForegroundColor(run: StyledRun): string {\n return run.inverse ? resolveColorOrDefault(run.bg, BACKGROUND) : resolveColor(run.fg);\n}\n\nfunction resolveBackgroundColor(run: StyledRun): string {\n return run.inverse ? resolveColor(run.fg) : resolveColorOrDefault(run.bg, BACKGROUND);\n}\n\nfunction resolveColorOrDefault(color: Color | null, defaultColor: string): string {\n return color === null ? defaultColor : resolveColor(color);\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n}\n\nfunction formatNumber(value: number): string {\n return value.toFixed(2);\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { renderTerminalPng } from \"terminal-png\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\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(\n S.Number({\n short: \"p\",\n description: \"Padding around terminal content\",\n jsonType: \"integer\",\n minimum: 0\n })\n )\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(\n params.session,\n env\n );\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 \"toolcraft\";\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(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.signal(params.signal);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\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(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n )\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(\n params.session,\n env\n );\n await namedSession.session.type(params.text);\n return undefined;\n }\n});\n", "import { randomUUID } from \"node:crypto\";\nimport { defineCommand, S } from \"toolcraft\";\nimport { hasOwnErrorCode } from \"../errors.js\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n assertNoSymbolicLinkPath,\n getSkillFolderWithHome,\n installableAgents,\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 skills = [localSkill, globalSkill];\n const staged: Array<{ fullPath: string; stagingPath: string; displayPath: string }> = [];\n\n try {\n for (const skill of skills) {\n await assertNoSymbolicLinkPath(services.fs, skill.fullPath);\n\n if (!(await folderExists(services.fs, skill.fullPath))) {\n continue;\n }\n\n const stagingPath = `${skill.fullPath}.removing-${randomUUID()}`;\n await services.fs.rename(skill.fullPath, stagingPath);\n staged.push({ ...skill, stagingPath });\n }\n } catch (error) {\n for (const skill of staged.reverse()) {\n await services.fs.rename(skill.stagingPath, skill.fullPath);\n }\n throw error;\n }\n\n if (typeof services.fs.rm === \"function\") {\n await Promise.allSettled(\n staged.map((skill) => services.fs.rm!(skill.stagingPath, { recursive: true, force: true }))\n );\n }\n\n return {\n agent,\n removedSkillPaths: staged.map((skill) => skill.displayPath)\n };\n }\n});\n\nasync function folderExists(\n fs: ReturnType<typeof resolveInstallerServices>[\"fs\"],\n folderPath: string\n): Promise<boolean> {\n try {\n await fs.stat(folderPath);\n return true;\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n return false;\n }\n\n throw error;\n }\n}\n", "import { UserError, defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n pattern: S.String({\n description: \"Regular expression pattern to wait for\",\n minLength: 1,\n pattern: \"\\\\S\"\n }),\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n timeout: S.Optional(\n S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\", minimum: 0 })\n ),\n scope: S.Optional(\n S.Enum([\"history\", \"screen\"], {\n description: \"Search all captured output or only the current visible screen\"\n })\n ),\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 if (params.pattern.trim().length === 0) {\n throw new UserError(\"Wait pattern must not be empty.\");\n }\n assertTimeout(params.timeout);\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(\n params.session,\n env\n );\n const pattern = params.literal === true ? params.pattern : new RegExp(params.pattern);\n const options =\n params.timeout === undefined && params.scope === undefined\n ? undefined\n : {\n ...(params.timeout === undefined ? {} : { timeout: params.timeout }),\n ...(params.scope === undefined ? {} : { scope: params.scope })\n };\n const line = await namedSession.session.waitFor(pattern, options);\n\n return { matched: true, line };\n }\n});\n\nfunction assertTimeout(timeout: number | undefined): void {\n if (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) {\n throw new UserError(\"Timeout must be a finite non-negative number.\");\n }\n}\n", "import { UserError, defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(\n S.String({ short: \"s\", description: \"Session name\", minLength: 1, pattern: \"\\\\S\" })\n ),\n timeout: S.Optional(\n S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\", minimum: 0 })\n )\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 if (params.timeout !== undefined && (!Number.isFinite(params.timeout) || params.timeout < 0)) {\n throw new UserError(\"Timeout must be a finite non-negative number.\");\n }\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(\n params.session,\n env\n );\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 \"toolcraft\";\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 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 install,\n uninstall\n] as const;\n\nexport function createTerminalPilotGroup() {\n return defineGroup<TerminalPilotCommandServices, \"terminal-pilot\", typeof children, readonly [\"cli\", \"mcp\", \"sdk\"]>({\n name: \"terminal-pilot\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n children: [...children] as unknown as typeof children\n });\n}\n\nexport const terminalPilotGroup = Object.freeze(createTerminalPilotGroup());\n", "import { spawn } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { UserError } from \"toolcraft\";\nimport {\n SESSION_ENV_VAR,\n createTerminalPilotRuntime,\n type TerminalPilotRuntime\n} from \"./runtime.js\";\nimport type { TerminalKey } from \"../keys.js\";\nimport type { TerminalSession, WaitForOptions } from \"../terminal-session.js\";\n\nconst RUNTIME_DIR_ENV = \"TERMINAL_PILOT_RUNTIME_DIR\";\nconst DAEMON_ARG = \"__daemon\";\nconst START_TIMEOUT_MS = 5_000;\nconst IDLE_SHUTDOWN_MS = 1_000;\n\ntype SessionInfo = {\n id: string;\n command: string;\n pid: number;\n exitCode: number | null;\n};\n\ntype RpcRequest = {\n id: number;\n method: string;\n params?: unknown;\n};\n\ntype RpcResponse =\n | {\n id: number;\n ok: true;\n result: unknown;\n }\n | {\n id: number;\n ok: false;\n error: { message: string };\n };\n\ntype HandlerEnvLike = {\n get(key: string): string | undefined;\n};\n\ntype SessionProxy = Pick<\n TerminalSession,\n | \"id\"\n | \"command\"\n | \"pid\"\n | \"exitCode\"\n | \"fill\"\n | \"type\"\n | \"press\"\n | \"signal\"\n | \"waitFor\"\n | \"waitForExit\"\n | \"screen\"\n | \"history\"\n | \"resize\"\n | \"close\"\n>;\n\nexport function isTerminalPilotDaemonArgv(argv: string[]): boolean {\n return argv[2] === DAEMON_ARG;\n}\n\nexport async function runTerminalPilotDaemon(): Promise<void> {\n const runtime = createTerminalPilotRuntime();\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n const server = net.createServer((socket) => {\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n void handleRequestLine(runtime, line).then((response) => {\n socket.write(`${JSON.stringify(response)}\\n`);\n scheduleIdleShutdown();\n });\n }\n });\n });\n\n async function shutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n await runtime.close();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n }\n\n async function scheduleIdleShutdown(): Promise<void> {\n if (idleTimer !== undefined) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n\n if (await runtime.hasRetainedSessions()) {\n return;\n }\n\n idleTimer = setTimeout(() => {\n void shutdown().then(() => {\n process.exit(0);\n });\n }, IDLE_SHUTDOWN_MS);\n }\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(socketPath, () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n}\n\nexport function createDaemonTerminalPilotRuntime(): TerminalPilotRuntime {\n let nextId = 1;\n\n async function request<T>(method: string, params?: unknown): Promise<T> {\n await ensureDaemon();\n return sendRequest<T>(method, params, nextId++);\n }\n\n function proxySession(name: string, info: SessionInfo): SessionProxy {\n return {\n id: info.id,\n command: info.command,\n pid: info.pid,\n exitCode: info.exitCode,\n fill: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"fill\", args: [text] });\n },\n type: async (text: string) => {\n await request(\"sessionAction\", { name, action: \"type\", args: [text] });\n },\n press: async (key: string) => {\n await request(\"sessionAction\", { name, action: \"press\", args: [key] });\n },\n signal: async (signal: string) => {\n await request(\"sessionAction\", { name, action: \"signal\", args: [signal] });\n },\n waitFor: async (pattern: string | RegExp, options?: WaitForOptions) =>\n request(\"sessionAction\", {\n name,\n action: \"waitFor\",\n args: [serializePattern(pattern), options]\n }),\n waitForExit: async (options?: { timeout?: number }) =>\n request(\"sessionAction\", { name, action: \"waitForExit\", args: [options] }),\n screen: async () => request(\"sessionAction\", { name, action: \"screen\", args: [] }),\n history: async (options?: { last?: number }) =>\n request(\"sessionAction\", { name, action: \"history\", args: [options] }),\n resize: async (cols: number, rows: number) => {\n await request(\"sessionAction\", { name, action: \"resize\", args: [cols, rows] });\n },\n close: async () => {\n const result = await request<{ exitCode: number }>(\"closeSession\", { name });\n return result.exitCode;\n }\n };\n }\n\n return {\n async createSession(params, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"createSession\", {\n params: {\n ...params,\n cwd: params.cwd ?? process.cwd()\n },\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async resolveSession(name, env) {\n const result = await request<{ name: string; session: SessionInfo }>(\"resolveSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n return { name: result.name, session: proxySession(result.name, result.session) };\n },\n\n async closeSession(name, env) {\n return request(\"closeSession\", {\n name,\n envSession: env?.get(SESSION_ENV_VAR)\n });\n },\n\n async listSessions() {\n const sessions = await request<Array<{ name: string; session: SessionInfo }>>(\"listSessions\");\n return sessions.map((entry) => ({\n name: entry.name,\n session: proxySession(entry.name, entry.session)\n }));\n },\n\n async hasRetainedSessions() {\n return request(\"hasRetainedSessions\");\n },\n\n async close() {\n await request(\"shutdown\").catch(() => undefined);\n }\n };\n}\n\nasync function handleRequestLine(\n runtime: TerminalPilotRuntime,\n line: string\n): Promise<RpcResponse> {\n let request: RpcRequest;\n try {\n request = JSON.parse(line) as RpcRequest;\n } catch (error) {\n return {\n id: 0,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Invalid request\" }\n };\n }\n\n try {\n const result = await handleRequest(runtime, request);\n return { id: request.id, ok: true, result };\n } catch (error) {\n return {\n id: request.id,\n ok: false,\n error: { message: error instanceof Error ? error.message : String(error) }\n };\n }\n}\n\nasync function handleRequest(runtime: TerminalPilotRuntime, request: RpcRequest): Promise<unknown> {\n const params = isRecord(request.params) ? request.params : {};\n\n if (request.method === \"ping\") {\n return { ok: true };\n }\n\n if (request.method === \"createSession\") {\n const createParams = isRecord(params.params) ? params.params : {};\n const namedSession = await runtime.createSession(\n createParams as unknown as Parameters<TerminalPilotRuntime[\"createSession\"]>[0],\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"resolveSession\") {\n const namedSession = await runtime.resolveSession(\n optionalString(params.name),\n envFromValue(params.envSession)\n );\n return formatNamedSession(namedSession);\n }\n\n if (request.method === \"listSessions\") {\n const sessions = await runtime.listSessions();\n return sessions.map(formatNamedSession);\n }\n\n if (request.method === \"hasRetainedSessions\") {\n return runtime.hasRetainedSessions();\n }\n\n if (request.method === \"closeSession\") {\n return runtime.closeSession(optionalString(params.name), envFromValue(params.envSession));\n }\n\n if (request.method === \"sessionAction\") {\n return runSessionAction(runtime, params);\n }\n\n if (request.method === \"shutdown\") {\n await runtime.close();\n process.exit(0);\n }\n\n throw new UserError(`Unknown terminal-pilot daemon method: ${request.method}`);\n}\n\nasync function runSessionAction(\n runtime: TerminalPilotRuntime,\n params: Record<string, unknown>\n): Promise<unknown> {\n const name = optionalString(params.name);\n const action = optionalString(params.action);\n const args = Array.isArray(params.args) ? params.args : [];\n const namedSession = await runtime.resolveSession(name);\n const session = namedSession.session;\n\n if (action === \"fill\") {\n await session.fill(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"type\") {\n await session.type(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"press\") {\n await session.press(String(args[0] ?? \"\") as TerminalKey);\n return undefined;\n }\n if (action === \"signal\") {\n await session.signal(String(args[0] ?? \"\"));\n return undefined;\n }\n if (action === \"waitFor\") {\n return session.waitFor(deserializePattern(args[0]), optionalRecord(args[1]));\n }\n if (action === \"waitForExit\") {\n return session.waitForExit(optionalRecord(args[0]));\n }\n if (action === \"screen\") {\n const screen = await session.screen();\n return {\n lines: [...screen.lines],\n rawLines: [...screen.rawLines],\n cursor: { ...screen.cursor },\n size: { ...screen.size }\n };\n }\n if (action === \"history\") {\n return session.history(optionalRecord(args[0]));\n }\n if (action === \"resize\") {\n await session.resize(Number(args[0]), Number(args[1]));\n return undefined;\n }\n\n throw new UserError(`Unknown terminal-pilot session action: ${action ?? \"<missing>\"}`);\n}\n\nasync function ensureDaemon(): Promise<void> {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n // Start below.\n }\n\n const socketPath = resolveSocketPath(process.env);\n await mkdir(path.dirname(socketPath), { recursive: true });\n if (process.platform !== \"win32\") {\n await unlink(socketPath).catch(() => undefined);\n }\n\n const entryPoint = process.argv[1];\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n throw new UserError(\"Cannot start terminal-pilot daemon: entrypoint is unknown.\");\n }\n\n const child = spawn(process.execPath, [...process.execArgv, entryPoint, DAEMON_ARG], {\n detached: true,\n stdio: \"ignore\",\n env: process.env\n });\n child.unref();\n\n const startedAt = Date.now();\n while (Date.now() - startedAt <= START_TIMEOUT_MS) {\n try {\n await sendRequest(\"ping\", undefined, 0, { start: false });\n return;\n } catch {\n await sleep(50);\n }\n }\n\n throw new UserError(\"Timed out waiting for terminal-pilot daemon to start.\");\n}\n\nfunction sendRequest<T>(\n method: string,\n params: unknown,\n id: number,\n options: { start?: boolean } = {}\n): Promise<T> {\n const socketPath = resolveSocketPath(process.env);\n return new Promise<T>((resolve, reject) => {\n const socket = net.createConnection(socketPath);\n let buffer = \"\";\n\n socket.setEncoding(\"utf8\");\n socket.on(\"connect\", () => {\n const request: RpcRequest = { id, method, params };\n socket.write(`${JSON.stringify(request)}\\n`);\n });\n socket.on(\"data\", (chunk) => {\n buffer += chunk;\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex < 0) {\n return;\n }\n\n const line = buffer.slice(0, newlineIndex);\n socket.end();\n try {\n const response = JSON.parse(line) as RpcResponse;\n if (response.ok) {\n resolve(response.result as T);\n } else {\n reject(new UserError(response.error.message));\n }\n } catch (error) {\n reject(error);\n }\n });\n socket.on(\"error\", (error) => {\n if (options.start === false) {\n reject(error);\n return;\n }\n reject(new UserError(error.message));\n });\n });\n}\n\nfunction resolveSocketPath(env: NodeJS.ProcessEnv): string {\n const runtimeDir =\n env[RUNTIME_DIR_ENV] ??\n path.join(os.tmpdir(), `terminal-pilot-${process.getuid?.() ?? \"user\"}`);\n\n if (process.platform === \"win32\") {\n const hash = createHash(\"sha256\").update(runtimeDir).digest(\"hex\").slice(0, 16);\n return `\\\\\\\\.\\\\pipe\\\\terminal-pilot-${hash}`;\n }\n\n return path.join(runtimeDir, \"daemon.sock\");\n}\n\nfunction formatNamedSession(\n namedSession: Awaited<ReturnType<TerminalPilotRuntime[\"resolveSession\"]>>\n) {\n return {\n name: namedSession.name,\n session: formatSession(namedSession.session)\n };\n}\n\nfunction formatSession(\n session: Pick<TerminalSession, \"id\" | \"command\" | \"pid\" | \"exitCode\">\n): SessionInfo {\n return {\n id: session.id,\n command: session.command,\n pid: session.pid,\n exitCode: session.exitCode\n };\n}\n\nfunction envFromValue(value: unknown): HandlerEnvLike | undefined {\n const sessionName = optionalString(value);\n if (sessionName === undefined) {\n return undefined;\n }\n\n return {\n get(key: string): string | undefined {\n return key === SESSION_ENV_VAR ? sessionName : undefined;\n }\n };\n}\n\nfunction serializePattern(pattern: string | RegExp): unknown {\n if (typeof pattern === \"string\") {\n return { kind: \"literal\", value: pattern };\n }\n\n return { kind: \"regex\", source: pattern.source, flags: pattern.flags };\n}\n\nfunction deserializePattern(value: unknown): string | RegExp {\n if (!isRecord(value)) {\n return String(value ?? \"\");\n }\n if (value.kind === \"regex\") {\n return new RegExp(String(value.source ?? \"\"), String(value.flags ?? \"\"));\n }\n return String(value.value ?? \"\");\n}\n\nfunction optionalRecord(value: unknown): Record<string, never> | undefined {\n return isRecord(value) ? (value as Record<string, never>) : undefined;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"],
|
|
5
5
|
"mappings": "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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;AAAA,EAAW;AAAA,EAAW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",
|
|
6
6
|
"names": ["realpath", "path", "fileURLToPath", "readFile", "path", "CommanderError", "config", "assertValidBranches", "path", "message", "text", "active", "prompt", "number", "text", "text", "config", "revision", "renderMarkdownInline", "symbol", "spacing", "message", "symbol", "formatColumns", "formatCommandList", "formatOptionList", "stripAnsi", "clamp", "padEndVisible", "isWhitespace", "splitWords", "wrapWords", "reset", "graphemeSegmenter", "isWideCodePoint", "clusterWidth", "width", "visibleWidth", "word", "frame", "close", "isWhitespace", "cursor", "isWhitespace", "process", "graphemeSegmenter", "AsyncLocalStorage", "readline", "wrapAnsi", "stringWidth", "wrapAnsi", "message", "error", "wrapAnsi", "cursor", "cursor", "renderHeader", "message", "message", "text", "fileURLToPath", "message", "config", "error", "message", "path", "path", "config", "rename", "fileURLToPath", "location", "separatorIndex", "previousSeparatorIndex", "candidate", "config", "children", "error", "path", "existsSync", "path", "isPlainObject", "error", "path", "params", "message", "type", "error", "message", "isPlainObject", "path", "formatPath", "message", "isPlainObject", "text", "write", "payload", "error", "error", "writeFile", "fs", "path", "path", "unwrapOptional", "splitWords", "error", "message", "trimmed", "params", "withOutputFormat", "path", "cursor", "text", "withOutputFormat", "isPlainObject", "unwrapOptional", "readFile", "error", "message", "scenario", "logger", "next", "optionPath", "params", "choices", "type", "CommanderError", "write", "randomUUID", "EventEmitter", "createRequire", "stripAnsi", "hasOwnErrorCode", "error", "isCombiningCodePoint", "params", "cursor", "stripAnsi", "EventEmitter", "text", "stripAnsi", "error", "require", "createRequire", "hasOwnErrorCode", "cursor", "DEFAULT_COLS", "DEFAULT_ROWS", "randomUUID", "listSessions", "params", "params", "params", "params", "params", "os", "path", "lookup", "config", "randomUUID", "path", "parse", "path", "path", "parse", "isConfigObject", "parse", "serialize", "merge", "prune", "isConfigObject", "parse", "serialize", "merge", "prune", "path", "path", "hasOwnErrorCode", "error", "error", "hasOwnErrorCode", "fs", "error", "hasOwnErrorCode", "path", "randomUUID", "isConfigObject", "stat", "backup", "fs", "error", "hasOwnErrorCode", "error", "readFile", "path", "fileURLToPath", "pathExists", "fs", "error", "hasOwnErrorCode", "config", "pathExists", "path", "randomUUID", "fs", "path", "fs", "randomUUID", "path", "os", "path", "error", "hasOwnErrorCode", "os", "path", "config", "fs", "path", "error", "params", "params", "params", "error", "params", "params", "params", "randomUUID", "rename", "writeFile", "ESC", "text", "params", "displayWidth", "parseAnsi", "hasOwnErrorCode", "error", "readFileSync", "createRequire", "dirname", "join", "fileURLToPath", "require", "displayWidth", "text", "isWideCodePoint", "color", "parseAnsi", "randomUUID", "writeFile", "rename", "error", "hasOwnErrorCode", "params", "params", "params", "randomUUID", "params", "randomUUID", "error", "fs", "hasOwnErrorCode", "params", "assertTimeout", "params", "waitForExit", "waitForExit", "spawn", "createHash", "mkdir", "unlink", "os", "path", "mkdir", "path", "unlink", "params", "info", "text", "error", "optionalString", "spawn", "sleep", "os", "createHash", "fileURLToPath", "realpath", "path"]
|
|
7
7
|
}
|