terminal-pilot 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cli.js +390 -241
  2. package/dist/cli.js.map +4 -4
  3. package/dist/commands/close-session.js +7 -2
  4. package/dist/commands/close-session.js.map +4 -4
  5. package/dist/commands/create-session.js +7 -2
  6. package/dist/commands/create-session.js.map +4 -4
  7. package/dist/commands/fill.js +7 -2
  8. package/dist/commands/fill.js.map +4 -4
  9. package/dist/commands/get-session.js +7 -2
  10. package/dist/commands/get-session.js.map +4 -4
  11. package/dist/commands/index.js +29 -24
  12. package/dist/commands/index.js.map +4 -4
  13. package/dist/commands/install.js +13 -8
  14. package/dist/commands/install.js.map +4 -4
  15. package/dist/commands/installer.js +15 -10
  16. package/dist/commands/installer.js.map +4 -4
  17. package/dist/commands/list-sessions.js +7 -2
  18. package/dist/commands/list-sessions.js.map +4 -4
  19. package/dist/commands/press-key.js +7 -2
  20. package/dist/commands/press-key.js.map +4 -4
  21. package/dist/commands/read-history.js +7 -2
  22. package/dist/commands/read-history.js.map +4 -4
  23. package/dist/commands/read-screen.js +7 -2
  24. package/dist/commands/read-screen.js.map +4 -4
  25. package/dist/commands/resize.js +7 -2
  26. package/dist/commands/resize.js.map +4 -4
  27. package/dist/commands/runtime.js +6 -1
  28. package/dist/commands/runtime.js.map +4 -4
  29. package/dist/commands/screenshot.js +11 -6
  30. package/dist/commands/screenshot.js.map +4 -4
  31. package/dist/commands/send-signal.js +7 -2
  32. package/dist/commands/send-signal.js.map +4 -4
  33. package/dist/commands/type.js +7 -2
  34. package/dist/commands/type.js.map +4 -4
  35. package/dist/commands/uninstall.js +16 -11
  36. package/dist/commands/uninstall.js.map +4 -4
  37. package/dist/commands/wait-for-exit.js +7 -2
  38. package/dist/commands/wait-for-exit.js.map +4 -4
  39. package/dist/commands/wait-for.js +7 -2
  40. package/dist/commands/wait-for.js.map +4 -4
  41. package/dist/testing/cli-repl.js +390 -241
  42. package/dist/testing/cli-repl.js.map +4 -4
  43. package/dist/testing/qa-cli.js +402 -253
  44. package/dist/testing/qa-cli.js.map +4 -4
  45. package/package.json +1 -1
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/cli.ts", "../../toolcraft/src/cli.ts", "../../design-system/src/tokens/colors.ts", "../../design-system/src/tokens/typography.ts", "../../design-system/src/tokens/widths.ts", "../../design-system/src/components/text.ts", "../../design-system/src/internal/output-format.ts", "../../design-system/src/internal/theme-detect.ts", "../../design-system/src/components/symbols.ts", "../../design-system/src/components/logger.ts", "../../design-system/src/prompts/primitives/log.ts", "../../design-system/src/internal/strip-ansi.ts", "../../design-system/src/components/help-formatter.ts", "../../design-system/src/components/table.ts", "../../design-system/src/acp/components.ts", "../../design-system/src/acp/writer.ts", "../../design-system/src/dashboard/buffer.ts", "../../design-system/src/dashboard/terminal.ts", "../../design-system/src/prompts/index.ts", "../../design-system/src/prompts/primitives/cancel.ts", "../../design-system/src/prompts/primitives/intro.ts", "../../design-system/src/prompts/primitives/note.ts", "../../design-system/src/prompts/primitives/outro.ts", "../../design-system/src/prompts/primitives/spinner.ts", "../../design-system/src/static/spinner.ts", "../../design-system/src/static/menu.ts", "../../toolcraft/src/index.ts", "../../toolcraft/src/user-error.ts", "../../toolcraft/src/human-in-loop/types.ts", "../../toolcraft/src/human-in-loop/config.ts", "../../toolcraft-schema/src/json.ts", "../../toolcraft-schema/src/oneof.ts", "../../toolcraft-schema/src/record.ts", "../../toolcraft-schema/src/union.ts", "../../toolcraft-schema/src/index.ts", "../../task-list/src/open.ts", "../../task-list/src/backends/markdown-dir.ts", "../../file-lock/src/lock.ts", "../../task-list/src/schema/task.schema.json", "../../task-list/src/state-machine.ts", "../../task-list/src/types.ts", "../../task-list/src/state.ts", "../../task-list/src/backends/utils.ts", "../../task-list/src/backends/yaml-file.ts", "../../task-list/src/schema/store.schema.json", "../../toolcraft/src/human-in-loop/approval-tasks.ts", "../../toolcraft/src/human-in-loop/state-machine.ts", "../../toolcraft/src/human-in-loop/runner.ts", "../../toolcraft/src/human-in-loop/default-provider.ts", "../../agent-human-in-loop/src/providers/osascript.ts", "../../agent-human-in-loop/src/providers/osascript-script.ts", "../../toolcraft/src/human-in-loop/spawn.ts", "../../toolcraft/src/human-in-loop/gate.ts", "../../toolcraft/src/human-in-loop/approvals-commands.ts", "../../toolcraft/src/mcp-proxy.ts", "../../tiny-mcp-client/src/internal.ts", "../../mcp-oauth/src/client/auth-store-session-store.ts", "../../auth-store/src/encrypted-file-store.ts", "../../auth-store/src/keychain-store.ts", "../../auth-store/src/create-secret-store.ts", "../../mcp-oauth/src/resource-indicator.ts", "../../mcp-oauth/src/client/default-oauth-client-provider.ts", "../../mcp-oauth/src/client/loopback-authorization.ts", "../../mcp-oauth/src/client/authorization-state.ts", "../../mcp-oauth/src/client/pkce.ts", "../../mcp-oauth/src/client/token-endpoint.ts", "../../mcp-oauth/src/server/jwks-token-verifier.ts", "../../tiny-mcp-client/src/oauth-discovery.ts", "../../toolcraft/src/json-schema-converter.ts", "../../toolcraft/src/number-schema.ts", "../../toolcraft/src/renderer.ts", "../src/terminal-pilot.ts", "../src/terminal-session.ts", "../src/ansi.ts", "../src/terminal-buffer.ts", "../src/keys.ts", "../src/terminal-screen.ts", "../src/commands/runtime.ts", "../src/commands/close-session.ts", "../src/commands/create-session.ts", "../src/commands/fill.ts", "../src/commands/get-session.ts", "../../agent-skill-config/src/configs.ts", "../../agent-defs/src/agents/claude-code.ts", "../../agent-defs/src/agents/claude-desktop.ts", "../../agent-defs/src/agents/codex.ts", "../../agent-defs/src/agents/opencode.ts", "../../agent-defs/src/agents/kimi.ts", "../../agent-defs/src/agents/goose.ts", "../../agent-defs/src/agents/poe-agent.ts", "../../agent-defs/src/registry.ts", "../../config-mutations/src/mutations/file-mutation.ts", "../../config-mutations/src/mutations/template-mutation.ts", "../../config-mutations/src/execution/apply-mutation.ts", "../../config-mutations/src/formats/json.ts", "../../config-mutations/src/formats/toml.ts", "../../config-mutations/src/formats/yaml.ts", "../../config-mutations/src/formats/index.ts", "../../config-mutations/src/execution/path-utils.ts", "../../config-mutations/src/fs-utils.ts", "../../config-mutations/src/execution/run-mutations.ts", "../../config-mutations/src/template/render.ts", "../../agent-skill-config/src/templates.ts", "../../agent-skill-config/src/apply.ts", "../src/commands/installer.ts", "../src/commands/install.ts", "../src/commands/list-sessions.ts", "../src/commands/press-key.ts", "../src/commands/read-history.ts", "../src/commands/read-screen.ts", "../src/commands/resize.ts", "../../terminal-png/src/index.ts", "../../terminal-png/src/ansi-parser.ts", "../../terminal-png/src/png-renderer.ts", "../../terminal-png/src/font.ts", "../../terminal-png/src/svg-renderer.ts", "../src/commands/screenshot.ts", "../src/commands/send-signal.ts", "../src/commands/type.ts", "../src/commands/uninstall.ts", "../src/commands/wait-for.ts", "../src/commands/wait-for-exit.ts", "../src/commands/index.ts"],
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 { terminalPilotGroup } from \"./commands/index.js\";\n\nfunction normalizeArgv(argv: string[]): string[] {\n if (\n argv.includes(\"--json\") &&\n !argv.some((argument) => argument === \"--output\" || argument.startsWith(\"--output=\"))\n ) {\n return argv.flatMap((argument) => argument === \"--json\" ? [\"--output\", \"json\"] : [argument]);\n }\n\n return argv;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const originalArgv = process.argv;\n process.argv = normalizeArgv(argv);\n\n try {\n await runCLI(terminalPilotGroup);\n } finally {\n process.argv = originalArgv;\n }\n}\n\nasync function isDirectExecution(argv: string[]): Promise<boolean> {\n const entryPoint = argv[1];\n\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n return false;\n }\n\n try {\n const modulePath = fileURLToPath(import.meta.url);\n const [resolvedEntryPoint, resolvedModulePath] = await Promise.all([\n realpath(path.resolve(entryPoint)),\n realpath(modulePath)\n ]);\n\n return resolvedEntryPoint === resolvedModulePath;\n } catch {\n return false;\n }\n}\n\nif (await isDirectExecution(process.argv)) {\n await main();\n}\n", "import { access, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command as CommanderCommand, CommanderError, InvalidArgumentError, Option } from \"commander\";\nimport type {\n AnySchema,\n ArraySchema,\n EnumSchema,\n JsonValueSchema,\n ObjectSchema,\n RecordSchema,\n} from \"toolcraft-schema\";\nimport {\n cancel,\n confirm,\n createLogger,\n formatCommandList,\n formatOptionList,\n getTheme,\n isCancel,\n note,\n promptText,\n renderTable,\n resetOutputFormatCache,\n select,\n text,\n} from \"@poe-code/design-system\";\nimport type {\n Command,\n CommandRequirementOptions,\n Group,\n HandlerContext,\n HandlerEnv,\n HandlerFs,\n SecretDeclarations,\n SecretDefinition,\n Scope,\n} from \"./index.js\";\nimport { ApprovalDeclinedError, UserError, assertCommandRequirements, getCommandSourcePath, resolveCommandSecrets } from \"./index.js\";\nimport { mergeApprovalsGroup } from \"./human-in-loop/approvals-commands.js\";\nimport { invokeWithHumanInLoop } from \"./human-in-loop/index.js\";\nimport type { HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./human-in-loop/index.js\";\nimport { resolveMcpProxies } from \"./mcp-proxy.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { renderResult } from \"./renderer.js\";\nimport type { OutputMode } from \"./renderer.js\";\n\nconst RESERVED_SERVICE_NAMES = new Set([\"params\", \"secrets\", \"fetch\", \"fs\", \"env\", \"progress\"]);\nconst NULL_OPTION_VALUE = Symbol(\"toolcraft.cli.null\");\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 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 shortFlag?: string;\n schema: FieldSchema;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n requiredWhenActive: 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 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\nexport interface RunCLIOptions<TServices extends object = Record<string, unknown>> {\n apiVersion?: string;\n casing?: Casing;\n humanInLoop?: HumanInLoopRuntimeOptions;\n rootDisplayName?: string;\n rootUsageName?: string;\n services?: TServices;\n version?: string;\n}\n\nfunction inferProgramName(argv: string[]): string {\n const entrypoint = argv[1];\n\n if (typeof entrypoint !== \"string\" || entrypoint.length === 0) {\n return \"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 = previous !== undefined && previous === previous.toLowerCase() && previous !== previous.toUpperCase();\n const nextIsLowercase = next !== undefined && next === next.toLowerCase() && next !== next.toUpperCase();\n\n if (isUppercase && current.length > 0 && (previousIsLowercase || nextIsLowercase)) {\n words.push(current.toLowerCase());\n current = char;\n continue;\n }\n\n current += char;\n }\n\n if (current.length > 0) {\n words.push(current.toLowerCase());\n }\n\n return words;\n}\n\nfunction formatSegment(segment: string, casing: Casing): string {\n const separator = casing === \"snake\" ? \"_\" : \"-\";\n return splitWords(segment).join(separator);\n}\n\nfunction toOptionFlag(path: string[], casing: Casing): string {\n return `--${path.map((segment) => formatSegment(segment, casing)).join(\".\")}`;\n}\n\nfunction toOptionAttribute(path: string[], casing: Casing): string {\n return path\n .map((segment) => {\n const formatted = formatSegment(segment, casing);\n\n if (casing === \"snake\") {\n return formatted;\n }\n\n const words = formatted.split(\"-\");\n return words\n .map((word, index) =>\n index === 0 ? word : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`\n )\n .join(\"\");\n })\n .join(\".\");\n}\n\nfunction toDisplayPath(path: string[]): string {\n return path.join(\".\");\n}\n\nfunction 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 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 = rawChildSchema.kind !== \"optional\" && childSchema.default === undefined;\n\n if (childSchema.kind === \"object\") {\n const nested = collectFields(childSchema, casing, nextPath, runtimeOptional, variantContext);\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([...nextPath, childSchema.discriminator], casing),\n optionFlag: toOptionFlag([...nextPath, childSchema.discriminator], casing),\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, 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) => getRequiredBranchFingerprint(branch, casing));\n const controlField: FieldDefinition = {\n id: controlDisplayPath,\n path: controlPath,\n displayPath: controlDisplayPath,\n optionAttribute: toOptionAttribute(controlPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(controlPath, casing),\n optionFlag: toOptionFlag(controlPath, casing),\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, 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),\n optionFlag: toOptionFlag(nextPath, casing),\n shortFlag: childSchema.short,\n schema: childSchema as FieldSchema,\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\n variantId: variantContext?.id,\n variantBranchId: variantContext?.branchId,\n });\n }\n\n return collected;\n}\n\nfunction toCommanderOptionAttribute(path: string[], casing: Casing): string {\n const optionAttribute = toOptionAttribute(path, casing);\n const optionFlag = toOptionFlag(path, casing);\n\n if (!GLOBAL_LONG_OPTION_FLAGS.has(optionFlag)) {\n return optionAttribute;\n }\n\n return `param_${optionAttribute}`;\n}\n\nfunction assignPositionals(fields: FieldDefinition[], positional: string[]): FieldDefinition[] {\n if (positional.length === 0) {\n return fields;\n }\n\n const byPath = new Map(fields.map((field) => [field.displayPath, field]));\n let variadicPositionSeen = false;\n\n positional.forEach((name, index) => {\n const field = byPath.get(name);\n\n if (field === undefined) {\n throw new UserError(`Positional parameter \"${name}\" does not exist in params.`);\n }\n\n if (field.schema.kind === \"array\") {\n if (index !== positional.length - 1) {\n throw new UserError(`Positional array parameter \"${name}\" must be the last positional.`);\n }\n\n variadicPositionSeen = true;\n }\n\n if (variadicPositionSeen && field.schema.kind !== \"array\") {\n throw new UserError(`Positional parameter \"${name}\" cannot appear after a positional array.`);\n }\n\n field.positionalIndex = index;\n field.variadicPosition = field.schema.kind === \"array\";\n });\n\n return fields;\n}\n\nfunction formatOptionFlags(field: FieldDefinition): string {\n const collidesWithGlobalFlag = GLOBAL_LONG_OPTION_FLAGS.has(field.optionFlag);\n\n if (collidesWithGlobalFlag) {\n if (field.shortFlag === undefined) {\n throw new UserError(\n `Parameter \"${field.displayPath}\" uses reserved CLI flag \"${field.optionFlag}\". Add a short flag or rename the parameter.`\n );\n }\n\n return `-${field.shortFlag}`;\n }\n\n if (field.shortFlag === undefined) {\n return field.optionFlag;\n }\n\n return `-${field.shortFlag}, ${field.optionFlag}`;\n}\n\nfunction formatPositionalToken(field: FieldDefinition): string {\n const optionalPositional = field.optional || field.hasDefault;\n\n if (field.variadicPosition === true) {\n return optionalPositional ? `[${field.displayPath}...]` : `<${field.displayPath}...>`;\n }\n\n return optionalPositional ? `[${field.displayPath}]` : `<${field.displayPath}>`;\n}\n\nfunction parseBooleanText(value: string, label: string): boolean {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"true\") {\n return true;\n }\n\n if (normalized === \"false\") {\n return false;\n }\n\n throw new InvalidArgumentError(`Invalid value for \"${label}\". Expected true or false.`);\n}\n\nfunction parseEnumValue(value: string, values: ReadonlyArray<string | number | boolean>, label: string): string | number | boolean {\n const match = values.find((candidate) => String(candidate) === value);\n\n if (match === undefined) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}.`\n );\n }\n\n return match;\n}\n\nfunction validateStringPattern(value: string, schema: Extract<ScalarSchema, { kind: \"string\" }>, label: string): string {\n if (schema.pattern === undefined) {\n return value;\n }\n\n if (!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 {\n throw new InvalidArgumentError(`Invalid value for \"${label}\". Expected valid JSON.`);\n }\n}\n\nfunction normalizeCommanderOptionValue(value: unknown): unknown {\n return value === NULL_OPTION_VALUE ? null : value;\n}\n\nfunction parseScalarValue(value: string, schema: ScalarSchema, label: string): 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)}.`\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\n throw new UserError(\"Unsupported CLI schema kind.\");\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) => parseScalarValue(item, itemSchema as ScalarSchema, label));\n}\n\nfunction createOption(field: FieldDefinition): Option[] {\n const flags = formatOptionFlags(field);\n const collidesWithGlobalFlag = GLOBAL_LONG_OPTION_FLAGS.has(field.optionFlag);\n const commanderValue = (value: unknown): unknown => (value === null ? NULL_OPTION_VALUE : value);\n\n if (field.schema.kind === \"boolean\") {\n if (collidesWithGlobalFlag) {\n return [createCommanderOption(flags, field.description, field)];\n }\n\n const mainOption = createCommanderOption(`${flags} [value]`, field.description, field);\n mainOption.preset(true);\n // Commander v14 passes the preset value through argParser too, so guard with typeof check\n mainOption.argParser((value: string | boolean) =>\n typeof value === \"boolean\" ? value : commanderValue(parseBooleanText(value, field.displayPath))\n );\n\n return [\n mainOption,\n createCommanderOption(`--no-${field.optionFlag.slice(2)}`, field.description, field),\n ];\n }\n\n if (field.schema.kind === \"array\") {\n return [\n createCommanderOption(`${flags} <value...>`, field.description, field).argParser(\n (value: string, previous: unknown[] | null = []) => {\n const parsed = parseArrayValue(value, field.schema as ArraySchema<any>, field.displayPath);\n if (parsed === null) {\n return NULL_OPTION_VALUE as unknown as null;\n }\n\n return [...(previous ?? []), ...parsed];\n }\n ),\n ];\n }\n\n if (field.schema.kind === \"json\") {\n return [\n createCommanderOption(`${flags} <json>`, field.description, field).argParser((value: string) =>\n commanderValue(parseJsonText(value, field.displayPath))\n ),\n ];\n }\n\n const option = createCommanderOption(`${flags} <value>`, field.description, field);\n\n if (field.schema.kind === \"enum\" && field.schema.values.every((value) => typeof value === \"string\")) {\n option.choices([...field.schema.values] as string[]);\n }\n\n option.argParser((value: string) =>\n commanderValue(parseScalarValue(value, field.schema as ScalarSchema, field.displayPath))\n );\n return [option];\n}\n\nconst GLOBAL_LONG_OPTION_FLAGS = new Set([\"--preset\", \"--yes\", \"--output\", \"--verbose\"]);\n\nfunction createCommanderOption(\n flags: string,\n description: string | undefined,\n field: FieldDefinition\n): Option {\n const option = new Option(flags, description);\n\n if (field.commanderOptionAttribute !== field.optionAttribute) {\n option.attributeName = () => field.commanderOptionAttribute;\n }\n\n return option;\n}\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.some((token) => HELP_FLAGS.has(token));\n}\n\nfunction resolveHelpOutput(argv: string[]): OutputMode {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index] ?? \"\";\n\n if (token === \"--output\") {\n const value = argv[index + 1];\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n continue;\n }\n\n if (token.startsWith(\"--output=\")) {\n const value = token.slice(\"--output=\".length);\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n }\n }\n\n return \"rich\";\n}\n\nfunction isNodeVisibleInScope<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n scope: Scope\n): boolean {\n if (node.kind === \"command\") {\n return node.scope.includes(scope);\n }\n\n return (\n getVisibleChildren(node, scope).length > 0 ||\n Boolean(node.default && node.default.scope.includes(scope)) ||\n node.scope === undefined ||\n node.scope.includes(scope)\n );\n}\n\nfunction getVisibleChildren<TServices extends object>(group: Group<TServices>, scope: Scope): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return group.children.filter((child) => isNodeVisibleInScope(child, scope));\n}\n\nfunction findVisibleChild<TServices extends object>(\n group: Group<TServices>,\n token: string,\n scope: Scope\n): Command<TServices, any, any, any> | Group<TServices> | undefined {\n return getVisibleChildren(group, scope).find(\n (child) => child.name === token || child.aliases.includes(token)\n );\n}\n\nfunction resolveHelpTarget<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n scope: Scope,\n rootDisplayName?: string\n): ResolvedHelpTarget<TServices> {\n const breadcrumb = [rootDisplayName ?? root.name];\n let current: Command<TServices, any, any, any> | Group<TServices> = root;\n\n for (const token of argv.slice(2)) {\n if (token.startsWith(\"-\") || token === \"help\") {\n break;\n }\n\n if (current.kind !== \"group\") {\n break;\n }\n\n const child: Command<TServices, any, any, any> | Group<TServices> | undefined = findVisibleChild(\n current,\n token,\n scope\n );\n if (child === undefined) {\n break;\n }\n\n breadcrumb.push(child.name);\n current = child;\n }\n\n return {\n breadcrumb,\n node: current,\n };\n}\n\nfunction describeSchemaType(schema: FieldSchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n\n case \"number\":\n return \"number\";\n\n case \"boolean\":\n return \"boolean\";\n\n case \"enum\":\n return \"value\";\n\n case \"array\":\n return `${describeSchemaType(unwrapOptional(schema.item) as FieldSchema)}...`;\n\n case \"json\":\n return \"json\";\n\n default:\n throw new UserError(\"Unsupported CLI schema kind.\");\n }\n}\n\nfunction formatHelpFieldFlags(field: FieldDefinition): string {\n if (field.positionalIndex !== undefined) {\n return formatPositionalToken(field);\n }\n\n if (field.schema.kind === \"boolean\") {\n return `${formatOptionFlags(field)} [value]`;\n }\n\n return `${formatOptionFlags(field)} <${describeSchemaType(field.schema)}>`;\n}\n\nfunction appendHelpMetadata(description: string, metadata: string[]): string {\n if (metadata.length === 0) {\n return description;\n }\n\n if (description.length === 0) {\n return `(${metadata.join(\", \")})`;\n }\n\n return `${description} (${metadata.join(\", \")})`;\n}\n\nfunction formatHelpFieldDescription(field: FieldDefinition): string {\n const description = field.description ?? field.displayPath;\n const metadata: string[] = [];\n\n if (!field.optional && !field.hasDefault) {\n metadata.push(\"required\");\n }\n\n if (field.hasDefault) {\n metadata.push(`default: ${formatResolvedValue(field.defaultValue)}`);\n }\n\n return appendHelpMetadata(description, metadata);\n}\n\nfunction 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 `${describeSchemaType(valueSchema as FieldSchema)}`;\n }\n\n if (valueSchema.kind === \"object\") {\n return \"value\";\n }\n\n return describeSchemaType(valueSchema as FieldSchema);\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(...collectDynamicObjectHelpRows(childSchema, casing, optionFlag, displayPath, metadata));\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 ? `${optionFlag} [value]`\n : `${optionFlag} <${describeSchemaType(childSchema as FieldSchema)}>`,\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 flags: `${field.optionFlag} <${describeDynamicFieldType(field)}>`,\n description: appendHelpMetadata(field.description ?? field.optionPathDisplay, metadata),\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 formatCommandRows<TServices extends object>(group: Group<TServices>, scope: Scope): HelpCommandRow[] {\n return getVisibleChildren(group, scope).map((child) => ({\n name: child.aliases.length === 0 ? child.name : `${child.name} (${child.aliases.join(\", \")})`,\n description: child.description ?? \"\",\n }));\n}\n\nfunction formatGlobalOptionRows(showVersion: boolean): HelpOptionRow[] {\n const rows: HelpOptionRow[] = [\n {\n flags: \"--preset <path>\",\n description: \"Load parameter defaults from a JSON file\",\n },\n {\n flags: \"--yes\",\n description: \"Accept defaults, skip prompts\",\n },\n {\n flags: \"--output <format>\",\n description: \"Output format (rich, md, json)\",\n },\n {\n flags: \"-h, --help\",\n description: \"Show help\",\n },\n ];\n\n if (showVersion) {\n rows.push({\n flags: \"--version\",\n description: \"Show version\",\n });\n }\n\n return rows;\n}\n\nfunction renderHelpSections(sections: string[]): string {\n return sections.filter((section) => section.length > 0).join(\"\\n\\n\");\n}\n\nfunction buildUsageLine(breadcrumb: string[], rootUsageName: string | undefined, suffix: string): string | undefined {\n if (rootUsageName === undefined) {\n return undefined;\n }\n const subPath = breadcrumb.slice(1).join(\" \");\n return subPath ? `${rootUsageName} ${subPath} ${suffix}` : `${rootUsageName} ${suffix}`;\n}\n\nfunction renderGroupHelp<TServices extends object>(\n group: Group<TServices>,\n breadcrumb: string[],\n scope: Scope,\n showVersion: boolean,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const commandRows = formatCommandRows(group, scope);\n\n if (commandRows.length > 0) {\n sections.push(`${text.section(\"Commands:\")}\\n${formatCommandList(commandRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(showVersion))}`);\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, \"[options] [command]\"),\n description: group.description,\n requiresAuth: group.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderLeafHelp<TServices extends object>(\n command: Command<TServices, any, any, any>,\n breadcrumb: string[],\n casing: Casing,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const collected = collectFields(command.params, casing);\n const fields = assignPositionals(collected.fields, command.positional);\n const optionRows = fields.map((field) => ({\n flags: formatHelpFieldFlags(field),\n description: formatHelpFieldDescription(field),\n })).concat(collected.dynamicFields.flatMap((field) => formatDynamicHelpFields(field, casing)));\n\n if (optionRows.length > 0) {\n sections.push(`${text.section(\"Options:\")}\\n${formatOptionList(optionRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(false))}`);\n\n const secretRows = formatSecretRows(command.secrets);\n if (secretRows.length > 0) {\n sections.push(`${text.section(\"Secrets (via environment):\")}\\n${formatOptionList(secretRows)}`);\n }\n\n const positionalFields = fields.filter((f) => f.positionalIndex !== undefined);\n const usageSuffix = positionalFields.length > 0\n ? `[options] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[options]\";\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, usageSuffix),\n description: command.description,\n requiresAuth: command.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderHelpDocument(input: {\n breadcrumb: string[];\n usageLine?: string;\n description?: string;\n requiresAuth: boolean;\n sections: string[];\n}): string {\n const lines = [text.heading(input.breadcrumb.join(\" \")), \"\"];\n\n if (input.usageLine !== undefined) {\n lines.push(`${text.section(\"Usage:\")} ${text.usageCommand(input.usageLine)}`, \"\");\n }\n\n if (input.description !== undefined) {\n lines.push(input.description);\n }\n\n if (input.requiresAuth) {\n lines.push(\"Requires: authentication\");\n }\n\n if (input.description !== undefined || input.requiresAuth) {\n lines.push(\"\");\n }\n\n lines.push(renderHelpSections(input.sections));\n\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nasync function renderGeneratedHelp<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n options: RunCLIOptions<TServices>\n): Promise<void> {\n const target = resolveHelpTarget(root, argv, \"cli\", options.rootDisplayName);\n const output = resolveHelpOutput(argv);\n const casing = options.casing ?? \"kebab\";\n\n await withOutputFormat(output, async () => {\n const rendered =\n target.node.kind === \"group\"\n ? renderGroupHelp(target.node, target.breadcrumb, \"cli\", options.version !== undefined, options.rootUsageName)\n : renderLeafHelp(target.node, target.breadcrumb, casing, options.rootUsageName);\n\n process.stdout.write(rendered);\n });\n}\n\nfunction createNodeCommand<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n execute: (state: ExecutionState<TServices>) => Promise<void>,\n 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 const collected = collectFields(node.params, casing);\n const fields = assignPositionals(collected.fields, node.positional);\n\n if (node.description !== undefined) {\n command.description(node.description);\n }\n\n node.aliases.forEach((alias) => command.alias(alias));\n command.addHelpCommand(false);\n addGlobalOptions(command);\n 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)) {\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 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 visibleChildren = node.children\n .map((child) => createNodeCommand(child, casing, execute, nextPathSegments))\n .filter((child): child is CommanderCommand => child !== null);\n\n const group = new CommanderCommand(node.name);\n\n if (node.description !== undefined) {\n group.description(node.description);\n }\n\n node.aliases.forEach((alias) => group.alias(alias));\n group.addHelpCommand(false);\n addGlobalOptions(group);\n for (const child of visibleChildren) {\n const isDefaultChild =\n node.default !== undefined &&\n node.default.scope.includes(\"cli\") &&\n (child.name() === node.default.name || child.aliases().includes(node.default.name));\n\n group.addCommand(child, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n return group;\n}\n\nfunction addGlobalOptions(command: CommanderCommand): void {\n command\n .option(\"--preset <path>\", \"Load parameter defaults from a JSON file.\")\n .option(\"--yes\", \"Accept defaults and skip prompts.\")\n .option(\"--output <format>\", \"Output format.\", (value: string) => {\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n\n if (value === \"markdown\") {\n return \"md\";\n }\n\n throw new InvalidArgumentError('Invalid value for \"--output\". Expected one of: rich, md, markdown, json.');\n })\n .option(\"--verbose\", \"Print stack traces for unexpected errors.\");\n}\n\nfunction setNestedValue(target: Record<string, unknown>, path: string[], value: unknown): void {\n let cursor = target;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const segment = path[index] ?? \"\";\n const existing = cursor[segment];\n\n if (typeof existing === \"object\" && existing !== null) {\n cursor = existing as Record<string, unknown>;\n continue;\n }\n\n const next: Record<string, unknown> = {};\n cursor[segment] = next;\n cursor = next;\n }\n\n const leaf = path[path.length - 1];\n if (leaf !== undefined) {\n cursor[leaf] = value;\n }\n}\n\nfunction formatResolvedValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\", \");\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nasync function promptForField(field: FieldDefinition): Promise<unknown> {\n const schema = field.schema;\n if (schema.kind === \"enum\") {\n const options = schema.loadOptions\n ? await schema.loadOptions()\n : schema.values.map((value) => ({\n label: schema.labels?.[String(value)] ?? String(value),\n value,\n }));\n const selected = await select({\n message: field.description ?? field.displayPath,\n options,\n initialValue: field.hasDefault ? field.defaultValue : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n if (field.schema.kind === \"boolean\") {\n const selected = await confirm({\n message: field.displayPath,\n initialValue: field.hasDefault ? Boolean(field.defaultValue) : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n const entered = await promptText({\n message: field.displayPath,\n initialValue:\n field.hasDefault && field.defaultValue !== undefined\n ? formatResolvedValue(field.defaultValue)\n : undefined,\n });\n\n if (isCancel(entered)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (typeof entered !== \"string\") {\n throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\n }\n\n if (entered.trim().length === 0 && field.hasDefault) {\n return field.defaultValue;\n }\n\n if (field.schema.kind === \"array\") {\n return parseArrayValue(entered, field.schema, field.displayPath);\n }\n\n 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\nconst DESIGN_SYSTEM_OUTPUT_BY_MODE = {\n rich: \"terminal\",\n md: \"markdown\",\n json: \"json\",\n} as const satisfies Record<OutputMode, \"terminal\" | \"markdown\" | \"json\">;\n\nfunction toDesignSystemOutput(output: OutputMode): \"terminal\" | \"markdown\" | \"json\" {\n return DESIGN_SYSTEM_OUTPUT_BY_MODE[output];\n}\n\nasync function withOutputFormat<T>(output: OutputMode, fn: () => Promise<T>): Promise<T> {\n const previous = process.env.OUTPUT_FORMAT;\n process.env.OUTPUT_FORMAT = toDesignSystemOutput(output);\n resetOutputFormatCache();\n\n try {\n return await fn();\n } finally {\n if (previous === undefined) {\n delete process.env.OUTPUT_FORMAT;\n } else {\n process.env.OUTPUT_FORMAT = previous;\n }\n resetOutputFormatCache();\n }\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") =>\n readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasFieldValue(value: unknown): boolean {\n return value !== undefined;\n}\n\nfunction hasNestedField(fields: FieldDefinition[], path: string[]): boolean {\n return fields.some(\n (field) =>\n path.length < field.path.length &&\n path.every((segment, index) => field.path[index] === segment)\n );\n}\n\nfunction describeExpectedPresetValue(schema: FieldSchema): string {\n if (schema.kind === \"array\") {\n return \"an array\";\n }\n\n if (schema.kind === \"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.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\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected ${describeExpectedPresetValue(schema)}.`\n );\n}\n\nfunction validatePresetFieldValue(\n value: unknown,\n field: FieldDefinition,\n presetPath: string\n): unknown {\n if (field.schema.kind === \"json\") {\n return value;\n }\n\n if (field.schema.kind !== \"array\") {\n return validatePresetScalarValue(value, field.schema as ScalarSchema, field.displayPath, presetPath);\n }\n\n const itemSchema = unwrapOptional(field.schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${field.displayPath}\" must use scalar items.`);\n }\n\n if (!Array.isArray(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array.`\n );\n }\n\n return value.map((item) =>\n validatePresetScalarValue(item, itemSchema as ScalarSchema, field.displayPath, presetPath)\n );\n}\n\nasync function loadPresetValues(\n fields: FieldDefinition[],\n presetPath: string\n): Promise<Record<string, unknown>> {\n let rawPreset: string;\n\n try {\n rawPreset = await readFile(presetPath, {\n encoding: \"utf8\",\n });\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new UserError(`Preset file \"${presetPath}\" was not found.`);\n }\n\n const message =\n error instanceof Error && error.message.length > 0\n ? error.message\n : \"Unknown read error.\";\n throw new UserError(`Preset file \"${presetPath}\" could not be read: ${message}`);\n }\n\n let parsedPreset: unknown;\n\n try {\n parsedPreset = JSON.parse(rawPreset);\n } catch {\n throw new UserError(`Preset file \"${presetPath}\" is not valid JSON.`);\n }\n\n if (!isPlainObject(parsedPreset)) {\n throw new UserError(`Preset file \"${presetPath}\" must contain a JSON object.`);\n }\n\n const fieldByPath = new Map(fields.map((field) => [field.displayPath, field]));\n const presetValues: Record<string, unknown> = {};\n\n function visitObject(current: Record<string, unknown>, path: string[]): void {\n for (const [key, value] of Object.entries(current)) {\n const nextPath = [...path, key];\n const displayPath = toDisplayPath(nextPath);\n const field = fieldByPath.get(displayPath);\n\n if (field !== undefined) {\n presetValues[field.optionAttribute] = validatePresetFieldValue(value, field, presetPath);\n continue;\n }\n\n if (!hasNestedField(fields, nextPath)) {\n throw new UserError(\n `Preset file \"${presetPath}\" contains unknown parameter \"${displayPath}\".`\n );\n }\n\n if (!isPlainObject(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${displayPath}\". Expected an object.`\n );\n }\n\n visitObject(value, nextPath);\n }\n }\n\n visitObject(parsedPreset, []);\n return presetValues;\n}\n\nfunction isNumericFixtureSelector(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeHttpMethod(value: string | undefined): string {\n return (value ?? \"GET\").toUpperCase();\n}\n\nfunction isReadLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"get\" ||\n normalized === \"head\" ||\n normalized === \"options\" ||\n normalized.startsWith(\"read\") ||\n normalized.startsWith(\"get\") ||\n normalized.startsWith(\"find\") ||\n normalized.startsWith(\"list\") ||\n normalized.startsWith(\"load\") ||\n normalized.startsWith(\"fetch\") ||\n normalized.startsWith(\"query\") ||\n normalized.startsWith(\"exists\") ||\n normalized.startsWith(\"has\")\n );\n}\n\nfunction isWriteLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"post\" ||\n normalized === \"put\" ||\n normalized === \"patch\" ||\n normalized === \"delete\" ||\n normalized.startsWith(\"write\") ||\n normalized.startsWith(\"set\") ||\n normalized.startsWith(\"save\") ||\n normalized.startsWith(\"create\") ||\n normalized.startsWith(\"update\") ||\n normalized.startsWith(\"delete\") ||\n normalized.startsWith(\"remove\") ||\n normalized.startsWith(\"insert\")\n );\n}\n\nfunction matchesFixtureValue(expected: unknown, actual: unknown): boolean {\n if (typeof expected === \"string\" && typeof actual === \"string\" && expected.endsWith(\"%\")) {\n return actual.startsWith(expected.slice(0, -1));\n }\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || expected.length !== actual.length) {\n return false;\n }\n\n return expected.every((item, index) => matchesFixtureValue(item, actual[index]));\n }\n\n if (isPlainObject(expected)) {\n if (!isPlainObject(actual)) {\n return false;\n }\n\n return Object.entries(expected).every(([key, value]) => matchesFixtureValue(value, actual[key]));\n }\n\n return Object.is(expected, actual);\n}\n\nfunction getFetchUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") {\n return input;\n }\n\n if (input instanceof URL) {\n return input.toString();\n }\n\n return input.url;\n}\n\nfunction createFixtureResponse(response: FixtureFetchResponse): Response {\n const status = response.status ?? 200;\n const headers = new Headers(response.headers);\n\n if (response.body === undefined) {\n return new Response(null, {\n status,\n headers,\n });\n }\n\n if (typeof response.body === \"string\") {\n return new Response(response.body, {\n status,\n headers,\n });\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return new Response(JSON.stringify(response.body), {\n status,\n headers,\n });\n}\n\nfunction createFixtureFetch(entries: FixtureFetchEntry[] | undefined): typeof globalThis.fetch {\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = normalizeHttpMethod(init?.method ?? (input instanceof Request ? input.method : undefined));\n const url = getFetchUrl(input);\n const match = entries?.find((entry) => {\n const requestMethod = normalizeHttpMethod(entry.request.method);\n return requestMethod === method && entry.request.url === url;\n });\n\n if (match !== undefined) {\n return createFixtureResponse(match.response);\n }\n\n if (isReadLikeMethod(method)) {\n return null as unknown as Response;\n }\n\n return new Response(null, {\n status: 204,\n });\n };\n}\n\nfunction createFixtureFs(definition: unknown): HandlerFs {\n const fsDefinition = isPlainObject(definition) ? definition : {};\n const readFileEntries = isPlainObject(fsDefinition.readFile) ? fsDefinition.readFile : {};\n const existsEntries = isPlainObject(fsDefinition.exists) ? fsDefinition.exists : {};\n\n return {\n readFile: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(readFileEntries, filePath)) {\n return String(readFileEntries[filePath]);\n }\n\n return null as unknown as string;\n },\n writeFile: async () => undefined,\n exists: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(existsEntries, filePath)) {\n return Boolean(existsEntries[filePath]);\n }\n\n return Object.prototype.hasOwnProperty.call(readFileEntries, filePath);\n },\n };\n}\n\nfunction resolveFixtureMethodResult(\n methodName: string,\n definition: unknown,\n args: unknown[]\n): Promise<unknown> {\n if (Array.isArray(definition)) {\n for (const entry of definition) {\n if (!isPlainObject(entry)) {\n continue;\n }\n\n const explicitMatcher = isPlainObject(entry.request) ? entry.request : undefined;\n const matcher =\n explicitMatcher ??\n Object.fromEntries(\n Object.entries(entry).filter(([key]) => key !== \"result\" && key !== \"response\" && key !== \"error\")\n );\n\n const firstArg = args[0];\n let matched = false;\n\n if (Array.isArray(matcher.args)) {\n matched = matchesFixtureValue(matcher.args, args);\n } else if (Object.keys(matcher).length === 0) {\n matched = true;\n } else if (isPlainObject(firstArg)) {\n matched = matchesFixtureValue(matcher, firstArg);\n } else if (args.length === 1 && Object.keys(matcher).length === 1) {\n const [[, expectedValue]] = Object.entries(matcher);\n matched = matchesFixtureValue(expectedValue, firstArg);\n }\n\n if (!matched) {\n continue;\n }\n\n if (entry.error !== undefined) {\n throw new Error(String(entry.error));\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"result\")) {\n return Promise.resolve(entry.result);\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"response\")) {\n return Promise.resolve(entry.response);\n }\n\n return Promise.resolve(null);\n }\n }\n\n if (isPlainObject(definition)) {\n const firstArg = args[0];\n\n if (typeof firstArg === \"string\" && Object.prototype.hasOwnProperty.call(definition, firstArg)) {\n return Promise.resolve(definition[firstArg]);\n }\n }\n\n if (isWriteLikeMethod(methodName)) {\n return Promise.resolve(undefined);\n }\n\n return Promise.resolve(null);\n}\n\nfunction createFixtureService(definition: unknown): Record<string, unknown> {\n const methods = isPlainObject(definition) ? definition : {};\n\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === \"then\") {\n return undefined;\n }\n\n const methodName = String(property);\n return async (...args: unknown[]) => resolveFixtureMethodResult(methodName, methods[methodName], args);\n },\n }\n );\n}\n\nfunction resolveFixturePath(commandPath: string): string {\n const parsed = path.parse(commandPath);\n return path.join(parsed.dir, `${parsed.name}.fixture.json`);\n}\n\nfunction selectFixtureScenario(scenarios: FixtureScenario[], selector: string): FixtureScenario {\n if (isNumericFixtureSelector(selector)) {\n const index = Number(selector) - 1;\n const scenario = scenarios[index];\n\n if (scenario === undefined) {\n throw new UserError(\n `Fixture scenario index ${selector} is out of range. Available scenarios: ${scenarios.length}.`\n );\n }\n\n return scenario;\n }\n\n const scenario = scenarios.find((entry) => entry.name === selector);\n\n if (scenario === undefined) {\n throw new UserError(`Fixture scenario \"${selector}\" was not found.`);\n }\n\n return scenario;\n}\n\nasync function loadFixtureScenario(command: Command<any, any, any, any>, selector: string): Promise<FixtureScenario> {\n const commandPath = getCommandSourcePath(command);\n\n if (commandPath === undefined) {\n throw new UserError(`Fixture mode could not determine the source file for command \"${command.name}\".`);\n }\n\n const fixturePath = resolveFixturePath(commandPath);\n let rawFixture: string;\n\n try {\n rawFixture = await readFile(fixturePath, {\n encoding: \"utf8\",\n });\n } catch {\n throw new UserError(\n `Fixture file not found for command \"${command.name}\". Expected ${fixturePath}.`\n );\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(rawFixture);\n } catch {\n throw new UserError(`Fixture file ${fixturePath} is not valid JSON.`);\n }\n\n if (!Array.isArray(parsed)) {\n throw new UserError(`Fixture file ${fixturePath} must contain a JSON array of scenarios.`);\n }\n\n return selectFixtureScenario(parsed as FixtureScenario[], selector);\n}\n\nfunction resolveFixtureSecrets(command: Command<any, any, any, any>): Record<string, string> {\n return Object.fromEntries(Object.keys(command.secrets).map((name) => [name, \"fixture-secret\"]));\n}\n\nfunction createFixtureEnvValues(command: Command<any, any, any, any>): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {\n ...process.env,\n POE_API_KEY: process.env.POE_API_KEY ?? \"fixture-secret\",\n };\n\n for (const secret of Object.values(command.secrets)) {\n values[secret.env] = values[secret.env] ?? \"fixture-secret\";\n }\n\n return values;\n}\n\nasync function resolveFixtureRuntime<TServices extends object>(\n command: Command<TServices, any, any, any>,\n services: TServices,\n requirementOptions: CommandRequirementOptions\n): Promise<ResolvedFixtureRuntime<TServices>> {\n const selector = process.env.TOOLCRAFT_FIXTURE;\n\n if (selector === undefined || selector.length === 0) {\n return {\n env: createEnv(),\n fetch: globalThis.fetch,\n fs: createFs(),\n isFixture: false,\n requirementOptions,\n secrets: resolveCommandSecrets(command),\n services,\n };\n }\n\n const scenario = await loadFixtureScenario(command, selector);\n const scenarioServices = isPlainObject(scenario.services) ? scenario.services : {};\n const customServiceNames = new Set([\n ...Object.keys(services as Record<string, unknown>),\n ...Object.keys(scenarioServices).filter((name) => !RESERVED_SERVICE_NAMES.has(name)),\n ]);\n const fixtureServices = Object.fromEntries(\n [...customServiceNames].map((name) => [name, createFixtureService(scenarioServices[name])])\n ) as TServices;\n const fixtureEnvValues = createFixtureEnvValues(command);\n\n return {\n env: createEnv(fixtureEnvValues),\n fetch: createFixtureFetch(scenarioServices.fetch as FixtureFetchEntry[] | undefined),\n fs: createFixtureFs(scenarioServices.fs),\n isFixture: true,\n requirementOptions: {\n ...requirementOptions,\n env: fixtureEnvValues,\n },\n secrets: resolveFixtureSecrets(command),\n services: fixtureServices,\n };\n}\n\nfunction writeRichHeader(title: string): void {\n const padding = Math.max(12, 34 - title.length);\n process.stdout.write(`\u2500\u2500 ${title} ${\"\u2500\".repeat(padding)}\\n`);\n}\n\nfunction 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\nfunction validateServices(services: Record<string, unknown>): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(`Service name \"${name}\" is reserved. Choose a different name.`);\n }\n }\n}\n\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 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 (token.startsWith(\"-\")) {\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 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): {\n displayPath: string;\n path: string[];\n schema: FieldSchema;\n} {\n const unwrappedSchema = unwrapOptional(schema);\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(`Unsupported dynamic CLI schema kind \"${unwrappedSchema.kind}\".`);\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<[string, AnySchema]>) {\n if (formatSegment(key, casing) !== head) {\n continue;\n }\n\n return resolveDynamicLeaf(childSchema, rest, casing, [...outputPath, key], [...displayPath, key]);\n }\n\n throw new UserError(`Unknown parameter \"${[...displayPath, head].join(\".\")}\".`);\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 );\n }\n\n case \"array\": {\n const itemSchema = unwrapOptional(unwrappedSchema.item);\n if (itemSchema.kind !== \"object\") {\n throw new UserError(`Array parameter \"${toDisplayPath(displayPath)}\" must use object items.`);\n }\n\n const [head, ...rest] = rawSegments;\n if (head === undefined || !isNumericFixtureSelector(head)) {\n throw new UserError(`Array parameter \"${toDisplayPath(displayPath)}\" must use numeric indices.`);\n }\n\n return resolveDynamicLeaf(itemSchema, rest, casing, [...outputPath, head], [...displayPath, head]);\n }\n\n default:\n throw new UserError(`Unknown parameter \"${[...displayPath, ...rawSegments].join(\".\")}\".`);\n }\n}\n\nfunction finalizeDynamicValue(schema: AnySchema, value: unknown, displayPath: string): 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 throw new UserError(`Invalid value for \"${displayPath}\". Expected indexed object entries.`);\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 throw new UserError(`Array parameter \"${displayPath}\" must use numeric indices.`);\n }\n\n for (let index = 0; index < indices.length; index += 1) {\n if (indices[index] !== index) {\n throw new UserError(`Array parameter \"${displayPath}\" must use contiguous indices starting at 0.`);\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 )\n );\n }\n\n case \"object\": {\n if (!isPlainObject(value)) {\n throw new UserError(`Invalid value for \"${displayPath}\". Expected an object.`);\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, rawChildSchema] of Object.entries(unwrappedSchema.shape) as Array<[string, AnySchema]>) {\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 throw new UserError(`Missing required parameter \"${childDisplayPath}\".`);\n }\n\n result[key] = finalizeDynamicValue(rawChildSchema, childValue, childDisplayPath);\n }\n\n return result;\n }\n\n case \"record\": {\n if (!isPlainObject(value)) {\n throw new UserError(`Invalid value for \"${displayPath}\". Expected an object.`);\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 ),\n ])\n );\n }\n\n default:\n throw new UserError(`Unsupported dynamic CLI schema kind \"${unwrappedSchema.kind}\".`);\n }\n}\n\nfunction parseDynamicValues(\n dynamicFields: DynamicFieldDefinition[],\n rawArgv: string[],\n casing: Casing\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((left, right) => right.optionPath.length - left.optionPath.length);\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(`Unknown parameter \"${flagName}\".`);\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);\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 ),\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): 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\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 throw new UserError(`Missing required parameter \"${variant.controlDisplayPath}\".`);\n }\n\n const selectedBranch = variant.branches.find((branch) => branch.branchId === selectedBranchId);\n if (selectedBranch === undefined) {\n throw new UserError(\n `Invalid value for \"${variant.controlDisplayPath}\". Expected one of: ${variant.branches.map((branch) => branch.branchId).join(\", \")}.`\n );\n }\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 throw new UserError(\n `Parameter \"${field.displayPath}\" is not valid when \"${variant.controlDisplayPath}\" is \"${selectedBranch.branchId}\".`\n );\n }\n }\n\n const invalidDynamicFieldId = branch.dynamicFieldIds.find((fieldId) => providedDynamicFieldIds.has(fieldId));\n if (invalidDynamicFieldId !== undefined) {\n const field = dynamicFieldById.get(invalidDynamicFieldId);\n if (field !== undefined) {\n throw new UserError(\n `Parameter \"${field.displayPath}\" is not valid when \"${variant.controlDisplayPath}\" is \"${selectedBranch.branchId}\".`\n );\n }\n }\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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): 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\n for (const field of fields) {\n let value: unknown;\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 Object.prototype.hasOwnProperty.call(presetValues, field.optionAttribute)\n ) {\n value = presetValues[field.optionAttribute];\n source = \"preset\";\n }\n\n if (value === undefined && shouldPrompt && !field.optional) {\n value = await promptForField(field);\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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)\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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 );\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 runtimeOptions: HumanInLoopRuntimeOptions | undefined\n): Promise<void> {\n const logger = createLogger();\n const primitives = {\n logger,\n renderTable,\n getTheme,\n note,\n };\n const optionValues = state.actionCommand.optsWithGlobals() as Record<string, unknown>;\n const resolvedFlags = optionValues as ResolvedFlags;\n const output = resolveOutput(resolvedFlags);\n const shouldPrompt = !resolvedFlags.yes && Boolean(process.stdin.isTTY);\n const runtime = await resolveFixtureRuntime(state.command, services, requirementOptions);\n const preflightContext = {\n ...runtime.services,\n secrets: runtime.secrets,\n fetch: runtime.fetch,\n fs: runtime.fs,\n env: runtime.env,\n progress(message: string): void {\n logger.info(message);\n },\n };\n\n await withOutputFormat(output, async () => {\n await assertCommandRequirements(state.command, preflightContext, runtime.requirementOptions);\n\n const params = await resolveParams(\n state.fields,\n state.dynamicFields,\n state.variants,\n state.positionalValues,\n optionValues,\n state.rawArgv,\n state.casing,\n resolvedFlags.preset,\n shouldPrompt\n );\n\n const context = {\n ...preflightContext,\n params,\n } as HandlerContext<any, any, TServices>;\n\n if (state.command.confirm && !state.command.humanInLoop && !resolvedFlags.yes && process.stdin.isTTY) {\n for (const field of state.fields) {\n const value = field.path.reduce<unknown>(\n (current, segment) =>\n current && typeof current === \"object\"\n ? (current as Record<string, unknown>)[segment]\n : undefined,\n params\n );\n\n if (value !== undefined) {\n logger.resolved(field.displayPath, formatResolvedValue(value));\n }\n }\n\n const proceed = await confirm({\n message: \"Proceed?\",\n initialValue: true,\n });\n\n if (isCancel(proceed)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (proceed !== true) {\n throw new UserError(\"Operation cancelled.\");\n }\n }\n\n const result = await invokeWithHumanInLoop(state.command, context, runtimeOptions, state.commandPath);\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 renderResult(state.command, result, output, primitives);\n });\n}\n\nfunction handleRunError(error: unknown, verbose: boolean): void {\n const logger = createLogger();\n\n if (error instanceof UserError) {\n logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof CommanderError) {\n process.exitCode = error.exitCode;\n if (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\") {\n return;\n }\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error(verbose ? message : `${message} Use --verbose for a stack trace.`);\n\n if (verbose && error instanceof Error && error.stack) {\n process.stderr.write(`${error.stack}\\n`);\n }\n\n process.exitCode = 1;\n}\n\nexport async function runCLI<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunCLIOptions<TServices> = {}\n): Promise<void> {\n const root = mergeApprovalsGroup(normalizeRoots(roots, process.argv));\n await resolveMcpProxies(root);\n const casing = options.casing ?? \"kebab\";\n const services = (options.services ?? {}) as TServices;\n const runtimeOptions = options.humanInLoop ?? {};\n const servicesWithBuiltIns = {\n ...services,\n runtimeOptions,\n root,\n } as TServices;\n const requirementOptions = {\n apiVersion: options.apiVersion,\n } satisfies CommandRequirementOptions;\n\n validateServices(services as Record<string, unknown>);\n\n if (hasHelpFlag(process.argv)) {\n await renderGeneratedHelp(root, process.argv, options);\n return;\n }\n\n const program = new CommanderCommand();\n program.name(root.name);\n program.exitOverride();\n program.showHelpAfterError();\n program.addHelpCommand(false);\n addGlobalOptions(program);\n\n if (options.version !== undefined) {\n program.version(options.version, \"--version\");\n }\n\n let lastActionCommand: CommanderCommand | undefined;\n const execute = async (state: ExecutionState<TServices>) => {\n lastActionCommand = state.actionCommand;\n await executeCommand(state, servicesWithBuiltIns, requirementOptions, runtimeOptions);\n };\n\n for (const child of root.children) {\n const command = createNodeCommand(child, casing, execute);\n if (command === null) {\n continue;\n }\n\n const isDefaultChild =\n root.default !== undefined &&\n root.default.scope.includes(\"cli\") &&\n (command.name() === root.default.name || command.aliases().includes(root.default.name));\n\n program.addCommand(command, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof ApprovalDeclinedError) {\n renderApprovalDeclined(error);\n return;\n }\n\n handleRunError(\n error,\n lastActionCommand ? Boolean(getResolvedFlags(lastActionCommand).verbose) : process.argv.includes(\"--verbose\")\n );\n }\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "export const widths = {\n header: 60,\n helpColumn: 24,\n maxLine: 80\n} as const;\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().intro(content);\n },\n heading(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return getTheme().header(content);\n },\n section(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return typography.bold(content);\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().accent(content);\n },\n argument(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `<${content}>`;\n return getTheme().muted(content);\n },\n option(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().muted(content);\n },\n usageCommand(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}](${content})`;\n return getTheme().accent(content);\n },\n muted(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `*${content}*`;\n return getTheme().muted(content);\n },\n badge(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}]`;\n return getTheme().badge(content);\n },\n selectLabel(label: string, detail?: string): string {\n if (!detail) {\n return label;\n }\n const format = resolveOutputFormat();\n if (format !== \"terminal\") {\n return `${label} \u2014 ${detail}`;\n }\n return `${label} ${typography.dim(\"\u2014\")} ${typography.dim(detail)}`;\n }\n} as const;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "import chalk from \"chalk\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import chalk from \"chalk\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = chalk.gray(\"\u2502\"),\n secondarySymbol = chalk.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { text } from \"./text.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface CommandInfo {\n name: string;\n description: string;\n}\n\nexport interface OptionInfo {\n flags: string;\n description: string;\n}\n\nexport function formatCommand(name: string, description: string): string {\n const paddedName = name.padEnd(widths.helpColumn);\n return ` ${text.command(paddedName)} ${description}`;\n}\n\nexport function formatUsage(command: string, args?: string): string {\n const argsStr = args ? ` ${text.argument(args)}` : \"\";\n return `${text.usageCommand(command)}${argsStr}`;\n}\n\nexport function formatOption(flags: string, description: string): string {\n const paddedFlags = flags.padEnd(widths.helpColumn);\n return ` ${text.option(paddedFlags)} ${description}`;\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return commands.map((cmd) => formatCommand(cmd.name, cmd.description)).join(\"\\n\");\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return options.map((opt) => formatOption(opt.flags, opt.description)).join(\"\\n\");\n}\n\nexport const helpFormatter = {\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList\n} as const;\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { renderMarkdown } from \"../terminal-markdown/index.js\";\nimport { getAcpWriter } from \"./writer.js\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n getAcpWriter()(line);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nfunction formatCost(costUsd: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(costUsd);\n}\n\nexport function renderAgentMessage(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **agent:** ${text}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"agent_message\", text }));\n return;\n }\n\n const rendered = renderMarkdown(text).trimEnd();\n writeLine(`${AGENT_PREFIX}${rendered}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2192 ${kind}: ${title}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_start\", kind, title }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2713 ${kind}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_complete\", kind }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *thinking:* ${truncate(text, 80)}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"reasoning\", text }));\n return;\n }\n\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const format = resolveOutputFormat();\n const cached =\n typeof tokens.cached === \"number\" && tokens.cached > 0 ? ` (${tokens.cached} cached)` : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n cost = ` (${formatCost(tokens.costUsd)})`;\n }\n\n if (format === \"markdown\") {\n writeLine(`- **tokens:** ${tokens.input} in \u2192 ${tokens.output} out${cost}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(\n JSON.stringify({\n event: \"usage\",\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n cachedTokens: tokens.cached ?? 0,\n costUsd: tokens.costUsd ?? 0\n })\n );\n return;\n }\n\n writeLine(\"\");\n writeLine(chalk.green(`\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`));\n}\n\nexport function renderError(message: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **error:** ${message}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"error\", message }));\n return;\n }\n\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import chalk from \"chalk\";\nimport type { Cell, CellStyle, Rect } from \"./types.js\";\n\nconst EMPTY_CELL: Cell = { ch: \" \", style: {} };\n\nexport class ScreenBuffer {\n private _width: number;\n private _height: number;\n private _cells: Cell[];\n\n constructor(width: number, height: number) {\n this._width = normalizeSize(width);\n this._height = normalizeSize(height);\n this._cells = createCells(this._width, this._height);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n put(x: number, y: number, text: string, style?: CellStyle): void {\n if (!this.isInBoundsY(y) || text.length === 0) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n let offset = 0;\n\n for (const ch of text) {\n const targetX = x + offset;\n offset += 1;\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n get(x: number, y: number): Cell {\n if (!this.isInBounds(x, y)) {\n return cloneCell(EMPTY_CELL);\n }\n\n return cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n\n clear(style?: CellStyle): void {\n this._cells = createCells(this._width, this._height, style);\n }\n\n clearRect(rect: Rect, style?: CellStyle): void {\n const startX = Math.max(0, rect.x);\n const startY = Math.max(0, rect.y);\n const endX = Math.min(this._width, rect.x + Math.max(0, rect.width));\n const endY = Math.min(this._height, rect.y + Math.max(0, rect.height));\n const normalizedStyle = normalizeStyle(style);\n\n for (let y = startY; y < endY; y += 1) {\n for (let x = startX; x < endX; x += 1) {\n this._cells[this.index(x, y)] = { ch: \" \", style: normalizedStyle };\n }\n }\n }\n\n resize(width: number, height: number): void {\n const nextWidth = normalizeSize(width);\n const nextHeight = normalizeSize(height);\n const nextCells = createCells(nextWidth, nextHeight);\n const copyWidth = Math.min(this._width, nextWidth);\n const copyHeight = Math.min(this._height, nextHeight);\n\n for (let y = 0; y < copyHeight; y += 1) {\n for (let x = 0; x < copyWidth; x += 1) {\n nextCells[(y * nextWidth) + x] = cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n }\n\n this._width = nextWidth;\n this._height = nextHeight;\n this._cells = nextCells;\n }\n\n putInRect(rect: Rect, row: number, text: string, style?: CellStyle): void {\n if (row < 0 || row >= rect.height || text.length === 0 || rect.width <= 0) {\n return;\n }\n\n const y = rect.y + row;\n if (!this.isInBoundsY(y)) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n const rectEndX = rect.x + rect.width;\n let offset = 0;\n\n for (const ch of text) {\n const targetX = rect.x + offset;\n offset += 1;\n\n if (targetX >= rectEndX) {\n break;\n }\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n private index(x: number, y: number): number {\n return (y * this._width) + x;\n }\n\n private isInBounds(x: number, y: number): boolean {\n return this.isInBoundsX(x) && this.isInBoundsY(y);\n }\n\n private isInBoundsX(x: number): boolean {\n return x >= 0 && x < this._width;\n }\n\n private isInBoundsY(y: number): boolean {\n return y >= 0 && y < this._height;\n }\n}\n\nexport function diff(\n prev: ScreenBuffer,\n next: ScreenBuffer\n): Array<{ x: number; y: number; cell: Cell }> {\n const changes: Array<{ x: number; y: number; cell: Cell }> = [];\n const width = Math.max(prev.width, next.width);\n const height = Math.max(prev.height, next.height);\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const previousCell = prev.get(x, y);\n const nextCell = next.get(x, y);\n\n if (!cellsEqual(previousCell, nextCell)) {\n changes.push({ x, y, cell: nextCell });\n }\n }\n }\n\n return changes;\n}\n\nexport function cellToAnsi(cell: Cell): string {\n const style = cell.style ?? {};\n let painter = chalk;\n\n if (style.bold) {\n painter = painter.bold;\n }\n\n if (style.dim) {\n painter = painter.dim;\n }\n\n if (style.fg) {\n painter = applyForegroundColor(painter, style.fg);\n }\n\n if (style.bg) {\n painter = applyBackgroundColor(painter, style.bg);\n }\n\n return painter(cell.ch);\n}\n\nfunction createCells(width: number, height: number, style?: CellStyle): Cell[] {\n const normalizedStyle = normalizeStyle(style);\n return Array.from({ length: width * height }, () => ({ ch: \" \", style: normalizedStyle }));\n}\n\nfunction cloneCell(cell: Cell): Cell {\n return {\n ch: cell.ch,\n style: normalizeStyle(cell.style)\n };\n}\n\nfunction normalizeStyle(style?: CellStyle): CellStyle {\n const next: CellStyle = {};\n\n if (style?.fg !== undefined) {\n next.fg = style.fg;\n }\n\n if (style?.bg !== undefined) {\n next.bg = style.bg;\n }\n\n if (style?.bold !== undefined) {\n next.bold = style.bold;\n }\n\n if (style?.dim !== undefined) {\n next.dim = style.dim;\n }\n\n return next;\n}\n\nfunction normalizeSize(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction cellsEqual(left: Cell, right: Cell): boolean {\n return left.ch === right.ch\n && left.style.fg === right.style.fg\n && left.style.bg === right.style.bg\n && left.style.bold === right.style.bold\n && left.style.dim === right.style.dim;\n}\n\nfunction applyForegroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.hex(color);\n }\n\n const painter = (instance as unknown as Record<string, unknown>)[color];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n\nfunction applyBackgroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.bgHex(color);\n }\n\n const methodName = color.startsWith(\"bg\")\n ? color\n : `bg${color.charAt(0).toUpperCase()}${color.slice(1)}`;\n const painter = (instance as unknown as Record<string, unknown>)[methodName];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import chalk from \"chalk\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nexport { isCancel } from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2514\")} ${chalk.red(msg)}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { text } from \"../../components/text.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${text.intro(title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nfunction getVisibleWidth(value: string): number {\n return stripAnsi(value).length;\n}\n\nfunction renderTerminalNote(message: string, title?: string): string {\n const contentLines = [\"\", ...message.split(\"\\n\"), \"\"];\n const visibleTitle = stripAnsi(title ?? \"\");\n const contentWidth = Math.max(\n visibleTitle.length,\n ...contentLines.map((line) => getVisibleWidth(line))\n ) + 2;\n const titleLine = `${chalk.green(\"\u25C7\")} ${chalk.reset(title ?? \"\")} ${chalk.gray(\n `${\"\u2500\".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`\n )}`;\n const content = contentLines.map((line) => {\n const padding = \" \".repeat(contentWidth - getVisibleWidth(line));\n return `${chalk.gray(\"\u2502\")} ${line}${padding}${chalk.gray(\"\u2502\")}`;\n });\n const bottom = chalk.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [chalk.gray(\"\u2502\"), titleLine, ...content, bottom].join(\"\\n\");\n}\n\nexport function note(message: string, title?: string): void {\n const format = resolveOutputFormat();\n const strippedMessage = stripAnsi(message);\n const strippedTitle = stripAnsi(title ?? \"\");\n\n if (format === \"markdown\") {\n const lines = strippedMessage.split(\"\\n\");\n const heading = strippedTitle ? `> **${strippedTitle}**\\n` : \"\";\n const body = lines.map((line) => `> ${line}`).join(\"\\n\");\n process.stdout.write(`${heading}${body}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({\n type: \"note\",\n title: strippedTitle,\n message: strippedMessage\n })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${renderTerminalNote(message, title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function outro(message: string): void {\n const format = resolveOutputFormat();\n const stripped = stripAnsi(message);\n\n if (format === \"markdown\") {\n process.stdout.write(`---\\n${stripped}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"outro\", message: stripped })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2502\")}\\n${chalk.gray(\"\u2514\")} ${message}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\nimport { SPINNER_FRAMES } from \"../../static/spinner.js\";\n\nexport interface SpinnerOptions {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n}\n\nfunction writeTerminalFrame(frame: string, message: string): void {\n process.stdout.write(`\\r\\x1b[K${frame} ${message}`);\n}\n\nexport function spinner(): SpinnerOptions {\n let currentMessage = \"\";\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n let fallback = false;\n\n const format = resolveOutputFormat();\n\n const renderFrame = (): void => {\n writeTerminalFrame(SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length], currentMessage);\n };\n\n const clearTimer = (): void => {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n };\n\n return {\n start(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}...\\n`);\n return;\n }\n\n fallback = process.env.POE_NO_SPINNER === \"1\" || !process.stdout.isTTY;\n if (fallback) {\n process.stdout.write(`${currentMessage}\\n`);\n return;\n }\n\n frameIndex = 0;\n renderFrame();\n timer = setInterval(() => {\n frameIndex += 1;\n renderFrame();\n }, 16);\n },\n\n message(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format !== \"terminal\" || fallback || !timer) {\n return;\n }\n\n renderFrame();\n },\n\n stop(message = currentMessage, code?: number): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"spinner\", state: \"stopped\", message: currentMessage })}\\n`\n );\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}\\n`);\n return;\n }\n\n clearTimer();\n\n const symbol = code === undefined || code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n\n if (fallback) {\n process.stdout.write(`${symbol} ${currentMessage}\\n`);\n return;\n }\n\n process.stdout.write(`\\r\\x1b[K${symbol} ${currentMessage}\\n`);\n }\n };\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? chalk.green(\"\u25C6\") : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const format = resolveOutputFormat();\n const selectedIndex = opts.selectedIndex ?? 0;\n\n if (format === \"markdown\") {\n return [\n `**${opts.message}**`,\n ...opts.options.map(\n (option, index) => `- [${index === selectedIndex ? \"x\" : \" \"}] ${option.label}`\n )\n ].join(\"\\n\");\n }\n\n if (format === \"json\") {\n return JSON.stringify({\n type: \"menu\",\n message: opts.message,\n options: opts.options,\n selected: selectedIndex\n });\n }\n\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"@poe-code/design-system\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { UserError } from \"./user-error.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 { mode: infer TMode extends HumanInLoopMode }\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(path: string, contents: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n> {\n name: string;\n description?: string;\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n> {\n kind: \"command\";\n name: string;\n description?: string;\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined,\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined,\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput,\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput,\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n 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>(requires: Requires<TContext> | undefined): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check,\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneStringRecord(values: Record<string, string> | undefined): 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(rename: Record<string, string> | undefined): 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(`Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`);\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 = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/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(parent: Requires<any> | undefined, child: Requires<any> | undefined): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check),\n };\n\n if (\n merged.auth === undefined &&\n merged.apiVersion === undefined &&\n merged.check === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n throw new UserError(`Error: Missing required secret ${secret.env}${details}`);\n }\n\n secrets[name] = value;\n }\n\n return secrets;\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child,\n });\n}\n\nfunction resolveCommandScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n 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 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>(config: GroupConfig<TServices>): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n 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 (command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig })[\n commandConfigSymbol\n ];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(group: Group<TServices>): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n 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 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) => materializeNode(child, mergedInherited));\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new UserError(`Default command \"${internal.default.name}\" must be listed in children.`);\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new UserError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: 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<CommandConfig<TServices, TParamsSchema, TSecrets, TResult>, \"name\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>> {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined,\n }) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>>;\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<TServices, TName, TChildren, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>> {\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<TServices, TName, TChildren, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>>;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport { S, toJsonSchema } from \"toolcraft-schema\";\nexport { ApprovalDeclinedError, UserError };\nexport type { AnySchema, ArraySchema, BooleanSchema, EnumSchema, JsonSchema, NumberSchema, ObjectSchema, OptionalSchema, Static, StringSchema } from \"toolcraft-schema\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\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 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}\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\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", "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(branches: Record<string, ObjectSchema<any>>): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\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);\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 getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n const requiredKeys = Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n\n return JSON.stringify(requiredKeys);\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 const fingerprints = new Set<string>();\n\n for (const branch of branches) {\n const fingerprint = getRequiredKeyFingerprint(branch);\n\n if (fingerprints.has(fingerprint)) {\n throw new Error(\"Union schema branches must have unique required-key fingerprints\");\n }\n\n fingerprints.add(fingerprint);\n }\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 { Json } from \"./json.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.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 SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> = TSchema extends OptionalSchema<infer TInner>\n ? Static<TInner>\n : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n description?: string;\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n};\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly description?: string;\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | 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>>\n extends SchemaBase<\"enum\", TValues[number]> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema>\n extends SchemaBase<\"optional\", Static<TInner> | undefined> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>\n | 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 SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties = schema.additionalProperties;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\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(options: SchemaOptions<string> & StringMetadata = {}): StringSchema {\n return {\n kind: \"string\",\n ...options,\n };\n },\n\n Number(\n options: SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } = {}\n ): NumberSchema {\n return {\n kind: \"number\",\n ...options,\n };\n },\n\n Boolean(options: SchemaOptions<boolean> = {}): BooleanSchema {\n return {\n kind: \"boolean\",\n ...options,\n };\n },\n\n Enum<const TValues extends NonEmptyReadonlyArray<EnumValue>>(\n values: TValues,\n options: SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = {}\n ): EnumSchema<TValues> {\n assertValidEnumValues(values);\n\n return {\n kind: \"enum\",\n values,\n ...options,\n };\n },\n\n Array<TItem extends AnySchema>(\n item: TItem,\n options: SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = {}\n ): ArraySchema<TItem> {\n return {\n kind: \"array\",\n item,\n ...options,\n };\n },\n\n Object<const TShape extends ObjectShape>(\n shape: TShape,\n options: SchemaOptions<InferObject<TShape>> & ObjectMetadata = {}\n ): ObjectSchema<TShape> {\n return {\n kind: \"object\",\n shape,\n ...options,\n };\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner,\n };\n },\n\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 properties[key] = toJsonSchema(propertySchema);\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required,\n });\n }\n\n 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 { Json, OneOf, RecordBuilder as Record, Union };\nexport type { JsonValue, JsonValueSchema, OneOfSchema, RecordSchema, UnionSchema };\n", "import * as fsPromises from \"node:fs/promises\";\nimport { markdownDirBackend } from \"./backends/markdown-dir.js\";\nimport { yamlFileBackend } from \"./backends/yaml-file.js\";\nimport { validateMachine } from \"./state-machine.js\";\nimport { resolveStateMachine } from \"./state.js\";\nimport type {\n BackendFactory,\n BackendDeps,\n OpenTaskListOptions,\n TaskList,\n TaskListFs\n} from \"./types.js\";\n\nconst DEFAULT_LOCK_STALE_MS = 30_000;\nconst DEFAULT_LOCK_RETRIES = 20;\n\nexport const backendFactories: Record<OpenTaskListOptions[\"type\"], BackendFactory> = {\n \"markdown-dir\": markdownDirBackend,\n \"yaml-file\": yamlFileBackend\n};\n\nfunction createDefaultFs(): TaskListFs {\n return fsPromises as unknown as TaskListFs;\n}\n\nexport async function openTaskList(options: OpenTaskListOptions): Promise<TaskList> {\n const factory = (backendFactories as Record<string, BackendFactory | undefined>)[options.type];\n\n if (factory === undefined) {\n throw new Error(`Unknown task list backend type \"${options.type}\".`);\n }\n\n const stateMachine = resolveStateMachine(options.stateMachine);\n validateMachine(stateMachine);\n\n const deps: BackendDeps = {\n path: options.path,\n defaults: {\n metadata: { ...(options.defaults?.metadata ?? {}) }\n },\n lockStaleMs: options.lockStaleMs ?? DEFAULT_LOCK_STALE_MS,\n lockRetries: options.lockRetries ?? DEFAULT_LOCK_RETRIES,\n create: options.create ?? false,\n fs: options.fs ?? createDefaultFs(),\n stateMachine\n };\n\n return factory(deps);\n}\n", "import path from \"node:path\";\nimport { acquireFileLock } from \"@poe-code/file-lock\";\nimport { parseDocument, stringify } from \"yaml\";\nimport taskSchema from \"../schema/task.schema.json\" with { type: \"json\" };\nimport { eventsFromState, findEvent } from \"../state-machine.js\";\nimport { resolveStateMachine } from \"../state.js\";\nimport {\n InvalidTransitionError,\n MalformedTaskError,\n TaskAlreadyExistsError,\n TaskNotFoundError,\n type BackendDeps,\n type ListFilter,\n type Task,\n type TaskCreate,\n type TaskFireOptions,\n type TaskList,\n type TaskListFs,\n type Tasks,\n type TaskUpdate\n} from \"../types.js\";\nimport {\n hasErrorCode,\n isRecord,\n sortStrings,\n sortTasks,\n statIfExists,\n validateTaskId,\n writeAtomically\n} from \"./utils.js\";\n\nconst ARCHIVE_DIRECTORY_NAME = \"archive\";\nconst MARKDOWN_EXTENSION = \".md\";\nconst TASK_KIND = \"task\";\nconst TASK_VERSION = 1;\nconst TASK_SCHEMA_ID = taskSchema.$id;\nconst RESERVED_FRONTMATTER_KEYS = new Set([\n \"$schema\",\n \"description\",\n \"kind\",\n \"name\",\n \"state\",\n \"version\"\n]);\n\ntype TaskRecord = Record<string, unknown>;\n\ntype TaskFile = {\n task: Task;\n frontmatter: TaskRecord;\n path: string;\n};\n\ntype TaskLocation = {\n archived: boolean;\n path: string;\n};\n\nfunction validateListName(name: string): string {\n if (\n name.length === 0 ||\n name === ARCHIVE_DIRECTORY_NAME ||\n name.startsWith(\".\") ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"..\")\n ) {\n throw new Error(`Invalid task list name \"${name}\".`);\n }\n\n return name;\n}\n\nfunction parseQualifiedId(qualifiedId: string): {\n id: string;\n list: string;\n} {\n const separatorIndex = qualifiedId.indexOf(\"/\");\n\n if (\n separatorIndex <= 0 ||\n separatorIndex !== qualifiedId.lastIndexOf(\"/\") ||\n separatorIndex === qualifiedId.length - 1\n ) {\n throw new Error(`Invalid qualified task id \"${qualifiedId}\".`);\n }\n\n return {\n list: validateListName(qualifiedId.slice(0, separatorIndex)),\n id: validateTaskId(qualifiedId.slice(separatorIndex + 1))\n };\n}\n\nfunction listPath(rootPath: string, list: string): string {\n return path.join(rootPath, list);\n}\n\nfunction archiveDirectoryPath(rootPath: string, list: string): string {\n return path.join(listPath(rootPath, list), ARCHIVE_DIRECTORY_NAME);\n}\n\nfunction activeTaskPath(rootPath: string, list: string, id: string): string {\n return path.join(listPath(rootPath, list), `${id}${MARKDOWN_EXTENSION}`);\n}\n\nfunction archivedTaskPath(rootPath: string, list: string, id: string): string {\n return path.join(archiveDirectoryPath(rootPath, list), `${id}${MARKDOWN_EXTENSION}`);\n}\n\nfunction isMarkdownFile(entryName: string): boolean {\n return entryName.endsWith(MARKDOWN_EXTENSION);\n}\n\nfunction isHiddenEntry(entryName: string): boolean {\n return entryName.startsWith(\".\");\n}\n\nfunction isLockFile(entryName: string): boolean {\n return entryName.endsWith(\".lock\");\n}\n\nfunction malformedTask(filePath: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task \"${filePath}\": invalid \"${field}\".`);\n}\n\nfunction stripTrailingCarriageReturn(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nfunction splitTaskDocument(content: string, filePath: string): {\n body: string;\n frontmatter: string;\n} {\n const lines = content.split(\"\\n\");\n\n if (lines.length === 0 || stripTrailingCarriageReturn(lines[0]) !== \"---\") {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n let closingIndex = -1;\n for (let index = 1; index < lines.length; index += 1) {\n if (stripTrailingCarriageReturn(lines[index]) === \"---\") {\n closingIndex = index;\n break;\n }\n }\n\n if (closingIndex === -1) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n const bodyLines = lines.slice(closingIndex + 1);\n if (bodyLines.length > 0 && stripTrailingCarriageReturn(bodyLines[0]) === \"\") {\n bodyLines.shift();\n }\n\n return {\n frontmatter: lines.slice(1, closingIndex).join(\"\\n\"),\n body: bodyLines.join(\"\\n\")\n };\n}\n\nfunction readFrontmatter(frontmatterContent: string, filePath: string): TaskRecord {\n const document = parseDocument(frontmatterContent);\n\n if (document.errors.length > 0) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n const parsed = document.toJS();\n if (!isRecord(parsed)) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n return parsed;\n}\n\nfunction assertValidTaskRecord(\n frontmatter: TaskRecord,\n filePath: string,\n validStates: ReadonlySet<string>\n): void {\n if (\"$schema\" in frontmatter && frontmatter.$schema !== TASK_SCHEMA_ID) {\n throw malformedTask(filePath, \"$schema\");\n }\n\n if (\"kind\" in frontmatter && frontmatter.kind !== TASK_KIND) {\n throw malformedTask(filePath, \"kind\");\n }\n\n if (\"version\" in frontmatter) {\n if (\n typeof frontmatter.version !== \"number\" ||\n !Number.isInteger(frontmatter.version) ||\n frontmatter.version !== TASK_VERSION\n ) {\n throw malformedTask(filePath, \"version\");\n }\n }\n\n if (typeof frontmatter.name !== \"string\" || frontmatter.name.length === 0) {\n throw malformedTask(filePath, \"name\");\n }\n\n if (typeof frontmatter.state !== \"string\" || !validStates.has(frontmatter.state)) {\n throw malformedTask(filePath, \"state\");\n }\n\n if (\"description\" in frontmatter && typeof frontmatter.description !== \"string\") {\n throw malformedTask(filePath, \"description\");\n }\n}\n\nfunction metadataFromFrontmatter(frontmatter: TaskRecord): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n metadata[key] = value;\n }\n }\n\n return metadata;\n}\n\nfunction createTask(list: string, id: string, frontmatter: TaskRecord, body: string): Task {\n return {\n list,\n id,\n qualifiedId: `${list}/${id}`,\n name: frontmatter.name as string,\n state: frontmatter.state as string,\n description: body,\n metadata: metadataFromFrontmatter(frontmatter)\n };\n}\n\nfunction serializeTaskDocument(frontmatter: TaskRecord, description: string): string {\n return `---\\n${stringify(frontmatter)}---\\n\\n${description}`;\n}\n\nasync function readDirectoryNames(fs: TaskListFs, directoryPath: string): Promise<string[]> {\n try {\n return sortStrings(await fs.readdir(directoryPath));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return [];\n }\n\n throw error;\n }\n}\n\nasync function ensureRootPath(deps: BackendDeps): Promise<void> {\n if (deps.create) {\n await deps.fs.mkdir(deps.path, { recursive: true });\n return;\n }\n\n await deps.fs.stat(deps.path);\n}\n\nasync function readTaskFile(\n fs: TaskListFs,\n list: string,\n id: string,\n filePath: string,\n validStates: ReadonlySet<string>\n): Promise<TaskFile> {\n const content = await fs.readFile(filePath, \"utf8\");\n const document = splitTaskDocument(content, filePath);\n const frontmatter = readFrontmatter(document.frontmatter, filePath);\n\n assertValidTaskRecord(frontmatter, filePath, validStates);\n\n return {\n path: filePath,\n frontmatter,\n task: createTask(list, id, frontmatter, document.body)\n };\n}\n\nasync function findTaskLocation(\n fs: TaskListFs,\n rootPath: string,\n list: string,\n id: string\n): Promise<TaskLocation | undefined> {\n const activePath = activeTaskPath(rootPath, list, id);\n const activeStat = await statIfExists(fs, activePath);\n\n if (activeStat?.isFile()) {\n return {\n archived: false,\n path: activePath\n };\n }\n\n const archivedPath = archivedTaskPath(rootPath, list, id);\n const archivedStat = await statIfExists(fs, archivedPath);\n\n if (archivedStat?.isFile()) {\n return {\n archived: true,\n path: archivedPath\n };\n }\n\n return undefined;\n}\n\nasync function readTaskAtLocation(\n fs: TaskListFs,\n rootPath: string,\n list: string,\n id: string,\n validStates: ReadonlySet<string>\n): Promise<TaskFile> {\n const location = await findTaskLocation(fs, rootPath, list, id);\n\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return readTaskFile(fs, list, id, location.path, validStates);\n}\n\nfunction createdFrontmatter(\n defaults: BackendDeps[\"defaults\"],\n input: TaskCreate,\n initialState: string\n): TaskRecord {\n const frontmatter: TaskRecord = {\n $schema: TASK_SCHEMA_ID,\n kind: TASK_KIND,\n version: TASK_VERSION,\n name: input.name,\n state: initialState\n };\n\n for (const [key, value] of Object.entries(defaults.metadata)) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n frontmatter[key] = value;\n }\n }\n\n for (const [key, value] of Object.entries(input.metadata ?? {})) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n frontmatter[key] = value;\n }\n }\n\n return frontmatter;\n}\n\nfunction updatedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n patch: TaskUpdate\n): TaskRecord {\n const nextFrontmatter: TaskRecord = {\n ...existingFrontmatter,\n $schema: existingFrontmatter.$schema ?? TASK_SCHEMA_ID,\n kind: existingFrontmatter.kind ?? TASK_KIND,\n version: existingFrontmatter.version ?? TASK_VERSION,\n name: patch.name ?? task.name,\n state: task.state\n };\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n nextFrontmatter[key] = value;\n }\n }\n\n return nextFrontmatter;\n}\n\nfunction transitionedFrontmatter(existingFrontmatter: TaskRecord, task: Task, to: string): TaskRecord {\n return {\n ...existingFrontmatter,\n $schema: existingFrontmatter.$schema ?? TASK_SCHEMA_ID,\n kind: existingFrontmatter.kind ?? TASK_KIND,\n version: existingFrontmatter.version ?? TASK_VERSION,\n name: task.name,\n state: to\n };\n}\n\nfunction firedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n to: string,\n metadataPatch?: Record<string, unknown>\n): TaskRecord {\n const nextFrontmatter = transitionedFrontmatter(existingFrontmatter, task, to);\n\n for (const [key, value] of Object.entries(metadataPatch ?? {})) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n nextFrontmatter[key] = value;\n }\n }\n\n return nextFrontmatter;\n}\n\nfunction assertCreateDoesNotSetState(input: TaskCreate): void {\n if (Object.prototype.hasOwnProperty.call(input, \"state\")) {\n throw new Error(\n 'Tasks.create() does not accept \"state\"; new tasks always start at stateMachine.initial.'\n );\n }\n}\n\nfunction assertUpdateDoesNotSetState(patch: TaskUpdate): void {\n if (Object.prototype.hasOwnProperty.call(patch, \"state\")) {\n throw new Error('Tasks.update() does not accept \"state\"; use fire() to change task state.');\n }\n}\n\nfunction createTasksView(deps: BackendDeps, list: string): Tasks {\n const listDirectoryPath = listPath(deps.path, list);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n async function listFiles(directoryPath: string): Promise<Task[]> {\n const entries = await readDirectoryNames(deps.fs, directoryPath);\n const tasks: Task[] = [];\n\n for (const entryName of entries) {\n if (isHiddenEntry(entryName) || isLockFile(entryName) || !isMarkdownFile(entryName)) {\n continue;\n }\n\n const entryPath = path.join(directoryPath, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (!entryStat?.isFile()) {\n continue;\n }\n\n const id = entryName.slice(0, -MARKDOWN_EXTENSION.length);\n tasks.push((await readTaskFile(deps.fs, list, id, entryPath, validStates)).task);\n }\n\n return sortTasks(tasks);\n }\n\n async function withTaskLock<T>(id: string, action: () => Promise<T>): Promise<T> {\n validateTaskId(id);\n const release = await acquireFileLock(activeTaskPath(deps.path, list, id), {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n }\n\n async function getTaskFile(id: string): Promise<TaskFile> {\n validateTaskId(id);\n return readTaskAtLocation(deps.fs, deps.path, list, id, validStates);\n }\n\n function assertFireableTaskEvent(task: Task, eventName: string) {\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: stateMachine.events[eventName]?.to,\n reason: `Cannot fire event \"${eventName}\" from task state \"${task.state}\".`\n });\n }\n\n return event;\n }\n\n return {\n name: list,\n stateMachine,\n async all(filter?: ListFilter): Promise<Task[]> {\n const activeTasks = await listFiles(listDirectoryPath);\n const archivedTasks = filter?.includeArchived\n ? await listFiles(archiveDirectoryPath(deps.path, list))\n : [];\n const combinedTasks = [...activeTasks, ...archivedTasks];\n\n if (filter?.state) {\n return combinedTasks.filter((task) => task.state === filter.state);\n }\n\n return combinedTasks;\n },\n async get(id: string): Promise<Task> {\n return (await getTaskFile(id)).task;\n },\n async create(input: TaskCreate): Promise<Task> {\n assertCreateDoesNotSetState(input);\n validateTaskId(input.id);\n await deps.fs.mkdir(listDirectoryPath, { recursive: true });\n\n return withTaskLock(input.id, async () => {\n const existing = await findTaskLocation(deps.fs, deps.path, list, input.id);\n if (existing) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${input.id}\" already exists.`);\n }\n\n const targetPath = activeTaskPath(deps.path, list, input.id);\n const frontmatter = createdFrontmatter(deps.defaults, input, stateMachine.initial);\n const description = input.description ?? \"\";\n\n await writeAtomically(deps.fs, targetPath, serializeTaskDocument(frontmatter, description));\n\n return createTask(list,input.id, frontmatter, description);\n });\n },\n async update(id: string, patch: TaskUpdate): Promise<Task> {\n assertUpdateDoesNotSetState(patch);\n\n return withTaskLock(id, async () => {\n const existing = await getTaskFile(id);\n const nextFrontmatter = updatedFrontmatter(existing.frontmatter, existing.task, patch);\n const description = patch.description ?? existing.task.description;\n\n await writeAtomically(deps.fs, existing.path, serializeTaskDocument(nextFrontmatter, description));\n\n return createTask(list,id, nextFrontmatter, description);\n });\n },\n async fire(id: string, eventName: string, opts?: TaskFireOptions): Promise<Task> {\n return withTaskLock(id, async () => {\n const existing = await getTaskFile(id);\n const event = assertFireableTaskEvent(existing.task, eventName);\n const guardResult = event.guard?.(existing.task) ?? true;\n\n if (guardResult !== true) {\n throw new InvalidTransitionError({\n task: existing.task,\n event: eventName,\n to: event.to,\n reason: guardResult\n });\n }\n\n await event.onExit?.(existing.task);\n\n const nextFrontmatter = firedFrontmatter(\n existing.frontmatter,\n existing.task,\n event.to,\n opts?.metadataPatch\n );\n const nextTask = createTask(list,id, nextFrontmatter, existing.task.description);\n const serializedTask = serializeTaskDocument(nextFrontmatter, existing.task.description);\n\n if (event.to === \"archived\") {\n const targetPath = archivedTaskPath(deps.path, list, id);\n const archivedTargetExists = await statIfExists(deps.fs, targetPath);\n if (archivedTargetExists?.isFile()) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${id}\" already exists in archive.`);\n }\n\n await writeAtomically(deps.fs, existing.path, serializedTask);\n await deps.fs.mkdir(archiveDirectoryPath(deps.path, list), { recursive: true });\n await deps.fs.rename(existing.path, targetPath);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n }\n\n await writeAtomically(deps.fs, existing.path, serializedTask);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n });\n },\n async canFire(id: string, eventName: string): Promise<boolean> {\n const task = (await getTaskFile(id)).task;\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n return false;\n }\n\n return (event.guard?.(task) ?? true) === true;\n },\n async events(id: string): Promise<readonly string[]> {\n const task = (await getTaskFile(id)).task;\n return eventsFromState(stateMachine, task.state);\n },\n async delete(id: string): Promise<void> {\n await withTaskLock(id, async () => {\n const location = await findTaskLocation(deps.fs, deps.path, list, id);\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n await deps.fs.unlink(location.path);\n });\n }\n };\n}\n\nexport async function markdownDirBackend(deps: BackendDeps): Promise<TaskList> {\n await ensureRootPath(deps);\n\n const list = (name: string): Tasks => {\n const listName = validateListName(name);\n return createTasksView(deps, listName);\n };\n\n const lists = async (): Promise<string[]> => {\n const entries = await readDirectoryNames(deps.fs, deps.path);\n const result: string[] = [];\n\n for (const entryName of entries) {\n if (\n entryName === ARCHIVE_DIRECTORY_NAME ||\n isHiddenEntry(entryName) ||\n isLockFile(entryName)\n ) {\n continue;\n }\n\n const entryPath = path.join(deps.path, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (entryStat?.isDirectory()) {\n result.push(entryName);\n }\n }\n\n return sortStrings(result);\n };\n\n const allTasks = async (filter?: ListFilter): Promise<Task[]> => {\n const allLists = await lists();\n const tasks: Task[] = [];\n\n for (const taskListName of allLists) {\n tasks.push(...(await list(taskListName).all(filter)));\n }\n\n return sortTasks(tasks);\n };\n\n const get = async (qualifiedId: string): Promise<Task> => {\n const { list: listName, id } = parseQualifiedId(qualifiedId);\n return list(listName).get(id);\n };\n\n return {\n list,\n lists,\n allTasks,\n get\n };\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\n\nexport interface FileLockFs {\n open(path: string, flags: string): Promise<{\n close(): Promise<void>;\n writeFile(\n data: string,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n }>;\n stat(path: string): Promise<{\n mtimeMs: number;\n }>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface FileLockOptions {\n staleMs?: number;\n retries?: number;\n minTimeout?: number;\n maxTimeout?: number;\n fs?: FileLockFs;\n signal?: AbortSignal;\n}\n\nexport type ReleaseLock = () => Promise<void>;\n\nexport class LockTimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LockTimeoutError\";\n }\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n if (signal.aborted) {\n return Promise.reject(createAbortError());\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timeoutId);\n signal.removeEventListener(\"abort\", onAbort);\n reject(createAbortError());\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction backoff(attempt: number, minTimeout: number, maxTimeout: number): number {\n const delay = Math.min(maxTimeout, minTimeout * 2 ** attempt);\n return delay + Math.random() * delay * 0.1;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction createDefaultFs(): FileLockFs {\n return {\n open: (path, flags) => fsPromises.open(path, flags),\n stat: fsPromises.stat,\n unlink: fsPromises.unlink\n };\n}\n\nasync function removeLockFile(fs: FileLockFs, lockPath: string): Promise<void> {\n try {\n await fs.unlink(lockPath);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n}\n\nasync function writeLockMetadata(handle: Awaited<ReturnType<FileLockFs[\"open\"]>>): Promise<void> {\n try {\n await handle.writeFile(\n JSON.stringify({ pid: process.pid, host: os.hostname(), acquiredAt: new Date().toISOString() }),\n { encoding: \"utf8\" }\n );\n } catch (ignoredError) {\n void ignoredError;\n }\n try {\n await handle.close();\n } catch (ignoredError) {\n void ignoredError;\n }\n}\n\nexport async function acquireFileLock(\n filePath: string,\n options: FileLockOptions = {}\n): Promise<ReleaseLock> {\n const fs = options.fs ?? createDefaultFs();\n const retries = options.retries ?? 20;\n const minTimeout = options.minTimeout ?? 25;\n const maxTimeout = options.maxTimeout ?? 250;\n const staleMs = options.staleMs ?? 30_000;\n const lockPath = `${filePath}.lock`;\n\n let attempt = 0;\n\n while (attempt <= retries) {\n throwIfAborted(options.signal);\n\n try {\n const handle = await fs.open(lockPath, \"wx\");\n await writeLockMetadata(handle);\n let released = false;\n\n return async () => {\n if (released) {\n return;\n }\n\n released = true;\n await removeLockFile(fs, lockPath);\n };\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n\n let stat: Awaited<ReturnType<FileLockFs[\"stat\"]>>;\n try {\n stat = await fs.stat(lockPath);\n } catch (statError) {\n if (hasErrorCode(statError, \"ENOENT\")) {\n continue;\n }\n\n throw statError;\n }\n\n if (Date.now() - stat.mtimeMs > staleMs) {\n await removeLockFile(fs, lockPath);\n continue;\n }\n\n if (attempt >= retries) {\n break;\n }\n\n await sleep(backoff(attempt, minTimeout, maxTimeout), options.signal);\n attempt += 1;\n }\n\n throw new LockTimeoutError(`Failed to acquire lock on \"${filePath}\".`);\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://poe-platform.github.io/poe-code/schemas/task-list/task.schema.json\",\n \"title\": \"Task\",\n \"description\": \"Persisted task payload used by task-list backends.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://poe-platform.github.io/poe-code/schemas/task-list/task.schema.json\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"const\": \"task\"\n },\n \"version\": {\n \"type\": \"integer\",\n \"const\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"name\", \"state\"],\n \"additionalProperties\": true\n}\n", "import type { Task } from \"./types.js\";\n\nexport interface StateMachineDef<TState extends string = string, TEvent extends string = string> {\n readonly initial: TState;\n readonly states: readonly TState[];\n readonly events: Readonly<Record<TEvent, EventDef<TState>>>;\n}\n\nexport interface EventDef<TState extends string = string> {\n readonly from: readonly TState[] | \"*\";\n readonly to: TState;\n readonly guard?: (task: Task) => true | string;\n readonly onEnter?: (task: Task) => void | Promise<void>;\n readonly onExit?: (task: Task) => void | Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStateList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction canFireFromState<TState extends string>(event: EventDef<TState>, fromState: string): boolean {\n if (event.from === \"*\") {\n return event.to !== fromState;\n }\n\n return event.from.includes(fromState as TState);\n}\n\nexport function validateMachine(machine: StateMachineDef): void {\n if (!isRecord(machine)) {\n throw new TypeError(\"State machine must be an object.\");\n }\n\n if (!isStateList(machine.states)) {\n throw new TypeError(\"State machine states must be a string array.\");\n }\n\n const states = new Set(machine.states);\n\n if (typeof machine.initial !== \"string\") {\n throw new TypeError(\"State machine initial must be a string.\");\n }\n\n if (!states.has(machine.initial)) {\n throw new Error(`Initial state \"${machine.initial}\" is not declared.`);\n }\n\n if (!isRecord(machine.events)) {\n throw new TypeError(\"State machine events must be an object.\");\n }\n\n for (const [eventName, event] of Object.entries(machine.events)) {\n if (!isRecord(event)) {\n throw new TypeError(`Event \"${eventName}\" must be an object.`);\n }\n\n if (event.from !== \"*\" && !isStateList(event.from)) {\n throw new TypeError(`Event \"${eventName}\" has an invalid \"from\" definition.`);\n }\n\n if (typeof event.to !== \"string\") {\n throw new TypeError(`Event \"${eventName}\" target state must be a string.`);\n }\n\n if (!states.has(event.to)) {\n throw new Error(`Event \"${eventName}\" references unknown target state \"${event.to}\".`);\n }\n\n if (event.from !== \"*\") {\n for (const fromState of event.from) {\n if (!states.has(fromState)) {\n throw new Error(`Event \"${eventName}\" references unknown source state \"${fromState}\".`);\n }\n }\n }\n }\n}\n\nexport function eventsFromState<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState\n): readonly TEvent[] {\n const events: TEvent[] = [];\n\n for (const [eventName, event] of Object.entries(machine.events) as Array<[TEvent, EventDef<TState>]>) {\n if (canFireFromState(event, fromState)) {\n events.push(eventName);\n }\n }\n\n return events;\n}\n\nexport function findEvent<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState,\n eventName: TEvent\n): EventDef<TState> | undefined {\n const event = machine.events[eventName];\n\n if (event === undefined) {\n return undefined;\n }\n\n return canFireFromState(event, fromState) ? event : undefined;\n}\n", "import type { StateMachineDef } from \"./state-machine.js\";\n\nexport type TaskState = \"draft\" | \"planned\" | \"in-progress\" | \"done\" | \"archived\";\n\nexport interface Task {\n list: string;\n id: string;\n qualifiedId: string;\n name: string;\n state: string;\n description: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskCreate {\n id: string;\n name: string;\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskUpdate {\n name?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n state?: never;\n}\n\nexport interface TaskFireOptions {\n metadataPatch?: Record<string, unknown>;\n}\n\nexport interface ListFilter {\n state?: string;\n includeArchived?: boolean;\n}\n\nexport interface Tasks {\n readonly name: string;\n readonly stateMachine: StateMachineDef;\n all(filter?: ListFilter): Promise<Task[]>;\n get(id: string): Promise<Task>;\n create(input: TaskCreate): Promise<Task>;\n update(id: string, patch: TaskUpdate): Promise<Task>;\n fire(id: string, event: string, opts?: TaskFireOptions): Promise<Task>;\n canFire(id: string, event: string): Promise<boolean>;\n events(id: string): Promise<readonly string[]>;\n delete(id: string): Promise<void>;\n}\n\nexport interface TaskList {\n list(name: string): Tasks;\n lists(): Promise<string[]>;\n allTasks(filter?: ListFilter): Promise<Task[]>;\n get(qualifiedId: string): Promise<Task>;\n}\n\nexport interface TaskDefaults {\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskListFs {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n open(path: string, flags: string): Promise<{\n close(): Promise<void>;\n writeFile(\n data: string | NodeJS.ArrayBufferView,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n }>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n readdir(path: string): Promise<string[]>;\n rename(fromPath: string, toPath: string): Promise<void>;\n stat(path: string): Promise<{\n isDirectory(): boolean;\n isFile(): boolean;\n mtimeMs: number;\n }>;\n unlink(path: string): Promise<void>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: BufferEncoding | { encoding?: BufferEncoding; flag?: string }\n ): Promise<void>;\n}\n\nexport interface OpenTaskListOptions {\n type: \"markdown-dir\" | \"yaml-file\";\n path: string;\n defaults?: TaskDefaults;\n create?: boolean;\n lockStaleMs?: number;\n lockRetries?: number;\n fs?: TaskListFs;\n stateMachine?: StateMachineDef;\n}\n\nexport interface BackendDeps {\n path: string;\n defaults: Required<TaskDefaults>;\n lockStaleMs: number;\n lockRetries: number;\n create: boolean;\n fs: TaskListFs;\n stateMachine?: StateMachineDef;\n}\n\nexport type BackendFactory = (deps: BackendDeps) => Promise<TaskList>;\n\nexport class TaskNotFoundError extends Error {\n constructor(message = \"Task not found.\") {\n super(message);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class TaskAlreadyExistsError extends Error {\n constructor(message = \"Task already exists.\") {\n super(message);\n this.name = \"TaskAlreadyExistsError\";\n }\n}\n\nexport class InvalidTransitionError extends Error {\n readonly task?: Task;\n readonly event?: string;\n readonly to?: string;\n readonly reason: string;\n\n constructor(\n messageOrOptions:\n | string\n | {\n task?: Task;\n event?: string;\n to?: string;\n reason: string;\n } = \"Invalid task transition.\"\n ) {\n const options =\n typeof messageOrOptions === \"string\"\n ? {\n reason: messageOrOptions\n }\n : messageOrOptions;\n\n super(options.reason);\n this.name = \"InvalidTransitionError\";\n this.task = options.task;\n this.event = options.event;\n this.to = options.to;\n this.reason = options.reason;\n }\n}\n\nexport class MalformedTaskError extends Error {\n constructor(message = \"Malformed task.\") {\n super(message);\n this.name = \"MalformedTaskError\";\n }\n}\n", "import {\n findEvent,\n type EventDef,\n type StateMachineDef\n} from \"./state-machine.js\";\nimport { InvalidTransitionError, type TaskState } from \"./types.js\";\n\nexport type TaskEvent = \"plan\" | \"start\" | \"complete\" | \"archive\";\n\nexport const defaultStateMachine = {\n initial: \"draft\",\n states: [\"draft\", \"planned\", \"in-progress\", \"done\", \"archived\"],\n events: {\n plan: { from: [\"draft\"], to: \"planned\" },\n start: { from: [\"planned\"], to: \"in-progress\" },\n complete: { from: [\"in-progress\"], to: \"done\" },\n archive: { from: \"*\", to: \"archived\" }\n }\n} as const satisfies StateMachineDef<TaskState, TaskEvent>;\n\nfunction deriveLegacyTransitions(\n machine: typeof defaultStateMachine\n): Readonly<Record<TaskState, ReadonlySet<TaskState>>> {\n const transitions = Object.fromEntries(\n machine.states.map((state) => [state, new Set<TaskState>()])\n ) as Record<TaskState, Set<TaskState>>;\n\n for (const fromState of machine.states) {\n for (const eventName of Object.keys(machine.events) as TaskEvent[]) {\n const event = findEvent(machine, fromState, eventName);\n\n if (event !== undefined) {\n transitions[fromState].add(event.to);\n }\n }\n }\n\n const terminalState = machine.events.archive.to;\n const activeStates = machine.states.filter((state) => state !== terminalState);\n\n for (let index = 1; index < activeStates.length; index += 1) {\n transitions[activeStates[index]].add(activeStates[index - 1]);\n }\n\n return transitions;\n}\n\nconst defaultTransitions = deriveLegacyTransitions(defaultStateMachine);\n\nexport function resolveStateMachine(\n stateMachine?: StateMachineDef\n): StateMachineDef {\n return stateMachine ?? defaultStateMachine;\n}\n\nexport function assertEvent<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState,\n eventName: TEvent\n): EventDef<TState> {\n const event = findEvent(machine, fromState, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError(\n `Cannot fire event \"${eventName}\" from task state \"${fromState}\".`\n );\n }\n\n return event;\n}\n\nfunction canTransition(\n machine: StateMachineDef,\n fromState: string,\n toState: string\n): boolean {\n if (Object.is(machine, defaultStateMachine)) {\n return defaultTransitions[fromState as TaskState]?.has(toState as TaskState) ?? false;\n }\n\n for (const eventName of Object.keys(machine.events)) {\n if (findEvent(machine, fromState, eventName)?.to === toState) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function assertTransition(from: TaskState, to: TaskState): void;\nexport function assertTransition<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n from: TState,\n to: TState\n): void;\nexport function assertTransition<TState extends string, TEvent extends string>(\n machineOrFrom: StateMachineDef<TState, TEvent> | TaskState,\n fromOrTo: TState | TaskState,\n maybeTo?: TState\n): void {\n const machine =\n maybeTo === undefined\n ? defaultStateMachine\n : (machineOrFrom as StateMachineDef<TState, TEvent>);\n const fromState = maybeTo === undefined ? (machineOrFrom as TaskState) : (fromOrTo as TState);\n const toState = maybeTo === undefined ? (fromOrTo as TaskState) : maybeTo;\n\n if (!canTransition(machine, fromState, toState)) {\n throw new InvalidTransitionError(\n `Cannot transition task from \"${fromState}\" to \"${toState}\".`\n );\n }\n}\n", "import path from \"node:path\";\nimport type { Task, TaskListFs } from \"../types.js\";\n\nlet tmpFileCounter = 0;\n\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function sortStrings(values: string[]): string[] {\n return [...values].sort((left, right) => left.localeCompare(right));\n}\n\nexport function sortTasks(tasks: Task[]): Task[] {\n return [...tasks].sort((left, right) => left.qualifiedId.localeCompare(right.qualifiedId));\n}\n\nexport function validateTaskId(id: string): string {\n if (\n id.length === 0 ||\n id.startsWith(\".\") ||\n id.includes(\"/\") ||\n id.includes(\"\\\\\") ||\n id.includes(\"..\")\n ) {\n throw new Error(`Invalid task id \"${id}\".`);\n }\n\n return id;\n}\n\nexport async function statIfExists(\n fs: TaskListFs,\n filePath: string\n): Promise<Awaited<ReturnType<TaskListFs[\"stat\"]>> | undefined> {\n try {\n return await fs.stat(filePath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nexport async function writeAtomically(fs: TaskListFs, filePath: string, content: string): Promise<void> {\n const tempPath = `${filePath}.tmp-${process.pid}-${tmpFileCounter}`;\n tmpFileCounter += 1;\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n try {\n await fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n await fs.rename(tempPath, filePath);\n } catch (error) {\n try {\n await fs.unlink(tempPath);\n } catch (unlinkError) {\n if (!hasErrorCode(unlinkError, \"ENOENT\")) {\n throw unlinkError;\n }\n }\n\n throw error;\n }\n}\n", "import { acquireFileLock } from \"@poe-code/file-lock\";\nimport { parseDocument } from \"yaml\";\nimport storeSchema from \"../schema/store.schema.json\" with { type: \"json\" };\nimport taskSchema from \"../schema/task.schema.json\" with { type: \"json\" };\nimport { eventsFromState, findEvent } from \"../state-machine.js\";\nimport { resolveStateMachine } from \"../state.js\";\nimport {\n InvalidTransitionError,\n MalformedTaskError,\n TaskAlreadyExistsError,\n TaskNotFoundError,\n type BackendDeps,\n type ListFilter,\n type Task,\n type TaskCreate,\n type TaskFireOptions,\n type TaskList,\n type TaskListFs,\n type Tasks,\n type TaskUpdate\n} from \"../types.js\";\nimport {\n isRecord,\n sortStrings,\n sortTasks,\n statIfExists,\n validateTaskId,\n writeAtomically\n} from \"./utils.js\";\n\nconst STORE_KIND = \"task-store\";\nconst STORE_SCHEMA_ID = storeSchema.$id;\nconst STORE_VERSION = 1;\nconst TASK_KIND = \"task\";\nconst TASK_SCHEMA_ID = taskSchema.$id;\nconst TASK_VERSION = 1;\nconst RESERVED_TASK_KEYS = new Set([\"$schema\", \"description\", \"kind\", \"name\", \"state\", \"version\"]);\n\ntype StoreRecord = Record<string, unknown>;\ntype TaskRecord = Record<string, unknown>;\n\nfunction malformedStore(filePath: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task store \"${filePath}\": invalid \"${field}\".`);\n}\n\nfunction malformedTask(list: string, id: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task \"${list}/${id}\": invalid \"${field}\".`);\n}\n\nfunction validateListName(name: string): string {\n if (\n name.length === 0 ||\n name.startsWith(\".\") ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"..\")\n ) {\n throw new Error(`Invalid task list name \"${name}\".`);\n }\n\n return name;\n}\n\nfunction parseQualifiedId(qualifiedId: string): {\n id: string;\n list: string;\n} {\n const separatorIndex = qualifiedId.indexOf(\"/\");\n\n if (\n separatorIndex <= 0 ||\n separatorIndex !== qualifiedId.lastIndexOf(\"/\") ||\n separatorIndex === qualifiedId.length - 1\n ) {\n throw new Error(`Invalid qualified task id \"${qualifiedId}\".`);\n }\n\n return {\n list: validateListName(qualifiedId.slice(0, separatorIndex)),\n id: validateTaskId(qualifiedId.slice(separatorIndex + 1))\n };\n}\n\nfunction descriptionFromTaskRecord(taskRecord: TaskRecord): string {\n return typeof taskRecord.description === \"string\" ? taskRecord.description : \"\";\n}\n\nfunction metadataFromTaskRecord(taskRecord: TaskRecord): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(taskRecord)) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n metadata[key] = value;\n }\n }\n\n return metadata;\n}\n\nfunction createTask(list: string, id: string, taskRecord: TaskRecord): Task {\n return {\n list,\n id,\n qualifiedId: `${list}/${id}`,\n name: taskRecord.name as string,\n state: taskRecord.state as string,\n description: descriptionFromTaskRecord(taskRecord),\n metadata: metadataFromTaskRecord(taskRecord)\n };\n}\n\nfunction matchesFilter(task: Task, filter?: ListFilter): boolean {\n if (!filter?.includeArchived && task.state === \"archived\") {\n return false;\n }\n\n if (filter?.state !== undefined && task.state !== filter.state) {\n return false;\n }\n\n return true;\n}\n\nfunction createTaskRecord(\n defaults: BackendDeps[\"defaults\"],\n input: TaskCreate,\n initialState: string\n): TaskRecord {\n const taskRecord: TaskRecord = {\n name: input.name,\n state: initialState,\n description: input.description ?? \"\"\n };\n\n for (const [key, value] of Object.entries(defaults.metadata)) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n taskRecord[key] = value;\n }\n }\n\n for (const [key, value] of Object.entries(input.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n taskRecord[key] = value;\n }\n }\n\n return taskRecord;\n}\n\nfunction assertCreateDoesNotSetState(input: TaskCreate): void {\n if (Object.prototype.hasOwnProperty.call(input, \"state\")) {\n throw new Error(\n 'Tasks.create() does not accept \"state\"; new tasks always start at stateMachine.initial.'\n );\n }\n}\n\nfunction assertUpdateDoesNotSetState(patch: TaskUpdate): void {\n if (Object.prototype.hasOwnProperty.call(patch, \"state\")) {\n throw new Error('Tasks.update() does not accept \"state\"; use fire() to change task state.');\n }\n}\n\nfunction buildUpdatedTaskRecord(existing: TaskRecord, patch: TaskUpdate): TaskRecord {\n const nextTaskRecord: TaskRecord = {\n ...existing,\n name: patch.name ?? existing.name,\n state: existing.state,\n description: patch.description ?? descriptionFromTaskRecord(existing)\n };\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n nextTaskRecord[key] = value;\n }\n }\n\n return nextTaskRecord;\n}\n\nfunction buildTransitionedTaskRecord(existing: TaskRecord, to: string): TaskRecord {\n return {\n ...existing,\n state: to,\n description: descriptionFromTaskRecord(existing)\n };\n}\n\nfunction buildFiredTaskRecord(\n existing: TaskRecord,\n to: string,\n metadataPatch?: Record<string, unknown>\n): TaskRecord {\n const nextTaskRecord = buildTransitionedTaskRecord(existing, to);\n\n for (const [key, value] of Object.entries(metadataPatch ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n nextTaskRecord[key] = value;\n }\n }\n\n return nextTaskRecord;\n}\n\nfunction parseStoreDocument(filePath: string, content: string) {\n let document;\n\n try {\n document = parseDocument(content, { keepSourceTokens: true, prettyErrors: false });\n } catch {\n throw malformedStore(filePath, \"yaml\");\n }\n\n if (document.errors.length > 0) {\n throw malformedStore(filePath, \"yaml\");\n }\n\n return document;\n}\n\nfunction assertValidStoreRecord(store: unknown, filePath: string): asserts store is StoreRecord {\n if (!isRecord(store)) {\n throw malformedStore(filePath, \"store\");\n }\n\n if (store.$schema !== STORE_SCHEMA_ID) {\n throw malformedStore(filePath, \"$schema\");\n }\n\n if (store.kind !== STORE_KIND) {\n throw malformedStore(filePath, \"kind\");\n }\n\n if (typeof store.version !== \"number\" || !Number.isInteger(store.version) || store.version !== STORE_VERSION) {\n throw malformedStore(filePath, \"version\");\n }\n\n if (!isRecord(store.lists)) {\n throw malformedStore(filePath, \"lists\");\n }\n}\n\nfunction assertValidTaskRecord(\n taskRecord: unknown,\n list: string,\n id: string,\n validStates: ReadonlySet<string>\n): asserts taskRecord is TaskRecord {\n if (!isRecord(taskRecord)) {\n throw malformedTask(list, id, \"task\");\n }\n\n if (\"$schema\" in taskRecord && taskRecord.$schema !== TASK_SCHEMA_ID) {\n throw malformedTask(list, id, \"$schema\");\n }\n\n if (\"kind\" in taskRecord && taskRecord.kind !== TASK_KIND) {\n throw malformedTask(list, id, \"kind\");\n }\n\n if (\"version\" in taskRecord) {\n if (\n typeof taskRecord.version !== \"number\" ||\n !Number.isInteger(taskRecord.version) ||\n taskRecord.version !== TASK_VERSION\n ) {\n throw malformedTask(list, id, \"version\");\n }\n }\n\n if (typeof taskRecord.name !== \"string\" || taskRecord.name.length === 0) {\n throw malformedTask(list, id, \"name\");\n }\n\n if (typeof taskRecord.state !== \"string\" || !validStates.has(taskRecord.state)) {\n throw malformedTask(list, id, \"state\");\n }\n\n if (\"description\" in taskRecord && typeof taskRecord.description !== \"string\") {\n throw malformedTask(list, id, \"description\");\n }\n}\n\nfunction validateStoreEntries(\n store: StoreRecord,\n filePath: string,\n validStates: ReadonlySet<string>\n): void {\n const lists = store.lists;\n\n if (!isRecord(lists)) {\n throw malformedStore(filePath, \"lists\");\n }\n\n for (const [list, listRecord] of Object.entries(lists)) {\n try {\n validateListName(list);\n } catch {\n throw malformedStore(filePath, `lists.${list}`);\n }\n\n if (!isRecord(listRecord)) {\n throw malformedStore(filePath, `lists.${list}`);\n }\n\n for (const [id, taskRecord] of Object.entries(listRecord)) {\n try {\n validateTaskId(id);\n } catch {\n throw malformedTask(list, id, \"id\");\n }\n\n assertValidTaskRecord(taskRecord, list, id, validStates);\n }\n }\n}\n\nfunction serializeDocument(document: { toString(): string }): string {\n const serialized = document.toString();\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nasync function readStore(\n fs: TaskListFs,\n filePath: string,\n validStates: ReadonlySet<string>\n): Promise<{\n document: ReturnType<typeof parseStoreDocument>;\n store: StoreRecord;\n}> {\n const content = await fs.readFile(filePath, \"utf8\");\n const document = parseStoreDocument(filePath, content);\n const store = document.toJS();\n\n assertValidStoreRecord(store, filePath);\n validateStoreEntries(store, filePath, validStates);\n\n return {\n document,\n store\n };\n}\n\nfunction getListsRecord(store: StoreRecord): Record<string, unknown> {\n return store.lists as Record<string, unknown>;\n}\n\nfunction getListRecord(store: StoreRecord, list: string): Record<string, unknown> | undefined {\n const listRecord = getListsRecord(store)[list];\n return isRecord(listRecord) ? listRecord : undefined;\n}\n\nfunction getTaskRecord(store: StoreRecord, list: string, id: string): TaskRecord | undefined {\n const listRecord = getListRecord(store, list);\n const taskRecord = listRecord?.[id];\n\n return isRecord(taskRecord) ? taskRecord : undefined;\n}\n\nfunction getTaskOrThrow(store: StoreRecord, list: string, id: string): TaskRecord {\n const taskRecord = getTaskRecord(store, list, id);\n\n if (!taskRecord) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return taskRecord;\n}\n\nasync function ensureStorePath(deps: BackendDeps): Promise<void> {\n if (!deps.create) {\n await deps.fs.stat(deps.path);\n return;\n }\n\n const existing = await statIfExists(deps.fs, deps.path);\n if (existing !== undefined) {\n return;\n }\n\n await writeAtomically(\n deps.fs,\n deps.path,\n serializeDocument(\n parseDocument(\n [\n `$schema: ${STORE_SCHEMA_ID}`,\n `kind: ${STORE_KIND}`,\n `version: ${STORE_VERSION}`,\n \"lists: {}\",\n \"\"\n ].join(\"\\n\")\n )\n )\n );\n}\n\nasync function withStoreLock<T>(deps: BackendDeps, action: () => Promise<T>): Promise<T> {\n const release = await acquireFileLock(deps.path, {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n}\n\nfunction createTasksView(deps: BackendDeps, list: string): Tasks {\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n async function readTasks(filter?: ListFilter): Promise<Task[]> {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const listRecord = getListRecord(store, list);\n\n if (!listRecord) {\n return [];\n }\n\n const tasks = Object.entries(listRecord).map(([id, taskRecord]) => createTask(list, id, taskRecord as TaskRecord));\n\n return sortTasks(tasks.filter((task) => matchesFilter(task, filter)));\n }\n\n function assertFireableTaskEvent(task: Task, eventName: string) {\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: stateMachine.events[eventName]?.to,\n reason: `Cannot fire event \"${eventName}\" from task state \"${task.state}\".`\n });\n }\n\n return event;\n }\n\n return {\n name: list,\n stateMachine,\n async all(filter?: ListFilter): Promise<Task[]> {\n return readTasks(filter);\n },\n async get(id: string): Promise<Task> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n return createTask(list, id, getTaskOrThrow(store, list, id));\n },\n async create(input: TaskCreate): Promise<Task> {\n assertCreateDoesNotSetState(input);\n validateTaskId(input.id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n if (getTaskRecord(store, list, input.id)) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${input.id}\" already exists.`);\n }\n\n const taskRecord = createTaskRecord(deps.defaults, input, stateMachine.initial);\n document.setIn([\"lists\", list, input.id], taskRecord);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, input.id, taskRecord);\n });\n },\n async update(id: string, patch: TaskUpdate): Promise<Task> {\n assertUpdateDoesNotSetState(patch);\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const existing = getTaskOrThrow(store, list, id);\n const nextTaskRecord = buildUpdatedTaskRecord(existing, patch);\n\n if (patch.name !== undefined) {\n document.setIn([\"lists\", list, id, \"name\"], patch.name);\n }\n\n if (patch.description !== undefined) {\n document.setIn([\"lists\", list, id, \"description\"], patch.description);\n }\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n document.setIn([\"lists\", list, id, key], value);\n }\n }\n\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, id, nextTaskRecord);\n });\n },\n async fire(id: string, eventName: string, opts?: TaskFireOptions): Promise<Task> {\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const existing = getTaskOrThrow(store, list, id);\n const task = createTask(list, id, existing);\n const event = assertFireableTaskEvent(task, eventName);\n const guardResult = event.guard?.(task) ?? true;\n\n if (guardResult !== true) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: event.to,\n reason: guardResult\n });\n }\n\n await event.onExit?.(task);\n\n const nextTaskRecord = buildFiredTaskRecord(existing, event.to, opts?.metadataPatch);\n document.setIn([\"lists\", list, id, \"state\"], event.to);\n\n for (const [key, value] of Object.entries(opts?.metadataPatch ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n document.setIn([\"lists\", list, id, key], value);\n }\n }\n\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n const nextTask = createTask(list, id, nextTaskRecord);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n });\n },\n async canFire(id: string, eventName: string): Promise<boolean> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const task = createTask(list, id, getTaskOrThrow(store, list, id));\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n return false;\n }\n\n return (event.guard?.(task) ?? true) === true;\n },\n async events(id: string): Promise<readonly string[]> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const task = createTask(list, id, getTaskOrThrow(store, list, id));\n\n return eventsFromState(stateMachine, task.state);\n },\n async delete(id: string): Promise<void> {\n validateTaskId(id);\n\n await withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n getTaskOrThrow(store, list, id);\n document.deleteIn([\"lists\", list, id]);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n });\n }\n };\n}\n\nexport async function yamlFileBackend(deps: BackendDeps): Promise<TaskList> {\n await ensureStorePath(deps);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n const list = (name: string): Tasks => {\n const listName = validateListName(name);\n return createTasksView({ ...deps, stateMachine }, listName);\n };\n\n const lists = async (): Promise<string[]> => {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n return sortStrings(Object.keys(getListsRecord(store)));\n };\n\n const allTasks = async (filter?: ListFilter): Promise<Task[]> => {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const tasks: Task[] = [];\n\n for (const [listName, listRecord] of Object.entries(getListsRecord(store))) {\n for (const [id, taskRecord] of Object.entries(listRecord as Record<string, unknown>)) {\n const task = createTask(listName, id, taskRecord as TaskRecord);\n if (matchesFilter(task, filter)) {\n tasks.push(task);\n }\n }\n }\n\n return sortTasks(tasks);\n };\n\n const get = async (qualifiedId: string): Promise<Task> => {\n const { list: listName, id } = parseQualifiedId(qualifiedId);\n return list(listName).get(id);\n };\n\n return {\n list,\n lists,\n allTasks,\n get\n };\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://poe-platform.github.io/poe-code/schemas/task-list/store.schema.json\",\n \"title\": \"Task Store\",\n \"description\": \"YAML multi-list task store.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://poe-platform.github.io/poe-code/schemas/task-list/store.schema.json\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"const\": \"task-store\"\n },\n \"version\": {\n \"type\": \"integer\",\n \"const\": 1\n },\n \"lists\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"./task.schema.json\"\n }\n }\n }\n },\n \"required\": [\"$schema\", \"kind\", \"version\", \"lists\"],\n \"additionalProperties\": false\n}\n", "import { TaskAlreadyExistsError, TaskNotFoundError, openTaskList } from \"@poe-code/task-list\";\nimport type { OpenTaskListOptions, StateMachineDef, Task, TaskList, Tasks } from \"@poe-code/task-list\";\nimport { randomBytes } from \"node:crypto\";\nimport { UserError } from \"../user-error.js\";\nimport { approvalStateMachine } from \"./state-machine.js\";\nimport type { HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./types.js\";\n\nconst DEFAULT_LIST_NAME = \"approvals\";\n\nconst openedTaskListsByRuntime = new WeakMap<HumanInLoopRuntimeOptions, Promise<TaskList>>();\nconst validatedListsByRuntime = new WeakMap<HumanInLoopRuntimeOptions, Set<string>>();\n\nexport interface ApprovalPayload {\n approvalId?: string;\n commandPath: string;\n params: Record<string, unknown>;\n message: string;\n declineInputPrompt?: string | null;\n enqueuedAt?: string;\n pid?: number | null;\n result?: unknown;\n error?: unknown;\n}\n\nexport async function ensureApprovalList(\n runtimeOptions: HumanInLoopRuntimeOptions | undefined,\n deps: {\n openTaskList?: (options: OpenTaskListOptions) => Promise<TaskList>;\n } = {},\n): Promise<{ taskList: TaskList; listName: string; tasks: Tasks }> {\n if (runtimeOptions?.taskList === undefined) {\n throw new UserError(\"humanInLoop.taskList required for async-mode commands\");\n }\n\n const listName = runtimeOptions.listName ?? DEFAULT_LIST_NAME;\n const taskList = await resolveTaskList(runtimeOptions, runtimeOptions.taskList, deps.openTaskList ?? openTaskList);\n const tasks = taskList.list(listName);\n\n if (!isListValidated(runtimeOptions, listName)) {\n if (!isApprovalStateMachine(tasks.stateMachine)) {\n throw new UserError(\n \"approvals task-list configured with a different state machine; pass approvalStateMachine when opening the list\"\n );\n }\n\n cacheValidatedList(runtimeOptions, listName);\n }\n\n return {\n taskList,\n listName,\n tasks,\n };\n}\n\nexport async function enqueueApproval(ctx: {\n tasks: Tasks;\n payload: ApprovalPayload;\n}): Promise<{ approvalId: string; pending: HumanInLoopPending }> {\n const enqueuedAt = new Date().toISOString();\n const approval = createApprovalRecord(ctx.payload, enqueuedAt);\n\n try {\n await createApprovalTask(ctx.tasks, approval);\n } catch (error) {\n if (!(error instanceof TaskAlreadyExistsError)) {\n throw error;\n }\n\n const retryApproval = createApprovalRecord(ctx.payload, enqueuedAt);\n await createApprovalTask(ctx.tasks, retryApproval);\n return retryApproval;\n }\n\n return approval;\n}\n\nexport async function loadApproval(ctx: {\n tasks: Tasks;\n approvalId: string;\n}): Promise<ApprovalPayload | undefined> {\n try {\n const task = await ctx.tasks.get(ctx.approvalId);\n return approvalPayloadFromTask(task);\n } catch (error) {\n if (error instanceof TaskNotFoundError) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nasync function resolveTaskList(\n runtimeOptions: HumanInLoopRuntimeOptions,\n taskList: NonNullable<HumanInLoopRuntimeOptions[\"taskList\"]>,\n openTaskListFn: (options: OpenTaskListOptions) => Promise<TaskList>,\n): Promise<TaskList> {\n if (!isTaskListConfig(taskList)) {\n return taskList;\n }\n\n const cachedTaskList = openedTaskListsByRuntime.get(runtimeOptions);\n\n if (cachedTaskList !== undefined) {\n return cachedTaskList;\n }\n\n const openedTaskList = openTaskListFn({\n create: true,\n type: taskList.format,\n path: taskList.dir,\n stateMachine: approvalStateMachine,\n });\n openedTaskListsByRuntime.set(runtimeOptions, openedTaskList);\n return openedTaskList;\n}\n\nfunction cacheValidatedList(runtimeOptions: HumanInLoopRuntimeOptions, listName: string): void {\n const validatedLists = validatedListsByRuntime.get(runtimeOptions);\n\n if (validatedLists === undefined) {\n validatedListsByRuntime.set(runtimeOptions, new Set([listName]));\n return;\n }\n\n validatedLists.add(listName);\n}\n\nfunction isListValidated(runtimeOptions: HumanInLoopRuntimeOptions, listName: string): boolean {\n return validatedListsByRuntime.get(runtimeOptions)?.has(listName) ?? false;\n}\n\nfunction createApprovalRecord(\n payload: ApprovalPayload,\n enqueuedAt: string,\n): { approvalId: string; pending: HumanInLoopPending; metadata: Record<string, unknown>; name: string } {\n const approvalId = `${enqueuedAt.slice(0, 19).replaceAll(\":\", \"-\")}-${randomBytes(3).toString(\"hex\")}`;\n\n return {\n approvalId,\n name: `${payload.commandPath} (${enqueuedAt})`,\n metadata: {\n schemaVersion: 1,\n approvalId,\n commandPath: payload.commandPath,\n params: payload.params,\n message: payload.message,\n declineInputPrompt: payload.declineInputPrompt ?? null,\n enqueuedAt,\n pid: null,\n result: null,\n error: null,\n },\n pending: {\n status: \"pending-approval\",\n approvalId,\n message: payload.message,\n enqueuedAt,\n },\n };\n}\n\nasync function createApprovalTask(\n tasks: Tasks,\n approval: { approvalId: string; metadata: Record<string, unknown>; name: string }\n): Promise<void> {\n await tasks.create({\n id: approval.approvalId,\n name: approval.name,\n metadata: approval.metadata,\n });\n}\n\nfunction isApprovalStateMachine(stateMachine: StateMachineDef): boolean {\n if (stateMachine === approvalStateMachine) {\n return true;\n }\n\n return isDeepEqualStateMachine(stateMachine, approvalStateMachine);\n}\n\nfunction isTaskListConfig(\n taskList: HumanInLoopRuntimeOptions[\"taskList\"],\n): taskList is NonNullable<Exclude<HumanInLoopRuntimeOptions[\"taskList\"], TaskList>> {\n return taskList !== undefined && \"dir\" in taskList;\n}\n\nfunction isDeepEqualStateMachine(left: StateMachineDef, right: StateMachineDef): boolean {\n if (!areEqualStrings(left.states, right.states)) {\n return false;\n }\n\n const leftEventNames = Object.keys(left.events);\n const rightEventNames = Object.keys(right.events);\n\n if (!areEqualStrings(leftEventNames, rightEventNames)) {\n return false;\n }\n\n for (const eventName of leftEventNames) {\n const leftEvent = left.events[eventName];\n const rightEvent = right.events[eventName];\n\n if (leftEvent === undefined || rightEvent === undefined) {\n return false;\n }\n\n if (leftEvent.to !== rightEvent.to) {\n return false;\n }\n\n if (!areEqualEventFrom(leftEvent.from, rightEvent.from)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction areEqualEventFrom(left: readonly string[] | \"*\", right: readonly string[] | \"*\"): boolean {\n if (left === \"*\" || right === \"*\") {\n return left === right;\n }\n\n return areEqualStrings(left, right);\n}\n\nfunction areEqualStrings(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction approvalPayloadFromTask(task: Task): ApprovalPayload | undefined {\n const metadata = task.metadata;\n\n if (typeof metadata !== \"object\" || metadata === null) {\n return undefined;\n }\n\n if (metadata.schemaVersion !== 1) {\n return undefined;\n }\n\n if (typeof metadata.approvalId !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.commandPath !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.message !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.enqueuedAt !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.params !== \"object\" || metadata.params === null) {\n return undefined;\n }\n\n return {\n approvalId: metadata.approvalId,\n commandPath: metadata.commandPath,\n params: metadata.params as Record<string, unknown>,\n message: metadata.message,\n declineInputPrompt:\n typeof metadata.declineInputPrompt === \"string\" || metadata.declineInputPrompt === null\n ? metadata.declineInputPrompt\n : undefined,\n enqueuedAt: metadata.enqueuedAt,\n pid: typeof metadata.pid === \"number\" || metadata.pid === null ? metadata.pid : undefined,\n result: metadata.result,\n error: metadata.error,\n };\n}\n", "import type { StateMachineDef } from \"@poe-code/task-list\";\n\nexport type ApprovalState =\n | \"pending\"\n | \"approved-running\"\n | \"approved-done\"\n | \"approved-failed\"\n | \"declined\";\n\nexport type ApprovalEvent = \"start\" | \"succeed\" | \"fail\" | \"decline\";\n\nexport const approvalStateMachine: StateMachineDef<ApprovalState, ApprovalEvent> = {\n initial: \"pending\",\n states: [\"pending\", \"approved-running\", \"approved-done\", \"approved-failed\", \"declined\"],\n events: {\n start: { from: [\"pending\"], to: \"approved-running\" },\n succeed: { from: [\"approved-running\"], to: \"approved-done\" },\n fail: { from: [\"approved-running\"], to: \"approved-failed\" },\n decline: { from: [\"pending\"], to: \"declined\" },\n },\n};\n", "import { access, readFile, writeFile } from \"node:fs/promises\";\nimport type { Task } from \"@poe-code/task-list\";\nimport type { Command, CommandNode, HandlerEnv, HandlerFs, HandlerContext } from \"../index.js\";\nimport { UserError, resolveCommandSecrets } from \"../index.js\";\nimport { ensureApprovalList } from \"./approval-tasks.js\";\nimport { resolveProvider } from \"./gate.js\";\nimport type { ApprovalPayload } from \"./approval-tasks.js\";\nimport type { HumanInLoopRuntimeOptions } from \"./types.js\";\n\ninterface SerializedJsonResult {\n ok: true;\n value: unknown;\n}\n\ninterface UnserializableJsonResult {\n ok: false;\n}\n\nexport async function runApproval(\n approvalId: string,\n runtimeOptions: HumanInLoopRuntimeOptions,\n root: CommandNode<any>,\n): Promise<void> {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n const task = await tasks.get(approvalId);\n\n if (task.state !== \"pending\") {\n return;\n }\n\n const approval = readApprovalPayload(task);\n const provider = resolveProvider(runtimeOptions);\n\n try {\n const approvalResult = await provider.requestApproval({\n message: approval.message,\n declineInputPrompt: approval.declineInputPrompt ?? undefined,\n });\n\n if (approvalResult.outcome === \"declined\") {\n await tasks.fire(approvalId, \"decline\", {\n metadataPatch: {\n error: {\n reason: approvalResult.reason,\n },\n },\n });\n return;\n }\n } catch (error) {\n await failPendingApproval(tasks, approvalId, error);\n return;\n }\n\n await tasks.fire(approvalId, \"start\", {\n metadataPatch: {\n pid: process.pid,\n },\n });\n\n try {\n const command = findCommand(root, approval.commandPath);\n const ctx = createHandlerContext(command, approval.params);\n const result = await command.handler(ctx);\n const serializedResult = serializeJsonResult(result);\n\n if (!serializedResult.ok) {\n await tasks.fire(approvalId, \"fail\", {\n metadataPatch: {\n error: {\n message: \"result not JSON-serializable\",\n },\n },\n });\n return;\n }\n\n await tasks.fire(approvalId, \"succeed\", {\n metadataPatch: {\n result: serializedResult.value,\n },\n });\n } catch (error) {\n await tasks.fire(approvalId, \"fail\", {\n metadataPatch: {\n error: errorMetadataFromUnknown(error),\n },\n });\n }\n}\n\nfunction readApprovalPayload(task: Task): ApprovalPayload {\n const metadata = task.metadata;\n\n if (typeof metadata !== \"object\" || metadata === null) {\n throw new UserError(`Malformed approval metadata for \"${task.qualifiedId}\".`);\n }\n\n if (metadata.schemaVersion !== 1) {\n throw new UserError(`Malformed approval metadata for \"${task.qualifiedId}\".`);\n }\n\n if (\n typeof metadata.commandPath !== \"string\" ||\n typeof metadata.message !== \"string\" ||\n typeof metadata.params !== \"object\" ||\n metadata.params === null\n ) {\n throw new UserError(`Malformed approval metadata for \"${task.qualifiedId}\".`);\n }\n\n const declineInputPrompt =\n typeof metadata.declineInputPrompt === \"string\" || metadata.declineInputPrompt === null\n ? metadata.declineInputPrompt\n : undefined;\n\n return {\n approvalId: typeof metadata.approvalId === \"string\" ? metadata.approvalId : undefined,\n commandPath: metadata.commandPath,\n params: metadata.params as Record<string, unknown>,\n message: metadata.message,\n declineInputPrompt,\n enqueuedAt: typeof metadata.enqueuedAt === \"string\" ? metadata.enqueuedAt : undefined,\n pid: typeof metadata.pid === \"number\" || metadata.pid === null ? metadata.pid : undefined,\n result: metadata.result,\n error: metadata.error,\n };\n}\n\nfunction findCommand(root: CommandNode<any>, commandPath: string): Command<any, any, any, any> {\n const pathSegments = commandPath.split(\".\").filter((segment) => segment.length > 0);\n\n if (pathSegments.length === 0) {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n let current: CommandNode<any> = root;\n\n for (const segment of pathSegments) {\n if (current.kind !== \"group\") {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n const next = current.children.find((child) => child.name === segment);\n\n if (next === undefined) {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n current = next;\n }\n\n if (current.kind !== \"command\") {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n return current;\n}\n\nfunction createHandlerContext(\n command: Command<any, any, any, any>,\n params: Record<string, unknown>\n): HandlerContext<any, any, any> {\n return {\n params,\n secrets: resolveCommandSecrets(command),\n fetch: globalThis.fetch,\n fs: createFs(),\n env: createEnv(),\n progress(): void {\n return undefined;\n },\n };\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") => readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction serializeJsonResult(value: unknown): SerializedJsonResult | UnserializableJsonResult {\n try {\n const serialized = JSON.stringify(value);\n\n if (serialized === undefined) {\n return {\n ok: false,\n };\n }\n\n return {\n ok: true,\n value: JSON.parse(serialized) as unknown,\n };\n } catch {\n return {\n ok: false,\n };\n }\n}\n\nfunction errorMetadataFromUnknown(error: unknown): {\n name: string;\n message: string;\n stack?: string;\n} {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n\n return {\n name: \"Error\",\n message: String(error),\n };\n}\n\nasync function failPendingApproval(tasks: Awaited<ReturnType<typeof ensureApprovalList>>[\"tasks\"], approvalId: string, error: unknown): Promise<void> {\n await tasks.fire(approvalId, \"start\", {\n metadataPatch: {\n pid: process.pid,\n },\n });\n await tasks.fire(approvalId, \"fail\", {\n metadataPatch: {\n error: errorMetadataFromUnknown(error),\n },\n });\n}\n", "import process from \"node:process\";\nimport { osascriptProvider } from \"@poe-code/agent-human-in-loop\";\nimport type { HumanInLoopProvider } from \"@poe-code/agent-human-in-loop\";\nimport { UserError } from \"../user-error.js\";\n\nfunction noProviderConfigured(): HumanInLoopProvider {\n return {\n id: \"noProviderConfigured\",\n async requestApproval() {\n throw new UserError(\n \"no human-in-loop provider configured for this platform \u2014 pass humanInLoop.provider to the runtime\"\n );\n },\n };\n}\n\nfunction createDefaultProviderFactory(): () => HumanInLoopProvider {\n let provider: HumanInLoopProvider | undefined;\n\n return () => {\n if (provider !== undefined) {\n return provider;\n }\n\n provider =\n process.platform === \"darwin\" ? osascriptProvider({ title: \"Approval needed\" }) : noProviderConfigured();\n\n return provider;\n };\n}\n\nconst getDefaultProvider = createDefaultProviderFactory();\n\nexport function defaultProviderForPlatform(): HumanInLoopProvider {\n return getDefaultProvider();\n}\n", "import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nimport type { HumanInLoopProvider } from \"../types.js\";\nimport { buildScript, parseStdout } from \"./osascript-script.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface OsascriptProviderOptions {\n title?: string;\n binary?: string;\n}\n\nfunction isUserCanceled(error: unknown): boolean {\n const message = error instanceof Error ? error.message : error === undefined ? \"\" : String(error);\n const stderr = (error as { stderr?: string } | undefined)?.stderr ?? \"\";\n return `${message}\\n${stderr}`.includes(\"(-128)\");\n}\n\nexport function osascriptProvider(options: OsascriptProviderOptions = {}): HumanInLoopProvider {\n const title = options.title ?? \"Approval needed\";\n const binary = options.binary ?? \"osascript\";\n\n return {\n id: \"osascript\",\n async requestApproval(request) {\n const script = buildScript(request, title);\n\n try {\n const { stdout } = await execFileAsync(binary, [\"-e\", script]);\n return parseStdout(stdout);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\"osascript not found \u2014 provide a different provider on this platform\");\n }\n if (isUserCanceled(error)) {\n return { outcome: \"declined\" };\n }\n\n const stderr = (error as { stderr?: string }).stderr ?? String(error);\n throw new Error(`osascript failed: ${stderr.trim()}`);\n }\n }\n };\n}\n", "import type { ApprovalRequest, ApprovalResult } from \"../types.js\";\n\nexport function escapeAppleScriptString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function buildScript(request: ApprovalRequest, title: string): string {\n const escapedMessage = escapeAppleScriptString(request.message);\n const escapedTitle = escapeAppleScriptString(title);\n\n if (request.declineInputPrompt === undefined) {\n return `button returned of (display dialog \"${escapedMessage}\" with title \"${escapedTitle}\" buttons {\"Decline\",\"Approve\"} default button \"Approve\")`;\n }\n\n const escapedPrompt = escapeAppleScriptString(request.declineInputPrompt);\n\n return `set firstResp to button returned of (display dialog \"${escapedMessage}\" with title \"${escapedTitle}\" buttons {\"Decline\",\"Approve\"} default button \"Approve\")\nif firstResp is \"Approve\" then\n return \"APPROVED\"\nend if\ntry\n set reason to text returned of (display dialog \"${escapedPrompt}\" default answer \"\" with title \"${escapedTitle}\" buttons {\"Cancel\",\"Submit\"} default button \"Submit\")\n return \"DECLINED:\" & reason\non error number -128\n return \"DECLINED:\"\nend try`;\n}\n\nexport function parseStdout(out: string): ApprovalResult {\n const value = out.replace(/\\n+$/u, \"\");\n\n switch (value) {\n case \"Approve\":\n case \"APPROVED\":\n return { outcome: \"approved\" };\n case \"Decline\":\n return { outcome: \"declined\" };\n default:\n break;\n }\n\n if (value.startsWith(\"DECLINED:\")) {\n const reason = value.slice(\"DECLINED:\".length);\n return reason === \"\"\n ? { outcome: \"declined\" }\n : { outcome: \"declined\", reason };\n }\n\n throw new Error(`unexpected osascript output: ${out}`);\n}\n", "import { spawn } from \"node:child_process\";\nimport type { HumanInLoopRuntimeOptions } from \"./types.js\";\n\nexport function spawnApprovalRunner(\n approvalId: string,\n runtimeOptions: HumanInLoopRuntimeOptions,\n spawnFn?: typeof import(\"node:child_process\").spawn\n): void {\n const { execPath, entryArgs } = runtimeOptions.binPath ?? {\n execPath: process.execPath,\n entryArgs: [process.argv[1]!],\n };\n const fn = spawnFn ?? spawn;\n const child = fn(execPath, [...entryArgs, \"approvals\", \"run\", approvalId], {\n detached: true,\n stdio: \"ignore\",\n env: process.env,\n cwd: process.cwd(),\n });\n\n child.unref();\n}\n\nexport default spawnApprovalRunner;\n", "import type { Command, HandlerContext } from \"../index.js\";\nimport { enqueueApproval, ensureApprovalList } from \"./approval-tasks.js\";\nimport { defaultProviderForPlatform } from \"./default-provider.js\";\nimport { spawnApprovalRunner } from \"./spawn.js\";\nimport { ApprovalDeclinedError } from \"./types.js\";\nimport type { HumanInLoopPending, HumanInLoopProvider, HumanInLoopRuntimeOptions } from \"./types.js\";\n\nconst providersByRuntime = new WeakMap<HumanInLoopRuntimeOptions, HumanInLoopProvider>();\nlet providerWithoutRuntime: HumanInLoopProvider | undefined;\n\nexport function resolveProvider(runtimeOptions: HumanInLoopRuntimeOptions | undefined): HumanInLoopProvider {\n if (runtimeOptions?.provider !== undefined) {\n return runtimeOptions.provider;\n }\n\n if (runtimeOptions === undefined) {\n providerWithoutRuntime ??= defaultProviderForPlatform();\n return providerWithoutRuntime;\n }\n\n const cachedProvider = providersByRuntime.get(runtimeOptions);\n if (cachedProvider !== undefined) {\n return cachedProvider;\n }\n\n const provider = defaultProviderForPlatform();\n providersByRuntime.set(runtimeOptions, provider);\n return provider;\n}\n\nexport async function invokeWithHumanInLoop<T>(\n node: Command<any, any, any, T>,\n ctx: HandlerContext<any, any, any>,\n runtimeOptions: HumanInLoopRuntimeOptions | undefined,\n commandPath: string,\n): Promise<T | HumanInLoopPending> {\n if (!node.humanInLoop) {\n return node.handler(ctx);\n }\n\n const message = node.humanInLoop.message({\n params: ctx.params,\n commandPath,\n });\n\n if (node.humanInLoop.mode === \"async\") {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n const { approvalId, pending } = await enqueueApproval({\n tasks,\n payload: {\n commandPath,\n params: ctx.params,\n message,\n declineInputPrompt: node.humanInLoop.declineInputPrompt,\n },\n });\n\n spawnApprovalRunner(approvalId, runtimeOptions as HumanInLoopRuntimeOptions);\n\n return pending;\n }\n\n const provider = resolveProvider(runtimeOptions);\n const result = await provider.requestApproval({\n message,\n declineInputPrompt: node.humanInLoop.declineInputPrompt,\n });\n\n if (result.outcome === \"declined\") {\n throw new ApprovalDeclinedError({\n reason: result.reason,\n commandPath,\n });\n }\n\n return node.handler(ctx);\n}\n", "import type { Task } from \"@poe-code/task-list\";\nimport { S } from \"toolcraft-schema\";\nimport type { CommandNode, Group, RenderPrimitives } from \"../index.js\";\nimport { UserError, defineCommand, defineGroup } from \"../index.js\";\nimport { ensureApprovalList } from \"./approval-tasks.js\";\nimport { runApproval } from \"./runner.js\";\nimport type { HumanInLoopRuntimeOptions } from \"./types.js\";\n\nconst approvalsGroupSymbol = Symbol(\"toolcraft.humanInLoop.approvalsBuiltIn\");\n\ninterface ApprovalBuiltInServices {\n runtimeOptions: HumanInLoopRuntimeOptions;\n root: CommandNode<any>;\n}\n\nconst listScope = [\"cli\", \"mcp\", \"sdk\"] as const;\nconst runScope = [\"cli\"] as const;\nconst listParams = S.Object({\n state: S.Optional(S.String()),\n});\nconst showParams = S.Object({\n approvalId: S.String(),\n});\n\nexport const approvalsGroup = markApprovalsBuiltIn(\n defineGroup<ApprovalBuiltInServices>({\n name: \"approvals\",\n description: \"Inspect and execute queued approvals.\",\n children: [\n defineCommand<\n ApprovalBuiltInServices,\n \"list\",\n typeof listParams,\n undefined,\n Task[],\n typeof listScope\n >({\n name: \"list\",\n description: \"List queued approvals.\",\n scope: listScope as unknown as [\"cli\", \"mcp\", \"sdk\"],\n params: listParams,\n handler: async ({ params, runtimeOptions }) => {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n return loadApprovals(tasks, params.state);\n },\n render: {\n rich: (result, primitives) => renderApprovalList(result, primitives),\n markdown: (result) => renderApprovalListMarkdown(result),\n json: (result) => result,\n },\n }),\n defineCommand<\n ApprovalBuiltInServices,\n \"show\",\n typeof showParams,\n undefined,\n Task,\n typeof listScope\n >({\n name: \"show\",\n description: \"Show one approval.\",\n scope: listScope as unknown as [\"cli\", \"mcp\", \"sdk\"],\n params: showParams,\n handler: async ({ params, runtimeOptions }) => {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n return tasks.get(params.approvalId);\n },\n render: {\n rich: (result, primitives) => renderApprovalDetails(result, primitives),\n markdown: (result) => renderApprovalDetailsMarkdown(result),\n json: (result) => result,\n },\n }),\n defineCommand<\n ApprovalBuiltInServices,\n \"run\",\n typeof showParams,\n undefined,\n void,\n typeof runScope\n >({\n name: \"run\",\n description: \"Run one queued approval.\",\n scope: runScope as unknown as [\"cli\"],\n params: showParams,\n handler: async ({ params, runtimeOptions, root }) => runApproval(params.approvalId, runtimeOptions, root),\n }),\n ],\n })\n);\n\nexport function mergeApprovalsGroup<TServices extends object>(root: Group<TServices>): Group<TServices> {\n const existing = root.children.find((child) => child.name === approvalsGroup.name);\n\n if (existing !== undefined) {\n if (isApprovalsBuiltIn(existing)) {\n return root;\n }\n\n throw new UserError(\"Error: 'approvals' is reserved for human-in-loop built-ins\");\n }\n\n root.children = [...root.children, approvalsGroup as unknown as CommandNode<TServices>];\n return root;\n}\n\nfunction markApprovalsBuiltIn<TGroup extends Group<any>>(group: TGroup): TGroup {\n Object.defineProperty(group, approvalsGroupSymbol, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return group;\n}\n\nfunction isApprovalsBuiltIn(node: CommandNode<any>): boolean {\n return node.kind === \"group\" && (node as Group<any> & { [approvalsGroupSymbol]?: true })[approvalsGroupSymbol] === true;\n}\n\nasync function loadApprovals(tasks: Awaited<ReturnType<typeof ensureApprovalList>>[\"tasks\"], stateFilter?: string): Promise<Task[]> {\n const states = splitStateFilter(stateFilter);\n\n if (states.length === 0) {\n return tasks.all();\n }\n\n const seenIds = new Set<string>();\n const approvals: Task[] = [];\n\n for (const state of states) {\n const matching = await tasks.all({\n state,\n });\n\n for (const task of matching) {\n if (seenIds.has(task.qualifiedId)) {\n continue;\n }\n\n seenIds.add(task.qualifiedId);\n approvals.push(task);\n }\n }\n\n return approvals;\n}\n\nfunction splitStateFilter(stateFilter: string | undefined): string[] {\n if (stateFilter === undefined) {\n return [];\n }\n\n const seen = new Set<string>();\n const states: string[] = [];\n\n for (const value of stateFilter.split(\",\")) {\n const trimmed = value.trim();\n\n if (trimmed.length === 0 || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n states.push(trimmed);\n }\n\n return states;\n}\n\nfunction renderApprovalList(result: Task[], { logger, renderTable, getTheme }: RenderPrimitives): void {\n if (result.length === 0) {\n logger.message(\"No approvals found.\");\n return;\n }\n\n logger.message(\n renderTable({\n theme: getTheme(),\n columns: [\n { name: \"id\", title: \"ID\", alignment: \"left\", maxLen: 24 },\n { name: \"state\", title: \"State\", alignment: \"left\", maxLen: 18 },\n { name: \"name\", title: \"Name\", alignment: \"left\", maxLen: 60 },\n ],\n rows: result.map((task) => ({\n id: task.id,\n state: task.state,\n name: task.name,\n })),\n })\n );\n}\n\nfunction renderApprovalListMarkdown(result: Task[]): string {\n if (result.length === 0) {\n return \"No approvals found.\";\n }\n\n const lines = [\"| ID | State | Name |\", \"| :--- | :--- | :--- |\"];\n\n for (const task of result) {\n lines.push(`| ${escapeMarkdownCell(task.id)} | ${escapeMarkdownCell(task.state)} | ${escapeMarkdownCell(task.name)} |`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderApprovalDetails(result: Task, { logger, renderTable, getTheme }: RenderPrimitives): void {\n logger.message(\n renderTable({\n theme: getTheme(),\n columns: [\n { name: \"key\", title: \"Key\", alignment: \"left\", maxLen: 18 },\n { name: \"value\", title: \"Value\", alignment: \"left\", maxLen: 80 },\n ],\n rows: Object.entries(taskToRecord(result)).map(([key, value]) => ({\n key,\n value: stringifyValue(value),\n })),\n })\n );\n}\n\nfunction renderApprovalDetailsMarkdown(result: Task): string {\n return Object.entries(taskToRecord(result))\n .map(([key, value]) => `- ${key}: ${stringifyValue(value)}`)\n .join(\"\\n\");\n}\n\nfunction taskToRecord(task: Task): Record<string, unknown> {\n return {\n list: task.list,\n id: task.id,\n qualifiedId: task.qualifiedId,\n name: task.name,\n state: task.state,\n description: task.description,\n metadata: task.metadata,\n };\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 try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction escapeMarkdownCell(value: string): string {\n return value.replaceAll(\"|\", \"\\\\|\");\n}\n", "import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createLogger } from \"@poe-code/design-system\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport { HttpTransport, McpClient, StdioTransport } from \"tiny-mcp-client\";\nimport type { Tool } from \"tiny-mcp-client\";\nimport type { Command, Group, Scope } from \"./index.js\";\nimport { convertJsonSchema } from \"./json-schema-converter.js\";\nimport type { ObjectSchema } from \"toolcraft-schema\";\n\nconst GROUP_CONFIG_SYMBOL_DESCRIPTION = \"toolcraft.group.config\";\nconst MCP_PROXY_SCHEMA_URL =\n \"https://poe-platform.github.io/poe-code/schemas/toolcraft/mcp-proxy.schema.json\";\nconst DEFAULT_CLIENT_INFO = {\n name: \"toolcraft\",\n version: \"0.0.1\",\n} as const;\nconst proxyNodeSymbol = Symbol(\"toolcraft.mcpProxyNode\");\nconst proxyConnectionSymbol = Symbol(\"toolcraft.mcpProxyConnection\");\nconst shutdownDisposers = new Set<() => Promise<void>>();\n\ninterface InternalGroupConfig<TServices extends object = Record<string, never>> {\n mcp?: McpServerConfig;\n tools?: string[];\n rename?: Record<string, string>;\n children?: Array<Command<TServices, any, any, any> | Group<TServices>>;\n}\n\ninterface HotProxyConnection {\n client?: McpClient;\n connecting?: Promise<McpClient>;\n config: McpServerConfig;\n dispose: () => Promise<void>;\n name: string;\n}\n\ninterface McpProxyCache {\n $schema: string;\n fetchedAt: string;\n tools: Tool[];\n upstream: {\n name: string;\n version: string;\n };\n version: 1;\n}\n\ntype GroupChild<TServices extends object = Record<string, never>> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n const symbol = Object.getOwnPropertySymbols(group).find(\n (candidate) => candidate.description === GROUP_CONFIG_SYMBOL_DESCRIPTION\n );\n\n if (symbol === undefined) {\n return {};\n }\n\n return (((group as unknown) as Record<PropertyKey, unknown>)[symbol] ??\n {}) as InternalGroupConfig<TServices>;\n}\n\nfunction isProxyNode(node: GroupChild<any>): boolean {\n return (node as GroupChild<any> & { [proxyNodeSymbol]?: true })[proxyNodeSymbol] === true;\n}\n\nfunction markProxyNode<TNode extends GroupChild<any>>(node: TNode): TNode {\n Object.defineProperty(node, proxyNodeSymbol, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return node;\n}\n\nfunction cloneSecrets(secrets: Record<string, { env: string; description?: string; optional?: boolean }>) {\n return { ...secrets };\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction registerShutdownDispose(dispose: () => Promise<void>): void {\n shutdownDisposers.add(dispose);\n}\n\nfunction getProxyConnection(group: Group<any>): HotProxyConnection | undefined {\n return (group as Group<any> & {\n [proxyConnectionSymbol]?: HotProxyConnection;\n })[proxyConnectionSymbol];\n}\n\nfunction setProxyConnection(\n group: Group<any>,\n connection: HotProxyConnection | undefined\n): void {\n (group as Group<any> & {\n [proxyConnectionSymbol]?: HotProxyConnection;\n })[proxyConnectionSymbol] = connection;\n}\n\nfunction createProxyGroup(\n parent: Group<any>,\n name: string\n): Group<any> {\n return markProxyNode<Group<any>>({\n kind: \"group\",\n name,\n description: undefined,\n aliases: [],\n scope: cloneScope(parent.scope),\n secrets: cloneSecrets(parent.secrets),\n requires: parent.requires,\n children: [],\n default: undefined,\n });\n}\n\nfunction createProxyCommand(\n parent: Group<any>,\n tool: Tool,\n commandName: string,\n connection: HotProxyConnection\n): Command<any, ObjectSchema<any>, undefined, unknown> {\n const params = convertJsonSchema(tool.inputSchema as Parameters<typeof convertJsonSchema>[0]);\n\n if (params.kind !== \"object\") {\n throw new Error(`upstream tool \"${tool.name}\" must define an object input schema`);\n }\n\n return markProxyNode({\n kind: \"command\",\n name: commandName,\n description: tool.description,\n aliases: [],\n positional: [],\n params,\n secrets: cloneSecrets(parent.secrets),\n scope: cloneScope(parent.scope) ?? ([\"cli\", \"sdk\"] satisfies Scope[]),\n confirm: false,\n requires: parent.requires,\n handler: async (ctx) => {\n const client = await ensureConnected(connection);\n return client.callTool({\n name: tool.name,\n arguments: ctx.params as Record<string, unknown>,\n });\n },\n render: undefined,\n });\n}\n\nfunction removeProxyChildren(group: Group<any>): void {\n group.children = group.children.filter((child) => !isProxyNode(child));\n\n for (const child of group.children) {\n if (child.kind === \"group\") {\n removeProxyChildren(child);\n }\n }\n}\n\nfunction findChild(group: Group<any>, name: string): GroupChild<any> | undefined {\n return group.children.find((child) => child.name === name);\n}\n\nfunction filterAllowlistedTools(tools: Tool[], allowlist: string[] | undefined): Tool[] {\n if (allowlist === undefined) {\n return tools;\n }\n\n const allowedNames = new Set(allowlist);\n return tools.filter((tool) => allowedNames.has(tool.name));\n}\n\nfunction validateRenameMap(name: string, tools: Tool[], rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const toolNames = new Set(tools.map((tool) => tool.name));\n\n for (const upstreamToolName of Object.keys(rename)) {\n if (!toolNames.has(upstreamToolName)) {\n throw new Error(\n `couldn't discover MCP ${name}: rename references unknown upstream tool \"${upstreamToolName}\"`\n );\n }\n }\n}\n\nfunction createConnection(name: string, config: McpServerConfig): HotProxyConnection {\n const connection: HotProxyConnection = {\n name,\n config,\n async dispose(): Promise<void> {\n shutdownDisposers.delete(connection.dispose);\n connection.connecting = undefined;\n\n if (connection.client === undefined) {\n return;\n }\n\n const client = connection.client;\n connection.client = undefined;\n await client.close();\n },\n };\n\n registerShutdownDispose(connection.dispose);\n return connection;\n}\n\nasync function ensureConnected(connection: HotProxyConnection): Promise<McpClient> {\n if (connection.client !== undefined && connection.client.state === \"ready\") {\n return connection.client;\n }\n\n if (connection.connecting !== undefined) {\n return connection.connecting;\n }\n\n connection.connecting = dialUpstream(connection.name, connection.config)\n .then((client) => {\n connection.client = client;\n return client;\n })\n .finally(() => {\n connection.connecting = undefined;\n });\n\n return connection.connecting;\n}\n\nasync function readCache(cachePath: string): Promise<McpProxyCache | undefined> {\n try {\n const raw = await readFile(cachePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<McpProxyCache>;\n\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n !Array.isArray(parsed.tools) ||\n parsed.upstream === undefined ||\n typeof parsed.upstream.name !== \"string\" ||\n typeof parsed.upstream.version !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n $schema: typeof parsed.$schema === \"string\" ? parsed.$schema : MCP_PROXY_SCHEMA_URL,\n fetchedAt: typeof parsed.fetchedAt === \"string\" ? parsed.fetchedAt : new Date(0).toISOString(),\n tools: parsed.tools,\n upstream: parsed.upstream,\n version: parsed.version === 1 ? 1 : 1,\n };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code === \"ENOENT\" || error instanceof SyntaxError) {\n return undefined;\n }\n\n return undefined;\n }\n}\n\nasync function writeCache(cachePath: string, cache: McpProxyCache): Promise<void> {\n const directory = path.dirname(cachePath);\n const tempPath = `${cachePath}.tmp`;\n\n await mkdir(directory, { recursive: true });\n await writeFile(tempPath, `${JSON.stringify(cache, null, 2)}\\n`);\n await rename(tempPath, cachePath);\n}\n\nasync function fetchCache(\n name: string,\n config: McpServerConfig,\n cachePath: string\n): Promise<McpProxyCache> {\n const logger = createLogger((message) => {\n process.stderr.write(`${message}\\n`);\n });\n logger.info(`MCP ${name}: connecting`);\n const client = await dialUpstream(name, config);\n\n try {\n logger.info(`MCP ${name}: listing tools`);\n\n const tools: Tool[] = [];\n let cursor: string | undefined;\n\n do {\n const page = await client.listTools(cursor === undefined ? {} : { cursor });\n tools.push(...page.tools);\n cursor = page.nextCursor;\n } while (cursor !== undefined);\n\n logger.info(`MCP ${name}: found ${tools.length} tools`);\n\n const upstream = client.serverInfo ?? {\n name,\n version: \"unknown\",\n };\n const cache: McpProxyCache = {\n $schema: MCP_PROXY_SCHEMA_URL,\n version: 1,\n upstream,\n fetchedAt: new Date().toISOString(),\n tools,\n };\n\n await writeCache(cachePath, cache);\n logger.info(`MCP ${name}: wrote ${cachePath}`);\n\n return cache;\n } finally {\n await client.close();\n }\n}\n\nasync function deleteCacheIfPresent(cachePath: string): Promise<void> {\n try {\n await unlink(cachePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nfunction populateGroupFromTools(\n group: Group<any>,\n tools: Tool[],\n rename: Record<string, string> | undefined,\n connection: HotProxyConnection\n): void {\n removeProxyChildren(group);\n\n for (const tool of tools) {\n const targetPath = rename?.[tool.name] ?? tool.name;\n const segments =\n rename !== undefined && Object.prototype.hasOwnProperty.call(rename, tool.name)\n ? targetPath.split(\".\")\n : [tool.name];\n const commandName = segments[segments.length - 1];\n\n if (commandName === undefined || commandName.length === 0) {\n throw new Error(`command path \"${targetPath}\" collides with an existing child`);\n }\n\n let parent = group;\n\n for (const segment of segments.slice(0, -1)) {\n const existing = findChild(parent, segment);\n\n if (existing === undefined) {\n const created = createProxyGroup(parent, segment);\n parent.children.push(created);\n parent = created;\n continue;\n }\n\n if (existing.kind !== \"group\") {\n throw new Error(`command path \"${targetPath}\" collides with an existing child`);\n }\n\n parent = existing;\n }\n\n if (findChild(parent, commandName) !== undefined) {\n throw new Error(`command path \"${targetPath}\" collides with an existing child`);\n }\n\n parent.children.push(createProxyCommand(parent, tool, commandName, connection));\n }\n}\n\nfunction isRefreshRequested(name: string, refresh: \"all\" | Set<string> | undefined): boolean {\n if (refresh === \"all\") {\n return true;\n }\n\n return refresh?.has(name) === true;\n}\n\nasync function resolveSingleProxy(group: Group<any>): Promise<void> {\n const internal = getInternalGroupConfig(group);\n const config = internal.mcp;\n\n if (config === undefined) {\n return;\n }\n\n const name = group.name;\n\n try {\n const cachePath = resolveCachePath(name);\n const refresh = parseRefreshEnv(process.env.TOOLCRAFT_MCP_REFRESH);\n let cache: McpProxyCache;\n\n if (isRefreshRequested(name, refresh)) {\n await deleteCacheIfPresent(cachePath);\n cache = await fetchCache(name, config, cachePath);\n } else {\n cache = (await readCache(cachePath)) ?? (await fetchCache(name, config, cachePath));\n }\n\n const tools = filterAllowlistedTools(cache.tools, internal.tools);\n\n validateRenameMap(name, tools, internal.rename);\n const previousConnection = getProxyConnection(group);\n const nextConnection = createConnection(name, config);\n\n try {\n populateGroupFromTools(group, tools, internal.rename, nextConnection);\n setProxyConnection(group, nextConnection);\n } catch (error) {\n await nextConnection.dispose();\n throw error;\n }\n\n if (previousConnection !== undefined && previousConnection !== nextConnection) {\n await previousConnection.dispose();\n }\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(`couldn't discover MCP ${name}:`)) {\n throw error;\n }\n\n throw new Error(\n `couldn't discover MCP ${name}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction collectProxyGroups(root: Group<any>): Group<any>[] {\n const groups: Group<any>[] = [];\n\n function visit(group: Group<any>): void {\n if (getInternalGroupConfig(group).mcp !== undefined) {\n groups.push(group);\n }\n\n for (const child of group.children) {\n if (child.kind === \"group\") {\n visit(child);\n }\n }\n }\n\n visit(root);\n return groups;\n}\n\nexport function hasMcpProxyGroups(root: Group<any>): boolean {\n return collectProxyGroups(root).length > 0;\n}\n\nexport function resolveCachePath(name: string, projectRoot?: string): string {\n if (projectRoot !== undefined) {\n return path.join(projectRoot, \".toolcraft\", \"mcp\", `${name}.json`);\n }\n\n let current = process.cwd();\n\n while (true) {\n if (existsSync(path.join(current, \"package.json\"))) {\n return path.join(current, \".toolcraft\", \"mcp\", `${name}.json`);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n throw new Error(\n `Could not find package.json above \"${process.cwd()}\" while resolving MCP cache path.`\n );\n }\n\n current = parent;\n }\n}\n\nexport function parseRefreshEnv(\n value: string | undefined\n): \"all\" | Set<string> | undefined {\n const trimmed = value?.trim();\n\n if (trimmed === undefined || trimmed.length === 0) {\n return undefined;\n }\n\n if (trimmed === \"1\" || trimmed === \"true\") {\n return \"all\";\n }\n\n const names = trimmed\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n\n return names.length === 0 ? undefined : new Set(names);\n}\n\nexport async function dialUpstream(\n name: string,\n config: McpServerConfig\n): Promise<McpClient> {\n const client = new McpClient({\n clientInfo: {\n name: `${DEFAULT_CLIENT_INFO.name}-${name}`,\n version: DEFAULT_CLIENT_INFO.version,\n },\n });\n const transport =\n config.transport === \"stdio\"\n ? new StdioTransport({\n command: config.command,\n ...(config.args === undefined ? {} : { args: config.args }),\n ...(config.env === undefined ? {} : { env: config.env }),\n })\n : new HttpTransport({\n url: config.url,\n ...(config.headers === undefined ? {} : { headers: config.headers }),\n });\n\n await client.connect(transport);\n return client;\n}\n\nexport async function resolveMcpProxies(root: Group<any>): Promise<void> {\n const groups = collectProxyGroups(root);\n await Promise.all(groups.map((group) => resolveSingleProxy(group)));\n}\n", "import { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n} from \"mcp-oauth\";\nimport type { Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"mcp-oauth\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"mcp-oauth\";\n\nexport type RequestId = number | string;\n\nexport interface Implementation {\n name: string;\n version: string;\n}\n\nexport interface ClientCapabilities {\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: () => Root[] | Promise<Root[]>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities;\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo;\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport): Promise<InitializeResult> {\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n const transportClosedReason = transport.closed\n .then((closedEvent) => closedEvent.reason)\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n 30_000,\n transportClosedReason\n );\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params) =>\n onSamplingRequest(params as CreateMessageParams)\n );\n }\n\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async () => ({\n roots: await onRootsList(),\n }));\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async () => {\n if (onToolsChanged === undefined) {\n return;\n }\n\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async () => {\n if (onResourcesChanged === undefined) {\n return;\n }\n\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\") {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async () => {\n if (onPromptsChanged === undefined) {\n return;\n }\n\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (!isRequestId(progressToken) || typeof progress !== \"number\") {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n const initializeResult = (await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n })) as InitializeResult;\n\n if (initializeResult.protocolVersion !== MCP_PROTOCOL_VERSION) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n\n this.currentServerCapabilities = initializeResult.capabilities;\n this.currentServerInfo = initializeResult.serverInfo;\n this.currentInstructions = initializeResult.instructions;\n messageLayer.sendNotification(\"notifications/initialized\");\n this.currentState = \"ready\";\n\n return initializeResult;\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}): Promise<{ tools: Tool[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"tools/list\", requestParams)) as {\n tools: Tool[];\n nextCursor?: string;\n };\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n let requestId: RequestId | undefined;\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n }) as Promise<CallToolResult>;\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n if (requestId !== undefined) {\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}\n ): Promise<{ resources: Resource[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"resources/list\", requestParams)) as {\n resources: Resource[];\n nextCursor?: string;\n };\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}\n ): Promise<{ resourceTemplates: ResourceTemplate[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"resources/templates/list\", requestParams)) as {\n resourceTemplates: ResourceTemplate[];\n nextCursor?: string;\n };\n }\n\n async readResource(params: ReadResourceParams): Promise<{ contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n return (await messageLayer.sendRequest(\"resources/read\", params)) as {\n contents: ResourceContents[];\n };\n }\n\n async subscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri });\n }\n\n async unsubscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri });\n }\n\n async listPrompts(params: PaginatedParams = {}): Promise<{ prompts: Prompt[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n return (await messageLayer.sendRequest(\"prompts/get\", params)) as GetPromptResult;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n return (await messageLayer.sendRequest(\"completion/complete\", params)) as CompleteResult;\n }\n\n async setLogLevel(level: LogLevel): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level });\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(\"ping\");\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n annotations?: ToolAnnotations;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface PaginatedResult {\n nextCursor?: string;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string;\n blob: string;\n}\n\nexport type ResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: ResourceContents;\n}\n\nexport type ContentItem = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\nexport interface Prompt {\n name: string;\n description?: string;\n arguments?: PromptArgument[];\n}\n\nexport interface PromptArgument {\n name: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface Root {\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem | ContentItem[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n model: string;\n content: ContentItem | ContentItem[];\n role: \"user\" | \"assistant\";\n stopReason: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n dispose(reason?: Error): void;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n url: string;\n headers?: HeadersInit;\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n child.stderr.on(\"data\", (chunk: unknown) => {\n this.stderrOutput += chunkToString(chunk);\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly url: string;\n private readonly headers: HeadersInit;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly openSseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n\n constructor({\n url,\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n }: HttpTransportOptions) {\n this.url = url;\n this.headers = headers;\n this.fetchImpl = fetchImpl;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.abortInFlightFetches();\n this.cancelOpenSseReaders();\n this.terminateSession();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason });\n }\n\n private abortInFlightFetches(): void {\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort();\n }\n\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenSseReaders(): void {\n for (const reader of this.openSseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openSseReaders.clear();\n }\n\n private async fetchWithAbort(input: string | URL, init: RequestInit): Promise<Response> {\n const abortController = new AbortController();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await this.fetchImpl(input, {\n ...init,\n signal: abortController.signal,\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const hasSessionId = this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n method: \"POST\",\n createHeaders: () => this.createPostHeaders(),\n body: line,\n });\n\n if (hasSessionId && response.status === 404) {\n this.sessionId = undefined;\n this.dispose(new Error(\"HTTP transport session expired (404 response)\"));\n return;\n }\n\n await this.throwForPostHttpError(response);\n this.captureSessionId(response);\n this.maybeOpenGetSseStream();\n await this.forwardResponseMessages(response);\n }\n }\n\n private async createPostHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createGetHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n if (this.lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", this.lastEventId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createDeleteHeaders(sessionId: string): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n return this.authorizeRequestHeaders(headers);\n }\n\n private async authorizeRequestHeaders(headers: Headers): Promise<Headers> {\n await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers,\n fetch: this.fetchImpl,\n });\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private terminateSession(): void {\n if (this.sessionId === undefined) {\n return;\n }\n\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n\n this.sendSessionTerminationRequest(sessionId).catch(() => undefined);\n }\n\n private async sendSessionTerminationRequest(sessionId: string): Promise<void> {\n const response = await this.fetchImpl(this.url, {\n method: \"DELETE\",\n headers: await this.createDeleteHeaders(sessionId),\n });\n\n if (response.status === 405) {\n return;\n }\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: () => this.createGetHeaders(),\n });\n\n if (response.status === 405) {\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n if (contentType.toLowerCase().includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n }\n }\n\n private async throwForPostHttpError(response: Response): Promise<void> {\n if (response.status < 400) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, {\n resourceMetadataUrl,\n });\n const result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url),\n response: response.clone(),\n challenge,\n discovery,\n fetch: this.fetchImpl,\n });\n\n if (result.action === \"retry\") {\n return true;\n }\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n return false;\n }\n\n private async forwardResponseMessages(response: Response): Promise<void> {\n if (response.status === 202) {\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n const normalizedContentType = contentType.toLowerCase();\n if (normalizedContentType.includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n return;\n }\n\n if (normalizedContentType.includes(\"application/json\")) {\n await this.forwardJsonResponseMessage(response);\n }\n }\n\n private async forwardSseResponseMessages(response: Response): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser();\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n this.openSseReaders.add(reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages);\n this.lastEventId = parser.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk));\n this.lastEventId = parser.lastEventId;\n }\n\n this.writeSseMessages(parser.flush());\n this.lastEventId = parser.lastEventId;\n } finally {\n this.openSseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(response: Response): Promise<void> {\n const payload = await response.text();\n if (payload.length === 0) {\n return;\n }\n\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[]): void {\n for (const message of messages) {\n this.writeReadableLine(message.data);\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n method: \"GET\" | \"POST\";\n createHeaders: () => Promise<Headers>;\n body?: BodyInit;\n }): Promise<Response> {\n const request = async (): Promise<Response> =>\n this.fetchWithAbort(this.url, {\n method: input.method,\n headers: await input.createHeaders(),\n body: input.body,\n });\n\n let response = await request();\n if (await this.maybeHandleUnauthorizedResponse(response)) {\n response = await request();\n }\n\n const oauthError = this.oauthProvider === undefined\n ? null\n : this.readOAuthChallengeError(response);\n if (oauthError !== null) {\n throw oauthError;\n }\n\n return response;\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return String(chunk);\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer += chunkToString(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n}\n\nexport class SseParser {\n private buffer = \"\";\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n\n while (true) {\n const newlineIndex = this.buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = normalizeLine(this.buffer.slice(0, newlineIndex));\n this.buffer = this.buffer.slice(newlineIndex + 1);\n this.consumeLine(line, messages);\n }\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n const messages: ParsedSseMessage[] = [];\n\n if (this.buffer.length > 0) {\n this.consumeLine(normalizeLine(this.buffer), messages);\n this.buffer = \"\";\n }\n\n this.emitEvent(messages);\n return messages;\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || eventType !== \"message\") {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n }\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\ninterface ActiveIncomingRequest {\n cancelled: boolean;\n}\n\nexport interface JsonRpcRequestOptions {\n timeoutMs?: number;\n onRequestId?: (requestId: RequestId) => void;\n}\n\ninterface JsonRpcRequestContext {\n id: RequestId;\n method: string;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: JsonRpcRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>\n ) {\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\n }\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(): Promise<Error> {\n const streamClosedError = new Error(\"JSON-RPC input stream closed\");\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n clearTimeout(pending.timeout);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n const activeRequest: ActiveIncomingRequest = {\n cancelled: false,\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.cancelled = true;\n this.activeIncomingRequests.delete(requestId);\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (typeof value.code !== \"number\" || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n createSecretStore,\n type CreateSecretStoreInput,\n type SecretStore,\n} from \"auth-store\";\nimport type {\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\n\ninterface StoredOAuthClient {\n clientId: string;\n clientSecret?: string;\n}\n\nexport interface OAuthClientStore {\n load(issuer: string): Promise<StoredOAuthClient | null>;\n save(issuer: string, client: StoredOAuthClient): Promise<void>;\n clear(issuer: string): Promise<void>;\n}\n\nexport function createAuthStoreSessionStore(\n options: CreateSecretStoreInput = {}\n): OAuthSessionStore {\n return {\n async load(resource: string): Promise<StoredOAuthSession | null> {\n const store = createResourceSecretStore(resource, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed as StoredOAuthSession;\n }\n\n throw new Error(\"Stored OAuth session must be a JSON object\");\n },\n async save(resource: string, session: StoredOAuthSession): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.set(JSON.stringify(session));\n },\n async clear(resource: string): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.delete();\n },\n };\n}\n\nexport function createAuthStoreClientStore(\n options: CreateSecretStoreInput\n): OAuthClientStore {\n return {\n async load(issuer: string): Promise<StoredOAuthClient | null> {\n const store = createIssuerSecretStore(issuer, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n if (\n typeof parsed === \"object\"\n && parsed !== null\n && !Array.isArray(parsed)\n && typeof parsed.clientId === \"string\"\n ) {\n return parsed as StoredOAuthClient;\n }\n\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer: string, client: StoredOAuthClient): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer: string): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.delete();\n },\n };\n}\n\nfunction createNamedSecretStore(\n key: string,\n options: CreateSecretStoreInput,\n defaults: { salt: string; directory: string; service: string; accountPrefix: string }\n): SecretStore {\n const hash = crypto.createHash(\"sha256\").update(key).digest(\"hex\");\n const parsedFilePath =\n options.fileStore?.filePath === undefined ? null : path.parse(options.fileStore.filePath);\n\n const fileStore = {\n ...options.fileStore,\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory:\n parsedFilePath?.dir ||\n options.fileStore?.defaultDirectory ||\n defaults.directory,\n defaultFileName:\n parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`,\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`,\n };\n\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\n\nfunction createResourceSecretStore(resource: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(\n canonicalizeResourceIndicator(resource),\n options,\n {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\",\n }\n );\n}\n\nfunction createIssuerSecretStore(issuer: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(\n issuer,\n options,\n {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\",\n }\n );\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport type { SecretStore } from \"./types.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n this.filePath = input.filePath ?? path.join(\n (input.getHomeDirectory ?? homedir)(),\n input.defaultDirectory ?? \".auth-store\",\n input.defaultFileName ?? \"credentials.enc\"\n );\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async get(): Promise<string | null> {\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n return null;\n }\n }\n\n async set(value: string): Promise<void> {\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.fs.writeFile(this.filePath, JSON.stringify(document), {\n encoding: \"utf8\"\n });\n await this.fs.chmod(this.filePath, ENCRYPTION_FILE_MODE);\n }\n\n async delete(): Promise<void> {\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n this.keyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt);\n }\n return this.keyPromise;\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = `${secret}:${salt}`;\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise;\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n if (parsed.version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof parsed.iv !== \"string\" ||\n typeof parsed.authTag !== \"string\" ||\n typeof parsed.ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version: parsed.version,\n iv: parsed.iv,\n authTag: parsed.authTag,\n ciphertext: parsed.ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n );\n}\n", "import { spawn } from \"node:child_process\";\nimport type { SecretStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[]\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service;\n this.account = input.account;\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (result.exitCode === 0) {\n return stripTrailingLineBreak(result.stdout);\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async set(value: string): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-w\",\n value,\n \"-U\"\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (result.exitCode !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (result.exitCode === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string\n ): Promise<KeychainCommandResult> {\n try {\n return await this.runCommand(SECURITY_CLI, args);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[]\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n if (result.exitCode === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE) {\n return true;\n }\n\n const output = `${result.stderr}\\n${result.stdout}`.toLowerCase();\n\n return (\n output.includes(\"could not be found\") ||\n output.includes(\"item not found\") ||\n output.includes(\"errsecitemnotfound\")\n );\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const details = result.stderr.trim() || result.stdout.trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${result.exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${result.exitCode}`);\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\nfunction resolveBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? input.env?.[envVar] ?? process.env[envVar];\n\n if (configuredBackend === \"keychain\") {\n return \"keychain\";\n }\n\n return \"file\";\n}\n", "export function canonicalizeResourceIndicator(value: string | URL): string {\n let url: URL;\n try {\n url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n } catch {\n throw new Error(\"Resource indicator must be an absolute URL\");\n }\n url.hash = \"\";\n return url.toString();\n}\n", "import { URL } from \"node:url\";\nimport type {\n DefaultOAuthClientProviderOptions,\n OAuthAuthorizationServerMetadata,\n OAuthClientMetadata,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n StoredOAuthSession,\n StoredOAuthTokens,\n} from \"./types.js\";\nimport {\n createAuthStoreClientStore,\n createAuthStoreSessionStore,\n type OAuthClientStore,\n} from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport {\n exchangeAuthorizationCode,\n OAuthError,\n refreshAccessToken,\n isRetryableOAuthError,\n readOAuthJsonObjectResponse,\n} from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nexport function createOAuthClientProvider(\n options: OAuthClientProviderOptions\n): OAuthClientProvider {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n\n return createDefaultOAuthClientProvider(options);\n}\n\nexport function createDefaultOAuthClientProvider(\n options: DefaultOAuthClientProviderOptions\n): OAuthClientProvider {\n const sessionStore = options.sessionStore ?? createAuthStoreSessionStore(options.authStore);\n const clientStore = options.authStore === undefined ? null : createAuthStoreClientStore(options.authStore);\n const now = options.now ?? Date.now;\n const sessions = new Map<string, StoredOAuthSession | null>();\n const registeredClients = new Map<string, StoredOAuthSession[\"client\"] | null>();\n const refreshPromises = new Map<string, Promise<StoredOAuthSession | null>>();\n const authorizationPromises = new Map<string, Promise<StoredOAuthSession>>();\n\n return {\n async authorizeRequest(input): Promise<void> {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false);\n const accessToken = session?.tokens?.accessToken;\n if (session === null || accessToken === undefined) {\n return;\n }\n\n assertRequestMatchesResource(requestUrl, session.resource);\n\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n },\n\n async handleUnauthorized(input) {\n try {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const forceRefresh =\n hasCachedAccessToken(await loadSession(resource))\n && input.challenge?.params.error === \"invalid_token\";\n const session = await ensureAuthorizedSession(\n resource,\n {\n ...input.discovery,\n resource,\n },\n input.fetch,\n true,\n forceRefresh\n );\n\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" } as const;\n }\n\n return { action: \"retry\" } as const;\n } catch (error) {\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error)),\n } as const;\n }\n },\n };\n\n async function ensureAuthorizedSession(\n resource: string,\n discovery: OAuthDiscoveryResult | undefined,\n fetch: OAuthMetadataFetch,\n allowInteractive: boolean,\n forceRefresh = false\n ): Promise<StoredOAuthSession | null> {\n const canonicalResource = canonicalizeResourceIndicator(resource);\n let session = await loadSession(canonicalResource);\n const sessionDiscovery = resolveDiscovery(discovery, session);\n\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n\n if (\n session?.tokens?.refreshToken !== undefined\n && sessionDiscovery !== undefined\n && (forceRefresh || isExpired(session.tokens, now))\n ) {\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n\n if (forceRefresh && session?.tokens !== undefined) {\n return session;\n }\n\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch);\n }\n\n async function refreshSession(\n resource: string,\n session: StoredOAuthSession,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession | null> {\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n\n const inFlight = refreshPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n try {\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n\n let refreshAttempted = false;\n let refreshedTokens: StoredOAuthTokens;\n\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: discovery.authorizationServerMetadata.token_endpoint,\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch,\n now,\n });\n break;\n } catch (error) {\n if (error instanceof OAuthError && error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n\n if (\n shouldReRegisterStoredDynamicClient(\n error,\n await loadRegisteredClient(discovery.authorizationServer),\n false\n )\n ) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n\n throw error;\n }\n }\n\n const updatedSession: StoredOAuthSession = {\n ...session,\n tokens: refreshedTokens,\n discovery: toStoredDiscovery(discovery),\n };\n await saveSession(resource, updatedSession);\n return updatedSession;\n } finally {\n refreshPromises.delete(resource);\n }\n })();\n\n refreshPromises.set(resource, promise);\n return promise;\n }\n\n async function authorizeSession(\n resource: string,\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession> {\n const inFlight = authorizationPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n openBrowser: options.browser.openBrowser,\n readLine: options.browser.readLine,\n createServer: options.browser.createServer,\n landingPage: options.browser.landingPage,\n });\n let resolvedClient: ResolvedOAuthClient | null = null;\n\n try {\n resolvedClient = await resolveClient(currentSession, discovery, loopback.redirectUri, fetch);\n const sessionWithoutTokens: StoredOAuthSession = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n discovery: toStoredDiscovery(discovery),\n };\n await saveSession(resource, sessionWithoutTokens);\n\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata: getClientMetadata(options.client),\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: discovery.authorizationServerMetadata.token_endpoint,\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch,\n now,\n });\n\n const session: StoredOAuthSession = {\n ...sessionWithoutTokens,\n tokens,\n };\n\n await saveSession(resource, session);\n return session;\n } catch (error) {\n if (\n shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)\n ) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n throw error;\n } finally {\n loopback.close();\n }\n }\n })();\n\n const finalPromise = promise.finally(() => {\n authorizationPromises.delete(resource);\n });\n authorizationPromises.set(resource, finalPromise);\n return finalPromise;\n }\n\n async function resolveClient(\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n redirectUri: string,\n fetch: OAuthMetadataFetch\n ): Promise<ResolvedOAuthClient> {\n if (options.client.mode === \"static\") {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: {\n clientId: options.client.clientId,\n clientSecret: options.client.clientSecret,\n },\n };\n }\n\n const registrationEndpoint = discovery.authorizationServerMetadata.registration_endpoint;\n if (registrationEndpoint === undefined && options.client.clientId !== undefined) {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: {\n clientId: options.client.clientId,\n clientSecret: options.client.clientSecret,\n },\n };\n }\n\n const storedClient = await loadRegisteredClient(discovery.authorizationServer);\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient,\n };\n }\n\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client,\n };\n }\n\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n const isConfiguredStaticFallback =\n options.client.clientId !== undefined\n && existingSession.client.clientId === options.client.clientId\n && existingSession.client.clientSecret === options.client.clientSecret;\n\n if (!isConfiguredStaticFallback) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client,\n };\n }\n }\n\n const registrationBody = buildClientRegistrationBody(\n getClientMetadata(options.client),\n redirectUri\n );\n const response = await fetch(registrationEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(registrationBody),\n });\n const payload = await readOAuthJsonObjectResponse(response);\n\n if (\n typeof payload.client_id !== \"string\" ||\n payload.client_id.length === 0\n ) {\n throw new Error(\"OAuth client registration response missing client_id\");\n }\n\n const registeredClient = {\n clientId: payload.client_id,\n clientSecret:\n typeof payload.client_secret === \"string\" && payload.client_secret.length > 0\n ? payload.client_secret\n : undefined,\n };\n await saveRegisteredClient(discovery.authorizationServer, registeredClient);\n\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: registeredClient,\n };\n }\n\n async function loadSession(resource: string): Promise<StoredOAuthSession | null> {\n if (sessions.has(resource)) {\n return sessions.get(resource) ?? null;\n }\n\n const session = await sessionStore.load(resource);\n sessions.set(resource, session);\n return session;\n }\n\n async function saveSession(resource: string, session: StoredOAuthSession): Promise<void> {\n sessions.set(resource, session);\n await sessionStore.save(resource, session);\n }\n\n async function clearSession(resource: string): Promise<void> {\n sessions.delete(resource);\n await sessionStore.clear(resource);\n }\n\n async function loadRegisteredClient(\n issuer: string\n ): Promise<StoredOAuthSession[\"client\"] | null> {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n\n if (clientStore === null) {\n return null;\n }\n\n const client = await clientStore.load(issuer);\n registeredClients.set(issuer, client);\n return client;\n }\n\n async function saveRegisteredClient(\n issuer: string,\n client: StoredOAuthSession[\"client\"]\n ): Promise<void> {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n\n async function clearRegisteredClient(issuer: string): Promise<void> {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\n\nfunction isProviderOptions(\n options: OAuthClientProviderOptions\n): options is { provider: OAuthClientProvider } {\n return \"provider\" in options;\n}\n\nfunction isExpired(tokens: StoredOAuthTokens, now: () => number): boolean {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\n\nfunction resolveDiscovery(\n discovery: OAuthDiscoveryResult | undefined,\n session: StoredOAuthSession | null\n): OAuthDiscoveryResult | undefined {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource),\n };\n }\n\n if (session === null) {\n return undefined;\n }\n\n const metadata = session.discovery.authorizationServerMetadata;\n if (\n typeof metadata.issuer !== \"string\" ||\n typeof metadata.authorization_endpoint !== \"string\" ||\n typeof metadata.token_endpoint !== \"string\" ||\n !Array.isArray(metadata.code_challenge_methods_supported) ||\n !metadata.code_challenge_methods_supported.includes(\"S256\")\n ) {\n return undefined;\n }\n\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery.resourceMetadata as OAuthDiscoveryResult[\"resourceMetadata\"],\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata as OAuthAuthorizationServerMetadata,\n };\n}\n\nfunction clearSessionTokens(session: StoredOAuthSession): StoredOAuthSession {\n const nextSession = { ...session };\n delete nextSession.tokens;\n return nextSession;\n}\n\nfunction hasCachedAccessToken(\n session: StoredOAuthSession | null\n): session is StoredOAuthSession & { tokens: StoredOAuthTokens } {\n return session?.tokens?.accessToken !== undefined;\n}\n\nfunction getClientMetadata(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): OAuthClientMetadata | undefined {\n return client.metadata;\n}\n\nfunction buildAuthorizationUrl(input: {\n metadata: OAuthAuthorizationServerMetadata;\n resource: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n clientMetadata: OAuthClientMetadata | undefined;\n}): string {\n const url = new URL(input.metadata.authorization_endpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer: input.metadata.issuer,\n requireIssuer: input.metadata.authorization_response_iss_parameter_supported === true,\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n\n return url.toString();\n}\n\nfunction assertS256PkceSupport(metadata: OAuthAuthorizationServerMetadata): void {\n if (!metadata.code_challenge_methods_supported.includes(\"S256\")) {\n throw new Error(\n \"Authorization server metadata must advertise code_challenge_methods_supported including S256\"\n );\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\n\nfunction assertSecureUrl(value: string, label: string): void {\n const url = new URL(value);\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction assertSecureOAuthFlowEndpoints(metadata: OAuthAuthorizationServerMetadata): void {\n assertNoAccessTokenInUrl(metadata.authorization_endpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(metadata.token_endpoint, \"Token endpoint\");\n assertSecureUrl(metadata.authorization_endpoint, \"Authorization endpoint\");\n assertSecureUrl(metadata.token_endpoint, \"Token endpoint\");\n\n if (metadata.registration_endpoint !== undefined) {\n assertNoAccessTokenInUrl(metadata.registration_endpoint, \"Registration endpoint\");\n assertSecureUrl(metadata.registration_endpoint, \"Registration endpoint\");\n }\n}\n\nfunction assertNoAccessTokenInUrl(value: string | URL, label: string): void {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\n\nfunction assertRequestMatchesResource(requestUrl: string, resource: string): void {\n if (requestUrl !== resource) {\n throw new Error(\n `OAuth request URL ${requestUrl} does not match discovered resource ${resource}`\n );\n }\n}\n\nfunction buildClientRegistrationBody(\n metadata: OAuthClientMetadata | undefined,\n redirectUri: string\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n };\n\n if (metadata?.clientName !== undefined && metadata.clientName.length > 0) {\n body.client_name = metadata.clientName;\n }\n\n if (metadata?.scope !== undefined && metadata.scope.length > 0) {\n body.scope = metadata.scope;\n }\n\n if (metadata?.softwareId !== undefined && metadata.softwareId.length > 0) {\n body.software_id = metadata.softwareId;\n }\n\n if (metadata?.softwareVersion !== undefined && metadata.softwareVersion.length > 0) {\n body.software_version = metadata.softwareVersion;\n }\n\n return body;\n}\n\nfunction toStoredDiscovery(discovery: OAuthDiscoveryResult): StoredOAuthSession[\"discovery\"] {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata,\n };\n}\n\ninterface ResolvedOAuthClient {\n kind: \"dynamic\" | \"static\";\n fromStoredRegistration: boolean;\n client: StoredOAuthSession[\"client\"];\n}\n\nfunction shouldReRegisterStoredDynamicClient(\n error: unknown,\n client: ResolvedOAuthClient | StoredOAuthSession[\"client\"] | null,\n alreadyAttempted: boolean\n): boolean {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n\n if (client === null) {\n return false;\n }\n\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n\n return true;\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\n\nexport interface OAuthLandingPage {\n title: string;\n body: string;\n}\n\nexport interface LoopbackAuthorizationOptions {\n openBrowser?: (url: string) => Promise<void>;\n readLine?: () => Promise<string>;\n createServer?: () => http.Server;\n landingPage?: OAuthLandingPage;\n callbackPath?: string;\n}\n\nexport interface LoopbackAuthorizationSession {\n redirectUri: string;\n waitForCode(authorizationUrl: string): Promise<string>;\n close(): void;\n}\n\nexport async function createLoopbackAuthorizationSession(\n options: LoopbackAuthorizationOptions = {}\n): Promise<LoopbackAuthorizationSession> {\n const callbackPath = options.callbackPath ?? \"/callback\";\n const server = options.createServer ? options.createServer() : http.createServer();\n const port = await startServer(server);\n const redirectUri = `http://127.0.0.1:${port}${callbackPath}`;\n\n return {\n redirectUri,\n async waitForCode(authorizationUrl: string): Promise<string> {\n return waitForAuthorizationCode(server, authorizationUrl, options, callbackPath);\n },\n close(): void {\n server.closeAllConnections?.();\n server.close();\n },\n };\n}\n\nasync function startServer(server: http.Server): Promise<number> {\n return new Promise<number>((resolve) => {\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address() as { port: number };\n resolve(address.port);\n });\n });\n}\n\nfunction waitForAuthorizationCode(\n server: http.Server,\n authorizationUrl: string,\n options: LoopbackAuthorizationOptions,\n callbackPath: string\n): Promise<string> {\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (!settled) {\n settled = true;\n fn();\n }\n };\n\n server.on(\"request\", (req: http.IncomingMessage, res: http.ServerResponse) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname !== callbackPath) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const error = url.searchParams.get(\"error\");\n if (error !== null) {\n const description = url.searchParams.get(\"error_description\") ?? error;\n res.writeHead(400);\n res.end(`Authorization failed: ${description}`);\n settle(() => reject(new Error(`OAuth authorization failed: ${error} \u2014 ${description}`)));\n return;\n }\n\n try {\n const code = validateAuthorizationCallbackParameters({\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\"),\n }, expectedAuthorization);\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n });\n\n if (options.readLine !== undefined) {\n options.readLine().then((input) => {\n const callbackParameters = extractCallbackParametersFromInput(input);\n if (callbackParameters === null) {\n settle(() => reject(new Error(\"OAuth callback missing authorization code\")));\n return;\n }\n\n try {\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n settle(() => resolve(code));\n } catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n }).catch(() => undefined);\n }\n\n if (options.openBrowser !== undefined) {\n options.openBrowser(authorizationUrl).catch((error) => {\n settle(() => reject(error));\n });\n }\n });\n}\n\nexport function extractCodeFromInput(input: string): string | null {\n return extractCallbackParametersFromInput(input)?.code ?? null;\n}\n\nfunction extractCallbackParametersFromInput(input: string):\n | { code: string | null; state: string | null; iss: string | null }\n | null {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\"),\n };\n } catch {\n return {\n code: trimmed,\n state: null,\n iss: null,\n };\n }\n}\n\nfunction readExpectedAuthorizationCallback(authorizationUrl: string): {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n} {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false,\n };\n}\n\nfunction validateAuthorizationCallbackParameters(\n callback: {\n code: string | null;\n state: string | null;\n iss: string | null;\n },\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): string {\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n\n if (\n callback.iss !== null\n && callback.iss.length > 0\n && expected.issuer !== null\n && callback.iss !== expected.issuer\n ) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n\n return callback.code;\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll(\"\\\"\", \"&quot;\");\n}\n\nexport function buildSuccessPage(landingPage?: OAuthLandingPage): string {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n \"<body style=\\\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\\\">\",\n \"<div style=\\\"text-align:center\\\">\",\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\",\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\n\ninterface AuthorizationStatePayload {\n v: 1;\n n: string;\n i: string;\n r: boolean;\n}\n\nexport function createAuthorizationState(input: {\n issuer: string;\n requireIssuer: boolean;\n}): string {\n const payload: AuthorizationStatePayload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\n\nexport function parseAuthorizationState(\n value: string | null\n): { issuer: string; requireIssuer: boolean } | null {\n if (value === null || value.length === 0) {\n return null;\n }\n\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded) as Partial<AuthorizationStatePayload>;\n if (\n parsed.v !== 1\n || typeof parsed.n !== \"string\"\n || parsed.n.length === 0\n || typeof parsed.i !== \"string\"\n || parsed.i.length === 0\n || typeof parsed.r !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n issuer: parsed.i,\n requireIssuer: parsed.r,\n };\n } catch {\n return null;\n }\n}\n", "import crypto from \"node:crypto\";\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "import type {\n OAuthMetadataFetch,\n StoredOAuthTokens,\n} from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\ninterface OAuthErrorShape {\n error: string;\n error_description?: string;\n error_uri?: string;\n}\n\nexport class OAuthError extends Error {\n readonly error: string;\n readonly errorDescription: string | undefined;\n readonly errorUri: string | undefined;\n readonly error_description: string | undefined;\n readonly error_uri: string | undefined;\n readonly status: number;\n readonly retryable: boolean;\n readonly terminal: boolean;\n\n constructor(shape: OAuthErrorShape, status: number) {\n super(shape.error_description ?? shape.error);\n this.name = \"OAuthError\";\n this.error = shape.error;\n this.errorDescription = shape.error_description;\n this.errorUri = shape.error_uri;\n this.error_description = shape.error_description;\n this.error_uri = shape.error_uri;\n this.status = status;\n this.retryable = isRetryableOAuthError(this);\n this.terminal = !this.retryable;\n }\n}\n\nexport function isRetryableOAuthError(error: unknown): error is OAuthError {\n return (\n error instanceof OAuthError\n && (\n error.status >= 500\n || error.error === \"server_error\"\n || error.error === \"temporarily_unavailable\"\n )\n );\n}\n\nexport async function exchangeAuthorizationCode(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n resource,\n },\n fetch: input.fetch,\n now: input.now,\n });\n}\n\nexport async function refreshAccessToken(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n refreshToken: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"refresh_token\",\n refresh_token: input.refreshToken,\n resource,\n },\n fetch: input.fetch,\n now: input.now,\n });\n}\n\nasync function requestTokens(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n params: Record<string, string>;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const body = new URLSearchParams({\n client_id: input.clientId,\n ...input.params,\n });\n\n if (input.clientSecret !== undefined) {\n body.set(\"client_secret\", input.clientSecret);\n }\n\n const response = await input.fetch(input.tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n const payload = await readOAuthJsonObjectResponse(response);\n\n if (typeof payload.access_token !== \"string\" || payload.access_token.length === 0) {\n throw new Error(\"OAuth token response missing access_token\");\n }\n\n const tokenType = normalizeBearerTokenType(payload.token_type);\n if (tokenType === null) {\n throw new Error(\"OAuth token response missing token_type=Bearer\");\n }\n\n return {\n accessToken: payload.access_token,\n refreshToken:\n typeof payload.refresh_token === \"string\" && payload.refresh_token.length > 0\n ? payload.refresh_token\n : undefined,\n tokenType,\n expiresAt:\n typeof payload.expires_in === \"number\" && Number.isFinite(payload.expires_in)\n ? input.now() + (payload.expires_in * 1000)\n : null,\n scope:\n typeof payload.scope === \"string\" && payload.scope.length > 0\n ? payload.scope\n : undefined,\n };\n}\n\nexport async function readOAuthJsonObjectResponse(\n response: Response\n): Promise<Record<string, unknown>> {\n const fallbackError = createFallbackOAuthError(response.status);\n let payload: unknown;\n\n try {\n payload = await response.json();\n } catch {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n const record = payload as Record<string, unknown>;\n if (!response.ok) {\n throw new OAuthError(readOAuthError(record, fallbackError.error), response.status);\n }\n\n return record;\n}\n\nfunction readOAuthError(\n payload: Record<string, unknown>,\n fallbackError = \"server_error\"\n): OAuthErrorShape {\n return {\n error: typeof payload.error === \"string\" ? payload.error : fallbackError,\n error_description:\n typeof payload.error_description === \"string\"\n ? payload.error_description\n : undefined,\n error_uri:\n typeof payload.error_uri === \"string\"\n ? payload.error_uri\n : undefined,\n };\n}\n\nfunction createFallbackOAuthError(status: number): OAuthError {\n const error = status === 503 ? \"temporarily_unavailable\" : \"server_error\";\n return new OAuthError({ error }, status);\n}\n\nfunction normalizeBearerTokenType(value: unknown): \"Bearer\" | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n return value.toLowerCase() === \"bearer\" ? \"Bearer\" : null;\n}\n", "import {\n decodeProtectedHeader,\n errors,\n importJWK,\n jwtVerify,\n type JSONWebKeySet,\n type JWK,\n type JWTPayload,\n} from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\",\n] as const;\n\ntype FetchLike = typeof fetch;\ntype BearerChallengeErrorCode = \"invalid_token\" | \"insufficient_scope\";\n\nexport interface JwksTokenVerifierOptions {\n jwksUrl: string | URL;\n clockSkewSeconds?: number;\n allowedAlgorithms?: readonly string[];\n fetch?: FetchLike;\n}\n\nexport interface JwksVerifiedAccessToken {\n token: string;\n issuer: string;\n audience: string[];\n scopes: string[];\n expiresAt: number;\n claims: Record<string, unknown>;\n subject?: string;\n clientId?: string;\n}\n\nexport interface JwksTokenVerifier {\n verify(input: {\n token: string;\n resource: string;\n authorizationServers: readonly string[];\n requiredScopes: readonly string[];\n }): Promise<JwksVerifiedAccessToken>;\n}\n\ntype TokenVerificationErrorShape = Error & {\n error: BearerChallengeErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n};\n\nfunction isTokenVerificationErrorShape(\n error: unknown\n): error is TokenVerificationErrorShape {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const challengeError = error as { error?: unknown };\n return challengeError.error === \"invalid_token\"\n || challengeError.error === \"insufficient_scope\";\n}\n\nfunction isObjectRecord(\n value: unknown\n): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction toUrl(value: string | URL, label: string): URL {\n try {\n return new URL(String(value));\n } catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\n\nfunction normalizeAudience(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n return isStringArray(value) ? [...value] : [];\n}\n\nfunction normalizeVerifiedAudience(\n value: unknown,\n expectedResource: string\n): string[] {\n const audiences = normalizeAudience(value);\n if (audiences.length !== 1) {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n\n let normalizedAudience: string;\n\n try {\n normalizedAudience = canonicalizeResourceIndicator(audiences[0] ?? \"\");\n } catch {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n\n if (normalizedAudience !== expectedResource) {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n\n return [normalizedAudience];\n}\n\nfunction parseScopes(payload: JWTPayload): string[] {\n const raw =\n typeof payload.scope === \"string\"\n ? payload.scope\n : typeof payload.scopes === \"string\"\n ? payload.scopes\n : null;\n\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n\n return isStringArray(payload.scopes) ? [...payload.scopes] : [];\n}\n\nfunction toVerifiedAccessToken(\n token: string,\n payload: JWTPayload,\n audience = normalizeAudience(payload.aud)\n): JwksVerifiedAccessToken {\n return {\n token,\n issuer: typeof payload.iss === \"string\" ? payload.iss : \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: typeof payload.exp === \"number\" ? payload.exp : 0,\n claims: { ...payload },\n ...(typeof payload.sub === \"string\"\n ? {\n subject: payload.sub,\n }\n : {}),\n ...(typeof payload.client_id === \"string\"\n ? {\n clientId: payload.client_id,\n }\n : {}),\n };\n}\n\nfunction createTokenVerificationError(input: {\n error: BearerChallengeErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n}): TokenVerificationErrorShape {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\n\nfunction createInvalidTokenError(errorDescription: string): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription,\n });\n}\n\nfunction normalizeVerificationError(error: unknown): TokenVerificationErrorShape {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n\n if (error.claim === \"exp\") {\n return createInvalidTokenError(\"token expired\");\n }\n }\n\n if (\n error instanceof errors.JOSEAlgNotAllowed\n || error instanceof errors.JOSENotSupported\n ) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n if (\n error instanceof errors.JWKSNoMatchingKey\n || error instanceof errors.JWKSMultipleMatchingKeys\n || error instanceof errors.JWSSignatureVerificationFailed\n ) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n\n if (error instanceof errors.JWKSInvalid) {\n return createInvalidTokenError(\"invalid JWKS document\");\n }\n\n if (error instanceof errors.JWKSTimeout) {\n return createInvalidTokenError(\"timed out loading JWKS\");\n }\n\n if (error instanceof Error) {\n return createInvalidTokenError(error.message);\n }\n\n return createInvalidTokenError(\"token verification failed\");\n}\n\nasync function loadJwks(\n jwksUrl: URL,\n fetchImplementation: FetchLike\n): Promise<JSONWebKeySet> {\n const response = await fetchImplementation(jwksUrl, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw createInvalidTokenError(`unable to load JWKS (${response.status})`);\n }\n\n const payload = (await response.json()) as unknown;\n if (!isObjectRecord(payload) || !Array.isArray(payload.keys)) {\n throw createInvalidTokenError(\"invalid JWKS document\");\n }\n\n return payload as unknown as JSONWebKeySet;\n}\n\nfunction resolveAlgorithm(\n token: string,\n allowedAlgorithms: readonly string[]\n): string {\n const header = decodeProtectedHeader(token);\n const alg = header.alg;\n\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n\n if (\n typeof alg !== \"string\"\n || alg === \"none\"\n || alg.startsWith(\"HS\")\n || !allowedAlgorithms.includes(alg)\n ) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n return alg;\n}\n\nfunction hasCriticalHeaderClaims(header: ReturnType<typeof decodeProtectedHeader>): boolean {\n return Array.isArray(header.crit) && header.crit.length > 0;\n}\n\nfunction isVerificationCandidate(key: JWK, alg: string, kid: string | undefined): boolean {\n if (kid !== undefined && key.kid !== kid) {\n return false;\n }\n\n if (typeof key.alg === \"string\" && key.alg !== alg) {\n return false;\n }\n\n if (typeof key.use === \"string\" && key.use !== \"sig\") {\n return false;\n }\n\n if (Array.isArray(key.key_ops) && !key.key_ops.includes(\"verify\")) {\n return false;\n }\n\n return true;\n}\n\nfunction shouldContinueWithNextKey(error: unknown): boolean {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\n\nasync function verifyJwtAgainstJwks(input: {\n token: string;\n jwks: JSONWebKeySet;\n alg: string;\n authorizationServers: readonly string[];\n clockSkewSeconds: number;\n}) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = typeof protectedHeader.kid === \"string\" ? protectedHeader.kid : undefined;\n const candidateKeys = input.jwks.keys.filter((key) => isVerificationCandidate(key, input.alg, kid));\n\n if (candidateKeys.length === 0) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n\n let lastSignatureError: unknown;\n\n for (const candidate of candidateKeys) {\n try {\n const key = await importJWK(candidate, input.alg);\n return await jwtVerify(input.token, key as never, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n });\n } catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n\n throw error;\n }\n }\n\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\n\nexport function createJwksTokenVerifier(\n options: JwksTokenVerifierOptions\n): JwksTokenVerifier {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n\n return {\n async verify(input): Promise<JwksVerifiedAccessToken> {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n\n try {\n const jwks = await loadJwks(jwksUrl, fetchImplementation);\n const verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n });\n const audience = normalizeVerifiedAudience(verified.payload.aud, expectedResource);\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n\n if (\n input.requiredScopes.length > 0\n && !accessToken.scopes.some((scope) => input.requiredScopes.includes(scope))\n ) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes],\n });\n }\n\n return accessToken;\n } catch (error) {\n throw normalizeVerificationError(error);\n }\n },\n };\n}\n", "import type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n} from \"mcp-oauth\";\nimport { canonicalizeResourceIndicator } from \"mcp-oauth\";\n\nexport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n};\n\nexport interface OAuthDiscoveryCache {\n get(\n resourceUrl: string\n ): OAuthDiscoveryResult | null | undefined | Promise<OAuthDiscoveryResult | null | undefined>;\n set(resourceUrl: string, value: OAuthDiscoveryResult): void | Promise<void>;\n}\n\nexport interface OAuthMetadataDiscoveryOptions {\n fetch?: OAuthMetadataFetch;\n cache?: OAuthDiscoveryCache;\n}\n\nexport interface OAuthMetadataLookupOptions {\n resourceMetadataUrl?: string | URL;\n}\n\nfunction defaultOAuthMetadataFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\n\nfunction assertSecureUrl(url: URL, label: string): void {\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction validateProtectedResourceMetadata(\n value: unknown,\n resourceUrl: string\n): OAuthProtectedResourceMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Protected resource metadata must be a JSON object\");\n }\n\n if (typeof value.resource !== \"string\" || value.resource.length === 0) {\n throw new Error(\"Protected resource metadata must include a resource string\");\n }\n\n const normalizedResource = canonicalizeResourceIndicator(value.resource);\n\n if (normalizedResource !== resourceUrl) {\n throw new Error(\n `Protected resource metadata resource mismatch: expected ${resourceUrl}, received ${value.resource}`\n );\n }\n\n if (!isStringArray(value.authorization_servers) || value.authorization_servers.length === 0) {\n throw new Error(\n \"Protected resource metadata must include a non-empty authorization_servers array\"\n );\n }\n\n return {\n ...value,\n resource: normalizedResource,\n } as OAuthProtectedResourceMetadata;\n}\n\nfunction validateAuthorizationServerMetadata(\n value: unknown,\n issuer: string\n): OAuthAuthorizationServerMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Authorization server metadata must be a JSON object\");\n }\n\n if (typeof value.issuer !== \"string\" || value.issuer.length === 0) {\n throw new Error(\"Authorization server metadata must include issuer\");\n }\n\n if (value.issuer !== issuer) {\n throw new Error(\n `Authorization server metadata issuer mismatch: expected ${issuer}, received ${value.issuer}`\n );\n }\n\n if (\n typeof value.authorization_endpoint !== \"string\" ||\n value.authorization_endpoint.length === 0\n ) {\n throw new Error(\"Authorization server metadata must include authorization_endpoint\");\n }\n\n if (typeof value.token_endpoint !== \"string\" || value.token_endpoint.length === 0) {\n throw new Error(\"Authorization server metadata must include token_endpoint\");\n }\n\n if (\n !isStringArray(value.response_types_supported) ||\n !value.response_types_supported.includes(\"code\")\n ) {\n throw new Error(\n \"Authorization server metadata must include response_types_supported containing code\"\n );\n }\n\n if (\n !isStringArray(value.code_challenge_methods_supported) ||\n !value.code_challenge_methods_supported.includes(\"S256\")\n ) {\n throw new Error(\n \"Authorization server metadata must include code_challenge_methods_supported containing S256\"\n );\n }\n\n return value as OAuthAuthorizationServerMetadata;\n}\n\nasync function readJsonResponse(response: Response, label: string): Promise<unknown> {\n if (!response.ok) {\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n throw new Error(`${label} request failed (${statusDescriptor})`);\n }\n\n try {\n return await response.json();\n } catch {\n throw new Error(`${label} response must be valid JSON`);\n }\n}\n\nfunction resolveWellKnownMetadataUrl(inputUrl: string | URL, suffix: string): string {\n const url = new URL(typeof inputUrl === \"string\" ? inputUrl : inputUrl.toString());\n\n const resourcePath = url.pathname === \"/\" ? \"\" : url.pathname;\n url.pathname = `/.well-known/${suffix}${resourcePath}`;\n\n return url.toString();\n}\n\nexport function resolveProtectedResourceMetadataUrl(\n resourceUrl: string | URL,\n resourceMetadataUrl?: string | URL\n): string {\n const resource = new URL(canonicalizeResourceIndicator(resourceUrl));\n assertSecureUrl(resource, \"Protected resource URL\");\n\n if (resourceMetadataUrl !== undefined) {\n const resolvedResourceMetadataUrl = new URL(\n typeof resourceMetadataUrl === \"string\" ? resourceMetadataUrl : resourceMetadataUrl.toString(),\n resource\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n }\n\n const resolvedResourceMetadataUrl = new URL(\n resolveWellKnownMetadataUrl(resource, \"oauth-protected-resource\")\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n}\n\nfunction normalizeAuthorizationServerIssuer(issuer: string | URL): string {\n const input = typeof issuer === \"string\" ? issuer : issuer.toString();\n const url = new URL(input);\n if (url.search.length > 0 || url.hash.length > 0) {\n throw new Error(\"Authorization server issuer must not include query or fragment\");\n }\n\n assertSecureUrl(url, \"Authorization server issuer\");\n\n if (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) {\n url.pathname = url.pathname.slice(0, -1);\n }\n\n return url.pathname === \"/\" ? url.origin : url.toString();\n}\n\nexport function resolveAuthorizationServerMetadataUrl(issuer: string | URL): string {\n return resolveWellKnownMetadataUrl(\n normalizeAuthorizationServerIssuer(issuer),\n \"oauth-authorization-server\"\n );\n}\n\nexport class OAuthMetadataDiscovery {\n private readonly fetchImpl: OAuthMetadataFetch;\n private readonly cache: OAuthDiscoveryCache | undefined;\n private readonly memoryCache = new Map<string, OAuthDiscoveryResult>();\n\n constructor({ fetch = defaultOAuthMetadataFetch, cache }: OAuthMetadataDiscoveryOptions = {}) {\n this.fetchImpl = fetch;\n this.cache = cache;\n }\n\n async discover(\n resourceUrl: string | URL,\n { resourceMetadataUrl }: OAuthMetadataLookupOptions = {}\n ): Promise<OAuthDiscoveryResult> {\n const cacheKey = canonicalizeResourceIndicator(resourceUrl);\n const resourceMetadataLocation = resolveProtectedResourceMetadataUrl(\n cacheKey,\n resourceMetadataUrl\n );\n const memoryCachedResult = this.memoryCache.get(cacheKey);\n if (\n memoryCachedResult !== undefined &&\n (resourceMetadataUrl === undefined\n || memoryCachedResult.resourceMetadataUrl === resourceMetadataLocation)\n ) {\n return memoryCachedResult;\n }\n\n const sharedCachedResult = await this.cache?.get(cacheKey);\n if (\n sharedCachedResult !== null &&\n sharedCachedResult !== undefined &&\n (resourceMetadataUrl === undefined\n || sharedCachedResult.resourceMetadataUrl === resourceMetadataLocation)\n ) {\n this.memoryCache.set(cacheKey, sharedCachedResult);\n return sharedCachedResult;\n }\n\n const resourceMetadataResponse = await this.fetchImpl(resourceMetadataLocation, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const resourceMetadata = validateProtectedResourceMetadata(\n await readJsonResponse(resourceMetadataResponse, \"Protected resource metadata\"),\n cacheKey\n );\n\n const authorizationServerErrors: string[] = [];\n\n for (const authorizationServer of resourceMetadata.authorization_servers) {\n const normalizedAuthorizationServer = normalizeAuthorizationServerIssuer(\n authorizationServer\n );\n const authorizationServerMetadataUrl =\n resolveAuthorizationServerMetadataUrl(normalizedAuthorizationServer);\n\n try {\n const authorizationServerResponse = await this.fetchImpl(authorizationServerMetadataUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n await readJsonResponse(\n authorizationServerResponse,\n \"Authorization server metadata\"\n ),\n normalizedAuthorizationServer\n );\n\n const result: OAuthDiscoveryResult = {\n resource: resourceMetadata.resource,\n resourceMetadataUrl: resourceMetadataLocation,\n resourceMetadata,\n authorizationServer: normalizedAuthorizationServer,\n authorizationServerMetadataUrl,\n authorizationServerMetadata,\n };\n\n this.memoryCache.set(cacheKey, result);\n await this.cache?.set(cacheKey, result);\n return result;\n } catch (error) {\n authorizationServerErrors.push(\n `${authorizationServerMetadataUrl}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n throw new Error(\n `Unable to load authorization server metadata for ${cacheKey}: ${authorizationServerErrors.join(\n \"; \"\n )}`\n );\n }\n}\n\nexport async function discoverOAuthMetadata(\n resourceUrl: string | URL,\n options: OAuthMetadataDiscoveryOptions & OAuthMetadataLookupOptions = {}\n): Promise<OAuthDiscoveryResult> {\n const discovery = new OAuthMetadataDiscovery(options);\n return discovery.discover(resourceUrl, options);\n}\n\nfunction skipOptionalWhitespace(value: string, start: number): number {\n let index = start;\n while (index < value.length && (value[index] === \" \" || value[index] === \"\\t\")) {\n index += 1;\n }\n return index;\n}\n\nfunction readToken(value: string, start: number): { token: string; nextIndex: number } | null {\n let index = start;\n while (index < value.length) {\n const character = value[index];\n if (\n character === \" \"\n || character === \"\\t\"\n || character === \",\"\n || character === \"=\"\n || character === \"\\\"\"\n ) {\n break;\n }\n index += 1;\n }\n\n if (index === start) {\n return null;\n }\n\n return {\n token: value.slice(start, index),\n nextIndex: index,\n };\n}\n\nfunction looksLikeAuthParam(value: string, start: number): boolean {\n const token = readToken(value, start);\n if (token === null) {\n return false;\n }\n\n return value[skipOptionalWhitespace(value, token.nextIndex)] === \"=\";\n}\n\nfunction isToken68Character(character: string): boolean {\n return (\n (character >= \"a\" && character <= \"z\")\n || (character >= \"A\" && character <= \"Z\")\n || (character >= \"0\" && character <= \"9\")\n || character === \"-\"\n || character === \".\"\n || character === \"_\"\n || character === \"~\"\n || character === \"+\"\n || character === \"/\"\n );\n}\n\nfunction readToken68(\n value: string,\n start: number\n): { token68: string; nextIndex: number } | null {\n let nextIndex = start;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n const token68 = value.slice(start, nextIndex);\n if (token68.length === 0) {\n return null;\n }\n\n let index = 0;\n while (index < token68.length && isToken68Character(token68[index]!)) {\n index += 1;\n }\n\n if (index === 0) {\n return null;\n }\n\n while (index < token68.length && token68[index] === \"=\") {\n index += 1;\n }\n\n if (index !== token68.length) {\n return null;\n }\n\n return { token68, nextIndex };\n}\n\nfunction readQuotedString(\n value: string,\n start: number\n): { parsedValue: string; nextIndex: number } | null {\n if (value[start] !== \"\\\"\") {\n return null;\n }\n\n let parsedValue = \"\";\n let index = start + 1;\n let escaping = false;\n\n while (index < value.length) {\n const character = value[index];\n if (escaping) {\n parsedValue += character;\n escaping = false;\n index += 1;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n index += 1;\n continue;\n }\n\n if (character === \"\\\"\") {\n return {\n parsedValue,\n nextIndex: index + 1,\n };\n }\n\n parsedValue += character;\n index += 1;\n }\n\n return null;\n}\n\nfunction parseAuthParam(\n value: string,\n start: number\n): { name: string; value: string; nextIndex: number } | null {\n const token = readToken(value, start);\n if (token === null) {\n return null;\n }\n\n let index = skipOptionalWhitespace(value, token.nextIndex);\n if (value[index] !== \"=\") {\n return null;\n }\n\n index = skipOptionalWhitespace(value, index + 1);\n if (index >= value.length) {\n return null;\n }\n\n const quotedValue = readQuotedString(value, index);\n if (quotedValue !== null) {\n return {\n name: token.token,\n value: quotedValue.parsedValue,\n nextIndex: quotedValue.nextIndex,\n };\n }\n\n let nextIndex = index;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n return {\n name: token.token,\n value: value.slice(index, nextIndex),\n nextIndex,\n };\n}\n\nexport function parseBearerWwwAuthenticateHeader(\n headerValue: string | null\n): OAuthUnauthorizedChallenge | null {\n if (headerValue === null) {\n return null;\n }\n\n let index = 0;\n let firstBearerChallenge: OAuthUnauthorizedChallenge | null = null;\n\n while (index < headerValue.length) {\n index = skipOptionalWhitespace(headerValue, index);\n while (headerValue[index] === \",\") {\n index = skipOptionalWhitespace(headerValue, index + 1);\n }\n\n const scheme = readToken(headerValue, index);\n if (scheme === null) {\n break;\n }\n\n index = skipOptionalWhitespace(headerValue, scheme.nextIndex);\n const params: Record<string, string> = {};\n\n if (index < headerValue.length && headerValue[index] !== \",\") {\n const token68 = readToken68(headerValue, index);\n if (token68 !== null) {\n index = token68.nextIndex;\n } else if (looksLikeAuthParam(headerValue, index)) {\n while (index < headerValue.length) {\n const parsedParam = parseAuthParam(headerValue, index);\n if (parsedParam === null) {\n break;\n }\n\n params[parsedParam.name] = parsedParam.value;\n index = skipOptionalWhitespace(headerValue, parsedParam.nextIndex);\n\n if (headerValue[index] !== \",\") {\n break;\n }\n\n const nextIndex = skipOptionalWhitespace(headerValue, index + 1);\n if (!looksLikeAuthParam(headerValue, nextIndex)) {\n index = nextIndex;\n break;\n }\n\n index = nextIndex;\n }\n }\n }\n\n if (scheme.token.toLowerCase() === \"bearer\") {\n const challenge: OAuthUnauthorizedChallenge = {\n scheme: \"Bearer\",\n params,\n raw: headerValue,\n };\n if (Object.keys(params).length > 0) {\n return challenge;\n }\n\n firstBearerChallenge ??= challenge;\n }\n\n if (headerValue[index] === \",\") {\n index += 1;\n }\n }\n\n return firstBearerChallenge;\n}\n", "import { S } from \"toolcraft-schema\";\nimport type { AnySchema, ObjectSchema } from \"toolcraft-schema\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\" | \"null\";\ntype PrimitiveEnumValue = string | number | boolean;\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport interface JsonSchema {\n $defs?: Record<string, JsonSchema>;\n $ref?: string;\n additionalProperties?: boolean | JsonSchema;\n anyOf?: readonly JsonSchema[];\n const?: unknown;\n default?: unknown;\n description?: string;\n enum?: readonly unknown[];\n items?: JsonSchema;\n nullable?: boolean;\n oneOf?: readonly JsonSchema[];\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: readonly string[];\n type?: JsonSchemaType | readonly JsonSchemaType[];\n}\n\ninterface NormalizedJsonSchema {\n schema: JsonSchema;\n nullable: boolean;\n}\n\nexport function convertJsonSchema(schema: JsonSchema): AnySchema {\n if (hasSelfReferencingRef(schema, schema)) {\n return applyMetadata(S.Json(), schema, {\n nullable: schema.nullable === true,\n });\n }\n\n return convertSchema(schema, schema);\n}\n\nfunction convertSchema(schema: JsonSchema, root: JsonSchema): AnySchema {\n const resolvedSchema = resolveReferencedSchema(schema, root);\n const normalizedSchema = normalizeNullability(resolvedSchema);\n const composition = normalizedSchema.schema.oneOf ?? normalizedSchema.schema.anyOf;\n\n if (Array.isArray(normalizedSchema.schema.type)) {\n throw new Error(\n `Unsupported JSON Schema type array: ${JSON.stringify(normalizedSchema.schema.type)}.`\n );\n }\n\n if (resolvedSchema.const !== undefined) {\n return convertConstSchema(resolvedSchema, normalizedSchema.nullable);\n }\n\n if (resolvedSchema.enum !== undefined) {\n return convertEnumSchema(resolvedSchema, normalizedSchema.nullable);\n }\n\n if (composition !== undefined) {\n return convertCompositionSchema(normalizedSchema.schema, root, normalizedSchema.nullable);\n }\n\n if (isRecordSchema(normalizedSchema.schema)) {\n return applyMetadata(\n S.Record(convertSchema(normalizedSchema.schema.additionalProperties as JsonSchema, root)),\n normalizedSchema.schema,\n {\n nullable: normalizedSchema.nullable,\n }\n );\n }\n\n switch (normalizedSchema.schema.type) {\n case \"string\":\n return S.String({\n ...createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getStringDefault(normalizedSchema.schema.default)\n ),\n ...(normalizedSchema.schema.pattern === undefined\n ? {}\n : { pattern: normalizedSchema.schema.pattern }),\n });\n\n case \"number\":\n return S.Number(\n createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getNumberDefault(normalizedSchema.schema.default)\n )\n );\n\n case \"integer\":\n return S.Number({\n ...createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getIntegerDefault(normalizedSchema.schema.default)\n ),\n jsonType: \"integer\",\n });\n\n case \"boolean\":\n return S.Boolean(\n createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getBooleanDefault(normalizedSchema.schema.default)\n )\n );\n\n case \"array\":\n if (normalizedSchema.schema.items === undefined) {\n throw new Error('JSON Schema arrays must define \"items\".');\n }\n\n return S.Array(\n convertSchema(normalizedSchema.schema.items, root),\n createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getArrayDefault(normalizedSchema.schema.default)\n )\n );\n\n case \"object\":\n return convertObjectSchema(normalizedSchema.schema, root, {\n nullable: normalizedSchema.nullable,\n });\n\n case \"null\":\n return applyMetadata(S.Json(), normalizedSchema.schema, {\n default: getJsonDefault(normalizedSchema.schema.default) ?? null,\n nullable: true,\n });\n\n case undefined:\n if (normalizedSchema.nullable) {\n return applyMetadata(S.Json(), normalizedSchema.schema, {\n nullable: true,\n });\n }\n\n throw new Error(\"Unsupported JSON Schema: missing type, enum, const, or composition.\");\n }\n\n throw new Error(`Unsupported JSON Schema type: ${JSON.stringify(normalizedSchema.schema.type)}.`);\n}\n\nfunction convertConstSchema(schema: JsonSchema, nullable: boolean): AnySchema {\n if (isPrimitiveEnumValue(schema.const)) {\n return S.Enum([schema.const] as [PrimitiveEnumValue], {\n ...createCommonOptions(schema, nullable, schema.const),\n default: schema.const,\n ...(schema.type === \"integer\" && typeof schema.const === \"number\"\n ? { jsonType: \"integer\" as const }\n : {}),\n });\n }\n\n return applyMetadata(S.Json(), schema, {\n default: schema.const as JsonValue,\n nullable: nullable || schema.const === null,\n description: appendDescription(\n schema.description,\n `Constant JSON value: ${JSON.stringify(schema.const)}.`\n ),\n });\n}\n\nfunction convertEnumSchema(schema: JsonSchema, nullable: boolean): AnySchema {\n const values = schema.enum ?? [];\n const nonNullValues = values.filter((value) => value !== null);\n const hasNull = nonNullValues.length !== values.length;\n\n if (nonNullValues.every(isPrimitiveEnumValue) && nonNullValues.length > 0) {\n return S.Enum(nonNullValues as [PrimitiveEnumValue, ...PrimitiveEnumValue[]], {\n ...createCommonOptions(\n schema,\n nullable || hasNull,\n getPrimitiveEnumDefault(schema.default, nonNullValues)\n ),\n ...(schema.type === \"integer\" && nonNullValues.every((value) => Number.isInteger(value))\n ? { jsonType: \"integer\" as const }\n : {}),\n });\n }\n\n return applyMetadata(S.Json(), schema, {\n nullable: nullable || hasNull,\n description: appendDescription(\n schema.description,\n `Allowed JSON values: ${values.map((value) => JSON.stringify(value)).join(\", \")}.`\n ),\n });\n}\n\nfunction convertCompositionSchema(\n schema: JsonSchema,\n root: JsonSchema,\n nullable: boolean\n): AnySchema {\n const branches = [...(schema.oneOf ?? schema.anyOf ?? [])].map((branch) =>\n resolveReferencedSchema(branch, root)\n );\n const discriminator = findDiscriminator(branches, root);\n\n if (discriminator !== undefined) {\n const convertedBranches = Object.fromEntries(\n branches.map((branch) => [\n getDiscriminatorLiteral(branch, discriminator, root),\n convertObjectSchema(branch, root, {\n omitProperty: discriminator,\n }),\n ])\n );\n\n return applyMetadata(\n S.OneOf({\n discriminator,\n branches: convertedBranches,\n }),\n schema,\n {\n nullable,\n }\n );\n }\n\n return applyMetadata(\n S.Union(branches.map((branch) => convertObjectSchema(branch, root, {}))),\n schema,\n {\n nullable,\n }\n );\n}\n\nfunction convertObjectSchema(\n schema: JsonSchema,\n root: JsonSchema,\n options: {\n nullable?: boolean;\n omitProperty?: string;\n }\n): ObjectSchema<any> {\n const resolvedSchema = resolveReferencedSchema(schema, root);\n const normalizedSchema = normalizeNullability(resolvedSchema);\n const properties = normalizedSchema.schema.properties ?? {};\n const requiredKeys = new Set(normalizedSchema.schema.required ?? []);\n const shape: Record<string, AnySchema> = {};\n\n if (normalizedSchema.schema.type !== \"object\" && normalizedSchema.schema.properties === undefined) {\n throw new Error(\"Expected an object schema branch.\");\n }\n\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (key === options.omitProperty) {\n continue;\n }\n\n const convertedProperty = convertSchema(propertySchema, root);\n shape[key] = requiredKeys.has(key) ? convertedProperty : S.Optional(convertedProperty);\n }\n\n return applyMetadata(\n S.Object(shape, {\n ...(typeof normalizedSchema.schema.additionalProperties === \"boolean\"\n ? { additionalProperties: normalizedSchema.schema.additionalProperties }\n : {}),\n }),\n normalizedSchema.schema,\n {\n nullable: options.nullable ?? normalizedSchema.nullable,\n }\n );\n}\n\nfunction createCommonOptions<TDefault>(\n schema: JsonSchema,\n nullable: boolean,\n defaultValue?: TDefault\n): {\n default?: TDefault;\n description?: string;\n nullable?: boolean;\n} {\n return {\n ...(schema.description === undefined ? {} : { description: schema.description }),\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n ...(nullable ? { nullable: true } : {}),\n };\n}\n\nfunction applyMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n source: JsonSchema,\n overrides: {\n default?: JsonValue;\n description?: string;\n nullable?: boolean;\n }\n): TSchema {\n const result = { ...schema } as TSchema & {\n default?: unknown;\n description?: string;\n nullable?: boolean;\n };\n const description = overrides.description ?? source.description;\n const hasDefaultOverride = Object.prototype.hasOwnProperty.call(overrides, \"default\");\n const defaultValue = hasDefaultOverride ? overrides.default : source.default;\n\n if (description !== undefined) {\n result.description = description;\n }\n\n if (defaultValue !== undefined) {\n result.default = defaultValue;\n }\n\n if (overrides.nullable === true) {\n result.nullable = true;\n }\n\n return result;\n}\n\nfunction normalizeNullability(schema: JsonSchema): NormalizedJsonSchema {\n if (!Array.isArray(schema.type)) {\n return {\n schema,\n nullable: schema.nullable === true,\n };\n }\n\n const nextTypes = schema.type.filter((value) => value !== \"null\");\n\n if (nextTypes.length === schema.type.length) {\n return {\n schema,\n nullable: schema.nullable === true,\n };\n }\n\n return {\n schema: {\n ...schema,\n type:\n nextTypes.length === 0 ? undefined : nextTypes.length === 1 ? nextTypes[0] : nextTypes,\n nullable: undefined,\n },\n nullable: true,\n };\n}\n\nfunction isRecordSchema(schema: JsonSchema): boolean {\n const propertyKeys = Object.keys(schema.properties ?? {});\n\n return (\n schema.type === \"object\" &&\n propertyKeys.length === 0 &&\n typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null\n );\n}\n\nfunction findDiscriminator(branches: JsonSchema[], root: JsonSchema): string | undefined {\n const [firstBranch] = branches;\n\n if (firstBranch === undefined) {\n throw new Error(\"JSON Schema composition requires at least one branch.\");\n }\n\n const candidateKeys = Object.keys(firstBranch.properties ?? {});\n\n for (const candidate of candidateKeys) {\n const values: string[] = [];\n let matches = true;\n\n for (const branch of branches) {\n const requiredKeys = new Set(branch.required ?? []);\n\n if (!requiredKeys.has(candidate)) {\n matches = false;\n break;\n }\n\n const literal = getDiscriminatorLiteral(branch, candidate, root);\n\n if (literal === undefined) {\n matches = false;\n break;\n }\n\n values.push(literal);\n }\n\n if (matches && new Set(values).size === values.length) {\n return candidate;\n }\n }\n\n return undefined;\n}\n\nfunction getDiscriminatorLiteral(\n branch: JsonSchema,\n key: string,\n root: JsonSchema\n): string | undefined {\n const propertySchema = branch.properties?.[key];\n\n if (propertySchema === undefined) {\n return undefined;\n }\n\n const resolvedProperty = resolveReferencedSchema(propertySchema, root);\n\n if (typeof resolvedProperty.const === \"string\") {\n return resolvedProperty.const;\n }\n\n if (\n resolvedProperty.enum !== undefined &&\n resolvedProperty.enum.length === 1 &&\n typeof resolvedProperty.enum[0] === \"string\"\n ) {\n return resolvedProperty.enum[0];\n }\n\n return undefined;\n}\n\nfunction resolveReferencedSchema(schema: JsonSchema, root: JsonSchema): JsonSchema {\n if (schema.$ref === undefined) {\n return schema;\n }\n\n const resolvedTarget = resolveLocalRef(root, schema.$ref);\n\n if (resolvedTarget === undefined) {\n throw new Error(`Unsupported JSON Schema $ref: ${JSON.stringify(schema.$ref)}.`);\n }\n\n const { $ref: ignoredRef, ...siblingKeywords } = schema;\n void ignoredRef;\n const resolvedSchema = resolveReferencedSchema(resolvedTarget, root);\n\n if (Object.keys(siblingKeywords).length === 0) {\n return resolvedSchema;\n }\n\n return mergeJsonSchemas(resolvedSchema, siblingKeywords);\n}\n\nfunction mergeJsonSchemas(base: JsonSchema, overlay: JsonSchema): JsonSchema {\n const mergedProperties =\n base.properties === undefined && overlay.properties === undefined\n ? undefined\n : {\n ...(base.properties ?? {}),\n ...(overlay.properties ?? {}),\n };\n const mergedDefs =\n base.$defs === undefined && overlay.$defs === undefined\n ? undefined\n : {\n ...(base.$defs ?? {}),\n ...(overlay.$defs ?? {}),\n };\n const mergedRequired =\n base.required === undefined && overlay.required === undefined\n ? undefined\n : [...new Set([...(base.required ?? []), ...(overlay.required ?? [])])];\n\n return {\n ...base,\n ...overlay,\n ...(mergedDefs === undefined ? {} : { $defs: mergedDefs }),\n ...(mergedProperties === undefined ? {} : { properties: mergedProperties }),\n ...(mergedRequired === undefined ? {} : { required: mergedRequired }),\n };\n}\n\nfunction hasSelfReferencingRef(\n schema: JsonSchema,\n root: JsonSchema,\n path = \"#\",\n activePaths = new Set<string>()\n): boolean {\n const nextActivePaths = new Set(activePaths);\n nextActivePaths.add(path);\n const localRefPath = getLocalRefPath(schema.$ref);\n\n if (localRefPath !== undefined) {\n if (nextActivePaths.has(localRefPath)) {\n return true;\n }\n\n const target = resolveLocalRef(root, localRefPath);\n\n if (target !== undefined && hasSelfReferencingRef(target, root, localRefPath, nextActivePaths)) {\n return true;\n }\n }\n\n if (schema.items !== undefined && hasSelfReferencingRef(schema.items, root, `${path}/items`, nextActivePaths)) {\n return true;\n }\n\n if (\n typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null &&\n hasSelfReferencingRef(\n schema.additionalProperties,\n root,\n `${path}/additionalProperties`,\n nextActivePaths\n )\n ) {\n return true;\n }\n\n for (const [key, childSchema] of Object.entries(schema.properties ?? {})) {\n if (\n hasSelfReferencingRef(\n childSchema,\n root,\n `${path}/properties/${escapeJsonPointerSegment(key)}`,\n nextActivePaths\n )\n ) {\n return true;\n }\n }\n\n for (const [key, childSchema] of Object.entries(schema.$defs ?? {})) {\n if (\n hasSelfReferencingRef(\n childSchema,\n root,\n `${path}/$defs/${escapeJsonPointerSegment(key)}`,\n nextActivePaths\n )\n ) {\n return true;\n }\n }\n\n for (const [index, childSchema] of (schema.oneOf ?? []).entries()) {\n if (hasSelfReferencingRef(childSchema, root, `${path}/oneOf/${index}`, nextActivePaths)) {\n return true;\n }\n }\n\n for (const [index, childSchema] of (schema.anyOf ?? []).entries()) {\n if (hasSelfReferencingRef(childSchema, root, `${path}/anyOf/${index}`, nextActivePaths)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getLocalRefPath(ref: string | undefined): string | undefined {\n if (ref === undefined) {\n return undefined;\n }\n\n if (ref === \"#\") {\n return \"#\";\n }\n\n return ref.startsWith(\"#/\") ? ref : undefined;\n}\n\nfunction resolveLocalRef(root: JsonSchema, ref: string): JsonSchema | undefined {\n const path = getLocalRefPath(ref);\n\n if (path === undefined) {\n return undefined;\n }\n\n if (path === \"#\") {\n return root;\n }\n\n const segments = path.slice(2).split(\"/\").map(unescapeJsonPointerSegment);\n let current: unknown = root;\n\n for (const segment of segments) {\n if (Array.isArray(current)) {\n const index = parseArrayIndex(segment);\n\n if (index === undefined) {\n return undefined;\n }\n\n current = current[index];\n continue;\n }\n\n if (!isPlainObject(current)) {\n return undefined;\n }\n\n current = current[segment];\n }\n\n return isPlainObject(current) ? (current as JsonSchema) : undefined;\n}\n\nfunction appendDescription(\n description: string | undefined,\n addition: string | undefined\n): string | undefined {\n if (addition === undefined || addition.length === 0) {\n return description;\n }\n\n if (description === undefined || description.length === 0) {\n return addition;\n }\n\n return `${description} ${addition}`;\n}\n\nfunction isPrimitiveEnumValue(value: unknown): value is PrimitiveEnumValue {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction getStringDefault(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction getNumberDefault(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction getIntegerDefault(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isInteger(value) ? value : undefined;\n}\n\nfunction getBooleanDefault(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction getArrayDefault(value: unknown): JsonValue[] | undefined {\n return Array.isArray(value) && value.every((item) => isJsonValue(item)) ? value : undefined;\n}\n\nfunction getPrimitiveEnumDefault(\n value: unknown,\n candidates: readonly unknown[]\n): PrimitiveEnumValue | undefined {\n return isPrimitiveEnumValue(value) && candidates.includes(value) ? value : undefined;\n}\n\nfunction getJsonDefault(value: unknown): JsonValue | undefined {\n return isJsonValue(value) ? value : undefined;\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (value === null) {\n return true;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every((item) => isJsonValue(item));\n }\n\n if (!isPlainObject(value)) {\n return false;\n }\n\n return Object.values(value).every((item) => isJsonValue(item));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction escapeJsonPointerSegment(value: string): string {\n return value.split(\"~\").join(\"~0\").split(\"/\").join(\"~1\");\n}\n\nfunction unescapeJsonPointerSegment(value: string): string {\n return value.split(\"~1\").join(\"/\").split(\"~0\").join(\"~\");\n}\n\nfunction parseArrayIndex(value: string): number | undefined {\n if (value.length === 0) {\n return undefined;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return undefined;\n }\n }\n\n return Number.parseInt(value, 10);\n}\n", "import type { NumberSchema } from \"toolcraft-schema\";\n\nexport function isValidNumberSchemaValue(\n value: unknown,\n schema: NumberSchema\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value))\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n return schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n}\n", "import type { Command, RenderPrimitives } from \"./index.js\";\n\nexport type OutputMode = \"rich\" | \"md\" | \"json\";\n\ntype WriteFn = (chunk: string) => void;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.every((entry) => isObject(entry));\n}\n\nfunction stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return stringifyJson(value);\n}\n\nfunction stringifyJson(value: unknown, spaces?: number): string {\n try {\n return JSON.stringify(\n value,\n (_key, currentValue) => (typeof currentValue === \"bigint\" ? currentValue.toString() : currentValue),\n spaces\n ) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction renderObjectTable(result: Record<string, unknown>, primitives: RenderPrimitives): string {\n const rows = Object.entries(result).map(([key, value]) => ({\n key,\n value: stringifyValue(value),\n }));\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: [\n {\n name: \"key\",\n title: \"Key\",\n alignment: \"left\",\n maxLen: Math.max(\"Key\".length, ...rows.map((row) => row.key.length)),\n },\n {\n name: \"value\",\n title: \"Value\",\n alignment: \"left\",\n maxLen: Math.max(\"Value\".length, ...rows.map((row) => row.value.length)),\n },\n ],\n rows,\n });\n}\n\nfunction renderObjectMarkdown(result: Record<string, unknown>): string {\n return Object.entries(result)\n .map(([key, value]) => `- ${key}: ${stringifyValue(value)}`)\n .join(\"\\n\");\n}\n\nfunction getColumnNames(rows: Array<Record<string, unknown>>): string[] {\n const names = new Set<string>();\n\n for (const row of rows) {\n for (const name of Object.keys(row)) {\n names.add(name);\n }\n }\n\n return [...names];\n}\n\nfunction renderArrayTable(result: Array<Record<string, unknown>>, primitives: RenderPrimitives): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: columnNames.map((name) => ({\n name,\n title: name,\n alignment: \"left\",\n maxLen: Math.max(\n name.length,\n ...result.map((row) => (name in row ? stringifyValue(row[name]).length : 0))\n ),\n })),\n rows: result.map((row) =>\n Object.fromEntries(\n columnNames.map((name) => [name, name in row ? stringifyValue(row[name]) : \"\"])\n )\n ),\n });\n}\n\nfunction renderArrayMarkdown(result: Array<Record<string, unknown>>): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n const header = `| ${columnNames.join(\" | \")} |`;\n const separator = `| ${columnNames.map(() => \":---\").join(\" | \")} |`;\n const rows = result.map(\n (row) =>\n `| ${columnNames\n .map((name) => (name in row ? stringifyValue(row[name]).replaceAll(\"|\", \"\\\\|\") : \"\"))\n .join(\" | \")} |`\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction autoRender(result: unknown, output: OutputMode, primitives: RenderPrimitives): string {\n if (result === null || result === undefined) {\n if (output === \"json\") {\n return stringifyJson({ ok: true }, 2);\n }\n\n return \"Done.\";\n }\n\n if (typeof result === \"string\") {\n if (output === \"json\") {\n return stringifyJson({ result }, 2);\n }\n\n return result;\n }\n\n if (isObject(result)) {\n if (output === \"rich\") {\n return renderObjectTable(result, primitives);\n }\n\n if (output === \"md\") {\n return renderObjectMarkdown(result);\n }\n\n return stringifyJson(result, 2);\n }\n\n if (isArrayOfObjects(result)) {\n if (output === \"md\") {\n return renderArrayMarkdown(result);\n }\n\n if (output === \"json\") {\n return stringifyJson(result, 2);\n }\n\n return renderArrayTable(result, primitives);\n }\n\n return stringifyJson(result, 2);\n}\n\nexport function renderResult(\n command: Command<any, any, any, any>,\n result: unknown,\n output: OutputMode,\n primitives: RenderPrimitives,\n write: WriteFn = (chunk) => {\n process.stdout.write(chunk);\n }\n): void {\n if (output === \"json\" && command.render?.json) {\n const payload = command.render.json(result, primitives);\n if (payload !== undefined) {\n write(`${stringifyJson(payload, 2)}\\n`);\n }\n return;\n }\n\n if (output === \"md\" && command.render?.markdown) {\n const payload = command.render.markdown(result, primitives);\n if (typeof payload === \"string\" && payload.length > 0) {\n write(`${payload}\\n`);\n }\n return;\n }\n\n if (output === \"rich\" && command.render?.rich) {\n command.render.rich(result, primitives);\n return;\n }\n\n const payload = autoRender(result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`);\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { TerminalSession } from \"./terminal-session.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\n\nexport interface NewSessionOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n}\n\nexport class TerminalPilot {\n private readonly sessionMap = new Map<string, TerminalSession>();\n\n static async launch(): Promise<TerminalPilot> {\n return new TerminalPilot();\n }\n\n async newSession(opts: NewSessionOptions): Promise<TerminalSession> {\n const session = new TerminalSession({\n id: randomUUID(),\n command: opts.command,\n args: opts.args,\n cwd: opts.cwd,\n env: opts.env,\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n observe: opts.observe ?? false\n });\n\n this.sessionMap.set(session.id, session);\n return session;\n }\n\n getSession(id: string): TerminalSession {\n const session = this.sessionMap.get(id);\n\n if (session === undefined) {\n throw new Error(`Session not found: ${id}`);\n }\n\n return session;\n }\n\n deleteSession(id: string): void {\n this.sessionMap.delete(id);\n }\n\n sessions(): TerminalSession[] {\n return [...this.sessionMap.values()].filter((s) => s.exitCode === null);\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessionMap.values()];\n\n try {\n await Promise.all(sessions.map((session) => session.close()));\n } finally {\n this.sessionMap.clear();\n }\n }\n}\n", "import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closeRequested = false;\n private signalRequested = false;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.signalRequested = true;\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const matched = matchPattern(this.rawBuffer, pattern);\n if (matched !== null) {\n return matched;\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.signalRequested) {\n return this.exitPromise;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n }\n }\n\n return this.exitPromise;\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character === \"\\r\" || character === \"\\b\") {\n continue;\n }\n\n output += character;\n }\n\n return output;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n EscCharset,\n EscHash,\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor = { x: 0, y: 0 };\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n\n this.displayBuffer = Object.defineProperties(\n {} as { readonly cursorX: number; readonly cursorY: number; readonly data: Array<Row | undefined> },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true },\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const cell = [ch.charCodeAt(0), ch] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n return this._csiParams.split(\";\").map((s) => (s === \"\" ? 0 : parseInt(s, 10)));\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n } else {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._resetStyle();\n }\n }\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2 || p0 === 3) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": { // insert lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": { // delete lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": { // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": { // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": { // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": { // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = 0;\n break;\n }\n case \"s\": // save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n break;\n case \"u\": // restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ESC (ESC \\ = ST)\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n // next char should be `\\` \u2014 just return to normal, it will be consumed\n this._state = State.Normal;\n }\n break;\n case State.Str:\n // consume until ST (0x9c) or BEL\n if (code === 0x9c || code === 0x07) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._state = State.Normal;\n }\n break;\n case State.EscCharset:\n // consume one character for charset designation\n this._state = State.Normal;\n break;\n case State.EscHash:\n // consume one character for line attributes\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL\n if (this._cursorX > 0) {\n this._cursorX--;\n this._setChar(this._cursorY, this._cursorX, \" \");\n }\n } else if (code === 0x09) {\n // HT\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 charset switch, ignore\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n this._setChar(this._cursorY, this._cursorX, ch);\n this._cursorX++;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX, this._cols - 1);\n return;\n }\n\n if (this._cursorX >= this._cols) {\n // Auto-wrap\n this._cursorX = 0;\n this._newline();\n }\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x28 || code === 0x29 || code === 0x2a || code === 0x2b || code === 0x2d || code === 0x2e) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = tab set (ignore)\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._savedCursor = { x: 0, y: 0 };\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetStyle();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b) {\n // Digit or semicolon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n strikethrough: false\n };\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"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(name: string | undefined, env?: HandlerEnv): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n return name ?? env?.get(SESSION_ENV_VAR);\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n nameToId.delete(name);\n idToName.delete(sessionId);\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n if (nameToId.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(name: string | undefined, env?: HandlerEnv): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const closeSession = defineCommand<\n TerminalPilotCommandServices,\n \"close-session\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"close-session\",\n description: \"Close an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const { exitCode } = await getTerminalPilotRuntime(terminalPilotRuntime).closeSession(params.session, env);\n return { exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n command: S.String({ description: \"Command to execute\" }),\n args: S.Optional(S.Array(S.String(), { description: \"Command arguments\" })),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n cwd: S.Optional(S.String({ description: \"Working directory\" })),\n cols: S.Optional(S.Number({ description: \"Terminal width in columns\" })),\n rows: S.Optional(S.Number({ description: \"Terminal height in rows\" })),\n observe: S.Optional(S.Boolean({ description: \"Mirror PTY output to stderr\" }))\n});\n\nexport const createSession = defineCommand<\n TerminalPilotCommandServices,\n \"create-session\",\n typeof params,\n undefined,\n { session: string; pid: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"create-session\",\n description: \"Spawn an interactive CLI in a PTY\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"command\", \"args\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).createSession(params, env);\n return { session: namedSession.name, pid: namedSession.session.pid };\n }\n});\n", "import { defineCommand, S } from \"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(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const fill = defineCommand<\n TerminalPilotCommandServices,\n \"fill\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"fill\",\n description: \"Write text to an active terminal session all at once (replaces \\\\n with \\\\r)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.fill(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const getSession = defineCommand<\n TerminalPilotCommandServices,\n \"get-session\",\n typeof params,\n undefined,\n { session: string; pid: number; command: string; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"get-session\",\n description: \"Get session metadata (name, pid, command, exitCode)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n return {\n session: namedSession.name,\n pid: namedSession.session.pid,\n command: namedSession.session.command,\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return os.homedir();\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? os.homedir() : path.join(os.homedir(), remainder);\n}\n\nexport function resolveSkillDir(config: AgentSkillConfig, scope: SkillScope, cwd: string): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import type {\n TemplateWriteMutation,\n TemplateMergeTomlMutation,\n TemplateMergeJsonMutation,\n ConfigObject,\n ValueResolver\n} from \"../types.js\";\n\nexport interface WriteOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeTomlOptions {\n /** Target TOML file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeJsonOptions {\n /** Target JSON file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction write(options: WriteOptions): TemplateWriteMutation {\n return {\n kind: \"templateWrite\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeToml(options: MergeTomlOptions): TemplateMergeTomlMutation {\n return {\n kind: \"templateMergeToml\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeJson(options: MergeJsonOptions): TemplateMergeJsonMutation {\n return {\n kind: \"templateMergeJson\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nexport const templateMutation = {\n write,\n mergeToml,\n mergeJson\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\nimport { yamlFormat } from \"./yaml.js\";\n\nexport type FormatName = \"json\" | \"toml\" | \"yaml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat,\n yaml: yamlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\nexport { yamlFormat } from \"./yaml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { TemplateLoader } from \"@poe-code/config-mutations\";\n\nconst TEMPLATE_IDS = [\"poe-generate.md\", \"terminal-pilot.md\"] as const;\ntype TemplateId = (typeof TEMPLATE_IDS)[number];\n\nconst cache = new Map<TemplateId, string>();\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await stat(target);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function findPackageRoot(entryFilePath: string): Promise<string> {\n let current = path.dirname(entryFilePath);\n while (true) {\n if (await pathExists(path.join(current, \"package.json\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(\"Unable to locate package root for agent-skill-config templates.\");\n }\n current = parent;\n }\n}\n\nasync function resolveTemplatePath(templateId: TemplateId): Promise<string> {\n const packageRoot = await findPackageRoot(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(packageRoot, \"src\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", \"skill\", templateId)\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Template not found: ${templateId}`);\n}\n\nfunction isKnownTemplate(templateId: string): templateId is TemplateId {\n return (TEMPLATE_IDS as readonly string[]).includes(templateId);\n}\n\nexport async function loadTemplate(templateId: string): Promise<string> {\n if (!isKnownTemplate(templateId)) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const cached = cache.get(templateId);\n if (cached !== undefined) {\n return cached;\n }\n\n const resolved = await resolveTemplatePath(templateId);\n const content = await readFile(resolved, \"utf8\");\n cache.set(templateId, content);\n return content;\n}\n\nexport function createTemplateLoader(): TemplateLoader {\n return loadTemplate;\n}\n", "import { fileMutation, runMutations, templateMutation } from \"@poe-code/config-mutations\";\nimport { resolveAgentSupport } from \"./configs.js\";\nimport { createTemplateLoader } from \"./templates.js\";\nimport type { ApplyOptions, SkillFile } from \"./types.js\";\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction toHomeRelative(localSkillDir: string): string {\n if (localSkillDir.startsWith(\"~/\") || localSkillDir === \"~\") {\n return localSkillDir;\n }\n\n const normalized = localSkillDir.startsWith(\"./\")\n ? localSkillDir.slice(2)\n : localSkillDir;\n\n return `~/${normalized}`;\n}\n\nconst bundledSkillTemplateIds = [\"poe-generate.md\"] as const;\n\nexport async function configure(agentId: string, options: ApplyOptions): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillDir,\n label: `Ensure directory ${skillDir}`\n }),\n ...bundledSkillTemplateIds.map((templateId) =>\n templateMutation.write({\n target: `${skillDir}/${templateId}`,\n templateId,\n label: `Write bundled skill ${templateId} to ${skillDir}`\n })\n )\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: createTemplateLoader()\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n options: ApplyOptions & { force?: boolean }\n): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.removeDirectory({\n path: skillDir,\n force: options.force,\n label: `Remove skills directory ${skillDir}`\n })\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport type InstallSkillOptions = {\n fs: ApplyOptions[\"fs\"];\n cwd: string;\n homeDir: string;\n scope: ApplyOptions[\"scope\"];\n dryRun?: boolean;\n observers?: ApplyOptions[\"observers\"];\n};\n\nexport type InstallSkillResult = {\n skillPath: string;\n displayPath: string;\n};\n\nconst SKILL_TEMPLATE_ID = \"__skill_content__\";\n\n/**\n * Install a skill for an agent.\n * Creates folder structure: skillDir/<skill.name>/SKILL.md\n */\nexport async function installSkill(\n agentId: string,\n skill: SkillFile,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"local\";\n const config = support.config!;\n\n // Use home-relative paths for mutations (same pattern as configure/unconfigure)\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const skillFolderPath = `${skillDir}/${skill.name}`;\n const skillFilePath = `${skillFolderPath}/SKILL.md`;\n const displayPath = `${scope === \"global\" ? config.globalSkillDir : config.localSkillDir}/${skill.name}/SKILL.md`;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillFolderPath,\n label: `Ensure skill directory ${skill.name}`\n }),\n templateMutation.write({\n target: skillFilePath,\n templateId: SKILL_TEMPLATE_ID,\n label: `Write skill ${skill.name}`\n })\n ],\n {\n fs: options.fs,\n homeDir: scope === \"global\" ? options.homeDir : options.cwd,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: async (templateId) => {\n if (templateId === SKILL_TEMPLATE_ID) {\n return skill.content;\n }\n throw new Error(`Unknown template: ${templateId}`);\n }\n }\n );\n\n return { skillPath: skillFilePath, displayPath };\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { readFile } from \"node:fs/promises\";\nimport { UserError } from \"toolcraft\";\nimport {\n getAgentConfig,\n resolveAgentSupport as resolveSkillAgentSupport,\n supportedAgents as skillSupportedAgents\n} from \"@poe-code/agent-skill-config\";\n\nexport type TerminalPilotInstallerFileSystem = {\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n writeFile(\n path: string,\n content: string,\n options?: { encoding: \"utf8\" }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<void>;\n unlink(path: string): Promise<void>;\n rm?(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n stat(path: string): Promise<{ mode?: number }>;\n readdir(path: string): Promise<string[]>;\n chmod?(path: string, mode: number): Promise<void>;\n};\n\nexport type TerminalPilotInstallScope = \"global\" | \"local\";\nexport type TerminalPilotInstallerPlatform = \"darwin\" | \"linux\" | \"win32\";\n\nexport const DEFAULT_INSTALL_AGENT = \"claude-code\";\nexport const DEFAULT_INSTALL_SCOPE: TerminalPilotInstallScope = \"local\";\nexport const TERMINAL_PILOT_SKILL_NAME = \"terminal-pilot\";\nexport const installableAgents = skillSupportedAgents;\n\nexport type TerminalPilotInstallerServices = {\n fs?: TerminalPilotInstallerFileSystem;\n cwd?: string;\n homeDir?: string;\n platform?: TerminalPilotInstallerPlatform;\n};\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nexport function resolveInstallerServices(\n installer: TerminalPilotInstallerServices | undefined\n): Required<TerminalPilotInstallerServices> {\n return {\n fs: installer?.fs ?? (nodeFs as TerminalPilotInstallerFileSystem),\n cwd: installer?.cwd ?? process.cwd(),\n homeDir: installer?.homeDir ?? os.homedir(),\n platform: installer?.platform ?? (process.platform as TerminalPilotInstallerPlatform)\n };\n}\n\nfunction throwUnsupportedAgent(agent: string): never {\n throw new UserError(`Unsupported agent: ${agent}`);\n}\n\nexport function resolveInstallableAgent(agent: string): string {\n const skillSupport = resolveSkillAgentSupport(agent);\n\n if (\n skillSupport.status !== \"supported\" ||\n !skillSupport.id\n ) {\n throwUnsupportedAgent(agent);\n }\n\n return skillSupport.id;\n}\n\nexport function resolveInstallScope(input: {\n local?: boolean;\n global?: boolean;\n}): TerminalPilotInstallScope {\n if (input.local && input.global) {\n throw new UserError(\"Use either --local or --global, not both.\");\n }\n\n if (input.local) {\n return \"local\";\n }\n\n if (input.global) {\n return \"global\";\n }\n\n return DEFAULT_INSTALL_SCOPE;\n}\n\nlet terminalPilotTemplateCache: string | undefined;\n\nexport async function loadTerminalPilotTemplate(): Promise<string> {\n if (terminalPilotTemplateCache !== undefined) {\n return terminalPilotTemplateCache;\n }\n\n const candidates = [\n new URL(\"./templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../../../agent-skill-config/src/templates/terminal-pilot.md\", import.meta.url)\n ];\n\n for (const candidate of candidates) {\n try {\n terminalPilotTemplateCache = await readFile(candidate, \"utf8\");\n return terminalPilotTemplateCache;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n throw new UserError(\"terminal-pilot skill template is missing.\");\n}\n\nfunction resolveHomeRelativePath(targetPath: string, homeDir: string): string {\n if (targetPath === \"~\") {\n return homeDir;\n }\n\n if (targetPath.startsWith(\"~/\")) {\n return path.join(homeDir, targetPath.slice(2));\n }\n\n return targetPath;\n}\n\nexport function getSkillFolderWithHome(\n agent: string,\n scope: TerminalPilotInstallScope,\n cwd: string,\n homeDir: string\n): {\n displayPath: string;\n fullPath: string;\n} {\n const config = getAgentConfig(agent);\n\n if (!config) {\n throwUnsupportedAgent(agent);\n }\n\n return {\n displayPath: path.join(\n scope === \"global\" ? config.globalSkillDir : config.localSkillDir,\n TERMINAL_PILOT_SKILL_NAME\n ),\n fullPath: path.join(\n scope === \"global\"\n ? resolveHomeRelativePath(config.globalSkillDir, homeDir)\n : path.resolve(cwd, config.localSkillDir),\n TERMINAL_PILOT_SKILL_NAME\n )\n };\n}\n\nexport async function removeSkillFolder(\n fs: TerminalPilotInstallerFileSystem,\n folderPath: string\n): Promise<boolean> {\n try {\n await fs.stat(folderPath);\n } catch (error) {\n if (isNotFoundError(error)) {\n return false;\n }\n throw error;\n }\n\n if (typeof fs.rm !== \"function\") {\n throw new UserError(\"The configured filesystem does not support removing directories.\");\n }\n\n await fs.rm(folderPath, { recursive: true, force: true });\n return true;\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { defineCommand, S } from \"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 { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n key: S.String({ description: \"Named key to press\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const pressKey = defineCommand<\n TerminalPilotCommandServices,\n \"press-key\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"press-key\",\n description: \"Send a named key press to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"key\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.press(params.key as never);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n last: S.Optional(S.Number({ short: \"n\", description: \"Return only the last N lines\" }))\n});\n\nexport const readHistory = defineCommand<\n TerminalPilotCommandServices,\n \"read-history\",\n typeof params,\n undefined,\n { lines: string[]; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-history\",\n description: \"Read terminal output history\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const lines = await namedSession.session.history({ last: params.last });\n return { lines, exitCode: namedSession.session.exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\ntype ReadScreenResult = {\n lines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n exitCode: number | null;\n};\n\nexport const readScreen = defineCommand<\n TerminalPilotCommandServices,\n \"read-screen\",\n typeof params,\n undefined,\n ReadScreenResult,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-screen\",\n description: \"Read the current visible terminal screen\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n return {\n lines: [...screen.lines],\n cursor: { ...screen.cursor },\n size: { ...screen.size },\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n cols: S.Number({ description: \"Terminal width in columns\" }),\n rows: S.Number({ description: \"Terminal height in rows\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const resize = defineCommand<\n TerminalPilotCommandServices,\n \"resize\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"resize\",\n description: \"Resize an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.resize(params.cols, params.rows);\n return undefined;\n }\n});\n", "import { writeFile } from \"node:fs/promises\";\nimport { parseAnsi } from \"./ansi-parser.js\";\nimport { renderPng } from \"./png-renderer.js\";\nimport { renderSvg } from \"./svg-renderer.js\";\n\nexport interface TerminalPngOptions {\n padding?: number;\n window?: boolean;\n output?: string;\n}\n\nexport async function renderTerminalPng(\n ansiText: string,\n options: TerminalPngOptions = {}\n): Promise<Buffer> {\n const runs = parseAnsi(ansiText);\n const svg = renderSvg(runs, {\n padding: options.padding,\n window: options.window\n });\n const png = renderPng(svg);\n\n if (options.output) {\n await writeFile(options.output, png);\n }\n\n return png;\n}\n\nexport * from \"./ansi-parser.js\";\nexport * from \"./font.js\";\nexport * from \"./png-renderer.js\";\nexport * from \"./svg-renderer.js\";\n", "export type Color =\n | { type: \"ansi4\"; index: number }\n | { type: \"ansi8\"; index: number }\n | { type: \"rgb\"; r: number; g: number; b: number };\n\nexport type StyledRun = {\n text: string;\n fg: Color | null;\n bg: Color | null;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n dim: boolean;\n};\n\ntype StyleState = Omit<StyledRun, \"text\">;\n\nconst ESC = \"\\u001b\";\n\nfunction createDefaultStyle(): StyleState {\n return {\n fg: null,\n bg: null,\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false,\n dim: false\n };\n}\n\nfunction cloneStyle(style: StyleState): StyleState {\n return { ...style };\n}\n\nfunction stylesEqual(left: StyleState, right: StyleState): boolean {\n return (\n left.bold === right.bold &&\n left.italic === right.italic &&\n left.underline === right.underline &&\n left.strikethrough === right.strikethrough &&\n left.dim === right.dim &&\n colorsEqual(left.fg, right.fg) &&\n colorsEqual(left.bg, right.bg)\n );\n}\n\nfunction colorsEqual(left: Color | null, right: Color | null): boolean {\n if (left === right) {\n return true;\n }\n\n if (!left || !right || left.type !== right.type) {\n return false;\n }\n\n if (left.type === \"rgb\" && right.type === \"rgb\") {\n return left.r === right.r && left.g === right.g && left.b === right.b;\n }\n\n if ((left.type === \"ansi4\" || left.type === \"ansi8\") && left.type === right.type) {\n return left.index === right.index;\n }\n\n return false;\n}\n\nfunction pushRun(runs: StyledRun[], style: StyleState, text: string): void {\n if (text.length === 0) {\n return;\n }\n\n const previous = runs.at(-1);\n if (previous && text !== \"\\n\" && previous.text !== \"\\n\" && stylesEqual(previous, style)) {\n previous.text += text;\n return;\n }\n\n runs.push({\n text,\n fg: style.fg,\n bg: style.bg,\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n strikethrough: style.strikethrough,\n dim: style.dim\n });\n}\n\nfunction parseCsi(input: string, start: number): { end: number; final: string | null; params: string } {\n let index = start + 2;\n\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return {\n end: index + 1,\n final: input[index],\n params: input.slice(start + 2, index)\n };\n }\n\n index += 1;\n }\n\n return {\n end: input.length,\n final: null,\n params: input.slice(start + 2)\n };\n}\n\nfunction toInteger(value: string | undefined): number | null {\n if (!value || value.length === 0) {\n return null;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return null;\n }\n }\n\n return Number.parseInt(value, 10);\n}\n\nfunction clampByte(value: number): number {\n if (value < 0) {\n return 0;\n }\n\n if (value > 255) {\n return 255;\n }\n\n return value;\n}\n\nfunction applyExtendedColor(\n params: number[],\n start: number\n): { color: Color | null; consumed: number } | null {\n const mode = params[start];\n if (mode === 5) {\n const index = params[start + 1];\n if (index === undefined) {\n return null;\n }\n\n return {\n color: { type: \"ansi8\", index: clampByte(index) },\n consumed: 2\n };\n }\n\n if (mode === 2) {\n const r = params[start + 1];\n const g = params[start + 2];\n const b = params[start + 3];\n if (r === undefined || g === undefined || b === undefined) {\n return null;\n }\n\n return {\n color: { type: \"rgb\", r: clampByte(r), g: clampByte(g), b: clampByte(b) },\n consumed: 4\n };\n }\n\n return null;\n}\n\nfunction applySgr(style: StyleState, paramsText: string): StyleState {\n const nextStyle = cloneStyle(style);\n const rawParams = paramsText.length === 0 ? [\"0\"] : paramsText.split(\";\");\n const params: number[] = [];\n\n for (const rawParam of rawParams) {\n const value = toInteger(rawParam);\n if (value === null) {\n return nextStyle;\n }\n\n params.push(value);\n }\n\n for (let index = 0; index < params.length; index += 1) {\n const value = params[index];\n\n if (value === 0) {\n Object.assign(nextStyle, createDefaultStyle());\n continue;\n }\n\n if (value === 1) {\n nextStyle.bold = true;\n continue;\n }\n\n if (value === 2) {\n nextStyle.dim = true;\n continue;\n }\n\n if (value === 22) {\n nextStyle.bold = false;\n nextStyle.dim = false;\n continue;\n }\n\n if (value === 3) {\n nextStyle.italic = true;\n continue;\n }\n\n if (value === 23) {\n nextStyle.italic = false;\n continue;\n }\n\n if (value === 4) {\n nextStyle.underline = true;\n continue;\n }\n\n if (value === 24) {\n nextStyle.underline = false;\n continue;\n }\n\n if (value === 9) {\n nextStyle.strikethrough = true;\n continue;\n }\n\n if (value === 29) {\n nextStyle.strikethrough = false;\n continue;\n }\n\n if (value === 39) {\n nextStyle.fg = null;\n continue;\n }\n\n if (value === 49) {\n nextStyle.bg = null;\n continue;\n }\n\n if (value >= 30 && value <= 37) {\n nextStyle.fg = { type: \"ansi4\", index: value - 30 };\n continue;\n }\n\n if (value >= 90 && value <= 97) {\n nextStyle.fg = { type: \"ansi4\", index: value - 90 + 8 };\n continue;\n }\n\n if (value >= 40 && value <= 47) {\n nextStyle.bg = { type: \"ansi4\", index: value - 40 };\n continue;\n }\n\n if (value >= 100 && value <= 107) {\n nextStyle.bg = { type: \"ansi4\", index: value - 100 + 8 };\n continue;\n }\n\n if (value === 38 || value === 48) {\n const extended = applyExtendedColor(params, index + 1);\n if (!extended) {\n continue;\n }\n\n if (value === 38) {\n nextStyle.fg = extended.color;\n } else {\n nextStyle.bg = extended.color;\n }\n\n index += extended.consumed;\n }\n }\n\n return nextStyle;\n}\n\nexport function parseAnsi(input: string): StyledRun[] {\n const runs: StyledRun[] = [];\n let style = createDefaultStyle();\n let textStart = 0;\n let index = 0;\n\n while (index < input.length) {\n const char = input[index];\n\n if (char === \"\\n\") {\n pushRun(runs, style, input.slice(textStart, index));\n pushRun(runs, style, \"\\n\");\n index += 1;\n textStart = index;\n continue;\n }\n\n if (char === ESC && input[index + 1] === \"[\") {\n pushRun(runs, style, input.slice(textStart, index));\n const sequence = parseCsi(input, index);\n\n if (sequence.final === \"m\") {\n style = applySgr(style, sequence.params);\n }\n\n index = sequence.end;\n textStart = index;\n continue;\n }\n\n index += 1;\n }\n\n pushRun(runs, style, input.slice(textStart));\n\n return runs;\n}\n", "import { Resvg } from \"@resvg/resvg-js\";\nimport { JETBRAINS_MONO_FONT_FILES } from \"./font.js\";\n\nexport function renderPng(svg: string): Buffer {\n const resvg = new Resvg(svg, {\n font: {\n defaultFontFamily: \"JetBrains Mono\",\n fontFiles: [...JETBRAINS_MONO_FONT_FILES],\n loadSystemFonts: false,\n monospaceFamily: \"JetBrains Mono\"\n },\n fitTo: {\n mode: \"zoom\",\n value: 4\n }\n });\n const png = resvg.render();\n return Buffer.from(png.asPng());\n}\n", "import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\n\n// Full JetBrains Mono (all Unicode blocks including box-drawing and geometric shapes).\n// The @fontsource subsets only cover Latin and miss characters used by the design system.\nconst fontPackageRoot = dirname(require.resolve(\"jetbrains-mono/package.json\"));\nconst webfontRoot = join(fontPackageRoot, \"fonts/webfonts\");\n\nfunction readWebfontBase64(filename: string): string {\n return readFileSync(join(webfontRoot, filename)).toString(\"base64\");\n}\n\nfunction resolveAssetPath(filename: string): string {\n return fileURLToPath(new URL(`../assets/${filename}`, import.meta.url));\n}\n\nfunction createFontFace(base64: string, weight: 400 | 700, style: \"normal\" | \"italic\"): string {\n return `@font-face {\n font-family: 'JetBrains Mono';\n font-style: ${style};\n font-weight: ${weight};\n src: url('data:font/woff2;base64,${base64}') format('woff2');\n}`;\n}\n\nexport const JETBRAINS_MONO_BASE64 = readWebfontBase64(\"JetBrainsMono-Regular.woff2\");\nexport const JETBRAINS_MONO_FONT_FILES = [\n resolveAssetPath(\"jetbrains-mono-400-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-400-italic.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-italic.ttf\")\n] as const;\nexport const JETBRAINS_MONO_TTF_PATH = JETBRAINS_MONO_FONT_FILES[0];\n\nexport const FONT_FACE_CSS = [\n createFontFace(JETBRAINS_MONO_BASE64, 400, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Bold.woff2\"), 700, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Italic.woff2\"), 400, \"italic\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-BoldItalic.woff2\"), 700, \"italic\")\n].join(\"\\n\");\n", "import type { Color, StyledRun } from \"./ansi-parser.js\";\nimport { FONT_FACE_CSS } from \"./font.js\";\n\nexport interface SvgOptions {\n padding?: number;\n window?: boolean;\n}\n\nconst ANSI_16_PALETTE = [\n \"#282a2e\",\n \"#D74E6F\",\n \"#31BB71\",\n \"#D3E561\",\n \"#8056FF\",\n \"#ED61D7\",\n \"#04D7D7\",\n \"#C5C8C6\",\n \"#4B4B4B\",\n \"#FE5F86\",\n \"#00D787\",\n \"#EBFF71\",\n \"#8F69FF\",\n \"#FF7AEA\",\n \"#00FEFE\",\n \"#FFFFFF\"\n] as const;\n\nconst XTERM_256_PALETTE = [\n \"#000000\", \"#800000\", \"#008000\", \"#808000\", \"#000080\", \"#800080\", \"#008080\", \"#c0c0c0\",\n \"#808080\", \"#ff0000\", \"#00ff00\", \"#ffff00\", \"#0000ff\", \"#ff00ff\", \"#00ffff\", \"#ffffff\",\n \"#000000\", \"#00005f\", \"#000087\", \"#0000af\", \"#0000d7\", \"#0000ff\", \"#005f00\", \"#005f5f\",\n \"#005f87\", \"#005faf\", \"#005fd7\", \"#005fff\", \"#008700\", \"#00875f\", \"#008787\", \"#0087af\",\n \"#0087d7\", \"#0087ff\", \"#00af00\", \"#00af5f\", \"#00af87\", \"#00afaf\", \"#00afd7\", \"#00afff\",\n \"#00d700\", \"#00d75f\", \"#00d787\", \"#00d7af\", \"#00d7d7\", \"#00d7ff\", \"#00ff00\", \"#00ff5f\",\n \"#00ff87\", \"#00ffaf\", \"#00ffd7\", \"#00ffff\", \"#5f0000\", \"#5f005f\", \"#5f0087\", \"#5f00af\",\n \"#5f00d7\", \"#5f00ff\", \"#5f5f00\", \"#5f5f5f\", \"#5f5f87\", \"#5f5faf\", \"#5f5fd7\", \"#5f5fff\",\n \"#5f8700\", \"#5f875f\", \"#5f8787\", \"#5f87af\", \"#5f87d7\", \"#5f87ff\", \"#5faf00\", \"#5faf5f\",\n \"#5faf87\", \"#5fafaf\", \"#5fafd7\", \"#5fafff\", \"#5fd700\", \"#5fd75f\", \"#5fd787\", \"#5fd7af\",\n \"#5fd7d7\", \"#5fd7ff\", \"#5fff00\", \"#5fff5f\", \"#5fff87\", \"#5fffaf\", \"#5fffd7\", \"#5fffff\",\n \"#870000\", \"#87005f\", \"#870087\", \"#8700af\", \"#8700d7\", \"#8700ff\", \"#875f00\", \"#875f5f\",\n \"#875f87\", \"#875faf\", \"#875fd7\", \"#875fff\", \"#878700\", \"#87875f\", \"#878787\", \"#8787af\",\n \"#8787d7\", \"#8787ff\", \"#87af00\", \"#87af5f\", \"#87af87\", \"#87afaf\", \"#87afd7\", \"#87afff\",\n \"#87d700\", \"#87d75f\", \"#87d787\", \"#87d7af\", \"#87d7d7\", \"#87d7ff\", \"#87ff00\", \"#87ff5f\",\n \"#87ff87\", \"#87ffaf\", \"#87ffd7\", \"#87ffff\", \"#af0000\", \"#af005f\", \"#af0087\", \"#af00af\",\n \"#af00d7\", \"#af00ff\", \"#af5f00\", \"#af5f5f\", \"#af5f87\", \"#af5faf\", \"#af5fd7\", \"#af5fff\",\n \"#af8700\", \"#af875f\", \"#af8787\", \"#af87af\", \"#af87d7\", \"#af87ff\", \"#afaf00\", \"#afaf5f\",\n \"#afaf87\", \"#afafaf\", \"#afafd7\", \"#afafff\", \"#afd700\", \"#afd75f\", \"#afd787\", \"#afd7af\",\n \"#afd7d7\", \"#afd7ff\", \"#afff00\", \"#afff5f\", \"#afff87\", \"#afffaf\", \"#afffd7\", \"#afffff\",\n \"#d70000\", \"#d7005f\", \"#d70087\", \"#d700af\", \"#d700d7\", \"#d700ff\", \"#d75f00\", \"#d75f5f\",\n \"#d75f87\", \"#d75faf\", \"#d75fd7\", \"#d75fff\", \"#d78700\", \"#d7875f\", \"#d78787\", \"#d787af\",\n \"#d787d7\", \"#d787ff\", \"#d7af00\", \"#d7af5f\", \"#d7af87\", \"#d7afaf\", \"#d7afd7\", \"#d7afff\",\n \"#d7d700\", \"#d7d75f\", \"#d7d787\", \"#d7d7af\", \"#d7d7d7\", \"#d7d7ff\", \"#d7ff00\", \"#d7ff5f\",\n \"#d7ff87\", \"#d7ffaf\", \"#d7ffd7\", \"#d7ffff\", \"#ff0000\", \"#ff005f\", \"#ff0087\", \"#ff00af\",\n \"#ff00d7\", \"#ff00ff\", \"#ff5f00\", \"#ff5f5f\", \"#ff5f87\", \"#ff5faf\", \"#ff5fd7\", \"#ff5fff\",\n \"#ff8700\", \"#ff875f\", \"#ff8787\", \"#ff87af\", \"#ff87d7\", \"#ff87ff\", \"#ffaf00\", \"#ffaf5f\",\n \"#ffaf87\", \"#ffafaf\", \"#ffafd7\", \"#ffafff\", \"#ffd700\", \"#ffd75f\", \"#ffd787\", \"#ffd7af\",\n \"#ffd7d7\", \"#ffd7ff\", \"#ffff00\", \"#ffff5f\", \"#ffff87\", \"#ffffaf\", \"#ffffd7\", \"#ffffff\",\n \"#080808\", \"#121212\", \"#1c1c1c\", \"#262626\", \"#303030\", \"#3a3a3a\", \"#444444\", \"#4e4e4e\",\n \"#585858\", \"#606060\", \"#666666\", \"#767676\", \"#808080\", \"#8a8a8a\", \"#949494\", \"#9e9e9e\",\n \"#a8a8a8\", \"#b2b2b2\", \"#bcbcbc\", \"#c6c6c6\", \"#d0d0d0\", \"#dadada\", \"#e4e4e4\", \"#eeeeee\"\n] as const;\n\nconst BACKGROUND = \"#171717\";\nconst DEFAULT_FOREGROUND = \"#c4c4c4\";\nconst FONT_FAMILY = \"JetBrains Mono\";\nconst FONT_SIZE = 14;\nconst LINE_HEIGHT = 1.2;\nconst CHARACTER_WIDTH = 8.412666666666667;\nconst TEXT_BOTTOM_PADDING = 11.6;\nconst DEFAULT_PADDING = {\n top: 20,\n right: 40,\n bottom: 20,\n left: 20\n};\nconst WINDOW_BAR_HEIGHT = 15;\n\nexport function renderSvg(runs: StyledRun[], options: SvgOptions = {}): string {\n const padding = options.padding === undefined\n ? DEFAULT_PADDING\n : {\n top: options.padding,\n right: options.padding,\n bottom: options.padding,\n left: options.padding\n };\n const showWindow = options.window ?? true;\n const titleBarHeight = showWindow ? WINDOW_BAR_HEIGHT : 0;\n const textStartX = padding.left;\n const lineHeightPx = FONT_SIZE * LINE_HEIGHT;\n const textStartY = titleBarHeight + padding.top + lineHeightPx;\n const lines = splitIntoLines(runs);\n const contentWidth = measureLines(lines);\n const width = padding.left + contentWidth + padding.right;\n const height =\n titleBarHeight + padding.top + (lines.length * lineHeightPx) + padding.bottom + TEXT_BOTTOM_PADDING;\n const svgWidth = formatNumber(width);\n const svgHeight = formatNumber(height);\n const viewBox = `0 0 ${svgWidth} ${svgHeight}`;\n const textElements = renderLines(lines, textStartX, textStartY, lineHeightPx);\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${svgWidth}\" height=\"${svgHeight}\" viewBox=\"${viewBox}\">`,\n \"<defs>\",\n \"<style><![CDATA[\",\n FONT_FACE_CSS,\n \"]]></style>\",\n \"</defs>\",\n `<rect x=\"0\" y=\"0\" width=\"${svgWidth}\" height=\"${svgHeight}\" fill=\"${BACKGROUND}\" />`,\n showWindow ? renderWindowControls() : \"\",\n `<g font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(FONT_SIZE)}px\" fill=\"${DEFAULT_FOREGROUND}\">`,\n textElements,\n \"</g>\",\n \"</svg>\"\n ].join(\"\");\n}\n\nfunction splitIntoLines(runs: StyledRun[]): StyledRun[][] {\n const lines: StyledRun[][] = [[]];\n\n for (const run of runs) {\n if (run.text === \"\\n\") {\n lines.push([]);\n continue;\n }\n\n lines[lines.length - 1]?.push(run);\n }\n\n return lines;\n}\n\nfunction measureLines(lines: StyledRun[][]): number {\n return Math.max(\n ...lines.map(line => line.reduce((width, run) => width + (displayWidth(run.text) * CHARACTER_WIDTH), 0)),\n 0\n );\n}\n\nfunction displayWidth(text: string): number {\n const segmenter = new Intl.Segmenter();\n let width = 0;\n\n for (const { segment } of segmenter.segment(text)) {\n const cp = segment.codePointAt(0);\n width += cp !== undefined && isWideCodePoint(cp) ? 2 : 1;\n }\n\n return width;\n}\n\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115F) || // Hangul Jamo\n cp === 0x2329 || cp === 0x232A || // Angle brackets\n (cp >= 0x2E80 && cp <= 0x303E) || // CJK Radicals, Kangxi\n (cp >= 0x3041 && cp <= 0x33BF) || // Hiragana, Katakana, CJK symbols\n (cp >= 0x3400 && cp <= 0x4DBF) || // CJK Extension A\n (cp >= 0x4E00 && cp <= 0xA4CF) || // CJK Unified Ideographs\n (cp >= 0xA960 && cp <= 0xA97F) || // Hangul Jamo Extended-A\n (cp >= 0xAC00 && cp <= 0xD7AF) || // Hangul Syllables\n (cp >= 0xF900 && cp <= 0xFAFF) || // CJK Compatibility Ideographs\n (cp >= 0xFE10 && cp <= 0xFE19) || // Vertical Forms\n (cp >= 0xFE30 && cp <= 0xFE6F) || // CJK Compatibility Forms\n (cp >= 0xFF00 && cp <= 0xFF60) || // Fullwidth Latin, Halfwidth Katakana\n (cp >= 0xFFE0 && cp <= 0xFFE6) || // Fullwidth Signs\n (cp >= 0x1B000 && cp <= 0x1B0FF) || // Kana Supplement\n (cp >= 0x1F004 && cp <= 0x1F004) || // Mahjong tile\n (cp >= 0x1F0CF && cp <= 0x1F0CF) || // Playing card black joker\n (cp >= 0x1F200 && cp <= 0x1FFFD) || // Enclosed CJK + Emoji\n (cp >= 0x20000 && cp <= 0x2FFFD) || // CJK Extension B\u2013F\n (cp >= 0x30000 && cp <= 0x3FFFD) // CJK Extension G\u2013H\n );\n}\n\nfunction renderLines(\n lines: StyledRun[][],\n textStartX: number,\n textStartY: number,\n lineHeightPx: number\n): string {\n return lines\n .map((line, index) => {\n const y = formatNumber(textStartY + (index * lineHeightPx));\n\n if (line.length === 0) {\n return `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\"/>`;\n }\n\n return [\n `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\">`,\n line.map(renderRun).join(\"\"),\n \"</text>\"\n ].join(\"\");\n })\n .join(\"\");\n}\n\nfunction renderRun(run: StyledRun): string {\n const attributes = ['xml:space=\"preserve\"'];\n const color = resolveColor(run.fg);\n const textDecorations: string[] = [];\n\n if (color !== DEFAULT_FOREGROUND) {\n attributes.push(`fill=\"${escapeXmlAttribute(color)}\"`);\n }\n\n if (run.bold) {\n attributes.push('font-weight=\"bold\"');\n }\n\n if (run.italic) {\n attributes.push('font-style=\"italic\"');\n }\n\n if (run.underline) {\n textDecorations.push(\"underline\");\n }\n\n if (run.strikethrough) {\n textDecorations.push(\"line-through\");\n }\n\n if (textDecorations.length > 0) {\n attributes.push(`text-decoration=\"${textDecorations.join(\" \")}\"`);\n }\n\n if (run.dim) {\n attributes.push('opacity=\"0.7\"');\n }\n\n return `<tspan ${attributes.join(\" \")}>${escapeXmlText(run.text)}</tspan>`;\n}\n\nfunction renderWindowControls(): string {\n return [\n '<circle cx=\"13.5\" cy=\"12\" r=\"5.5\" fill=\"#FF5A54\" />',\n '<circle cx=\"32.5\" cy=\"12\" r=\"5.5\" fill=\"#E6BF29\" />',\n '<circle cx=\"51.5\" cy=\"12\" r=\"5.5\" fill=\"#52C12B\" />'\n ].join(\"\");\n}\n\nfunction resolveColor(color: Color | null): string {\n if (color === null) {\n return DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi4\") {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi8\") {\n if (color.index < ANSI_16_PALETTE.length) {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return XTERM_256_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return `rgb(${color.r},${color.g},${color.b})`;\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \"&quot;\").replaceAll(\"'\", \"&apos;\");\n}\n\nfunction formatNumber(value: number): string {\n return value.toFixed(2);\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { renderTerminalPng } from \"terminal-png\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n output: S.String({ short: \"o\", description: \"Path to the output PNG file\" }),\n window: S.Optional(S.Boolean({ description: \"Include terminal window chrome\", default: true })),\n padding: S.Optional(S.Number({ short: \"p\", description: \"Padding around terminal content\" }))\n});\n\nexport const screenshot = defineCommand<\n TerminalPilotCommandServices,\n \"screenshot\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\"]\n>({\n name: \"screenshot\",\n description: \"Capture the current terminal screen as a PNG image\",\n scope: [\"cli\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n\n await renderTerminalPng(screen.rawLines.join(\"\\n\"), {\n output: params.output,\n window: params.window,\n padding: params.padding\n });\n\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"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(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const sendSignal = defineCommand<\n TerminalPilotCommandServices,\n \"send-signal\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"send-signal\",\n description: \"Send a process signal to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"signal\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.signal(params.signal);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"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(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const type = defineCommand<\n TerminalPilotCommandServices,\n \"type\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"type\",\n description: \"Write text to an active terminal session character-by-character with delay\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.type(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n getSkillFolderWithHome,\n installableAgents,\n removeSkillFolder,\n resolveInstallableAgent,\n resolveInstallerServices\n} from \"./installer.js\";\n\nconst params = S.Object({\n agent: S.Enum(installableAgents as [string, ...string[]], {\n description: \"Agent to uninstall terminal-pilot from\",\n default: DEFAULT_INSTALL_AGENT\n })\n});\n\nexport const uninstall = defineCommand<\n TerminalPilotCommandServices,\n \"uninstall\",\n typeof params,\n undefined,\n {\n agent: string;\n removedSkillPaths: string[];\n },\n readonly [\"cli\"]\n>({\n name: \"uninstall\",\n description: \"Remove the terminal-pilot CLI skill.\",\n scope: [\"cli\"],\n positional: [\"agent\"],\n params,\n handler: async ({ params, terminalPilotInstaller }) => {\n const services = resolveInstallerServices(terminalPilotInstaller);\n const agent = resolveInstallableAgent(params.agent);\n const localSkill = getSkillFolderWithHome(\n agent,\n \"local\",\n services.cwd,\n services.homeDir\n );\n const globalSkill = getSkillFolderWithHome(\n agent,\n \"global\",\n services.cwd,\n services.homeDir\n );\n const removedSkillPaths: string[] = [];\n\n if (await removeSkillFolder(services.fs, localSkill.fullPath)) {\n removedSkillPaths.push(localSkill.displayPath);\n }\n\n if (await removeSkillFolder(services.fs, globalSkill.fullPath)) {\n removedSkillPaths.push(globalSkill.displayPath);\n }\n\n return {\n agent,\n removedSkillPaths\n };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n pattern: S.String({ description: \"Regular expression pattern to wait for\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" })),\n literal: S.Optional(\n S.Boolean({\n short: \"l\",\n description: \"When true, treat pattern as a literal string instead of a regex\"\n })\n )\n});\n\nexport const waitFor = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for\",\n typeof params,\n undefined,\n { matched: true; line: string },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for\",\n description: \"Wait for terminal output to match a pattern\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"pattern\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const pattern = params.literal === true ? params.pattern : new RegExp(params.pattern);\n const line =\n params.timeout === undefined\n ? await namedSession.session.waitFor(pattern)\n : await namedSession.session.waitFor(pattern, { timeout: params.timeout });\n\n return { matched: true, line };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" }))\n});\n\nexport const waitForExit = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for-exit\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for-exit\",\n description: \"Wait for a terminal session process to finish\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const exitCode = await namedSession.session.waitForExit(\n params.timeout === undefined ? undefined : { timeout: params.timeout }\n );\n return { exitCode };\n }\n});\n", "import { defineGroup } from \"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 install,\n uninstall,\n createSession,\n fill,\n type,\n pressKey,\n sendSignal,\n waitFor,\n waitForExit,\n readScreen,\n screenshot,\n readHistory,\n resize,\n closeSession,\n getSession,\n listSessions\n] as const;\n\nexport const terminalPilotGroup = defineGroup<TerminalPilotCommandServices, \"terminal-pilot\", typeof children, readonly [\"cli\", \"mcp\", \"sdk\"]>({\n name: \"terminal-pilot\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n children\n});\n"],
5
- "mappings": "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EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;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",
6
- "names": ["path", "fileURLToPath", "access", "readFile", "writeFile", "path", "text", "chalk", "text", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "spacing", "message", "chalk", "chalk", "AsyncLocalStorage", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "message", "chalk", "chalk", "chalk", "chalk", "select", "text", "confirm", "chalk", "message", "key", "assertValidBranches", "key", "rename", "location", "separatorIndex", "previousSeparatorIndex", "candidate", "fsPromises", "path", "message", "error", "path", "fs", "stat", "message", "hasErrorCode", "error", "isRecord", "fs", "path", "isRecord", "key", "fs", "error", "hasErrorCode", "parseDocument", "TASK_KIND", "TASK_SCHEMA_ID", "TASK_VERSION", "malformedTask", "validateListName", "parseQualifiedId", "key", "createTask", "assertCreateDoesNotSetState", "assertUpdateDoesNotSetState", "parseDocument", "isRecord", "assertValidTaskRecord", "fs", "createTasksView", "createDefaultFs", "fsPromises", "error", "process", "error", "message", "process", "message", "error", "params", "path", "key", "params", "logger", "renderTable", "getTheme", "key", "readFile", "unlink", "writeFile", "path", "spawn", "PassThrough", "path", "randomBytes", "hostname", "path", "error", "key", "cached", "isRecord", "spawn", "error", "message", "key", "path", "URL", "crypto", "error", "text", "crypto", "error", "error", "fetch", "URL", "hostname", "normalizeHostname", "hostname", "isLoopbackHostname", "assertSecureUrl", "resolvedResourceMetadataUrl", "fetch", "error", "params", "error", "params", "isObjectRecord", "message", "spawn", "error", "PassThrough", "message", "params", "isObjectRecord", "isObjectRecord", "key", "path", "getInternalGroupConfig", "cloneSecrets", "cloneScope", "params", "validateRenameMap", "rename", "readFile", "error", "path", "writeFile", "logger", "message", "unlink", "path", "stringifyValue", "key", "write", "payload", "path", "key", "trimmed", "withOutputFormat", "select", "confirm", "text", "createFs", "readFile", "writeFile", "access", "createEnv", "isPlainObject", "error", "message", "scenario", "logger", "next", "optionPath", "params", "stripAnsi", "params", "key", "stripAnsi", "text", "sleep", "key", "stripAnsi", "require", "error", "DEFAULT_COLS", "DEFAULT_ROWS", "listSessions", "params", "params", "params", "params", "params", "os", "path", "parse", "errors", "key", "parse", "isConfigObject", "parse", "serialize", "merge", "key", "prune", "isConfigObject", "parse", "serialize", "merge", "key", "prune", "path", "path", "error", "fs", "fs", "key", "isConfigObject", "error", "stat", "error", "Mustache", "readFile", "stat", "path", "fileURLToPath", "os", "path", "readFile", "isNotFoundError", "error", "os", "readFile", "path", "fs", "params", "params", "params", "params", "params", "params", "writeFile", "ESC", "text", "params", "parseAnsi", "createRequire", "dirname", "join", "fileURLToPath", "require", "text", "parseAnsi", "writeFile", "params", "params", "params", "params", "params", "params", "waitForExit", "waitForExit", "fileURLToPath", "path"]
3
+ "sources": ["../src/cli.ts", "../../toolcraft/src/cli.ts", "../../design-system/src/tokens/colors.ts", "../../design-system/src/tokens/typography.ts", "../../design-system/src/tokens/widths.ts", "../../design-system/src/components/text.ts", "../../design-system/src/internal/output-format.ts", "../../design-system/src/internal/theme-detect.ts", "../../design-system/src/components/symbols.ts", "../../design-system/src/components/logger.ts", "../../design-system/src/prompts/primitives/log.ts", "../../design-system/src/internal/strip-ansi.ts", "../../design-system/src/components/help-formatter.ts", "../../design-system/src/components/table.ts", "../../design-system/src/acp/components.ts", "../../design-system/src/acp/writer.ts", "../../design-system/src/dashboard/buffer.ts", "../../design-system/src/dashboard/terminal.ts", "../../design-system/src/prompts/index.ts", "../../design-system/src/prompts/primitives/cancel.ts", "../../design-system/src/prompts/primitives/intro.ts", "../../design-system/src/prompts/primitives/note.ts", "../../design-system/src/prompts/primitives/outro.ts", "../../design-system/src/prompts/primitives/spinner.ts", "../../design-system/src/static/spinner.ts", "../../design-system/src/static/menu.ts", "../../toolcraft/src/index.ts", "../../toolcraft/src/user-error.ts", "../../toolcraft/src/human-in-loop/types.ts", "../../toolcraft/src/human-in-loop/config.ts", "../../toolcraft-schema/src/json.ts", "../../toolcraft-schema/src/oneof.ts", "../../toolcraft-schema/src/record.ts", "../../toolcraft-schema/src/union.ts", "../../toolcraft-schema/src/index.ts", "../../toolcraft/src/package-metadata.ts", "../../task-list/src/open.ts", "../../task-list/src/backends/markdown-dir.ts", "../../file-lock/src/lock.ts", "../../task-list/src/schema/task.schema.json", "../../task-list/src/state-machine.ts", "../../task-list/src/types.ts", "../../task-list/src/state.ts", "../../task-list/src/backends/utils.ts", "../../task-list/src/backends/yaml-file.ts", "../../task-list/src/schema/store.schema.json", "../../toolcraft/src/human-in-loop/approval-tasks.ts", "../../toolcraft/src/human-in-loop/state-machine.ts", "../../toolcraft/src/human-in-loop/runner.ts", "../../toolcraft/src/human-in-loop/default-provider.ts", "../../agent-human-in-loop/src/providers/osascript.ts", "../../agent-human-in-loop/src/providers/osascript-script.ts", "../../toolcraft/src/human-in-loop/spawn.ts", "../../toolcraft/src/human-in-loop/gate.ts", "../../toolcraft/src/human-in-loop/approvals-commands.ts", "../../toolcraft/src/mcp-proxy.ts", "../../tiny-mcp-client/src/internal.ts", "../../mcp-oauth/dist/client/auth-store-session-store.js", "../../auth-store/src/encrypted-file-store.ts", "../../auth-store/src/keychain-store.ts", "../../auth-store/src/create-secret-store.ts", "../../mcp-oauth/dist/resource-indicator.js", "../../mcp-oauth/dist/client/default-oauth-client-provider.js", "../../mcp-oauth/dist/client/loopback-authorization.js", "../../mcp-oauth/dist/client/authorization-state.js", "../../mcp-oauth/dist/client/pkce.js", "../../mcp-oauth/dist/client/token-endpoint.js", "../../mcp-oauth/dist/server/jwks-token-verifier.js", "../../tiny-mcp-client/src/oauth-discovery.ts", "../../toolcraft/src/json-schema-converter.ts", "../../toolcraft/src/number-schema.ts", "../../toolcraft/src/renderer.ts", "../src/terminal-pilot.ts", "../src/terminal-session.ts", "../src/ansi.ts", "../src/terminal-buffer.ts", "../src/keys.ts", "../src/terminal-screen.ts", "../src/commands/runtime.ts", "../src/commands/close-session.ts", "../src/commands/create-session.ts", "../src/commands/fill.ts", "../src/commands/get-session.ts", "../../agent-skill-config/src/configs.ts", "../../agent-defs/src/agents/claude-code.ts", "../../agent-defs/src/agents/claude-desktop.ts", "../../agent-defs/src/agents/codex.ts", "../../agent-defs/src/agents/opencode.ts", "../../agent-defs/src/agents/kimi.ts", "../../agent-defs/src/agents/goose.ts", "../../agent-defs/src/agents/poe-agent.ts", "../../agent-defs/src/registry.ts", "../../config-mutations/src/mutations/file-mutation.ts", "../../config-mutations/src/mutations/template-mutation.ts", "../../config-mutations/src/execution/apply-mutation.ts", "../../config-mutations/src/formats/json.ts", "../../config-mutations/src/formats/toml.ts", "../../config-mutations/src/formats/yaml.ts", "../../config-mutations/src/formats/index.ts", "../../config-mutations/src/execution/path-utils.ts", "../../config-mutations/src/fs-utils.ts", "../../config-mutations/src/execution/run-mutations.ts", "../../config-mutations/src/template/render.ts", "../../agent-skill-config/src/templates.ts", "../../agent-skill-config/src/apply.ts", "../src/commands/installer.ts", "../src/commands/install.ts", "../src/commands/list-sessions.ts", "../src/commands/press-key.ts", "../src/commands/read-history.ts", "../src/commands/read-screen.ts", "../src/commands/resize.ts", "../../terminal-png/src/index.ts", "../../terminal-png/src/ansi-parser.ts", "../../terminal-png/src/png-renderer.ts", "../../terminal-png/src/font.ts", "../../terminal-png/src/svg-renderer.ts", "../src/commands/screenshot.ts", "../src/commands/send-signal.ts", "../src/commands/type.ts", "../src/commands/uninstall.ts", "../src/commands/wait-for.ts", "../src/commands/wait-for-exit.ts", "../src/commands/index.ts"],
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 { terminalPilotGroup } from \"./commands/index.js\";\n\nfunction normalizeArgv(argv: string[]): string[] {\n if (\n argv.includes(\"--json\") &&\n !argv.some((argument) => argument === \"--output\" || argument.startsWith(\"--output=\"))\n ) {\n return argv.flatMap((argument) => argument === \"--json\" ? [\"--output\", \"json\"] : [argument]);\n }\n\n return argv;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const originalArgv = process.argv;\n process.argv = normalizeArgv(argv);\n\n try {\n await runCLI(terminalPilotGroup);\n } finally {\n process.argv = originalArgv;\n }\n}\n\nasync function isDirectExecution(argv: string[]): Promise<boolean> {\n const entryPoint = argv[1];\n\n if (typeof entryPoint !== \"string\" || entryPoint.length === 0) {\n return false;\n }\n\n try {\n const modulePath = fileURLToPath(import.meta.url);\n const [resolvedEntryPoint, resolvedModulePath] = await Promise.all([\n realpath(path.resolve(entryPoint)),\n realpath(modulePath)\n ]);\n\n return resolvedEntryPoint === resolvedModulePath;\n } catch {\n return false;\n }\n}\n\nif (await isDirectExecution(process.argv)) {\n await main();\n}\n", "import { access, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Command as CommanderCommand, CommanderError, InvalidArgumentError, Option } from \"commander\";\nimport type {\n AnySchema,\n ArraySchema,\n EnumSchema,\n JsonValueSchema,\n ObjectSchema,\n RecordSchema,\n} from \"toolcraft-schema\";\nimport {\n cancel,\n confirm,\n createLogger,\n formatCommandList,\n formatOptionList,\n getTheme,\n isCancel,\n note,\n promptText,\n renderTable,\n resetOutputFormatCache,\n select,\n text,\n} from \"@poe-code/design-system\";\nimport type {\n Command,\n CommandRequirementOptions,\n Group,\n HandlerContext,\n HandlerEnv,\n HandlerFs,\n SecretDeclarations,\n SecretDefinition,\n Scope,\n} from \"./index.js\";\nimport { ApprovalDeclinedError, UserError, assertCommandRequirements, getCommandSourcePath, resolveCommandSecrets } from \"./index.js\";\nimport { mergeApprovalsGroup } from \"./human-in-loop/approvals-commands.js\";\nimport { invokeWithHumanInLoop } from \"./human-in-loop/index.js\";\nimport type { HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./human-in-loop/index.js\";\nimport { resolveMcpProxies } from \"./mcp-proxy.js\";\nimport { getExpectedNumberDescription, isValidNumberSchemaValue } from \"./number-schema.js\";\nimport { findEntrypointPackageMetadata } from \"./package-metadata.js\";\nimport { renderResult } from \"./renderer.js\";\nimport type { OutputMode } from \"./renderer.js\";\n\nconst RESERVED_SERVICE_NAMES = new Set([\"params\", \"secrets\", \"fetch\", \"fs\", \"env\", \"progress\"]);\nconst NULL_OPTION_VALUE = Symbol(\"toolcraft.cli.null\");\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 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 shortFlag?: string;\n schema: FieldSchema;\n description?: string;\n optional: boolean;\n hasDefault: boolean;\n defaultValue: unknown;\n requiredWhenActive: 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\nexport interface RunCLIOptions<TServices extends object = Record<string, unknown>> {\n apiVersion?: string;\n casing?: Casing;\n humanInLoop?: HumanInLoopRuntimeOptions;\n projectRoot?: string;\n rootDisplayName?: string;\n rootUsageName?: string;\n services?: TServices;\n version?: string;\n presets?: boolean;\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 = previous !== undefined && previous === previous.toLowerCase() && previous !== previous.toUpperCase();\n const nextIsLowercase = next !== undefined && next === next.toLowerCase() && next !== next.toUpperCase();\n\n if (isUppercase && current.length > 0 && (previousIsLowercase || nextIsLowercase)) {\n words.push(current.toLowerCase());\n current = char;\n continue;\n }\n\n current += char;\n }\n\n if (current.length > 0) {\n words.push(current.toLowerCase());\n }\n\n return words;\n}\n\nfunction formatSegment(segment: string, casing: Casing): string {\n const separator = casing === \"snake\" ? \"_\" : \"-\";\n return splitWords(segment).join(separator);\n}\n\nfunction toOptionFlag(path: string[], casing: Casing): string {\n return `--${path.map((segment) => formatSegment(segment, casing)).join(\".\")}`;\n}\n\nfunction toOptionAttribute(path: string[], casing: Casing): string {\n return path\n .map((segment) => {\n const formatted = formatSegment(segment, casing);\n\n if (casing === \"snake\") {\n return formatted;\n }\n\n const words = formatted.split(\"-\");\n return words\n .map((word, index) =>\n index === 0 ? word : `${word[0]?.toUpperCase() ?? \"\"}${word.slice(1)}`\n )\n .join(\"\");\n })\n .join(\".\");\n}\n\nfunction toDisplayPath(path: string[]): string {\n return path.join(\".\");\n}\n\nfunction 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 = rawChildSchema.kind !== \"optional\" && childSchema.default === undefined;\n\n if (childSchema.kind === \"object\") {\n const nested = collectFields(childSchema, casing, globalLongOptionFlags, nextPath, runtimeOptional, variantContext);\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([...nextPath, childSchema.discriminator], casing, globalLongOptionFlags),\n optionFlag: toOptionFlag([...nextPath, childSchema.discriminator], casing),\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) => getRequiredBranchFingerprint(branch, casing));\n const controlField: FieldDefinition = {\n id: controlDisplayPath,\n path: controlPath,\n displayPath: controlDisplayPath,\n optionAttribute: toOptionAttribute(controlPath, casing),\n commanderOptionAttribute: toCommanderOptionAttribute(controlPath, casing, globalLongOptionFlags),\n optionFlag: toOptionFlag(controlPath, casing),\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 shortFlag: childSchema.short,\n schema: childSchema as FieldSchema,\n description: childSchema.description,\n optional: runtimeOptional,\n hasDefault: childSchema.default !== undefined,\n defaultValue: childSchema.default,\n requiredWhenActive,\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(field: FieldDefinition, globalLongOptionFlags: ReadonlySet<string>): 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;\n }\n\n return `-${field.shortFlag}, ${field.optionFlag}`;\n}\n\nfunction formatPositionalToken(field: FieldDefinition): string {\n const optionalPositional = field.optional || field.hasDefault;\n\n if (field.variadicPosition === true) {\n return optionalPositional ? `[${field.displayPath}...]` : `<${field.displayPath}...>`;\n }\n\n return optionalPositional ? `[${field.displayPath}]` : `<${field.displayPath}>`;\n}\n\nfunction parseBooleanText(value: string, label: string): boolean {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"true\") {\n return true;\n }\n\n if (normalized === \"false\") {\n return false;\n }\n\n throw new InvalidArgumentError(`Invalid value for \"${label}\". Expected true or false.`);\n}\n\nfunction parseEnumValue(value: string, values: ReadonlyArray<string | number | boolean>, label: string): string | number | boolean {\n const match = values.find((candidate) => String(candidate) === value);\n\n if (match === undefined) {\n throw new InvalidArgumentError(\n `Invalid value for \"${label}\". Expected one of: ${values.map((candidate) => String(candidate)).join(\", \")}.`\n );\n }\n\n return match;\n}\n\nfunction validateStringPattern(value: string, schema: Extract<ScalarSchema, { kind: \"string\" }>, label: string): string {\n if (schema.pattern === undefined) {\n return value;\n }\n\n if (!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 {\n throw new InvalidArgumentError(`Invalid value for \"${label}\". Expected valid JSON.`);\n }\n}\n\nfunction normalizeCommanderOptionValue(value: unknown): unknown {\n return value === NULL_OPTION_VALUE ? null : value;\n}\n\nfunction parseScalarValue(value: string, schema: ScalarSchema, label: string): 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)}.`\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\n throw new UserError(\"Unsupported CLI schema kind.\");\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) => parseScalarValue(item, itemSchema as ScalarSchema, label));\n}\n\nfunction createOption(field: FieldDefinition, globalLongOptionFlags: ReadonlySet<string>): Option[] {\n const flags = formatOptionFlags(field, globalLongOptionFlags);\n const collidesWithGlobalFlag = globalLongOptionFlags.has(field.optionFlag);\n const commanderValue = (value: unknown): unknown => (value === null ? NULL_OPTION_VALUE : value);\n\n if (field.schema.kind === \"boolean\") {\n if (collidesWithGlobalFlag) {\n return [createCommanderOption(flags, field.description, field)];\n }\n\n const mainOption = createCommanderOption(`${flags} [value]`, field.description, field);\n mainOption.preset(true);\n // Commander v14 passes the preset value through argParser too, so guard with typeof check\n mainOption.argParser((value: string | boolean) =>\n typeof value === \"boolean\" ? value : commanderValue(parseBooleanText(value, field.displayPath))\n );\n\n return [\n mainOption,\n createCommanderOption(`--no-${field.optionFlag.slice(2)}`, field.description, field),\n ];\n }\n\n if (field.schema.kind === \"array\") {\n return [\n createCommanderOption(`${flags} <value...>`, field.description, field).argParser(\n (value: string, previous: unknown[] | null = []) => {\n const parsed = parseArrayValue(value, field.schema as ArraySchema<any>, field.displayPath);\n if (parsed === null) {\n return NULL_OPTION_VALUE as unknown as null;\n }\n\n return [...(previous ?? []), ...parsed];\n }\n ),\n ];\n }\n\n if (field.schema.kind === \"json\") {\n return [\n createCommanderOption(`${flags} <json>`, field.description, field).argParser((value: string) =>\n commanderValue(parseJsonText(value, field.displayPath))\n ),\n ];\n }\n\n const option = createCommanderOption(`${flags} <value>`, field.description, field);\n\n if (field.schema.kind === \"enum\" && field.schema.values.every((value) => typeof value === \"string\")) {\n option.choices([...field.schema.values] as string[]);\n }\n\n option.argParser((value: string) =>\n commanderValue(parseScalarValue(value, field.schema as ScalarSchema, field.displayPath))\n );\n return [option];\n}\n\nconst ALWAYS_GLOBAL_LONG_OPTION_FLAGS = [\"--yes\", \"--output\", \"--verbose\"] as const;\n\nfunction getGlobalLongOptionFlags(presetsEnabled: boolean): ReadonlySet<string> {\n return new Set(presetsEnabled ? [\"--preset\", ...ALWAYS_GLOBAL_LONG_OPTION_FLAGS] : ALWAYS_GLOBAL_LONG_OPTION_FLAGS);\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) {\n option.attributeName = () => field.commanderOptionAttribute;\n }\n\n return option;\n}\n\nfunction hasHelpFlag(argv: string[]): boolean {\n return argv.some((token) => HELP_FLAGS.has(token));\n}\n\nfunction resolveHelpOutput(argv: string[]): OutputMode {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index] ?? \"\";\n\n if (token === \"--output\") {\n const value = argv[index + 1];\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n continue;\n }\n\n if (token.startsWith(\"--output=\")) {\n const value = token.slice(\"--output=\".length);\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n if (value === \"markdown\") {\n return \"md\";\n }\n }\n }\n\n return \"rich\";\n}\n\nfunction isNodeVisibleInScope<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n scope: Scope\n): boolean {\n if (node.kind === \"command\") {\n return node.scope.includes(scope);\n }\n\n return (\n getVisibleChildren(node, scope).length > 0 ||\n Boolean(node.default && node.default.scope.includes(scope)) ||\n node.scope === undefined ||\n node.scope.includes(scope)\n );\n}\n\nfunction getVisibleChildren<TServices extends object>(group: Group<TServices>, scope: Scope): Array<Command<TServices, any, any, any> | Group<TServices>> {\n return group.children.filter((child) => isNodeVisibleInScope(child, scope));\n}\n\nfunction findVisibleChild<TServices extends object>(\n group: Group<TServices>,\n token: string,\n scope: Scope\n): Command<TServices, any, any, any> | Group<TServices> | undefined {\n return getVisibleChildren(group, scope).find(\n (child) => child.name === token || child.aliases.includes(token)\n );\n}\n\nfunction resolveHelpTarget<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n scope: Scope,\n rootDisplayName?: string\n): ResolvedHelpTarget<TServices> {\n const breadcrumb = [rootDisplayName ?? root.name];\n let current: Command<TServices, any, any, any> | Group<TServices> = root;\n\n for (const token of argv.slice(2)) {\n if (token.startsWith(\"-\") || token === \"help\") {\n break;\n }\n\n if (current.kind !== \"group\") {\n break;\n }\n\n const child: Command<TServices, any, any, any> | Group<TServices> | undefined = findVisibleChild(\n current,\n token,\n scope\n );\n if (child === undefined) {\n break;\n }\n\n breadcrumb.push(child.name);\n current = child;\n }\n\n return {\n breadcrumb,\n node: current,\n };\n}\n\nfunction describeSchemaType(schema: FieldSchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n\n case \"number\":\n return \"number\";\n\n case \"boolean\":\n return \"boolean\";\n\n case \"enum\":\n return \"value\";\n\n case \"array\":\n return `${describeSchemaType(unwrapOptional(schema.item) as FieldSchema)}...`;\n\n case \"json\":\n return \"json\";\n\n default:\n throw new UserError(\"Unsupported CLI schema kind.\");\n }\n}\n\nfunction formatHelpFieldFlags(field: FieldDefinition, globalLongOptionFlags: ReadonlySet<string>): string {\n if (field.positionalIndex !== undefined) {\n return formatPositionalToken(field);\n }\n\n if (field.schema.kind === \"boolean\") {\n return `${formatOptionFlags(field, globalLongOptionFlags)} [value]`;\n }\n\n return `${formatOptionFlags(field, globalLongOptionFlags)} <${describeSchemaType(field.schema)}>`;\n}\n\nfunction appendHelpMetadata(description: string, metadata: string[]): string {\n if (metadata.length === 0) {\n return description;\n }\n\n if (description.length === 0) {\n return `(${metadata.join(\", \")})`;\n }\n\n return `${description} (${metadata.join(\", \")})`;\n}\n\nfunction formatHelpFieldDescription(field: FieldDefinition): string {\n const description = field.description ?? field.displayPath;\n const metadata: string[] = [];\n\n if (!field.optional && !field.hasDefault) {\n metadata.push(\"required\");\n }\n\n if (field.hasDefault) {\n metadata.push(`default: ${formatResolvedValue(field.defaultValue)}`);\n }\n\n return appendHelpMetadata(description, metadata);\n}\n\nfunction 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 `${describeSchemaType(valueSchema as FieldSchema)}`;\n }\n\n if (valueSchema.kind === \"object\") {\n return \"value\";\n }\n\n return describeSchemaType(valueSchema as FieldSchema);\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(...collectDynamicObjectHelpRows(childSchema, casing, optionFlag, displayPath, metadata));\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 ? `${optionFlag} [value]`\n : `${optionFlag} <${describeSchemaType(childSchema as FieldSchema)}>`,\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 flags: `${field.optionFlag} <${describeDynamicFieldType(field)}>`,\n description: appendHelpMetadata(field.description ?? field.optionPathDisplay, metadata),\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 wrapOptionalCommandParameterToken(token: string, optional: boolean): string {\n return optional ? `[${token}]` : token;\n}\n\nfunction formatCommandDynamicParameterTokens(field: DynamicFieldDefinition, casing: Casing): 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 .map((field) =>\n wrapOptionalCommandParameterToken(\n formatHelpFieldFlags(field, globalLongOptionFlags),\n field.positionalIndex === undefined && (field.optional || field.hasDefault)\n )\n )\n .concat(collected.dynamicFields.flatMap((field) => formatCommandDynamicParameterTokens(field, casing)));\n}\n\nfunction formatCommandRowName<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n depth: number,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>\n): string {\n const baseName = node.aliases.length === 0 ? node.name : `${node.name} (${node.aliases.join(\", \")})`;\n const parameterTokens =\n node.kind === \"command\" ? formatCommandParameterTokens(node, casing, globalLongOptionFlags) : [];\n const name = parameterTokens.length === 0 ? baseName : `${baseName} ${parameterTokens.join(\" \")}`;\n return `${\" \".repeat(depth)}${name}`;\n}\n\nfunction formatCommandRows<TServices extends object>(\n group: Group<TServices>,\n scope: Scope,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n depth = 0\n): HelpCommandRow[] {\n return getVisibleChildren(group, scope).flatMap((child) => {\n const row = {\n name: formatCommandRowName(child, depth, casing, globalLongOptionFlags),\n description: child.description ?? \"\",\n };\n\n if (child.kind === \"command\") {\n return [row];\n }\n\n return [row, ...formatCommandRows(child, scope, casing, globalLongOptionFlags, depth + 1)];\n });\n}\n\nfunction formatGlobalOptionRows(showVersion: boolean, presetsEnabled: boolean): HelpOptionRow[] {\n const rows: HelpOptionRow[] = [];\n\n if (presetsEnabled) {\n rows.push({\n flags: \"--preset <path>\",\n description: \"Load parameter defaults from a JSON file\",\n });\n }\n\n rows.push(\n {\n flags: \"--yes\",\n description: \"Accept defaults, skip prompts\",\n },\n {\n flags: \"--output <format>\",\n description: \"Output format (rich, md, json)\",\n },\n {\n flags: \"-h, --help\",\n description: \"Show help\",\n }\n );\n\n if (showVersion) {\n rows.push({\n flags: \"--version\",\n description: \"Show version\",\n });\n }\n\n return rows;\n}\n\nfunction renderHelpSections(sections: string[]): string {\n return sections.filter((section) => section.length > 0).join(\"\\n\\n\");\n}\n\nfunction buildUsageLine(breadcrumb: string[], rootUsageName: string | undefined, suffix: string): string | undefined {\n if (rootUsageName === undefined) {\n return undefined;\n }\n const subPath = breadcrumb.slice(1).join(\" \");\n return subPath ? `${rootUsageName} ${subPath} ${suffix}` : `${rootUsageName} ${suffix}`;\n}\n\nfunction renderGroupHelp<TServices extends object>(\n group: Group<TServices>,\n breadcrumb: string[],\n scope: Scope,\n casing: Casing,\n showVersion: boolean,\n presetsEnabled: boolean,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const globalLongOptionFlags = getGlobalLongOptionFlags(presetsEnabled);\n const commandRows = formatCommandRows(group, scope, casing, globalLongOptionFlags);\n\n if (commandRows.length > 0) {\n sections.push(`${text.section(\"Commands:\")}\\n${formatCommandList(commandRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(showVersion, presetsEnabled))}`);\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, \"[options] [command]\"),\n description: group.description,\n requiresAuth: group.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderLeafHelp<TServices extends object>(\n command: Command<TServices, any, any, any>,\n breadcrumb: string[],\n casing: Casing,\n presetsEnabled: boolean,\n rootUsageName?: string\n): string {\n const sections: string[] = [];\n const globalLongOptionFlags = getGlobalLongOptionFlags(presetsEnabled);\n const collected = collectFields(command.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, command.positional);\n const optionRows = fields.map((field) => ({\n flags: formatHelpFieldFlags(field, globalLongOptionFlags),\n description: formatHelpFieldDescription(field),\n })).concat(collected.dynamicFields.flatMap((field) => formatDynamicHelpFields(field, casing)));\n\n if (optionRows.length > 0) {\n sections.push(`${text.section(\"Options:\")}\\n${formatOptionList(optionRows)}`);\n }\n\n sections.push(`${text.section(\"Global options:\")}\\n${formatOptionList(formatGlobalOptionRows(false, presetsEnabled))}`);\n\n const secretRows = formatSecretRows(command.secrets);\n if (secretRows.length > 0) {\n sections.push(`${text.section(\"Secrets (via environment):\")}\\n${formatOptionList(secretRows)}`);\n }\n\n const positionalFields = fields.filter((f) => f.positionalIndex !== undefined);\n const usageSuffix = positionalFields.length > 0\n ? `[options] ${positionalFields.map(formatPositionalToken).join(\" \")}`\n : \"[options]\";\n\n return renderHelpDocument({\n breadcrumb,\n usageLine: buildUsageLine(breadcrumb, rootUsageName, usageSuffix),\n description: command.description,\n requiresAuth: command.requires?.auth === true,\n sections,\n });\n}\n\nfunction renderHelpDocument(input: {\n breadcrumb: string[];\n usageLine?: string;\n description?: string;\n requiresAuth: boolean;\n sections: string[];\n}): string {\n const lines = [text.heading(input.breadcrumb.join(\" \")), \"\"];\n\n if (input.usageLine !== undefined) {\n lines.push(`${text.section(\"Usage:\")} ${text.usageCommand(input.usageLine)}`, \"\");\n }\n\n if (input.description !== undefined) {\n lines.push(input.description);\n }\n\n if (input.requiresAuth) {\n lines.push(\"Requires: authentication\");\n }\n\n if (input.description !== undefined || input.requiresAuth) {\n lines.push(\"\");\n }\n\n lines.push(renderHelpSections(input.sections));\n\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nasync function renderGeneratedHelp<TServices extends object>(\n root: Group<TServices>,\n argv: string[],\n options: RunCLIOptions<TServices>\n): Promise<void> {\n const target = resolveHelpTarget(root, argv, \"cli\", options.rootDisplayName);\n const output = resolveHelpOutput(argv);\n const casing = options.casing ?? \"kebab\";\n\n await withOutputFormat(output, async () => {\n const rendered =\n target.node.kind === \"group\"\n ? renderGroupHelp(\n target.node,\n target.breadcrumb,\n \"cli\",\n casing,\n options.version !== undefined,\n options.presets === true,\n options.rootUsageName\n )\n : renderLeafHelp(target.node, target.breadcrumb, casing, options.presets === true, options.rootUsageName);\n\n process.stdout.write(rendered);\n });\n}\n\nfunction createNodeCommand<TServices extends object>(\n node: Command<TServices, any, any, any> | Group<TServices>,\n casing: Casing,\n globalLongOptionFlags: ReadonlySet<string>,\n execute: (state: ExecutionState<TServices>) => Promise<void>,\n presetsEnabled: boolean,\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 const collected = collectFields(node.params, casing, globalLongOptionFlags);\n const fields = assignPositionals(collected.fields, node.positional);\n\n if (node.description !== undefined) {\n command.description(node.description);\n }\n\n node.aliases.forEach((alias) => command.alias(alias));\n command.addHelpCommand(false);\n addGlobalOptions(command, presetsEnabled);\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 visibleChildren = node.children\n .map((child) => createNodeCommand(child, casing, globalLongOptionFlags, execute, presetsEnabled, nextPathSegments))\n .filter((child): child is CommanderCommand => child !== null);\n\n const group = new CommanderCommand(node.name);\n\n if (node.description !== undefined) {\n group.description(node.description);\n }\n\n node.aliases.forEach((alias) => group.alias(alias));\n group.addHelpCommand(false);\n addGlobalOptions(group, presetsEnabled);\n for (const child of visibleChildren) {\n const isDefaultChild =\n node.default !== undefined &&\n node.default.scope.includes(\"cli\") &&\n (child.name() === node.default.name || child.aliases().includes(node.default.name));\n\n group.addCommand(child, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n return group;\n}\n\nfunction addGlobalOptions(command: CommanderCommand, presetsEnabled: boolean): void {\n if (presetsEnabled) {\n command.option(\"--preset <path>\", \"Load parameter defaults from a JSON file.\");\n }\n\n command\n .option(\"--yes\", \"Accept defaults and skip prompts.\")\n .option(\"--output <format>\", \"Output format.\", (value: string) => {\n if (value === \"rich\" || value === \"md\" || value === \"json\") {\n return value;\n }\n\n if (value === \"markdown\") {\n return \"md\";\n }\n\n throw new InvalidArgumentError('Invalid value for \"--output\". Expected one of: rich, md, markdown, json.');\n })\n .option(\"--verbose\", \"Print stack traces for unexpected errors.\");\n}\n\nfunction setNestedValue(target: Record<string, unknown>, path: string[], value: unknown): void {\n let cursor = target;\n\n for (let index = 0; index < path.length - 1; index += 1) {\n const segment = path[index] ?? \"\";\n const existing = cursor[segment];\n\n if (typeof existing === \"object\" && existing !== null) {\n cursor = existing as Record<string, unknown>;\n continue;\n }\n\n const next: Record<string, unknown> = {};\n cursor[segment] = next;\n cursor = next;\n }\n\n const leaf = path[path.length - 1];\n if (leaf !== undefined) {\n cursor[leaf] = value;\n }\n}\n\nfunction formatResolvedValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\", \");\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return JSON.stringify(value);\n}\n\nasync function promptForField(field: FieldDefinition): Promise<unknown> {\n const schema = field.schema;\n if (schema.kind === \"enum\") {\n const options = schema.loadOptions\n ? await schema.loadOptions()\n : schema.values.map((value) => ({\n label: schema.labels?.[String(value)] ?? String(value),\n value,\n }));\n const selected = await select({\n message: field.description ?? field.displayPath,\n options,\n initialValue: field.hasDefault ? field.defaultValue : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n if (field.schema.kind === \"boolean\") {\n const selected = await confirm({\n message: field.displayPath,\n initialValue: field.hasDefault ? Boolean(field.defaultValue) : undefined,\n });\n\n if (isCancel(selected)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n return selected;\n }\n\n const entered = await promptText({\n message: field.displayPath,\n initialValue:\n field.hasDefault && field.defaultValue !== undefined\n ? formatResolvedValue(field.defaultValue)\n : undefined,\n });\n\n if (isCancel(entered)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (typeof entered !== \"string\") {\n throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\n }\n\n if (entered.trim().length === 0 && field.hasDefault) {\n return field.defaultValue;\n }\n\n if (field.schema.kind === \"array\") {\n return parseArrayValue(entered, field.schema, field.displayPath);\n }\n\n 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\nconst DESIGN_SYSTEM_OUTPUT_BY_MODE = {\n rich: \"terminal\",\n md: \"markdown\",\n json: \"json\",\n} as const satisfies Record<OutputMode, \"terminal\" | \"markdown\" | \"json\">;\n\nfunction toDesignSystemOutput(output: OutputMode): \"terminal\" | \"markdown\" | \"json\" {\n return DESIGN_SYSTEM_OUTPUT_BY_MODE[output];\n}\n\nasync function withOutputFormat<T>(output: OutputMode, fn: () => Promise<T>): Promise<T> {\n const previous = process.env.OUTPUT_FORMAT;\n process.env.OUTPUT_FORMAT = toDesignSystemOutput(output);\n resetOutputFormatCache();\n\n try {\n return await fn();\n } finally {\n if (previous === undefined) {\n delete process.env.OUTPUT_FORMAT;\n } else {\n process.env.OUTPUT_FORMAT = previous;\n }\n resetOutputFormatCache();\n }\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") =>\n readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasFieldValue(value: unknown): boolean {\n return value !== undefined;\n}\n\nfunction hasNestedField(fields: FieldDefinition[], path: string[]): boolean {\n return fields.some(\n (field) =>\n path.length < field.path.length &&\n path.every((segment, index) => field.path[index] === segment)\n );\n}\n\nfunction describeExpectedPresetValue(schema: FieldSchema): string {\n if (schema.kind === \"array\") {\n return \"an array\";\n }\n\n if (schema.kind === \"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.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\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${fieldPath}\". Expected ${describeExpectedPresetValue(schema)}.`\n );\n}\n\nfunction validatePresetFieldValue(\n value: unknown,\n field: FieldDefinition,\n presetPath: string\n): unknown {\n if (field.schema.kind === \"json\") {\n return value;\n }\n\n if (field.schema.kind !== \"array\") {\n return validatePresetScalarValue(value, field.schema as ScalarSchema, field.displayPath, presetPath);\n }\n\n const itemSchema = unwrapOptional(field.schema.item);\n\n if (itemSchema.kind === \"array\" || itemSchema.kind === \"object\") {\n throw new UserError(`Array parameter \"${field.displayPath}\" must use scalar items.`);\n }\n\n if (!Array.isArray(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${field.displayPath}\". Expected an array.`\n );\n }\n\n return value.map((item) =>\n validatePresetScalarValue(item, itemSchema as ScalarSchema, field.displayPath, presetPath)\n );\n}\n\nasync function loadPresetValues(\n fields: FieldDefinition[],\n presetPath: string\n): Promise<Record<string, unknown>> {\n let rawPreset: string;\n\n try {\n rawPreset = await readFile(presetPath, {\n encoding: \"utf8\",\n });\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n throw new UserError(`Preset file \"${presetPath}\" was not found.`);\n }\n\n const message =\n error instanceof Error && error.message.length > 0\n ? error.message\n : \"Unknown read error.\";\n throw new UserError(`Preset file \"${presetPath}\" could not be read: ${message}`);\n }\n\n let parsedPreset: unknown;\n\n try {\n parsedPreset = JSON.parse(rawPreset);\n } catch {\n throw new UserError(`Preset file \"${presetPath}\" is not valid JSON.`);\n }\n\n if (!isPlainObject(parsedPreset)) {\n throw new UserError(`Preset file \"${presetPath}\" must contain a JSON object.`);\n }\n\n const fieldByPath = new Map(fields.map((field) => [field.displayPath, field]));\n const presetValues: Record<string, unknown> = {};\n\n function visitObject(current: Record<string, unknown>, path: string[]): void {\n for (const [key, value] of Object.entries(current)) {\n const nextPath = [...path, key];\n const displayPath = toDisplayPath(nextPath);\n const field = fieldByPath.get(displayPath);\n\n if (field !== undefined) {\n presetValues[field.optionAttribute] = validatePresetFieldValue(value, field, presetPath);\n continue;\n }\n\n if (!hasNestedField(fields, nextPath)) {\n throw new UserError(\n `Preset file \"${presetPath}\" contains unknown parameter \"${displayPath}\".`\n );\n }\n\n if (!isPlainObject(value)) {\n throw new UserError(\n `Preset file \"${presetPath}\" has an invalid value for \"${displayPath}\". Expected an object.`\n );\n }\n\n visitObject(value, nextPath);\n }\n }\n\n visitObject(parsedPreset, []);\n return presetValues;\n}\n\nfunction isNumericFixtureSelector(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeHttpMethod(value: string | undefined): string {\n return (value ?? \"GET\").toUpperCase();\n}\n\nfunction isReadLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"get\" ||\n normalized === \"head\" ||\n normalized === \"options\" ||\n normalized.startsWith(\"read\") ||\n normalized.startsWith(\"get\") ||\n normalized.startsWith(\"find\") ||\n normalized.startsWith(\"list\") ||\n normalized.startsWith(\"load\") ||\n normalized.startsWith(\"fetch\") ||\n normalized.startsWith(\"query\") ||\n normalized.startsWith(\"exists\") ||\n normalized.startsWith(\"has\")\n );\n}\n\nfunction isWriteLikeMethod(name: string): boolean {\n const normalized = name.toLowerCase();\n\n return (\n normalized === \"post\" ||\n normalized === \"put\" ||\n normalized === \"patch\" ||\n normalized === \"delete\" ||\n normalized.startsWith(\"write\") ||\n normalized.startsWith(\"set\") ||\n normalized.startsWith(\"save\") ||\n normalized.startsWith(\"create\") ||\n normalized.startsWith(\"update\") ||\n normalized.startsWith(\"delete\") ||\n normalized.startsWith(\"remove\") ||\n normalized.startsWith(\"insert\")\n );\n}\n\nfunction matchesFixtureValue(expected: unknown, actual: unknown): boolean {\n if (typeof expected === \"string\" && typeof actual === \"string\" && expected.endsWith(\"%\")) {\n return actual.startsWith(expected.slice(0, -1));\n }\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual) || expected.length !== actual.length) {\n return false;\n }\n\n return expected.every((item, index) => matchesFixtureValue(item, actual[index]));\n }\n\n if (isPlainObject(expected)) {\n if (!isPlainObject(actual)) {\n return false;\n }\n\n return Object.entries(expected).every(([key, value]) => matchesFixtureValue(value, actual[key]));\n }\n\n return Object.is(expected, actual);\n}\n\nfunction getFetchUrl(input: RequestInfo | URL): string {\n if (typeof input === \"string\") {\n return input;\n }\n\n if (input instanceof URL) {\n return input.toString();\n }\n\n return input.url;\n}\n\nfunction createFixtureResponse(response: FixtureFetchResponse): Response {\n const status = response.status ?? 200;\n const headers = new Headers(response.headers);\n\n if (response.body === undefined) {\n return new Response(null, {\n status,\n headers,\n });\n }\n\n if (typeof response.body === \"string\") {\n return new Response(response.body, {\n status,\n headers,\n });\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return new Response(JSON.stringify(response.body), {\n status,\n headers,\n });\n}\n\nfunction createFixtureFetch(entries: FixtureFetchEntry[] | undefined): typeof globalThis.fetch {\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = normalizeHttpMethod(init?.method ?? (input instanceof Request ? input.method : undefined));\n const url = getFetchUrl(input);\n const match = entries?.find((entry) => {\n const requestMethod = normalizeHttpMethod(entry.request.method);\n return requestMethod === method && entry.request.url === url;\n });\n\n if (match !== undefined) {\n return createFixtureResponse(match.response);\n }\n\n if (isReadLikeMethod(method)) {\n return null as unknown as Response;\n }\n\n return new Response(null, {\n status: 204,\n });\n };\n}\n\nfunction createFixtureFs(definition: unknown): HandlerFs {\n const fsDefinition = isPlainObject(definition) ? definition : {};\n const readFileEntries = isPlainObject(fsDefinition.readFile) ? fsDefinition.readFile : {};\n const existsEntries = isPlainObject(fsDefinition.exists) ? fsDefinition.exists : {};\n\n return {\n readFile: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(readFileEntries, filePath)) {\n return String(readFileEntries[filePath]);\n }\n\n return null as unknown as string;\n },\n writeFile: async () => undefined,\n exists: async (filePath: string) => {\n if (Object.prototype.hasOwnProperty.call(existsEntries, filePath)) {\n return Boolean(existsEntries[filePath]);\n }\n\n return Object.prototype.hasOwnProperty.call(readFileEntries, filePath);\n },\n };\n}\n\nfunction resolveFixtureMethodResult(\n methodName: string,\n definition: unknown,\n args: unknown[]\n): Promise<unknown> {\n if (Array.isArray(definition)) {\n for (const entry of definition) {\n if (!isPlainObject(entry)) {\n continue;\n }\n\n const explicitMatcher = isPlainObject(entry.request) ? entry.request : undefined;\n const matcher =\n explicitMatcher ??\n Object.fromEntries(\n Object.entries(entry).filter(([key]) => key !== \"result\" && key !== \"response\" && key !== \"error\")\n );\n\n const firstArg = args[0];\n let matched = false;\n\n if (Array.isArray(matcher.args)) {\n matched = matchesFixtureValue(matcher.args, args);\n } else if (Object.keys(matcher).length === 0) {\n matched = true;\n } else if (isPlainObject(firstArg)) {\n matched = matchesFixtureValue(matcher, firstArg);\n } else if (args.length === 1 && Object.keys(matcher).length === 1) {\n const [[, expectedValue]] = Object.entries(matcher);\n matched = matchesFixtureValue(expectedValue, firstArg);\n }\n\n if (!matched) {\n continue;\n }\n\n if (entry.error !== undefined) {\n throw new Error(String(entry.error));\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"result\")) {\n return Promise.resolve(entry.result);\n }\n\n if (Object.prototype.hasOwnProperty.call(entry, \"response\")) {\n return Promise.resolve(entry.response);\n }\n\n return Promise.resolve(null);\n }\n }\n\n if (isPlainObject(definition)) {\n const firstArg = args[0];\n\n if (typeof firstArg === \"string\" && Object.prototype.hasOwnProperty.call(definition, firstArg)) {\n return Promise.resolve(definition[firstArg]);\n }\n }\n\n if (isWriteLikeMethod(methodName)) {\n return Promise.resolve(undefined);\n }\n\n return Promise.resolve(null);\n}\n\nfunction createFixtureService(definition: unknown): Record<string, unknown> {\n const methods = isPlainObject(definition) ? definition : {};\n\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === \"then\") {\n return undefined;\n }\n\n const methodName = String(property);\n return async (...args: unknown[]) => resolveFixtureMethodResult(methodName, methods[methodName], args);\n },\n }\n );\n}\n\nfunction resolveFixturePath(commandPath: string): string {\n const parsed = path.parse(commandPath);\n return path.join(parsed.dir, `${parsed.name}.fixture.json`);\n}\n\nfunction selectFixtureScenario(scenarios: FixtureScenario[], selector: string): FixtureScenario {\n if (isNumericFixtureSelector(selector)) {\n const index = Number(selector) - 1;\n const scenario = scenarios[index];\n\n if (scenario === undefined) {\n throw new UserError(\n `Fixture scenario index ${selector} is out of range. Available scenarios: ${scenarios.length}.`\n );\n }\n\n return scenario;\n }\n\n const scenario = scenarios.find((entry) => entry.name === selector);\n\n if (scenario === undefined) {\n throw new UserError(`Fixture scenario \"${selector}\" was not found.`);\n }\n\n return scenario;\n}\n\nasync function loadFixtureScenario(command: Command<any, any, any, any>, selector: string): Promise<FixtureScenario> {\n const commandPath = getCommandSourcePath(command);\n\n if (commandPath === undefined) {\n throw new UserError(`Fixture mode could not determine the source file for command \"${command.name}\".`);\n }\n\n const fixturePath = resolveFixturePath(commandPath);\n let rawFixture: string;\n\n try {\n rawFixture = await readFile(fixturePath, {\n encoding: \"utf8\",\n });\n } catch {\n throw new UserError(\n `Fixture file not found for command \"${command.name}\". Expected ${fixturePath}.`\n );\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(rawFixture);\n } catch {\n throw new UserError(`Fixture file ${fixturePath} is not valid JSON.`);\n }\n\n if (!Array.isArray(parsed)) {\n throw new UserError(`Fixture file ${fixturePath} must contain a JSON array of scenarios.`);\n }\n\n return selectFixtureScenario(parsed as FixtureScenario[], selector);\n}\n\nfunction resolveFixtureSecrets(command: Command<any, any, any, any>): Record<string, string> {\n return Object.fromEntries(Object.keys(command.secrets).map((name) => [name, \"fixture-secret\"]));\n}\n\nfunction createFixtureEnvValues(command: Command<any, any, any, any>): Record<string, string | undefined> {\n const values: Record<string, string | undefined> = {\n ...process.env,\n POE_API_KEY: process.env.POE_API_KEY ?? \"fixture-secret\",\n };\n\n for (const secret of Object.values(command.secrets)) {\n values[secret.env] = values[secret.env] ?? \"fixture-secret\";\n }\n\n return values;\n}\n\nasync function resolveFixtureRuntime<TServices extends object>(\n command: Command<TServices, any, any, any>,\n services: TServices,\n requirementOptions: CommandRequirementOptions\n): Promise<ResolvedFixtureRuntime<TServices>> {\n const selector = process.env.TOOLCRAFT_FIXTURE;\n\n if (selector === undefined || selector.length === 0) {\n return {\n env: createEnv(),\n fetch: globalThis.fetch,\n fs: createFs(),\n isFixture: false,\n requirementOptions,\n secrets: resolveCommandSecrets(command),\n services,\n };\n }\n\n const scenario = await loadFixtureScenario(command, selector);\n const scenarioServices = isPlainObject(scenario.services) ? scenario.services : {};\n const customServiceNames = new Set([\n ...Object.keys(services as Record<string, unknown>),\n ...Object.keys(scenarioServices).filter((name) => !RESERVED_SERVICE_NAMES.has(name)),\n ]);\n const fixtureServices = Object.fromEntries(\n [...customServiceNames].map((name) => [name, createFixtureService(scenarioServices[name])])\n ) as TServices;\n const fixtureEnvValues = createFixtureEnvValues(command);\n\n return {\n env: createEnv(fixtureEnvValues),\n fetch: createFixtureFetch(scenarioServices.fetch as FixtureFetchEntry[] | undefined),\n fs: createFixtureFs(scenarioServices.fs),\n isFixture: true,\n requirementOptions: {\n ...requirementOptions,\n env: fixtureEnvValues,\n },\n secrets: resolveFixtureSecrets(command),\n services: fixtureServices,\n };\n}\n\nfunction writeRichHeader(title: string): void {\n const padding = Math.max(12, 34 - title.length);\n process.stdout.write(`\u2500\u2500 ${title} ${\"\u2500\".repeat(padding)}\\n`);\n}\n\nfunction 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\nfunction validateServices(services: Record<string, unknown>): void {\n for (const name of Object.keys(services)) {\n if (RESERVED_SERVICE_NAMES.has(name)) {\n throw new Error(`Service name \"${name}\" is reserved. Choose a different name.`);\n }\n }\n}\n\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 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 (token.startsWith(\"-\")) {\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 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): {\n displayPath: string;\n path: string[];\n schema: FieldSchema;\n} {\n const unwrappedSchema = unwrapOptional(schema);\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(`Unsupported dynamic CLI schema kind \"${unwrappedSchema.kind}\".`);\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<[string, AnySchema]>) {\n if (formatSegment(key, casing) !== head) {\n continue;\n }\n\n return resolveDynamicLeaf(childSchema, rest, casing, [...outputPath, key], [...displayPath, key]);\n }\n\n throw new UserError(`Unknown parameter \"${[...displayPath, head].join(\".\")}\".`);\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 );\n }\n\n case \"array\": {\n const itemSchema = unwrapOptional(unwrappedSchema.item);\n if (itemSchema.kind !== \"object\") {\n throw new UserError(`Array parameter \"${toDisplayPath(displayPath)}\" must use object items.`);\n }\n\n const [head, ...rest] = rawSegments;\n if (head === undefined || !isNumericFixtureSelector(head)) {\n throw new UserError(`Array parameter \"${toDisplayPath(displayPath)}\" must use numeric indices.`);\n }\n\n return resolveDynamicLeaf(itemSchema, rest, casing, [...outputPath, head], [...displayPath, head]);\n }\n\n default:\n throw new UserError(`Unknown parameter \"${[...displayPath, ...rawSegments].join(\".\")}\".`);\n }\n}\n\nfunction finalizeDynamicValue(schema: AnySchema, value: unknown, displayPath: string): 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 throw new UserError(`Invalid value for \"${displayPath}\". Expected indexed object entries.`);\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 throw new UserError(`Array parameter \"${displayPath}\" must use numeric indices.`);\n }\n\n for (let index = 0; index < indices.length; index += 1) {\n if (indices[index] !== index) {\n throw new UserError(`Array parameter \"${displayPath}\" must use contiguous indices starting at 0.`);\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 )\n );\n }\n\n case \"object\": {\n if (!isPlainObject(value)) {\n throw new UserError(`Invalid value for \"${displayPath}\". Expected an object.`);\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, rawChildSchema] of Object.entries(unwrappedSchema.shape) as Array<[string, AnySchema]>) {\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 throw new UserError(`Missing required parameter \"${childDisplayPath}\".`);\n }\n\n result[key] = finalizeDynamicValue(rawChildSchema, childValue, childDisplayPath);\n }\n\n return result;\n }\n\n case \"record\": {\n if (!isPlainObject(value)) {\n throw new UserError(`Invalid value for \"${displayPath}\". Expected an object.`);\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 ),\n ])\n );\n }\n\n default:\n throw new UserError(`Unsupported dynamic CLI schema kind \"${unwrappedSchema.kind}\".`);\n }\n}\n\nfunction parseDynamicValues(\n dynamicFields: DynamicFieldDefinition[],\n rawArgv: string[],\n casing: Casing\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((left, right) => right.optionPath.length - left.optionPath.length);\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(`Unknown parameter \"${flagName}\".`);\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);\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 ),\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): 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\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 throw new UserError(`Missing required parameter \"${variant.controlDisplayPath}\".`);\n }\n\n const selectedBranch = variant.branches.find((branch) => branch.branchId === selectedBranchId);\n if (selectedBranch === undefined) {\n throw new UserError(\n `Invalid value for \"${variant.controlDisplayPath}\". Expected one of: ${variant.branches.map((branch) => branch.branchId).join(\", \")}.`\n );\n }\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 throw new UserError(\n `Parameter \"${field.displayPath}\" is not valid when \"${variant.controlDisplayPath}\" is \"${selectedBranch.branchId}\".`\n );\n }\n }\n\n const invalidDynamicFieldId = branch.dynamicFieldIds.find((fieldId) => providedDynamicFieldIds.has(fieldId));\n if (invalidDynamicFieldId !== undefined) {\n const field = dynamicFieldById.get(invalidDynamicFieldId);\n if (field !== undefined) {\n throw new UserError(\n `Parameter \"${field.displayPath}\" is not valid when \"${variant.controlDisplayPath}\" is \"${selectedBranch.branchId}\".`\n );\n }\n }\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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): 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\n for (const field of fields) {\n let value: unknown;\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 Object.prototype.hasOwnProperty.call(presetValues, field.optionAttribute)\n ) {\n value = presetValues[field.optionAttribute];\n source = \"preset\";\n }\n\n if (value === undefined && shouldPrompt && !field.optional) {\n value = await promptForField(field);\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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)\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 throw new UserError(`Missing required parameter \"${field.displayPath}\".`);\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 );\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 runtimeOptions: HumanInLoopRuntimeOptions | undefined\n): Promise<void> {\n const logger = createLogger();\n const primitives = {\n logger,\n renderTable,\n getTheme,\n note,\n };\n const optionValues = state.actionCommand.optsWithGlobals() as Record<string, unknown>;\n const resolvedFlags = optionValues as ResolvedFlags;\n const output = resolveOutput(resolvedFlags);\n const shouldPrompt = !resolvedFlags.yes && Boolean(process.stdin.isTTY);\n const runtime = await resolveFixtureRuntime(state.command, services, requirementOptions);\n const preflightContext = {\n ...runtime.services,\n secrets: runtime.secrets,\n fetch: runtime.fetch,\n fs: runtime.fs,\n env: runtime.env,\n progress(message: string): void {\n logger.info(message);\n },\n };\n\n await withOutputFormat(output, async () => {\n await assertCommandRequirements(state.command, preflightContext, runtime.requirementOptions);\n\n const params = await resolveParams(\n state.fields,\n state.dynamicFields,\n state.variants,\n state.positionalValues,\n optionValues,\n state.rawArgv,\n state.casing,\n state.presetsEnabled ? resolvedFlags.preset : undefined,\n shouldPrompt\n );\n\n const context = {\n ...preflightContext,\n params,\n } as HandlerContext<any, any, TServices>;\n\n if (state.command.confirm && !state.command.humanInLoop && !resolvedFlags.yes && process.stdin.isTTY) {\n for (const field of state.fields) {\n const value = field.path.reduce<unknown>(\n (current, segment) =>\n current && typeof current === \"object\"\n ? (current as Record<string, unknown>)[segment]\n : undefined,\n params\n );\n\n if (value !== undefined) {\n logger.resolved(field.displayPath, formatResolvedValue(value));\n }\n }\n\n const proceed = await confirm({\n message: \"Proceed?\",\n initialValue: true,\n });\n\n if (isCancel(proceed)) {\n cancel(\"Operation cancelled.\");\n throw new UserError(\"Operation cancelled.\");\n }\n\n if (proceed !== true) {\n throw new UserError(\"Operation cancelled.\");\n }\n }\n\n const result = await invokeWithHumanInLoop(state.command, context, runtimeOptions, state.commandPath);\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 renderResult(state.command, result, output, primitives);\n });\n}\n\nfunction handleRunError(error: unknown, verbose: boolean): void {\n const logger = createLogger();\n\n if (error instanceof UserError) {\n logger.error(error.message);\n process.exitCode = 1;\n return;\n }\n\n if (error instanceof CommanderError) {\n process.exitCode = error.exitCode;\n if (error.code === \"commander.helpDisplayed\" || error.code === \"commander.version\") {\n return;\n }\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n logger.error(verbose ? message : `${message} Use --verbose for a stack trace.`);\n\n if (verbose && error instanceof Error && error.stack) {\n process.stderr.write(`${error.stack}\\n`);\n }\n\n process.exitCode = 1;\n}\n\nexport async function runCLI<TServices extends object = Record<string, unknown>>(\n roots: Group<TServices> | Group<TServices>[],\n options: RunCLIOptions<TServices> = {}\n): Promise<void> {\n const root = mergeApprovalsGroup(normalizeRoots(roots, process.argv));\n await resolveMcpProxies(root, { projectRoot: options.projectRoot });\n const casing = options.casing ?? \"kebab\";\n const services = (options.services ?? {}) as TServices;\n const runtimeOptions = options.humanInLoop ?? {};\n const version = options.version ?? findEntrypointPackageMetadata(process.argv[1])?.version;\n const servicesWithBuiltIns = {\n ...services,\n runtimeOptions,\n root,\n } as TServices;\n const requirementOptions = {\n apiVersion: options.apiVersion,\n } satisfies CommandRequirementOptions;\n\n validateServices(services as Record<string, unknown>);\n\n if (hasHelpFlag(process.argv)) {\n await renderGeneratedHelp(root, process.argv, { ...options, version });\n return;\n }\n\n const program = new CommanderCommand();\n program.name(root.name);\n program.exitOverride();\n program.showHelpAfterError();\n program.addHelpCommand(false);\n const presetsEnabled = options.presets === true;\n const globalLongOptionFlags = getGlobalLongOptionFlags(presetsEnabled);\n addGlobalOptions(program, presetsEnabled);\n\n if (version !== undefined) {\n program.version(version, \"--version\");\n }\n\n let lastActionCommand: CommanderCommand | undefined;\n const execute = async (state: ExecutionState<TServices>) => {\n lastActionCommand = state.actionCommand;\n await executeCommand(state, servicesWithBuiltIns, requirementOptions, runtimeOptions);\n };\n\n for (const child of root.children) {\n const command = createNodeCommand(child, casing, globalLongOptionFlags, execute, presetsEnabled);\n if (command === null) {\n continue;\n }\n\n const isDefaultChild =\n root.default !== undefined &&\n root.default.scope.includes(\"cli\") &&\n (command.name() === root.default.name || command.aliases().includes(root.default.name));\n\n program.addCommand(command, isDefaultChild ? { isDefault: true } : undefined);\n }\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof ApprovalDeclinedError) {\n renderApprovalDeclined(error);\n return;\n }\n\n handleRunError(\n error,\n lastActionCommand ? Boolean(getResolvedFlags(lastActionCommand).verbose) : process.argv.includes(\"--verbose\")\n );\n }\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "export const widths = {\n header: 60,\n helpColumn: 24,\n maxLine: 80\n} as const;\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().intro(content);\n },\n heading(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return getTheme().header(content);\n },\n section(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return typography.bold(content);\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().accent(content);\n },\n argument(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `<${content}>`;\n return getTheme().muted(content);\n },\n option(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().muted(content);\n },\n usageCommand(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}](${content})`;\n return getTheme().accent(content);\n },\n muted(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `*${content}*`;\n return getTheme().muted(content);\n },\n badge(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}]`;\n return getTheme().badge(content);\n },\n selectLabel(label: string, detail?: string): string {\n if (!detail) {\n return label;\n }\n const format = resolveOutputFormat();\n if (format !== \"terminal\") {\n return `${label} \u2014 ${detail}`;\n }\n return `${label} ${typography.dim(\"\u2014\")} ${typography.dim(detail)}`;\n }\n} as const;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "import chalk from \"chalk\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import chalk from \"chalk\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = chalk.gray(\"\u2502\"),\n secondarySymbol = chalk.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { text } from \"./text.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface CommandInfo {\n name: string;\n description: string;\n}\n\nexport interface OptionInfo {\n flags: string;\n description: string;\n}\n\nexport function formatCommand(name: string, description: string): string {\n const paddedName = name.padEnd(widths.helpColumn);\n return ` ${text.command(paddedName)} ${description}`;\n}\n\nexport function formatUsage(command: string, args?: string): string {\n const argsStr = args ? ` ${text.argument(args)}` : \"\";\n return `${text.usageCommand(command)}${argsStr}`;\n}\n\nexport function formatOption(flags: string, description: string): string {\n const paddedFlags = flags.padEnd(widths.helpColumn);\n return ` ${text.option(paddedFlags)} ${description}`;\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return commands.map((cmd) => formatCommand(cmd.name, cmd.description)).join(\"\\n\");\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return options.map((opt) => formatOption(opt.flags, opt.description)).join(\"\\n\");\n}\n\nexport const helpFormatter = {\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList\n} as const;\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { renderMarkdown } from \"../terminal-markdown/index.js\";\nimport { getAcpWriter } from \"./writer.js\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n getAcpWriter()(line);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nfunction formatCost(costUsd: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(costUsd);\n}\n\nexport function renderAgentMessage(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **agent:** ${text}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"agent_message\", text }));\n return;\n }\n\n const rendered = renderMarkdown(text).trimEnd();\n writeLine(`${AGENT_PREFIX}${rendered}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2192 ${kind}: ${title}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_start\", kind, title }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2713 ${kind}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_complete\", kind }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *thinking:* ${truncate(text, 80)}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"reasoning\", text }));\n return;\n }\n\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const format = resolveOutputFormat();\n const cached =\n typeof tokens.cached === \"number\" && tokens.cached > 0 ? ` (${tokens.cached} cached)` : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n cost = ` (${formatCost(tokens.costUsd)})`;\n }\n\n if (format === \"markdown\") {\n writeLine(`- **tokens:** ${tokens.input} in \u2192 ${tokens.output} out${cost}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(\n JSON.stringify({\n event: \"usage\",\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n cachedTokens: tokens.cached ?? 0,\n costUsd: tokens.costUsd ?? 0\n })\n );\n return;\n }\n\n writeLine(\"\");\n writeLine(chalk.green(`\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`));\n}\n\nexport function renderError(message: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **error:** ${message}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"error\", message }));\n return;\n }\n\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import chalk from \"chalk\";\nimport type { Cell, CellStyle, Rect } from \"./types.js\";\n\nconst EMPTY_CELL: Cell = { ch: \" \", style: {} };\n\nexport class ScreenBuffer {\n private _width: number;\n private _height: number;\n private _cells: Cell[];\n\n constructor(width: number, height: number) {\n this._width = normalizeSize(width);\n this._height = normalizeSize(height);\n this._cells = createCells(this._width, this._height);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n put(x: number, y: number, text: string, style?: CellStyle): void {\n if (!this.isInBoundsY(y) || text.length === 0) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n let offset = 0;\n\n for (const ch of text) {\n const targetX = x + offset;\n offset += 1;\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n get(x: number, y: number): Cell {\n if (!this.isInBounds(x, y)) {\n return cloneCell(EMPTY_CELL);\n }\n\n return cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n\n clear(style?: CellStyle): void {\n this._cells = createCells(this._width, this._height, style);\n }\n\n clearRect(rect: Rect, style?: CellStyle): void {\n const startX = Math.max(0, rect.x);\n const startY = Math.max(0, rect.y);\n const endX = Math.min(this._width, rect.x + Math.max(0, rect.width));\n const endY = Math.min(this._height, rect.y + Math.max(0, rect.height));\n const normalizedStyle = normalizeStyle(style);\n\n for (let y = startY; y < endY; y += 1) {\n for (let x = startX; x < endX; x += 1) {\n this._cells[this.index(x, y)] = { ch: \" \", style: normalizedStyle };\n }\n }\n }\n\n resize(width: number, height: number): void {\n const nextWidth = normalizeSize(width);\n const nextHeight = normalizeSize(height);\n const nextCells = createCells(nextWidth, nextHeight);\n const copyWidth = Math.min(this._width, nextWidth);\n const copyHeight = Math.min(this._height, nextHeight);\n\n for (let y = 0; y < copyHeight; y += 1) {\n for (let x = 0; x < copyWidth; x += 1) {\n nextCells[(y * nextWidth) + x] = cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n }\n\n this._width = nextWidth;\n this._height = nextHeight;\n this._cells = nextCells;\n }\n\n putInRect(rect: Rect, row: number, text: string, style?: CellStyle): void {\n if (row < 0 || row >= rect.height || text.length === 0 || rect.width <= 0) {\n return;\n }\n\n const y = rect.y + row;\n if (!this.isInBoundsY(y)) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n const rectEndX = rect.x + rect.width;\n let offset = 0;\n\n for (const ch of text) {\n const targetX = rect.x + offset;\n offset += 1;\n\n if (targetX >= rectEndX) {\n break;\n }\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n private index(x: number, y: number): number {\n return (y * this._width) + x;\n }\n\n private isInBounds(x: number, y: number): boolean {\n return this.isInBoundsX(x) && this.isInBoundsY(y);\n }\n\n private isInBoundsX(x: number): boolean {\n return x >= 0 && x < this._width;\n }\n\n private isInBoundsY(y: number): boolean {\n return y >= 0 && y < this._height;\n }\n}\n\nexport function diff(\n prev: ScreenBuffer,\n next: ScreenBuffer\n): Array<{ x: number; y: number; cell: Cell }> {\n const changes: Array<{ x: number; y: number; cell: Cell }> = [];\n const width = Math.max(prev.width, next.width);\n const height = Math.max(prev.height, next.height);\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const previousCell = prev.get(x, y);\n const nextCell = next.get(x, y);\n\n if (!cellsEqual(previousCell, nextCell)) {\n changes.push({ x, y, cell: nextCell });\n }\n }\n }\n\n return changes;\n}\n\nexport function cellToAnsi(cell: Cell): string {\n const style = cell.style ?? {};\n let painter = chalk;\n\n if (style.bold) {\n painter = painter.bold;\n }\n\n if (style.dim) {\n painter = painter.dim;\n }\n\n if (style.fg) {\n painter = applyForegroundColor(painter, style.fg);\n }\n\n if (style.bg) {\n painter = applyBackgroundColor(painter, style.bg);\n }\n\n return painter(cell.ch);\n}\n\nfunction createCells(width: number, height: number, style?: CellStyle): Cell[] {\n const normalizedStyle = normalizeStyle(style);\n return Array.from({ length: width * height }, () => ({ ch: \" \", style: normalizedStyle }));\n}\n\nfunction cloneCell(cell: Cell): Cell {\n return {\n ch: cell.ch,\n style: normalizeStyle(cell.style)\n };\n}\n\nfunction normalizeStyle(style?: CellStyle): CellStyle {\n const next: CellStyle = {};\n\n if (style?.fg !== undefined) {\n next.fg = style.fg;\n }\n\n if (style?.bg !== undefined) {\n next.bg = style.bg;\n }\n\n if (style?.bold !== undefined) {\n next.bold = style.bold;\n }\n\n if (style?.dim !== undefined) {\n next.dim = style.dim;\n }\n\n return next;\n}\n\nfunction normalizeSize(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction cellsEqual(left: Cell, right: Cell): boolean {\n return left.ch === right.ch\n && left.style.fg === right.style.fg\n && left.style.bg === right.style.bg\n && left.style.bold === right.style.bold\n && left.style.dim === right.style.dim;\n}\n\nfunction applyForegroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.hex(color);\n }\n\n const painter = (instance as unknown as Record<string, unknown>)[color];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n\nfunction applyBackgroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.bgHex(color);\n }\n\n const methodName = color.startsWith(\"bg\")\n ? color\n : `bg${color.charAt(0).toUpperCase()}${color.slice(1)}`;\n const painter = (instance as unknown as Record<string, unknown>)[methodName];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import chalk from \"chalk\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nexport { isCancel } from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2514\")} ${chalk.red(msg)}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { text } from \"../../components/text.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${text.intro(title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nfunction getVisibleWidth(value: string): number {\n return stripAnsi(value).length;\n}\n\nfunction renderTerminalNote(message: string, title?: string): string {\n const contentLines = [\"\", ...message.split(\"\\n\"), \"\"];\n const visibleTitle = stripAnsi(title ?? \"\");\n const contentWidth = Math.max(\n visibleTitle.length,\n ...contentLines.map((line) => getVisibleWidth(line))\n ) + 2;\n const titleLine = `${chalk.green(\"\u25C7\")} ${chalk.reset(title ?? \"\")} ${chalk.gray(\n `${\"\u2500\".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`\n )}`;\n const content = contentLines.map((line) => {\n const padding = \" \".repeat(contentWidth - getVisibleWidth(line));\n return `${chalk.gray(\"\u2502\")} ${line}${padding}${chalk.gray(\"\u2502\")}`;\n });\n const bottom = chalk.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [chalk.gray(\"\u2502\"), titleLine, ...content, bottom].join(\"\\n\");\n}\n\nexport function note(message: string, title?: string): void {\n const format = resolveOutputFormat();\n const strippedMessage = stripAnsi(message);\n const strippedTitle = stripAnsi(title ?? \"\");\n\n if (format === \"markdown\") {\n const lines = strippedMessage.split(\"\\n\");\n const heading = strippedTitle ? `> **${strippedTitle}**\\n` : \"\";\n const body = lines.map((line) => `> ${line}`).join(\"\\n\");\n process.stdout.write(`${heading}${body}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({\n type: \"note\",\n title: strippedTitle,\n message: strippedMessage\n })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${renderTerminalNote(message, title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function outro(message: string): void {\n const format = resolveOutputFormat();\n const stripped = stripAnsi(message);\n\n if (format === \"markdown\") {\n process.stdout.write(`---\\n${stripped}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"outro\", message: stripped })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2502\")}\\n${chalk.gray(\"\u2514\")} ${message}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\nimport { SPINNER_FRAMES } from \"../../static/spinner.js\";\n\nexport interface SpinnerOptions {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n}\n\nfunction writeTerminalFrame(frame: string, message: string): void {\n process.stdout.write(`\\r\\x1b[K${frame} ${message}`);\n}\n\nexport function spinner(): SpinnerOptions {\n let currentMessage = \"\";\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n let fallback = false;\n\n const format = resolveOutputFormat();\n\n const renderFrame = (): void => {\n writeTerminalFrame(SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length], currentMessage);\n };\n\n const clearTimer = (): void => {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n };\n\n return {\n start(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}...\\n`);\n return;\n }\n\n fallback = process.env.POE_NO_SPINNER === \"1\" || !process.stdout.isTTY;\n if (fallback) {\n process.stdout.write(`${currentMessage}\\n`);\n return;\n }\n\n frameIndex = 0;\n renderFrame();\n timer = setInterval(() => {\n frameIndex += 1;\n renderFrame();\n }, 16);\n },\n\n message(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format !== \"terminal\" || fallback || !timer) {\n return;\n }\n\n renderFrame();\n },\n\n stop(message = currentMessage, code?: number): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"spinner\", state: \"stopped\", message: currentMessage })}\\n`\n );\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}\\n`);\n return;\n }\n\n clearTimer();\n\n const symbol = code === undefined || code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n\n if (fallback) {\n process.stdout.write(`${symbol} ${currentMessage}\\n`);\n return;\n }\n\n process.stdout.write(`\\r\\x1b[K${symbol} ${currentMessage}\\n`);\n }\n };\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? chalk.green(\"\u25C6\") : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const format = resolveOutputFormat();\n const selectedIndex = opts.selectedIndex ?? 0;\n\n if (format === \"markdown\") {\n return [\n `**${opts.message}**`,\n ...opts.options.map(\n (option, index) => `- [${index === selectedIndex ? \"x\" : \" \"}] ${option.label}`\n )\n ].join(\"\\n\");\n }\n\n if (format === \"json\") {\n return JSON.stringify({\n type: \"menu\",\n message: opts.message,\n options: opts.options,\n selected: selectedIndex\n });\n }\n\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport type { ObjectSchema, Static } from \"toolcraft-schema\";\nimport type { LoggerOutput, RenderTableOptions, ThemePalette } from \"@poe-code/design-system\";\nimport { ApprovalDeclinedError } from \"./human-in-loop/types.js\";\nimport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./human-in-loop/types.js\";\nimport { mergeHumanInLoopFromGroup, validateHumanInLoopOnDefine } from \"./human-in-loop/config.js\";\nimport { UserError } from \"./user-error.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 { mode: infer TMode extends HumanInLoopMode }\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(path: string, contents: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n}\n\nexport interface HandlerEnv {\n get(key: string): string | undefined;\n}\n\nexport interface RenderPrimitives {\n logger: LoggerOutput;\n renderTable(options: RenderTableOptions): string;\n getTheme(): ThemePalette;\n note(message: string, title?: string): void;\n}\n\nexport interface CheckResult {\n ok: boolean;\n message?: string;\n}\n\nexport type GroupCheckContext<TServices extends object = EmptyServices> = TServices & {\n params?: unknown;\n secrets?: Record<string, string | undefined>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport type CommandCheckContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params?: Static<TParamsSchema>;\n secrets?: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface Requires<TContext = unknown> {\n auth?: boolean;\n apiVersion?: string;\n check?: (ctx: TContext) => Promise<CheckResult>;\n}\n\nexport interface Renderers<TResult> {\n rich?: (result: TResult, primitives: RenderPrimitives) => void;\n markdown?: (result: TResult, primitives: RenderPrimitives) => string;\n json?: (result: TResult, primitives: RenderPrimitives) => unknown;\n}\n\nexport type HandlerContext<\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TServices extends object = EmptyServices,\n> = TServices & {\n params: Static<TParamsSchema>;\n secrets: InferSecrets<TSecrets>;\n fetch: typeof globalThis.fetch;\n fs: HandlerFs;\n env: HandlerEnv;\n progress(message: string): void;\n};\n\nexport interface CommandConfig<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n> {\n name: string;\n description?: string;\n aliases?: string[];\n positional?: string[];\n params: TParamsSchema;\n secrets?: TSecrets;\n scope?: Scope[];\n confirm?: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<CommandCheckContext<TParamsSchema, TSecrets, TServices>>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface Command<\n TServices extends object = EmptyServices,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TSecrets extends SecretDeclarations | undefined = undefined,\n TResult = unknown,\n> {\n kind: \"command\";\n name: string;\n description?: string;\n aliases: string[];\n positional: string[];\n params: TParamsSchema;\n secrets: SecretDeclarations;\n scope: Scope[];\n confirm: boolean;\n humanInLoop?: HumanInLoopConfig<TParamsSchema> | null;\n requires?: Requires<any>;\n handler: (ctx: HandlerContext<TParamsSchema, TSecrets, TServices>) => Promise<TResult>;\n render?: Renderers<TResult>;\n}\n\nexport interface GroupConfig<TServices extends object> {\n name: string;\n description?: string;\n aliases?: string[];\n mcp?: McpServerConfig;\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets?: SecretDeclarations;\n tools?: string[];\n rename?: Record<string, string>;\n requires?: Requires<GroupCheckContext<TServices>>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport interface Group<TServices extends object = EmptyServices> {\n kind: \"group\";\n name: string;\n description?: string;\n aliases: string[];\n scope?: Scope[];\n humanInLoop?: HumanInLoopConfig<AnyObjectSchema> | null;\n secrets: SecretDeclarations;\n requires?: Requires<any>;\n children: Array<CommandNode<TServices>>;\n default?: Command<TServices, any, any, any>;\n}\n\nexport type CommandNode<TServices extends object = EmptyServices> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nexport interface CommandTypeInfo<\n TName extends string = string,\n TParamsSchema extends ObjectSchema<any> = AnyObjectSchema,\n TResult = unknown,\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined,\n> {\n name: TName;\n params: TParamsSchema;\n result: TResult;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\nexport interface GroupTypeInfo<\n TServices extends object = EmptyServices,\n TName extends string = string,\n TChildren extends readonly unknown[] = readonly CommandNode<TServices>[],\n TOwnScope extends ScopeInput = ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput = undefined,\n> {\n name: TName;\n children: TChildren;\n ownScope: TOwnScope;\n ownHumanInLoopMode: TOwnHumanInLoopMode;\n}\n\ntype TypedCommandMetadata<\n TName extends string,\n TParamsSchema extends ObjectSchema<any>,\n TResult,\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput,\n> = {\n readonly __agentKitCommandTypeInfo: CommandTypeInfo<\n TName,\n TParamsSchema,\n TResult,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ntype TypedGroupMetadata<\n TServices extends object,\n TName extends string,\n TChildren extends readonly unknown[],\n TOwnScope extends ScopeInput,\n TOwnHumanInLoopMode extends HumanInLoopModeInput,\n> = {\n readonly __agentKitGroupTypeInfo: GroupTypeInfo<\n TServices,\n TName,\n TChildren,\n TOwnScope,\n TOwnHumanInLoopMode\n >;\n};\n\ninterface InternalCommandConfig {\n scope?: Scope[];\n 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>(requires: Requires<TContext> | undefined): Requires<TContext> | undefined {\n if (requires === undefined) {\n return undefined;\n }\n\n return {\n auth: requires.auth,\n apiVersion: requires.apiVersion,\n check: requires.check,\n };\n}\n\nfunction cloneStringArray(values: string[] | undefined): string[] | undefined {\n return values === undefined ? undefined : [...values];\n}\n\nfunction cloneStringRecord(values: Record<string, string> | undefined): 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(rename: Record<string, string> | undefined): 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(`Invalid rename target for upstream tool \"${upstreamName}\": path cannot be empty.`);\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 = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n }\n\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex < 0) {\n return undefined;\n }\n\n const location = trimmed.slice(slashIndex);\n const separatorIndex = location.lastIndexOf(\":\");\n const previousSeparatorIndex = separatorIndex >= 0 ? location.lastIndexOf(\":\", separatorIndex - 1) : -1;\n const candidate =\n separatorIndex >= 0 && previousSeparatorIndex >= 0\n ? location.slice(0, previousSeparatorIndex)\n : location;\n\n return parseStackPath(candidate);\n}\n\nfunction inferCommandSourcePath(): string | undefined {\n const stack = new Error().stack;\n\n if (typeof stack !== \"string\") {\n return undefined;\n }\n\n for (const line of stack.split(\"\\n\").slice(1)) {\n const candidate = extractStackPath(line);\n\n if (candidate === undefined) {\n continue;\n }\n\n if (\n candidate.includes(\"/packages/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(parent: Requires<any> | undefined, child: Requires<any> | undefined): Requires<any> | undefined {\n if (parent === undefined && child === undefined) {\n return undefined;\n }\n\n const merged: Requires<any> = {\n auth: child?.auth ?? parent?.auth,\n apiVersion: child?.apiVersion ?? parent?.apiVersion,\n check: composeChecks(parent?.check, child?.check),\n };\n\n if (\n merged.auth === undefined &&\n merged.apiVersion === undefined &&\n merged.check === undefined\n ) {\n return undefined;\n }\n\n return merged;\n}\n\nfunction parseSimpleSemver(value: string): [number, number, number] | undefined {\n const parts = value.split(\".\");\n if (parts.length !== 3) {\n return undefined;\n }\n\n const parsed = parts.map((part) => {\n if (part.length === 0) {\n return Number.NaN;\n }\n\n for (const char of part) {\n if (char < \"0\" || char > \"9\") {\n return Number.NaN;\n }\n }\n\n return Number(part);\n });\n\n if (parsed.some((part) => !Number.isInteger(part) || part < 0)) {\n return undefined;\n }\n\n return parsed as [number, number, number];\n}\n\nfunction parseMinimumApiVersion(requirement: string): [number, number, number] | undefined {\n if (!requirement.startsWith(\">=\")) {\n return undefined;\n }\n\n return parseSimpleSemver(requirement.slice(2).trim());\n}\n\nfunction compareSemver(left: [number, number, number], right: [number, number, number]): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] === right[index]) {\n continue;\n }\n\n return left[index]! > right[index]! ? 1 : -1;\n }\n\n return 0;\n}\n\nexport function resolveCommandSecrets(\n command: Command<any, any, any, any>,\n env: Record<string, string | undefined> = process.env\n): Record<string, string | undefined> {\n const secrets: Record<string, string | undefined> = {};\n\n for (const [name, secret] of Object.entries(command.secrets)) {\n const value = env[secret.env];\n\n if (value === undefined && secret.optional !== true) {\n const details = secret.description ? `\\n ${secret.description}` : \"\";\n throw new UserError(`Error: Missing required secret ${secret.env}${details}`);\n }\n\n secrets[name] = value;\n }\n\n return secrets;\n}\n\nexport async function assertCommandRequirements(\n command: Command<any, any, any, any>,\n context: GroupCheckContext<any>,\n options: CommandRequirementOptions = {}\n): Promise<void> {\n const requires = command.requires;\n if (requires === undefined) {\n return;\n }\n\n const env = options.env ?? process.env;\n const authEnvVar = options.authEnvVar ?? \"POE_API_KEY\";\n\n if (requires.auth === true && env[authEnvVar] === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires authentication.\\n Run 'poe-code login' first.`\n );\n }\n\n if (requires.apiVersion !== undefined) {\n const minimumVersion = parseMinimumApiVersion(requires.apiVersion);\n if (minimumVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" has invalid apiVersion requirement \"${requires.apiVersion}\". Expected format \">=X.Y.Z\".`\n );\n }\n\n if (options.apiVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but no runner API version was provided.`\n );\n }\n\n const runnerVersion = parseSimpleSemver(options.apiVersion);\n if (runnerVersion === undefined) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version \"${options.apiVersion}\" is not valid semver.`\n );\n }\n\n if (compareSemver(runnerVersion, minimumVersion) < 0) {\n throw new UserError(\n `Error: Command \"${command.name}\" requires API version ${requires.apiVersion}, but runner API version is ${options.apiVersion}.`\n );\n }\n }\n\n const checkResult = await requires.check?.(context);\n if (checkResult && !checkResult.ok) {\n throw new UserError(checkResult.message ?? \"Command precondition failed.\");\n }\n}\n\nfunction mergeSecrets(parent: SecretDeclarations, child: SecretDeclarations): SecretDeclarations {\n return cloneSecrets({\n ...parent,\n ...child,\n });\n}\n\nfunction resolveCommandScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] {\n return cloneScope(ownScope ?? inheritedScope) ?? [\"cli\", \"sdk\"];\n}\n\nfunction resolveGroupScope(ownScope: Scope[] | undefined, inheritedScope: Scope[] | undefined): Scope[] | undefined {\n return cloneScope(ownScope ?? inheritedScope);\n}\n\nfunction createBaseCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n config: CommandConfig<TServices, TParamsSchema, TSecrets, TResult>\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const command: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n positional: [...(config.positional ?? [])],\n params: config.params,\n secrets: cloneSecrets(config.secrets),\n scope: resolveCommandScope(config.scope, undefined),\n confirm: config.confirm ?? false,\n 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 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>(config: GroupConfig<TServices>): Group<TServices> {\n const group: Group<TServices> = {\n kind: \"group\",\n name: config.name,\n description: config.description,\n aliases: [...(config.aliases ?? [])],\n scope: resolveGroupScope(config.scope, undefined),\n 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 (command as Command<any, any, any, any> & { [commandConfigSymbol]: InternalCommandConfig })[\n commandConfigSymbol\n ];\n}\n\nfunction getInternalGroupConfig<TServices extends object>(group: Group<TServices>): InternalGroupConfig<TServices> {\n return (group as Group<TServices> & { [groupConfigSymbol]: InternalGroupConfig<TServices> })[\n groupConfigSymbol\n ];\n}\n\nfunction materializeCommand<\n TServices extends object,\n TParamsSchema extends ObjectSchema<any>,\n TSecrets extends SecretDeclarations | undefined,\n TResult,\n>(\n command: Command<TServices, TParamsSchema, TSecrets, TResult>,\n inherited: InheritedMetadata\n): Command<TServices, TParamsSchema, TSecrets, TResult> {\n const internal = getInternalCommandConfig(command);\n\n const materialized: Command<TServices, TParamsSchema, TSecrets, TResult> = {\n kind: \"command\",\n name: command.name,\n description: command.description,\n aliases: [...command.aliases],\n positional: [...command.positional],\n params: command.params,\n secrets: mergeSecrets(inherited.secrets, internal.secrets),\n scope: resolveCommandScope(internal.scope, inherited.scope),\n confirm: command.confirm,\n 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 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) => materializeNode(child, mergedInherited));\n\n let defaultChild: Command<TServices, any, any, any> | undefined;\n\n if (internal.default !== undefined) {\n const defaultIndex = internal.children.indexOf(internal.default);\n\n if (defaultIndex === -1) {\n throw new UserError(`Default command \"${internal.default.name}\" must be listed in children.`);\n }\n\n const resolvedDefault = materializedChildren[defaultIndex];\n if (resolvedDefault?.kind !== \"command\") {\n throw new UserError(`Default child \"${internal.default.name}\" must be a command.`);\n }\n\n defaultChild = resolvedDefault;\n }\n\n const materialized: Group<TServices> = {\n kind: \"group\",\n name: group.name,\n description: group.description,\n aliases: [...group.aliases],\n scope: 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<CommandConfig<TServices, TParamsSchema, TSecrets, TResult>, \"name\" | \"scope\" | \"humanInLoop\"> & {\n name: TName;\n scope?: TOwnScope;\n humanInLoop?: TOwnHumanInLoop;\n }\n): Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>> {\n validateHumanInLoopOnDefine(config);\n\n return materializeCommand(createBaseCommand(config as CommandConfig<TServices, TParamsSchema, TSecrets, TResult>), {\n scope: undefined,\n humanInLoop: undefined,\n secrets: {},\n requires: undefined,\n }) as Command<TServices, TParamsSchema, TSecrets, TResult> &\n TypedCommandMetadata<TName, TParamsSchema, TResult, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>>;\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<TServices, TName, TChildren, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>> {\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<TServices, TName, TChildren, TOwnScope, ResolveOwnHumanInLoopMode<TOwnHumanInLoop>>;\n}\n\nexport function getCommandSourcePath(command: Command<any, any, any, any>): string | undefined {\n return (command as Command<any, any, any, any> & { [commandSourcePathSymbol]?: string })[\n commandSourcePathSymbol\n ];\n}\n\nexport { S, toJsonSchema } from \"toolcraft-schema\";\nexport { ApprovalDeclinedError, UserError };\nexport { findPackageMetadata, packageMetadata } from \"./package-metadata.js\";\nexport type { PackageMetadata } from \"./package-metadata.js\";\nexport type { AnySchema, ArraySchema, BooleanSchema, EnumSchema, JsonSchema, NumberSchema, ObjectSchema, OptionalSchema, Static, StringSchema } from \"toolcraft-schema\";\nexport type { HumanInLoopConfig, HumanInLoopPending, HumanInLoopRuntimeOptions };\n", "export class UserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UserError\";\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 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}\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\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", "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(branches: Record<string, ObjectSchema<any>>): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\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);\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 getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n const requiredKeys = Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n\n return JSON.stringify(requiredKeys);\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 const fingerprints = new Set<string>();\n\n for (const branch of branches) {\n const fingerprint = getRequiredKeyFingerprint(branch);\n\n if (fingerprints.has(fingerprint)) {\n throw new Error(\"Union schema branches must have unique required-key fingerprints\");\n }\n\n fingerprints.add(fingerprint);\n }\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 { Json } from \"./json.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.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 SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> = TSchema extends OptionalSchema<infer TInner>\n ? Static<TInner>\n : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n description?: string;\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n};\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly description?: string;\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | 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>>\n extends SchemaBase<\"enum\", TValues[number]> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema>\n extends SchemaBase<\"optional\", Static<TInner> | undefined> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>\n | 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 SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.additionalProperties !== undefined) {\n jsonSchema.additionalProperties = schema.additionalProperties;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\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(options: SchemaOptions<string> & StringMetadata = {}): StringSchema {\n return {\n kind: \"string\",\n ...options,\n };\n },\n\n Number(\n options: SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } = {}\n ): NumberSchema {\n return {\n kind: \"number\",\n ...options,\n };\n },\n\n Boolean(options: SchemaOptions<boolean> = {}): BooleanSchema {\n return {\n kind: \"boolean\",\n ...options,\n };\n },\n\n Enum<const TValues extends NonEmptyReadonlyArray<EnumValue>>(\n values: TValues,\n options: SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = {}\n ): EnumSchema<TValues> {\n assertValidEnumValues(values);\n\n return {\n kind: \"enum\",\n values,\n ...options,\n };\n },\n\n Array<TItem extends AnySchema>(\n item: TItem,\n options: SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = {}\n ): ArraySchema<TItem> {\n return {\n kind: \"array\",\n item,\n ...options,\n };\n },\n\n Object<const TShape extends ObjectShape>(\n shape: TShape,\n options: SchemaOptions<InferObject<TShape>> & ObjectMetadata = {}\n ): ObjectSchema<TShape> {\n return {\n kind: \"object\",\n shape,\n ...options,\n };\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner,\n };\n },\n\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 properties[key] = toJsonSchema(propertySchema);\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required,\n });\n }\n\n 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 { Json, OneOf, RecordBuilder as Record, Union };\nexport type { JsonValue, JsonValueSchema, OneOfSchema, RecordSchema, UnionSchema };\n", "import { existsSync, readFileSync, 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\n try {\n return statSync(resolved).isDirectory() ? resolved : path.dirname(resolved);\n } catch {\n return path.dirname(resolved);\n }\n}\n\nfunction readPackageMetadata(packageJsonPath: string): PackageMetadata | undefined {\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: unknown;\n version?: unknown;\n };\n const metadata: PackageMetadata = { path: packageJsonPath };\n\n if (typeof parsed.name === \"string\") {\n metadata.name = parsed.name;\n }\n\n if (typeof parsed.version === \"string\") {\n metadata.version = parsed.version;\n }\n\n return metadata;\n}\n\nexport function findPackageMetadata(from: PackageMetadataInput): PackageMetadata | undefined {\n let current = getSearchDirectory(from);\n\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n\n if (existsSync(packageJsonPath)) {\n return readPackageMetadata(packageJsonPath);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n return undefined;\n }\n\n current = parent;\n }\n}\n\nexport function packageMetadata(from: PackageMetadataInput = process.cwd()): PackageMetadata {\n const metadata = findPackageMetadata(from);\n\n if (metadata === undefined) {\n throw new Error(`No package.json found from ${pathFromInput(from)}.`);\n }\n\n return metadata;\n}\n\nexport function findEntrypointPackageMetadata(entrypoint: string | undefined): PackageMetadata | undefined {\n if (entrypoint === undefined || entrypoint.length === 0) {\n return undefined;\n }\n\n if (!path.isAbsolute(entrypoint) && !entrypoint.startsWith(\"file:\")) {\n return undefined;\n }\n\n return findPackageMetadata(entrypoint);\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport { markdownDirBackend } from \"./backends/markdown-dir.js\";\nimport { yamlFileBackend } from \"./backends/yaml-file.js\";\nimport { validateMachine } from \"./state-machine.js\";\nimport { resolveStateMachine } from \"./state.js\";\nimport type {\n BackendFactory,\n BackendDeps,\n OpenTaskListOptions,\n TaskList,\n TaskListFs\n} from \"./types.js\";\n\nconst DEFAULT_LOCK_STALE_MS = 30_000;\nconst DEFAULT_LOCK_RETRIES = 20;\n\nexport const backendFactories: Record<OpenTaskListOptions[\"type\"], BackendFactory> = {\n \"markdown-dir\": markdownDirBackend,\n \"yaml-file\": yamlFileBackend\n};\n\nfunction createDefaultFs(): TaskListFs {\n return fsPromises as unknown as TaskListFs;\n}\n\nexport async function openTaskList(options: OpenTaskListOptions): Promise<TaskList> {\n const factory = (backendFactories as Record<string, BackendFactory | undefined>)[options.type];\n\n if (factory === undefined) {\n throw new Error(`Unknown task list backend type \"${options.type}\".`);\n }\n\n const stateMachine = resolveStateMachine(options.stateMachine);\n validateMachine(stateMachine);\n\n const deps: BackendDeps = {\n path: options.path,\n defaults: {\n metadata: { ...(options.defaults?.metadata ?? {}) }\n },\n lockStaleMs: options.lockStaleMs ?? DEFAULT_LOCK_STALE_MS,\n lockRetries: options.lockRetries ?? DEFAULT_LOCK_RETRIES,\n create: options.create ?? false,\n fs: options.fs ?? createDefaultFs(),\n stateMachine\n };\n\n return factory(deps);\n}\n", "import path from \"node:path\";\nimport { acquireFileLock } from \"@poe-code/file-lock\";\nimport { parseDocument, stringify } from \"yaml\";\nimport taskSchema from \"../schema/task.schema.json\" with { type: \"json\" };\nimport { eventsFromState, findEvent } from \"../state-machine.js\";\nimport { resolveStateMachine } from \"../state.js\";\nimport {\n InvalidTransitionError,\n MalformedTaskError,\n TaskAlreadyExistsError,\n TaskNotFoundError,\n type BackendDeps,\n type ListFilter,\n type Task,\n type TaskCreate,\n type TaskFireOptions,\n type TaskList,\n type TaskListFs,\n type Tasks,\n type TaskUpdate\n} from \"../types.js\";\nimport {\n hasErrorCode,\n isRecord,\n sortStrings,\n sortTasks,\n statIfExists,\n validateTaskId,\n writeAtomically\n} from \"./utils.js\";\n\nconst ARCHIVE_DIRECTORY_NAME = \"archive\";\nconst MARKDOWN_EXTENSION = \".md\";\nconst TASK_KIND = \"task\";\nconst TASK_VERSION = 1;\nconst TASK_SCHEMA_ID = taskSchema.$id;\nconst RESERVED_FRONTMATTER_KEYS = new Set([\n \"$schema\",\n \"description\",\n \"kind\",\n \"name\",\n \"state\",\n \"version\"\n]);\n\ntype TaskRecord = Record<string, unknown>;\n\ntype TaskFile = {\n task: Task;\n frontmatter: TaskRecord;\n path: string;\n};\n\ntype TaskLocation = {\n archived: boolean;\n path: string;\n};\n\nfunction validateListName(name: string): string {\n if (\n name.length === 0 ||\n name === ARCHIVE_DIRECTORY_NAME ||\n name.startsWith(\".\") ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"..\")\n ) {\n throw new Error(`Invalid task list name \"${name}\".`);\n }\n\n return name;\n}\n\nfunction parseQualifiedId(qualifiedId: string): {\n id: string;\n list: string;\n} {\n const separatorIndex = qualifiedId.indexOf(\"/\");\n\n if (\n separatorIndex <= 0 ||\n separatorIndex !== qualifiedId.lastIndexOf(\"/\") ||\n separatorIndex === qualifiedId.length - 1\n ) {\n throw new Error(`Invalid qualified task id \"${qualifiedId}\".`);\n }\n\n return {\n list: validateListName(qualifiedId.slice(0, separatorIndex)),\n id: validateTaskId(qualifiedId.slice(separatorIndex + 1))\n };\n}\n\nfunction listPath(rootPath: string, list: string): string {\n return path.join(rootPath, list);\n}\n\nfunction archiveDirectoryPath(rootPath: string, list: string): string {\n return path.join(listPath(rootPath, list), ARCHIVE_DIRECTORY_NAME);\n}\n\nfunction activeTaskPath(rootPath: string, list: string, id: string): string {\n return path.join(listPath(rootPath, list), `${id}${MARKDOWN_EXTENSION}`);\n}\n\nfunction archivedTaskPath(rootPath: string, list: string, id: string): string {\n return path.join(archiveDirectoryPath(rootPath, list), `${id}${MARKDOWN_EXTENSION}`);\n}\n\nfunction isMarkdownFile(entryName: string): boolean {\n return entryName.endsWith(MARKDOWN_EXTENSION);\n}\n\nfunction isHiddenEntry(entryName: string): boolean {\n return entryName.startsWith(\".\");\n}\n\nfunction isLockFile(entryName: string): boolean {\n return entryName.endsWith(\".lock\");\n}\n\nfunction malformedTask(filePath: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task \"${filePath}\": invalid \"${field}\".`);\n}\n\nfunction stripTrailingCarriageReturn(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nfunction splitTaskDocument(content: string, filePath: string): {\n body: string;\n frontmatter: string;\n} {\n const lines = content.split(\"\\n\");\n\n if (lines.length === 0 || stripTrailingCarriageReturn(lines[0]) !== \"---\") {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n let closingIndex = -1;\n for (let index = 1; index < lines.length; index += 1) {\n if (stripTrailingCarriageReturn(lines[index]) === \"---\") {\n closingIndex = index;\n break;\n }\n }\n\n if (closingIndex === -1) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n const bodyLines = lines.slice(closingIndex + 1);\n if (bodyLines.length > 0 && stripTrailingCarriageReturn(bodyLines[0]) === \"\") {\n bodyLines.shift();\n }\n\n return {\n frontmatter: lines.slice(1, closingIndex).join(\"\\n\"),\n body: bodyLines.join(\"\\n\")\n };\n}\n\nfunction readFrontmatter(frontmatterContent: string, filePath: string): TaskRecord {\n const document = parseDocument(frontmatterContent);\n\n if (document.errors.length > 0) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n const parsed = document.toJS();\n if (!isRecord(parsed)) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n return parsed;\n}\n\nfunction assertValidTaskRecord(\n frontmatter: TaskRecord,\n filePath: string,\n validStates: ReadonlySet<string>\n): void {\n if (\"$schema\" in frontmatter && frontmatter.$schema !== TASK_SCHEMA_ID) {\n throw malformedTask(filePath, \"$schema\");\n }\n\n if (\"kind\" in frontmatter && frontmatter.kind !== TASK_KIND) {\n throw malformedTask(filePath, \"kind\");\n }\n\n if (\"version\" in frontmatter) {\n if (\n typeof frontmatter.version !== \"number\" ||\n !Number.isInteger(frontmatter.version) ||\n frontmatter.version !== TASK_VERSION\n ) {\n throw malformedTask(filePath, \"version\");\n }\n }\n\n if (typeof frontmatter.name !== \"string\" || frontmatter.name.length === 0) {\n throw malformedTask(filePath, \"name\");\n }\n\n if (typeof frontmatter.state !== \"string\" || !validStates.has(frontmatter.state)) {\n throw malformedTask(filePath, \"state\");\n }\n\n if (\"description\" in frontmatter && typeof frontmatter.description !== \"string\") {\n throw malformedTask(filePath, \"description\");\n }\n}\n\nfunction metadataFromFrontmatter(frontmatter: TaskRecord): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n metadata[key] = value;\n }\n }\n\n return metadata;\n}\n\nfunction createTask(list: string, id: string, frontmatter: TaskRecord, body: string): Task {\n return {\n list,\n id,\n qualifiedId: `${list}/${id}`,\n name: frontmatter.name as string,\n state: frontmatter.state as string,\n description: body,\n metadata: metadataFromFrontmatter(frontmatter)\n };\n}\n\nfunction serializeTaskDocument(frontmatter: TaskRecord, description: string): string {\n return `---\\n${stringify(frontmatter)}---\\n\\n${description}`;\n}\n\nasync function readDirectoryNames(fs: TaskListFs, directoryPath: string): Promise<string[]> {\n try {\n return sortStrings(await fs.readdir(directoryPath));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return [];\n }\n\n throw error;\n }\n}\n\nasync function ensureRootPath(deps: BackendDeps): Promise<void> {\n if (deps.create) {\n await deps.fs.mkdir(deps.path, { recursive: true });\n return;\n }\n\n await deps.fs.stat(deps.path);\n}\n\nasync function readTaskFile(\n fs: TaskListFs,\n list: string,\n id: string,\n filePath: string,\n validStates: ReadonlySet<string>\n): Promise<TaskFile> {\n const content = await fs.readFile(filePath, \"utf8\");\n const document = splitTaskDocument(content, filePath);\n const frontmatter = readFrontmatter(document.frontmatter, filePath);\n\n assertValidTaskRecord(frontmatter, filePath, validStates);\n\n return {\n path: filePath,\n frontmatter,\n task: createTask(list, id, frontmatter, document.body)\n };\n}\n\nasync function findTaskLocation(\n fs: TaskListFs,\n rootPath: string,\n list: string,\n id: string\n): Promise<TaskLocation | undefined> {\n const activePath = activeTaskPath(rootPath, list, id);\n const activeStat = await statIfExists(fs, activePath);\n\n if (activeStat?.isFile()) {\n return {\n archived: false,\n path: activePath\n };\n }\n\n const archivedPath = archivedTaskPath(rootPath, list, id);\n const archivedStat = await statIfExists(fs, archivedPath);\n\n if (archivedStat?.isFile()) {\n return {\n archived: true,\n path: archivedPath\n };\n }\n\n return undefined;\n}\n\nasync function readTaskAtLocation(\n fs: TaskListFs,\n rootPath: string,\n list: string,\n id: string,\n validStates: ReadonlySet<string>\n): Promise<TaskFile> {\n const location = await findTaskLocation(fs, rootPath, list, id);\n\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return readTaskFile(fs, list, id, location.path, validStates);\n}\n\nfunction createdFrontmatter(\n defaults: BackendDeps[\"defaults\"],\n input: TaskCreate,\n initialState: string\n): TaskRecord {\n const frontmatter: TaskRecord = {\n $schema: TASK_SCHEMA_ID,\n kind: TASK_KIND,\n version: TASK_VERSION,\n name: input.name,\n state: initialState\n };\n\n for (const [key, value] of Object.entries(defaults.metadata)) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n frontmatter[key] = value;\n }\n }\n\n for (const [key, value] of Object.entries(input.metadata ?? {})) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n frontmatter[key] = value;\n }\n }\n\n return frontmatter;\n}\n\nfunction updatedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n patch: TaskUpdate\n): TaskRecord {\n const nextFrontmatter: TaskRecord = {\n ...existingFrontmatter,\n $schema: existingFrontmatter.$schema ?? TASK_SCHEMA_ID,\n kind: existingFrontmatter.kind ?? TASK_KIND,\n version: existingFrontmatter.version ?? TASK_VERSION,\n name: patch.name ?? task.name,\n state: task.state\n };\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n nextFrontmatter[key] = value;\n }\n }\n\n return nextFrontmatter;\n}\n\nfunction transitionedFrontmatter(existingFrontmatter: TaskRecord, task: Task, to: string): TaskRecord {\n return {\n ...existingFrontmatter,\n $schema: existingFrontmatter.$schema ?? TASK_SCHEMA_ID,\n kind: existingFrontmatter.kind ?? TASK_KIND,\n version: existingFrontmatter.version ?? TASK_VERSION,\n name: task.name,\n state: to\n };\n}\n\nfunction firedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n to: string,\n metadataPatch?: Record<string, unknown>\n): TaskRecord {\n const nextFrontmatter = transitionedFrontmatter(existingFrontmatter, task, to);\n\n for (const [key, value] of Object.entries(metadataPatch ?? {})) {\n if (!RESERVED_FRONTMATTER_KEYS.has(key)) {\n nextFrontmatter[key] = value;\n }\n }\n\n return nextFrontmatter;\n}\n\nfunction assertCreateDoesNotSetState(input: TaskCreate): void {\n if (Object.prototype.hasOwnProperty.call(input, \"state\")) {\n throw new Error(\n 'Tasks.create() does not accept \"state\"; new tasks always start at stateMachine.initial.'\n );\n }\n}\n\nfunction assertUpdateDoesNotSetState(patch: TaskUpdate): void {\n if (Object.prototype.hasOwnProperty.call(patch, \"state\")) {\n throw new Error('Tasks.update() does not accept \"state\"; use fire() to change task state.');\n }\n}\n\nfunction createTasksView(deps: BackendDeps, list: string): Tasks {\n const listDirectoryPath = listPath(deps.path, list);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n async function listFiles(directoryPath: string): Promise<Task[]> {\n const entries = await readDirectoryNames(deps.fs, directoryPath);\n const tasks: Task[] = [];\n\n for (const entryName of entries) {\n if (isHiddenEntry(entryName) || isLockFile(entryName) || !isMarkdownFile(entryName)) {\n continue;\n }\n\n const entryPath = path.join(directoryPath, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (!entryStat?.isFile()) {\n continue;\n }\n\n const id = entryName.slice(0, -MARKDOWN_EXTENSION.length);\n tasks.push((await readTaskFile(deps.fs, list, id, entryPath, validStates)).task);\n }\n\n return sortTasks(tasks);\n }\n\n async function withTaskLock<T>(id: string, action: () => Promise<T>): Promise<T> {\n validateTaskId(id);\n const release = await acquireFileLock(activeTaskPath(deps.path, list, id), {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n }\n\n async function getTaskFile(id: string): Promise<TaskFile> {\n validateTaskId(id);\n return readTaskAtLocation(deps.fs, deps.path, list, id, validStates);\n }\n\n function assertFireableTaskEvent(task: Task, eventName: string) {\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: stateMachine.events[eventName]?.to,\n reason: `Cannot fire event \"${eventName}\" from task state \"${task.state}\".`\n });\n }\n\n return event;\n }\n\n return {\n name: list,\n stateMachine,\n async all(filter?: ListFilter): Promise<Task[]> {\n const activeTasks = await listFiles(listDirectoryPath);\n const archivedTasks = filter?.includeArchived\n ? await listFiles(archiveDirectoryPath(deps.path, list))\n : [];\n const combinedTasks = [...activeTasks, ...archivedTasks];\n\n if (filter?.state) {\n return combinedTasks.filter((task) => task.state === filter.state);\n }\n\n return combinedTasks;\n },\n async get(id: string): Promise<Task> {\n return (await getTaskFile(id)).task;\n },\n async create(input: TaskCreate): Promise<Task> {\n assertCreateDoesNotSetState(input);\n validateTaskId(input.id);\n await deps.fs.mkdir(listDirectoryPath, { recursive: true });\n\n return withTaskLock(input.id, async () => {\n const existing = await findTaskLocation(deps.fs, deps.path, list, input.id);\n if (existing) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${input.id}\" already exists.`);\n }\n\n const targetPath = activeTaskPath(deps.path, list, input.id);\n const frontmatter = createdFrontmatter(deps.defaults, input, stateMachine.initial);\n const description = input.description ?? \"\";\n\n await writeAtomically(deps.fs, targetPath, serializeTaskDocument(frontmatter, description));\n\n return createTask(list,input.id, frontmatter, description);\n });\n },\n async update(id: string, patch: TaskUpdate): Promise<Task> {\n assertUpdateDoesNotSetState(patch);\n\n return withTaskLock(id, async () => {\n const existing = await getTaskFile(id);\n const nextFrontmatter = updatedFrontmatter(existing.frontmatter, existing.task, patch);\n const description = patch.description ?? existing.task.description;\n\n await writeAtomically(deps.fs, existing.path, serializeTaskDocument(nextFrontmatter, description));\n\n return createTask(list,id, nextFrontmatter, description);\n });\n },\n async fire(id: string, eventName: string, opts?: TaskFireOptions): Promise<Task> {\n return withTaskLock(id, async () => {\n const existing = await getTaskFile(id);\n const event = assertFireableTaskEvent(existing.task, eventName);\n const guardResult = event.guard?.(existing.task) ?? true;\n\n if (guardResult !== true) {\n throw new InvalidTransitionError({\n task: existing.task,\n event: eventName,\n to: event.to,\n reason: guardResult\n });\n }\n\n await event.onExit?.(existing.task);\n\n const nextFrontmatter = firedFrontmatter(\n existing.frontmatter,\n existing.task,\n event.to,\n opts?.metadataPatch\n );\n const nextTask = createTask(list,id, nextFrontmatter, existing.task.description);\n const serializedTask = serializeTaskDocument(nextFrontmatter, existing.task.description);\n\n if (event.to === \"archived\") {\n const targetPath = archivedTaskPath(deps.path, list, id);\n const archivedTargetExists = await statIfExists(deps.fs, targetPath);\n if (archivedTargetExists?.isFile()) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${id}\" already exists in archive.`);\n }\n\n await writeAtomically(deps.fs, existing.path, serializedTask);\n await deps.fs.mkdir(archiveDirectoryPath(deps.path, list), { recursive: true });\n await deps.fs.rename(existing.path, targetPath);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n }\n\n await writeAtomically(deps.fs, existing.path, serializedTask);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n });\n },\n async canFire(id: string, eventName: string): Promise<boolean> {\n const task = (await getTaskFile(id)).task;\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n return false;\n }\n\n return (event.guard?.(task) ?? true) === true;\n },\n async events(id: string): Promise<readonly string[]> {\n const task = (await getTaskFile(id)).task;\n return eventsFromState(stateMachine, task.state);\n },\n async delete(id: string): Promise<void> {\n await withTaskLock(id, async () => {\n const location = await findTaskLocation(deps.fs, deps.path, list, id);\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n await deps.fs.unlink(location.path);\n });\n }\n };\n}\n\nexport async function markdownDirBackend(deps: BackendDeps): Promise<TaskList> {\n await ensureRootPath(deps);\n\n const list = (name: string): Tasks => {\n const listName = validateListName(name);\n return createTasksView(deps, listName);\n };\n\n const lists = async (): Promise<string[]> => {\n const entries = await readDirectoryNames(deps.fs, deps.path);\n const result: string[] = [];\n\n for (const entryName of entries) {\n if (\n entryName === ARCHIVE_DIRECTORY_NAME ||\n isHiddenEntry(entryName) ||\n isLockFile(entryName)\n ) {\n continue;\n }\n\n const entryPath = path.join(deps.path, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (entryStat?.isDirectory()) {\n result.push(entryName);\n }\n }\n\n return sortStrings(result);\n };\n\n const allTasks = async (filter?: ListFilter): Promise<Task[]> => {\n const allLists = await lists();\n const tasks: Task[] = [];\n\n for (const taskListName of allLists) {\n tasks.push(...(await list(taskListName).all(filter)));\n }\n\n return sortTasks(tasks);\n };\n\n const get = async (qualifiedId: string): Promise<Task> => {\n const { list: listName, id } = parseQualifiedId(qualifiedId);\n return list(listName).get(id);\n };\n\n return {\n list,\n lists,\n allTasks,\n get\n };\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\n\nexport interface FileLockFs {\n open(path: string, flags: string): Promise<{\n close(): Promise<void>;\n writeFile(\n data: string,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n }>;\n stat(path: string): Promise<{\n mtimeMs: number;\n }>;\n readFile?(path: string, encoding: BufferEncoding): Promise<string>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface FileLockOptions {\n staleMs?: number;\n retries?: number;\n minTimeout?: number;\n maxTimeout?: number;\n fs?: FileLockFs;\n isPidRunning?: (pid: number) => boolean;\n signal?: AbortSignal;\n}\n\nexport type ReleaseLock = () => Promise<void>;\n\nexport class LockTimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LockTimeoutError\";\n }\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n if (signal.aborted) {\n return Promise.reject(createAbortError());\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timeoutId);\n signal.removeEventListener(\"abort\", onAbort);\n reject(createAbortError());\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction backoff(attempt: number, minTimeout: number, maxTimeout: number): number {\n const delay = Math.min(maxTimeout, minTimeout * 2 ** attempt);\n return delay + Math.random() * delay * 0.1;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction hasAnyErrorCode(error: unknown, codes: readonly string[]): boolean {\n return codes.some((code) => hasErrorCode(error, code));\n}\n\nfunction isPidRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !hasErrorCode(error, \"ESRCH\");\n }\n}\n\nfunction createDefaultFs(): FileLockFs {\n return {\n open: (path, flags) => fsPromises.open(path, flags),\n readFile: (path, encoding) => fsPromises.readFile(path, encoding),\n stat: fsPromises.stat,\n unlink: fsPromises.unlink\n };\n}\n\nasync function removeLockFile(\n fs: FileLockFs,\n lockPath: string,\n signal?: AbortSignal\n): Promise<void> {\n for (let attempt = 0; attempt <= 4; attempt += 1) {\n throwIfAborted(signal);\n\n try {\n await fs.unlink(lockPath);\n return;\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return;\n }\n\n if (!hasAnyErrorCode(error, [\"EPERM\", \"EBUSY\"]) || attempt === 4) {\n throw error;\n }\n }\n\n await sleep(25 * 2 ** attempt, signal);\n }\n}\n\ntype LockMetadata = {\n host: string;\n pid: number;\n};\n\nfunction parseLockMetadata(content: string): LockMetadata | undefined {\n try {\n const parsed = JSON.parse(content) as unknown;\n if (!parsed || typeof parsed !== \"object\" || !(\"host\" in parsed) || !(\"pid\" in parsed)) {\n return undefined;\n }\n\n const { host, pid } = parsed;\n if (typeof host === \"string\" && typeof pid === \"number\" && Number.isSafeInteger(pid) && pid > 0) {\n return {\n host,\n pid\n };\n }\n } catch (ignoredError) {\n void ignoredError;\n }\n\n return undefined;\n}\n\nasync function readLockMetadata(\n fs: FileLockFs,\n lockPath: string\n): Promise<LockMetadata | undefined | null> {\n if (!fs.readFile) {\n return undefined;\n }\n\n try {\n return parseLockMetadata(await fs.readFile(lockPath, \"utf8\"));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return null;\n }\n\n return undefined;\n }\n}\n\nasync function shouldReclaimLock(options: {\n fs: FileLockFs;\n isPidRunning: (pid: number) => boolean;\n lockPath: string;\n staleMs: number;\n stat: Awaited<ReturnType<FileLockFs[\"stat\"]>>;\n}): Promise<boolean | \"missing\"> {\n const metadata = await readLockMetadata(options.fs, options.lockPath);\n if (metadata === null) {\n return \"missing\";\n }\n\n if (metadata?.host === os.hostname()) {\n return !options.isPidRunning(metadata.pid);\n }\n\n return Date.now() - options.stat.mtimeMs > options.staleMs;\n}\n\nasync function writeLockMetadata(handle: Awaited<ReturnType<FileLockFs[\"open\"]>>): Promise<void> {\n try {\n await handle.writeFile(\n JSON.stringify({ pid: process.pid, host: os.hostname(), acquiredAt: new Date().toISOString() }),\n { encoding: \"utf8\" }\n );\n } catch (ignoredError) {\n void ignoredError;\n }\n try {\n await handle.close();\n } catch (ignoredError) {\n void ignoredError;\n }\n}\n\nexport async function acquireFileLock(\n filePath: string,\n options: FileLockOptions = {}\n): Promise<ReleaseLock> {\n const fs = options.fs ?? createDefaultFs();\n const retries = options.retries ?? 20;\n const minTimeout = options.minTimeout ?? 25;\n const maxTimeout = options.maxTimeout ?? 250;\n const staleMs = options.staleMs ?? 1_000;\n const pidIsRunning = options.isPidRunning ?? isPidRunning;\n const lockPath = `${filePath}.lock`;\n\n let attempt = 0;\n\n while (attempt <= retries) {\n throwIfAborted(options.signal);\n\n try {\n const handle = await fs.open(lockPath, \"wx\");\n await writeLockMetadata(handle);\n let released = false;\n\n return async () => {\n if (released) {\n return;\n }\n\n released = true;\n await removeLockFile(fs, lockPath, options.signal);\n };\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n\n let stat: Awaited<ReturnType<FileLockFs[\"stat\"]>>;\n try {\n stat = await fs.stat(lockPath);\n } catch (statError) {\n if (hasErrorCode(statError, \"ENOENT\")) {\n continue;\n }\n\n throw statError;\n }\n\n const reclaimLock = await shouldReclaimLock({\n fs,\n isPidRunning: pidIsRunning,\n lockPath,\n staleMs,\n stat\n });\n if (reclaimLock === \"missing\") {\n continue;\n }\n\n if (reclaimLock) {\n await removeLockFile(fs, lockPath, options.signal);\n continue;\n }\n\n if (attempt >= retries) {\n break;\n }\n\n await sleep(backoff(attempt, minTimeout, maxTimeout), options.signal);\n attempt += 1;\n }\n\n throw new LockTimeoutError(`Failed to acquire lock on \"${filePath}\".`);\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://poe-platform.github.io/poe-code/schemas/task-list/task.schema.json\",\n \"title\": \"Task\",\n \"description\": \"Persisted task payload used by task-list backends.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://poe-platform.github.io/poe-code/schemas/task-list/task.schema.json\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"const\": \"task\"\n },\n \"version\": {\n \"type\": \"integer\",\n \"const\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"name\", \"state\"],\n \"additionalProperties\": true\n}\n", "import type { Task } from \"./types.js\";\n\nexport interface StateMachineDef<TState extends string = string, TEvent extends string = string> {\n readonly initial: TState;\n readonly states: readonly TState[];\n readonly events: Readonly<Record<TEvent, EventDef<TState>>>;\n}\n\nexport interface EventDef<TState extends string = string> {\n readonly from: readonly TState[] | \"*\";\n readonly to: TState;\n readonly guard?: (task: Task) => true | string;\n readonly onEnter?: (task: Task) => void | Promise<void>;\n readonly onExit?: (task: Task) => void | Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStateList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction canFireFromState<TState extends string>(event: EventDef<TState>, fromState: string): boolean {\n if (event.from === \"*\") {\n return event.to !== fromState;\n }\n\n return event.from.includes(fromState as TState);\n}\n\nexport function validateMachine(machine: StateMachineDef): void {\n if (!isRecord(machine)) {\n throw new TypeError(\"State machine must be an object.\");\n }\n\n if (!isStateList(machine.states)) {\n throw new TypeError(\"State machine states must be a string array.\");\n }\n\n const states = new Set(machine.states);\n\n if (typeof machine.initial !== \"string\") {\n throw new TypeError(\"State machine initial must be a string.\");\n }\n\n if (!states.has(machine.initial)) {\n throw new Error(`Initial state \"${machine.initial}\" is not declared.`);\n }\n\n if (!isRecord(machine.events)) {\n throw new TypeError(\"State machine events must be an object.\");\n }\n\n for (const [eventName, event] of Object.entries(machine.events)) {\n if (!isRecord(event)) {\n throw new TypeError(`Event \"${eventName}\" must be an object.`);\n }\n\n if (event.from !== \"*\" && !isStateList(event.from)) {\n throw new TypeError(`Event \"${eventName}\" has an invalid \"from\" definition.`);\n }\n\n if (typeof event.to !== \"string\") {\n throw new TypeError(`Event \"${eventName}\" target state must be a string.`);\n }\n\n if (!states.has(event.to)) {\n throw new Error(`Event \"${eventName}\" references unknown target state \"${event.to}\".`);\n }\n\n if (event.from !== \"*\") {\n for (const fromState of event.from) {\n if (!states.has(fromState)) {\n throw new Error(`Event \"${eventName}\" references unknown source state \"${fromState}\".`);\n }\n }\n }\n }\n}\n\nexport function eventsFromState<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState\n): readonly TEvent[] {\n const events: TEvent[] = [];\n\n for (const [eventName, event] of Object.entries(machine.events) as Array<[TEvent, EventDef<TState>]>) {\n if (canFireFromState(event, fromState)) {\n events.push(eventName);\n }\n }\n\n return events;\n}\n\nexport function findEvent<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState,\n eventName: TEvent\n): EventDef<TState> | undefined {\n const event = machine.events[eventName];\n\n if (event === undefined) {\n return undefined;\n }\n\n return canFireFromState(event, fromState) ? event : undefined;\n}\n", "import type { StateMachineDef } from \"./state-machine.js\";\n\nexport type TaskState = \"draft\" | \"planned\" | \"in-progress\" | \"done\" | \"archived\";\n\nexport interface Task {\n list: string;\n id: string;\n qualifiedId: string;\n name: string;\n state: string;\n description: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface TaskCreate {\n id: string;\n name: string;\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskUpdate {\n name?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n state?: never;\n}\n\nexport interface TaskFireOptions {\n metadataPatch?: Record<string, unknown>;\n}\n\nexport interface ListFilter {\n state?: string;\n includeArchived?: boolean;\n}\n\nexport interface Tasks {\n readonly name: string;\n readonly stateMachine: StateMachineDef;\n all(filter?: ListFilter): Promise<Task[]>;\n get(id: string): Promise<Task>;\n create(input: TaskCreate): Promise<Task>;\n update(id: string, patch: TaskUpdate): Promise<Task>;\n fire(id: string, event: string, opts?: TaskFireOptions): Promise<Task>;\n canFire(id: string, event: string): Promise<boolean>;\n events(id: string): Promise<readonly string[]>;\n delete(id: string): Promise<void>;\n}\n\nexport interface TaskList {\n list(name: string): Tasks;\n lists(): Promise<string[]>;\n allTasks(filter?: ListFilter): Promise<Task[]>;\n get(qualifiedId: string): Promise<Task>;\n}\n\nexport interface TaskDefaults {\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskListFs {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n open(path: string, flags: string): Promise<{\n close(): Promise<void>;\n writeFile(\n data: string | NodeJS.ArrayBufferView,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n }>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n readdir(path: string): Promise<string[]>;\n rename(fromPath: string, toPath: string): Promise<void>;\n stat(path: string): Promise<{\n isDirectory(): boolean;\n isFile(): boolean;\n mtimeMs: number;\n }>;\n unlink(path: string): Promise<void>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: BufferEncoding | { encoding?: BufferEncoding; flag?: string }\n ): Promise<void>;\n}\n\nexport interface OpenTaskListOptions {\n type: \"markdown-dir\" | \"yaml-file\";\n path: string;\n defaults?: TaskDefaults;\n create?: boolean;\n lockStaleMs?: number;\n lockRetries?: number;\n fs?: TaskListFs;\n stateMachine?: StateMachineDef;\n}\n\nexport interface BackendDeps {\n path: string;\n defaults: Required<TaskDefaults>;\n lockStaleMs: number;\n lockRetries: number;\n create: boolean;\n fs: TaskListFs;\n stateMachine?: StateMachineDef;\n}\n\nexport type BackendFactory = (deps: BackendDeps) => Promise<TaskList>;\n\nexport class TaskNotFoundError extends Error {\n constructor(message = \"Task not found.\") {\n super(message);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class TaskAlreadyExistsError extends Error {\n constructor(message = \"Task already exists.\") {\n super(message);\n this.name = \"TaskAlreadyExistsError\";\n }\n}\n\nexport class InvalidTransitionError extends Error {\n readonly task?: Task;\n readonly event?: string;\n readonly to?: string;\n readonly reason: string;\n\n constructor(\n messageOrOptions:\n | string\n | {\n task?: Task;\n event?: string;\n to?: string;\n reason: string;\n } = \"Invalid task transition.\"\n ) {\n const options =\n typeof messageOrOptions === \"string\"\n ? {\n reason: messageOrOptions\n }\n : messageOrOptions;\n\n super(options.reason);\n this.name = \"InvalidTransitionError\";\n this.task = options.task;\n this.event = options.event;\n this.to = options.to;\n this.reason = options.reason;\n }\n}\n\nexport class MalformedTaskError extends Error {\n constructor(message = \"Malformed task.\") {\n super(message);\n this.name = \"MalformedTaskError\";\n }\n}\n", "import {\n findEvent,\n type EventDef,\n type StateMachineDef\n} from \"./state-machine.js\";\nimport { InvalidTransitionError, type TaskState } from \"./types.js\";\n\nexport type TaskEvent = \"plan\" | \"start\" | \"complete\" | \"archive\";\n\nexport const defaultStateMachine = {\n initial: \"draft\",\n states: [\"draft\", \"planned\", \"in-progress\", \"done\", \"archived\"],\n events: {\n plan: { from: [\"draft\"], to: \"planned\" },\n start: { from: [\"planned\"], to: \"in-progress\" },\n complete: { from: [\"in-progress\"], to: \"done\" },\n archive: { from: \"*\", to: \"archived\" }\n }\n} as const satisfies StateMachineDef<TaskState, TaskEvent>;\n\nfunction deriveLegacyTransitions(\n machine: typeof defaultStateMachine\n): Readonly<Record<TaskState, ReadonlySet<TaskState>>> {\n const transitions = Object.fromEntries(\n machine.states.map((state) => [state, new Set<TaskState>()])\n ) as Record<TaskState, Set<TaskState>>;\n\n for (const fromState of machine.states) {\n for (const eventName of Object.keys(machine.events) as TaskEvent[]) {\n const event = findEvent(machine, fromState, eventName);\n\n if (event !== undefined) {\n transitions[fromState].add(event.to);\n }\n }\n }\n\n const terminalState = machine.events.archive.to;\n const activeStates = machine.states.filter((state) => state !== terminalState);\n\n for (let index = 1; index < activeStates.length; index += 1) {\n transitions[activeStates[index]].add(activeStates[index - 1]);\n }\n\n return transitions;\n}\n\nconst defaultTransitions = deriveLegacyTransitions(defaultStateMachine);\n\nexport function resolveStateMachine(\n stateMachine?: StateMachineDef\n): StateMachineDef {\n return stateMachine ?? defaultStateMachine;\n}\n\nexport function assertEvent<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState,\n eventName: TEvent\n): EventDef<TState> {\n const event = findEvent(machine, fromState, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError(\n `Cannot fire event \"${eventName}\" from task state \"${fromState}\".`\n );\n }\n\n return event;\n}\n\nfunction canTransition(\n machine: StateMachineDef,\n fromState: string,\n toState: string\n): boolean {\n if (Object.is(machine, defaultStateMachine)) {\n return defaultTransitions[fromState as TaskState]?.has(toState as TaskState) ?? false;\n }\n\n for (const eventName of Object.keys(machine.events)) {\n if (findEvent(machine, fromState, eventName)?.to === toState) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function assertTransition(from: TaskState, to: TaskState): void;\nexport function assertTransition<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n from: TState,\n to: TState\n): void;\nexport function assertTransition<TState extends string, TEvent extends string>(\n machineOrFrom: StateMachineDef<TState, TEvent> | TaskState,\n fromOrTo: TState | TaskState,\n maybeTo?: TState\n): void {\n const machine =\n maybeTo === undefined\n ? defaultStateMachine\n : (machineOrFrom as StateMachineDef<TState, TEvent>);\n const fromState = maybeTo === undefined ? (machineOrFrom as TaskState) : (fromOrTo as TState);\n const toState = maybeTo === undefined ? (fromOrTo as TaskState) : maybeTo;\n\n if (!canTransition(machine, fromState, toState)) {\n throw new InvalidTransitionError(\n `Cannot transition task from \"${fromState}\" to \"${toState}\".`\n );\n }\n}\n", "import path from \"node:path\";\nimport type { Task, TaskListFs } from \"../types.js\";\n\nlet tmpFileCounter = 0;\n\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function sortStrings(values: string[]): string[] {\n return [...values].sort((left, right) => left.localeCompare(right));\n}\n\nexport function sortTasks(tasks: Task[]): Task[] {\n return [...tasks].sort((left, right) => left.qualifiedId.localeCompare(right.qualifiedId));\n}\n\nexport function validateTaskId(id: string): string {\n if (\n id.length === 0 ||\n id.startsWith(\".\") ||\n id.includes(\"/\") ||\n id.includes(\"\\\\\") ||\n id.includes(\"..\")\n ) {\n throw new Error(`Invalid task id \"${id}\".`);\n }\n\n return id;\n}\n\nexport async function statIfExists(\n fs: TaskListFs,\n filePath: string\n): Promise<Awaited<ReturnType<TaskListFs[\"stat\"]>> | undefined> {\n try {\n return await fs.stat(filePath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nexport async function writeAtomically(fs: TaskListFs, filePath: string, content: string): Promise<void> {\n const tempPath = `${filePath}.tmp-${process.pid}-${tmpFileCounter}`;\n tmpFileCounter += 1;\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n try {\n await fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n await fs.rename(tempPath, filePath);\n } catch (error) {\n try {\n await fs.unlink(tempPath);\n } catch (unlinkError) {\n if (!hasErrorCode(unlinkError, \"ENOENT\")) {\n throw unlinkError;\n }\n }\n\n throw error;\n }\n}\n", "import { acquireFileLock } from \"@poe-code/file-lock\";\nimport { parseDocument } from \"yaml\";\nimport storeSchema from \"../schema/store.schema.json\" with { type: \"json\" };\nimport taskSchema from \"../schema/task.schema.json\" with { type: \"json\" };\nimport { eventsFromState, findEvent } from \"../state-machine.js\";\nimport { resolveStateMachine } from \"../state.js\";\nimport {\n InvalidTransitionError,\n MalformedTaskError,\n TaskAlreadyExistsError,\n TaskNotFoundError,\n type BackendDeps,\n type ListFilter,\n type Task,\n type TaskCreate,\n type TaskFireOptions,\n type TaskList,\n type TaskListFs,\n type Tasks,\n type TaskUpdate\n} from \"../types.js\";\nimport {\n isRecord,\n sortStrings,\n sortTasks,\n statIfExists,\n validateTaskId,\n writeAtomically\n} from \"./utils.js\";\n\nconst STORE_KIND = \"task-store\";\nconst STORE_SCHEMA_ID = storeSchema.$id;\nconst STORE_VERSION = 1;\nconst TASK_KIND = \"task\";\nconst TASK_SCHEMA_ID = taskSchema.$id;\nconst TASK_VERSION = 1;\nconst RESERVED_TASK_KEYS = new Set([\"$schema\", \"description\", \"kind\", \"name\", \"state\", \"version\"]);\n\ntype StoreRecord = Record<string, unknown>;\ntype TaskRecord = Record<string, unknown>;\n\nfunction malformedStore(filePath: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task store \"${filePath}\": invalid \"${field}\".`);\n}\n\nfunction malformedTask(list: string, id: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task \"${list}/${id}\": invalid \"${field}\".`);\n}\n\nfunction validateListName(name: string): string {\n if (\n name.length === 0 ||\n name.startsWith(\".\") ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"..\")\n ) {\n throw new Error(`Invalid task list name \"${name}\".`);\n }\n\n return name;\n}\n\nfunction parseQualifiedId(qualifiedId: string): {\n id: string;\n list: string;\n} {\n const separatorIndex = qualifiedId.indexOf(\"/\");\n\n if (\n separatorIndex <= 0 ||\n separatorIndex !== qualifiedId.lastIndexOf(\"/\") ||\n separatorIndex === qualifiedId.length - 1\n ) {\n throw new Error(`Invalid qualified task id \"${qualifiedId}\".`);\n }\n\n return {\n list: validateListName(qualifiedId.slice(0, separatorIndex)),\n id: validateTaskId(qualifiedId.slice(separatorIndex + 1))\n };\n}\n\nfunction descriptionFromTaskRecord(taskRecord: TaskRecord): string {\n return typeof taskRecord.description === \"string\" ? taskRecord.description : \"\";\n}\n\nfunction metadataFromTaskRecord(taskRecord: TaskRecord): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(taskRecord)) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n metadata[key] = value;\n }\n }\n\n return metadata;\n}\n\nfunction createTask(list: string, id: string, taskRecord: TaskRecord): Task {\n return {\n list,\n id,\n qualifiedId: `${list}/${id}`,\n name: taskRecord.name as string,\n state: taskRecord.state as string,\n description: descriptionFromTaskRecord(taskRecord),\n metadata: metadataFromTaskRecord(taskRecord)\n };\n}\n\nfunction matchesFilter(task: Task, filter?: ListFilter): boolean {\n if (!filter?.includeArchived && task.state === \"archived\") {\n return false;\n }\n\n if (filter?.state !== undefined && task.state !== filter.state) {\n return false;\n }\n\n return true;\n}\n\nfunction createTaskRecord(\n defaults: BackendDeps[\"defaults\"],\n input: TaskCreate,\n initialState: string\n): TaskRecord {\n const taskRecord: TaskRecord = {\n name: input.name,\n state: initialState,\n description: input.description ?? \"\"\n };\n\n for (const [key, value] of Object.entries(defaults.metadata)) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n taskRecord[key] = value;\n }\n }\n\n for (const [key, value] of Object.entries(input.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n taskRecord[key] = value;\n }\n }\n\n return taskRecord;\n}\n\nfunction assertCreateDoesNotSetState(input: TaskCreate): void {\n if (Object.prototype.hasOwnProperty.call(input, \"state\")) {\n throw new Error(\n 'Tasks.create() does not accept \"state\"; new tasks always start at stateMachine.initial.'\n );\n }\n}\n\nfunction assertUpdateDoesNotSetState(patch: TaskUpdate): void {\n if (Object.prototype.hasOwnProperty.call(patch, \"state\")) {\n throw new Error('Tasks.update() does not accept \"state\"; use fire() to change task state.');\n }\n}\n\nfunction buildUpdatedTaskRecord(existing: TaskRecord, patch: TaskUpdate): TaskRecord {\n const nextTaskRecord: TaskRecord = {\n ...existing,\n name: patch.name ?? existing.name,\n state: existing.state,\n description: patch.description ?? descriptionFromTaskRecord(existing)\n };\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n nextTaskRecord[key] = value;\n }\n }\n\n return nextTaskRecord;\n}\n\nfunction buildTransitionedTaskRecord(existing: TaskRecord, to: string): TaskRecord {\n return {\n ...existing,\n state: to,\n description: descriptionFromTaskRecord(existing)\n };\n}\n\nfunction buildFiredTaskRecord(\n existing: TaskRecord,\n to: string,\n metadataPatch?: Record<string, unknown>\n): TaskRecord {\n const nextTaskRecord = buildTransitionedTaskRecord(existing, to);\n\n for (const [key, value] of Object.entries(metadataPatch ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n nextTaskRecord[key] = value;\n }\n }\n\n return nextTaskRecord;\n}\n\nfunction parseStoreDocument(filePath: string, content: string) {\n let document;\n\n try {\n document = parseDocument(content, { keepSourceTokens: true, prettyErrors: false });\n } catch {\n throw malformedStore(filePath, \"yaml\");\n }\n\n if (document.errors.length > 0) {\n throw malformedStore(filePath, \"yaml\");\n }\n\n return document;\n}\n\nfunction assertValidStoreRecord(store: unknown, filePath: string): asserts store is StoreRecord {\n if (!isRecord(store)) {\n throw malformedStore(filePath, \"store\");\n }\n\n if (store.$schema !== STORE_SCHEMA_ID) {\n throw malformedStore(filePath, \"$schema\");\n }\n\n if (store.kind !== STORE_KIND) {\n throw malformedStore(filePath, \"kind\");\n }\n\n if (typeof store.version !== \"number\" || !Number.isInteger(store.version) || store.version !== STORE_VERSION) {\n throw malformedStore(filePath, \"version\");\n }\n\n if (!isRecord(store.lists)) {\n throw malformedStore(filePath, \"lists\");\n }\n}\n\nfunction assertValidTaskRecord(\n taskRecord: unknown,\n list: string,\n id: string,\n validStates: ReadonlySet<string>\n): asserts taskRecord is TaskRecord {\n if (!isRecord(taskRecord)) {\n throw malformedTask(list, id, \"task\");\n }\n\n if (\"$schema\" in taskRecord && taskRecord.$schema !== TASK_SCHEMA_ID) {\n throw malformedTask(list, id, \"$schema\");\n }\n\n if (\"kind\" in taskRecord && taskRecord.kind !== TASK_KIND) {\n throw malformedTask(list, id, \"kind\");\n }\n\n if (\"version\" in taskRecord) {\n if (\n typeof taskRecord.version !== \"number\" ||\n !Number.isInteger(taskRecord.version) ||\n taskRecord.version !== TASK_VERSION\n ) {\n throw malformedTask(list, id, \"version\");\n }\n }\n\n if (typeof taskRecord.name !== \"string\" || taskRecord.name.length === 0) {\n throw malformedTask(list, id, \"name\");\n }\n\n if (typeof taskRecord.state !== \"string\" || !validStates.has(taskRecord.state)) {\n throw malformedTask(list, id, \"state\");\n }\n\n if (\"description\" in taskRecord && typeof taskRecord.description !== \"string\") {\n throw malformedTask(list, id, \"description\");\n }\n}\n\nfunction validateStoreEntries(\n store: StoreRecord,\n filePath: string,\n validStates: ReadonlySet<string>\n): void {\n const lists = store.lists;\n\n if (!isRecord(lists)) {\n throw malformedStore(filePath, \"lists\");\n }\n\n for (const [list, listRecord] of Object.entries(lists)) {\n try {\n validateListName(list);\n } catch {\n throw malformedStore(filePath, `lists.${list}`);\n }\n\n if (!isRecord(listRecord)) {\n throw malformedStore(filePath, `lists.${list}`);\n }\n\n for (const [id, taskRecord] of Object.entries(listRecord)) {\n try {\n validateTaskId(id);\n } catch {\n throw malformedTask(list, id, \"id\");\n }\n\n assertValidTaskRecord(taskRecord, list, id, validStates);\n }\n }\n}\n\nfunction serializeDocument(document: { toString(): string }): string {\n const serialized = document.toString();\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nasync function readStore(\n fs: TaskListFs,\n filePath: string,\n validStates: ReadonlySet<string>\n): Promise<{\n document: ReturnType<typeof parseStoreDocument>;\n store: StoreRecord;\n}> {\n const content = await fs.readFile(filePath, \"utf8\");\n const document = parseStoreDocument(filePath, content);\n const store = document.toJS();\n\n assertValidStoreRecord(store, filePath);\n validateStoreEntries(store, filePath, validStates);\n\n return {\n document,\n store\n };\n}\n\nfunction getListsRecord(store: StoreRecord): Record<string, unknown> {\n return store.lists as Record<string, unknown>;\n}\n\nfunction getListRecord(store: StoreRecord, list: string): Record<string, unknown> | undefined {\n const listRecord = getListsRecord(store)[list];\n return isRecord(listRecord) ? listRecord : undefined;\n}\n\nfunction getTaskRecord(store: StoreRecord, list: string, id: string): TaskRecord | undefined {\n const listRecord = getListRecord(store, list);\n const taskRecord = listRecord?.[id];\n\n return isRecord(taskRecord) ? taskRecord : undefined;\n}\n\nfunction getTaskOrThrow(store: StoreRecord, list: string, id: string): TaskRecord {\n const taskRecord = getTaskRecord(store, list, id);\n\n if (!taskRecord) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return taskRecord;\n}\n\nasync function ensureStorePath(deps: BackendDeps): Promise<void> {\n if (!deps.create) {\n await deps.fs.stat(deps.path);\n return;\n }\n\n const existing = await statIfExists(deps.fs, deps.path);\n if (existing !== undefined) {\n return;\n }\n\n await writeAtomically(\n deps.fs,\n deps.path,\n serializeDocument(\n parseDocument(\n [\n `$schema: ${STORE_SCHEMA_ID}`,\n `kind: ${STORE_KIND}`,\n `version: ${STORE_VERSION}`,\n \"lists: {}\",\n \"\"\n ].join(\"\\n\")\n )\n )\n );\n}\n\nasync function withStoreLock<T>(deps: BackendDeps, action: () => Promise<T>): Promise<T> {\n const release = await acquireFileLock(deps.path, {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n}\n\nfunction createTasksView(deps: BackendDeps, list: string): Tasks {\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n async function readTasks(filter?: ListFilter): Promise<Task[]> {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const listRecord = getListRecord(store, list);\n\n if (!listRecord) {\n return [];\n }\n\n const tasks = Object.entries(listRecord).map(([id, taskRecord]) => createTask(list, id, taskRecord as TaskRecord));\n\n return sortTasks(tasks.filter((task) => matchesFilter(task, filter)));\n }\n\n function assertFireableTaskEvent(task: Task, eventName: string) {\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: stateMachine.events[eventName]?.to,\n reason: `Cannot fire event \"${eventName}\" from task state \"${task.state}\".`\n });\n }\n\n return event;\n }\n\n return {\n name: list,\n stateMachine,\n async all(filter?: ListFilter): Promise<Task[]> {\n return readTasks(filter);\n },\n async get(id: string): Promise<Task> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n return createTask(list, id, getTaskOrThrow(store, list, id));\n },\n async create(input: TaskCreate): Promise<Task> {\n assertCreateDoesNotSetState(input);\n validateTaskId(input.id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n if (getTaskRecord(store, list, input.id)) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${input.id}\" already exists.`);\n }\n\n const taskRecord = createTaskRecord(deps.defaults, input, stateMachine.initial);\n document.setIn([\"lists\", list, input.id], taskRecord);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, input.id, taskRecord);\n });\n },\n async update(id: string, patch: TaskUpdate): Promise<Task> {\n assertUpdateDoesNotSetState(patch);\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const existing = getTaskOrThrow(store, list, id);\n const nextTaskRecord = buildUpdatedTaskRecord(existing, patch);\n\n if (patch.name !== undefined) {\n document.setIn([\"lists\", list, id, \"name\"], patch.name);\n }\n\n if (patch.description !== undefined) {\n document.setIn([\"lists\", list, id, \"description\"], patch.description);\n }\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n document.setIn([\"lists\", list, id, key], value);\n }\n }\n\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, id, nextTaskRecord);\n });\n },\n async fire(id: string, eventName: string, opts?: TaskFireOptions): Promise<Task> {\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const existing = getTaskOrThrow(store, list, id);\n const task = createTask(list, id, existing);\n const event = assertFireableTaskEvent(task, eventName);\n const guardResult = event.guard?.(task) ?? true;\n\n if (guardResult !== true) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: event.to,\n reason: guardResult\n });\n }\n\n await event.onExit?.(task);\n\n const nextTaskRecord = buildFiredTaskRecord(existing, event.to, opts?.metadataPatch);\n document.setIn([\"lists\", list, id, \"state\"], event.to);\n\n for (const [key, value] of Object.entries(opts?.metadataPatch ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n document.setIn([\"lists\", list, id, key], value);\n }\n }\n\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n const nextTask = createTask(list, id, nextTaskRecord);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n });\n },\n async canFire(id: string, eventName: string): Promise<boolean> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const task = createTask(list, id, getTaskOrThrow(store, list, id));\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n return false;\n }\n\n return (event.guard?.(task) ?? true) === true;\n },\n async events(id: string): Promise<readonly string[]> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const task = createTask(list, id, getTaskOrThrow(store, list, id));\n\n return eventsFromState(stateMachine, task.state);\n },\n async delete(id: string): Promise<void> {\n validateTaskId(id);\n\n await withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n getTaskOrThrow(store, list, id);\n document.deleteIn([\"lists\", list, id]);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n });\n }\n };\n}\n\nexport async function yamlFileBackend(deps: BackendDeps): Promise<TaskList> {\n await ensureStorePath(deps);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n const list = (name: string): Tasks => {\n const listName = validateListName(name);\n return createTasksView({ ...deps, stateMachine }, listName);\n };\n\n const lists = async (): Promise<string[]> => {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n return sortStrings(Object.keys(getListsRecord(store)));\n };\n\n const allTasks = async (filter?: ListFilter): Promise<Task[]> => {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const tasks: Task[] = [];\n\n for (const [listName, listRecord] of Object.entries(getListsRecord(store))) {\n for (const [id, taskRecord] of Object.entries(listRecord as Record<string, unknown>)) {\n const task = createTask(listName, id, taskRecord as TaskRecord);\n if (matchesFilter(task, filter)) {\n tasks.push(task);\n }\n }\n }\n\n return sortTasks(tasks);\n };\n\n const get = async (qualifiedId: string): Promise<Task> => {\n const { list: listName, id } = parseQualifiedId(qualifiedId);\n return list(listName).get(id);\n };\n\n return {\n list,\n lists,\n allTasks,\n get\n };\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://poe-platform.github.io/poe-code/schemas/task-list/store.schema.json\",\n \"title\": \"Task Store\",\n \"description\": \"YAML multi-list task store.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://poe-platform.github.io/poe-code/schemas/task-list/store.schema.json\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"const\": \"task-store\"\n },\n \"version\": {\n \"type\": \"integer\",\n \"const\": 1\n },\n \"lists\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"./task.schema.json\"\n }\n }\n }\n },\n \"required\": [\"$schema\", \"kind\", \"version\", \"lists\"],\n \"additionalProperties\": false\n}\n", "import { TaskAlreadyExistsError, TaskNotFoundError, openTaskList } from \"@poe-code/task-list\";\nimport type { OpenTaskListOptions, StateMachineDef, Task, TaskList, Tasks } from \"@poe-code/task-list\";\nimport { randomBytes } from \"node:crypto\";\nimport { UserError } from \"../user-error.js\";\nimport { approvalStateMachine } from \"./state-machine.js\";\nimport type { HumanInLoopPending, HumanInLoopRuntimeOptions } from \"./types.js\";\n\nconst DEFAULT_LIST_NAME = \"approvals\";\n\nconst openedTaskListsByRuntime = new WeakMap<HumanInLoopRuntimeOptions, Promise<TaskList>>();\nconst validatedListsByRuntime = new WeakMap<HumanInLoopRuntimeOptions, Set<string>>();\n\nexport interface ApprovalPayload {\n approvalId?: string;\n commandPath: string;\n params: Record<string, unknown>;\n message: string;\n declineInputPrompt?: string | null;\n enqueuedAt?: string;\n pid?: number | null;\n result?: unknown;\n error?: unknown;\n}\n\nexport async function ensureApprovalList(\n runtimeOptions: HumanInLoopRuntimeOptions | undefined,\n deps: {\n openTaskList?: (options: OpenTaskListOptions) => Promise<TaskList>;\n } = {},\n): Promise<{ taskList: TaskList; listName: string; tasks: Tasks }> {\n if (runtimeOptions?.taskList === undefined) {\n throw new UserError(\"humanInLoop.taskList required for async-mode commands\");\n }\n\n const listName = runtimeOptions.listName ?? DEFAULT_LIST_NAME;\n const taskList = await resolveTaskList(runtimeOptions, runtimeOptions.taskList, deps.openTaskList ?? openTaskList);\n const tasks = taskList.list(listName);\n\n if (!isListValidated(runtimeOptions, listName)) {\n if (!isApprovalStateMachine(tasks.stateMachine)) {\n throw new UserError(\n \"approvals task-list configured with a different state machine; pass approvalStateMachine when opening the list\"\n );\n }\n\n cacheValidatedList(runtimeOptions, listName);\n }\n\n return {\n taskList,\n listName,\n tasks,\n };\n}\n\nexport async function enqueueApproval(ctx: {\n tasks: Tasks;\n payload: ApprovalPayload;\n}): Promise<{ approvalId: string; pending: HumanInLoopPending }> {\n const enqueuedAt = new Date().toISOString();\n const approval = createApprovalRecord(ctx.payload, enqueuedAt);\n\n try {\n await createApprovalTask(ctx.tasks, approval);\n } catch (error) {\n if (!(error instanceof TaskAlreadyExistsError)) {\n throw error;\n }\n\n const retryApproval = createApprovalRecord(ctx.payload, enqueuedAt);\n await createApprovalTask(ctx.tasks, retryApproval);\n return retryApproval;\n }\n\n return approval;\n}\n\nexport async function loadApproval(ctx: {\n tasks: Tasks;\n approvalId: string;\n}): Promise<ApprovalPayload | undefined> {\n try {\n const task = await ctx.tasks.get(ctx.approvalId);\n return approvalPayloadFromTask(task);\n } catch (error) {\n if (error instanceof TaskNotFoundError) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nasync function resolveTaskList(\n runtimeOptions: HumanInLoopRuntimeOptions,\n taskList: NonNullable<HumanInLoopRuntimeOptions[\"taskList\"]>,\n openTaskListFn: (options: OpenTaskListOptions) => Promise<TaskList>,\n): Promise<TaskList> {\n if (!isTaskListConfig(taskList)) {\n return taskList;\n }\n\n const cachedTaskList = openedTaskListsByRuntime.get(runtimeOptions);\n\n if (cachedTaskList !== undefined) {\n return cachedTaskList;\n }\n\n const openedTaskList = openTaskListFn({\n create: true,\n type: taskList.format,\n path: taskList.dir,\n stateMachine: approvalStateMachine,\n });\n openedTaskListsByRuntime.set(runtimeOptions, openedTaskList);\n return openedTaskList;\n}\n\nfunction cacheValidatedList(runtimeOptions: HumanInLoopRuntimeOptions, listName: string): void {\n const validatedLists = validatedListsByRuntime.get(runtimeOptions);\n\n if (validatedLists === undefined) {\n validatedListsByRuntime.set(runtimeOptions, new Set([listName]));\n return;\n }\n\n validatedLists.add(listName);\n}\n\nfunction isListValidated(runtimeOptions: HumanInLoopRuntimeOptions, listName: string): boolean {\n return validatedListsByRuntime.get(runtimeOptions)?.has(listName) ?? false;\n}\n\nfunction createApprovalRecord(\n payload: ApprovalPayload,\n enqueuedAt: string,\n): { approvalId: string; pending: HumanInLoopPending; metadata: Record<string, unknown>; name: string } {\n const approvalId = `${enqueuedAt.slice(0, 19).replaceAll(\":\", \"-\")}-${randomBytes(3).toString(\"hex\")}`;\n\n return {\n approvalId,\n name: `${payload.commandPath} (${enqueuedAt})`,\n metadata: {\n schemaVersion: 1,\n approvalId,\n commandPath: payload.commandPath,\n params: payload.params,\n message: payload.message,\n declineInputPrompt: payload.declineInputPrompt ?? null,\n enqueuedAt,\n pid: null,\n result: null,\n error: null,\n },\n pending: {\n status: \"pending-approval\",\n approvalId,\n message: payload.message,\n enqueuedAt,\n },\n };\n}\n\nasync function createApprovalTask(\n tasks: Tasks,\n approval: { approvalId: string; metadata: Record<string, unknown>; name: string }\n): Promise<void> {\n await tasks.create({\n id: approval.approvalId,\n name: approval.name,\n metadata: approval.metadata,\n });\n}\n\nfunction isApprovalStateMachine(stateMachine: StateMachineDef): boolean {\n if (stateMachine === approvalStateMachine) {\n return true;\n }\n\n return isDeepEqualStateMachine(stateMachine, approvalStateMachine);\n}\n\nfunction isTaskListConfig(\n taskList: HumanInLoopRuntimeOptions[\"taskList\"],\n): taskList is NonNullable<Exclude<HumanInLoopRuntimeOptions[\"taskList\"], TaskList>> {\n return taskList !== undefined && \"dir\" in taskList;\n}\n\nfunction isDeepEqualStateMachine(left: StateMachineDef, right: StateMachineDef): boolean {\n if (!areEqualStrings(left.states, right.states)) {\n return false;\n }\n\n const leftEventNames = Object.keys(left.events);\n const rightEventNames = Object.keys(right.events);\n\n if (!areEqualStrings(leftEventNames, rightEventNames)) {\n return false;\n }\n\n for (const eventName of leftEventNames) {\n const leftEvent = left.events[eventName];\n const rightEvent = right.events[eventName];\n\n if (leftEvent === undefined || rightEvent === undefined) {\n return false;\n }\n\n if (leftEvent.to !== rightEvent.to) {\n return false;\n }\n\n if (!areEqualEventFrom(leftEvent.from, rightEvent.from)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction areEqualEventFrom(left: readonly string[] | \"*\", right: readonly string[] | \"*\"): boolean {\n if (left === \"*\" || right === \"*\") {\n return left === right;\n }\n\n return areEqualStrings(left, right);\n}\n\nfunction areEqualStrings(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction approvalPayloadFromTask(task: Task): ApprovalPayload | undefined {\n const metadata = task.metadata;\n\n if (typeof metadata !== \"object\" || metadata === null) {\n return undefined;\n }\n\n if (metadata.schemaVersion !== 1) {\n return undefined;\n }\n\n if (typeof metadata.approvalId !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.commandPath !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.message !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.enqueuedAt !== \"string\") {\n return undefined;\n }\n\n if (typeof metadata.params !== \"object\" || metadata.params === null) {\n return undefined;\n }\n\n return {\n approvalId: metadata.approvalId,\n commandPath: metadata.commandPath,\n params: metadata.params as Record<string, unknown>,\n message: metadata.message,\n declineInputPrompt:\n typeof metadata.declineInputPrompt === \"string\" || metadata.declineInputPrompt === null\n ? metadata.declineInputPrompt\n : undefined,\n enqueuedAt: metadata.enqueuedAt,\n pid: typeof metadata.pid === \"number\" || metadata.pid === null ? metadata.pid : undefined,\n result: metadata.result,\n error: metadata.error,\n };\n}\n", "import type { StateMachineDef } from \"@poe-code/task-list\";\n\nexport type ApprovalState =\n | \"pending\"\n | \"approved-running\"\n | \"approved-done\"\n | \"approved-failed\"\n | \"declined\";\n\nexport type ApprovalEvent = \"start\" | \"succeed\" | \"fail\" | \"decline\";\n\nexport const approvalStateMachine: StateMachineDef<ApprovalState, ApprovalEvent> = {\n initial: \"pending\",\n states: [\"pending\", \"approved-running\", \"approved-done\", \"approved-failed\", \"declined\"],\n events: {\n start: { from: [\"pending\"], to: \"approved-running\" },\n succeed: { from: [\"approved-running\"], to: \"approved-done\" },\n fail: { from: [\"approved-running\"], to: \"approved-failed\" },\n decline: { from: [\"pending\"], to: \"declined\" },\n },\n};\n", "import { access, readFile, writeFile } from \"node:fs/promises\";\nimport type { Task } from \"@poe-code/task-list\";\nimport type { Command, CommandNode, HandlerEnv, HandlerFs, HandlerContext } from \"../index.js\";\nimport { UserError, resolveCommandSecrets } from \"../index.js\";\nimport { ensureApprovalList } from \"./approval-tasks.js\";\nimport { resolveProvider } from \"./gate.js\";\nimport type { ApprovalPayload } from \"./approval-tasks.js\";\nimport type { HumanInLoopRuntimeOptions } from \"./types.js\";\n\ninterface SerializedJsonResult {\n ok: true;\n value: unknown;\n}\n\ninterface UnserializableJsonResult {\n ok: false;\n}\n\nexport async function runApproval(\n approvalId: string,\n runtimeOptions: HumanInLoopRuntimeOptions,\n root: CommandNode<any>,\n): Promise<void> {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n const task = await tasks.get(approvalId);\n\n if (task.state !== \"pending\") {\n return;\n }\n\n const approval = readApprovalPayload(task);\n const provider = resolveProvider(runtimeOptions);\n\n try {\n const approvalResult = await provider.requestApproval({\n message: approval.message,\n declineInputPrompt: approval.declineInputPrompt ?? undefined,\n });\n\n if (approvalResult.outcome === \"declined\") {\n await tasks.fire(approvalId, \"decline\", {\n metadataPatch: {\n error: {\n reason: approvalResult.reason,\n },\n },\n });\n return;\n }\n } catch (error) {\n await failPendingApproval(tasks, approvalId, error);\n return;\n }\n\n await tasks.fire(approvalId, \"start\", {\n metadataPatch: {\n pid: process.pid,\n },\n });\n\n try {\n const command = findCommand(root, approval.commandPath);\n const ctx = createHandlerContext(command, approval.params);\n const result = await command.handler(ctx);\n const serializedResult = serializeJsonResult(result);\n\n if (!serializedResult.ok) {\n await tasks.fire(approvalId, \"fail\", {\n metadataPatch: {\n error: {\n message: \"result not JSON-serializable\",\n },\n },\n });\n return;\n }\n\n await tasks.fire(approvalId, \"succeed\", {\n metadataPatch: {\n result: serializedResult.value,\n },\n });\n } catch (error) {\n await tasks.fire(approvalId, \"fail\", {\n metadataPatch: {\n error: errorMetadataFromUnknown(error),\n },\n });\n }\n}\n\nfunction readApprovalPayload(task: Task): ApprovalPayload {\n const metadata = task.metadata;\n\n if (typeof metadata !== \"object\" || metadata === null) {\n throw new UserError(`Malformed approval metadata for \"${task.qualifiedId}\".`);\n }\n\n if (metadata.schemaVersion !== 1) {\n throw new UserError(`Malformed approval metadata for \"${task.qualifiedId}\".`);\n }\n\n if (\n typeof metadata.commandPath !== \"string\" ||\n typeof metadata.message !== \"string\" ||\n typeof metadata.params !== \"object\" ||\n metadata.params === null\n ) {\n throw new UserError(`Malformed approval metadata for \"${task.qualifiedId}\".`);\n }\n\n const declineInputPrompt =\n typeof metadata.declineInputPrompt === \"string\" || metadata.declineInputPrompt === null\n ? metadata.declineInputPrompt\n : undefined;\n\n return {\n approvalId: typeof metadata.approvalId === \"string\" ? metadata.approvalId : undefined,\n commandPath: metadata.commandPath,\n params: metadata.params as Record<string, unknown>,\n message: metadata.message,\n declineInputPrompt,\n enqueuedAt: typeof metadata.enqueuedAt === \"string\" ? metadata.enqueuedAt : undefined,\n pid: typeof metadata.pid === \"number\" || metadata.pid === null ? metadata.pid : undefined,\n result: metadata.result,\n error: metadata.error,\n };\n}\n\nfunction findCommand(root: CommandNode<any>, commandPath: string): Command<any, any, any, any> {\n const pathSegments = commandPath.split(\".\").filter((segment) => segment.length > 0);\n\n if (pathSegments.length === 0) {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n let current: CommandNode<any> = root;\n\n for (const segment of pathSegments) {\n if (current.kind !== \"group\") {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n const next = current.children.find((child) => child.name === segment);\n\n if (next === undefined) {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n current = next;\n }\n\n if (current.kind !== \"command\") {\n throw new UserError(`Unknown approval command path \"${commandPath}\".`);\n }\n\n return current;\n}\n\nfunction createHandlerContext(\n command: Command<any, any, any, any>,\n params: Record<string, unknown>\n): HandlerContext<any, any, any> {\n return {\n params,\n secrets: resolveCommandSecrets(command),\n fetch: globalThis.fetch,\n fs: createFs(),\n env: createEnv(),\n progress(): void {\n return undefined;\n },\n };\n}\n\nfunction createFs(): HandlerFs {\n return {\n readFile: async (path: string, encoding = \"utf8\") => readFile(path, { encoding }),\n writeFile: async (path: string, contents: string) => {\n await writeFile(path, contents);\n },\n exists: async (path: string) => {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n },\n };\n}\n\nfunction createEnv(values: Record<string, string | undefined> = process.env): HandlerEnv {\n return {\n get(key: string): string | undefined {\n return values[key];\n },\n };\n}\n\nfunction serializeJsonResult(value: unknown): SerializedJsonResult | UnserializableJsonResult {\n try {\n const serialized = JSON.stringify(value);\n\n if (serialized === undefined) {\n return {\n ok: false,\n };\n }\n\n return {\n ok: true,\n value: JSON.parse(serialized) as unknown,\n };\n } catch {\n return {\n ok: false,\n };\n }\n}\n\nfunction errorMetadataFromUnknown(error: unknown): {\n name: string;\n message: string;\n stack?: string;\n} {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n\n return {\n name: \"Error\",\n message: String(error),\n };\n}\n\nasync function failPendingApproval(tasks: Awaited<ReturnType<typeof ensureApprovalList>>[\"tasks\"], approvalId: string, error: unknown): Promise<void> {\n await tasks.fire(approvalId, \"start\", {\n metadataPatch: {\n pid: process.pid,\n },\n });\n await tasks.fire(approvalId, \"fail\", {\n metadataPatch: {\n error: errorMetadataFromUnknown(error),\n },\n });\n}\n", "import process from \"node:process\";\nimport { osascriptProvider } from \"@poe-code/agent-human-in-loop\";\nimport type { HumanInLoopProvider } from \"@poe-code/agent-human-in-loop\";\nimport { UserError } from \"../user-error.js\";\n\nfunction noProviderConfigured(): HumanInLoopProvider {\n return {\n id: \"noProviderConfigured\",\n async requestApproval() {\n throw new UserError(\n \"no human-in-loop provider configured for this platform \u2014 pass humanInLoop.provider to the runtime\"\n );\n },\n };\n}\n\nfunction createDefaultProviderFactory(): () => HumanInLoopProvider {\n let provider: HumanInLoopProvider | undefined;\n\n return () => {\n if (provider !== undefined) {\n return provider;\n }\n\n provider =\n process.platform === \"darwin\" ? osascriptProvider({ title: \"Approval needed\" }) : noProviderConfigured();\n\n return provider;\n };\n}\n\nconst getDefaultProvider = createDefaultProviderFactory();\n\nexport function defaultProviderForPlatform(): HumanInLoopProvider {\n return getDefaultProvider();\n}\n", "import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nimport type { HumanInLoopProvider } from \"../types.js\";\nimport { buildScript, parseStdout } from \"./osascript-script.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface OsascriptProviderOptions {\n title?: string;\n binary?: string;\n}\n\nfunction isUserCanceled(error: unknown): boolean {\n const message = error instanceof Error ? error.message : error === undefined ? \"\" : String(error);\n const stderr = (error as { stderr?: string } | undefined)?.stderr ?? \"\";\n return `${message}\\n${stderr}`.includes(\"(-128)\");\n}\n\nexport function osascriptProvider(options: OsascriptProviderOptions = {}): HumanInLoopProvider {\n const title = options.title ?? \"Approval needed\";\n const binary = options.binary ?? \"osascript\";\n\n return {\n id: \"osascript\",\n async requestApproval(request) {\n const script = buildScript(request, title);\n\n try {\n const { stdout } = await execFileAsync(binary, [\"-e\", script]);\n return parseStdout(stdout);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\"osascript not found \u2014 provide a different provider on this platform\");\n }\n if (isUserCanceled(error)) {\n return { outcome: \"declined\" };\n }\n\n const stderr = (error as { stderr?: string }).stderr ?? String(error);\n throw new Error(`osascript failed: ${stderr.trim()}`);\n }\n }\n };\n}\n", "import type { ApprovalRequest, ApprovalResult } from \"../types.js\";\n\nexport function escapeAppleScriptString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nexport function buildScript(request: ApprovalRequest, title: string): string {\n const escapedMessage = escapeAppleScriptString(request.message);\n const escapedTitle = escapeAppleScriptString(title);\n\n if (request.declineInputPrompt === undefined) {\n return `button returned of (display dialog \"${escapedMessage}\" with title \"${escapedTitle}\" buttons {\"Decline\",\"Approve\"} default button \"Approve\")`;\n }\n\n const escapedPrompt = escapeAppleScriptString(request.declineInputPrompt);\n\n return `set firstResp to button returned of (display dialog \"${escapedMessage}\" with title \"${escapedTitle}\" buttons {\"Decline\",\"Approve\"} default button \"Approve\")\nif firstResp is \"Approve\" then\n return \"APPROVED\"\nend if\ntry\n set reason to text returned of (display dialog \"${escapedPrompt}\" default answer \"\" with title \"${escapedTitle}\" buttons {\"Cancel\",\"Submit\"} default button \"Submit\")\n return \"DECLINED:\" & reason\non error number -128\n return \"DECLINED:\"\nend try`;\n}\n\nexport function parseStdout(out: string): ApprovalResult {\n const value = out.replace(/\\n+$/u, \"\");\n\n switch (value) {\n case \"Approve\":\n case \"APPROVED\":\n return { outcome: \"approved\" };\n case \"Decline\":\n return { outcome: \"declined\" };\n default:\n break;\n }\n\n if (value.startsWith(\"DECLINED:\")) {\n const reason = value.slice(\"DECLINED:\".length);\n return reason === \"\"\n ? { outcome: \"declined\" }\n : { outcome: \"declined\", reason };\n }\n\n throw new Error(`unexpected osascript output: ${out}`);\n}\n", "import { spawn } from \"node:child_process\";\nimport type { HumanInLoopRuntimeOptions } from \"./types.js\";\n\nexport function spawnApprovalRunner(\n approvalId: string,\n runtimeOptions: HumanInLoopRuntimeOptions,\n spawnFn?: typeof import(\"node:child_process\").spawn\n): void {\n const { execPath, entryArgs } = runtimeOptions.binPath ?? {\n execPath: process.execPath,\n entryArgs: [process.argv[1]!],\n };\n const fn = spawnFn ?? spawn;\n const child = fn(execPath, [...entryArgs, \"approvals\", \"run\", approvalId], {\n detached: true,\n stdio: \"ignore\",\n env: process.env,\n cwd: process.cwd(),\n });\n\n child.unref();\n}\n\nexport default spawnApprovalRunner;\n", "import type { Command, HandlerContext } from \"../index.js\";\nimport { enqueueApproval, ensureApprovalList } from \"./approval-tasks.js\";\nimport { defaultProviderForPlatform } from \"./default-provider.js\";\nimport { spawnApprovalRunner } from \"./spawn.js\";\nimport { ApprovalDeclinedError } from \"./types.js\";\nimport type { HumanInLoopPending, HumanInLoopProvider, HumanInLoopRuntimeOptions } from \"./types.js\";\n\nconst providersByRuntime = new WeakMap<HumanInLoopRuntimeOptions, HumanInLoopProvider>();\nlet providerWithoutRuntime: HumanInLoopProvider | undefined;\n\nexport function resolveProvider(runtimeOptions: HumanInLoopRuntimeOptions | undefined): HumanInLoopProvider {\n if (runtimeOptions?.provider !== undefined) {\n return runtimeOptions.provider;\n }\n\n if (runtimeOptions === undefined) {\n providerWithoutRuntime ??= defaultProviderForPlatform();\n return providerWithoutRuntime;\n }\n\n const cachedProvider = providersByRuntime.get(runtimeOptions);\n if (cachedProvider !== undefined) {\n return cachedProvider;\n }\n\n const provider = defaultProviderForPlatform();\n providersByRuntime.set(runtimeOptions, provider);\n return provider;\n}\n\nexport async function invokeWithHumanInLoop<T>(\n node: Command<any, any, any, T>,\n ctx: HandlerContext<any, any, any>,\n runtimeOptions: HumanInLoopRuntimeOptions | undefined,\n commandPath: string,\n): Promise<T | HumanInLoopPending> {\n if (!node.humanInLoop) {\n return node.handler(ctx);\n }\n\n const message = node.humanInLoop.message({\n params: ctx.params,\n commandPath,\n });\n\n if (node.humanInLoop.mode === \"async\") {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n const { approvalId, pending } = await enqueueApproval({\n tasks,\n payload: {\n commandPath,\n params: ctx.params,\n message,\n declineInputPrompt: node.humanInLoop.declineInputPrompt,\n },\n });\n\n spawnApprovalRunner(approvalId, runtimeOptions as HumanInLoopRuntimeOptions);\n\n return pending;\n }\n\n const provider = resolveProvider(runtimeOptions);\n const result = await provider.requestApproval({\n message,\n declineInputPrompt: node.humanInLoop.declineInputPrompt,\n });\n\n if (result.outcome === \"declined\") {\n throw new ApprovalDeclinedError({\n reason: result.reason,\n commandPath,\n });\n }\n\n return node.handler(ctx);\n}\n", "import type { Task } from \"@poe-code/task-list\";\nimport { S } from \"toolcraft-schema\";\nimport type { CommandNode, Group, RenderPrimitives } from \"../index.js\";\nimport { UserError, defineCommand, defineGroup } from \"../index.js\";\nimport { ensureApprovalList } from \"./approval-tasks.js\";\nimport { runApproval } from \"./runner.js\";\nimport type { HumanInLoopRuntimeOptions } from \"./types.js\";\n\nconst approvalsGroupSymbol = Symbol(\"toolcraft.humanInLoop.approvalsBuiltIn\");\n\ninterface ApprovalBuiltInServices {\n runtimeOptions: HumanInLoopRuntimeOptions;\n root: CommandNode<any>;\n}\n\nconst listScope = [\"cli\", \"mcp\", \"sdk\"] as const;\nconst runScope = [\"cli\"] as const;\nconst listParams = S.Object({\n state: S.Optional(S.String()),\n});\nconst showParams = S.Object({\n approvalId: S.String(),\n});\n\nexport const approvalsGroup = markApprovalsBuiltIn(\n defineGroup<ApprovalBuiltInServices>({\n name: \"approvals\",\n description: \"Inspect and execute queued approvals.\",\n children: [\n defineCommand<\n ApprovalBuiltInServices,\n \"list\",\n typeof listParams,\n undefined,\n Task[],\n typeof listScope\n >({\n name: \"list\",\n description: \"List queued approvals.\",\n scope: listScope as unknown as [\"cli\", \"mcp\", \"sdk\"],\n params: listParams,\n handler: async ({ params, runtimeOptions }) => {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n return loadApprovals(tasks, params.state);\n },\n render: {\n rich: (result, primitives) => renderApprovalList(result, primitives),\n markdown: (result) => renderApprovalListMarkdown(result),\n json: (result) => result,\n },\n }),\n defineCommand<\n ApprovalBuiltInServices,\n \"show\",\n typeof showParams,\n undefined,\n Task,\n typeof listScope\n >({\n name: \"show\",\n description: \"Show one approval.\",\n scope: listScope as unknown as [\"cli\", \"mcp\", \"sdk\"],\n params: showParams,\n handler: async ({ params, runtimeOptions }) => {\n const { tasks } = await ensureApprovalList(runtimeOptions);\n return tasks.get(params.approvalId);\n },\n render: {\n rich: (result, primitives) => renderApprovalDetails(result, primitives),\n markdown: (result) => renderApprovalDetailsMarkdown(result),\n json: (result) => result,\n },\n }),\n defineCommand<\n ApprovalBuiltInServices,\n \"run\",\n typeof showParams,\n undefined,\n void,\n typeof runScope\n >({\n name: \"run\",\n description: \"Run one queued approval.\",\n scope: runScope as unknown as [\"cli\"],\n params: showParams,\n handler: async ({ params, runtimeOptions, root }) => runApproval(params.approvalId, runtimeOptions, root),\n }),\n ],\n })\n);\n\nexport function mergeApprovalsGroup<TServices extends object>(root: Group<TServices>): Group<TServices> {\n const existing = root.children.find((child) => child.name === approvalsGroup.name);\n\n if (existing !== undefined) {\n if (isApprovalsBuiltIn(existing)) {\n return root;\n }\n\n throw new UserError(\"Error: 'approvals' is reserved for human-in-loop built-ins\");\n }\n\n root.children = [...root.children, approvalsGroup as unknown as CommandNode<TServices>];\n return root;\n}\n\nfunction markApprovalsBuiltIn<TGroup extends Group<any>>(group: TGroup): TGroup {\n Object.defineProperty(group, approvalsGroupSymbol, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return group;\n}\n\nfunction isApprovalsBuiltIn(node: CommandNode<any>): boolean {\n return node.kind === \"group\" && (node as Group<any> & { [approvalsGroupSymbol]?: true })[approvalsGroupSymbol] === true;\n}\n\nasync function loadApprovals(tasks: Awaited<ReturnType<typeof ensureApprovalList>>[\"tasks\"], stateFilter?: string): Promise<Task[]> {\n const states = splitStateFilter(stateFilter);\n\n if (states.length === 0) {\n return tasks.all();\n }\n\n const seenIds = new Set<string>();\n const approvals: Task[] = [];\n\n for (const state of states) {\n const matching = await tasks.all({\n state,\n });\n\n for (const task of matching) {\n if (seenIds.has(task.qualifiedId)) {\n continue;\n }\n\n seenIds.add(task.qualifiedId);\n approvals.push(task);\n }\n }\n\n return approvals;\n}\n\nfunction splitStateFilter(stateFilter: string | undefined): string[] {\n if (stateFilter === undefined) {\n return [];\n }\n\n const seen = new Set<string>();\n const states: string[] = [];\n\n for (const value of stateFilter.split(\",\")) {\n const trimmed = value.trim();\n\n if (trimmed.length === 0 || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n states.push(trimmed);\n }\n\n return states;\n}\n\nfunction renderApprovalList(result: Task[], { logger, renderTable, getTheme }: RenderPrimitives): void {\n if (result.length === 0) {\n logger.message(\"No approvals found.\");\n return;\n }\n\n logger.message(\n renderTable({\n theme: getTheme(),\n columns: [\n { name: \"id\", title: \"ID\", alignment: \"left\", maxLen: 24 },\n { name: \"state\", title: \"State\", alignment: \"left\", maxLen: 18 },\n { name: \"name\", title: \"Name\", alignment: \"left\", maxLen: 60 },\n ],\n rows: result.map((task) => ({\n id: task.id,\n state: task.state,\n name: task.name,\n })),\n })\n );\n}\n\nfunction renderApprovalListMarkdown(result: Task[]): string {\n if (result.length === 0) {\n return \"No approvals found.\";\n }\n\n const lines = [\"| ID | State | Name |\", \"| :--- | :--- | :--- |\"];\n\n for (const task of result) {\n lines.push(`| ${escapeMarkdownCell(task.id)} | ${escapeMarkdownCell(task.state)} | ${escapeMarkdownCell(task.name)} |`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderApprovalDetails(result: Task, { logger, renderTable, getTheme }: RenderPrimitives): void {\n logger.message(\n renderTable({\n theme: getTheme(),\n columns: [\n { name: \"key\", title: \"Key\", alignment: \"left\", maxLen: 18 },\n { name: \"value\", title: \"Value\", alignment: \"left\", maxLen: 80 },\n ],\n rows: Object.entries(taskToRecord(result)).map(([key, value]) => ({\n key,\n value: stringifyValue(value),\n })),\n })\n );\n}\n\nfunction renderApprovalDetailsMarkdown(result: Task): string {\n return Object.entries(taskToRecord(result))\n .map(([key, value]) => `- ${key}: ${stringifyValue(value)}`)\n .join(\"\\n\");\n}\n\nfunction taskToRecord(task: Task): Record<string, unknown> {\n return {\n list: task.list,\n id: task.id,\n qualifiedId: task.qualifiedId,\n name: task.name,\n state: task.state,\n description: task.description,\n metadata: task.metadata,\n };\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 try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction escapeMarkdownCell(value: string): string {\n return value.replaceAll(\"|\", \"\\\\|\");\n}\n", "import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createLogger } from \"@poe-code/design-system\";\nimport type { McpServerConfig } from \"@poe-code/agent-mcp-config\";\nimport { HttpTransport, McpClient, StdioTransport } from \"tiny-mcp-client\";\nimport type { Tool } from \"tiny-mcp-client\";\nimport type { Command, Group, Scope } from \"./index.js\";\nimport { convertJsonSchema } from \"./json-schema-converter.js\";\nimport type { ObjectSchema } from \"toolcraft-schema\";\n\nconst GROUP_CONFIG_SYMBOL_DESCRIPTION = \"toolcraft.group.config\";\nconst MCP_PROXY_SCHEMA_URL =\n \"https://poe-platform.github.io/poe-code/schemas/toolcraft/mcp-proxy.schema.json\";\nconst DEFAULT_CLIENT_INFO = {\n name: \"toolcraft\",\n version: \"0.0.1\",\n} as const;\nconst proxyNodeSymbol = Symbol(\"toolcraft.mcpProxyNode\");\nconst proxyConnectionSymbol = Symbol(\"toolcraft.mcpProxyConnection\");\nconst shutdownDisposers = new Set<() => Promise<void>>();\n\ninterface InternalGroupConfig<TServices extends object = Record<string, never>> {\n mcp?: McpServerConfig;\n tools?: string[];\n rename?: Record<string, string>;\n children?: Array<Command<TServices, any, any, any> | Group<TServices>>;\n}\n\ninterface HotProxyConnection {\n client?: McpClient;\n connecting?: Promise<McpClient>;\n config: McpServerConfig;\n dispose: () => Promise<void>;\n name: string;\n}\n\ninterface McpProxyCache {\n $schema: string;\n fetchedAt: string;\n tools: Tool[];\n upstream: {\n name: string;\n version: string;\n };\n version: 1;\n}\n\nexport interface ResolveMcpProxyOptions {\n projectRoot?: string;\n}\n\ntype GroupChild<TServices extends object = Record<string, never>> =\n | Command<TServices, any, any, any>\n | Group<TServices>;\n\nfunction getInternalGroupConfig<TServices extends object>(\n group: Group<TServices>\n): InternalGroupConfig<TServices> {\n const symbol = Object.getOwnPropertySymbols(group).find(\n (candidate) => candidate.description === GROUP_CONFIG_SYMBOL_DESCRIPTION\n );\n\n if (symbol === undefined) {\n return {};\n }\n\n return (((group as unknown) as Record<PropertyKey, unknown>)[symbol] ??\n {}) as InternalGroupConfig<TServices>;\n}\n\nfunction isProxyNode(node: GroupChild<any>): boolean {\n return (node as GroupChild<any> & { [proxyNodeSymbol]?: true })[proxyNodeSymbol] === true;\n}\n\nfunction markProxyNode<TNode extends GroupChild<any>>(node: TNode): TNode {\n Object.defineProperty(node, proxyNodeSymbol, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return node;\n}\n\nfunction cloneSecrets(secrets: Record<string, { env: string; description?: string; optional?: boolean }>) {\n return { ...secrets };\n}\n\nfunction cloneScope(scope: Scope[] | undefined): Scope[] | undefined {\n return scope === undefined ? undefined : [...scope];\n}\n\nfunction registerShutdownDispose(dispose: () => Promise<void>): void {\n shutdownDisposers.add(dispose);\n}\n\nfunction getProxyConnection(group: Group<any>): HotProxyConnection | undefined {\n return (group as Group<any> & {\n [proxyConnectionSymbol]?: HotProxyConnection;\n })[proxyConnectionSymbol];\n}\n\nfunction setProxyConnection(\n group: Group<any>,\n connection: HotProxyConnection | undefined\n): void {\n (group as Group<any> & {\n [proxyConnectionSymbol]?: HotProxyConnection;\n })[proxyConnectionSymbol] = connection;\n}\n\nfunction createProxyGroup(\n parent: Group<any>,\n name: string\n): Group<any> {\n return markProxyNode<Group<any>>({\n kind: \"group\",\n name,\n description: undefined,\n aliases: [],\n scope: cloneScope(parent.scope),\n secrets: cloneSecrets(parent.secrets),\n requires: parent.requires,\n children: [],\n default: undefined,\n });\n}\n\nfunction createProxyCommand(\n parent: Group<any>,\n tool: Tool,\n commandName: string,\n connection: HotProxyConnection\n): Command<any, ObjectSchema<any>, undefined, unknown> {\n const params = convertJsonSchema(tool.inputSchema as Parameters<typeof convertJsonSchema>[0]);\n\n if (params.kind !== \"object\") {\n throw new Error(`upstream tool \"${tool.name}\" must define an object input schema`);\n }\n\n return markProxyNode({\n kind: \"command\",\n name: commandName,\n description: tool.description,\n aliases: [],\n positional: [],\n params,\n secrets: cloneSecrets(parent.secrets),\n scope: cloneScope(parent.scope) ?? ([\"cli\", \"sdk\"] satisfies Scope[]),\n confirm: false,\n requires: parent.requires,\n handler: async (ctx) => {\n const client = await ensureConnected(connection);\n return client.callTool({\n name: tool.name,\n arguments: ctx.params as Record<string, unknown>,\n });\n },\n render: undefined,\n });\n}\n\nfunction removeProxyChildren(group: Group<any>): void {\n group.children = group.children.filter((child) => !isProxyNode(child));\n\n for (const child of group.children) {\n if (child.kind === \"group\") {\n removeProxyChildren(child);\n }\n }\n}\n\nfunction findChild(group: Group<any>, name: string): GroupChild<any> | undefined {\n return group.children.find((child) => child.name === name);\n}\n\nfunction filterAllowlistedTools(tools: Tool[], allowlist: string[] | undefined): Tool[] {\n if (allowlist === undefined) {\n return tools;\n }\n\n const allowedNames = new Set(allowlist);\n return tools.filter((tool) => allowedNames.has(tool.name));\n}\n\nfunction validateRenameMap(name: string, tools: Tool[], rename: Record<string, string> | undefined): void {\n if (rename === undefined) {\n return;\n }\n\n const toolNames = new Set(tools.map((tool) => tool.name));\n\n for (const upstreamToolName of Object.keys(rename)) {\n if (!toolNames.has(upstreamToolName)) {\n throw new Error(\n `couldn't discover MCP ${name}: rename references unknown upstream tool \"${upstreamToolName}\"`\n );\n }\n }\n}\n\nfunction createConnection(name: string, config: McpServerConfig): HotProxyConnection {\n const connection: HotProxyConnection = {\n name,\n config,\n async dispose(): Promise<void> {\n shutdownDisposers.delete(connection.dispose);\n connection.connecting = undefined;\n\n if (connection.client === undefined) {\n return;\n }\n\n const client = connection.client;\n connection.client = undefined;\n await client.close();\n },\n };\n\n registerShutdownDispose(connection.dispose);\n return connection;\n}\n\nasync function ensureConnected(connection: HotProxyConnection): Promise<McpClient> {\n if (connection.client !== undefined && connection.client.state === \"ready\") {\n return connection.client;\n }\n\n if (connection.connecting !== undefined) {\n return connection.connecting;\n }\n\n connection.connecting = dialUpstream(connection.name, connection.config)\n .then((client) => {\n connection.client = client;\n return client;\n })\n .finally(() => {\n connection.connecting = undefined;\n });\n\n return connection.connecting;\n}\n\nasync function readCache(cachePath: string): Promise<McpProxyCache | undefined> {\n try {\n const raw = await readFile(cachePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<McpProxyCache>;\n\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n !Array.isArray(parsed.tools) ||\n parsed.upstream === undefined ||\n typeof parsed.upstream.name !== \"string\" ||\n typeof parsed.upstream.version !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n $schema: typeof parsed.$schema === \"string\" ? parsed.$schema : MCP_PROXY_SCHEMA_URL,\n fetchedAt: typeof parsed.fetchedAt === \"string\" ? parsed.fetchedAt : new Date(0).toISOString(),\n tools: parsed.tools,\n upstream: parsed.upstream,\n version: parsed.version === 1 ? 1 : 1,\n };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code === \"ENOENT\" || error instanceof SyntaxError) {\n return undefined;\n }\n\n return undefined;\n }\n}\n\nasync function writeCache(cachePath: string, cache: McpProxyCache): Promise<void> {\n const directory = path.dirname(cachePath);\n const tempPath = `${cachePath}.tmp`;\n\n await mkdir(directory, { recursive: true });\n await writeFile(tempPath, `${JSON.stringify(cache, null, 2)}\\n`);\n await rename(tempPath, cachePath);\n}\n\nasync function fetchCache(\n name: string,\n config: McpServerConfig,\n cachePath: string\n): Promise<McpProxyCache> {\n const logger = createLogger((message) => {\n process.stderr.write(`${message}\\n`);\n });\n logger.info(`MCP ${name}: connecting`);\n const client = await dialUpstream(name, config);\n\n try {\n logger.info(`MCP ${name}: listing tools`);\n\n const tools: Tool[] = [];\n let cursor: string | undefined;\n\n do {\n const page = await client.listTools(cursor === undefined ? {} : { cursor });\n tools.push(...page.tools);\n cursor = page.nextCursor;\n } while (cursor !== undefined);\n\n logger.info(`MCP ${name}: found ${tools.length} tools`);\n\n const upstream = client.serverInfo ?? {\n name,\n version: \"unknown\",\n };\n const cache: McpProxyCache = {\n $schema: MCP_PROXY_SCHEMA_URL,\n version: 1,\n upstream,\n fetchedAt: new Date().toISOString(),\n tools,\n };\n\n await writeCache(cachePath, cache);\n logger.info(`MCP ${name}: wrote ${cachePath}`);\n\n return cache;\n } finally {\n await client.close();\n }\n}\n\nasync function deleteCacheIfPresent(cachePath: string): Promise<void> {\n try {\n await unlink(cachePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nfunction populateGroupFromTools(\n group: Group<any>,\n tools: Tool[],\n rename: Record<string, string> | undefined,\n connection: HotProxyConnection\n): void {\n removeProxyChildren(group);\n\n for (const tool of tools) {\n const targetPath = rename?.[tool.name] ?? tool.name;\n const segments =\n rename !== undefined && Object.prototype.hasOwnProperty.call(rename, tool.name)\n ? targetPath.split(\".\")\n : [tool.name];\n const commandName = segments[segments.length - 1];\n\n if (commandName === undefined || commandName.length === 0) {\n throw new Error(`command path \"${targetPath}\" collides with an existing child`);\n }\n\n let parent = group;\n\n for (const segment of segments.slice(0, -1)) {\n const existing = findChild(parent, segment);\n\n if (existing === undefined) {\n const created = createProxyGroup(parent, segment);\n parent.children.push(created);\n parent = created;\n continue;\n }\n\n if (existing.kind !== \"group\") {\n throw new Error(`command path \"${targetPath}\" collides with an existing child`);\n }\n\n parent = existing;\n }\n\n if (findChild(parent, commandName) !== undefined) {\n throw new Error(`command path \"${targetPath}\" collides with an existing child`);\n }\n\n parent.children.push(createProxyCommand(parent, tool, commandName, connection));\n }\n}\n\nfunction isRefreshRequested(name: string, refresh: \"all\" | Set<string> | undefined): boolean {\n if (refresh === \"all\") {\n return true;\n }\n\n return refresh?.has(name) === true;\n}\n\nasync function resolveSingleProxy(\n group: Group<any>,\n options: ResolveMcpProxyOptions\n): Promise<void> {\n const internal = getInternalGroupConfig(group);\n const config = internal.mcp;\n\n if (config === undefined) {\n return;\n }\n\n const name = group.name;\n\n try {\n const cachePath = resolveCachePath(name, options.projectRoot);\n const refresh = parseRefreshEnv(process.env.TOOLCRAFT_MCP_REFRESH);\n let cache: McpProxyCache;\n\n if (isRefreshRequested(name, refresh)) {\n await deleteCacheIfPresent(cachePath);\n cache = await fetchCache(name, config, cachePath);\n } else {\n cache = (await readCache(cachePath)) ?? (await fetchCache(name, config, cachePath));\n }\n\n const tools = filterAllowlistedTools(cache.tools, internal.tools);\n\n validateRenameMap(name, tools, internal.rename);\n const previousConnection = getProxyConnection(group);\n const nextConnection = createConnection(name, config);\n\n try {\n populateGroupFromTools(group, tools, internal.rename, nextConnection);\n setProxyConnection(group, nextConnection);\n } catch (error) {\n await nextConnection.dispose();\n throw error;\n }\n\n if (previousConnection !== undefined && previousConnection !== nextConnection) {\n await previousConnection.dispose();\n }\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(`couldn't discover MCP ${name}:`)) {\n throw error;\n }\n\n throw new Error(\n `couldn't discover MCP ${name}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction collectProxyGroups(root: Group<any>): Group<any>[] {\n const groups: Group<any>[] = [];\n\n function visit(group: Group<any>): void {\n if (getInternalGroupConfig(group).mcp !== undefined) {\n groups.push(group);\n }\n\n for (const child of group.children) {\n if (child.kind === \"group\") {\n visit(child);\n }\n }\n }\n\n visit(root);\n return groups;\n}\n\nexport function hasMcpProxyGroups(root: Group<any>): boolean {\n return collectProxyGroups(root).length > 0;\n}\n\nexport function resolveCachePath(name: string, projectRoot?: string): string {\n if (projectRoot !== undefined) {\n return path.join(projectRoot, \".toolcraft\", \"mcp\", `${name}.json`);\n }\n\n let current = process.cwd();\n\n while (true) {\n if (existsSync(path.join(current, \"package.json\"))) {\n return path.join(current, \".toolcraft\", \"mcp\", `${name}.json`);\n }\n\n const parent = path.dirname(current);\n\n if (parent === current) {\n throw new Error(\n `Could not find package.json above \"${process.cwd()}\" while resolving MCP cache path.`\n );\n }\n\n current = parent;\n }\n}\n\nexport function parseRefreshEnv(\n value: string | undefined\n): \"all\" | Set<string> | undefined {\n const trimmed = value?.trim();\n\n if (trimmed === undefined || trimmed.length === 0) {\n return undefined;\n }\n\n if (trimmed === \"1\" || trimmed === \"true\") {\n return \"all\";\n }\n\n const names = trimmed\n .split(\",\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n\n return names.length === 0 ? undefined : new Set(names);\n}\n\nexport async function dialUpstream(\n name: string,\n config: McpServerConfig\n): Promise<McpClient> {\n const client = new McpClient({\n clientInfo: {\n name: `${DEFAULT_CLIENT_INFO.name}-${name}`,\n version: DEFAULT_CLIENT_INFO.version,\n },\n });\n const transport =\n config.transport === \"stdio\"\n ? new StdioTransport({\n command: config.command,\n ...(config.args === undefined ? {} : { args: config.args }),\n ...(config.env === undefined ? {} : { env: config.env }),\n })\n : new HttpTransport({\n url: config.url,\n ...(config.headers === undefined ? {} : { headers: config.headers }),\n });\n\n await client.connect(transport);\n return client;\n}\n\nexport async function resolveMcpProxies(\n root: Group<any>,\n options: ResolveMcpProxyOptions = {}\n): Promise<void> {\n const groups = collectProxyGroups(root);\n await Promise.all(groups.map((group) => resolveSingleProxy(group, options)));\n}\n", "import { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n} from \"../../mcp-oauth/dist/index.js\";\nimport type { Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"../../mcp-oauth/dist/index.js\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"../../mcp-oauth/dist/index.js\";\n\nexport type RequestId = number | string;\n\nexport interface Implementation {\n name: string;\n version: string;\n}\n\nexport interface ClientCapabilities {\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: () => Root[] | Promise<Root[]>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities;\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo;\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport): Promise<InitializeResult> {\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n const transportClosedReason = transport.closed\n .then((closedEvent) => closedEvent.reason)\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n 30_000,\n transportClosedReason\n );\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params) =>\n onSamplingRequest(params as CreateMessageParams)\n );\n }\n\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async () => ({\n roots: await onRootsList(),\n }));\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async () => {\n if (onToolsChanged === undefined) {\n return;\n }\n\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async () => {\n if (onResourcesChanged === undefined) {\n return;\n }\n\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\") {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async () => {\n if (onPromptsChanged === undefined) {\n return;\n }\n\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (!isRequestId(progressToken) || typeof progress !== \"number\") {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n const initializeResult = (await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n })) as InitializeResult;\n\n if (initializeResult.protocolVersion !== MCP_PROTOCOL_VERSION) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n\n this.currentServerCapabilities = initializeResult.capabilities;\n this.currentServerInfo = initializeResult.serverInfo;\n this.currentInstructions = initializeResult.instructions;\n messageLayer.sendNotification(\"notifications/initialized\");\n this.currentState = \"ready\";\n\n return initializeResult;\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}): Promise<{ tools: Tool[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"tools/list\", requestParams)) as {\n tools: Tool[];\n nextCursor?: string;\n };\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n let requestId: RequestId | undefined;\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n }) as Promise<CallToolResult>;\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n if (requestId !== undefined) {\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}\n ): Promise<{ resources: Resource[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"resources/list\", requestParams)) as {\n resources: Resource[];\n nextCursor?: string;\n };\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}\n ): Promise<{ resourceTemplates: ResourceTemplate[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"resources/templates/list\", requestParams)) as {\n resourceTemplates: ResourceTemplate[];\n nextCursor?: string;\n };\n }\n\n async readResource(params: ReadResourceParams): Promise<{ contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n return (await messageLayer.sendRequest(\"resources/read\", params)) as {\n contents: ResourceContents[];\n };\n }\n\n async subscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri });\n }\n\n async unsubscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri });\n }\n\n async listPrompts(params: PaginatedParams = {}): Promise<{ prompts: Prompt[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n return (await messageLayer.sendRequest(\"prompts/get\", params)) as GetPromptResult;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n return (await messageLayer.sendRequest(\"completion/complete\", params)) as CompleteResult;\n }\n\n async setLogLevel(level: LogLevel): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level });\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(\"ping\");\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n annotations?: ToolAnnotations;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface PaginatedResult {\n nextCursor?: string;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string;\n blob: string;\n}\n\nexport type ResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: ResourceContents;\n}\n\nexport type ContentItem = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\nexport interface Prompt {\n name: string;\n description?: string;\n arguments?: PromptArgument[];\n}\n\nexport interface PromptArgument {\n name: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface Root {\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem | ContentItem[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n model: string;\n content: ContentItem | ContentItem[];\n role: \"user\" | \"assistant\";\n stopReason: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n dispose(reason?: Error): void;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n url: string;\n headers?: HeadersInit;\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n child.stderr.on(\"data\", (chunk: unknown) => {\n this.stderrOutput += chunkToString(chunk);\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly url: string;\n private readonly headers: HeadersInit;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly openSseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n\n constructor({\n url,\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n }: HttpTransportOptions) {\n this.url = url;\n this.headers = headers;\n this.fetchImpl = fetchImpl;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.abortInFlightFetches();\n this.cancelOpenSseReaders();\n this.terminateSession();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason });\n }\n\n private abortInFlightFetches(): void {\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort();\n }\n\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenSseReaders(): void {\n for (const reader of this.openSseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openSseReaders.clear();\n }\n\n private async fetchWithAbort(input: string | URL, init: RequestInit): Promise<Response> {\n const abortController = new AbortController();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await this.fetchImpl(input, {\n ...init,\n signal: abortController.signal,\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const hasSessionId = this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n method: \"POST\",\n createHeaders: () => this.createPostHeaders(),\n body: line,\n });\n\n if (hasSessionId && response.status === 404) {\n this.sessionId = undefined;\n this.dispose(new Error(\"HTTP transport session expired (404 response)\"));\n return;\n }\n\n await this.throwForPostHttpError(response);\n this.captureSessionId(response);\n this.maybeOpenGetSseStream();\n await this.forwardResponseMessages(response);\n }\n }\n\n private async createPostHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createGetHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n if (this.lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", this.lastEventId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createDeleteHeaders(sessionId: string): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n return this.authorizeRequestHeaders(headers);\n }\n\n private async authorizeRequestHeaders(headers: Headers): Promise<Headers> {\n await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers,\n fetch: this.fetchImpl,\n });\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private terminateSession(): void {\n if (this.sessionId === undefined) {\n return;\n }\n\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n\n this.sendSessionTerminationRequest(sessionId).catch(() => undefined);\n }\n\n private async sendSessionTerminationRequest(sessionId: string): Promise<void> {\n const response = await this.fetchImpl(this.url, {\n method: \"DELETE\",\n headers: await this.createDeleteHeaders(sessionId),\n });\n\n if (response.status === 405) {\n return;\n }\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: () => this.createGetHeaders(),\n });\n\n if (response.status === 405) {\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n if (contentType.toLowerCase().includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n }\n }\n\n private async throwForPostHttpError(response: Response): Promise<void> {\n if (response.status < 400) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, {\n resourceMetadataUrl,\n });\n const result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url),\n response: response.clone(),\n challenge,\n discovery,\n fetch: this.fetchImpl,\n });\n\n if (result.action === \"retry\") {\n return true;\n }\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n return false;\n }\n\n private async forwardResponseMessages(response: Response): Promise<void> {\n if (response.status === 202) {\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n const normalizedContentType = contentType.toLowerCase();\n if (normalizedContentType.includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n return;\n }\n\n if (normalizedContentType.includes(\"application/json\")) {\n await this.forwardJsonResponseMessage(response);\n }\n }\n\n private async forwardSseResponseMessages(response: Response): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser();\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n this.openSseReaders.add(reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages);\n this.lastEventId = parser.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk));\n this.lastEventId = parser.lastEventId;\n }\n\n this.writeSseMessages(parser.flush());\n this.lastEventId = parser.lastEventId;\n } finally {\n this.openSseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(response: Response): Promise<void> {\n const payload = await response.text();\n if (payload.length === 0) {\n return;\n }\n\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[]): void {\n for (const message of messages) {\n this.writeReadableLine(message.data);\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n method: \"GET\" | \"POST\";\n createHeaders: () => Promise<Headers>;\n body?: BodyInit;\n }): Promise<Response> {\n const request = async (): Promise<Response> =>\n this.fetchWithAbort(this.url, {\n method: input.method,\n headers: await input.createHeaders(),\n body: input.body,\n });\n\n let response = await request();\n if (await this.maybeHandleUnauthorizedResponse(response)) {\n response = await request();\n }\n\n const oauthError = this.oauthProvider === undefined\n ? null\n : this.readOAuthChallengeError(response);\n if (oauthError !== null) {\n throw oauthError;\n }\n\n return response;\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return String(chunk);\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer += chunkToString(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n}\n\nexport class SseParser {\n private buffer = \"\";\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n\n while (true) {\n const newlineIndex = this.buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = normalizeLine(this.buffer.slice(0, newlineIndex));\n this.buffer = this.buffer.slice(newlineIndex + 1);\n this.consumeLine(line, messages);\n }\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n const messages: ParsedSseMessage[] = [];\n\n if (this.buffer.length > 0) {\n this.consumeLine(normalizeLine(this.buffer), messages);\n this.buffer = \"\";\n }\n\n this.emitEvent(messages);\n return messages;\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || eventType !== \"message\") {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n }\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\ninterface ActiveIncomingRequest {\n cancelled: boolean;\n}\n\nexport interface JsonRpcRequestOptions {\n timeoutMs?: number;\n onRequestId?: (requestId: RequestId) => void;\n}\n\ninterface JsonRpcRequestContext {\n id: RequestId;\n method: string;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: JsonRpcRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>\n ) {\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\n }\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(): Promise<Error> {\n const streamClosedError = new Error(\"JSON-RPC input stream closed\");\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n clearTimeout(pending.timeout);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n const activeRequest: ActiveIncomingRequest = {\n cancelled: false,\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.cancelled = true;\n this.activeIncomingRequests.delete(requestId);\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (typeof value.code !== \"number\" || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { createSecretStore, } from \"auth-store\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\nexport function createAuthStoreSessionStore(options = {}) {\n return {\n async load(resource) {\n const store = createResourceSecretStore(resource, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n const parsed = JSON.parse(value);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed;\n }\n throw new Error(\"Stored OAuth session must be a JSON object\");\n },\n async save(resource, session) {\n const store = createResourceSecretStore(resource, options);\n await store.set(JSON.stringify(session));\n },\n async clear(resource) {\n const store = createResourceSecretStore(resource, options);\n await store.delete();\n },\n };\n}\nexport function createAuthStoreClientStore(options) {\n return {\n async load(issuer) {\n const store = createIssuerSecretStore(issuer, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n const parsed = JSON.parse(value);\n if (typeof parsed === \"object\"\n && parsed !== null\n && !Array.isArray(parsed)\n && typeof parsed.clientId === \"string\") {\n return parsed;\n }\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer, client) {\n const store = createIssuerSecretStore(issuer, options);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer) {\n const store = createIssuerSecretStore(issuer, options);\n await store.delete();\n },\n };\n}\nfunction createNamedSecretStore(key, options, defaults) {\n const hash = crypto.createHash(\"sha256\").update(key).digest(\"hex\");\n const parsedFilePath = options.fileStore?.filePath === undefined ? null : path.parse(options.fileStore.filePath);\n const fileStore = {\n ...options.fileStore,\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory: parsedFilePath?.dir ||\n options.fileStore?.defaultDirectory ||\n defaults.directory,\n defaultFileName: parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`,\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`,\n };\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\nfunction createResourceSecretStore(resource, options) {\n return createNamedSecretStore(canonicalizeResourceIndicator(resource), options, {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\",\n });\n}\nfunction createIssuerSecretStore(issuer, options) {\n return createNamedSecretStore(issuer, options, {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\",\n });\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport type { SecretStore } from \"./types.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n this.filePath = input.filePath ?? path.join(\n (input.getHomeDirectory ?? homedir)(),\n input.defaultDirectory ?? \".auth-store\",\n input.defaultFileName ?? \"credentials.enc\"\n );\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async get(): Promise<string | null> {\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n return null;\n }\n }\n\n async set(value: string): Promise<void> {\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.fs.writeFile(this.filePath, JSON.stringify(document), {\n encoding: \"utf8\"\n });\n await this.fs.chmod(this.filePath, ENCRYPTION_FILE_MODE);\n }\n\n async delete(): Promise<void> {\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n this.keyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt);\n }\n return this.keyPromise;\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = `${secret}:${salt}`;\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise;\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n if (parsed.version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof parsed.iv !== \"string\" ||\n typeof parsed.authTag !== \"string\" ||\n typeof parsed.ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version: parsed.version,\n iv: parsed.iv,\n authTag: parsed.authTag,\n ciphertext: parsed.ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n );\n}\n", "import { spawn } from \"node:child_process\";\nimport type { SecretStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[]\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service;\n this.account = input.account;\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (result.exitCode === 0) {\n return stripTrailingLineBreak(result.stdout);\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async set(value: string): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-w\",\n value,\n \"-U\"\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (result.exitCode !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (result.exitCode === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string\n ): Promise<KeychainCommandResult> {\n try {\n return await this.runCommand(SECURITY_CLI, args);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[]\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n if (result.exitCode === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE) {\n return true;\n }\n\n const output = `${result.stderr}\\n${result.stdout}`.toLowerCase();\n\n return (\n output.includes(\"could not be found\") ||\n output.includes(\"item not found\") ||\n output.includes(\"errsecitemnotfound\")\n );\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const details = result.stderr.trim() || result.stdout.trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${result.exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${result.exitCode}`);\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\nfunction resolveBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? input.env?.[envVar] ?? process.env[envVar];\n\n if (configuredBackend === \"keychain\") {\n return \"keychain\";\n }\n\n return \"file\";\n}\n", "export function canonicalizeResourceIndicator(value) {\n let url;\n try {\n url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n }\n catch {\n throw new Error(\"Resource indicator must be an absolute URL\");\n }\n url.hash = \"\";\n return url.toString();\n}\n", "import { URL } from \"node:url\";\nimport { createAuthStoreClientStore, createAuthStoreSessionStore, } from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport { exchangeAuthorizationCode, OAuthError, refreshAccessToken, isRetryableOAuthError, readOAuthJsonObjectResponse, } from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nexport function createOAuthClientProvider(options) {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n return createDefaultOAuthClientProvider(options);\n}\nexport function createDefaultOAuthClientProvider(options) {\n const sessionStore = options.sessionStore ?? createAuthStoreSessionStore(options.authStore);\n const clientStore = options.authStore === undefined ? null : createAuthStoreClientStore(options.authStore);\n const now = options.now ?? Date.now;\n const sessions = new Map();\n const registeredClients = new Map();\n const refreshPromises = new Map();\n const authorizationPromises = new Map();\n return {\n async authorizeRequest(input) {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false);\n const accessToken = session?.tokens?.accessToken;\n if (session === null || accessToken === undefined) {\n return;\n }\n assertRequestMatchesResource(requestUrl, session.resource);\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n },\n async handleUnauthorized(input) {\n try {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const forceRefresh = hasCachedAccessToken(await loadSession(resource))\n && input.challenge?.params.error === \"invalid_token\";\n const session = await ensureAuthorizedSession(resource, {\n ...input.discovery,\n resource,\n }, input.fetch, true, forceRefresh);\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" };\n }\n return { action: \"retry\" };\n }\n catch (error) {\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n };\n async function ensureAuthorizedSession(resource, discovery, fetch, allowInteractive, forceRefresh = false) {\n const canonicalResource = canonicalizeResourceIndicator(resource);\n let session = await loadSession(canonicalResource);\n const sessionDiscovery = resolveDiscovery(discovery, session);\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n if (session?.tokens?.refreshToken !== undefined\n && sessionDiscovery !== undefined\n && (forceRefresh || isExpired(session.tokens, now))) {\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n if (forceRefresh && session?.tokens !== undefined) {\n return session;\n }\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch);\n }\n async function refreshSession(resource, session, discovery, fetch) {\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n const inFlight = refreshPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n const promise = (async () => {\n try {\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n let refreshAttempted = false;\n let refreshedTokens;\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: discovery.authorizationServerMetadata.token_endpoint,\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch,\n now,\n });\n break;\n }\n catch (error) {\n if (error instanceof OAuthError && error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n if (shouldReRegisterStoredDynamicClient(error, await loadRegisteredClient(discovery.authorizationServer), false)) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n throw error;\n }\n }\n const updatedSession = {\n ...session,\n tokens: refreshedTokens,\n discovery: toStoredDiscovery(discovery),\n };\n await saveSession(resource, updatedSession);\n return updatedSession;\n }\n finally {\n refreshPromises.delete(resource);\n }\n })();\n refreshPromises.set(resource, promise);\n return promise;\n }\n async function authorizeSession(resource, existingSession, discovery, fetch) {\n const inFlight = authorizationPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n const promise = (async () => {\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n openBrowser: options.browser.openBrowser,\n readLine: options.browser.readLine,\n createServer: options.browser.createServer,\n landingPage: options.browser.landingPage,\n });\n let resolvedClient = null;\n try {\n resolvedClient = await resolveClient(currentSession, discovery, loopback.redirectUri, fetch);\n const sessionWithoutTokens = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n discovery: toStoredDiscovery(discovery),\n };\n await saveSession(resource, sessionWithoutTokens);\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata: getClientMetadata(options.client),\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: discovery.authorizationServerMetadata.token_endpoint,\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch,\n now,\n });\n const session = {\n ...sessionWithoutTokens,\n tokens,\n };\n await saveSession(resource, session);\n return session;\n }\n catch (error) {\n if (shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n throw error;\n }\n finally {\n loopback.close();\n }\n }\n })();\n const finalPromise = promise.finally(() => {\n authorizationPromises.delete(resource);\n });\n authorizationPromises.set(resource, finalPromise);\n return finalPromise;\n }\n async function resolveClient(existingSession, discovery, redirectUri, fetch) {\n if (options.client.mode === \"static\") {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: {\n clientId: options.client.clientId,\n clientSecret: options.client.clientSecret,\n },\n };\n }\n const registrationEndpoint = discovery.authorizationServerMetadata.registration_endpoint;\n if (registrationEndpoint === undefined && options.client.clientId !== undefined) {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: {\n clientId: options.client.clientId,\n clientSecret: options.client.clientSecret,\n },\n };\n }\n const storedClient = await loadRegisteredClient(discovery.authorizationServer);\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient,\n };\n }\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client,\n };\n }\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n const isConfiguredStaticFallback = options.client.clientId !== undefined\n && existingSession.client.clientId === options.client.clientId\n && existingSession.client.clientSecret === options.client.clientSecret;\n if (!isConfiguredStaticFallback) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client,\n };\n }\n }\n const registrationBody = buildClientRegistrationBody(getClientMetadata(options.client), redirectUri);\n const response = await fetch(registrationEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(registrationBody),\n });\n const payload = await readOAuthJsonObjectResponse(response);\n if (typeof payload.client_id !== \"string\" ||\n payload.client_id.length === 0) {\n throw new Error(\"OAuth client registration response missing client_id\");\n }\n const registeredClient = {\n clientId: payload.client_id,\n clientSecret: typeof payload.client_secret === \"string\" && payload.client_secret.length > 0\n ? payload.client_secret\n : undefined,\n };\n await saveRegisteredClient(discovery.authorizationServer, registeredClient);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: registeredClient,\n };\n }\n async function loadSession(resource) {\n if (sessions.has(resource)) {\n return sessions.get(resource) ?? null;\n }\n const session = await sessionStore.load(resource);\n sessions.set(resource, session);\n return session;\n }\n async function saveSession(resource, session) {\n sessions.set(resource, session);\n await sessionStore.save(resource, session);\n }\n async function clearSession(resource) {\n sessions.delete(resource);\n await sessionStore.clear(resource);\n }\n async function loadRegisteredClient(issuer) {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n if (clientStore === null) {\n return null;\n }\n const client = await clientStore.load(issuer);\n registeredClients.set(issuer, client);\n return client;\n }\n async function saveRegisteredClient(issuer, client) {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n async function clearRegisteredClient(issuer) {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\nfunction isProviderOptions(options) {\n return \"provider\" in options;\n}\nfunction isExpired(tokens, now) {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\nfunction resolveDiscovery(discovery, session) {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource),\n };\n }\n if (session === null) {\n return undefined;\n }\n const metadata = session.discovery.authorizationServerMetadata;\n if (typeof metadata.issuer !== \"string\" ||\n typeof metadata.authorization_endpoint !== \"string\" ||\n typeof metadata.token_endpoint !== \"string\" ||\n !Array.isArray(metadata.code_challenge_methods_supported) ||\n !metadata.code_challenge_methods_supported.includes(\"S256\")) {\n return undefined;\n }\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery.resourceMetadata,\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata,\n };\n}\nfunction clearSessionTokens(session) {\n const nextSession = { ...session };\n delete nextSession.tokens;\n return nextSession;\n}\nfunction hasCachedAccessToken(session) {\n return session?.tokens?.accessToken !== undefined;\n}\nfunction getClientMetadata(client) {\n return client.metadata;\n}\nfunction buildAuthorizationUrl(input) {\n const url = new URL(input.metadata.authorization_endpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer: input.metadata.issuer,\n requireIssuer: input.metadata.authorization_response_iss_parameter_supported === true,\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n return url.toString();\n}\nfunction assertS256PkceSupport(metadata) {\n if (!metadata.code_challenge_methods_supported.includes(\"S256\")) {\n throw new Error(\"Authorization server metadata must advertise code_challenge_methods_supported including S256\");\n }\n}\nfunction normalizeHostname(hostname) {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\nfunction isLoopbackHostname(hostname) {\n const normalizedHostname = normalizeHostname(hostname);\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\nfunction assertSecureUrl(value, label) {\n const url = new URL(value);\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\nfunction assertSecureOAuthFlowEndpoints(metadata) {\n assertNoAccessTokenInUrl(metadata.authorization_endpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(metadata.token_endpoint, \"Token endpoint\");\n assertSecureUrl(metadata.authorization_endpoint, \"Authorization endpoint\");\n assertSecureUrl(metadata.token_endpoint, \"Token endpoint\");\n if (metadata.registration_endpoint !== undefined) {\n assertNoAccessTokenInUrl(metadata.registration_endpoint, \"Registration endpoint\");\n assertSecureUrl(metadata.registration_endpoint, \"Registration endpoint\");\n }\n}\nfunction assertNoAccessTokenInUrl(value, label) {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\nfunction assertRequestMatchesResource(requestUrl, resource) {\n if (requestUrl !== resource) {\n throw new Error(`OAuth request URL ${requestUrl} does not match discovered resource ${resource}`);\n }\n}\nfunction buildClientRegistrationBody(metadata, redirectUri) {\n const body = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n };\n if (metadata?.clientName !== undefined && metadata.clientName.length > 0) {\n body.client_name = metadata.clientName;\n }\n if (metadata?.scope !== undefined && metadata.scope.length > 0) {\n body.scope = metadata.scope;\n }\n if (metadata?.softwareId !== undefined && metadata.softwareId.length > 0) {\n body.software_id = metadata.softwareId;\n }\n if (metadata?.softwareVersion !== undefined && metadata.softwareVersion.length > 0) {\n body.software_version = metadata.softwareVersion;\n }\n return body;\n}\nfunction toStoredDiscovery(discovery) {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata,\n };\n}\nfunction shouldReRegisterStoredDynamicClient(error, client, alreadyAttempted) {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n if (client === null) {\n return false;\n }\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n return true;\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\nexport async function createLoopbackAuthorizationSession(options = {}) {\n const callbackPath = options.callbackPath ?? \"/callback\";\n const server = options.createServer ? options.createServer() : http.createServer();\n const port = await startServer(server);\n const redirectUri = `http://127.0.0.1:${port}${callbackPath}`;\n return {\n redirectUri,\n async waitForCode(authorizationUrl) {\n return waitForAuthorizationCode(server, authorizationUrl, options, callbackPath);\n },\n close() {\n server.closeAllConnections?.();\n server.close();\n },\n };\n}\nasync function startServer(server) {\n return new Promise((resolve) => {\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n resolve(address.port);\n });\n });\n}\nfunction waitForAuthorizationCode(server, authorizationUrl, options, callbackPath) {\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n return new Promise((resolve, reject) => {\n let settled = false;\n const settle = (fn) => {\n if (!settled) {\n settled = true;\n fn();\n }\n };\n server.on(\"request\", (req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== callbackPath) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n const error = url.searchParams.get(\"error\");\n if (error !== null) {\n const description = url.searchParams.get(\"error_description\") ?? error;\n res.writeHead(400);\n res.end(`Authorization failed: ${description}`);\n settle(() => reject(new Error(`OAuth authorization failed: ${error} \u2014 ${description}`)));\n return;\n }\n try {\n const code = validateAuthorizationCallbackParameters({\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\"),\n }, expectedAuthorization);\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n }\n catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n });\n if (options.readLine !== undefined) {\n options.readLine().then((input) => {\n const callbackParameters = extractCallbackParametersFromInput(input);\n if (callbackParameters === null) {\n settle(() => reject(new Error(\"OAuth callback missing authorization code\")));\n return;\n }\n try {\n const code = validateAuthorizationCallbackParameters(callbackParameters, expectedAuthorization);\n settle(() => resolve(code));\n }\n catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n }).catch(() => undefined);\n }\n if (options.openBrowser !== undefined) {\n options.openBrowser(authorizationUrl).catch((error) => {\n settle(() => reject(error));\n });\n }\n });\n}\nexport function extractCodeFromInput(input) {\n return extractCallbackParametersFromInput(input)?.code ?? null;\n}\nfunction extractCallbackParametersFromInput(input) {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\"),\n };\n }\n catch {\n return {\n code: trimmed,\n state: null,\n iss: null,\n };\n }\n}\nfunction readExpectedAuthorizationCallback(authorizationUrl) {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false,\n };\n}\nfunction validateAuthorizationCallbackParameters(callback, expected) {\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n if (callback.iss !== null\n && callback.iss.length > 0\n && expected.issuer !== null\n && callback.iss !== expected.issuer) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n return callback.code;\n}\nfunction escapeHtml(text) {\n return text\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll(\"\\\"\", \"&quot;\");\n}\nexport function buildSuccessPage(landingPage) {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n \"<body style=\\\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\\\">\",\n \"<div style=\\\"text-align:center\\\">\",\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\",\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\nexport function createAuthorizationState(input) {\n const payload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\nexport function parseAuthorizationState(value) {\n if (value === null || value.length === 0) {\n return null;\n }\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded);\n if (parsed.v !== 1\n || typeof parsed.n !== \"string\"\n || parsed.n.length === 0\n || typeof parsed.i !== \"string\"\n || parsed.i.length === 0\n || typeof parsed.r !== \"boolean\") {\n return null;\n }\n return {\n issuer: parsed.i,\n requireIssuer: parsed.r,\n };\n }\n catch {\n return null;\n }\n}\n", "import crypto from \"node:crypto\";\nexport function generateCodeVerifier() {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\nexport function generateCodeChallenge(verifier) {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "import { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nexport class OAuthError extends Error {\n error;\n errorDescription;\n errorUri;\n error_description;\n error_uri;\n status;\n retryable;\n terminal;\n constructor(shape, status) {\n super(shape.error_description ?? shape.error);\n this.name = \"OAuthError\";\n this.error = shape.error;\n this.errorDescription = shape.error_description;\n this.errorUri = shape.error_uri;\n this.error_description = shape.error_description;\n this.error_uri = shape.error_uri;\n this.status = status;\n this.retryable = isRetryableOAuthError(this);\n this.terminal = !this.retryable;\n }\n}\nexport function isRetryableOAuthError(error) {\n return (error instanceof OAuthError\n && (error.status >= 500\n || error.error === \"server_error\"\n || error.error === \"temporarily_unavailable\"));\n}\nexport async function exchangeAuthorizationCode(input) {\n const resource = canonicalizeResourceIndicator(input.resource);\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n resource,\n },\n fetch: input.fetch,\n now: input.now,\n });\n}\nexport async function refreshAccessToken(input) {\n const resource = canonicalizeResourceIndicator(input.resource);\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"refresh_token\",\n refresh_token: input.refreshToken,\n resource,\n },\n fetch: input.fetch,\n now: input.now,\n });\n}\nasync function requestTokens(input) {\n const body = new URLSearchParams({\n client_id: input.clientId,\n ...input.params,\n });\n if (input.clientSecret !== undefined) {\n body.set(\"client_secret\", input.clientSecret);\n }\n const response = await input.fetch(input.tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: body.toString(),\n });\n const payload = await readOAuthJsonObjectResponse(response);\n if (typeof payload.access_token !== \"string\" || payload.access_token.length === 0) {\n throw new Error(\"OAuth token response missing access_token\");\n }\n const tokenType = normalizeBearerTokenType(payload.token_type);\n if (tokenType === null) {\n throw new Error(\"OAuth token response missing token_type=Bearer\");\n }\n return {\n accessToken: payload.access_token,\n refreshToken: typeof payload.refresh_token === \"string\" && payload.refresh_token.length > 0\n ? payload.refresh_token\n : undefined,\n tokenType,\n expiresAt: typeof payload.expires_in === \"number\" && Number.isFinite(payload.expires_in)\n ? input.now() + (payload.expires_in * 1000)\n : null,\n scope: typeof payload.scope === \"string\" && payload.scope.length > 0\n ? payload.scope\n : undefined,\n };\n}\nexport async function readOAuthJsonObjectResponse(response) {\n const fallbackError = createFallbackOAuthError(response.status);\n let payload;\n try {\n payload = await response.json();\n }\n catch {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n const record = payload;\n if (!response.ok) {\n throw new OAuthError(readOAuthError(record, fallbackError.error), response.status);\n }\n return record;\n}\nfunction readOAuthError(payload, fallbackError = \"server_error\") {\n return {\n error: typeof payload.error === \"string\" ? payload.error : fallbackError,\n error_description: typeof payload.error_description === \"string\"\n ? payload.error_description\n : undefined,\n error_uri: typeof payload.error_uri === \"string\"\n ? payload.error_uri\n : undefined,\n };\n}\nfunction createFallbackOAuthError(status) {\n const error = status === 503 ? \"temporarily_unavailable\" : \"server_error\";\n return new OAuthError({ error }, status);\n}\nfunction normalizeBearerTokenType(value) {\n if (typeof value !== \"string\") {\n return null;\n }\n return value.toLowerCase() === \"bearer\" ? \"Bearer\" : null;\n}\n", "import { decodeProtectedHeader, errors, importJWK, jwtVerify, } from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\",\n];\nfunction isTokenVerificationErrorShape(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const challengeError = error;\n return challengeError.error === \"invalid_token\"\n || challengeError.error === \"insufficient_scope\";\n}\nfunction isObjectRecord(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isStringArray(value) {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\nfunction toUrl(value, label) {\n try {\n return new URL(String(value));\n }\n catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\nfunction normalizeAudience(value) {\n if (typeof value === \"string\") {\n return [value];\n }\n return isStringArray(value) ? [...value] : [];\n}\nfunction normalizeVerifiedAudience(value, expectedResource) {\n const audiences = normalizeAudience(value);\n if (audiences.length !== 1) {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n let normalizedAudience;\n try {\n normalizedAudience = canonicalizeResourceIndicator(audiences[0] ?? \"\");\n }\n catch {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n if (normalizedAudience !== expectedResource) {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n return [normalizedAudience];\n}\nfunction parseScopes(payload) {\n const raw = typeof payload.scope === \"string\"\n ? payload.scope\n : typeof payload.scopes === \"string\"\n ? payload.scopes\n : null;\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n return isStringArray(payload.scopes) ? [...payload.scopes] : [];\n}\nfunction toVerifiedAccessToken(token, payload, audience = normalizeAudience(payload.aud)) {\n return {\n token,\n issuer: typeof payload.iss === \"string\" ? payload.iss : \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: typeof payload.exp === \"number\" ? payload.exp : 0,\n claims: { ...payload },\n ...(typeof payload.sub === \"string\"\n ? {\n subject: payload.sub,\n }\n : {}),\n ...(typeof payload.client_id === \"string\"\n ? {\n clientId: payload.client_id,\n }\n : {}),\n };\n}\nfunction createTokenVerificationError(input) {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\nfunction createInvalidTokenError(errorDescription) {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription,\n });\n}\nfunction normalizeVerificationError(error) {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n if (error.claim === \"exp\") {\n return createInvalidTokenError(\"token expired\");\n }\n }\n if (error instanceof errors.JOSEAlgNotAllowed\n || error instanceof errors.JOSENotSupported) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n if (error instanceof errors.JWKSNoMatchingKey\n || error instanceof errors.JWKSMultipleMatchingKeys\n || error instanceof errors.JWSSignatureVerificationFailed) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n if (error instanceof errors.JWKSInvalid) {\n return createInvalidTokenError(\"invalid JWKS document\");\n }\n if (error instanceof errors.JWKSTimeout) {\n return createInvalidTokenError(\"timed out loading JWKS\");\n }\n if (error instanceof Error) {\n return createInvalidTokenError(error.message);\n }\n return createInvalidTokenError(\"token verification failed\");\n}\nasync function loadJwks(jwksUrl, fetchImplementation) {\n const response = await fetchImplementation(jwksUrl, {\n headers: {\n Accept: \"application/json\",\n },\n });\n if (!response.ok) {\n throw createInvalidTokenError(`unable to load JWKS (${response.status})`);\n }\n const payload = (await response.json());\n if (!isObjectRecord(payload) || !Array.isArray(payload.keys)) {\n throw createInvalidTokenError(\"invalid JWKS document\");\n }\n return payload;\n}\nfunction resolveAlgorithm(token, allowedAlgorithms) {\n const header = decodeProtectedHeader(token);\n const alg = header.alg;\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n if (typeof alg !== \"string\"\n || alg === \"none\"\n || alg.startsWith(\"HS\")\n || !allowedAlgorithms.includes(alg)) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n return alg;\n}\nfunction hasCriticalHeaderClaims(header) {\n return Array.isArray(header.crit) && header.crit.length > 0;\n}\nfunction isVerificationCandidate(key, alg, kid) {\n if (kid !== undefined && key.kid !== kid) {\n return false;\n }\n if (typeof key.alg === \"string\" && key.alg !== alg) {\n return false;\n }\n if (typeof key.use === \"string\" && key.use !== \"sig\") {\n return false;\n }\n if (Array.isArray(key.key_ops) && !key.key_ops.includes(\"verify\")) {\n return false;\n }\n return true;\n}\nfunction shouldContinueWithNextKey(error) {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\nasync function verifyJwtAgainstJwks(input) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = typeof protectedHeader.kid === \"string\" ? protectedHeader.kid : undefined;\n const candidateKeys = input.jwks.keys.filter((key) => isVerificationCandidate(key, input.alg, kid));\n if (candidateKeys.length === 0) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n let lastSignatureError;\n for (const candidate of candidateKeys) {\n try {\n const key = await importJWK(candidate, input.alg);\n return await jwtVerify(input.token, key, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n });\n }\n catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n throw error;\n }\n }\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\nexport function createJwksTokenVerifier(options) {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n return {\n async verify(input) {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n try {\n const jwks = await loadJwks(jwksUrl, fetchImplementation);\n const verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n });\n const audience = normalizeVerifiedAudience(verified.payload.aud, expectedResource);\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n if (input.requiredScopes.length > 0\n && !accessToken.scopes.some((scope) => input.requiredScopes.includes(scope))) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes],\n });\n }\n return accessToken;\n }\n catch (error) {\n throw normalizeVerificationError(error);\n }\n },\n };\n}\n", "import type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n} from \"../../mcp-oauth/dist/index.js\";\nimport { canonicalizeResourceIndicator } from \"../../mcp-oauth/dist/index.js\";\n\nexport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n};\n\nexport interface OAuthDiscoveryCache {\n get(\n resourceUrl: string\n ): OAuthDiscoveryResult | null | undefined | Promise<OAuthDiscoveryResult | null | undefined>;\n set(resourceUrl: string, value: OAuthDiscoveryResult): void | Promise<void>;\n}\n\nexport interface OAuthMetadataDiscoveryOptions {\n fetch?: OAuthMetadataFetch;\n cache?: OAuthDiscoveryCache;\n}\n\nexport interface OAuthMetadataLookupOptions {\n resourceMetadataUrl?: string | URL;\n}\n\nfunction defaultOAuthMetadataFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\n\nfunction assertSecureUrl(url: URL, label: string): void {\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction validateProtectedResourceMetadata(\n value: unknown,\n resourceUrl: string\n): OAuthProtectedResourceMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Protected resource metadata must be a JSON object\");\n }\n\n if (typeof value.resource !== \"string\" || value.resource.length === 0) {\n throw new Error(\"Protected resource metadata must include a resource string\");\n }\n\n const normalizedResource = canonicalizeResourceIndicator(value.resource);\n\n if (normalizedResource !== resourceUrl) {\n throw new Error(\n `Protected resource metadata resource mismatch: expected ${resourceUrl}, received ${value.resource}`\n );\n }\n\n if (!isStringArray(value.authorization_servers) || value.authorization_servers.length === 0) {\n throw new Error(\n \"Protected resource metadata must include a non-empty authorization_servers array\"\n );\n }\n\n return {\n ...value,\n resource: normalizedResource,\n } as OAuthProtectedResourceMetadata;\n}\n\nfunction validateAuthorizationServerMetadata(\n value: unknown,\n issuer: string\n): OAuthAuthorizationServerMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Authorization server metadata must be a JSON object\");\n }\n\n if (typeof value.issuer !== \"string\" || value.issuer.length === 0) {\n throw new Error(\"Authorization server metadata must include issuer\");\n }\n\n if (value.issuer !== issuer) {\n throw new Error(\n `Authorization server metadata issuer mismatch: expected ${issuer}, received ${value.issuer}`\n );\n }\n\n if (\n typeof value.authorization_endpoint !== \"string\" ||\n value.authorization_endpoint.length === 0\n ) {\n throw new Error(\"Authorization server metadata must include authorization_endpoint\");\n }\n\n if (typeof value.token_endpoint !== \"string\" || value.token_endpoint.length === 0) {\n throw new Error(\"Authorization server metadata must include token_endpoint\");\n }\n\n if (\n !isStringArray(value.response_types_supported) ||\n !value.response_types_supported.includes(\"code\")\n ) {\n throw new Error(\n \"Authorization server metadata must include response_types_supported containing code\"\n );\n }\n\n if (\n !isStringArray(value.code_challenge_methods_supported) ||\n !value.code_challenge_methods_supported.includes(\"S256\")\n ) {\n throw new Error(\n \"Authorization server metadata must include code_challenge_methods_supported containing S256\"\n );\n }\n\n return value as OAuthAuthorizationServerMetadata;\n}\n\nasync function readJsonResponse(response: Response, label: string): Promise<unknown> {\n if (!response.ok) {\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n throw new Error(`${label} request failed (${statusDescriptor})`);\n }\n\n try {\n return await response.json();\n } catch {\n throw new Error(`${label} response must be valid JSON`);\n }\n}\n\nfunction resolveWellKnownMetadataUrl(inputUrl: string | URL, suffix: string): string {\n const url = new URL(typeof inputUrl === \"string\" ? inputUrl : inputUrl.toString());\n\n const resourcePath = url.pathname === \"/\" ? \"\" : url.pathname;\n url.pathname = `/.well-known/${suffix}${resourcePath}`;\n\n return url.toString();\n}\n\nexport function resolveProtectedResourceMetadataUrl(\n resourceUrl: string | URL,\n resourceMetadataUrl?: string | URL\n): string {\n const resource = new URL(canonicalizeResourceIndicator(resourceUrl));\n assertSecureUrl(resource, \"Protected resource URL\");\n\n if (resourceMetadataUrl !== undefined) {\n const resolvedResourceMetadataUrl = new URL(\n typeof resourceMetadataUrl === \"string\" ? resourceMetadataUrl : resourceMetadataUrl.toString(),\n resource\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n }\n\n const resolvedResourceMetadataUrl = new URL(\n resolveWellKnownMetadataUrl(resource, \"oauth-protected-resource\")\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n}\n\nfunction normalizeAuthorizationServerIssuer(issuer: string | URL): string {\n const input = typeof issuer === \"string\" ? issuer : issuer.toString();\n const url = new URL(input);\n if (url.search.length > 0 || url.hash.length > 0) {\n throw new Error(\"Authorization server issuer must not include query or fragment\");\n }\n\n assertSecureUrl(url, \"Authorization server issuer\");\n\n if (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) {\n url.pathname = url.pathname.slice(0, -1);\n }\n\n return url.pathname === \"/\" ? url.origin : url.toString();\n}\n\nexport function resolveAuthorizationServerMetadataUrl(issuer: string | URL): string {\n return resolveWellKnownMetadataUrl(\n normalizeAuthorizationServerIssuer(issuer),\n \"oauth-authorization-server\"\n );\n}\n\nexport class OAuthMetadataDiscovery {\n private readonly fetchImpl: OAuthMetadataFetch;\n private readonly cache: OAuthDiscoveryCache | undefined;\n private readonly memoryCache = new Map<string, OAuthDiscoveryResult>();\n\n constructor({ fetch = defaultOAuthMetadataFetch, cache }: OAuthMetadataDiscoveryOptions = {}) {\n this.fetchImpl = fetch;\n this.cache = cache;\n }\n\n async discover(\n resourceUrl: string | URL,\n { resourceMetadataUrl }: OAuthMetadataLookupOptions = {}\n ): Promise<OAuthDiscoveryResult> {\n const cacheKey = canonicalizeResourceIndicator(resourceUrl);\n const resourceMetadataLocation = resolveProtectedResourceMetadataUrl(\n cacheKey,\n resourceMetadataUrl\n );\n const memoryCachedResult = this.memoryCache.get(cacheKey);\n if (\n memoryCachedResult !== undefined &&\n (resourceMetadataUrl === undefined\n || memoryCachedResult.resourceMetadataUrl === resourceMetadataLocation)\n ) {\n return memoryCachedResult;\n }\n\n const sharedCachedResult = await this.cache?.get(cacheKey);\n if (\n sharedCachedResult !== null &&\n sharedCachedResult !== undefined &&\n (resourceMetadataUrl === undefined\n || sharedCachedResult.resourceMetadataUrl === resourceMetadataLocation)\n ) {\n this.memoryCache.set(cacheKey, sharedCachedResult);\n return sharedCachedResult;\n }\n\n const resourceMetadataResponse = await this.fetchImpl(resourceMetadataLocation, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const resourceMetadata = validateProtectedResourceMetadata(\n await readJsonResponse(resourceMetadataResponse, \"Protected resource metadata\"),\n cacheKey\n );\n\n const authorizationServerErrors: string[] = [];\n\n for (const authorizationServer of resourceMetadata.authorization_servers) {\n const normalizedAuthorizationServer = normalizeAuthorizationServerIssuer(\n authorizationServer\n );\n const authorizationServerMetadataUrl =\n resolveAuthorizationServerMetadataUrl(normalizedAuthorizationServer);\n\n try {\n const authorizationServerResponse = await this.fetchImpl(authorizationServerMetadataUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n await readJsonResponse(\n authorizationServerResponse,\n \"Authorization server metadata\"\n ),\n normalizedAuthorizationServer\n );\n\n const result: OAuthDiscoveryResult = {\n resource: resourceMetadata.resource,\n resourceMetadataUrl: resourceMetadataLocation,\n resourceMetadata,\n authorizationServer: normalizedAuthorizationServer,\n authorizationServerMetadataUrl,\n authorizationServerMetadata,\n };\n\n this.memoryCache.set(cacheKey, result);\n await this.cache?.set(cacheKey, result);\n return result;\n } catch (error) {\n authorizationServerErrors.push(\n `${authorizationServerMetadataUrl}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n throw new Error(\n `Unable to load authorization server metadata for ${cacheKey}: ${authorizationServerErrors.join(\n \"; \"\n )}`\n );\n }\n}\n\nexport async function discoverOAuthMetadata(\n resourceUrl: string | URL,\n options: OAuthMetadataDiscoveryOptions & OAuthMetadataLookupOptions = {}\n): Promise<OAuthDiscoveryResult> {\n const discovery = new OAuthMetadataDiscovery(options);\n return discovery.discover(resourceUrl, options);\n}\n\nfunction skipOptionalWhitespace(value: string, start: number): number {\n let index = start;\n while (index < value.length && (value[index] === \" \" || value[index] === \"\\t\")) {\n index += 1;\n }\n return index;\n}\n\nfunction readToken(value: string, start: number): { token: string; nextIndex: number } | null {\n let index = start;\n while (index < value.length) {\n const character = value[index];\n if (\n character === \" \"\n || character === \"\\t\"\n || character === \",\"\n || character === \"=\"\n || character === \"\\\"\"\n ) {\n break;\n }\n index += 1;\n }\n\n if (index === start) {\n return null;\n }\n\n return {\n token: value.slice(start, index),\n nextIndex: index,\n };\n}\n\nfunction looksLikeAuthParam(value: string, start: number): boolean {\n const token = readToken(value, start);\n if (token === null) {\n return false;\n }\n\n return value[skipOptionalWhitespace(value, token.nextIndex)] === \"=\";\n}\n\nfunction isToken68Character(character: string): boolean {\n return (\n (character >= \"a\" && character <= \"z\")\n || (character >= \"A\" && character <= \"Z\")\n || (character >= \"0\" && character <= \"9\")\n || character === \"-\"\n || character === \".\"\n || character === \"_\"\n || character === \"~\"\n || character === \"+\"\n || character === \"/\"\n );\n}\n\nfunction readToken68(\n value: string,\n start: number\n): { token68: string; nextIndex: number } | null {\n let nextIndex = start;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n const token68 = value.slice(start, nextIndex);\n if (token68.length === 0) {\n return null;\n }\n\n let index = 0;\n while (index < token68.length && isToken68Character(token68[index]!)) {\n index += 1;\n }\n\n if (index === 0) {\n return null;\n }\n\n while (index < token68.length && token68[index] === \"=\") {\n index += 1;\n }\n\n if (index !== token68.length) {\n return null;\n }\n\n return { token68, nextIndex };\n}\n\nfunction readQuotedString(\n value: string,\n start: number\n): { parsedValue: string; nextIndex: number } | null {\n if (value[start] !== \"\\\"\") {\n return null;\n }\n\n let parsedValue = \"\";\n let index = start + 1;\n let escaping = false;\n\n while (index < value.length) {\n const character = value[index];\n if (escaping) {\n parsedValue += character;\n escaping = false;\n index += 1;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n index += 1;\n continue;\n }\n\n if (character === \"\\\"\") {\n return {\n parsedValue,\n nextIndex: index + 1,\n };\n }\n\n parsedValue += character;\n index += 1;\n }\n\n return null;\n}\n\nfunction parseAuthParam(\n value: string,\n start: number\n): { name: string; value: string; nextIndex: number } | null {\n const token = readToken(value, start);\n if (token === null) {\n return null;\n }\n\n let index = skipOptionalWhitespace(value, token.nextIndex);\n if (value[index] !== \"=\") {\n return null;\n }\n\n index = skipOptionalWhitespace(value, index + 1);\n if (index >= value.length) {\n return null;\n }\n\n const quotedValue = readQuotedString(value, index);\n if (quotedValue !== null) {\n return {\n name: token.token,\n value: quotedValue.parsedValue,\n nextIndex: quotedValue.nextIndex,\n };\n }\n\n let nextIndex = index;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n return {\n name: token.token,\n value: value.slice(index, nextIndex),\n nextIndex,\n };\n}\n\nexport function parseBearerWwwAuthenticateHeader(\n headerValue: string | null\n): OAuthUnauthorizedChallenge | null {\n if (headerValue === null) {\n return null;\n }\n\n let index = 0;\n let firstBearerChallenge: OAuthUnauthorizedChallenge | null = null;\n\n while (index < headerValue.length) {\n index = skipOptionalWhitespace(headerValue, index);\n while (headerValue[index] === \",\") {\n index = skipOptionalWhitespace(headerValue, index + 1);\n }\n\n const scheme = readToken(headerValue, index);\n if (scheme === null) {\n break;\n }\n\n index = skipOptionalWhitespace(headerValue, scheme.nextIndex);\n const params: Record<string, string> = {};\n\n if (index < headerValue.length && headerValue[index] !== \",\") {\n const token68 = readToken68(headerValue, index);\n if (token68 !== null) {\n index = token68.nextIndex;\n } else if (looksLikeAuthParam(headerValue, index)) {\n while (index < headerValue.length) {\n const parsedParam = parseAuthParam(headerValue, index);\n if (parsedParam === null) {\n break;\n }\n\n params[parsedParam.name] = parsedParam.value;\n index = skipOptionalWhitespace(headerValue, parsedParam.nextIndex);\n\n if (headerValue[index] !== \",\") {\n break;\n }\n\n const nextIndex = skipOptionalWhitespace(headerValue, index + 1);\n if (!looksLikeAuthParam(headerValue, nextIndex)) {\n index = nextIndex;\n break;\n }\n\n index = nextIndex;\n }\n }\n }\n\n if (scheme.token.toLowerCase() === \"bearer\") {\n const challenge: OAuthUnauthorizedChallenge = {\n scheme: \"Bearer\",\n params,\n raw: headerValue,\n };\n if (Object.keys(params).length > 0) {\n return challenge;\n }\n\n firstBearerChallenge ??= challenge;\n }\n\n if (headerValue[index] === \",\") {\n index += 1;\n }\n }\n\n return firstBearerChallenge;\n}\n", "import { S } from \"toolcraft-schema\";\nimport type { AnySchema, ObjectSchema } from \"toolcraft-schema\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\" | \"null\";\ntype PrimitiveEnumValue = string | number | boolean;\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport interface JsonSchema {\n $defs?: Record<string, JsonSchema>;\n $ref?: string;\n additionalProperties?: boolean | JsonSchema;\n anyOf?: readonly JsonSchema[];\n const?: unknown;\n default?: unknown;\n description?: string;\n enum?: readonly unknown[];\n items?: JsonSchema;\n nullable?: boolean;\n oneOf?: readonly JsonSchema[];\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: readonly string[];\n type?: JsonSchemaType | readonly JsonSchemaType[];\n}\n\ninterface NormalizedJsonSchema {\n schema: JsonSchema;\n nullable: boolean;\n}\n\nexport function convertJsonSchema(schema: JsonSchema): AnySchema {\n if (hasSelfReferencingRef(schema, schema)) {\n return applyMetadata(S.Json(), schema, {\n nullable: schema.nullable === true,\n });\n }\n\n return convertSchema(schema, schema);\n}\n\nfunction convertSchema(schema: JsonSchema, root: JsonSchema): AnySchema {\n const resolvedSchema = resolveReferencedSchema(schema, root);\n const normalizedSchema = normalizeNullability(resolvedSchema);\n const composition = normalizedSchema.schema.oneOf ?? normalizedSchema.schema.anyOf;\n\n if (Array.isArray(normalizedSchema.schema.type)) {\n throw new Error(\n `Unsupported JSON Schema type array: ${JSON.stringify(normalizedSchema.schema.type)}.`\n );\n }\n\n if (resolvedSchema.const !== undefined) {\n return convertConstSchema(resolvedSchema, normalizedSchema.nullable);\n }\n\n if (resolvedSchema.enum !== undefined) {\n return convertEnumSchema(resolvedSchema, normalizedSchema.nullable);\n }\n\n if (composition !== undefined) {\n return convertCompositionSchema(normalizedSchema.schema, root, normalizedSchema.nullable);\n }\n\n if (isRecordSchema(normalizedSchema.schema)) {\n return applyMetadata(\n S.Record(convertSchema(normalizedSchema.schema.additionalProperties as JsonSchema, root)),\n normalizedSchema.schema,\n {\n nullable: normalizedSchema.nullable,\n }\n );\n }\n\n switch (normalizedSchema.schema.type) {\n case \"string\":\n return S.String({\n ...createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getStringDefault(normalizedSchema.schema.default)\n ),\n ...(normalizedSchema.schema.pattern === undefined\n ? {}\n : { pattern: normalizedSchema.schema.pattern }),\n });\n\n case \"number\":\n return S.Number(\n createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getNumberDefault(normalizedSchema.schema.default)\n )\n );\n\n case \"integer\":\n return S.Number({\n ...createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getIntegerDefault(normalizedSchema.schema.default)\n ),\n jsonType: \"integer\",\n });\n\n case \"boolean\":\n return S.Boolean(\n createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getBooleanDefault(normalizedSchema.schema.default)\n )\n );\n\n case \"array\":\n if (normalizedSchema.schema.items === undefined) {\n throw new Error('JSON Schema arrays must define \"items\".');\n }\n\n return S.Array(\n convertSchema(normalizedSchema.schema.items, root),\n createCommonOptions(\n normalizedSchema.schema,\n normalizedSchema.nullable,\n getArrayDefault(normalizedSchema.schema.default)\n )\n );\n\n case \"object\":\n return convertObjectSchema(normalizedSchema.schema, root, {\n nullable: normalizedSchema.nullable,\n });\n\n case \"null\":\n return applyMetadata(S.Json(), normalizedSchema.schema, {\n default: getJsonDefault(normalizedSchema.schema.default) ?? null,\n nullable: true,\n });\n\n case undefined:\n if (normalizedSchema.nullable) {\n return applyMetadata(S.Json(), normalizedSchema.schema, {\n nullable: true,\n });\n }\n\n throw new Error(\"Unsupported JSON Schema: missing type, enum, const, or composition.\");\n }\n\n throw new Error(`Unsupported JSON Schema type: ${JSON.stringify(normalizedSchema.schema.type)}.`);\n}\n\nfunction convertConstSchema(schema: JsonSchema, nullable: boolean): AnySchema {\n if (isPrimitiveEnumValue(schema.const)) {\n return S.Enum([schema.const] as [PrimitiveEnumValue], {\n ...createCommonOptions(schema, nullable, schema.const),\n default: schema.const,\n ...(schema.type === \"integer\" && typeof schema.const === \"number\"\n ? { jsonType: \"integer\" as const }\n : {}),\n });\n }\n\n return applyMetadata(S.Json(), schema, {\n default: schema.const as JsonValue,\n nullable: nullable || schema.const === null,\n description: appendDescription(\n schema.description,\n `Constant JSON value: ${JSON.stringify(schema.const)}.`\n ),\n });\n}\n\nfunction convertEnumSchema(schema: JsonSchema, nullable: boolean): AnySchema {\n const values = schema.enum ?? [];\n const nonNullValues = values.filter((value) => value !== null);\n const hasNull = nonNullValues.length !== values.length;\n\n if (nonNullValues.every(isPrimitiveEnumValue) && nonNullValues.length > 0) {\n return S.Enum(nonNullValues as [PrimitiveEnumValue, ...PrimitiveEnumValue[]], {\n ...createCommonOptions(\n schema,\n nullable || hasNull,\n getPrimitiveEnumDefault(schema.default, nonNullValues)\n ),\n ...(schema.type === \"integer\" && nonNullValues.every((value) => Number.isInteger(value))\n ? { jsonType: \"integer\" as const }\n : {}),\n });\n }\n\n return applyMetadata(S.Json(), schema, {\n nullable: nullable || hasNull,\n description: appendDescription(\n schema.description,\n `Allowed JSON values: ${values.map((value) => JSON.stringify(value)).join(\", \")}.`\n ),\n });\n}\n\nfunction convertCompositionSchema(\n schema: JsonSchema,\n root: JsonSchema,\n nullable: boolean\n): AnySchema {\n const branches = [...(schema.oneOf ?? schema.anyOf ?? [])].map((branch) =>\n resolveReferencedSchema(branch, root)\n );\n const discriminator = findDiscriminator(branches, root);\n\n if (discriminator !== undefined) {\n const convertedBranches = Object.fromEntries(\n branches.map((branch) => [\n getDiscriminatorLiteral(branch, discriminator, root),\n convertObjectSchema(branch, root, {\n omitProperty: discriminator,\n }),\n ])\n );\n\n return applyMetadata(\n S.OneOf({\n discriminator,\n branches: convertedBranches,\n }),\n schema,\n {\n nullable,\n }\n );\n }\n\n return applyMetadata(\n S.Union(branches.map((branch) => convertObjectSchema(branch, root, {}))),\n schema,\n {\n nullable,\n }\n );\n}\n\nfunction convertObjectSchema(\n schema: JsonSchema,\n root: JsonSchema,\n options: {\n nullable?: boolean;\n omitProperty?: string;\n }\n): ObjectSchema<any> {\n const resolvedSchema = resolveReferencedSchema(schema, root);\n const normalizedSchema = normalizeNullability(resolvedSchema);\n const properties = normalizedSchema.schema.properties ?? {};\n const requiredKeys = new Set(normalizedSchema.schema.required ?? []);\n const shape: Record<string, AnySchema> = {};\n\n if (normalizedSchema.schema.type !== \"object\" && normalizedSchema.schema.properties === undefined) {\n throw new Error(\"Expected an object schema branch.\");\n }\n\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (key === options.omitProperty) {\n continue;\n }\n\n const convertedProperty = convertSchema(propertySchema, root);\n shape[key] = requiredKeys.has(key) ? convertedProperty : S.Optional(convertedProperty);\n }\n\n return applyMetadata(\n S.Object(shape, {\n ...(typeof normalizedSchema.schema.additionalProperties === \"boolean\"\n ? { additionalProperties: normalizedSchema.schema.additionalProperties }\n : {}),\n }),\n normalizedSchema.schema,\n {\n nullable: options.nullable ?? normalizedSchema.nullable,\n }\n );\n}\n\nfunction createCommonOptions<TDefault>(\n schema: JsonSchema,\n nullable: boolean,\n defaultValue?: TDefault\n): {\n default?: TDefault;\n description?: string;\n nullable?: boolean;\n} {\n return {\n ...(schema.description === undefined ? {} : { description: schema.description }),\n ...(defaultValue === undefined ? {} : { default: defaultValue }),\n ...(nullable ? { nullable: true } : {}),\n };\n}\n\nfunction applyMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n source: JsonSchema,\n overrides: {\n default?: JsonValue;\n description?: string;\n nullable?: boolean;\n }\n): TSchema {\n const result = { ...schema } as TSchema & {\n default?: unknown;\n description?: string;\n nullable?: boolean;\n };\n const description = overrides.description ?? source.description;\n const hasDefaultOverride = Object.prototype.hasOwnProperty.call(overrides, \"default\");\n const defaultValue = hasDefaultOverride ? overrides.default : source.default;\n\n if (description !== undefined) {\n result.description = description;\n }\n\n if (defaultValue !== undefined) {\n result.default = defaultValue;\n }\n\n if (overrides.nullable === true) {\n result.nullable = true;\n }\n\n return result;\n}\n\nfunction normalizeNullability(schema: JsonSchema): NormalizedJsonSchema {\n if (!Array.isArray(schema.type)) {\n return {\n schema,\n nullable: schema.nullable === true,\n };\n }\n\n const nextTypes = schema.type.filter((value) => value !== \"null\");\n\n if (nextTypes.length === schema.type.length) {\n return {\n schema,\n nullable: schema.nullable === true,\n };\n }\n\n return {\n schema: {\n ...schema,\n type:\n nextTypes.length === 0 ? undefined : nextTypes.length === 1 ? nextTypes[0] : nextTypes,\n nullable: undefined,\n },\n nullable: true,\n };\n}\n\nfunction isRecordSchema(schema: JsonSchema): boolean {\n const propertyKeys = Object.keys(schema.properties ?? {});\n\n return (\n schema.type === \"object\" &&\n propertyKeys.length === 0 &&\n typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null\n );\n}\n\nfunction findDiscriminator(branches: JsonSchema[], root: JsonSchema): string | undefined {\n const [firstBranch] = branches;\n\n if (firstBranch === undefined) {\n throw new Error(\"JSON Schema composition requires at least one branch.\");\n }\n\n const candidateKeys = Object.keys(firstBranch.properties ?? {});\n\n for (const candidate of candidateKeys) {\n const values: string[] = [];\n let matches = true;\n\n for (const branch of branches) {\n const requiredKeys = new Set(branch.required ?? []);\n\n if (!requiredKeys.has(candidate)) {\n matches = false;\n break;\n }\n\n const literal = getDiscriminatorLiteral(branch, candidate, root);\n\n if (literal === undefined) {\n matches = false;\n break;\n }\n\n values.push(literal);\n }\n\n if (matches && new Set(values).size === values.length) {\n return candidate;\n }\n }\n\n return undefined;\n}\n\nfunction getDiscriminatorLiteral(\n branch: JsonSchema,\n key: string,\n root: JsonSchema\n): string | undefined {\n const propertySchema = branch.properties?.[key];\n\n if (propertySchema === undefined) {\n return undefined;\n }\n\n const resolvedProperty = resolveReferencedSchema(propertySchema, root);\n\n if (typeof resolvedProperty.const === \"string\") {\n return resolvedProperty.const;\n }\n\n if (\n resolvedProperty.enum !== undefined &&\n resolvedProperty.enum.length === 1 &&\n typeof resolvedProperty.enum[0] === \"string\"\n ) {\n return resolvedProperty.enum[0];\n }\n\n return undefined;\n}\n\nfunction resolveReferencedSchema(schema: JsonSchema, root: JsonSchema): JsonSchema {\n if (schema.$ref === undefined) {\n return schema;\n }\n\n const resolvedTarget = resolveLocalRef(root, schema.$ref);\n\n if (resolvedTarget === undefined) {\n throw new Error(`Unsupported JSON Schema $ref: ${JSON.stringify(schema.$ref)}.`);\n }\n\n const { $ref: ignoredRef, ...siblingKeywords } = schema;\n void ignoredRef;\n const resolvedSchema = resolveReferencedSchema(resolvedTarget, root);\n\n if (Object.keys(siblingKeywords).length === 0) {\n return resolvedSchema;\n }\n\n return mergeJsonSchemas(resolvedSchema, siblingKeywords);\n}\n\nfunction mergeJsonSchemas(base: JsonSchema, overlay: JsonSchema): JsonSchema {\n const mergedProperties =\n base.properties === undefined && overlay.properties === undefined\n ? undefined\n : {\n ...(base.properties ?? {}),\n ...(overlay.properties ?? {}),\n };\n const mergedDefs =\n base.$defs === undefined && overlay.$defs === undefined\n ? undefined\n : {\n ...(base.$defs ?? {}),\n ...(overlay.$defs ?? {}),\n };\n const mergedRequired =\n base.required === undefined && overlay.required === undefined\n ? undefined\n : [...new Set([...(base.required ?? []), ...(overlay.required ?? [])])];\n\n return {\n ...base,\n ...overlay,\n ...(mergedDefs === undefined ? {} : { $defs: mergedDefs }),\n ...(mergedProperties === undefined ? {} : { properties: mergedProperties }),\n ...(mergedRequired === undefined ? {} : { required: mergedRequired }),\n };\n}\n\nfunction hasSelfReferencingRef(\n schema: JsonSchema,\n root: JsonSchema,\n path = \"#\",\n activePaths = new Set<string>()\n): boolean {\n const nextActivePaths = new Set(activePaths);\n nextActivePaths.add(path);\n const localRefPath = getLocalRefPath(schema.$ref);\n\n if (localRefPath !== undefined) {\n if (nextActivePaths.has(localRefPath)) {\n return true;\n }\n\n const target = resolveLocalRef(root, localRefPath);\n\n if (target !== undefined && hasSelfReferencingRef(target, root, localRefPath, nextActivePaths)) {\n return true;\n }\n }\n\n if (schema.items !== undefined && hasSelfReferencingRef(schema.items, root, `${path}/items`, nextActivePaths)) {\n return true;\n }\n\n if (\n typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null &&\n hasSelfReferencingRef(\n schema.additionalProperties,\n root,\n `${path}/additionalProperties`,\n nextActivePaths\n )\n ) {\n return true;\n }\n\n for (const [key, childSchema] of Object.entries(schema.properties ?? {})) {\n if (\n hasSelfReferencingRef(\n childSchema,\n root,\n `${path}/properties/${escapeJsonPointerSegment(key)}`,\n nextActivePaths\n )\n ) {\n return true;\n }\n }\n\n for (const [key, childSchema] of Object.entries(schema.$defs ?? {})) {\n if (\n hasSelfReferencingRef(\n childSchema,\n root,\n `${path}/$defs/${escapeJsonPointerSegment(key)}`,\n nextActivePaths\n )\n ) {\n return true;\n }\n }\n\n for (const [index, childSchema] of (schema.oneOf ?? []).entries()) {\n if (hasSelfReferencingRef(childSchema, root, `${path}/oneOf/${index}`, nextActivePaths)) {\n return true;\n }\n }\n\n for (const [index, childSchema] of (schema.anyOf ?? []).entries()) {\n if (hasSelfReferencingRef(childSchema, root, `${path}/anyOf/${index}`, nextActivePaths)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getLocalRefPath(ref: string | undefined): string | undefined {\n if (ref === undefined) {\n return undefined;\n }\n\n if (ref === \"#\") {\n return \"#\";\n }\n\n return ref.startsWith(\"#/\") ? ref : undefined;\n}\n\nfunction resolveLocalRef(root: JsonSchema, ref: string): JsonSchema | undefined {\n const path = getLocalRefPath(ref);\n\n if (path === undefined) {\n return undefined;\n }\n\n if (path === \"#\") {\n return root;\n }\n\n const segments = path.slice(2).split(\"/\").map(unescapeJsonPointerSegment);\n let current: unknown = root;\n\n for (const segment of segments) {\n if (Array.isArray(current)) {\n const index = parseArrayIndex(segment);\n\n if (index === undefined) {\n return undefined;\n }\n\n current = current[index];\n continue;\n }\n\n if (!isPlainObject(current)) {\n return undefined;\n }\n\n current = current[segment];\n }\n\n return isPlainObject(current) ? (current as JsonSchema) : undefined;\n}\n\nfunction appendDescription(\n description: string | undefined,\n addition: string | undefined\n): string | undefined {\n if (addition === undefined || addition.length === 0) {\n return description;\n }\n\n if (description === undefined || description.length === 0) {\n return addition;\n }\n\n return `${description} ${addition}`;\n}\n\nfunction isPrimitiveEnumValue(value: unknown): value is PrimitiveEnumValue {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\n}\n\nfunction getStringDefault(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction getNumberDefault(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction getIntegerDefault(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isInteger(value) ? value : undefined;\n}\n\nfunction getBooleanDefault(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction getArrayDefault(value: unknown): JsonValue[] | undefined {\n return Array.isArray(value) && value.every((item) => isJsonValue(item)) ? value : undefined;\n}\n\nfunction getPrimitiveEnumDefault(\n value: unknown,\n candidates: readonly unknown[]\n): PrimitiveEnumValue | undefined {\n return isPrimitiveEnumValue(value) && candidates.includes(value) ? value : undefined;\n}\n\nfunction getJsonDefault(value: unknown): JsonValue | undefined {\n return isJsonValue(value) ? value : undefined;\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (value === null) {\n return true;\n }\n\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every((item) => isJsonValue(item));\n }\n\n if (!isPlainObject(value)) {\n return false;\n }\n\n return Object.values(value).every((item) => isJsonValue(item));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction escapeJsonPointerSegment(value: string): string {\n return value.split(\"~\").join(\"~0\").split(\"/\").join(\"~1\");\n}\n\nfunction unescapeJsonPointerSegment(value: string): string {\n return value.split(\"~1\").join(\"/\").split(\"~0\").join(\"~\");\n}\n\nfunction parseArrayIndex(value: string): number | undefined {\n if (value.length === 0) {\n return undefined;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return undefined;\n }\n }\n\n return Number.parseInt(value, 10);\n}\n", "import type { NumberSchema } from \"toolcraft-schema\";\n\nexport function isValidNumberSchemaValue(\n value: unknown,\n schema: NumberSchema\n): value is number {\n return (\n typeof value === \"number\" &&\n Number.isFinite(value) &&\n (schema.jsonType !== \"integer\" || Number.isInteger(value))\n );\n}\n\nexport function getExpectedNumberDescription(schema: NumberSchema): string {\n return schema.jsonType === \"integer\" ? \"an integer\" : \"a number\";\n}\n", "import type { Command, RenderPrimitives } from \"./index.js\";\n\nexport type OutputMode = \"rich\" | \"md\" | \"json\";\n\ntype WriteFn = (chunk: string) => void;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isArrayOfObjects(value: unknown): value is Array<Record<string, unknown>> {\n return Array.isArray(value) && value.every((entry) => isObject(entry));\n}\n\nfunction stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return stringifyJson(value);\n}\n\nfunction stringifyJson(value: unknown, spaces?: number): string {\n try {\n return JSON.stringify(\n value,\n (_key, currentValue) => (typeof currentValue === \"bigint\" ? currentValue.toString() : currentValue),\n spaces\n ) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction renderObjectTable(result: Record<string, unknown>, primitives: RenderPrimitives): string {\n const rows = Object.entries(result).map(([key, value]) => ({\n key,\n value: stringifyValue(value),\n }));\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: [\n {\n name: \"key\",\n title: \"Key\",\n alignment: \"left\",\n maxLen: Math.max(\"Key\".length, ...rows.map((row) => row.key.length)),\n },\n {\n name: \"value\",\n title: \"Value\",\n alignment: \"left\",\n maxLen: Math.max(\"Value\".length, ...rows.map((row) => row.value.length)),\n },\n ],\n rows,\n });\n}\n\nfunction renderObjectMarkdown(result: Record<string, unknown>): string {\n return Object.entries(result)\n .map(([key, value]) => `- ${key}: ${stringifyValue(value)}`)\n .join(\"\\n\");\n}\n\nfunction getColumnNames(rows: Array<Record<string, unknown>>): string[] {\n const names = new Set<string>();\n\n for (const row of rows) {\n for (const name of Object.keys(row)) {\n names.add(name);\n }\n }\n\n return [...names];\n}\n\nfunction renderArrayTable(result: Array<Record<string, unknown>>, primitives: RenderPrimitives): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n\n return primitives.renderTable({\n theme: primitives.getTheme(),\n columns: columnNames.map((name) => ({\n name,\n title: name,\n alignment: \"left\",\n maxLen: Math.max(\n name.length,\n ...result.map((row) => (name in row ? stringifyValue(row[name]).length : 0))\n ),\n })),\n rows: result.map((row) =>\n Object.fromEntries(\n columnNames.map((name) => [name, name in row ? stringifyValue(row[name]) : \"\"])\n )\n ),\n });\n}\n\nfunction renderArrayMarkdown(result: Array<Record<string, unknown>>): string {\n if (result.length === 0) {\n return \"[]\";\n }\n\n const columnNames = getColumnNames(result);\n const header = `| ${columnNames.join(\" | \")} |`;\n const separator = `| ${columnNames.map(() => \":---\").join(\" | \")} |`;\n const rows = result.map(\n (row) =>\n `| ${columnNames\n .map((name) => (name in row ? stringifyValue(row[name]).replaceAll(\"|\", \"\\\\|\") : \"\"))\n .join(\" | \")} |`\n );\n\n return [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction autoRender(result: unknown, output: OutputMode, primitives: RenderPrimitives): string {\n if (result === null || result === undefined) {\n if (output === \"json\") {\n return stringifyJson({ ok: true }, 2);\n }\n\n return \"Done.\";\n }\n\n if (typeof result === \"string\") {\n if (output === \"json\") {\n return stringifyJson({ result }, 2);\n }\n\n return result;\n }\n\n if (isObject(result)) {\n if (output === \"rich\") {\n return renderObjectTable(result, primitives);\n }\n\n if (output === \"md\") {\n return renderObjectMarkdown(result);\n }\n\n return stringifyJson(result, 2);\n }\n\n if (isArrayOfObjects(result)) {\n if (output === \"md\") {\n return renderArrayMarkdown(result);\n }\n\n if (output === \"json\") {\n return stringifyJson(result, 2);\n }\n\n return renderArrayTable(result, primitives);\n }\n\n return stringifyJson(result, 2);\n}\n\nexport function renderResult(\n command: Command<any, any, any, any>,\n result: unknown,\n output: OutputMode,\n primitives: RenderPrimitives,\n write: WriteFn = (chunk) => {\n process.stdout.write(chunk);\n }\n): void {\n if (output === \"json\" && command.render?.json) {\n const payload = command.render.json(result, primitives);\n if (payload !== undefined) {\n write(`${stringifyJson(payload, 2)}\\n`);\n }\n return;\n }\n\n if (output === \"md\" && command.render?.markdown) {\n const payload = command.render.markdown(result, primitives);\n if (typeof payload === \"string\" && payload.length > 0) {\n write(`${payload}\\n`);\n }\n return;\n }\n\n if (output === \"rich\" && command.render?.rich) {\n command.render.rich(result, primitives);\n return;\n }\n\n const payload = autoRender(result, output, primitives);\n if (payload.length > 0) {\n write(`${payload}\\n`);\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { TerminalSession } from \"./terminal-session.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\n\nexport interface NewSessionOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n}\n\nexport class TerminalPilot {\n private readonly sessionMap = new Map<string, TerminalSession>();\n\n static async launch(): Promise<TerminalPilot> {\n return new TerminalPilot();\n }\n\n async newSession(opts: NewSessionOptions): Promise<TerminalSession> {\n const session = new TerminalSession({\n id: randomUUID(),\n command: opts.command,\n args: opts.args,\n cwd: opts.cwd,\n env: opts.env,\n cols: opts.cols ?? DEFAULT_COLS,\n rows: opts.rows ?? DEFAULT_ROWS,\n observe: opts.observe ?? false\n });\n\n this.sessionMap.set(session.id, session);\n return session;\n }\n\n getSession(id: string): TerminalSession {\n const session = this.sessionMap.get(id);\n\n if (session === undefined) {\n throw new Error(`Session not found: ${id}`);\n }\n\n return session;\n }\n\n deleteSession(id: string): void {\n this.sessionMap.delete(id);\n }\n\n sessions(): TerminalSession[] {\n return [...this.sessionMap.values()].filter((s) => s.exitCode === null);\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessionMap.values()];\n\n try {\n await Promise.all(sessions.map((session) => session.close()));\n } finally {\n this.sessionMap.clear();\n }\n }\n}\n", "import { EventEmitter } from \"node:events\";\nimport { accessSync, chmodSync, constants } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport * as nodePty from \"node-pty\";\nimport { stripAnsi } from \"./ansi.js\";\nimport { TerminalBuffer } from \"./terminal-buffer.js\";\nimport { keyToSequence, type TerminalKey } from \"./keys.js\";\nimport { TerminalScreen } from \"./terminal-screen.js\";\n\nconst DEFAULT_COLS = 120;\nconst DEFAULT_ROWS = 40;\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst WAIT_FOR_POLL_MS = 10;\nconst TYPE_DELAY_MS = 15;\nconst CLOSE_AFTER_SIGNAL_GRACE_MS = 250;\nconst CLOSE_AFTER_SIGTERM_MS = 1000;\n\ntype TerminalSessionOptions = {\n id: string;\n command: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string | undefined>;\n cols?: number;\n rows?: number;\n observe?: boolean;\n};\n\nexport type WaitForOptions = {\n timeout?: number;\n};\n\nexport type HistoryOptions = {\n last?: number;\n};\n\ntype PtyLike = {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(listener: (chunk: string) => void): { dispose(): void };\n onExit(listener: (event: { exitCode: number; signal?: number }) => void): { dispose(): void };\n};\n\nexport class TerminalSession {\n readonly id: string;\n readonly command: string;\n readonly pid: number;\n exitCode: number | null = null;\n\n private readonly pty: PtyLike;\n private readonly terminal: TerminalBuffer;\n private readonly emitter = new EventEmitter();\n private readonly exitPromise: Promise<number>;\n private rawBuffer = \"\";\n private lastDataAt = Date.now();\n private currentCols: number;\n private currentRows: number;\n private closeRequested = false;\n private signalRequested = false;\n\n constructor({\n id,\n command,\n args = [],\n cwd = process.cwd(),\n env = process.env,\n cols = DEFAULT_COLS,\n rows = DEFAULT_ROWS,\n observe = false\n }: TerminalSessionOptions) {\n this.id = id;\n this.command = command;\n this.currentCols = cols;\n this.currentRows = rows;\n this.terminal = new TerminalBuffer(cols, rows);\n this.pty = createPtyProcess({ command, args, cwd, env, cols, rows });\n this.pid = this.pty.pid;\n\n const dataSubscription = this.pty.onData((chunk) => {\n this.rawBuffer += chunk;\n this.lastDataAt = Date.now();\n this.terminal.write(chunk);\n\n if (observe) {\n process.stderr.write(chunk);\n }\n });\n\n let exitSubscription: { dispose(): void } | undefined;\n\n this.exitPromise = new Promise<number>((resolve) => {\n exitSubscription = this.pty.onExit(({ exitCode }) => {\n if (this.exitCode !== null) {\n resolve(this.exitCode);\n return;\n }\n\n this.exitCode = exitCode;\n dataSubscription.dispose();\n exitSubscription?.dispose();\n this.emitter.emit(\"exit\", exitCode);\n resolve(exitCode);\n });\n });\n }\n\n async type(text: string): Promise<void> {\n for (const character of text) {\n await this.send(character);\n await sleep(TYPE_DELAY_MS);\n }\n }\n\n async fill(text: string): Promise<void> {\n await this.send(text.replace(/\\r?\\n/g, \"\\r\"));\n }\n\n async press(key: TerminalKey): Promise<void> {\n await this.send(keyToSequence(key));\n }\n\n async send(raw: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.pty.write(raw);\n }\n\n async signal(sig: string): Promise<void> {\n if (this.exitCode !== null) {\n return;\n }\n\n this.signalRequested = true;\n this.pty.kill(sig);\n }\n\n async waitFor(pattern: string | RegExp, opts?: WaitForOptions): Promise<string> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= timeout) {\n const matched = matchPattern(this.rawBuffer, pattern);\n if (matched !== null) {\n return matched;\n }\n\n await sleep(WAIT_FOR_POLL_MS);\n }\n\n throw new Error(`Timed out waiting for pattern after ${timeout}ms: ${String(pattern)}`);\n }\n\n async waitForQuiet(ms: number): Promise<void> {\n while (true) {\n const remaining = ms - (Date.now() - this.lastDataAt);\n if (remaining <= 0) {\n return;\n }\n\n await sleep(remaining);\n }\n }\n\n async screen(): Promise<TerminalScreen> {\n const rawLines: string[] = [];\n\n for (let row = 0; row < this.currentRows; row += 1) {\n rawLines.push(this.terminal.renderLine(row));\n }\n\n return new TerminalScreen({\n lines: rawLines,\n rawLines,\n cursor: {\n row: this.terminal.displayBuffer.cursorY,\n col: this.terminal.displayBuffer.cursorX\n },\n size: {\n rows: this.currentRows,\n cols: this.currentCols\n }\n });\n }\n\n async history(opts?: HistoryOptions): Promise<string[]> {\n const normalized = normalizeHistoryBuffer(stripAnsi(this.rawBuffer));\n const lines = splitHistoryLines(normalized);\n\n if (opts?.last === undefined) {\n return lines;\n }\n\n const start = Math.max(0, lines.length - opts.last);\n return lines.slice(start);\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n this.currentCols = cols;\n this.currentRows = rows;\n if (this.exitCode === null) {\n this.pty.resize(cols, rows);\n }\n this.terminal.resize(cols, rows);\n }\n\n async waitForExit(opts?: { timeout?: number }): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (opts?.timeout !== undefined) {\n const result = await waitForExit(this.exitPromise, opts.timeout);\n if (result === null) {\n throw new Error(`Timed out waiting for process to exit after ${opts.timeout}ms`);\n }\n return result;\n }\n\n return this.exitPromise;\n }\n\n async close(): Promise<number> {\n if (this.exitCode !== null) {\n return this.exitCode;\n }\n\n if (!this.closeRequested) {\n this.closeRequested = true;\n\n const gracefulExitCode = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGNAL_GRACE_MS);\n if (gracefulExitCode !== null) {\n return gracefulExitCode;\n }\n\n if (this.signalRequested) {\n return this.exitPromise;\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGTERM\");\n const afterSigterm = await waitForExit(this.exitPromise, CLOSE_AFTER_SIGTERM_MS);\n if (afterSigterm !== null) {\n return afterSigterm;\n }\n }\n\n if (this.exitCode === null) {\n this.pty.kill(\"SIGKILL\");\n }\n }\n\n return this.exitPromise;\n }\n\n on(event: \"exit\", cb: (code: number) => void): void {\n this.emitter.on(event, cb);\n }\n}\n\nfunction createPtyProcess({\n command,\n args,\n cwd,\n env,\n cols,\n rows\n}: {\n command: string;\n args: string[];\n cwd: string;\n env: Record<string, string | undefined>;\n cols: number;\n rows: number;\n}): PtyLike {\n ensureSpawnHelperExecutable();\n return nodePty.spawn(command, args, {\n cwd,\n env,\n cols,\n rows,\n encoding: \"utf8\"\n });\n}\n\nlet spawnHelperChecked = false;\n\nfunction ensureSpawnHelperExecutable(): void {\n if (spawnHelperChecked) return;\n spawnHelperChecked = true;\n\n const require = createRequire(import.meta.url);\n const nodePtyDir = dirname(require.resolve(\"node-pty\"));\n const helper = join(nodePtyDir, \"..\", \"prebuilds\", `${process.platform}-${process.arch}`, \"spawn-helper\");\n\n try {\n accessSync(helper, constants.X_OK);\n } catch (error) {\n if (isMissingFileError(error)) {\n return;\n }\n\n try {\n chmodSync(helper, 0o755);\n } catch (chmodError) {\n if (isMissingFileError(chmodError)) {\n return;\n }\n\n throw chmodError;\n }\n }\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction matchPattern(buffer: string, pattern: string | RegExp): string | null {\n const clean = normalizeHistoryBuffer(stripAnsi(buffer));\n\n for (const line of clean.split(\"\\n\")) {\n if (typeof pattern === \"string\") {\n if (line.includes(pattern)) return line;\n } else {\n const flags = removeCharacter(pattern.flags, \"g\");\n if (new RegExp(pattern.source, flags).test(line)) return line;\n }\n }\n\n return null;\n}\n\nfunction removeCharacter(input: string, charToRemove: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character !== charToRemove) {\n output += character;\n }\n }\n\n return output;\n}\n\n\nfunction splitHistoryLines(input: string): string[] {\n const lines = input.split(\"\\n\");\n\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines;\n}\n\nfunction normalizeHistoryBuffer(input: string): string {\n let output = \"\";\n\n for (const character of input) {\n if (character === \"\\r\" || character === \"\\b\") {\n continue;\n }\n\n output += character;\n }\n\n return output;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function waitForExit(exitPromise: Promise<number>, timeout: number): Promise<number | null> {\n return new Promise((resolve) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(null);\n }, timeout);\n\n void exitPromise.then((code) => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timer);\n resolve(code);\n });\n });\n}\n", "const ESC = 0x1b;\nconst BEL = 0x07;\nconst ST = 0x9c;\nconst CSI = 0x9b;\nconst OSC = 0x9d;\nconst DCS = 0x90;\nconst SOS = 0x98;\nconst PM = 0x9e;\nconst APC = 0x9f;\n\nexport function stripAnsi(input: string): string {\n let output = \"\";\n\n for (let index = 0; index < input.length; index += 1) {\n const code = input.charCodeAt(index);\n\n if (code === ESC) {\n const nextCode = input.charCodeAt(index + 1);\n\n if (nextCode === 0x5b) {\n index = consumeCsi(input, index + 2);\n continue;\n }\n\n if (nextCode === 0x5d) {\n index = consumeTerminatedString(input, index + 2, true);\n continue;\n }\n\n if (nextCode === 0x50 || nextCode === 0x58 || nextCode === 0x5e || nextCode === 0x5f) {\n index = consumeTerminatedString(input, index + 2, false);\n continue;\n }\n\n if (!Number.isNaN(nextCode)) {\n index += 1;\n }\n\n continue;\n }\n\n if (code === CSI) {\n index = consumeCsi(input, index + 1);\n continue;\n }\n\n if (code === OSC) {\n index = consumeTerminatedString(input, index + 1, true);\n continue;\n }\n\n if (code === DCS || code === SOS || code === PM || code === APC) {\n index = consumeTerminatedString(input, index + 1, false);\n continue;\n }\n\n output += input[index];\n }\n\n return output;\n}\n\nfunction consumeCsi(input: string, index: number): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return index;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n\nfunction consumeTerminatedString(\n input: string,\n index: number,\n allowBellTerminator: boolean\n): number {\n while (index < input.length) {\n const code = input.charCodeAt(index);\n\n if (code === ST || (allowBellTerminator && code === BEL)) {\n return index;\n }\n\n if (code === ESC && input.charCodeAt(index + 1) === 0x5c) {\n return index + 1;\n }\n\n index += 1;\n }\n\n return input.length;\n}\n", "type Cell = ([number, string] & { style?: string }) | null;\ntype Row = Cell[];\n\ninterface SgrStyleState {\n bold: boolean;\n dim: boolean;\n italic: boolean;\n underline: boolean;\n inverse: boolean;\n strikethrough: boolean;\n fg?: number[];\n bg?: number[];\n}\n\nconst RESET_SGR = \"\\x1b[0m\";\n\nconst enum State {\n Normal,\n Escape,\n Csi,\n Osc,\n Str,\n EscCharset,\n EscHash,\n}\n\nexport class TerminalBuffer {\n private _cols: number;\n private _rows: number;\n private _screen: Row[];\n private _cursorX = 0;\n private _cursorY = 0;\n private _savedCursor = { x: 0, y: 0 };\n private _scrollTop = 0;\n private _scrollBottom: number;\n private _state = State.Normal;\n private _csiParams = \"\";\n private _csiPrivate = \"\";\n private _autoWrap = true;\n private _style: SgrStyleState = createDefaultStyleState();\n private _styleSequence = \"\";\n\n readonly displayBuffer: {\n readonly cursorX: number;\n readonly cursorY: number;\n readonly data: Array<Row | undefined>;\n };\n\n constructor(cols: number, rows: number) {\n this._cols = cols;\n this._rows = rows;\n this._scrollBottom = rows - 1;\n this._screen = this._makeScreen(cols, rows);\n\n this.displayBuffer = Object.defineProperties(\n {} as { readonly cursorX: number; readonly cursorY: number; readonly data: Array<Row | undefined> },\n {\n cursorX: { get: () => this._cursorX, enumerable: true },\n cursorY: { get: () => this._cursorY, enumerable: true },\n data: { get: () => this._screen as Array<Row | undefined>, enumerable: true },\n }\n );\n }\n\n write(data: string): void {\n for (const ch of data) {\n this._feed(ch);\n }\n }\n\n renderLine(row: number): string {\n const cells = this._screen[row] ?? [];\n let lastVisibleCell = -1;\n\n for (let index = cells.length - 1; index >= 0; index -= 1) {\n if (cells[index] !== null) {\n lastVisibleCell = index;\n break;\n }\n }\n\n if (lastVisibleCell === -1) {\n return \"\";\n }\n\n let line = \"\";\n let activeStyle = \"\";\n\n for (let index = 0; index <= lastVisibleCell; index += 1) {\n const cell = cells[index];\n const cellStyle = cell?.style ?? \"\";\n\n if (cellStyle !== activeStyle) {\n line += cellStyle.length > 0 ? cellStyle : RESET_SGR;\n activeStyle = cellStyle;\n }\n\n line += cell?.[1] ?? \" \";\n }\n\n if (activeStyle.length > 0) {\n line += RESET_SGR;\n }\n\n return line;\n }\n\n resize(cols: number, rows: number): void {\n // Adjust row count\n while (this._screen.length < rows) {\n this._screen.push(this._makeRow(cols));\n }\n this._screen.length = rows;\n\n // Adjust col count for each row\n for (let y = 0; y < rows; y++) {\n const row = this._screen[y] ?? this._makeRow(cols);\n while (row.length < cols) row.push(null);\n row.length = cols;\n this._screen[y] = row;\n }\n\n this._cols = cols;\n this._rows = rows;\n this._scrollTop = 0;\n this._scrollBottom = rows - 1;\n this._cursorX = this._clamp(this._cursorX, 0, cols - 1);\n this._cursorY = this._clamp(this._cursorY, 0, rows - 1);\n }\n\n private _makeScreen(cols: number, rows: number): Row[] {\n return Array.from({ length: rows }, () => this._makeRow(cols));\n }\n\n private _makeRow(cols: number): Row {\n return Array(cols).fill(null) as Row;\n }\n\n private _clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private _setChar(y: number, x: number, ch: string): void {\n const row = this._screen[y];\n if (row && x >= 0 && x < this._cols) {\n const cell = [ch.charCodeAt(0), ch] as Exclude<Cell, null>;\n\n if (this._styleSequence.length > 0) {\n Object.defineProperty(cell, \"style\", {\n value: this._styleSequence,\n writable: true,\n configurable: true\n });\n }\n\n row[x] = cell;\n }\n }\n\n private _eraseLine(y: number, fromX: number, toX: number): void {\n const row = this._screen[y];\n if (!row) return;\n for (let x = fromX; x <= toX && x < this._cols; x++) {\n row[x] = null;\n }\n }\n\n private _scrollUp(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollTop, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n }\n\n private _scrollDown(count: number): void {\n for (let i = 0; i < count; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._scrollTop, 0, this._makeRow(this._cols));\n }\n }\n\n private _newline(): void {\n if (this._cursorY === this._scrollBottom) {\n this._scrollUp(1);\n } else {\n this._cursorY = Math.min(this._cursorY + 1, this._rows - 1);\n }\n }\n\n private _parseCsiParams(): number[] {\n if (!this._csiParams) return [];\n return this._csiParams.split(\";\").map((s) => (s === \"\" ? 0 : parseInt(s, 10)));\n }\n\n private _execCsi(final: string): void {\n const params = this._parseCsiParams();\n const p0 = params[0] ?? 0;\n const p1 = params[1] ?? 0;\n\n if (this._csiPrivate === \"?\") {\n if (final === \"h\" || final === \"l\") {\n if (params.includes(7)) {\n this._autoWrap = final === \"h\";\n }\n\n if (params.includes(1049)) {\n if (final === \"h\") {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n } else {\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n }\n this._resetStyle();\n }\n }\n return;\n }\n\n switch (final) {\n case \"A\": // cursor up\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"B\": // cursor down\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"C\": // cursor forward\n case \"a\":\n this._cursorX = this._clamp(this._cursorX + Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"D\": // cursor backward\n this._cursorX = this._clamp(this._cursorX - Math.max(1, p0), 0, this._cols - 1);\n break;\n case \"E\": // cursor next line\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"F\": // cursor preceding line\n this._cursorY = this._clamp(this._cursorY - Math.max(1, p0), 0, this._rows - 1);\n this._cursorX = 0;\n break;\n case \"G\": // cursor horizontal absolute\n case \"`\":\n this._cursorX = this._clamp(Math.max(1, p0) - 1, 0, this._cols - 1);\n break;\n case \"H\": // cursor position\n case \"f\":\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n this._cursorX = this._clamp(Math.max(1, p1) - 1, 0, this._cols - 1);\n break;\n case \"I\": // cursor forward tabulation\n for (let i = 0; i < Math.max(1, p0); i++) {\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n }\n break;\n case \"J\": // erase in display\n if (p0 === 0) {\n this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n for (let y = this._cursorY + 1; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n } else if (p0 === 1) {\n for (let y = 0; y < this._cursorY; y++) this._eraseLine(y, 0, this._cols - 1);\n this._eraseLine(this._cursorY, 0, this._cursorX);\n } else if (p0 === 2 || p0 === 3) {\n for (let y = 0; y < this._rows; y++) this._eraseLine(y, 0, this._cols - 1);\n }\n break;\n case \"K\": // erase in line\n if (p0 === 0) this._eraseLine(this._cursorY, this._cursorX, this._cols - 1);\n else if (p0 === 1) this._eraseLine(this._cursorY, 0, this._cursorX);\n else if (p0 === 2) this._eraseLine(this._cursorY, 0, this._cols - 1);\n break;\n case \"X\": // erase characters (ECH)\n this._eraseLine(this._cursorY, this._cursorX, this._cursorX + Math.max(1, p0) - 1);\n break;\n case \"L\": { // insert lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._scrollBottom, 1);\n this._screen.splice(this._cursorY, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"M\": { // delete lines\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._screen.splice(this._cursorY, 1);\n this._screen.splice(this._scrollBottom, 0, this._makeRow(this._cols));\n }\n break;\n }\n case \"P\": { // delete characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n row.splice(this._cursorX, n);\n while (row.length < this._cols) row.push(null);\n }\n break;\n }\n case \"@\": { // insert blank characters\n const row = this._screen[this._cursorY];\n if (row) {\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) row.splice(this._cursorX, 0, null);\n row.splice(this._cols);\n }\n break;\n }\n case \"S\": // scroll up\n this._scrollUp(Math.max(1, p0));\n break;\n case \"T\": // scroll down\n if (params.length <= 1) this._scrollDown(Math.max(1, p0));\n break;\n case \"Z\": { // cursor backward tabulation\n const n = Math.max(1, p0);\n for (let i = 0; i < n; i++) {\n this._cursorX = Math.max(0, (Math.ceil(this._cursorX / 8) - 1) * 8);\n }\n break;\n }\n case \"d\": // line position absolute\n this._cursorY = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n break;\n case \"e\": // vertical position relative\n this._cursorY = this._clamp(this._cursorY + Math.max(1, p0), 0, this._rows - 1);\n break;\n case \"r\": { // set scrolling region\n const top = this._clamp(Math.max(1, p0) - 1, 0, this._rows - 1);\n const bottom = this._clamp((p1 === 0 ? this._rows : p1) - 1, 0, this._rows - 1);\n if (top < bottom) {\n this._scrollTop = top;\n this._scrollBottom = bottom;\n }\n this._cursorX = 0;\n this._cursorY = 0;\n break;\n }\n case \"s\": // save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n break;\n case \"u\": // restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n break;\n case \"m\":\n this._applySgr(params);\n break;\n default:\n break;\n }\n }\n\n private _feed(ch: string): void {\n const code = ch.charCodeAt(0);\n\n switch (this._state) {\n case State.Normal:\n this._feedNormal(ch, code);\n break;\n case State.Escape:\n this._feedEscape(ch, code);\n break;\n case State.Csi:\n this._feedCsi(ch, code);\n break;\n case State.Osc:\n // consume until BEL or ESC (ESC \\ = ST)\n if (code === 0x07 || code === 0x9c) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n // next char should be `\\` \u2014 just return to normal, it will be consumed\n this._state = State.Normal;\n }\n break;\n case State.Str:\n // consume until ST (0x9c) or BEL\n if (code === 0x9c || code === 0x07) {\n this._state = State.Normal;\n } else if (code === 0x1b) {\n this._state = State.Normal;\n }\n break;\n case State.EscCharset:\n // consume one character for charset designation\n this._state = State.Normal;\n break;\n case State.EscHash:\n // consume one character for line attributes\n this._state = State.Normal;\n break;\n }\n }\n\n private _feedNormal(ch: string, code: number): void {\n if (code === 0x1b) {\n this._state = State.Escape;\n } else if (code === 0x9b) {\n // C1 CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x9d) {\n // C1 OSC\n this._state = State.Osc;\n } else if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x07 || code === 0x05 || code === 0x06) {\n // BEL, ENQ, ACK \u2014 ignore\n } else if (code === 0x08) {\n // BS\n if (this._cursorX > 0) this._cursorX--;\n } else if (code === 0x7f) {\n // DEL\n if (this._cursorX > 0) {\n this._cursorX--;\n this._setChar(this._cursorY, this._cursorX, \" \");\n }\n } else if (code === 0x09) {\n // HT\n this._cursorX = Math.min(this._cols - 1, (Math.floor(this._cursorX / 8) + 1) * 8);\n } else if (code === 0x0a || code === 0x0b || code === 0x0c) {\n // LF, VT, FF\n this._newline();\n } else if (code === 0x0d) {\n // CR\n this._cursorX = 0;\n } else if (code === 0x0e || code === 0x0f) {\n // SO, SI \u2014 charset switch, ignore\n } else if (code >= 0x20 && code !== 0x7f) {\n // Printable character (including multi-byte Unicode via code points)\n this._setChar(this._cursorY, this._cursorX, ch);\n this._cursorX++;\n\n if (!this._autoWrap) {\n this._cursorX = Math.min(this._cursorX, this._cols - 1);\n return;\n }\n\n if (this._cursorX >= this._cols) {\n // Auto-wrap\n this._cursorX = 0;\n this._newline();\n }\n }\n }\n\n private _feedEscape(ch: string, code: number): void {\n this._state = State.Normal;\n\n if (code === 0x5b) {\n // ESC [ = CSI\n this._csiParams = \"\";\n this._csiPrivate = \"\";\n this._state = State.Csi;\n } else if (code === 0x5d) {\n // ESC ] = OSC\n this._state = State.Osc;\n } else if (code === 0x50 || code === 0x58 || code === 0x5e || code === 0x5f) {\n // DCS, SOS, PM, APC\n this._state = State.Str;\n } else if (code === 0x28 || code === 0x29 || code === 0x2a || code === 0x2b || code === 0x2d || code === 0x2e) {\n // ESC ( ) * + - . = charset designation (consume next char)\n this._state = State.EscCharset;\n } else if (code === 0x23) {\n // ESC # = line attributes (consume next char)\n this._state = State.EscHash;\n } else if (code === 0x37) {\n // ESC 7 = save cursor\n this._savedCursor = { x: this._cursorX, y: this._cursorY };\n } else if (code === 0x38) {\n // ESC 8 = restore cursor\n this._cursorX = this._clamp(this._savedCursor.x, 0, this._cols - 1);\n this._cursorY = this._clamp(this._savedCursor.y, 0, this._rows - 1);\n } else if (code === 0x44) {\n // ESC D = index (LF)\n this._newline();\n } else if (code === 0x45) {\n // ESC E = next line\n this._cursorX = 0;\n this._newline();\n } else if (code === 0x4d) {\n // ESC M = reverse index\n if (this._cursorY === this._scrollTop) {\n this._scrollDown(1);\n } else {\n this._cursorY = Math.max(0, this._cursorY - 1);\n }\n } else if (code === 0x48) {\n // ESC H = tab set (ignore)\n } else if (code === 0x63) {\n // ESC c = full reset\n this._screen = this._makeScreen(this._cols, this._rows);\n this._cursorX = 0;\n this._cursorY = 0;\n this._savedCursor = { x: 0, y: 0 };\n this._scrollTop = 0;\n this._scrollBottom = this._rows - 1;\n this._resetStyle();\n }\n // All other ESC sequences: two-char, already consumed \u2014 ignore\n }\n\n private _feedCsi(ch: string, code: number): void {\n if (code >= 0x40 && code <= 0x7e) {\n // Final byte\n this._execCsi(ch);\n this._state = State.Normal;\n } else if (code === 0x3f || code === 0x21 || code === 0x3e || code === 0x20) {\n // Private/intermediate marker (?, !, >, space)\n this._csiPrivate = ch;\n } else if ((code >= 0x30 && code <= 0x39) || code === 0x3b) {\n // Digit or semicolon \u2014 parameter byte\n this._csiParams += ch;\n }\n // Other bytes ignored\n }\n\n private _resetStyle(): void {\n this._style = createDefaultStyleState();\n this._styleSequence = \"\";\n }\n\n private _applySgr(params: number[]): void {\n const normalizedParams = params.length === 0 ? [0] : params;\n\n for (let index = 0; index < normalizedParams.length; index += 1) {\n const value = normalizedParams[index] ?? 0;\n\n switch (value) {\n case 0:\n this._resetStyle();\n break;\n case 1:\n this._style.bold = true;\n break;\n case 2:\n this._style.dim = true;\n break;\n case 3:\n this._style.italic = true;\n break;\n case 4:\n this._style.underline = true;\n break;\n case 7:\n this._style.inverse = true;\n break;\n case 9:\n this._style.strikethrough = true;\n break;\n case 21:\n case 22:\n this._style.bold = false;\n this._style.dim = false;\n break;\n case 23:\n this._style.italic = false;\n break;\n case 24:\n this._style.underline = false;\n break;\n case 27:\n this._style.inverse = false;\n break;\n case 29:\n this._style.strikethrough = false;\n break;\n case 39:\n this._style.fg = undefined;\n break;\n case 49:\n this._style.bg = undefined;\n break;\n case 38:\n case 48:\n index = this._applyExtendedColor(value, normalizedParams, index);\n break;\n default:\n if ((value >= 30 && value <= 37) || (value >= 90 && value <= 97)) {\n this._style.fg = [value];\n } else if ((value >= 40 && value <= 47) || (value >= 100 && value <= 107)) {\n this._style.bg = [value];\n }\n break;\n }\n }\n\n this._styleSequence = serializeStyleState(this._style);\n }\n\n private _applyExtendedColor(control: 38 | 48, params: number[], index: number): number {\n const mode = params[index + 1];\n const target = control === 38 ? \"fg\" : \"bg\";\n\n if (mode === 5) {\n const paletteIndex = params[index + 2];\n if (paletteIndex !== undefined) {\n this._style[target] = [control, 5, paletteIndex];\n return index + 2;\n }\n\n return index;\n }\n\n if (mode === 2) {\n const red = params[index + 2];\n const green = params[index + 3];\n const blue = params[index + 4];\n if (red !== undefined && green !== undefined && blue !== undefined) {\n this._style[target] = [control, 2, red, green, blue];\n return index + 4;\n }\n }\n\n return index;\n }\n}\n\nfunction createDefaultStyleState(): SgrStyleState {\n return {\n bold: false,\n dim: false,\n italic: false,\n underline: false,\n inverse: false,\n strikethrough: false\n };\n}\n\nfunction serializeStyleState(state: SgrStyleState): string {\n const codes: number[] = [];\n\n if (state.bold) {\n codes.push(1);\n }\n if (state.dim) {\n codes.push(2);\n }\n if (state.italic) {\n codes.push(3);\n }\n if (state.underline) {\n codes.push(4);\n }\n if (state.inverse) {\n codes.push(7);\n }\n if (state.strikethrough) {\n codes.push(9);\n }\n if (state.fg !== undefined) {\n codes.push(...state.fg);\n }\n if (state.bg !== undefined) {\n codes.push(...state.bg);\n }\n\n return codes.length === 0 ? \"\" : `\\x1b[${codes.join(\";\")}m`;\n}\n", "const NAMED_KEY_SEQUENCES = {\n Enter: \"\\r\",\n Tab: \"\\t\",\n Escape: \"\\x1b\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowRight: \"\\x1b[C\",\n ArrowLeft: \"\\x1b[D\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Space: \" \"\n} as const;\n\nconst NAMED_KEY_LOWER = new Map(\n (Object.entries(NAMED_KEY_SEQUENCES) as [string, string][]).map(([k, v]) => [k.toLowerCase(), v])\n);\n\nconst VALID_KEYS_HINT = `Valid keys: ${Object.keys(NAMED_KEY_SEQUENCES).join(\", \")}, Control+<letter>, Alt+<key>`;\n\nfunction unknownKeyError(key: string): Error {\n return new Error(`Unknown terminal key: ${key}. ${VALID_KEYS_HINT}`);\n}\n\nexport type TerminalKey =\n | \"Enter\"\n | \"Tab\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"ArrowUp\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Home\"\n | \"End\"\n | \"PageUp\"\n | \"PageDown\"\n | \"Space\"\n | `Control+${string}`\n | `Alt+${string}`;\n\nexport function keyToSequence(key: TerminalKey): string {\n const lowerKey = (key as string).toLowerCase();\n\n const namedSequence = NAMED_KEY_LOWER.get(lowerKey);\n if (namedSequence !== undefined) {\n return namedSequence;\n }\n\n if (lowerKey.startsWith(\"control+\")) {\n return controlKeyToSequence((key as string).slice(\"control+\".length));\n }\n\n if (lowerKey.startsWith(\"alt+\")) {\n const nestedKey = (key as string).slice(\"alt+\".length);\n if (nestedKey.length === 0) {\n throw unknownKeyError(key);\n }\n\n if (nestedKey.length === 1) {\n return \"\\x1b\" + nestedKey;\n }\n\n try {\n return \"\\x1b\" + keyToSequence(nestedKey as TerminalKey);\n } catch {\n throw unknownKeyError(key);\n }\n }\n\n if ((key as string).length === 1) {\n return key as string;\n }\n\n throw unknownKeyError(key);\n}\n\nfunction controlKeyToSequence(controlKey: string): string {\n if (controlKey.length !== 1) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n const uppercaseLetter = controlKey.toUpperCase();\n const charCode = uppercaseLetter.charCodeAt(0);\n if (charCode < 65 || charCode > 90) {\n throw unknownKeyError(`Control+${controlKey}`);\n }\n\n return String.fromCharCode(charCode - 64);\n}\n", "import { stripAnsi } from \"./ansi.js\";\n\nexport class TerminalScreen {\n readonly lines: readonly string[];\n readonly rawLines: readonly string[];\n readonly cursor: { row: number; col: number };\n readonly size: { rows: number; cols: number };\n\n constructor({\n lines,\n rawLines,\n cursor,\n size\n }: {\n lines: string[];\n rawLines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n }) {\n this.lines = Object.freeze(lines.map((line) => stripAnsi(line)));\n this.rawLines = Object.freeze([...rawLines]);\n this.cursor = Object.freeze({ ...cursor });\n this.size = Object.freeze({ ...size });\n\n Object.freeze(this);\n }\n\n get text(): string {\n return this.lines.join(\"\\n\");\n }\n\n contains(substring: string): boolean {\n return this.text.includes(substring);\n }\n\n line(index: number): string {\n const normalizedIndex = index < 0 ? this.lines.length + index : index;\n const line = this.lines[normalizedIndex];\n\n if (line === undefined) {\n throw new RangeError(`Line index out of bounds: ${index}`);\n }\n\n return line;\n }\n}\n", "import { UserError } from \"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(name: string | undefined, env?: HandlerEnv): Promise<{ exitCode: number; name: string }>;\n listSessions(): Promise<NamedSession[]>;\n close(): Promise<void>;\n}\n\nexport interface TerminalPilotCommandServices {\n terminalPilotRuntime?: TerminalPilotRuntime;\n terminalPilotInstaller?: TerminalPilotInstallerServices;\n}\n\ninterface CreateTerminalPilotRuntimeOptions {\n launchPilot?: () => Promise<ClosablePilotLike>;\n}\n\nlet sharedRuntime: TerminalPilotRuntime | undefined;\n\nexport function getTerminalPilotRuntime(\n runtime: TerminalPilotRuntime | undefined\n): TerminalPilotRuntime {\n if (runtime !== undefined) {\n return runtime;\n }\n\n sharedRuntime ??= createTerminalPilotRuntime();\n return sharedRuntime;\n}\n\nexport function createTerminalPilotRuntime(\n options: CreateTerminalPilotRuntimeOptions = {}\n): TerminalPilotRuntime {\n const launchPilot = options.launchPilot ?? TerminalPilot.launch;\n const nameToId = new Map<string, string>();\n const idToName = new Map<string, string>();\n let pilotPromise: Promise<ClosablePilotLike> | undefined;\n\n function getRequestedName(name: string | undefined, env?: HandlerEnv): string | undefined {\n return name ?? env?.get(SESSION_ENV_VAR);\n }\n\n async function getPilot(): Promise<ClosablePilotLike> {\n pilotPromise ??= launchPilot();\n return pilotPromise;\n }\n\n function nextSessionName(): string {\n let index = 1;\n\n while (nameToId.has(`s${index}`)) {\n index += 1;\n }\n\n return `s${index}`;\n }\n\n function rememberSession(name: string, session: SessionLike): NamedSession {\n nameToId.set(name, session.id);\n idToName.set(session.id, name);\n return { name, session };\n }\n\n function forgetSession(name: string, sessionId: string): void {\n nameToId.delete(name);\n idToName.delete(sessionId);\n }\n\n function formatAvailableSessions(names: string[]): string {\n if (names.length === 0) {\n return \"No active sessions are available.\";\n }\n\n return `Available sessions: ${names.join(\", \")}.`;\n }\n\n async function lookupNamedSession(name: string): Promise<NamedSession> {\n const sessionId = nameToId.get(name);\n\n if (sessionId === undefined) {\n const active = await listSessions();\n throw new UserError(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\n }\n\n const pilot = await getPilot();\n\n try {\n return { name, session: pilot.getSession(sessionId) };\n } catch {\n forgetSession(name, sessionId);\n const active = await listSessions();\n throw new UserError(`Session \"${name}\" was not found. ${formatAvailableSessions(active.map((entry) => entry.name))}`);\n }\n }\n\n async function listSessions(): Promise<NamedSession[]> {\n const pilot = await getPilot();\n\n return pilot.sessions().flatMap((session) => {\n const name = idToName.get(session.id);\n\n if (name === undefined) {\n return [];\n }\n\n return [{ name, session }];\n });\n }\n\n return {\n async createSession(params: CreateSessionParams, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(params.session, env) ?? nextSessionName();\n\n if (nameToId.has(requestedName)) {\n throw new UserError(`Session \"${requestedName}\" already exists.`);\n }\n\n const pilot = await getPilot();\n const session = await pilot.newSession({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n cols: params.cols,\n rows: params.rows,\n observe: params.observe\n });\n\n return rememberSession(requestedName, session);\n },\n\n async resolveSession(name: string | undefined, env?: HandlerEnv): Promise<NamedSession> {\n const requestedName = getRequestedName(name, env);\n\n if (requestedName !== undefined) {\n return lookupNamedSession(requestedName);\n }\n\n const active = await listSessions();\n\n if (active.length === 1) {\n return active[0] as NamedSession;\n }\n\n if (active.length === 0) {\n throw new UserError(\"No active sessions. Create one with create-session.\");\n }\n\n throw new UserError(\n `Multiple active sessions require an explicit session name. Pass --session or set ${SESSION_ENV_VAR}. ${formatAvailableSessions(active.map((entry) => entry.name))}`\n );\n },\n\n async closeSession(name: string | undefined, env?: HandlerEnv): Promise<{ exitCode: number; name: string }> {\n const namedSession = await this.resolveSession(name, env);\n const exitCode = await namedSession.session.close();\n const pilot = await getPilot();\n\n pilot.deleteSession(namedSession.session.id);\n forgetSession(namedSession.name, namedSession.session.id);\n\n return {\n exitCode,\n name: namedSession.name\n };\n },\n listSessions,\n\n async close(): Promise<void> {\n if (pilotPromise === undefined) {\n return;\n }\n\n const pilot = await pilotPromise;\n await pilot.close();\n pilotPromise = undefined;\n nameToId.clear();\n idToName.clear();\n }\n };\n}\n\nexport async function closeSharedTerminalPilotRuntime(): Promise<void> {\n if (sharedRuntime === undefined) {\n return;\n }\n\n await sharedRuntime.close();\n sharedRuntime = undefined;\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const closeSession = defineCommand<\n TerminalPilotCommandServices,\n \"close-session\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"close-session\",\n description: \"Close an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const { exitCode } = await getTerminalPilotRuntime(terminalPilotRuntime).closeSession(params.session, env);\n return { exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n command: S.String({ description: \"Command to execute\" }),\n args: S.Optional(S.Array(S.String(), { description: \"Command arguments\" })),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n cwd: S.Optional(S.String({ description: \"Working directory\" })),\n cols: S.Optional(S.Number({ description: \"Terminal width in columns\" })),\n rows: S.Optional(S.Number({ description: \"Terminal height in rows\" })),\n observe: S.Optional(S.Boolean({ description: \"Mirror PTY output to stderr\" }))\n});\n\nexport const createSession = defineCommand<\n TerminalPilotCommandServices,\n \"create-session\",\n typeof params,\n undefined,\n { session: string; pid: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"create-session\",\n description: \"Spawn an interactive CLI in a PTY\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"command\", \"args\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).createSession(params, env);\n return { session: namedSession.name, pid: namedSession.session.pid };\n }\n});\n", "import { defineCommand, S } from \"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(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const fill = defineCommand<\n TerminalPilotCommandServices,\n \"fill\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"fill\",\n description: \"Write text to an active terminal session all at once (replaces \\\\n with \\\\r)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.fill(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const getSession = defineCommand<\n TerminalPilotCommandServices,\n \"get-session\",\n typeof params,\n undefined,\n { session: string; pid: number; command: string; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"get-session\",\n description: \"Get session metadata (name, pid, command, exitCode)\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n return {\n session: namedSession.name,\n pid: namedSession.session.pid,\n command: namedSession.session.command,\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return os.homedir();\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? os.homedir() : path.join(os.homedir(), remainder);\n}\n\nexport function resolveSkillDir(config: AgentSkillConfig, scope: SkillScope, cwd: string): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import type {\n TemplateWriteMutation,\n TemplateMergeTomlMutation,\n TemplateMergeJsonMutation,\n ConfigObject,\n ValueResolver\n} from \"../types.js\";\n\nexport interface WriteOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeTomlOptions {\n /** Target TOML file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeJsonOptions {\n /** Target JSON file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction write(options: WriteOptions): TemplateWriteMutation {\n return {\n kind: \"templateWrite\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeToml(options: MergeTomlOptions): TemplateMergeTomlMutation {\n return {\n kind: \"templateMergeToml\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeJson(options: MergeJsonOptions): TemplateMergeJsonMutation {\n return {\n kind: \"templateMergeJson\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nexport const templateMutation = {\n write,\n mergeToml,\n mergeJson\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\nimport { yamlFormat } from \"./yaml.js\";\n\nexport type FormatName = \"json\" | \"toml\" | \"yaml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat,\n yaml: yamlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\nexport { yamlFormat } from \"./yaml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { TemplateLoader } from \"@poe-code/config-mutations\";\n\nconst TEMPLATE_IDS = [\"poe-generate.md\", \"terminal-pilot.md\"] as const;\ntype TemplateId = (typeof TEMPLATE_IDS)[number];\n\nconst cache = new Map<TemplateId, string>();\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await stat(target);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function findPackageRoot(entryFilePath: string): Promise<string> {\n let current = path.dirname(entryFilePath);\n while (true) {\n if (await pathExists(path.join(current, \"package.json\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(\"Unable to locate package root for agent-skill-config templates.\");\n }\n current = parent;\n }\n}\n\nasync function resolveTemplatePath(templateId: TemplateId): Promise<string> {\n const packageRoot = await findPackageRoot(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(packageRoot, \"src\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", \"skill\", templateId)\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Template not found: ${templateId}`);\n}\n\nfunction isKnownTemplate(templateId: string): templateId is TemplateId {\n return (TEMPLATE_IDS as readonly string[]).includes(templateId);\n}\n\nexport async function loadTemplate(templateId: string): Promise<string> {\n if (!isKnownTemplate(templateId)) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const cached = cache.get(templateId);\n if (cached !== undefined) {\n return cached;\n }\n\n const resolved = await resolveTemplatePath(templateId);\n const content = await readFile(resolved, \"utf8\");\n cache.set(templateId, content);\n return content;\n}\n\nexport function createTemplateLoader(): TemplateLoader {\n return loadTemplate;\n}\n", "import { fileMutation, runMutations, templateMutation } from \"@poe-code/config-mutations\";\nimport { resolveAgentSupport } from \"./configs.js\";\nimport { createTemplateLoader } from \"./templates.js\";\nimport type { ApplyOptions, SkillFile } from \"./types.js\";\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction toHomeRelative(localSkillDir: string): string {\n if (localSkillDir.startsWith(\"~/\") || localSkillDir === \"~\") {\n return localSkillDir;\n }\n\n const normalized = localSkillDir.startsWith(\"./\")\n ? localSkillDir.slice(2)\n : localSkillDir;\n\n return `~/${normalized}`;\n}\n\nconst bundledSkillTemplateIds = [\"poe-generate.md\"] as const;\n\nexport async function configure(agentId: string, options: ApplyOptions): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillDir,\n label: `Ensure directory ${skillDir}`\n }),\n ...bundledSkillTemplateIds.map((templateId) =>\n templateMutation.write({\n target: `${skillDir}/${templateId}`,\n templateId,\n label: `Write bundled skill ${templateId} to ${skillDir}`\n })\n )\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: createTemplateLoader()\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n options: ApplyOptions & { force?: boolean }\n): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.removeDirectory({\n path: skillDir,\n force: options.force,\n label: `Remove skills directory ${skillDir}`\n })\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport type InstallSkillOptions = {\n fs: ApplyOptions[\"fs\"];\n cwd: string;\n homeDir: string;\n scope: ApplyOptions[\"scope\"];\n dryRun?: boolean;\n observers?: ApplyOptions[\"observers\"];\n};\n\nexport type InstallSkillResult = {\n skillPath: string;\n displayPath: string;\n};\n\nconst SKILL_TEMPLATE_ID = \"__skill_content__\";\n\n/**\n * Install a skill for an agent.\n * Creates folder structure: skillDir/<skill.name>/SKILL.md\n */\nexport async function installSkill(\n agentId: string,\n skill: SkillFile,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"local\";\n const config = support.config!;\n\n // Use home-relative paths for mutations (same pattern as configure/unconfigure)\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const skillFolderPath = `${skillDir}/${skill.name}`;\n const skillFilePath = `${skillFolderPath}/SKILL.md`;\n const displayPath = `${scope === \"global\" ? config.globalSkillDir : config.localSkillDir}/${skill.name}/SKILL.md`;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillFolderPath,\n label: `Ensure skill directory ${skill.name}`\n }),\n templateMutation.write({\n target: skillFilePath,\n templateId: SKILL_TEMPLATE_ID,\n label: `Write skill ${skill.name}`\n })\n ],\n {\n fs: options.fs,\n homeDir: scope === \"global\" ? options.homeDir : options.cwd,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: async (templateId) => {\n if (templateId === SKILL_TEMPLATE_ID) {\n return skill.content;\n }\n throw new Error(`Unknown template: ${templateId}`);\n }\n }\n );\n\n return { skillPath: skillFilePath, displayPath };\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { readFile } from \"node:fs/promises\";\nimport { UserError } from \"toolcraft\";\nimport {\n getAgentConfig,\n resolveAgentSupport as resolveSkillAgentSupport,\n supportedAgents as skillSupportedAgents\n} from \"@poe-code/agent-skill-config\";\n\nexport type TerminalPilotInstallerFileSystem = {\n readFile(path: string, encoding: \"utf8\"): Promise<string>;\n writeFile(\n path: string,\n content: string,\n options?: { encoding: \"utf8\" }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive: boolean }): Promise<void>;\n unlink(path: string): Promise<void>;\n rm?(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n stat(path: string): Promise<{ mode?: number }>;\n readdir(path: string): Promise<string[]>;\n chmod?(path: string, mode: number): Promise<void>;\n};\n\nexport type TerminalPilotInstallScope = \"global\" | \"local\";\nexport type TerminalPilotInstallerPlatform = \"darwin\" | \"linux\" | \"win32\";\n\nexport const DEFAULT_INSTALL_AGENT = \"claude-code\";\nexport const DEFAULT_INSTALL_SCOPE: TerminalPilotInstallScope = \"local\";\nexport const TERMINAL_PILOT_SKILL_NAME = \"terminal-pilot\";\nexport const installableAgents = skillSupportedAgents;\n\nexport type TerminalPilotInstallerServices = {\n fs?: TerminalPilotInstallerFileSystem;\n cwd?: string;\n homeDir?: string;\n platform?: TerminalPilotInstallerPlatform;\n};\n\nfunction isNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nexport function resolveInstallerServices(\n installer: TerminalPilotInstallerServices | undefined\n): Required<TerminalPilotInstallerServices> {\n return {\n fs: installer?.fs ?? (nodeFs as TerminalPilotInstallerFileSystem),\n cwd: installer?.cwd ?? process.cwd(),\n homeDir: installer?.homeDir ?? os.homedir(),\n platform: installer?.platform ?? (process.platform as TerminalPilotInstallerPlatform)\n };\n}\n\nfunction throwUnsupportedAgent(agent: string): never {\n throw new UserError(`Unsupported agent: ${agent}`);\n}\n\nexport function resolveInstallableAgent(agent: string): string {\n const skillSupport = resolveSkillAgentSupport(agent);\n\n if (\n skillSupport.status !== \"supported\" ||\n !skillSupport.id\n ) {\n throwUnsupportedAgent(agent);\n }\n\n return skillSupport.id;\n}\n\nexport function resolveInstallScope(input: {\n local?: boolean;\n global?: boolean;\n}): TerminalPilotInstallScope {\n if (input.local && input.global) {\n throw new UserError(\"Use either --local or --global, not both.\");\n }\n\n if (input.local) {\n return \"local\";\n }\n\n if (input.global) {\n return \"global\";\n }\n\n return DEFAULT_INSTALL_SCOPE;\n}\n\nlet terminalPilotTemplateCache: string | undefined;\n\nexport async function loadTerminalPilotTemplate(): Promise<string> {\n if (terminalPilotTemplateCache !== undefined) {\n return terminalPilotTemplateCache;\n }\n\n const candidates = [\n new URL(\"./templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../templates/terminal-pilot.md\", import.meta.url),\n new URL(\"../../../agent-skill-config/src/templates/terminal-pilot.md\", import.meta.url)\n ];\n\n for (const candidate of candidates) {\n try {\n terminalPilotTemplateCache = await readFile(candidate, \"utf8\");\n return terminalPilotTemplateCache;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n throw new UserError(\"terminal-pilot skill template is missing.\");\n}\n\nfunction resolveHomeRelativePath(targetPath: string, homeDir: string): string {\n if (targetPath === \"~\") {\n return homeDir;\n }\n\n if (targetPath.startsWith(\"~/\")) {\n return path.join(homeDir, targetPath.slice(2));\n }\n\n return targetPath;\n}\n\nexport function getSkillFolderWithHome(\n agent: string,\n scope: TerminalPilotInstallScope,\n cwd: string,\n homeDir: string\n): {\n displayPath: string;\n fullPath: string;\n} {\n const config = getAgentConfig(agent);\n\n if (!config) {\n throwUnsupportedAgent(agent);\n }\n\n return {\n displayPath: path.join(\n scope === \"global\" ? config.globalSkillDir : config.localSkillDir,\n TERMINAL_PILOT_SKILL_NAME\n ),\n fullPath: path.join(\n scope === \"global\"\n ? resolveHomeRelativePath(config.globalSkillDir, homeDir)\n : path.resolve(cwd, config.localSkillDir),\n TERMINAL_PILOT_SKILL_NAME\n )\n };\n}\n\nexport async function removeSkillFolder(\n fs: TerminalPilotInstallerFileSystem,\n folderPath: string\n): Promise<boolean> {\n try {\n await fs.stat(folderPath);\n } catch (error) {\n if (isNotFoundError(error)) {\n return false;\n }\n throw error;\n }\n\n if (typeof fs.rm !== \"function\") {\n throw new UserError(\"The configured filesystem does not support removing directories.\");\n }\n\n await fs.rm(folderPath, { recursive: true, force: true });\n return true;\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { defineCommand, S } from \"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 { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n key: S.String({ description: \"Named key to press\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const pressKey = defineCommand<\n TerminalPilotCommandServices,\n \"press-key\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"press-key\",\n description: \"Send a named key press to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"key\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.press(params.key as never);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n last: S.Optional(S.Number({ short: \"n\", description: \"Return only the last N lines\" }))\n});\n\nexport const readHistory = defineCommand<\n TerminalPilotCommandServices,\n \"read-history\",\n typeof params,\n undefined,\n { lines: string[]; exitCode: number | null },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-history\",\n description: \"Read terminal output history\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const lines = await namedSession.session.history({ last: params.last });\n return { lines, exitCode: namedSession.session.exitCode };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\ntype ReadScreenResult = {\n lines: string[];\n cursor: { row: number; col: number };\n size: { rows: number; cols: number };\n exitCode: number | null;\n};\n\nexport const readScreen = defineCommand<\n TerminalPilotCommandServices,\n \"read-screen\",\n typeof params,\n undefined,\n ReadScreenResult,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"read-screen\",\n description: \"Read the current visible terminal screen\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n return {\n lines: [...screen.lines],\n cursor: { ...screen.cursor },\n size: { ...screen.size },\n exitCode: namedSession.session.exitCode\n };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n cols: S.Number({ description: \"Terminal width in columns\" }),\n rows: S.Number({ description: \"Terminal height in rows\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const resize = defineCommand<\n TerminalPilotCommandServices,\n \"resize\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"resize\",\n description: \"Resize an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.resize(params.cols, params.rows);\n return undefined;\n }\n});\n", "import { writeFile } from \"node:fs/promises\";\nimport { parseAnsi } from \"./ansi-parser.js\";\nimport { renderPng } from \"./png-renderer.js\";\nimport { renderSvg } from \"./svg-renderer.js\";\n\nexport interface TerminalPngOptions {\n padding?: number;\n window?: boolean;\n output?: string;\n}\n\nexport async function renderTerminalPng(\n ansiText: string,\n options: TerminalPngOptions = {}\n): Promise<Buffer> {\n const runs = parseAnsi(ansiText);\n const svg = renderSvg(runs, {\n padding: options.padding,\n window: options.window\n });\n const png = renderPng(svg);\n\n if (options.output) {\n await writeFile(options.output, png);\n }\n\n return png;\n}\n\nexport * from \"./ansi-parser.js\";\nexport * from \"./font.js\";\nexport * from \"./png-renderer.js\";\nexport * from \"./svg-renderer.js\";\n", "export type Color =\n | { type: \"ansi4\"; index: number }\n | { type: \"ansi8\"; index: number }\n | { type: \"rgb\"; r: number; g: number; b: number };\n\nexport type StyledRun = {\n text: string;\n fg: Color | null;\n bg: Color | null;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strikethrough: boolean;\n dim: boolean;\n};\n\ntype StyleState = Omit<StyledRun, \"text\">;\n\nconst ESC = \"\\u001b\";\n\nfunction createDefaultStyle(): StyleState {\n return {\n fg: null,\n bg: null,\n bold: false,\n italic: false,\n underline: false,\n strikethrough: false,\n dim: false\n };\n}\n\nfunction cloneStyle(style: StyleState): StyleState {\n return { ...style };\n}\n\nfunction stylesEqual(left: StyleState, right: StyleState): boolean {\n return (\n left.bold === right.bold &&\n left.italic === right.italic &&\n left.underline === right.underline &&\n left.strikethrough === right.strikethrough &&\n left.dim === right.dim &&\n colorsEqual(left.fg, right.fg) &&\n colorsEqual(left.bg, right.bg)\n );\n}\n\nfunction colorsEqual(left: Color | null, right: Color | null): boolean {\n if (left === right) {\n return true;\n }\n\n if (!left || !right || left.type !== right.type) {\n return false;\n }\n\n if (left.type === \"rgb\" && right.type === \"rgb\") {\n return left.r === right.r && left.g === right.g && left.b === right.b;\n }\n\n if ((left.type === \"ansi4\" || left.type === \"ansi8\") && left.type === right.type) {\n return left.index === right.index;\n }\n\n return false;\n}\n\nfunction pushRun(runs: StyledRun[], style: StyleState, text: string): void {\n if (text.length === 0) {\n return;\n }\n\n const previous = runs.at(-1);\n if (previous && text !== \"\\n\" && previous.text !== \"\\n\" && stylesEqual(previous, style)) {\n previous.text += text;\n return;\n }\n\n runs.push({\n text,\n fg: style.fg,\n bg: style.bg,\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n strikethrough: style.strikethrough,\n dim: style.dim\n });\n}\n\nfunction parseCsi(input: string, start: number): { end: number; final: string | null; params: string } {\n let index = start + 2;\n\n while (index < input.length) {\n const code = input.charCodeAt(index);\n if (code >= 0x40 && code <= 0x7e) {\n return {\n end: index + 1,\n final: input[index],\n params: input.slice(start + 2, index)\n };\n }\n\n index += 1;\n }\n\n return {\n end: input.length,\n final: null,\n params: input.slice(start + 2)\n };\n}\n\nfunction toInteger(value: string | undefined): number | null {\n if (!value || value.length === 0) {\n return null;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return null;\n }\n }\n\n return Number.parseInt(value, 10);\n}\n\nfunction clampByte(value: number): number {\n if (value < 0) {\n return 0;\n }\n\n if (value > 255) {\n return 255;\n }\n\n return value;\n}\n\nfunction applyExtendedColor(\n params: number[],\n start: number\n): { color: Color | null; consumed: number } | null {\n const mode = params[start];\n if (mode === 5) {\n const index = params[start + 1];\n if (index === undefined) {\n return null;\n }\n\n return {\n color: { type: \"ansi8\", index: clampByte(index) },\n consumed: 2\n };\n }\n\n if (mode === 2) {\n const r = params[start + 1];\n const g = params[start + 2];\n const b = params[start + 3];\n if (r === undefined || g === undefined || b === undefined) {\n return null;\n }\n\n return {\n color: { type: \"rgb\", r: clampByte(r), g: clampByte(g), b: clampByte(b) },\n consumed: 4\n };\n }\n\n return null;\n}\n\nfunction applySgr(style: StyleState, paramsText: string): StyleState {\n const nextStyle = cloneStyle(style);\n const rawParams = paramsText.length === 0 ? [\"0\"] : paramsText.split(\";\");\n const params: number[] = [];\n\n for (const rawParam of rawParams) {\n const value = toInteger(rawParam);\n if (value === null) {\n return nextStyle;\n }\n\n params.push(value);\n }\n\n for (let index = 0; index < params.length; index += 1) {\n const value = params[index];\n\n if (value === 0) {\n Object.assign(nextStyle, createDefaultStyle());\n continue;\n }\n\n if (value === 1) {\n nextStyle.bold = true;\n continue;\n }\n\n if (value === 2) {\n nextStyle.dim = true;\n continue;\n }\n\n if (value === 22) {\n nextStyle.bold = false;\n nextStyle.dim = false;\n continue;\n }\n\n if (value === 3) {\n nextStyle.italic = true;\n continue;\n }\n\n if (value === 23) {\n nextStyle.italic = false;\n continue;\n }\n\n if (value === 4) {\n nextStyle.underline = true;\n continue;\n }\n\n if (value === 24) {\n nextStyle.underline = false;\n continue;\n }\n\n if (value === 9) {\n nextStyle.strikethrough = true;\n continue;\n }\n\n if (value === 29) {\n nextStyle.strikethrough = false;\n continue;\n }\n\n if (value === 39) {\n nextStyle.fg = null;\n continue;\n }\n\n if (value === 49) {\n nextStyle.bg = null;\n continue;\n }\n\n if (value >= 30 && value <= 37) {\n nextStyle.fg = { type: \"ansi4\", index: value - 30 };\n continue;\n }\n\n if (value >= 90 && value <= 97) {\n nextStyle.fg = { type: \"ansi4\", index: value - 90 + 8 };\n continue;\n }\n\n if (value >= 40 && value <= 47) {\n nextStyle.bg = { type: \"ansi4\", index: value - 40 };\n continue;\n }\n\n if (value >= 100 && value <= 107) {\n nextStyle.bg = { type: \"ansi4\", index: value - 100 + 8 };\n continue;\n }\n\n if (value === 38 || value === 48) {\n const extended = applyExtendedColor(params, index + 1);\n if (!extended) {\n continue;\n }\n\n if (value === 38) {\n nextStyle.fg = extended.color;\n } else {\n nextStyle.bg = extended.color;\n }\n\n index += extended.consumed;\n }\n }\n\n return nextStyle;\n}\n\nexport function parseAnsi(input: string): StyledRun[] {\n const runs: StyledRun[] = [];\n let style = createDefaultStyle();\n let textStart = 0;\n let index = 0;\n\n while (index < input.length) {\n const char = input[index];\n\n if (char === \"\\n\") {\n pushRun(runs, style, input.slice(textStart, index));\n pushRun(runs, style, \"\\n\");\n index += 1;\n textStart = index;\n continue;\n }\n\n if (char === ESC && input[index + 1] === \"[\") {\n pushRun(runs, style, input.slice(textStart, index));\n const sequence = parseCsi(input, index);\n\n if (sequence.final === \"m\") {\n style = applySgr(style, sequence.params);\n }\n\n index = sequence.end;\n textStart = index;\n continue;\n }\n\n index += 1;\n }\n\n pushRun(runs, style, input.slice(textStart));\n\n return runs;\n}\n", "import { Resvg } from \"@resvg/resvg-js\";\nimport { JETBRAINS_MONO_FONT_FILES } from \"./font.js\";\n\nexport function renderPng(svg: string): Buffer {\n const resvg = new Resvg(svg, {\n font: {\n defaultFontFamily: \"JetBrains Mono\",\n fontFiles: [...JETBRAINS_MONO_FONT_FILES],\n loadSystemFonts: false,\n monospaceFamily: \"JetBrains Mono\"\n },\n fitTo: {\n mode: \"zoom\",\n value: 4\n }\n });\n const png = resvg.render();\n return Buffer.from(png.asPng());\n}\n", "import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst require = createRequire(import.meta.url);\n\n// Full JetBrains Mono (all Unicode blocks including box-drawing and geometric shapes).\n// The @fontsource subsets only cover Latin and miss characters used by the design system.\nconst fontPackageRoot = dirname(require.resolve(\"jetbrains-mono/package.json\"));\nconst webfontRoot = join(fontPackageRoot, \"fonts/webfonts\");\n\nfunction readWebfontBase64(filename: string): string {\n return readFileSync(join(webfontRoot, filename)).toString(\"base64\");\n}\n\nfunction resolveAssetPath(filename: string): string {\n return fileURLToPath(new URL(`../assets/${filename}`, import.meta.url));\n}\n\nfunction createFontFace(base64: string, weight: 400 | 700, style: \"normal\" | \"italic\"): string {\n return `@font-face {\n font-family: 'JetBrains Mono';\n font-style: ${style};\n font-weight: ${weight};\n src: url('data:font/woff2;base64,${base64}') format('woff2');\n}`;\n}\n\nexport const JETBRAINS_MONO_BASE64 = readWebfontBase64(\"JetBrainsMono-Regular.woff2\");\nexport const JETBRAINS_MONO_FONT_FILES = [\n resolveAssetPath(\"jetbrains-mono-400-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-normal.ttf\"),\n resolveAssetPath(\"jetbrains-mono-400-italic.ttf\"),\n resolveAssetPath(\"jetbrains-mono-700-italic.ttf\")\n] as const;\nexport const JETBRAINS_MONO_TTF_PATH = JETBRAINS_MONO_FONT_FILES[0];\n\nexport const FONT_FACE_CSS = [\n createFontFace(JETBRAINS_MONO_BASE64, 400, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Bold.woff2\"), 700, \"normal\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-Italic.woff2\"), 400, \"italic\"),\n createFontFace(readWebfontBase64(\"JetBrainsMono-BoldItalic.woff2\"), 700, \"italic\")\n].join(\"\\n\");\n", "import type { Color, StyledRun } from \"./ansi-parser.js\";\nimport { FONT_FACE_CSS } from \"./font.js\";\n\nexport interface SvgOptions {\n padding?: number;\n window?: boolean;\n}\n\nconst ANSI_16_PALETTE = [\n \"#282a2e\",\n \"#D74E6F\",\n \"#31BB71\",\n \"#D3E561\",\n \"#8056FF\",\n \"#ED61D7\",\n \"#04D7D7\",\n \"#C5C8C6\",\n \"#4B4B4B\",\n \"#FE5F86\",\n \"#00D787\",\n \"#EBFF71\",\n \"#8F69FF\",\n \"#FF7AEA\",\n \"#00FEFE\",\n \"#FFFFFF\"\n] as const;\n\nconst XTERM_256_PALETTE = [\n \"#000000\", \"#800000\", \"#008000\", \"#808000\", \"#000080\", \"#800080\", \"#008080\", \"#c0c0c0\",\n \"#808080\", \"#ff0000\", \"#00ff00\", \"#ffff00\", \"#0000ff\", \"#ff00ff\", \"#00ffff\", \"#ffffff\",\n \"#000000\", \"#00005f\", \"#000087\", \"#0000af\", \"#0000d7\", \"#0000ff\", \"#005f00\", \"#005f5f\",\n \"#005f87\", \"#005faf\", \"#005fd7\", \"#005fff\", \"#008700\", \"#00875f\", \"#008787\", \"#0087af\",\n \"#0087d7\", \"#0087ff\", \"#00af00\", \"#00af5f\", \"#00af87\", \"#00afaf\", \"#00afd7\", \"#00afff\",\n \"#00d700\", \"#00d75f\", \"#00d787\", \"#00d7af\", \"#00d7d7\", \"#00d7ff\", \"#00ff00\", \"#00ff5f\",\n \"#00ff87\", \"#00ffaf\", \"#00ffd7\", \"#00ffff\", \"#5f0000\", \"#5f005f\", \"#5f0087\", \"#5f00af\",\n \"#5f00d7\", \"#5f00ff\", \"#5f5f00\", \"#5f5f5f\", \"#5f5f87\", \"#5f5faf\", \"#5f5fd7\", \"#5f5fff\",\n \"#5f8700\", \"#5f875f\", \"#5f8787\", \"#5f87af\", \"#5f87d7\", \"#5f87ff\", \"#5faf00\", \"#5faf5f\",\n \"#5faf87\", \"#5fafaf\", \"#5fafd7\", \"#5fafff\", \"#5fd700\", \"#5fd75f\", \"#5fd787\", \"#5fd7af\",\n \"#5fd7d7\", \"#5fd7ff\", \"#5fff00\", \"#5fff5f\", \"#5fff87\", \"#5fffaf\", \"#5fffd7\", \"#5fffff\",\n \"#870000\", \"#87005f\", \"#870087\", \"#8700af\", \"#8700d7\", \"#8700ff\", \"#875f00\", \"#875f5f\",\n \"#875f87\", \"#875faf\", \"#875fd7\", \"#875fff\", \"#878700\", \"#87875f\", \"#878787\", \"#8787af\",\n \"#8787d7\", \"#8787ff\", \"#87af00\", \"#87af5f\", \"#87af87\", \"#87afaf\", \"#87afd7\", \"#87afff\",\n \"#87d700\", \"#87d75f\", \"#87d787\", \"#87d7af\", \"#87d7d7\", \"#87d7ff\", \"#87ff00\", \"#87ff5f\",\n \"#87ff87\", \"#87ffaf\", \"#87ffd7\", \"#87ffff\", \"#af0000\", \"#af005f\", \"#af0087\", \"#af00af\",\n \"#af00d7\", \"#af00ff\", \"#af5f00\", \"#af5f5f\", \"#af5f87\", \"#af5faf\", \"#af5fd7\", \"#af5fff\",\n \"#af8700\", \"#af875f\", \"#af8787\", \"#af87af\", \"#af87d7\", \"#af87ff\", \"#afaf00\", \"#afaf5f\",\n \"#afaf87\", \"#afafaf\", \"#afafd7\", \"#afafff\", \"#afd700\", \"#afd75f\", \"#afd787\", \"#afd7af\",\n \"#afd7d7\", \"#afd7ff\", \"#afff00\", \"#afff5f\", \"#afff87\", \"#afffaf\", \"#afffd7\", \"#afffff\",\n \"#d70000\", \"#d7005f\", \"#d70087\", \"#d700af\", \"#d700d7\", \"#d700ff\", \"#d75f00\", \"#d75f5f\",\n \"#d75f87\", \"#d75faf\", \"#d75fd7\", \"#d75fff\", \"#d78700\", \"#d7875f\", \"#d78787\", \"#d787af\",\n \"#d787d7\", \"#d787ff\", \"#d7af00\", \"#d7af5f\", \"#d7af87\", \"#d7afaf\", \"#d7afd7\", \"#d7afff\",\n \"#d7d700\", \"#d7d75f\", \"#d7d787\", \"#d7d7af\", \"#d7d7d7\", \"#d7d7ff\", \"#d7ff00\", \"#d7ff5f\",\n \"#d7ff87\", \"#d7ffaf\", \"#d7ffd7\", \"#d7ffff\", \"#ff0000\", \"#ff005f\", \"#ff0087\", \"#ff00af\",\n \"#ff00d7\", \"#ff00ff\", \"#ff5f00\", \"#ff5f5f\", \"#ff5f87\", \"#ff5faf\", \"#ff5fd7\", \"#ff5fff\",\n \"#ff8700\", \"#ff875f\", \"#ff8787\", \"#ff87af\", \"#ff87d7\", \"#ff87ff\", \"#ffaf00\", \"#ffaf5f\",\n \"#ffaf87\", \"#ffafaf\", \"#ffafd7\", \"#ffafff\", \"#ffd700\", \"#ffd75f\", \"#ffd787\", \"#ffd7af\",\n \"#ffd7d7\", \"#ffd7ff\", \"#ffff00\", \"#ffff5f\", \"#ffff87\", \"#ffffaf\", \"#ffffd7\", \"#ffffff\",\n \"#080808\", \"#121212\", \"#1c1c1c\", \"#262626\", \"#303030\", \"#3a3a3a\", \"#444444\", \"#4e4e4e\",\n \"#585858\", \"#606060\", \"#666666\", \"#767676\", \"#808080\", \"#8a8a8a\", \"#949494\", \"#9e9e9e\",\n \"#a8a8a8\", \"#b2b2b2\", \"#bcbcbc\", \"#c6c6c6\", \"#d0d0d0\", \"#dadada\", \"#e4e4e4\", \"#eeeeee\"\n] as const;\n\nconst BACKGROUND = \"#171717\";\nconst DEFAULT_FOREGROUND = \"#c4c4c4\";\nconst FONT_FAMILY = \"JetBrains Mono\";\nconst FONT_SIZE = 14;\nconst LINE_HEIGHT = 1.2;\nconst CHARACTER_WIDTH = 8.412666666666667;\nconst TEXT_BOTTOM_PADDING = 11.6;\nconst DEFAULT_PADDING = {\n top: 20,\n right: 40,\n bottom: 20,\n left: 20\n};\nconst WINDOW_BAR_HEIGHT = 15;\n\nexport function renderSvg(runs: StyledRun[], options: SvgOptions = {}): string {\n const padding = options.padding === undefined\n ? DEFAULT_PADDING\n : {\n top: options.padding,\n right: options.padding,\n bottom: options.padding,\n left: options.padding\n };\n const showWindow = options.window ?? true;\n const titleBarHeight = showWindow ? WINDOW_BAR_HEIGHT : 0;\n const textStartX = padding.left;\n const lineHeightPx = FONT_SIZE * LINE_HEIGHT;\n const textStartY = titleBarHeight + padding.top + lineHeightPx;\n const lines = splitIntoLines(runs);\n const contentWidth = measureLines(lines);\n const width = padding.left + contentWidth + padding.right;\n const height =\n titleBarHeight + padding.top + (lines.length * lineHeightPx) + padding.bottom + TEXT_BOTTOM_PADDING;\n const svgWidth = formatNumber(width);\n const svgHeight = formatNumber(height);\n const viewBox = `0 0 ${svgWidth} ${svgHeight}`;\n const textElements = renderLines(lines, textStartX, textStartY, lineHeightPx);\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${svgWidth}\" height=\"${svgHeight}\" viewBox=\"${viewBox}\">`,\n \"<defs>\",\n \"<style><![CDATA[\",\n FONT_FACE_CSS,\n \"]]></style>\",\n \"</defs>\",\n `<rect x=\"0\" y=\"0\" width=\"${svgWidth}\" height=\"${svgHeight}\" fill=\"${BACKGROUND}\" />`,\n showWindow ? renderWindowControls() : \"\",\n `<g font-family=\"${FONT_FAMILY}\" font-size=\"${formatNumber(FONT_SIZE)}px\" fill=\"${DEFAULT_FOREGROUND}\">`,\n textElements,\n \"</g>\",\n \"</svg>\"\n ].join(\"\");\n}\n\nfunction splitIntoLines(runs: StyledRun[]): StyledRun[][] {\n const lines: StyledRun[][] = [[]];\n\n for (const run of runs) {\n if (run.text === \"\\n\") {\n lines.push([]);\n continue;\n }\n\n lines[lines.length - 1]?.push(run);\n }\n\n return lines;\n}\n\nfunction measureLines(lines: StyledRun[][]): number {\n return Math.max(\n ...lines.map(line => line.reduce((width, run) => width + (displayWidth(run.text) * CHARACTER_WIDTH), 0)),\n 0\n );\n}\n\nfunction displayWidth(text: string): number {\n const segmenter = new Intl.Segmenter();\n let width = 0;\n\n for (const { segment } of segmenter.segment(text)) {\n const cp = segment.codePointAt(0);\n width += cp !== undefined && isWideCodePoint(cp) ? 2 : 1;\n }\n\n return width;\n}\n\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115F) || // Hangul Jamo\n cp === 0x2329 || cp === 0x232A || // Angle brackets\n (cp >= 0x2E80 && cp <= 0x303E) || // CJK Radicals, Kangxi\n (cp >= 0x3041 && cp <= 0x33BF) || // Hiragana, Katakana, CJK symbols\n (cp >= 0x3400 && cp <= 0x4DBF) || // CJK Extension A\n (cp >= 0x4E00 && cp <= 0xA4CF) || // CJK Unified Ideographs\n (cp >= 0xA960 && cp <= 0xA97F) || // Hangul Jamo Extended-A\n (cp >= 0xAC00 && cp <= 0xD7AF) || // Hangul Syllables\n (cp >= 0xF900 && cp <= 0xFAFF) || // CJK Compatibility Ideographs\n (cp >= 0xFE10 && cp <= 0xFE19) || // Vertical Forms\n (cp >= 0xFE30 && cp <= 0xFE6F) || // CJK Compatibility Forms\n (cp >= 0xFF00 && cp <= 0xFF60) || // Fullwidth Latin, Halfwidth Katakana\n (cp >= 0xFFE0 && cp <= 0xFFE6) || // Fullwidth Signs\n (cp >= 0x1B000 && cp <= 0x1B0FF) || // Kana Supplement\n (cp >= 0x1F004 && cp <= 0x1F004) || // Mahjong tile\n (cp >= 0x1F0CF && cp <= 0x1F0CF) || // Playing card black joker\n (cp >= 0x1F200 && cp <= 0x1FFFD) || // Enclosed CJK + Emoji\n (cp >= 0x20000 && cp <= 0x2FFFD) || // CJK Extension B\u2013F\n (cp >= 0x30000 && cp <= 0x3FFFD) // CJK Extension G\u2013H\n );\n}\n\nfunction renderLines(\n lines: StyledRun[][],\n textStartX: number,\n textStartY: number,\n lineHeightPx: number\n): string {\n return lines\n .map((line, index) => {\n const y = formatNumber(textStartY + (index * lineHeightPx));\n\n if (line.length === 0) {\n return `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\"/>`;\n }\n\n return [\n `<text x=\"${formatNumber(textStartX)}\" y=\"${y}\" xml:space=\"preserve\">`,\n line.map(renderRun).join(\"\"),\n \"</text>\"\n ].join(\"\");\n })\n .join(\"\");\n}\n\nfunction renderRun(run: StyledRun): string {\n const attributes = ['xml:space=\"preserve\"'];\n const color = resolveColor(run.fg);\n const textDecorations: string[] = [];\n\n if (color !== DEFAULT_FOREGROUND) {\n attributes.push(`fill=\"${escapeXmlAttribute(color)}\"`);\n }\n\n if (run.bold) {\n attributes.push('font-weight=\"bold\"');\n }\n\n if (run.italic) {\n attributes.push('font-style=\"italic\"');\n }\n\n if (run.underline) {\n textDecorations.push(\"underline\");\n }\n\n if (run.strikethrough) {\n textDecorations.push(\"line-through\");\n }\n\n if (textDecorations.length > 0) {\n attributes.push(`text-decoration=\"${textDecorations.join(\" \")}\"`);\n }\n\n if (run.dim) {\n attributes.push('opacity=\"0.7\"');\n }\n\n return `<tspan ${attributes.join(\" \")}>${escapeXmlText(run.text)}</tspan>`;\n}\n\nfunction renderWindowControls(): string {\n return [\n '<circle cx=\"13.5\" cy=\"12\" r=\"5.5\" fill=\"#FF5A54\" />',\n '<circle cx=\"32.5\" cy=\"12\" r=\"5.5\" fill=\"#E6BF29\" />',\n '<circle cx=\"51.5\" cy=\"12\" r=\"5.5\" fill=\"#52C12B\" />'\n ].join(\"\");\n}\n\nfunction resolveColor(color: Color | null): string {\n if (color === null) {\n return DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi4\") {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n if (color.type === \"ansi8\") {\n if (color.index < ANSI_16_PALETTE.length) {\n return ANSI_16_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return XTERM_256_PALETTE[color.index] ?? DEFAULT_FOREGROUND;\n }\n\n return `rgb(${color.r},${color.g},${color.b})`;\n}\n\nfunction escapeXmlText(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXmlText(value).replaceAll('\"', \"&quot;\").replaceAll(\"'\", \"&apos;\");\n}\n\nfunction formatNumber(value: number): string {\n return value.toFixed(2);\n}\n", "import { defineCommand, S } from \"toolcraft\";\nimport { renderTerminalPng } from \"terminal-png\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n output: S.String({ short: \"o\", description: \"Path to the output PNG file\" }),\n window: S.Optional(S.Boolean({ description: \"Include terminal window chrome\", default: true })),\n padding: S.Optional(S.Number({ short: \"p\", description: \"Padding around terminal content\" }))\n});\n\nexport const screenshot = defineCommand<\n TerminalPilotCommandServices,\n \"screenshot\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\"]\n>({\n name: \"screenshot\",\n description: \"Capture the current terminal screen as a PNG image\",\n scope: [\"cli\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const screen = await namedSession.session.screen();\n\n await renderTerminalPng(screen.rawLines.join(\"\\n\"), {\n output: params.output,\n window: params.window,\n padding: params.padding\n });\n\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"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(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const sendSignal = defineCommand<\n TerminalPilotCommandServices,\n \"send-signal\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"send-signal\",\n description: \"Send a process signal to an active terminal session\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"signal\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.signal(params.signal);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"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(S.String({ short: \"s\", description: \"Session name\" }))\n});\n\nexport const type = defineCommand<\n TerminalPilotCommandServices,\n \"type\",\n typeof params,\n undefined,\n undefined,\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"type\",\n description: \"Write text to an active terminal session character-by-character with delay\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"text\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n await namedSession.session.type(params.text);\n return undefined;\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport type { TerminalPilotCommandServices } from \"./runtime.js\";\nimport {\n DEFAULT_INSTALL_AGENT,\n getSkillFolderWithHome,\n installableAgents,\n removeSkillFolder,\n resolveInstallableAgent,\n resolveInstallerServices\n} from \"./installer.js\";\n\nconst params = S.Object({\n agent: S.Enum(installableAgents as [string, ...string[]], {\n description: \"Agent to uninstall terminal-pilot from\",\n default: DEFAULT_INSTALL_AGENT\n })\n});\n\nexport const uninstall = defineCommand<\n TerminalPilotCommandServices,\n \"uninstall\",\n typeof params,\n undefined,\n {\n agent: string;\n removedSkillPaths: string[];\n },\n readonly [\"cli\"]\n>({\n name: \"uninstall\",\n description: \"Remove the terminal-pilot CLI skill.\",\n scope: [\"cli\"],\n positional: [\"agent\"],\n params,\n handler: async ({ params, terminalPilotInstaller }) => {\n const services = resolveInstallerServices(terminalPilotInstaller);\n const agent = resolveInstallableAgent(params.agent);\n const localSkill = getSkillFolderWithHome(\n agent,\n \"local\",\n services.cwd,\n services.homeDir\n );\n const globalSkill = getSkillFolderWithHome(\n agent,\n \"global\",\n services.cwd,\n services.homeDir\n );\n const removedSkillPaths: string[] = [];\n\n if (await removeSkillFolder(services.fs, localSkill.fullPath)) {\n removedSkillPaths.push(localSkill.displayPath);\n }\n\n if (await removeSkillFolder(services.fs, globalSkill.fullPath)) {\n removedSkillPaths.push(globalSkill.displayPath);\n }\n\n return {\n agent,\n removedSkillPaths\n };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n pattern: S.String({ description: \"Regular expression pattern to wait for\" }),\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" })),\n literal: S.Optional(\n S.Boolean({\n short: \"l\",\n description: \"When true, treat pattern as a literal string instead of a regex\"\n })\n )\n});\n\nexport const waitFor = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for\",\n typeof params,\n undefined,\n { matched: true; line: string },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for\",\n description: \"Wait for terminal output to match a pattern\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n positional: [\"pattern\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const pattern = params.literal === true ? params.pattern : new RegExp(params.pattern);\n const line =\n params.timeout === undefined\n ? await namedSession.session.waitFor(pattern)\n : await namedSession.session.waitFor(pattern, { timeout: params.timeout });\n\n return { matched: true, line };\n }\n});\n", "import { defineCommand, S } from \"toolcraft\";\nimport { getTerminalPilotRuntime, type TerminalPilotCommandServices } from \"./runtime.js\";\n\nconst params = S.Object({\n session: S.Optional(S.String({ short: \"s\", description: \"Session name\" })),\n timeout: S.Optional(S.Number({ short: \"t\", description: \"Maximum wait time in milliseconds\" }))\n});\n\nexport const waitForExit = defineCommand<\n TerminalPilotCommandServices,\n \"wait-for-exit\",\n typeof params,\n undefined,\n { exitCode: number },\n readonly [\"cli\", \"mcp\", \"sdk\"]\n>({\n name: \"wait-for-exit\",\n description: \"Wait for a terminal session process to finish\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n params,\n handler: async ({ params, env, terminalPilotRuntime }) => {\n const namedSession = await getTerminalPilotRuntime(terminalPilotRuntime).resolveSession(params.session, env);\n const exitCode = await namedSession.session.waitForExit(\n params.timeout === undefined ? undefined : { timeout: params.timeout }\n );\n return { exitCode };\n }\n});\n", "import { defineGroup } from \"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 install,\n uninstall,\n createSession,\n fill,\n type,\n pressKey,\n sendSignal,\n waitFor,\n waitForExit,\n readScreen,\n screenshot,\n readHistory,\n resize,\n closeSession,\n getSession,\n listSessions\n] as const;\n\nexport const terminalPilotGroup = defineGroup<TerminalPilotCommandServices, \"terminal-pilot\", typeof children, readonly [\"cli\", \"mcp\", \"sdk\"]>({\n name: \"terminal-pilot\",\n scope: [\"cli\", \"mcp\", \"sdk\"],\n children\n});\n"],
5
+ "mappings": "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;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAC7E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",
6
+ "names": ["path", "fileURLToPath", "access", "readFile", "writeFile", "path", "text", "chalk", "text", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "spacing", "message", "chalk", "chalk", "AsyncLocalStorage", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "message", "chalk", "chalk", "chalk", "chalk", "select", "text", "confirm", "chalk", "fileURLToPath", "message", "key", "assertValidBranches", "key", "rename", "fileURLToPath", "location", "separatorIndex", "previousSeparatorIndex", "candidate", "fsPromises", "path", "message", "error", "path", "fs", "stat", "message", "path", "hasErrorCode", "error", "isRecord", "fs", "path", "isRecord", "key", "fs", "error", "hasErrorCode", "parseDocument", "TASK_KIND", "TASK_SCHEMA_ID", "TASK_VERSION", "malformedTask", "validateListName", "parseQualifiedId", "key", "createTask", "assertCreateDoesNotSetState", "assertUpdateDoesNotSetState", "parseDocument", "isRecord", "assertValidTaskRecord", "fs", "createTasksView", "createDefaultFs", "fsPromises", "error", "readFile", "process", "error", "message", "process", "message", "error", "params", "path", "readFile", "key", "params", "logger", "renderTable", "getTheme", "key", "existsSync", "readFile", "unlink", "writeFile", "path", "spawn", "PassThrough", "path", "randomBytes", "hostname", "path", "error", "key", "cached", "isRecord", "spawn", "error", "message", "key", "path", "URL", "crypto", "error", "text", "crypto", "error", "error", "fetch", "URL", "hostname", "normalizeHostname", "hostname", "isLoopbackHostname", "assertSecureUrl", "resolvedResourceMetadataUrl", "fetch", "error", "params", "error", "params", "isObjectRecord", "message", "spawn", "error", "PassThrough", "message", "params", "isObjectRecord", "isObjectRecord", "key", "path", "getInternalGroupConfig", "cloneSecrets", "cloneScope", "params", "validateRenameMap", "rename", "readFile", "error", "path", "writeFile", "logger", "message", "unlink", "path", "existsSync", "stringifyValue", "key", "write", "payload", "path", "key", "trimmed", "withOutputFormat", "select", "confirm", "text", "createFs", "readFile", "writeFile", "access", "createEnv", "isPlainObject", "error", "message", "scenario", "logger", "next", "optionPath", "params", "stripAnsi", "params", "key", "stripAnsi", "text", "sleep", "key", "stripAnsi", "require", "error", "DEFAULT_COLS", "DEFAULT_ROWS", "listSessions", "params", "params", "params", "params", "params", "os", "path", "parse", "errors", "key", "parse", "isConfigObject", "parse", "serialize", "merge", "key", "prune", "isConfigObject", "parse", "serialize", "merge", "key", "prune", "path", "path", "error", "fs", "fs", "key", "isConfigObject", "error", "stat", "error", "Mustache", "readFile", "stat", "path", "fileURLToPath", "os", "path", "readFile", "isNotFoundError", "error", "os", "readFile", "path", "fs", "params", "params", "params", "params", "params", "params", "writeFile", "ESC", "text", "params", "parseAnsi", "readFileSync", "createRequire", "dirname", "join", "fileURLToPath", "require", "text", "parseAnsi", "writeFile", "params", "params", "params", "params", "params", "params", "waitForExit", "waitForExit", "fileURLToPath", "path"]
7
7
  }