poe-code 4.0.45 → 4.0.46

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../packages/poe-code-config/src/runtime.ts", "../packages/poe-code-config/src/schema.ts", "../packages/poe-code-config/src/compile/schema-compiler.ts", "../packages/toolcraft-schema/src/json.ts", "../packages/toolcraft-schema/src/json-schema-document.ts", "../packages/toolcraft-schema/src/oneof.ts", "../packages/toolcraft-schema/src/record.ts", "../packages/toolcraft-schema/src/union.ts", "../packages/toolcraft-schema/src/validate.ts", "../packages/toolcraft-schema/src/json-schema/compiler.ts", "../packages/toolcraft-schema/src/index.ts", "../packages/poe-code-config/src/plan-scope.ts", "../packages/poe-code-config/src/store.ts", "../packages/config-extends/src/discover.ts", "../packages/config-extends/src/error-codes.ts", "../packages/config-extends/src/parse.ts", "../packages/frontmatter/src/fences.ts", "../packages/frontmatter/src/parse.ts", "../packages/frontmatter/src/stringify.ts", "../packages/config-extends/src/merge.ts", "../packages/config-extends/src/resolve.ts", "../packages/toolcraft-design/src/internal/color-support.ts", "../packages/toolcraft-design/src/components/color.ts", "../packages/toolcraft-design/src/tokens/brand.ts", "../packages/toolcraft-design/src/internal/theme-state.ts", "../packages/toolcraft-design/src/tokens/colors.ts", "../packages/toolcraft-design/src/internal/output-format.ts", "../packages/toolcraft-design/src/internal/theme-detect.ts", "../packages/toolcraft-design/src/components/symbols.ts", "../packages/toolcraft-design/src/internal/strip-ansi.ts", "../packages/toolcraft-design/src/prompts/primitives/log.ts", "../packages/toolcraft-design/src/components/logger.ts", "../packages/toolcraft-design/src/components/help-formatter.ts", "../packages/toolcraft-design/src/components/table.ts", "../packages/toolcraft-design/src/components/detail-card.ts", "../packages/toolcraft-design/src/components/template.ts", "../packages/toolcraft-design/src/components/browser.ts", "../packages/toolcraft-design/src/terminal-markdown/parser/code-highlight.ts", "../packages/toolcraft-design/src/dashboard/terminal-width.ts", "../packages/toolcraft-design/src/acp/writer.ts", "../packages/toolcraft-design/src/dashboard/terminal.ts", "../packages/toolcraft-design/src/screen/style.ts", "../packages/toolcraft-design/src/explorer/runtime.ts", "../packages/toolcraft-design/src/terminal/input.ts", "../packages/toolcraft-design/src/explorer/state.ts", "../packages/toolcraft-design/src/prompts/interactive/glyphs.ts", "../packages/toolcraft-design/src/prompts/interactive/core.ts", "../packages/toolcraft-design/src/prompts/interactive/wrap.ts", "../packages/toolcraft-design/src/prompts/interactive/pagination.ts", "../packages/toolcraft-design/src/static/spinner.ts", "../packages/config-extends/src/prompt-document.ts", "../packages/config-mutations/src/execution/apply-mutation.ts", "../packages/config-mutations/src/formats/json.ts", "../packages/config-mutations/src/formats/toml.ts", "../packages/config-mutations/src/formats/yaml.ts", "../packages/config-mutations/src/execution/path-utils.ts", "../packages/config-mutations/src/error-codes.ts", "../packages/config-mutations/src/fs-utils.ts", "../packages/poe-code-config/src/errors.ts", "../packages/poe-code-config/src/resolve.ts", "../packages/poe-code-config/src/config.ts", "../packages/poe-code-config/src/merge.ts", "../packages/poe-code-config/src/merge-callbacks.ts", "../packages/poe-code-config/src/models.ts", "../packages/poe-code-config/src/memory.ts", "../packages/poe-code-config/src/inspect.ts", "../packages/poe-code-config/src/provider-config.ts", "../packages/poe-code-config/src/configured-services.ts", "../packages/agent-defs/src/agents/claude-code.ts", "../packages/agent-defs/src/agents/claude-desktop.ts", "../packages/agent-defs/src/agents/codex.ts", "../packages/agent-defs/src/agents/cursor.ts", "../packages/agent-defs/src/agents/gemini-cli.ts", "../packages/agent-defs/src/agents/opencode.ts", "../packages/agent-defs/src/agents/kimi.ts", "../packages/agent-defs/src/agents/goose.ts", "../packages/agent-defs/src/agents/pi.ts", "../packages/agent-defs/src/agents/poe-agent.ts", "../packages/agent-defs/src/registry.ts", "../packages/providers/src/auth/api-key.ts", "../packages/providers/src/compatibility.ts", "../packages/providers/src/registry.ts", "../packages/providers/src/types.ts", "../packages/providers/src/providers/poe.ts", "../packages/providers/src/provider-order.ts", "../packages/providers/src/providers/anthropic.ts", "../packages/providers/src/providers/cloudflare.ts", "../packages/providers/src/providers/openai.ts", "../packages/providers/src/providers/generated.ts", "../packages/poe-code-config/src/state/index.ts", "../packages/poe-code-config/src/state/jobs.ts", "../packages/poe-code-config/src/state/fs.ts", "../packages/poe-code-config/src/state/templates.ts"],
4
+ "sourcesContent": ["import { existsSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { ResolvedConfig, SchemaField, ScopeDefinition } from \"./types.js\";\n\nexport interface RuntimeMount {\n source: string;\n target: string;\n readonly?: boolean;\n}\n\nexport interface RunnerScope {\n detach: boolean;\n upload_max_file_mb: number;\n download_conflict: \"refuse\" | \"overwrite\";\n sync: \"both\" | \"upload\" | \"none\";\n workspace?: {\n exclude?: string[];\n };\n}\n\ninterface SharedRuntimeFields {\n build_args: Record<string, string>;\n mounts: RuntimeMount[];\n link?: string;\n}\n\nexport interface HostRuntime extends SharedRuntimeFields {\n type: \"host\";\n}\n\nexport interface DockerRuntime extends SharedRuntimeFields {\n type: \"docker\";\n image?: string;\n dockerfile?: string;\n build_context?: string;\n engine?: \"docker\" | \"podman\";\n network?: string;\n extra_args?: string[];\n}\n\nexport type RuntimeConfig = HostRuntime | DockerRuntime;\nexport type RuntimeRunner = RuntimeConfig[\"type\"];\n\nconst defaultWorkspaceExclude = [\n \".git\",\n \"node_modules\",\n \"dist\",\n \".turbo\",\n \".next\",\n \".poe-code/state.json\"\n];\n\nexport interface RuntimeResolveResult {\n runtime: RuntimeConfig;\n runner: RuntimeRunner;\n dockerfilePath: string | null;\n buildContext: string | null;\n}\n\ntype RuntimeResolver = (input: { cwd: string; runtime: RuntimeConfig }) => RuntimeResolveResult;\n\nexport const runtimeConfigScope = deepFreeze({\n scope: \"runtime\",\n schema: {\n type: {\n type: \"string\",\n default: \"host\",\n doc: \"Runtime backend: host or docker\"\n },\n build_args: {\n type: \"json\",\n default: {} as Record<string, string>,\n parse: parseBuildArgs,\n doc: \"Build arguments passed to the runtime image build\"\n },\n mounts: {\n type: \"json\",\n default: [] as RuntimeMount[],\n parse: parseMounts,\n doc: \"Additional runtime mounts\"\n },\n runner: {\n type: \"json\",\n default: createDefaultRunnerScope(),\n parse: parseRunner,\n doc: \"Runner process and workspace transfer settings\"\n },\n link: {\n type: \"string\",\n default: \"\",\n doc: \"Informational link for the runtime definition\"\n },\n image: {\n type: \"string\",\n default: \"\",\n doc: \"Prebuilt Docker image\"\n },\n dockerfile: {\n type: \"string\",\n default: \"\",\n doc: \"Path to the Dockerfile used for Docker builds\"\n },\n build_context: {\n type: \"string\",\n default: \"\",\n doc: \"Path to the Docker build context\"\n },\n engine: {\n type: \"string\",\n default: \"\",\n doc: \"Container engine for Docker runtime\"\n },\n network: {\n type: \"string\",\n default: \"\",\n doc: \"Docker network\"\n },\n extra_args: {\n type: \"json\",\n default: undefined as string[] | undefined,\n parse: parseOptionalStringArray,\n doc: \"Extra Docker runtime arguments\"\n }\n }\n} satisfies ScopeDefinition<Record<string, SchemaField>>);\n\nexport function parseRunner(raw: unknown): RunnerScope {\n if (raw === undefined) {\n return createDefaultRunnerScope();\n }\n const record = asRecord(raw);\n if (record === undefined) {\n throw new Error(\"runner: expected an object.\");\n }\n\n const uploadMaxFileMb =\n parseOptionalNumber(getOwnEntry(record, \"upload_max_file_mb\"), \"runner.upload_max_file_mb\") ??\n 100;\n if (uploadMaxFileMb <= 0) {\n throw new Error(\"runner.upload_max_file_mb: expected a positive finite number.\");\n }\n\n return omitUndefined({\n detach: parseOptionalBoolean(getOwnEntry(record, \"detach\"), \"runner.detach\") ?? false,\n upload_max_file_mb: uploadMaxFileMb,\n download_conflict: parseDownloadConflict(getOwnEntry(record, \"download_conflict\")),\n sync: parseRunnerSync(getOwnEntry(record, \"sync\")),\n workspace: parseRunnerWorkspace(getOwnEntry(record, \"workspace\"))\n });\n}\n\nexport function parseRuntime(raw: unknown): RuntimeConfig {\n if (raw === undefined) {\n return {\n type: \"host\",\n build_args: {},\n mounts: []\n };\n }\n const record = asRecord(raw);\n if (record === undefined) {\n throw new Error(\"runtime: expected an object.\");\n }\n const type = parseRuntimeType(getOwnEntry(record, \"type\"));\n const shared = parseSharedRuntimeFields(record);\n\n if (type === \"docker\") {\n return omitUndefined({\n ...shared,\n type,\n image: parseOptionalNonEmptyString(getOwnEntry(record, \"image\"), \"image\"),\n dockerfile: parseOptionalString(getOwnEntry(record, \"dockerfile\")),\n build_context: parseOptionalString(getOwnEntry(record, \"build_context\")),\n engine: parseEngine(getOwnEntry(record, \"engine\")),\n network: parseOptionalString(getOwnEntry(record, \"network\")),\n extra_args: parseOptionalStringArray(getOwnEntry(record, \"extra_args\"))\n });\n }\n\n return {\n ...shared,\n type\n };\n}\n\nexport function resolveRuntime({\n cwd,\n config\n}: {\n cwd: string;\n config: Pick<ResolvedConfig, \"runtime\">;\n}): RuntimeResolveResult {\n const runtime = getOwnEntry(config as unknown as Record<string, unknown>, \"runtime\");\n if (!isRuntimeConfig(runtime)) {\n throw new Error(\"runtime config is required.\");\n }\n const type = getRuntimeType(runtime);\n return runtimeResolvers[type]({ cwd, runtime });\n}\n\nconst runtimeResolvers: Record<RuntimeConfig[\"type\"], RuntimeResolver> = {\n host({ runtime }) {\n return {\n runtime,\n runner: \"host\",\n dockerfilePath: null,\n buildContext: null\n };\n },\n docker({ cwd, runtime }) {\n const dockerRuntime = runtime as DockerRuntime;\n if (getOptionalRuntimeString(dockerRuntime, \"image\") !== undefined) {\n return {\n runtime: dockerRuntime,\n runner: \"docker\",\n dockerfilePath: null,\n buildContext: null\n };\n }\n\n const { dockerfilePath, buildContext } = resolveRuntimeBuildPaths(cwd, dockerRuntime);\n if (!existsSync(dockerfilePath)) {\n throw new Error(`Docker runtime requires image or a Dockerfile at ${dockerfilePath}.`);\n }\n if (!existsSync(buildContext)) {\n throw new Error(`runtime.build_context does not exist: ${buildContext}.`);\n }\n assertRuntimePathInsideCwd(cwd, dockerfilePath, \"runtime.dockerfile\");\n assertRuntimePathInsideCwd(cwd, buildContext, \"runtime.build_context\");\n return {\n runtime: dockerRuntime,\n runner: \"docker\",\n dockerfilePath,\n buildContext\n };\n }\n};\n\nfunction resolveRuntimeBuildPaths(\n cwd: string,\n runtime: DockerRuntime\n): { dockerfilePath: string; buildContext: string } {\n return {\n dockerfilePath: path.resolve(\n cwd,\n getOptionalRuntimeString(runtime, \"dockerfile\") ?? path.join(\".poe-code\", \"Dockerfile\")\n ),\n buildContext: path.resolve(cwd, getOptionalRuntimeString(runtime, \"build_context\") ?? \".\")\n };\n}\n\nfunction assertRuntimePathInsideCwd(cwd: string, targetPath: string, fieldName: string): void {\n const canonicalCwd = realpathSync(cwd);\n const canonicalTarget = realpathSync(targetPath);\n if (!isPathInsideOrEqual(canonicalCwd, canonicalTarget)) {\n throw new Error(`${fieldName} must remain inside runtime cwd ${canonicalCwd}.`);\n }\n}\n\nfunction isPathInsideOrEqual(rootPath: string, targetPath: string): boolean {\n const relativePath = path.relative(rootPath, targetPath);\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nfunction parseSharedRuntimeFields(record: Record<string, unknown>): SharedRuntimeFields {\n return omitUndefined({\n build_args: parseBuildArgs(getOwnEntry(record, \"build_args\")),\n mounts: parseMounts(getOwnEntry(record, \"mounts\")),\n link: parseOptionalString(getOwnEntry(record, \"link\"))\n });\n}\n\nfunction parseRuntimeType(value: unknown): RuntimeConfig[\"type\"] {\n if (value === undefined) {\n return \"host\";\n }\n if (value === \"host\" || value === \"docker\") {\n return value;\n }\n throw new Error('type: expected \"host\" or \"docker\".');\n}\n\nfunction createDefaultRunnerScope(): RunnerScope {\n return {\n detach: false,\n upload_max_file_mb: 100,\n download_conflict: \"refuse\",\n sync: \"both\",\n workspace: {\n exclude: [...defaultWorkspaceExclude]\n }\n };\n}\n\nfunction parseRunnerWorkspace(value: unknown): RunnerScope[\"workspace\"] {\n if (value === undefined) {\n return {\n exclude: [...defaultWorkspaceExclude]\n };\n }\n const record = asRecord(value);\n if (record === undefined) {\n throw new Error(\"runner.workspace: expected an object.\");\n }\n\n return {\n exclude: parseOptionalStringArray(getOwnEntry(record, \"exclude\"), \"runner.workspace.exclude\") ??\n [...defaultWorkspaceExclude]\n };\n}\n\nfunction parseDownloadConflict(value: unknown): RunnerScope[\"download_conflict\"] {\n if (value === undefined) {\n return \"refuse\";\n }\n if (value === \"refuse\" || value === \"overwrite\") {\n return value;\n }\n throw new Error('runner.download_conflict: expected \"refuse\" or \"overwrite\".');\n}\n\nfunction parseRunnerSync(value: unknown): RunnerScope[\"sync\"] {\n if (value === undefined) {\n return \"both\";\n }\n if (value === \"both\" || value === \"upload\" || value === \"none\") {\n return value;\n }\n throw new Error('runner.sync: expected \"both\", \"upload\", or \"none\".');\n}\n\nfunction parseBuildArgs(value: unknown): Record<string, string> {\n if (value === undefined) {\n return {};\n }\n const record = asRecord(value);\n if (record === undefined) {\n throw new Error(\"build_args: expected an object.\");\n }\n\n const parsed: Record<string, string> = {};\n for (const [key, entry] of Object.entries(record)) {\n assertBuildArgName(key);\n if (typeof entry !== \"string\") {\n throw new Error(`build_args.${key}: expected a string.`);\n }\n defineDataProperty(parsed, key, entry);\n }\n return parsed;\n}\n\nfunction parseMounts(value: unknown): RuntimeMount[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new Error(\"mounts: expected an array.\");\n }\n\n return value.map((entry, index) => {\n const record = asRecord(entry);\n if (record === undefined) {\n throw new Error(`mounts[${index}]: expected an object.`);\n }\n const source = getOwnEntry(record, \"source\");\n const target = getOwnEntry(record, \"target\");\n if (typeof source !== \"string\") {\n throw new Error(`mounts[${index}].source: expected a string.`);\n }\n if (source.trim().length === 0) {\n throw new Error(`mounts[${index}].source: expected a non-empty string.`);\n }\n if (typeof target !== \"string\") {\n throw new Error(`mounts[${index}].target: expected a string.`);\n }\n if (\n target.trim().length === 0 ||\n target !== target.trim() ||\n !path.posix.isAbsolute(target)\n ) {\n throw new Error(`mounts[${index}].target: expected a non-empty absolute sandbox path.`);\n }\n\n return omitUndefined({\n source,\n target,\n readonly: parseOptionalBoolean(getOwnEntry(record, \"readonly\"), `mounts[${index}].readonly`)\n });\n });\n}\n\nfunction parseOptionalString(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(\"expected a string.\");\n }\n if (value.length === 0) {\n return undefined;\n }\n return value;\n}\n\nfunction parseOptionalNonEmptyString(value: unknown, key: string): string | undefined {\n const parsed = parseOptionalString(value);\n if (parsed === undefined) {\n return undefined;\n }\n if (parsed.trim().length === 0) {\n throw new Error(`${key}: expected a non-empty string.`);\n }\n return parsed;\n}\n\nfunction assertBuildArgName(key: string): void {\n if (key.length === 0 || key !== key.trim()) {\n throw new Error(`build_args.${key}: expected an environment-style argument name.`);\n }\n for (let index = 0; index < key.length; index += 1) {\n const charCode = key.charCodeAt(index);\n const isUppercase = charCode >= 65 && charCode <= 90;\n const isLowercase = charCode >= 97 && charCode <= 122;\n const isDigit = charCode >= 48 && charCode <= 57;\n const isUnderscore = charCode === 95;\n if (!isUppercase && !isLowercase && !isDigit && !isUnderscore) {\n throw new Error(`build_args.${key}: expected an environment-style argument name.`);\n }\n }\n}\n\nfunction defineDataProperty(object: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) {\n return value;\n }\n\n for (const entry of Object.values(value)) {\n deepFreeze(entry);\n }\n\n return Object.freeze(value);\n}\n\nfunction parseOptionalStringArray(value: unknown, key = \"\"): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(`${key ? `${key}: ` : \"\"}expected an array.`);\n }\n return value.map((entry, index) => {\n if (typeof entry !== \"string\") {\n throw new Error(`${key}[${index}]: expected a string.`);\n }\n return entry;\n });\n}\n\nfunction parseEngine(value: unknown): \"docker\" | \"podman\" | undefined {\n const engine = parseOptionalString(value);\n if (engine === undefined || engine === \"docker\" || engine === \"podman\") {\n return engine;\n }\n throw new Error('engine: expected \"docker\" or \"podman\".');\n}\n\nfunction parseOptionalNumber(value: unknown, key = \"\"): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${key ? `${key}: ` : \"\"}expected a finite number.`);\n }\n return value;\n}\n\nfunction parseOptionalBoolean(value: unknown, key: string): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`${key}: expected a boolean.`);\n }\n return value;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction isRuntimeConfig(value: unknown): value is RuntimeConfig {\n return asRecord(value) !== undefined;\n}\n\nfunction getRuntimeType(runtime: RuntimeConfig): RuntimeConfig[\"type\"] {\n const type = getOwnEntry(runtime as unknown as Record<string, unknown>, \"type\");\n if (type === \"host\" || type === \"docker\") {\n return type;\n }\n throw new Error('runtime.type: expected \"host\" or \"docker\".');\n}\n\nfunction getOptionalRuntimeString(\n runtime: DockerRuntime,\n key: \"build_context\" | \"dockerfile\" | \"image\"\n): string | undefined {\n const value = getOwnEntry(runtime as unknown as Record<string, unknown>, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n", "import type {\n BraintrustIntegrationConfig,\n ScopeDefinition,\n ScopeSchema\n} from \"./types.js\";\n\nexport function defineScope<const S extends ScopeSchema>(\n scope: string,\n schema: S\n): ScopeDefinition<S> {\n return {\n scope,\n schema\n };\n}\n\nexport const integrationsConfigScope = defineScope(\"integrations\", {\n braintrust: {\n type: \"json\",\n default: {\n enabled: false\n } satisfies BraintrustIntegrationConfig,\n parse: parseBraintrustIntegrationConfig,\n doc: \"Braintrust integration configuration\"\n }\n});\n\nexport { runtimeConfigScope } from \"./runtime.js\";\n\nfunction parseBraintrustIntegrationConfig(value: unknown): BraintrustIntegrationConfig {\n if (!isRecord(value)) {\n throw new Error(\"expected an object\");\n }\n\n const enabled = value.enabled === undefined ? false : value.enabled;\n if (typeof enabled !== \"boolean\") {\n throw new Error(\"enabled must be a boolean\");\n }\n\n return {\n enabled,\n ...optionalStringEntry(\"apiKey\", value.apiKey),\n ...optionalStringEntry(\"apiUrl\", value.apiUrl),\n ...optionalStringEntry(\"project\", value.project)\n };\n}\n\nfunction optionalStringEntry(key: string, value: unknown): Record<string, string> {\n if (value === undefined) {\n return {};\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`${key} must be a string`);\n }\n\n return { [key]: value };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Node, Project, ScriptKind, SyntaxKind, ts } from \"ts-morph\";\nimport { S, toJsonSchemaDocument } from \"toolcraft-schema\";\nimport type {\n CallExpression,\n Expression,\n ObjectLiteralExpression,\n PropertyName,\n SourceFile\n} from \"ts-morph\";\nimport type { AnySchema, JsonSchemaDocument, JsonSchemaDocumentOptions } from \"toolcraft-schema\";\n\ninterface CompileConfigSchemaOptions {\n entrypoints: readonly string[];\n document?: JsonSchemaDocumentOptions;\n}\n\nexport interface CompileConfigSchemaFromSourceTextsOptions extends CompileConfigSchemaOptions {\n files: Record<string, string>;\n}\n\ntype LiteralValue = string | number | boolean | null | { [key: string]: LiteralValue };\n\ntype CollectedField =\n | {\n type: \"string\";\n default: string;\n doc: string;\n env?: string;\n }\n | {\n type: \"number\";\n default: number;\n doc: string;\n env?: string;\n }\n | {\n type: \"boolean\";\n default: boolean;\n doc: string;\n env?: string;\n };\n\ninterface ScopeFragment {\n scope: string;\n fields: Record<string, CollectedField>;\n sourceFilePath: string;\n}\n\nconst supportedFieldMetadata = new Set([\"type\", \"default\", \"doc\", \"env\"]);\nconst unsafeSchemaNames = new Set([\"__proto__\"]);\n\nconst defaultDocumentOptions: JsonSchemaDocumentOptions = {\n id: \"https://poe-code.dev/schemas/poe-code.schema.json\",\n title: \"poe-code config\",\n description: \"Schema for poe-code config files\"\n};\n\nexport function compileConfigSchemaFromEntrypoints(\n options: CompileConfigSchemaOptions\n): JsonSchemaDocument {\n const normalizedEntrypoints = options.entrypoints.map(normalizeFilePath);\n const project = createProject();\n\n const sourceFiles = collectReachableSourceFiles({\n entrypoints: normalizedEntrypoints,\n project,\n readSourceText(filePath) {\n if (!existsSync(filePath)) {\n return undefined;\n }\n\n return readFileSync(filePath, \"utf8\");\n }\n });\n\n return compileReachableSourceFiles(sourceFiles, options.document);\n}\n\nexport function compileConfigSchemaFromSourceTexts(\n options: CompileConfigSchemaFromSourceTextsOptions\n): JsonSchemaDocument {\n const files = new Map(\n Object.entries(options.files).map(([filePath, sourceText]) => [\n normalizeFilePath(filePath),\n sourceText\n ])\n );\n const project = createProject();\n\n const sourceFiles = collectReachableSourceFiles({\n entrypoints: options.entrypoints.map(normalizeFilePath),\n project,\n readSourceText(filePath) {\n return files.get(filePath);\n }\n });\n\n return compileReachableSourceFiles(sourceFiles, options.document);\n}\n\nfunction compileReachableSourceFiles(\n sourceFiles: ReturnType<typeof collectReachableSourceFiles>,\n documentOptions: JsonSchemaDocumentOptions | undefined\n): JsonSchemaDocument {\n const fragments = sourceFiles.flatMap((sourceFile) => extractScopeFragments(sourceFile));\n const mergedScopes = mergeScopeFragments(fragments);\n const rootShape = {\n version: S.Number({ default: 1 })\n } as Record<string, AnySchema>;\n\n for (const [scopeName, fields] of mergedScopes) {\n const scopeShape: Record<string, AnySchema> = {};\n\n for (const [fieldName, field] of Object.entries(fields)) {\n scopeShape[fieldName] = fieldToToolcraftSchema(field);\n }\n\n rootShape[scopeName] = S.Optional(S.Object(scopeShape));\n }\n\n return toJsonSchemaDocument(S.Object(rootShape), {\n ...defaultDocumentOptions,\n ...documentOptions\n });\n}\n\nfunction createProject(): Project {\n return new Project({\n useInMemoryFileSystem: true,\n compilerOptions: {\n allowJs: false,\n esModuleInterop: true,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n target: ts.ScriptTarget.ES2022\n },\n skipAddingFilesFromTsConfig: true\n });\n}\n\nfunction collectReachableSourceFiles(options: {\n entrypoints: readonly string[];\n project: Project;\n readSourceText: (filePath: string) => string | undefined;\n}) {\n const sourceFiles = [];\n const visited = new Set<string>();\n const pending = [...options.entrypoints];\n\n while (pending.length > 0) {\n const filePath = pending.shift();\n if (filePath === undefined || visited.has(filePath)) {\n continue;\n }\n\n const sourceText = options.readSourceText(filePath);\n if (sourceText === undefined) {\n throw new Error(`Unable to read schema compilation entrypoint or import: ${filePath}`);\n }\n\n visited.add(filePath);\n const sourceFile = options.project.createSourceFile(filePath, sourceText, {\n overwrite: true,\n scriptKind: ScriptKind.TS\n });\n sourceFiles.push(sourceFile);\n\n for (const specifier of getStaticModuleSpecifiers(sourceFile)) {\n const resolved = resolveRelativeModuleSpecifier(filePath, specifier, options.readSourceText);\n if (resolved !== undefined && !visited.has(resolved)) {\n pending.push(resolved);\n }\n }\n }\n\n return sourceFiles;\n}\n\nfunction getStaticModuleSpecifiers(sourceFile: SourceFile): string[] {\n const specifiers: string[] = [];\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n if (!declaration.isTypeOnly()) {\n specifiers.push(declaration.getModuleSpecifierValue());\n }\n }\n\n for (const declaration of sourceFile.getExportDeclarations()) {\n if (declaration.isTypeOnly()) {\n continue;\n }\n\n const specifier = declaration.getModuleSpecifierValue();\n if (specifier !== undefined) {\n specifiers.push(specifier);\n }\n }\n\n return specifiers;\n}\n\nfunction resolveRelativeModuleSpecifier(\n importerPath: string,\n specifier: string,\n readSourceText: (filePath: string) => string | undefined\n): string | undefined {\n if (!specifier.startsWith(\".\")) {\n return undefined;\n }\n\n const importerDir = path.posix.dirname(importerPath);\n const candidateBase = normalizeFilePath(path.posix.resolve(importerDir, specifier));\n const candidates = createModuleCandidates(candidateBase);\n\n return candidates.find((candidate) => readSourceText(candidate) !== undefined);\n}\n\nfunction createModuleCandidates(candidateBase: string): string[] {\n const extension = path.posix.extname(candidateBase);\n\n if (extension === \".js\" || extension === \".mjs\" || extension === \".cjs\") {\n const withoutExtension = candidateBase.slice(0, -extension.length);\n return [\n `${withoutExtension}.ts`,\n `${withoutExtension}.tsx`,\n `${withoutExtension}.mts`,\n `${withoutExtension}.cts`,\n candidateBase\n ];\n }\n\n if (extension !== \"\") {\n return [candidateBase];\n }\n\n return [\n `${candidateBase}.ts`,\n `${candidateBase}.tsx`,\n `${candidateBase}/index.ts`,\n `${candidateBase}/index.tsx`\n ];\n}\n\nfunction extractScopeFragments(sourceFile: SourceFile): ScopeFragment[] {\n const defineScopeNames = getDefineScopeImportNames(sourceFile);\n if (defineScopeNames.size === 0) {\n return [];\n }\n\n const exportedDeclarations = sourceFile.getExportedDeclarations();\n const fragments: ScopeFragment[] = [];\n\n for (const statement of sourceFile.getVariableStatements()) {\n for (const declaration of statement.getDeclarations()) {\n const name = declaration.getName();\n if (!exportedDeclarations.has(name)) {\n continue;\n }\n\n const initializer = declaration.getInitializer();\n if (!Node.isCallExpression(initializer)) {\n continue;\n }\n\n const expression = initializer.getExpression();\n if (!Node.isIdentifier(expression) || !defineScopeNames.has(expression.getText())) {\n continue;\n }\n\n fragments.push(extractScopeFragment(sourceFile.getFilePath(), initializer));\n }\n }\n\n return fragments;\n}\n\nfunction getDefineScopeImportNames(sourceFile: SourceFile): Set<string> {\n const names = new Set<string>();\n\n for (const declaration of sourceFile.getImportDeclarations()) {\n if (declaration.getModuleSpecifierValue() !== \"@poe-code/poe-code-config\") {\n continue;\n }\n\n for (const namedImport of declaration.getNamedImports()) {\n if (namedImport.getName() !== \"defineScope\") {\n continue;\n }\n\n names.add(namedImport.getAliasNode()?.getText() ?? namedImport.getName());\n }\n }\n\n return names;\n}\n\nfunction extractScopeFragment(\n sourceFilePath: string,\n callExpression: CallExpression\n): ScopeFragment {\n const [scopeArg, schemaArg] = callExpression.getArguments();\n\n if (!Node.isStringLiteral(scopeArg)) {\n throw new Error(`${sourceFilePath}: defineScope scope name must be a string literal`);\n }\n\n if (!Node.isObjectLiteralExpression(schemaArg)) {\n throw new Error(`${sourceFilePath}: defineScope schema must be an object literal`);\n }\n\n const scopeName = scopeArg.getLiteralText();\n assertSafeSchemaName(scopeName, sourceFilePath);\n\n return {\n scope: scopeName,\n fields: extractScopeFields(sourceFilePath, scopeName, schemaArg),\n sourceFilePath\n };\n}\n\nfunction extractScopeFields(\n sourceFilePath: string,\n scopeName: string,\n schemaObject: ObjectLiteralExpression\n): Record<string, CollectedField> {\n const fields: Record<string, CollectedField> = {};\n const seenFieldNames = new Set<string>();\n\n for (const property of schemaObject.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n throw new Error(`${sourceFilePath}: scope schema fields must be property assignments`);\n }\n\n const fieldName = getPropertyName(property.getNameNode(), sourceFilePath);\n if (seenFieldNames.has(fieldName)) {\n throw new Error(`Duplicate config field \"${scopeName}.${fieldName}\" in ${sourceFilePath}`);\n }\n seenFieldNames.add(fieldName);\n\n const initializer = property.getInitializer();\n if (!Node.isObjectLiteralExpression(initializer)) {\n throw new Error(`${sourceFilePath}: config field \"${fieldName}\" must be an object literal`);\n }\n\n fields[fieldName] = extractConfigField(sourceFilePath, fieldName, initializer);\n }\n\n return fields;\n}\n\nfunction extractConfigField(\n sourceFilePath: string,\n fieldName: string,\n fieldObject: ObjectLiteralExpression\n): CollectedField {\n const metadata = extractFieldMetadataExpressions(sourceFilePath, fieldObject);\n const typeExpression = metadata.get(\"type\");\n if (typeExpression === undefined) {\n throw new Error(`${sourceFilePath}: config field \"${fieldName}\" type must be a string literal`);\n }\n\n const type = extractLiteralValue(sourceFilePath, typeExpression);\n if (type === \"json\") {\n throw new Error(\n `${sourceFilePath}: config field \"${fieldName}\" uses json, which schema compilation does not support yet`\n );\n }\n\n validateFieldMetadataKeys(sourceFilePath, fieldName, metadata);\n\n if (type !== \"string\" && type !== \"number\" && type !== \"boolean\") {\n throw new Error(\n `${sourceFilePath}: config field \"${fieldName}\" must use a primitive type supported by schema compilation`\n );\n }\n\n const defaultValue = extractOptionalLiteralValue(sourceFilePath, metadata.get(\"default\"));\n const doc = extractOptionalLiteralValue(sourceFilePath, metadata.get(\"doc\"));\n const env = extractOptionalLiteralValue(sourceFilePath, metadata.get(\"env\"));\n\n if (typeof defaultValue !== type) {\n throw new Error(`${sourceFilePath}: config field \"${fieldName}\" default must match its type`);\n }\n\n if (typeof doc !== \"string\") {\n throw new Error(`${sourceFilePath}: config field \"${fieldName}\" doc must be a string literal`);\n }\n\n if (env !== undefined && typeof env !== \"string\") {\n throw new Error(`${sourceFilePath}: config field \"${fieldName}\" env must be a string literal`);\n }\n\n if (type === \"string\" && typeof defaultValue === \"string\") {\n return {\n type,\n default: defaultValue,\n doc,\n ...(env === undefined ? {} : { env })\n };\n }\n\n if (type === \"number\" && typeof defaultValue === \"number\") {\n return {\n type,\n default: defaultValue,\n doc,\n ...(env === undefined ? {} : { env })\n };\n }\n\n if (type === \"boolean\" && typeof defaultValue === \"boolean\") {\n return {\n type,\n default: defaultValue,\n doc,\n ...(env === undefined ? {} : { env })\n };\n }\n\n throw new Error(`${sourceFilePath}: config field \"${fieldName}\" default must match its type`);\n}\n\nfunction extractFieldMetadataExpressions(\n sourceFilePath: string,\n fieldObject: ObjectLiteralExpression\n): Map<string, Expression> {\n const metadata = new Map<string, Expression>();\n\n for (const property of fieldObject.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n throw new Error(`${sourceFilePath}: object literals in config schemas must be static`);\n }\n\n const metadataName = getPropertyName(property.getNameNode(), sourceFilePath);\n if (metadata.has(metadataName)) {\n throw new Error(`${sourceFilePath}: duplicate object literal key \"${metadataName}\"`);\n }\n\n metadata.set(metadataName, property.getInitializerOrThrow());\n }\n\n return metadata;\n}\n\nfunction extractObjectLiteral(\n sourceFilePath: string,\n objectLiteral: ObjectLiteralExpression\n): Record<string, LiteralValue> {\n const value: Record<string, LiteralValue> = {};\n const seenNames = new Set<string>();\n\n for (const property of objectLiteral.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n throw new Error(`${sourceFilePath}: object literals in config schemas must be static`);\n }\n\n const propertyName = getPropertyName(property.getNameNode(), sourceFilePath);\n if (seenNames.has(propertyName)) {\n throw new Error(`${sourceFilePath}: duplicate object literal key \"${propertyName}\"`);\n }\n seenNames.add(propertyName);\n\n value[propertyName] = extractLiteralValue(sourceFilePath, property.getInitializerOrThrow());\n }\n\n return value;\n}\n\nfunction validateFieldMetadataKeys(\n sourceFilePath: string,\n fieldName: string,\n metadata: ReadonlyMap<string, Expression>\n): void {\n for (const metadataName of metadata.keys()) {\n if (!supportedFieldMetadata.has(metadataName)) {\n throw new Error(\n `${sourceFilePath}: Unsupported metadata \"${metadataName}\" on config field \"${fieldName}\"`\n );\n }\n }\n}\n\nfunction extractOptionalLiteralValue(\n sourceFilePath: string,\n expression: Expression | undefined\n): LiteralValue | undefined {\n if (expression === undefined) {\n return undefined;\n }\n\n return extractLiteralValue(sourceFilePath, expression);\n}\n\nfunction extractLiteralValue(sourceFilePath: string, expression: Expression): LiteralValue {\n if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.getLiteralText();\n }\n\n if (Node.isNumericLiteral(expression)) {\n return Number(expression.getLiteralText());\n }\n\n if (expression.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (expression.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (expression.getKind() === SyntaxKind.NullKeyword) {\n return null;\n }\n\n if (Node.isObjectLiteralExpression(expression)) {\n return extractObjectLiteral(sourceFilePath, expression);\n }\n\n if (Node.isArrayLiteralExpression(expression)) {\n throw new Error(`${sourceFilePath}: array literals are not supported in v1 config schemas`);\n }\n\n throw new Error(`${sourceFilePath}: config schemas must contain only static literal values`);\n}\n\nfunction getPropertyName(nameNode: PropertyName, sourceFilePath: string): string {\n if (Node.isIdentifier(nameNode) || Node.isStringLiteral(nameNode)) {\n const propertyName = Node.isIdentifier(nameNode)\n ? nameNode.getText()\n : nameNode.getLiteralText();\n assertSafeSchemaName(propertyName, sourceFilePath);\n return propertyName;\n }\n\n throw new Error(`${sourceFilePath}: config schema property names must be static`);\n}\n\nfunction assertSafeSchemaName(name: string, sourceFilePath: string): void {\n if (unsafeSchemaNames.has(name)) {\n throw new Error(`${sourceFilePath}: Unsafe config schema name \"${name}\"`);\n }\n}\n\nfunction mergeScopeFragments(\n fragments: readonly ScopeFragment[]\n): Map<string, Record<string, CollectedField>> {\n const merged = new Map<string, Record<string, CollectedField>>();\n const fieldOrigins = new Map<string, string>();\n\n for (const fragment of fragments) {\n const scope = merged.get(fragment.scope) ?? {};\n\n for (const [fieldName, field] of Object.entries(fragment.fields)) {\n const fieldKey = `${fragment.scope}.${fieldName}`;\n const previousOrigin = fieldOrigins.get(fieldKey);\n if (previousOrigin !== undefined) {\n throw new Error(\n `Duplicate config field \"${fieldKey}\" in ${fragment.sourceFilePath}; first defined in ${previousOrigin}`\n );\n }\n\n scope[fieldName] = field;\n fieldOrigins.set(fieldKey, fragment.sourceFilePath);\n }\n\n merged.set(fragment.scope, scope);\n }\n\n return merged;\n}\n\nfunction fieldToToolcraftSchema(field: CollectedField): AnySchema {\n switch (field.type) {\n case \"string\":\n return S.String({ default: field.default, description: field.doc });\n case \"number\":\n return S.Number({ default: field.default, description: field.doc });\n case \"boolean\":\n return S.Boolean({ default: field.default, description: field.doc });\n }\n}\n\nfunction normalizeFilePath(filePath: string): string {\n return path.posix.normalize(filePath.replaceAll(path.win32.sep, path.posix.sep));\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 { JsonSchema } from \"./index.js\";\n\nexport interface JsonSchemaDocumentOptions {\n id?: string;\n title?: string;\n description?: string;\n schema?: string;\n}\n\nexport type JsonSchemaDocument = JsonSchema & {\n $schema: string;\n $id?: string;\n title?: string;\n description?: string;\n};\n\nexport function createJsonSchemaDocument(\n jsonSchema: JsonSchema,\n options: JsonSchemaDocumentOptions = {}\n): JsonSchemaDocument {\n const {\n id,\n schema: schemaUri = \"https://json-schema.org/draft/2020-12/schema\",\n ...metadata\n } = options;\n const document: JsonSchemaDocument = {\n $schema: schemaUri,\n ...jsonSchema\n };\n\n if (id !== undefined) {\n document.$id = id;\n }\n\n if (metadata.title !== undefined) {\n document.title = metadata.title;\n }\n\n if (metadata.description !== undefined) {\n document.description = metadata.description;\n }\n\n return document;\n}\n", "import type { ObjectSchema, SchemaBase, Static } from \"./index.js\";\n\ntype OneOfStatic<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string,\n> = {\n [TBranchName in keyof TBranches & string]: Omit<Static<TBranches[TBranchName]>, TDiscriminator> & {\n [TFieldName in TDiscriminator]: TBranchName;\n };\n}[keyof TBranches & string];\n\nexport interface OneOfSchema<\n TBranches extends Record<string, ObjectSchema<any>>,\n TDiscriminator extends string = string,\n> extends SchemaBase<\"oneOf\", OneOfStatic<TBranches, TDiscriminator>> {\n readonly discriminator: TDiscriminator;\n readonly branches: TBranches;\n}\n\nfunction assertValidBranches(\n branches: Record<string, ObjectSchema<any>>,\n discriminator: string\n): void {\n if (Object.keys(branches).length === 0) {\n throw new Error(\"OneOf schema requires at least one branch\");\n }\n\n for (const [branchName, branch] of Object.entries(branches)) {\n if (Object.prototype.hasOwnProperty.call(branch.shape, discriminator)) {\n throw new Error(\n `OneOf branch \"${branchName}\" must not declare discriminator field \"${discriminator}\".`\n );\n }\n }\n}\n\nexport function OneOf<\n TDiscriminator extends string,\n TBranches extends Record<string, ObjectSchema<any>>,\n>(config: {\n discriminator: TDiscriminator;\n branches: TBranches;\n}): OneOfSchema<TBranches, TDiscriminator> {\n assertValidBranches(config.branches, config.discriminator);\n\n return {\n kind: \"oneOf\",\n discriminator: config.discriminator,\n branches: config.branches,\n };\n}\n", "import type { AnySchema, SchemaBase, Static } from \"./index.js\";\n\nexport interface RecordSchema<TValue extends AnySchema>\n extends SchemaBase<\"record\", Record<string, Static<TValue>>> {\n readonly value: TValue;\n}\n\nexport function Record<TValue extends AnySchema>(value: TValue): RecordSchema<TValue> {\n return {\n kind: \"record\",\n value,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, SchemaBase, Static } from \"./index.js\";\n\ntype UnionStatic<TBranches extends readonly ObjectSchema<any>[]> = Static<TBranches[number]>;\n\nexport interface UnionSchema<TBranches extends readonly ObjectSchema<any>[]>\n extends SchemaBase<\"union\", UnionStatic<TBranches>> {\n readonly branches: TBranches;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction getRequiredKeys(schema: ObjectSchema<any>): string[] {\n return Object.keys(schema.shape)\n .filter((key) => !isOptionalSchema(schema.shape[key] as AnySchema))\n .sort();\n}\n\nexport function getRequiredKeyFingerprint(schema: ObjectSchema<any>): string {\n return getRequiredKeys(schema).join(\"+\");\n}\n\nfunction assertUniqueRequiredKeyFingerprints(branches: readonly ObjectSchema<any>[]): void {\n const fingerprints = new Map<string, { display: string; indices: number[] }>();\n\n branches.forEach((branch, index) => {\n const requiredKeys = getRequiredKeys(branch);\n const fingerprint = JSON.stringify(requiredKeys);\n const existing = fingerprints.get(fingerprint);\n\n if (existing === undefined) {\n fingerprints.set(fingerprint, {\n display: requiredKeys.join(\"+\"),\n indices: [index],\n });\n return;\n }\n\n existing.indices.push(index);\n });\n\n for (const { display, indices } of fingerprints.values()) {\n if (indices.length > 1) {\n throw new Error(\n `Union branches [${indices.join(\", \")}] share required-key fingerprint \"${display}\". Each branch must require a distinct set of keys.`\n );\n }\n }\n}\n\nfunction assertValidBranches(branches: readonly ObjectSchema<any>[]): void {\n if (branches.length === 0) {\n throw new Error(\"Union schema requires at least one branch\");\n }\n\n assertUniqueRequiredKeyFingerprints(branches);\n}\n\nexport function Union<const TBranches extends readonly ObjectSchema<any>[]>(\n branches: TBranches\n): UnionSchema<TBranches> {\n assertValidBranches(branches);\n\n return {\n kind: \"union\",\n branches,\n };\n}\n", "import type { AnySchema, ObjectSchema, OptionalSchema, Static } from \"./index.js\";\nimport { getRequiredKeyFingerprint } from \"./union.js\";\n\nexport type SchemaDescriptor = AnySchema;\n\nexport type ValidationIssue = {\n path: readonly string[];\n expected: string;\n received: string;\n message: string;\n keyword?: string;\n};\n\nexport type ValidationResult<T> =\n | { ok: true; value: T }\n | { ok: false; issues: readonly ValidationIssue[] };\n\ntype ValidationState = {\n issues: ValidationIssue[];\n};\n\ntype WalkResult = { present: true; value: unknown } | { present: false };\n\nconst missingValue = Symbol(\"missingValue\");\n\nexport function validate<S extends SchemaDescriptor>(\n schema: S,\n value: unknown\n): ValidationResult<Static<S>> {\n const state: ValidationState = { issues: [] };\n const result = walkSchema(schema, value, [], state);\n\n if (state.issues.length > 0) {\n return { ok: false, issues: state.issues };\n }\n\n return { ok: true, value: (result.present ? result.value : undefined) as Static<S> };\n}\n\nfunction walkSchema(\n schema: AnySchema,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (schema.kind === \"optional\") {\n return walkOptional(schema, value, path, state);\n }\n\n if (value === missingValue) {\n addIssue(\n state,\n path,\n expectedFor(schema),\n \"missing\",\n `Expected ${expectedFor(schema)} at ${formatPath(path)}`\n );\n return { present: false };\n }\n\n if (value === null && schema.nullable === true) {\n return { present: true, value };\n }\n\n switch (schema.kind) {\n case \"string\":\n return walkString(schema, value, path, state);\n\n case \"number\":\n return walkNumber(schema, value, path, state);\n\n case \"boolean\":\n return walkBoolean(value, path, state);\n\n case \"enum\":\n return walkEnum(schema, value, path, state);\n\n case \"array\":\n return walkArray(schema, value, path, state);\n\n case \"object\":\n return walkObject(schema, value, path, state);\n\n case \"oneOf\":\n return walkOneOf(schema, value, path, state);\n\n case \"union\":\n return walkUnion(schema, value, path, state);\n\n case \"record\":\n return walkRecord(schema, value, path, state);\n\n case \"json\":\n return walkJson(value, path, state);\n }\n}\n\nfunction walkOptional(\n schema: OptionalSchema<AnySchema>,\n value: unknown | typeof missingValue,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (value === missingValue || value === undefined) {\n const defaultValue = getDefault(schema.inner);\n\n if (defaultValue.present) {\n return walkSchema(schema.inner, cloneDefault(defaultValue.value), path, state);\n }\n\n return { present: false };\n }\n\n return walkSchema(schema.inner, value, path, state);\n}\n\nfunction walkString(\n schema: Extract<AnySchema, { kind: \"string\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"string\") {\n addExpectedIssue(state, path, \"string\", value);\n return { present: true, value };\n }\n\n if (schema.minLength !== undefined && value.length < schema.minLength) {\n const expected = `string with length at least ${schema.minLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxLength !== undefined && value.length > schema.maxLength) {\n const expected = `string with length at most ${schema.maxLength}`;\n addIssue(\n state,\n path,\n expected,\n `string with length ${value.length}`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.pattern !== undefined) {\n const pattern = compilePattern(schema.pattern);\n\n if (pattern === undefined || !pattern.test(value)) {\n const expected = `string matching pattern ${schema.pattern}`;\n addIssue(state, path, expected, value, `Expected ${expected} at ${formatPath(path)}`);\n }\n }\n\n return { present: true, value };\n}\n\nfunction walkNumber(\n schema: Extract<AnySchema, { kind: \"number\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n addExpectedIssue(state, path, schema.jsonType === \"integer\" ? \"integer\" : \"number\", value);\n return { present: true, value };\n }\n\n if (schema.jsonType === \"integer\" && !Number.isInteger(value)) {\n addExpectedIssue(state, path, \"integer\", value);\n }\n\n if (schema.minimum !== undefined && value < schema.minimum) {\n const expected = `number greater than or equal to ${schema.minimum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n if (schema.maximum !== undefined && value > schema.maximum) {\n const expected = `number less than or equal to ${schema.maximum}`;\n addIssue(state, path, expected, String(value), `Expected ${expected} at ${formatPath(path)}`);\n }\n\n return { present: true, value };\n}\n\nfunction walkBoolean(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (typeof value !== \"boolean\") {\n addExpectedIssue(state, path, \"boolean\", value);\n }\n\n return { present: true, value };\n}\n\nfunction walkEnum(\n schema: Extract<AnySchema, { kind: \"enum\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!schema.values.includes(value as never)) {\n const expected = `one of ${schema.values.join(\", \")}`;\n addIssue(\n state,\n path,\n expected,\n receivedValue(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n return { present: true, value };\n}\n\nfunction walkArray(\n schema: Extract<AnySchema, { kind: \"array\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!Array.isArray(value)) {\n addExpectedIssue(state, path, \"array\", value);\n return { present: true, value };\n }\n\n if (schema.minItems !== undefined && value.length < schema.minItems) {\n const expected = `array with at least ${schema.minItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n if (schema.maxItems !== undefined && value.length > schema.maxItems) {\n const expected = `array with at most ${schema.maxItems} items`;\n addIssue(\n state,\n path,\n expected,\n `array with ${value.length} items`,\n `Expected ${expected} at ${formatPath(path)}`\n );\n }\n\n const nextValue = value.map((item, index) => {\n const result = walkSchema(schema.item, item, [...path, String(index)], state);\n\n return result.present ? result.value : item;\n });\n\n return { present: true, value: nextValue };\n}\n\nfunction walkObject(\n schema: ObjectSchema<any>,\n value: unknown,\n path: readonly string[],\n state: ValidationState,\n injectedProperties: Record<string, unknown> = {}\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n const allowedKeys = new Set([...Object.keys(schema.shape), ...Object.keys(injectedProperties)]);\n\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n const propertyValue = Object.hasOwn(value, key) ? value[key] : missingValue;\n const result = walkSchema(propertySchema, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n for (const [key, injectedValue] of Object.entries(injectedProperties)) {\n if (Object.hasOwn(value, key)) {\n setOwnValue(nextValue, key, value[key]);\n } else {\n setOwnValue(nextValue, key, injectedValue);\n }\n }\n\n for (const [key, propertyValue] of Object.entries(value)) {\n if (allowedKeys.has(key)) {\n continue;\n }\n\n if (schema.additionalProperties === true) {\n setOwnValue(nextValue, key, propertyValue);\n } else {\n addUnexpectedPropertyIssue(state, [...path, key]);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkOneOf(\n schema: Extract<AnySchema, { kind: \"oneOf\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const discriminatorValue = value[schema.discriminator];\n const discriminatorPath = [...path, schema.discriminator];\n const branchValues = Object.keys(schema.branches);\n const expected = `one of ${branchValues.join(\", \")}`;\n\n if (!Object.hasOwn(value, schema.discriminator)) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n \"missing\",\n `Missing discriminator \"${schema.discriminator}\" at ${formatPath(path)}. Expected one of: ${branchValues.join(\", \")}.`\n );\n return { present: true, value };\n }\n\n if (\n typeof discriminatorValue !== \"string\" ||\n !Object.hasOwn(schema.branches, discriminatorValue)\n ) {\n addIssueWithMessage(\n state,\n discriminatorPath,\n expected,\n receivedValue(discriminatorValue),\n `Expected ${expected} at ${formatPath(discriminatorPath)}, got ${formatReceivedDiscriminator(discriminatorValue)}`\n );\n return { present: true, value };\n }\n\n return walkObject(schema.branches[discriminatorValue], value, path, state, {\n [schema.discriminator]: discriminatorValue\n });\n}\n\nfunction walkUnion(\n schema: Extract<AnySchema, { kind: \"union\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (isPlainRecord(value)) {\n const candidateBranches = schema.branches.filter((branch) => hasRequiredKeys(branch, value));\n\n if (candidateBranches.length === 1) {\n return walkObject(candidateBranches[0], value, path, state);\n }\n }\n\n const matches: Array<{ fingerprint: string; value: unknown }> = [];\n\n for (const branch of schema.branches) {\n const branchState: ValidationState = { issues: [] };\n const result = walkObject(branch, value, path, branchState);\n\n if (branchState.issues.length === 0 && result.present) {\n matches.push({ fingerprint: getRequiredKeyFingerprint(branch), value: result.value });\n }\n }\n\n if (matches.length === 1) {\n return { present: true, value: matches[0].value };\n }\n\n if (matches.length === 0) {\n const branchDescriptions = schema.branches.map((branch) => getRequiredKeyFingerprint(branch));\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n \"0 matching branches\",\n `No union branch matched at ${formatPath(path)}. Tried ${schema.branches.length} branches. Expected one of: ${branchDescriptions.join(\" | \")}.`\n );\n return { present: true, value };\n }\n\n addIssueWithMessage(\n state,\n path,\n \"exactly one union branch\",\n `${matches.length} matching branches`,\n `Expected exactly one union branch at ${formatPath(path)}, but matched more than one branch: ${matches.map((match) => match.fingerprint).join(\" | \")}`\n );\n return { present: true, value };\n}\n\nfunction hasRequiredKeys(schema: ObjectSchema<any>, value: Record<string, unknown>): boolean {\n for (const [key, propertySchema] of Object.entries(schema.shape) as Array<[string, AnySchema]>) {\n if (propertySchema.kind !== \"optional\" && !Object.hasOwn(value, key)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction walkRecord(\n schema: Extract<AnySchema, { kind: \"record\" }>,\n value: unknown,\n path: readonly string[],\n state: ValidationState\n): WalkResult {\n if (!isPlainRecord(value)) {\n addExpectedIssue(state, path, \"object\", value);\n return { present: true, value };\n }\n\n const nextValue: Record<string, unknown> = {};\n\n for (const [key, propertyValue] of Object.entries(value)) {\n const result = walkSchema(schema.value, propertyValue, [...path, key], state);\n\n if (result.present) {\n setOwnValue(nextValue, key, result.value);\n }\n }\n\n return { present: true, value: nextValue };\n}\n\nfunction walkJson(value: unknown, path: readonly string[], state: ValidationState): WalkResult {\n if (isJsonValue(value)) {\n return { present: true, value };\n }\n\n addExpectedIssue(state, path, \"JSON value\", value);\n return { present: true, value };\n}\n\nfunction getDefault(schema: AnySchema): WalkResult {\n if (schema.default !== undefined) {\n return { present: true, value: schema.default };\n }\n\n if (schema.kind === \"optional\") {\n return getDefault(schema.inner);\n }\n\n return { present: false };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, ancestors: Set<object> = new Set()): boolean {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return typeof value !== \"number\" || Number.isFinite(value);\n }\n\n if (Array.isArray(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = value.every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n if (isPlainRecord(value)) {\n if (ancestors.has(value)) {\n return false;\n }\n ancestors.add(value);\n const result = Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return result;\n }\n\n return false;\n}\n\nfunction cloneDefault(value: unknown): unknown {\n return structuredClone(value);\n}\n\nfunction setOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n writable: true,\n value\n });\n}\n\nfunction expectedFor(schema: AnySchema): string {\n switch (schema.kind) {\n case \"string\":\n return \"string\";\n case \"number\":\n return schema.jsonType === \"integer\" ? \"integer\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"enum\":\n return `one of ${schema.values.join(\", \")}`;\n case \"array\":\n return \"array\";\n case \"object\":\n case \"oneOf\":\n case \"record\":\n return \"object\";\n case \"union\":\n return \"exactly one union branch\";\n case \"json\":\n return \"JSON value\";\n case \"optional\":\n return expectedFor(schema.inner);\n }\n}\n\nfunction addExpectedIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n value: unknown\n): void {\n addIssue(\n state,\n path,\n expected,\n receivedType(value),\n `Expected ${expected} at ${formatPath(path)}`\n );\n}\n\nfunction addUnexpectedPropertyIssue(state: ValidationState, path: readonly string[]): void {\n addIssue(\n state,\n path,\n \"no additional properties\",\n \"unknown property\",\n `Unexpected property ${formatPath(path)}`\n );\n}\n\nfunction addIssue(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n _message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message: formatIssueMessage(expected, path, received)\n });\n}\n\nfunction addIssueWithMessage(\n state: ValidationState,\n path: readonly string[],\n expected: string,\n received: string,\n message: string\n): void {\n state.issues.push({\n path,\n expected,\n received,\n message\n });\n}\n\nfunction formatIssueMessage(expected: string, path: readonly string[], received: string): string {\n return `Expected ${expected} at ${formatPath(path)}, got ${received}`;\n}\n\nfunction formatPath(path: readonly string[]): string {\n return path.length === 0 ? \"value\" : path.join(\".\");\n}\n\nfunction compilePattern(pattern: string): RegExp | undefined {\n try {\n return new RegExp(pattern);\n } catch {\n return undefined;\n }\n}\n\nfunction receivedType(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n\n if (Array.isArray(value)) {\n return \"array\";\n }\n\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return \"integer\";\n }\n\n return typeof value;\n}\n\nfunction receivedValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"undefined\";\n }\n\n return String(value);\n}\n\nfunction formatReceivedDiscriminator(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n return receivedValue(value);\n}\n", "import type {\n CompileJsonSchemaOptions,\n Dialect,\n JsonSchema,\n SchemaNode,\n SchemaObject\n} from \"./types.js\";\nimport {\n dialectFor,\n escapePointer,\n fragmentOf,\n isObject,\n isSchema,\n resolveUri,\n withoutFragment\n} from \"./utils.js\";\n\nconst schemaMapKeywords = new Set([\n \"$defs\",\n \"definitions\",\n \"properties\",\n \"patternProperties\",\n \"dependentSchemas\",\n \"dependencies\"\n]);\nconst schemaArrayKeywords = new Set([\"allOf\", \"anyOf\", \"oneOf\", \"prefixItems\"]);\nconst schemaKeywords = new Set([\n \"additionalItems\",\n \"additionalProperties\",\n \"contains\",\n \"else\",\n \"if\",\n \"items\",\n \"not\",\n \"propertyNames\",\n \"then\",\n \"unevaluatedItems\",\n \"unevaluatedProperties\"\n]);\nconst draftTypes = [\"null\", \"boolean\", \"object\", \"array\", \"number\", \"integer\", \"string\"];\nconst draftTypeSet = new Set(draftTypes);\nconst metaSchemaKeywordProperties = {\n type: {\n anyOf: [\n { enum: draftTypes },\n { type: \"array\", items: { enum: draftTypes }, minItems: 1, uniqueItems: true }\n ]\n },\n minLength: { type: \"integer\", minimum: 0 },\n maxLength: { type: \"integer\", minimum: 0 },\n minItems: { type: \"integer\", minimum: 0 },\n maxItems: { type: \"integer\", minimum: 0 },\n minProperties: { type: \"integer\", minimum: 0 },\n maxProperties: { type: \"integer\", minimum: 0 }\n};\nconst builtInRegistry: Record<string, unknown> = {\n \"https://json-schema.org/draft/2020-12/schema\": {\n $id: \"https://json-schema.org/draft/2020-12/schema\",\n type: [\"object\", \"boolean\"],\n properties: {\n ...metaSchemaKeywordProperties,\n $defs: { type: \"object\", additionalProperties: { $ref: \"#\" } }\n }\n },\n \"http://json-schema.org/draft-07/schema\": {\n $id: \"http://json-schema.org/draft-07/schema#\",\n type: [\"object\", \"boolean\"],\n properties: {\n ...metaSchemaKeywordProperties,\n definitions: { type: \"object\", additionalProperties: { $ref: \"#\" } }\n }\n }\n};\n\nexport interface CompiledGraph {\n root: SchemaNode;\n locations: Map<string, SchemaNode>;\n resources: Map<string, SchemaNode>;\n anchors: Map<string, SchemaNode>;\n dynamicAnchors: Map<string, SchemaNode>;\n resolve(node: SchemaNode, reference: string): SchemaNode;\n dynamicAnchor(scope: SchemaNode, name: string): SchemaNode | undefined;\n}\n\nfunction mapKey(dialect: Dialect, uri: string): string {\n return `${dialect}\\0${uri}`;\n}\n\nfunction assertSchemaArray(value: unknown, keyword: string): asserts value is JsonSchema[] {\n if (!Array.isArray(value) || value.length === 0 || !value.every(isSchema)) {\n throw new Error(`${keyword} must be a non-empty array of schemas.`);\n }\n}\n\nfunction assertStringArray(value: unknown, keyword: string): asserts value is string[] {\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`${keyword} must be an array of strings.`);\n }\n if (new Set(value).size !== value.length) {\n throw new Error(`${keyword} must contain unique strings.`);\n }\n}\n\nfunction assertSchemaMap(value: unknown, keyword: string): asserts value is SchemaObject {\n if (!isObject(value) || !Object.values(value).every(isSchema)) {\n throw new Error(`${keyword} must be an object containing schemas.`);\n }\n}\n\nfunction assertNonNegativeInteger(value: unknown, keyword: string): void {\n if (!Number.isInteger(value) || (value as number) < 0) {\n throw new Error(`${keyword} must be a non-negative integer.`);\n }\n}\n\nfunction validateSchemaObject(schema: SchemaObject, dialect: Dialect): void {\n if (schema.type !== undefined) {\n const types = Array.isArray(schema.type) ? schema.type : [schema.type];\n if (\n types.length === 0 ||\n !types.every((type) => typeof type === \"string\" && draftTypeSet.has(type)) ||\n new Set(types).size !== types.length\n ) {\n throw new Error(\"type must be a JSON Schema type or a unique array of JSON Schema types.\");\n }\n }\n for (const keyword of [\"minimum\", \"maximum\", \"exclusiveMinimum\", \"exclusiveMaximum\"] as const) {\n if (schema[keyword] !== undefined && typeof schema[keyword] !== \"number\") {\n throw new Error(`${keyword} must be a number.`);\n }\n }\n if (\n schema.multipleOf !== undefined &&\n (typeof schema.multipleOf !== \"number\" || schema.multipleOf <= 0)\n ) {\n throw new Error(\"multipleOf must be a number greater than zero.\");\n }\n for (const keyword of [\n \"minLength\",\n \"maxLength\",\n \"minItems\",\n \"maxItems\",\n \"minContains\",\n \"maxContains\",\n \"minProperties\",\n \"maxProperties\"\n ] as const) {\n if (schema[keyword] !== undefined) {\n assertNonNegativeInteger(schema[keyword], keyword);\n }\n }\n if (schema.pattern !== undefined && typeof schema.pattern !== \"string\") {\n throw new Error(\"pattern must be a string.\");\n }\n for (const keyword of [\"uniqueItems\", \"$recursiveAnchor\"] as const) {\n if (schema[keyword] !== undefined && typeof schema[keyword] !== \"boolean\") {\n throw new Error(`${keyword} must be a boolean.`);\n }\n }\n if (schema.required !== undefined) {\n assertStringArray(schema.required, \"required\");\n }\n if (schema.dependentRequired !== undefined) {\n if (!isObject(schema.dependentRequired)) {\n throw new Error(\"dependentRequired must be an object containing string arrays.\");\n }\n for (const dependencies of Object.values(schema.dependentRequired)) {\n assertStringArray(dependencies, \"dependentRequired\");\n }\n }\n for (const keyword of schemaMapKeywords) {\n const value = schema[keyword];\n if (value === undefined || keyword === \"dependencies\") continue;\n assertSchemaMap(value, keyword);\n }\n if (schema.dependencies !== undefined) {\n if (!isObject(schema.dependencies)) {\n throw new Error(\"dependencies must be an object containing schemas or string arrays.\");\n }\n for (const dependency of Object.values(schema.dependencies)) {\n if (!isSchema(dependency)) assertStringArray(dependency, \"dependencies\");\n }\n }\n for (const keyword of [\"allOf\", \"anyOf\", \"oneOf\"] as const) {\n if (schema[keyword] !== undefined) assertSchemaArray(schema[keyword], keyword);\n }\n if (schema.prefixItems !== undefined) {\n if (!Array.isArray(schema.prefixItems) || !schema.prefixItems.every(isSchema)) {\n throw new Error(\"prefixItems must be an array of schemas.\");\n }\n }\n for (const keyword of schemaKeywords) {\n const value = schema[keyword];\n if (value === undefined) continue;\n if (keyword === \"items\" && dialect === \"draft7\" && Array.isArray(value)) {\n if (!value.every(isSchema)) throw new Error(\"items must contain only schemas.\");\n } else if (!isSchema(value)) {\n throw new Error(`${keyword} must be a schema.`);\n }\n }\n if (schema.enum !== undefined && !Array.isArray(schema.enum)) {\n throw new Error(\"enum must be an array.\");\n }\n}\n\nexport function compileGraph(\n schema: unknown,\n options: CompileJsonSchemaOptions = {}\n): CompiledGraph {\n if (!isSchema(schema)) {\n throw new Error(\"JSON Schema must be a boolean or object.\");\n }\n\n const locations = new Map<string, SchemaNode>();\n const resources = new Map<string, SchemaNode>();\n const anchors = new Map<string, SchemaNode>();\n const dynamicAnchors = new Map<string, SchemaNode>();\n const nodesBySchema = new WeakMap<SchemaObject, SchemaNode[]>();\n const pendingReferences: Array<{ node: SchemaNode; reference: string }> = [];\n const registry = { ...builtInRegistry, ...options.registry };\n const rootBase = \"https://toolcraft.invalid/root\";\n\n function validationVocabularyFor(schemaObject: SchemaObject): boolean {\n const metaSchema = schemaObject.$schema;\n if (typeof metaSchema !== \"string\") {\n return true;\n }\n const registered = registry[metaSchema];\n if (!isObject(registered) || !isObject(registered.$vocabulary)) {\n return true;\n }\n return Object.prototype.hasOwnProperty.call(\n registered.$vocabulary,\n \"https://json-schema.org/draft/2020-12/vocab/validation\"\n );\n }\n\n function recordNode(schemaObject: SchemaObject | undefined, node: SchemaNode): void {\n if (schemaObject === undefined) {\n return;\n }\n const nodes = nodesBySchema.get(schemaObject) ?? [];\n nodes.push(node);\n nodesBySchema.set(schemaObject, nodes);\n }\n\n function setLocation(dialect: Dialect, uri: string, node: SchemaNode): void {\n locations.set(mapKey(dialect, uri), node);\n }\n\n function scan(\n currentSchema: JsonSchema,\n inheritedDialect: Dialect,\n inheritedBase: string,\n resourceRoot: SchemaNode | undefined,\n pointer: string,\n validationVocabulary: boolean,\n documentId: string\n ): SchemaNode {\n const schemaObject = isObject(currentSchema) ? currentSchema : undefined;\n const dialect =\n schemaObject === undefined ? inheritedDialect : dialectFor(schemaObject, inheritedDialect);\n if (schemaObject !== undefined) {\n validateSchemaObject(schemaObject, dialect);\n }\n const declaredId =\n dialect === \"draft7\" ? (schemaObject?.$id ?? schemaObject?.id) : schemaObject?.$id;\n const effectiveId =\n dialect === \"draft7\" && typeof schemaObject?.$ref === \"string\" ? undefined : declaredId;\n const baseUri =\n typeof effectiveId === \"string\" ? resolveUri(effectiveId, inheritedBase) : inheritedBase;\n const node = {\n schema: currentSchema,\n documentId,\n dialect,\n baseUri,\n resourceUri: resourceRoot?.resourceUri ?? withoutFragment(baseUri),\n resourceRoot: undefined as unknown as SchemaNode,\n pointer,\n validationVocabulary,\n children: new Map<string, SchemaNode>()\n };\n recordNode(schemaObject, node);\n\n if (resourceRoot !== undefined) {\n setLocation(\n resourceRoot.dialect,\n resolveUri(`#${encodeURI(pointer)}`, resourceRoot.resourceUri),\n node\n );\n }\n\n const startsResource =\n resourceRoot === undefined || withoutFragment(baseUri) !== resourceRoot.resourceUri;\n node.resourceRoot = startsResource ? node : resourceRoot;\n node.resourceUri = startsResource ? withoutFragment(baseUri) : resourceRoot.resourceUri;\n const resourcePointer = startsResource ? \"\" : pointer;\n node.pointer = resourcePointer;\n\n if (startsResource) {\n resources.set(mapKey(node.dialect, node.resourceUri), node);\n setLocation(node.dialect, node.resourceUri, node);\n }\n setLocation(node.dialect, resolveUri(`#${encodeURI(resourcePointer)}`, node.resourceUri), node);\n\n if (schemaObject === undefined) {\n return node;\n }\n\n if (typeof schemaObject.$anchor === \"string\") {\n anchors.set(mapKey(node.dialect, `${node.resourceUri}#${schemaObject.$anchor}`), node);\n }\n if (typeof schemaObject.$dynamicAnchor === \"string\") {\n const anchorUri = `${node.resourceUri}#${schemaObject.$dynamicAnchor}`;\n anchors.set(mapKey(node.dialect, anchorUri), node);\n dynamicAnchors.set(mapKey(node.dialect, anchorUri), node);\n }\n if (dialect === \"draft7\" && typeof effectiveId === \"string\" && fragmentOf(baseUri) !== \"\") {\n anchors.set(mapKey(dialect, baseUri), node);\n }\n for (const keyword of [\"$ref\", \"$dynamicRef\", \"$recursiveRef\"] as const) {\n const reference = schemaObject[keyword];\n if (reference !== undefined) {\n if (typeof reference !== \"string\") {\n throw new Error(`${keyword} must be a string.`);\n }\n pendingReferences.push({ node, reference });\n }\n }\n if (typeof schemaObject.pattern === \"string\") {\n new RegExp(schemaObject.pattern, \"u\");\n }\n if (isObject(schemaObject.patternProperties)) {\n for (const pattern of Object.keys(schemaObject.patternProperties)) {\n new RegExp(pattern, \"u\");\n }\n }\n\n const nextValidationVocabulary =\n resourceRoot === undefined ? validationVocabularyFor(schemaObject) : validationVocabulary;\n for (const [keyword, value] of Object.entries(schemaObject)) {\n if (schemaMapKeywords.has(keyword) && isObject(value)) {\n for (const [key, childSchema] of Object.entries(value)) {\n if (isSchema(childSchema)) {\n node.children.set(\n `${keyword}/${key}`,\n scan(\n childSchema,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/${escapePointer(keyword)}/${escapePointer(key)}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n }\n } else if (schemaArrayKeywords.has(keyword) && Array.isArray(value)) {\n value.forEach((childSchema, index) => {\n if (isSchema(childSchema)) {\n node.children.set(\n `${keyword}/${index}`,\n scan(\n childSchema,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/${escapePointer(keyword)}/${index}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n });\n } else if (schemaKeywords.has(keyword)) {\n if (keyword === \"items\" && Array.isArray(value)) {\n value.forEach((childSchema, index) => {\n if (isSchema(childSchema)) {\n node.children.set(\n `items/${index}`,\n scan(\n childSchema,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/items/${index}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n });\n } else if (isSchema(value)) {\n node.children.set(\n keyword,\n scan(\n value,\n dialect,\n baseUri,\n node.resourceRoot,\n `${resourcePointer}/${escapePointer(keyword)}`,\n nextValidationVocabulary,\n documentId\n )\n );\n }\n }\n }\n return node;\n }\n\n const root = scan(schema, \"draft2020-12\", rootBase, undefined, \"\", true, \"root\");\n resources.set(mapKey(root.dialect, rootBase), root);\n setLocation(root.dialect, rootBase, root);\n setLocation(root.dialect, `${rootBase}#`, root);\n\n for (const [uri, registeredSchema] of Object.entries(registry)) {\n if (!isSchema(registeredSchema)) {\n throw new Error(`Registered JSON Schema ${uri} must be a boolean or object.`);\n }\n for (const inheritedDialect of [\"draft2020-12\", \"draft7\"] as const) {\n const remote = scan(\n registeredSchema,\n inheritedDialect,\n uri,\n undefined,\n \"\",\n true,\n `${inheritedDialect}:${uri}`\n );\n resources.set(mapKey(remote.dialect, withoutFragment(uri)), remote);\n setLocation(remote.dialect, withoutFragment(uri), remote);\n setLocation(remote.dialect, `${withoutFragment(uri)}#`, remote);\n }\n }\n\n function findByDialect<T>(map: Map<string, T>, dialect: Dialect, uri: string): T | undefined {\n const alternate = dialect === \"draft7\" ? \"draft2020-12\" : \"draft7\";\n return map.get(mapKey(dialect, uri)) ?? map.get(mapKey(alternate, uri));\n }\n\n function resolve(node: SchemaNode, reference: string): SchemaNode {\n const absolute = resolveUri(reference, node.baseUri);\n const direct =\n findByDialect(locations, node.dialect, absolute) ??\n findByDialect(resources, node.dialect, absolute) ??\n findByDialect(anchors, node.dialect, absolute);\n if (direct !== undefined) {\n return direct;\n }\n const resource = findByDialect(resources, node.dialect, withoutFragment(absolute));\n const fragment = fragmentOf(absolute);\n if (resource !== undefined && fragment === \"\") {\n return resource;\n }\n if (fragment.startsWith(\"/\")) {\n const pointerTarget = findByDialect(\n locations,\n node.dialect,\n `${withoutFragment(absolute)}#${fragment}`\n );\n if (pointerTarget !== undefined) {\n return pointerTarget;\n }\n if (resource !== undefined && isObject(resource.schema)) {\n let target: unknown = resource.schema;\n for (const segment of fragment.slice(1).split(\"/\")) {\n if (!isObject(target) && !Array.isArray(target)) {\n target = undefined;\n break;\n }\n const key = decodeURIComponent(segment).replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\");\n target = Array.isArray(target) ? target[Number(key)] : target[key];\n }\n if (isObject(target)) {\n const targetNode = nodesBySchema\n .get(target)\n ?.find((candidate) => candidate.dialect === node.dialect);\n if (targetNode !== undefined) {\n return targetNode;\n }\n }\n }\n }\n throw new Error(`Unresolvable $ref: ${reference}`);\n }\n\n const reachableDocuments = new Set([root.documentId]);\n let discoveredDocument = true;\n while (discoveredDocument) {\n discoveredDocument = false;\n for (const pending of pendingReferences) {\n if (!reachableDocuments.has(pending.node.documentId)) {\n continue;\n }\n const target = resolve(pending.node, pending.reference);\n if (!reachableDocuments.has(target.documentId)) {\n reachableDocuments.add(target.documentId);\n discoveredDocument = true;\n }\n }\n }\n\n return {\n root,\n locations,\n resources,\n anchors,\n dynamicAnchors,\n resolve,\n dynamicAnchor(scope, name) {\n return dynamicAnchors.get(mapKey(scope.dialect, `${scope.resourceUri}#${name}`));\n }\n };\n}\n", "import { Json } from \"./json.js\";\nimport { createJsonSchemaDocument } from \"./json-schema-document.js\";\nimport { OneOf } from \"./oneof.js\";\nimport { Record as RecordBuilder } from \"./record.js\";\nimport { Union } from \"./union.js\";\nimport { validate } from \"./validate.js\";\nimport type { JsonValue, JsonValueSchema } from \"./json.js\";\nimport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nimport type { OneOfSchema } from \"./oneof.js\";\nimport type { RecordSchema } from \"./record.js\";\nimport type { UnionSchema } from \"./union.js\";\nimport type { ValidationIssue, ValidationResult } from \"./validate.js\";\n\ntype JsonSchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"array\" | \"object\";\ntype SchemaKind =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"enum\"\n | \"array\"\n | \"object\"\n | \"optional\"\n | \"oneOf\"\n | \"union\"\n | \"record\"\n | \"json\";\ntype EnumValue = string | number | boolean;\ntype JsonSchemaEnumValue = EnumValue | null;\ntype NumberJsonType = \"number\" | \"integer\";\ntype NonEmptyReadonlyArray<T> = readonly [T, ...T[]];\ntype ObjectShape = Record<string, AnySchema>;\ntype EmptyOptions = Record<never, never>;\ntype SchemaScope = \"cli\" | \"mcp\" | \"sdk\";\nexport type CliOutputMode = \"rich\" | \"md\" | \"json\";\nexport interface CliMissingParameterChoice<TValue> {\n label: string;\n value: TValue;\n}\nexport interface CliMissingParameterContext {\n commandPath: string;\n params: Readonly<Record<string, unknown>>;\n output: CliOutputMode;\n stdinTTY: boolean;\n stdoutTTY: boolean;\n}\nexport interface CliMissingParameterResolution<TValue> {\n choices: readonly CliMissingParameterChoice<TValue>[];\n message?: string;\n}\nexport interface CliSchemaOptions<TValue> {\n resolveMissing?: (\n context: CliMissingParameterContext\n ) =>\n | CliMissingParameterResolution<TValue>\n | undefined\n | Promise<CliMissingParameterResolution<TValue> | undefined>;\n}\ntype StringMetadata = {\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n secret?: boolean;\n};\ntype NumberMetadata = {\n maximum?: number;\n minimum?: number;\n secret?: boolean;\n};\ntype ArrayMetadata = {\n maxItems?: number;\n minItems?: number;\n};\ntype ObjectMetadata = {\n additionalProperties?: boolean;\n};\ntype OptionalKeys<TShape extends ObjectShape> = {\n [TKey in keyof TShape]: TShape[TKey] extends OptionalSchema<any> ? TKey : never;\n}[keyof TShape];\ntype RequiredKeys<TShape extends ObjectShape> = Exclude<keyof TShape, OptionalKeys<TShape>>;\n\ntype PropertyStatic<TSchema extends AnySchema> =\n TSchema extends OptionalSchema<infer TInner> ? Static<TInner> : Static<TSchema>;\n\ntype InferObject<TShape extends ObjectShape> = {\n [TKey in RequiredKeys<TShape>]: PropertyStatic<TShape[TKey]>;\n} & {\n [TKey in OptionalKeys<TShape>]?: PropertyStatic<TShape[TKey]>;\n};\n\ntype SchemaOptions<TDefault> = {\n cli?: CliSchemaOptions<TDefault>;\n description?: string;\n cliDescription?: string;\n cliAliases?: readonly string[];\n default?: TDefault;\n nullable?: boolean;\n requiredScopes?: readonly SchemaScope[];\n short?: string;\n scope?: readonly SchemaScope[];\n global?: boolean;\n};\n\ntype WithNullable<\n TSchema extends AnySchema,\n TOptions extends { nullable?: boolean }\n> = TOptions extends { readonly nullable: true } ? TSchema & { readonly nullable: true } : TSchema;\n\nexport interface SchemaBase<TKind extends SchemaKind, TStatic> {\n readonly kind: TKind;\n readonly cli?: CliSchemaOptions<TStatic>;\n readonly description?: string;\n readonly cliDescription?: string;\n readonly cliAliases?: readonly string[];\n readonly default?: TStatic;\n readonly nullable?: boolean;\n readonly requiredScopes?: readonly SchemaScope[];\n readonly short?: string;\n readonly scope?: readonly SchemaScope[];\n readonly global?: boolean;\n readonly __static?: TStatic;\n}\n\nexport interface JsonSchema {\n additionalProperties?: boolean | JsonSchema;\n type?: JsonSchemaType;\n description?: string;\n default?: unknown;\n enum?: ReadonlyArray<JsonSchemaEnumValue>;\n format?: string;\n items?: JsonSchema;\n maxItems?: number;\n maximum?: number;\n maxLength?: number;\n minItems?: number;\n minimum?: number;\n minLength?: number;\n nullable?: boolean;\n oneOf?: JsonSchema[];\n pattern?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n}\n\nexport interface StringSchema extends SchemaBase<\"string\", string>, StringMetadata {}\n\nexport interface NumberSchema extends SchemaBase<\"number\", number>, NumberMetadata {\n readonly jsonType?: NumberJsonType;\n}\n\nexport type BooleanSchema = SchemaBase<\"boolean\", boolean>;\n\nexport interface EnumSchema<TValues extends NonEmptyReadonlyArray<EnumValue>> extends SchemaBase<\n \"enum\",\n TValues[number]\n> {\n readonly values: TValues;\n readonly jsonType?: \"integer\";\n readonly labels?: Partial<Record<string, string>>;\n readonly loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n}\n\nexport interface ArraySchema<TItem extends AnySchema>\n extends SchemaBase<\"array\", Array<Static<TItem>>>, ArrayMetadata {\n readonly item: TItem;\n}\n\nexport interface ObjectSchema<TShape extends ObjectShape>\n extends SchemaBase<\"object\", InferObject<TShape>>, ObjectMetadata {\n readonly shape: TShape;\n}\n\nexport interface OptionalSchema<TInner extends AnySchema> extends SchemaBase<\n \"optional\",\n Static<TInner> | undefined\n> {\n readonly inner: TInner;\n}\n\nexport type AnySchema =\n | StringSchema\n | NumberSchema\n | BooleanSchema\n | EnumSchema<NonEmptyReadonlyArray<EnumValue>>\n | ArraySchema<AnySchema>\n | ObjectSchema<ObjectShape>\n | OptionalSchema<AnySchema>\n | OneOfSchema<Record<string, ObjectSchema<any>>, string>\n | UnionSchema<readonly ObjectSchema<any>[]>\n | RecordSchema<AnySchema>\n | JsonValueSchema;\n\nexport type Static<TSchema extends AnySchema> = TSchema extends { readonly nullable: true }\n ? TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic | null\n : never\n : TSchema extends SchemaBase<any, infer TStatic>\n ? TStatic\n : never;\n\nfunction withMetadata<TSchema extends AnySchema>(\n schema: TSchema,\n jsonSchema: JsonSchema\n): JsonSchema {\n if (schema.description !== undefined) {\n jsonSchema.description = schema.description;\n }\n\n if (schema.default !== undefined) {\n jsonSchema.default = schema.default;\n }\n\n if (schema.nullable === true) {\n jsonSchema.nullable = true;\n }\n\n return jsonSchema;\n}\n\nfunction withStringMetadata(schema: StringSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minLength !== undefined) {\n jsonSchema.minLength = schema.minLength;\n }\n\n if (schema.maxLength !== undefined) {\n jsonSchema.maxLength = schema.maxLength;\n }\n\n if (schema.pattern !== undefined) {\n jsonSchema.pattern = schema.pattern;\n }\n\n if (schema.format !== undefined) {\n jsonSchema.format = schema.format;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withNumberMetadata(schema: NumberSchema, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minimum !== undefined) {\n jsonSchema.minimum = schema.minimum;\n }\n\n if (schema.maximum !== undefined) {\n jsonSchema.maximum = schema.maximum;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withArrayMetadata(schema: ArraySchema<any>, jsonSchema: JsonSchema): JsonSchema {\n if (schema.minItems !== undefined) {\n jsonSchema.minItems = schema.minItems;\n }\n\n if (schema.maxItems !== undefined) {\n jsonSchema.maxItems = schema.maxItems;\n }\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction withObjectMetadata(schema: ObjectSchema<any>, jsonSchema: JsonSchema): JsonSchema {\n jsonSchema.additionalProperties = schema.additionalProperties ?? false;\n\n return withMetadata(schema, jsonSchema);\n}\n\nfunction getEnumJsonType(values: ReadonlyArray<EnumValue>): JsonSchemaType | undefined {\n const [firstValue] = values;\n\n if (firstValue === undefined) {\n return undefined;\n }\n\n const firstType = typeof firstValue;\n const isSinglePrimitiveType = values.every((value) => typeof value === firstType);\n\n if (!isSinglePrimitiveType) {\n return undefined;\n }\n\n if (firstType === \"string\" || firstType === \"number\" || firstType === \"boolean\") {\n return firstType;\n }\n\n return undefined;\n}\n\nfunction isOptionalSchema(schema: AnySchema): schema is OptionalSchema<AnySchema> {\n return schema.kind === \"optional\";\n}\n\nfunction assertValidEnumValues(values: ReadonlyArray<EnumValue>): void {\n if (values.length === 0) {\n throw new Error(\"Enum schema requires at least one value\");\n }\n\n const uniqueValues = new Set(values);\n\n if (uniqueValues.size !== values.length) {\n throw new Error(\"Enum schema values must be unique\");\n }\n\n if (values.some((value) => typeof value === \"number\" && !Number.isFinite(value))) {\n throw new Error(\"Enum schema numeric values must be finite\");\n }\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, name: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new Error(`${name} must be a non-negative integer`);\n }\n}\n\nfunction assertFiniteNumber(value: number | undefined, name: string): void {\n if (value !== undefined && !Number.isFinite(value)) {\n throw new Error(`${name} must be finite`);\n }\n}\n\nfunction assertMinMaxOrder(\n minimum: number | undefined,\n maximum: number | undefined,\n minimumName: string,\n maximumName: string\n): void {\n if (minimum !== undefined && maximum !== undefined && minimum > maximum) {\n throw new Error(`${minimumName} must be less than or equal to ${maximumName}`);\n }\n}\n\nfunction assertValidDefault(schema: AnySchema): void {\n if (schema.default === undefined) {\n return;\n }\n\n const result = validate(schema, schema.default);\n if (!result.ok) {\n throw new Error(\n `default must satisfy schema: ${result.issues[0]?.message ?? \"invalid default\"}`\n );\n }\n}\n\nfunction assertPattern(pattern: string | undefined): void {\n if (pattern === undefined) {\n return;\n }\n try {\n new RegExp(pattern);\n } catch {\n throw new Error(\"pattern must be a valid regular expression\");\n }\n}\n\nfunction unwrapOptional(schema: AnySchema): Exclude<AnySchema, OptionalSchema<AnySchema>> {\n if (isOptionalSchema(schema)) {\n return unwrapOptional(schema.inner);\n }\n\n return schema;\n}\n\nfunction withInjectedDiscriminator(\n schema: ObjectSchema<any>,\n discriminator: string,\n branchName: string\n): JsonSchema {\n const branchJsonSchema = toJsonSchema(schema);\n const properties = {\n ...(branchJsonSchema.properties ?? {}),\n [discriminator]: {\n type: \"string\",\n enum: [branchName]\n } satisfies JsonSchema\n };\n const required = [...new Set([...(branchJsonSchema.required ?? []), discriminator])];\n\n return {\n ...branchJsonSchema,\n type: \"object\",\n properties,\n required\n };\n}\n\nexport const S = {\n String<const TOptions extends SchemaOptions<string> & StringMetadata = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<StringSchema, TOptions> {\n assertNonNegativeInteger(options.minLength, \"minLength\");\n assertNonNegativeInteger(options.maxLength, \"maxLength\");\n assertMinMaxOrder(options.minLength, options.maxLength, \"minLength\", \"maxLength\");\n assertPattern(options.pattern);\n const schema: StringSchema = {\n kind: \"string\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<StringSchema, TOptions>;\n },\n\n Number<\n const TOptions extends SchemaOptions<number> & NumberMetadata & { jsonType?: NumberJsonType } =\n EmptyOptions\n >(options: TOptions = {} as TOptions): WithNullable<NumberSchema, TOptions> {\n assertFiniteNumber(options.minimum, \"minimum\");\n assertFiniteNumber(options.maximum, \"maximum\");\n assertMinMaxOrder(options.minimum, options.maximum, \"minimum\", \"maximum\");\n assertFiniteNumber(options.default, \"default\");\n if (\n options.jsonType === \"integer\" &&\n options.default !== undefined &&\n !Number.isInteger(options.default)\n ) {\n throw new Error(\"default must be an integer\");\n }\n const schema: NumberSchema = {\n kind: \"number\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<NumberSchema, TOptions>;\n },\n\n Boolean<const TOptions extends SchemaOptions<boolean> = EmptyOptions>(\n options: TOptions = {} as TOptions\n ): WithNullable<BooleanSchema, TOptions> {\n const schema: BooleanSchema = {\n kind: \"boolean\",\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<BooleanSchema, TOptions>;\n },\n\n Enum<\n const TValues extends NonEmptyReadonlyArray<EnumValue>,\n const TOptions extends SchemaOptions<TValues[number]> & {\n jsonType?: \"integer\";\n labels?: Partial<Record<string, string>>;\n loadOptions?:\n | (() => Array<{ label: string; value: string }>)\n | (() => Promise<Array<{ label: string; value: string }>>);\n } = EmptyOptions\n >(\n values: TValues,\n options: TOptions = {} as TOptions\n ): WithNullable<EnumSchema<TValues>, TOptions> {\n assertValidEnumValues(values);\n if (\n options.jsonType === \"integer\" &&\n values.some((value) => typeof value !== \"number\" || !Number.isInteger(value))\n ) {\n throw new Error(\"Integer enum values must be integers\");\n }\n\n const schema: EnumSchema<TValues> = {\n kind: \"enum\",\n values,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<EnumSchema<TValues>, TOptions>;\n },\n\n Array<\n TItem extends AnySchema,\n const TOptions extends SchemaOptions<Array<Static<TItem>>> & ArrayMetadata = EmptyOptions\n >(item: TItem, options: TOptions = {} as TOptions): WithNullable<ArraySchema<TItem>, TOptions> {\n assertNonNegativeInteger(options.minItems, \"minItems\");\n assertNonNegativeInteger(options.maxItems, \"maxItems\");\n assertMinMaxOrder(options.minItems, options.maxItems, \"minItems\", \"maxItems\");\n const schema: ArraySchema<TItem> = {\n kind: \"array\",\n item,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ArraySchema<TItem>, TOptions>;\n },\n\n Object<\n const TShape extends ObjectShape,\n const TOptions extends SchemaOptions<InferObject<TShape>> & ObjectMetadata = EmptyOptions\n >(\n shape: TShape,\n options: TOptions = {} as TOptions\n ): WithNullable<ObjectSchema<TShape>, TOptions> {\n const schema: ObjectSchema<TShape> = {\n kind: \"object\",\n shape,\n ...options\n };\n assertValidDefault(schema);\n return schema as WithNullable<ObjectSchema<TShape>, TOptions>;\n },\n\n Optional<TInner extends AnySchema>(inner: TInner): OptionalSchema<TInner> {\n return {\n kind: \"optional\",\n inner\n };\n },\n\n OneOf,\n\n Union,\n\n Record: RecordBuilder,\n\n Json\n} as const;\n\nexport function toJsonSchema(schema: AnySchema): JsonSchema {\n const unwrappedSchema = unwrapOptional(schema);\n\n switch (unwrappedSchema.kind) {\n case \"string\":\n return withStringMetadata(unwrappedSchema, { type: \"string\" });\n\n case \"number\":\n return withNumberMetadata(unwrappedSchema, { type: unwrappedSchema.jsonType ?? \"number\" });\n\n case \"boolean\":\n return withMetadata(unwrappedSchema, { type: \"boolean\" });\n\n case \"enum\": {\n const jsonSchema: JsonSchema = {\n enum:\n unwrappedSchema.nullable === true\n ? [...unwrappedSchema.values, null]\n : [...unwrappedSchema.values]\n };\n const enumType = unwrappedSchema.jsonType ?? getEnumJsonType(unwrappedSchema.values);\n\n if (enumType !== undefined) {\n jsonSchema.type = enumType;\n }\n\n return withMetadata(unwrappedSchema, jsonSchema);\n }\n\n case \"array\":\n return withArrayMetadata(unwrappedSchema, {\n type: \"array\",\n items: toJsonSchema(unwrappedSchema.item)\n });\n\n case \"object\": {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const [key, propertySchema] of Object.entries(unwrappedSchema.shape)) {\n Object.defineProperty(properties, key, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: toJsonSchema(propertySchema)\n });\n\n if (!isOptionalSchema(propertySchema)) {\n required.push(key);\n }\n }\n\n return withObjectMetadata(unwrappedSchema, {\n type: \"object\",\n properties,\n required\n });\n }\n\n case \"oneOf\":\n return withMetadata(unwrappedSchema, {\n oneOf: Object.entries(unwrappedSchema.branches).map(([branchName, branchSchema]) =>\n withInjectedDiscriminator(branchSchema, unwrappedSchema.discriminator, branchName)\n )\n });\n\n case \"union\":\n return withMetadata(unwrappedSchema, {\n oneOf: unwrappedSchema.branches.map((branchSchema) => toJsonSchema(branchSchema))\n });\n\n case \"record\":\n return withMetadata(unwrappedSchema, {\n type: \"object\",\n additionalProperties: toJsonSchema(unwrappedSchema.value)\n });\n\n case \"json\":\n return withMetadata(unwrappedSchema, {});\n }\n}\n\nexport function toJsonSchemaDocument(\n schema: AnySchema,\n options: JsonSchemaDocumentOptions = {}\n): JsonSchemaDocument {\n return createJsonSchemaDocument(toJsonSchema(schema), options);\n}\n\nexport { Json, OneOf, RecordBuilder as Record, Union, validate };\nexport { compileJsonSchema, formatIssues } from \"./json-schema/index.js\";\nexport type { CompileJsonSchemaOptions, CompiledJsonSchema } from \"./json-schema/index.js\";\nexport type { JsonSchemaDocument, JsonSchemaDocumentOptions } from \"./json-schema-document.js\";\nexport type {\n JsonValue,\n JsonValueSchema,\n OneOfSchema,\n RecordSchema,\n UnionSchema,\n ValidationIssue,\n ValidationResult\n};\n", "import { defineScope } from \"./schema.js\";\n\nexport const planConfigScope = defineScope(\"plan\", {\n plan_directory: {\n type: \"string\",\n default: \"docs/plans\",\n env: \"POE_PLAN_DIRECTORY\",\n doc: \"Directory where planning documents are stored\"\n }\n});\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { resolve, type FileSystem as ResolveFileSystem } from \"@poe-code/config-extends\";\nimport { createTimestamp, isNotFound, type FileSystem } from \"@poe-code/config-mutations\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport type { ConfigDocument } from \"./types.js\";\n\nexport async function readDocument(fs: FileSystem, filePath: string): Promise<ConfigDocument> {\n await assertConfigPathSafe(fs, filePath);\n const document = await readStoredDocument(fs, filePath);\n return document.data;\n}\n\nexport async function readDocumentReadonly(fs: FileSystem, filePath: string): Promise<ConfigDocument> {\n await assertConfigPathSafe(fs, filePath);\n const document = await readStoredDocument(fs, filePath, false);\n return document.data;\n}\n\nexport async function writeScope(\n fs: FileSystem,\n filePath: string,\n scope: string,\n values: Record<string, unknown>\n): Promise<void> {\n const document = await readDocument(fs, filePath);\n const normalizedValues = normalizeScopeValues(values);\n\n if (Object.keys(normalizedValues).length === 0) {\n delete document[scope];\n } else {\n defineDataProperty(document, scope, normalizedValues);\n }\n\n await writeDocument(fs, filePath, document);\n}\n\nexport async function readMergedDocument(\n fs: FileSystem,\n globalPath: string,\n projectPath?: string\n): Promise<ConfigDocument> {\n return readMergedStoredDocument(fs, globalPath, projectPath, true);\n}\n\nexport async function readMergedDocumentReadonly(\n fs: FileSystem,\n globalPath: string,\n projectPath?: string\n): Promise<ConfigDocument> {\n return readMergedStoredDocument(fs, globalPath, projectPath, false);\n}\n\nasync function readMergedStoredDocument(\n fs: FileSystem,\n globalPath: string,\n projectPath: string | undefined,\n recoverInvalid: boolean\n): Promise<ConfigDocument> {\n await assertConfigPathSafe(fs, globalPath);\n const globalDocument = await readStoredDocument(fs, globalPath, recoverInvalid);\n if (!projectPath || projectPath === globalPath) {\n return globalDocument.data;\n }\n\n await assertConfigPathSafe(fs, projectPath);\n const projectDocument = await readStoredDocument(fs, projectPath, recoverInvalid);\n const resolved = await resolve(\n [\n {\n source: \"project\",\n filePath: projectPath,\n content: projectDocument.content\n },\n {\n source: \"base\",\n path: path.dirname(globalPath)\n }\n ],\n {\n fs: createResolvedConfigFs(fs, globalPath, globalDocument.content),\n autoExtend: true\n }\n );\n\n return normalizeDocument(resolved.data);\n}\n\nasync function readStoredDocument(\n fs: FileSystem,\n filePath: string,\n recoverInvalid = true\n): Promise<{ content: string; data: ConfigDocument }> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return await parseStoredDocument(fs, filePath, raw, recoverInvalid);\n } catch (error) {\n if (isNotFound(error)) {\n return {\n content: EMPTY_DOCUMENT,\n data: {}\n };\n }\n\n throw error;\n }\n}\n\nasync function parseStoredDocument(\n fs: FileSystem,\n filePath: string,\n raw: string,\n recoverInvalid: boolean\n): Promise<{ content: string; data: ConfigDocument }> {\n try {\n return {\n content: raw,\n data: normalizeDocument(JSON.parse(raw))\n };\n } catch (error) {\n if (error instanceof SyntaxError) {\n if (!recoverInvalid) {\n throw error;\n }\n await recoverInvalidDocument(fs, filePath, raw);\n return {\n content: EMPTY_DOCUMENT,\n data: {}\n };\n }\n throw error;\n }\n}\n\nfunction normalizeDocument(value: unknown): ConfigDocument {\n if (!isRecord(value)) {\n return {};\n }\n\n const document: ConfigDocument = {};\n for (const [scope, scopeValues] of Object.entries(value)) {\n const normalizedValues = normalizeScopeValues(scopeValues);\n if (Object.keys(normalizedValues).length > 0) {\n defineDataProperty(document, scope, normalizedValues);\n }\n }\n\n return document;\n}\n\nfunction normalizeScopeValues(value: unknown): Record<string, unknown> {\n if (!isRecord(value)) {\n return {};\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (entry !== undefined) {\n defineDataProperty(normalized, key, entry);\n }\n }\n\n return normalized;\n}\n\nfunction defineDataProperty(object: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n\nfunction createResolvedConfigFs(\n fs: FileSystem,\n globalPath: string,\n globalContent: string\n): ResolveFileSystem {\n return {\n readFile(filePath: string, _encoding: BufferEncoding) {\n if (filePath === globalPath) {\n return Promise.resolve(globalContent);\n }\n\n return fs.readFile(filePath, \"utf8\");\n }\n };\n}\n\nexport async function writeDocument(\n fs: FileSystem,\n filePath: string,\n document: ConfigDocument\n): Promise<void> {\n await assertConfigPathSafe(fs, filePath);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await assertConfigPathSafe(fs, filePath);\n await writeFileAtomically(fs, filePath, `${JSON.stringify(document, null, 2)}\\n`);\n}\n\nasync function recoverInvalidDocument(\n fs: FileSystem,\n filePath: string,\n content: string\n): Promise<void> {\n await assertConfigPathSafe(fs, filePath);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await assertConfigPathSafe(fs, filePath);\n await writeInvalidBackup(fs, filePath, content);\n await writeFileAtomically(fs, filePath, EMPTY_DOCUMENT);\n}\n\nexport async function assertConfigPathSafe(fs: FileSystem, filePath: string): Promise<void> {\n for (const target of [path.dirname(filePath), filePath]) {\n try {\n if ((await fs.lstat(target)).isSymbolicLink()) {\n throw new Error(`Refusing configuration access through symbolic link: ${target}`);\n }\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n }\n}\n\nfunction createInvalidBackupPath(filePath: string): string {\n const directory = path.dirname(filePath);\n const baseName = path.basename(filePath);\n return path.join(directory, `${baseName}.invalid-${createTimestamp()}.json`);\n}\n\nasync function writeInvalidBackup(fs: FileSystem, filePath: string, content: string): Promise<void> {\n const backupPath = createInvalidBackupPath(filePath);\n const backupStem = backupPath.slice(0, -\".json\".length);\n\n for (let suffix = 0; ; suffix += 1) {\n const candidate = suffix === 0 ? backupPath : `${backupStem}-${suffix}.json`;\n\n try {\n await fs.writeFile(candidate, content, { encoding: \"utf8\", flag: \"wx\" });\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await fs.unlink(candidate).catch(() => undefined);\n throw error;\n }\n }\n }\n}\n\nasync function writeFileAtomically(fs: FileSystem, filePath: string, content: string): Promise<void> {\n const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n let tempCreated = false;\n\n try {\n await fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n await fs.rename(tempPath, filePath);\n } catch (error) {\n if (tempCreated || !isAlreadyExists(error)) {\n await fs.unlink(tempPath).catch(() => undefined);\n }\n throw error;\n }\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport function resolveConfigPath(homeDir: string): string {\n return path.join(homeDir, \".poe-code\", \"config.json\");\n}\n\nexport function resolveServicesConfigPath(homeDir: string): string {\n return path.join(homeDir, \".config\", \"poe-code\", \"services.json\");\n}\n\nexport function resolveProjectConfigPath(cwd: string): string {\n return path.join(cwd, \".poe-code\", \"config.json\");\n}\n\nconst EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\\n`;\n", "import path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport type { FileSystem } from \"./types.js\";\n\nexport interface DiscoveredBase {\n content: string;\n filePath: string;\n}\n\nexport async function findBase(\n name: string,\n bases: string[],\n fs: FileSystem\n): Promise<DiscoveredBase> {\n const checkedPaths: string[] = [];\n\n for (const basePath of bases) {\n for (const extension of [\".md\", \".yaml\", \".yml\", \".json\"]) {\n const filePath = path.join(basePath, `${name}${extension}`);\n const relativePath = path.relative(path.resolve(basePath), path.resolve(filePath));\n\n if (\n relativePath === \"..\" ||\n relativePath.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativePath)\n ) {\n throw new Error(\"Base name must remain inside configured base directories.\");\n }\n\n checkedPaths.push(filePath);\n\n try {\n return {\n content: await fs.readFile(filePath, \"utf8\"),\n filePath\n };\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n continue;\n }\n\n throw error;\n }\n }\n }\n\n throw new Error(`Base \"${name}\" not found.\\nChecked paths:\\n- ${checkedPaths.join(\"\\n- \")}`);\n}\n", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import path from \"node:path\";\nimport { FrontmatterParseError, parseFrontmatter } from \"@poe-code/frontmatter\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { ParsedDocument } from \"./types.js\";\n\nexport function parseDocument(content: string, filePath: string): ParsedDocument {\n const normalizedContent = stripBom(content);\n const format = detectFormat(normalizedContent, filePath);\n const data =\n format === \"markdown\"\n ? parseMarkdown(normalizedContent, filePath)\n : toData(\n format === \"json\"\n ? parseJson(normalizedContent, filePath)\n : (parseYaml(normalizedContent) ?? {}),\n filePath\n );\n const hasExtendsField = Object.hasOwn(data, \"extends\");\n const extendsValue = hasExtendsField ? data.extends : undefined;\n const parsedExtends = parseExtendsValue(extendsValue, hasExtendsField, filePath);\n\n delete data.extends;\n\n return {\n data,\n format,\n extends: parsedExtends,\n hasExtendsField\n };\n}\n\nfunction parseExtendsValue(\n value: unknown,\n hasExtendsField: boolean,\n filePath: string\n): ParsedDocument[\"extends\"] {\n if (!hasExtendsField || value === false || value === undefined) {\n return false;\n }\n\n if (value === true) {\n return true;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(\n `Invalid extends value in ${filePath}: expected a boolean or relative string path.`\n );\n }\n\n const trimmedValue = value.trim();\n\n if (trimmedValue.length === 0) {\n throw new Error(`Invalid extends value in ${filePath}: expected a non-empty relative path.`);\n }\n\n if (path.isAbsolute(trimmedValue)) {\n throw new Error(`Invalid extends value in ${filePath}: expected a relative path.`);\n }\n\n return trimmedValue;\n}\n\nfunction detectFormat(\n content: string,\n filePath: string\n): ParsedDocument[\"format\"] {\n const extension = path.extname(filePath).toLowerCase();\n\n if (extension === \".md\") {\n return \"markdown\";\n }\n\n if (extension === \".yaml\" || extension === \".yml\") {\n return \"yaml\";\n }\n\n if (extension === \".json\") {\n return \"json\";\n }\n\n if (content.startsWith(\"{\")) {\n return \"json\";\n }\n\n if (content.startsWith(\"---\\n\") || content.startsWith(\"---\\r\\n\") || content.startsWith(\"---\\r\")) {\n return \"markdown\";\n }\n\n return \"yaml\";\n}\n\nfunction parseMarkdown(content: string, filePath: string): Record<string, unknown> {\n let document;\n\n try {\n document = parseFrontmatter(normalizeMarkdownLineEndings(content));\n } catch (error) {\n if (\n error instanceof FrontmatterParseError &&\n error.message === \"Missing YAML frontmatter end delimiter (---).\"\n ) {\n return { prompt: content };\n }\n\n throw error;\n }\n\n const data = toData(document.frontmatter, filePath);\n if (document.body !== \"\" || !Object.hasOwn(data, \"prompt\")) {\n return {\n ...data,\n prompt: document.body\n };\n }\n\n return data;\n}\n\nfunction parseJson(content: string, filePath: string): unknown {\n try {\n return JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown JSON parse error\";\n throw new Error(`Invalid JSON configuration in ${filePath}: ${message}`);\n }\n}\n\nfunction normalizeMarkdownLineEndings(content: string): string {\n let normalized = \"\";\n\n for (let index = 0; index < content.length; index += 1) {\n const character = content[index];\n\n if (character === \"\\r\" && content[index + 1] !== \"\\n\") {\n normalized += \"\\n\";\n continue;\n }\n\n normalized += character;\n }\n\n return normalized;\n}\n\nfunction toData(value: unknown, filePath: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`Invalid configuration in ${filePath}: expected an object root.`);\n }\n\n return {\n ...(value as Record<string, unknown>)\n };\n}\n\nfunction stripBom(content: string): string {\n if (!content.startsWith(\"\\uFEFF\")) {\n return content;\n }\n\n return content.slice(1);\n}\n", "export type FrontmatterBlock = {\n raw: string;\n body: string;\n rawStart: number;\n rawEnd: number;\n};\n\nexport type SplitFrontmatterResult = FrontmatterBlock | { body: string };\n\nexport type InspectFrontmatterResult =\n | (FrontmatterBlock & { kind: \"frontmatter\" })\n | {\n kind: \"missing-closing-fence\";\n raw: string;\n rawStart: number;\n rawEnd: number;\n body: \"\";\n message: string;\n position: number;\n }\n | { kind: \"body\"; body: string };\n\nconst MISSING_END_DELIMITER_MESSAGE = \"Missing YAML frontmatter end delimiter (---).\";\n\ntype LineEnd = {\n index: number;\n lineBreakLength: 0 | 1 | 2;\n};\n\nexport function splitFrontmatterBlock(source: string): SplitFrontmatterResult {\n const inspected = inspectFrontmatterBlock(source);\n\n if (inspected.kind === \"body\") {\n return { body: inspected.body };\n }\n\n if (inspected.kind === \"missing-closing-fence\") {\n throw new Error(inspected.message);\n }\n\n return {\n raw: inspected.raw,\n rawStart: inspected.rawStart,\n rawEnd: inspected.rawEnd,\n body: inspected.body\n };\n}\n\nexport function inspectFrontmatterBlock(source: string): InspectFrontmatterResult {\n const content = source.startsWith(\"\\uFEFF\") ? source.slice(1) : source;\n const sourceOffset = source.length - content.length;\n const opening = readOpeningFence(content);\n\n if (opening === undefined) {\n return { kind: \"body\", body: source };\n }\n\n const closing = findClosingFence(content, opening.next);\n\n if (closing === undefined) {\n return {\n kind: \"missing-closing-fence\",\n raw: content.slice(opening.next),\n rawStart: sourceOffset + opening.next,\n rawEnd: source.length,\n body: \"\",\n message: MISSING_END_DELIMITER_MESSAGE,\n position: source.length\n };\n }\n\n return {\n kind: \"frontmatter\",\n raw: content.slice(opening.next, closing.index),\n rawStart: sourceOffset + opening.next,\n rawEnd: sourceOffset + closing.index,\n body: content.slice(closing.end + closing.lineBreakLength)\n };\n}\n\nfunction readOpeningFence(source: string): { next: number } | undefined {\n if (!source.startsWith(\"---\")) {\n return undefined;\n }\n\n const lineEnd = findLineEnd(source, 0);\n\n if (lineEnd.lineBreakLength === 0 || !isFenceLine(source.slice(0, lineEnd.index))) {\n return undefined;\n }\n\n return { next: lineEnd.index + lineEnd.lineBreakLength };\n}\n\nfunction findClosingFence(\n source: string,\n start: number\n): { index: number; end: number; lineBreakLength: 0 | 1 | 2 } | undefined {\n let lineStart = start;\n\n while (lineStart <= source.length) {\n const lineEnd = findLineEnd(source, lineStart);\n\n if (isFenceLine(source.slice(lineStart, lineEnd.index))) {\n return {\n index: lineStart,\n end: lineEnd.index,\n lineBreakLength: lineEnd.lineBreakLength\n };\n }\n\n if (lineEnd.lineBreakLength === 0) {\n break;\n }\n\n lineStart = lineEnd.index + lineEnd.lineBreakLength;\n }\n\n return undefined;\n}\n\nfunction isFenceLine(line: string): boolean {\n if (!line.startsWith(\"---\")) {\n return false;\n }\n\n for (let index = 3; index < line.length; index += 1) {\n const character = line[index];\n\n if (character !== \" \" && character !== \"\\t\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findLineEnd(source: string, start: number): LineEnd {\n let index = start;\n\n while (index < source.length) {\n const character = source[index];\n\n if (character === \"\\n\") {\n return { index, lineBreakLength: 1 };\n }\n\n if (character === \"\\r\") {\n return {\n index,\n lineBreakLength: source[index + 1] === \"\\n\" ? 2 : 1\n };\n }\n\n index += 1;\n }\n\n return { index: source.length, lineBreakLength: 0 };\n}\n", "import { LineCounter, parse, parseDocument } from \"yaml\";\nimport { inspectFrontmatterBlock, splitFrontmatterBlock } from \"./fences.js\";\n\nexport interface ParsedFrontmatter {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface ParsedFrontmatterDocument extends ParsedFrontmatter {\n errors: readonly { message: string; pos?: [number, number] }[];\n lineCounter: LineCounter;\n}\n\nexport interface ParseFrontmatterOptions {\n uniqueKeys?: boolean;\n}\n\nexport class FrontmatterParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FrontmatterParseError\";\n }\n}\n\nexport class FrontmatterKindError extends FrontmatterParseError {\n readonly expectedKind: string;\n readonly foundKind: string;\n\n constructor(message: string, kinds: { expected: string; found: string }) {\n super(message);\n this.name = \"FrontmatterKindError\";\n this.expectedKind = kinds.expected;\n this.foundKind = kinds.found;\n }\n}\n\nexport function isFrontmatterKindError(error: unknown): error is FrontmatterKindError {\n return (\n error instanceof Error &&\n error.name === \"FrontmatterKindError\" &&\n typeof (error as { expectedKind?: unknown }).expectedKind === \"string\" &&\n typeof (error as { foundKind?: unknown }).foundKind === \"string\"\n );\n}\n\nexport function parseFrontmatter(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatter {\n const split = splitFrontmatter(source);\n\n if (split.raw === undefined) {\n return {\n frontmatter: {},\n body: split.body\n };\n }\n\n return {\n frontmatter: parseYamlFrontmatter(split.raw, options),\n body: split.body\n };\n}\n\nexport function parseFrontmatterDocument(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatterDocument {\n const split = inspectFrontmatterBlock(source);\n const lineCounter = createSourceLineCounter(source);\n\n if (split.kind === \"body\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [],\n lineCounter\n };\n }\n\n if (split.kind === \"missing-closing-fence\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: split.message, pos: [split.position, split.position] }],\n lineCounter\n };\n }\n\n const yamlLineCounter = new LineCounter();\n const normalizedYaml = normalizeYamlLineEndings(split.raw);\n const document = parseDocument(normalizedYaml, {\n lineCounter: yamlLineCounter,\n prettyErrors: false,\n uniqueKeys: options.uniqueKeys ?? false\n });\n const errors = document.errors.map((error) => ({\n message: error.message,\n ...(error.pos === undefined\n ? {}\n : { pos: translateYamlErrorPosition(error.pos as [number, number], split) })\n }));\n\n if (errors.length > 0) {\n return {\n frontmatter: {},\n body: split.body,\n errors,\n lineCounter\n };\n }\n\n try {\n return {\n frontmatter: normalizeYamlFrontmatter(document.toJSON()),\n body: split.body,\n errors,\n lineCounter\n };\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: error.message }],\n lineCounter\n };\n }\n\n throw error;\n }\n}\n\nfunction createSourceLineCounter(source: string): LineCounter {\n const lineCounter = new LineCounter();\n lineCounter.addNewLine(0);\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n\n if (character === \"\\n\") {\n lineCounter.addNewLine(index + 1);\n continue;\n }\n\n if (character === \"\\r\") {\n lineCounter.addNewLine(index + (source[index + 1] === \"\\n\" ? 2 : 1));\n if (source[index + 1] === \"\\n\") {\n index += 1;\n }\n }\n }\n\n return lineCounter;\n}\n\nfunction translateYamlErrorPosition(\n pos: [number, number],\n split: { raw: string; rawStart: number }\n): [number, number] {\n return pos.map((offset) => split.rawStart + normalizeYamlErrorOffset(split.raw, offset)) as [\n number,\n number\n ];\n}\n\nfunction normalizeYamlErrorOffset(raw: string, offset: number): number {\n if (offset >= raw.length && endsWithLineBreak(raw)) {\n return findPreviousLineStart(raw, raw.length);\n }\n\n return offset;\n}\n\nfunction endsWithLineBreak(value: string): boolean {\n return value.endsWith(\"\\n\") || value.endsWith(\"\\r\");\n}\n\nfunction findPreviousLineStart(value: string, end: number): number {\n let index = end - 1;\n\n if (value[index] === \"\\n\") {\n index -= 1;\n }\n\n if (value[index] === \"\\r\") {\n index -= 1;\n }\n\n while (index >= 0) {\n const character = value[index];\n\n if (character === \"\\n\" || character === \"\\r\") {\n return index + 1;\n }\n\n index -= 1;\n }\n\n return 0;\n}\n\nfunction splitFrontmatter(source: string): { raw?: string; body: string } {\n try {\n return splitFrontmatterBlock(source);\n } catch (error) {\n if (error instanceof Error) {\n throw new FrontmatterParseError(error.message);\n }\n\n throw error;\n }\n}\n\nfunction parseYamlFrontmatter(\n yamlBlock: string,\n options: ParseFrontmatterOptions\n): Record<string, unknown> {\n let parsed: unknown;\n\n try {\n parsed = parse(normalizeYamlLineEndings(yamlBlock), {\n uniqueKeys: options.uniqueKeys ?? false\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n\n return normalizeYamlFrontmatter(parsed);\n}\n\nfunction normalizeYamlLineEndings(value: string): string {\n if (!value.includes(\"\\r\")) {\n return value;\n }\n\n let normalized = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n\n if (character !== \"\\r\") {\n normalized += character;\n continue;\n }\n\n if (value[index + 1] === \"\\n\") {\n normalized += \"\\r\\n\";\n index += 1;\n continue;\n }\n\n normalized += \"\\n\";\n }\n\n return normalized;\n}\n\nfunction normalizeYamlFrontmatter(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) {\n return {};\n }\n\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n\n return normalizeYamlValue(value) as Record<string, unknown>;\n}\n\nfunction normalizeYamlValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeYamlValue(item));\n }\n\n if (!isPlainRecord(value)) {\n return value;\n }\n\n const normalized: Record<string, unknown> = {};\n\n for (const [key, entryValue] of Object.entries(value)) {\n Object.defineProperty(normalized, key, {\n configurable: true,\n enumerable: true,\n value: normalizeYamlValue(entryValue),\n writable: true\n });\n }\n\n return normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import { stringify } from \"yaml\";\nimport { FrontmatterParseError } from \"./parse.js\";\n\nexport function stringifyFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n try {\n assertFrontmatterRoot(frontmatter);\n assertAcyclic(frontmatter);\n return `---\\n${stringify(frontmatter, { aliasDuplicateObjects: false }).trimEnd()}\\n---\\n${body}`;\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : \"Unknown YAML stringify error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n}\n\nfunction assertFrontmatterRoot(value: unknown): asserts value is Record<string, unknown> {\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n}\n\nfunction assertAcyclic(value: unknown, seen: WeakSet<object> = new WeakSet()): void {\n if (typeof value !== \"object\" || value === null) {\n return;\n }\n\n if (seen.has(value)) {\n throw new FrontmatterParseError(\"Cannot stringify cyclic frontmatter.\");\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n assertAcyclic(item, seen);\n }\n } else {\n for (const item of Object.values(value)) {\n assertAcyclic(item, seen);\n }\n }\n\n seen.delete(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import type { DataLayer } from \"./types.js\";\n\nexport interface MergeLayersResult {\n data: Record<string, unknown>;\n sources: Record<string, string>;\n}\n\nexport function mergeLayers(layers: DataLayer[]): MergeLayersResult {\n for (const layer of layers) {\n assertAcyclic(layer.data, new Set<object>());\n }\n\n return mergeObjectLayers(layers, []);\n}\n\nfunction mergeObjectLayers(layers: DataLayer[], path: string[]): MergeLayersResult {\n const data: Record<string, unknown> = {};\n const sources: Record<string, string> = {};\n\n for (const key of collectKeys(layers)) {\n const resolved = resolveKey(layers, key, path);\n\n if (resolved === undefined) {\n continue;\n }\n\n defineDataProperty(data, key, resolved.value);\n for (const [sourcePath, source] of Object.entries(resolved.sources)) {\n defineDataProperty(sources, sourcePath, source);\n }\n }\n\n return { data, sources };\n}\n\nfunction collectKeys(layers: DataLayer[]): string[] {\n const keys = new Set<string>();\n\n for (const layer of layers) {\n for (const key of Object.keys(layer.data)) {\n keys.add(key);\n }\n }\n\n return [...keys];\n}\n\nfunction resolveKey(\n layers: DataLayer[],\n key: string,\n path: string[]\n): { value: unknown; sources: Record<string, string> } | undefined {\n let winningSource: string | undefined;\n let winningValue: unknown;\n const objectLayers: DataLayer[] = [];\n\n for (const layer of layers) {\n const candidate = getOwnEntry(layer.data, key);\n\n if (!isWinningCandidate(key, candidate)) {\n continue;\n }\n\n if (winningSource === undefined) {\n winningSource = layer.source;\n winningValue = candidate;\n\n if (isPlainObject(candidate)) {\n objectLayers.push({\n source: layer.source,\n data: candidate\n });\n }\n\n continue;\n }\n\n if (isPlainObject(winningValue) && isPlainObject(candidate)) {\n objectLayers.push({\n source: layer.source,\n data: candidate\n });\n }\n }\n\n if (winningSource === undefined) {\n return undefined;\n }\n\n if (winningValue === null) {\n return undefined;\n }\n\n const fullPath = buildPath(path, key);\n\n if (isPlainObject(winningValue)) {\n const merged = mergeObjectLayers(objectLayers, [...path, key]);\n\n return {\n value: merged.data,\n sources: {\n [fullPath]: winningSource,\n ...merged.sources\n }\n };\n }\n\n return {\n value: cloneValue(winningValue),\n sources: {\n [fullPath]: winningSource\n }\n };\n}\n\nfunction isWinningCandidate(key: string, value: unknown): boolean {\n if (value === undefined) {\n return false;\n }\n\n if (key === \"prompt\" && value === \"\") {\n return false;\n }\n\n return true;\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction buildPath(path: string[], key: string): string {\n return [...path, key].map(escapePathSegment).join(\".\");\n}\n\nfunction escapePathSegment(segment: string): string {\n return segment.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\".\", \"\\\\.\");\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || Array.isArray(value) || typeof value !== \"object\") {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction cloneValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneValue(entry));\n }\n\n if (!isPlainObject(value)) {\n return value;\n }\n\n const clone = Object.create(Object.getPrototypeOf(value)) as Record<string, unknown>;\n\n for (const [key, entry] of Object.entries(value)) {\n defineDataProperty(clone, key, cloneValue(entry));\n }\n\n return clone;\n}\n\nfunction assertAcyclic(value: unknown, ancestors: Set<object>): void {\n if (!Array.isArray(value) && !isPlainObject(value)) {\n return;\n }\n\n if (ancestors.has(value)) {\n throw new Error(\"Cyclic config data is not supported.\");\n }\n\n const nextAncestors = new Set(ancestors);\n nextAncestors.add(value);\n\n for (const entry of Array.isArray(value) ? value : Object.values(value)) {\n assertAcyclic(entry, nextAncestors);\n }\n}\n\nfunction defineDataProperty(object: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n", "import path from \"node:path\";\nimport {\n getTemplatePartialNames,\n renderTemplate,\n resolveTemplatePartials\n} from \"toolcraft-design\";\nimport { findBase } from \"./discover.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport { mergeLayers } from \"./merge.js\";\nimport { parseDocument } from \"./parse.js\";\nimport type {\n BaseLayer,\n ChainLayer,\n DataLayer,\n DocumentLayer,\n ResolveOptions,\n ResolvedDocument\n} from \"./types.js\";\n\nconst MAX_EXTENDS_DEPTH = 5;\nconst YIELD_TOKEN = \"{{yield}}\";\n\ninterface ClassifiedChain {\n baseLayers: BaseLayer[];\n documentIndex: number;\n documentLayer: DocumentLayer;\n}\n\ninterface ResolvedBaseChain {\n chain: string[];\n layers: DataLayer[];\n}\n\ninterface ResolvedBase {\n content: string;\n filePath: string;\n source: string;\n matchedBaseIndex?: number;\n}\n\nexport async function resolve(\n chain: ChainLayer[],\n options: ResolveOptions\n): Promise<ResolvedDocument> {\n const { baseLayers, documentIndex, documentLayer } = classifyChain(chain);\n const parsedDocument = parseDocument(documentLayer.content, documentLayer.filePath);\n const resolvedBase = shouldResolveBase(parsedDocument, options.autoExtend)\n ? await resolveBaseChain({\n name: documentLayer.baseName ?? getBaseName(documentLayer.filePath),\n baseLayers,\n extendsValue: parsedDocument.extends,\n fromFilePath: documentLayer.filePath,\n options,\n optional: !parsedDocument.extends,\n visited: new Set([path.resolve(documentLayer.filePath)]),\n depth: 1\n })\n : undefined;\n const promptFiles = [documentLayer.filePath, ...(resolvedBase?.chain ?? [])];\n const expandedPrompts = await expandPromptPartials(\n {\n source: documentLayer.source,\n data: parsedDocument.data\n },\n resolvedBase?.layers ?? [],\n promptFiles,\n options\n );\n const composedPrompt = composePromptChain(\n expandedPrompts.documentLayer,\n expandedPrompts.baseLayers\n );\n const renderedPrompt =\n composedPrompt === undefined ? undefined : renderPrompt(composedPrompt.prompt, options);\n const merged = mergeLayers([\n ...collectDataLayers(chain.slice(0, documentIndex)),\n {\n source: documentLayer.source,\n data: withResolvedPrompt(parsedDocument.data, renderedPrompt)\n },\n ...stripResolvedBasePrompts(\n resolvedBase?.layers ?? [],\n composedPrompt?.consumedBaseIndexes ?? new Set<number>()\n ),\n ...collectDataLayers(chain.slice(documentIndex + 1))\n ]);\n\n if (\n composedPrompt !== undefined &&\n getOwnEntry(merged.sources, \"prompt\") === documentLayer.source &&\n composedPrompt.source !== undefined\n ) {\n merged.sources.prompt = composedPrompt.source;\n }\n\n return {\n data: merged.data,\n sources: merged.sources,\n chain: [...promptFiles, ...expandedPrompts.partialFiles]\n };\n}\n\nfunction classifyChain(chain: ChainLayer[]): ClassifiedChain {\n const baseLayers: BaseLayer[] = [];\n const documentLayers: Array<{ index: number; layer: DocumentLayer }> = [];\n\n for (const [index, layer] of chain.entries()) {\n if (isDataLayer(layer)) {\n continue;\n }\n\n if (isDocumentLayer(layer)) {\n documentLayers.push({ index, layer });\n continue;\n }\n\n if (isBaseLayer(layer)) {\n baseLayers.push(layer);\n }\n }\n\n if (documentLayers.length !== 1) {\n throw new Error(`Exactly one document layer is required, received ${documentLayers.length}.`);\n }\n\n return {\n baseLayers,\n documentIndex: documentLayers[0].index,\n documentLayer: documentLayers[0].layer\n };\n}\n\nasync function resolveBaseChain({\n name,\n baseLayers,\n extendsValue,\n fromFilePath,\n options,\n optional,\n visited,\n depth\n}: {\n name: string;\n baseLayers: BaseLayer[];\n extendsValue: boolean | string;\n fromFilePath: string;\n options: ResolveOptions;\n optional: boolean;\n visited: Set<string>;\n depth: number;\n}): Promise<ResolvedBaseChain | undefined> {\n if (depth > MAX_EXTENDS_DEPTH) {\n throw new Error(`Maximum extends depth exceeded (${MAX_EXTENDS_DEPTH}).`);\n }\n\n const discoveredBase = await resolveBase({\n name,\n baseLayers,\n extendsValue,\n fromFilePath,\n options,\n optional\n });\n\n if (discoveredBase === undefined) {\n return undefined;\n }\n\n const resolvedBasePath = path.resolve(discoveredBase.filePath);\n\n if (visited.has(resolvedBasePath)) {\n if (optional) {\n return undefined;\n }\n\n throw new Error(\n `Circular extends detected.\\nVisited files:\\n- ${[...visited, resolvedBasePath].join(\"\\n- \")}`\n );\n }\n\n const parsedBase = parseDocument(discoveredBase.content, discoveredBase.filePath);\n const nextVisited = new Set(visited);\n nextVisited.add(resolvedBasePath);\n const nestedBase = parsedBase.extends\n ? await resolveBaseChain({\n name: getBaseName(discoveredBase.filePath),\n baseLayers:\n discoveredBase.matchedBaseIndex === undefined\n ? baseLayers\n : baseLayers.slice(discoveredBase.matchedBaseIndex + 1),\n extendsValue: parsedBase.extends,\n fromFilePath: discoveredBase.filePath,\n options,\n optional: false,\n visited: nextVisited,\n depth: depth + 1\n })\n : undefined;\n\n return {\n layers: [\n {\n source: discoveredBase.source,\n data: parsedBase.data\n },\n ...(nestedBase?.layers ?? [])\n ],\n chain: [discoveredBase.filePath, ...(nestedBase?.chain ?? [])]\n };\n}\n\nasync function resolveBase({\n name,\n baseLayers,\n extendsValue,\n fromFilePath,\n options,\n optional\n}: {\n name: string;\n baseLayers: BaseLayer[];\n extendsValue: boolean | string;\n fromFilePath: string;\n options: ResolveOptions;\n optional: boolean;\n}): Promise<ResolvedBase | undefined> {\n if (typeof extendsValue === \"string\") {\n return readPathValuedBase(extendsValue, fromFilePath, options);\n }\n\n let discoveredBase;\n\n try {\n discoveredBase = await findBase(\n name,\n baseLayers.map((layer) => layer.path),\n options.fs\n );\n } catch (error) {\n if (optional && isBaseNotFoundError(error)) {\n return undefined;\n }\n\n throw error;\n }\n\n const discoveredBaseDirectory = path.resolve(path.dirname(discoveredBase.filePath));\n const matchedBaseIndex = baseLayers.findIndex(\n (layer) => path.resolve(layer.path) === discoveredBaseDirectory\n );\n\n if (matchedBaseIndex === -1) {\n throw new Error(`Resolved base is outside configured base paths: ${discoveredBase.filePath}`);\n }\n\n return {\n content: discoveredBase.content,\n filePath: discoveredBase.filePath,\n matchedBaseIndex,\n source: baseLayers[matchedBaseIndex].source\n };\n}\n\nasync function readPathValuedBase(\n extendsPath: string,\n fromFilePath: string,\n options: ResolveOptions\n): Promise<ResolvedBase> {\n const filePath = path.resolve(path.dirname(fromFilePath), extendsPath);\n\n try {\n return {\n content: await options.fs.readFile(filePath, \"utf8\"),\n filePath,\n source: filePath\n };\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\") || hasOwnErrorCode(error, \"ENOTDIR\")) {\n throw new Error(`base file not found at ${filePath}`);\n }\n\n throw error;\n }\n}\n\nfunction collectDataLayers(chain: ChainLayer[]): DataLayer[] {\n return chain.filter(isDataLayer);\n}\n\ninterface ComposedPromptResult {\n consumedBaseIndexes: Set<number>;\n prompt: string;\n source?: string;\n}\n\nfunction composePromptChain(\n documentLayer: DataLayer,\n baseLayers: DataLayer[]\n): ComposedPromptResult | undefined {\n const documentPrompt = getOwnEntry(documentLayer.data, \"prompt\");\n\n if (documentPrompt !== undefined && typeof documentPrompt !== \"string\") {\n return undefined;\n }\n\n if (documentPrompt !== undefined) {\n assertValidYieldCount(documentPrompt);\n }\n\n let prompt = documentPrompt;\n let source = prompt === undefined || prompt === \"\" ? undefined : documentLayer.source;\n const consumedBaseIndexes = new Set<number>();\n\n for (const [index, layer] of baseLayers.entries()) {\n const candidate = getOwnEntry(layer.data, \"prompt\");\n\n if (candidate === undefined) {\n continue;\n }\n\n if (typeof candidate !== \"string\") {\n break;\n }\n\n assertValidYieldCount(candidate);\n consumedBaseIndexes.add(index);\n prompt = composeAdjacentPrompts(prompt, candidate);\n\n if (source === undefined && candidate !== \"\") {\n source = layer.source;\n }\n }\n\n if (prompt !== undefined && prompt.includes(YIELD_TOKEN)) {\n throw new Error('Final resolved prompt contains an unresolved \"{{yield}}\" token.');\n }\n\n if (prompt === undefined) {\n return undefined;\n }\n\n return {\n consumedBaseIndexes,\n prompt,\n source\n };\n}\n\nfunction composeAdjacentPrompts(high: string | undefined, low: string): string {\n if (high === undefined || high === \"\") {\n return low.includes(YIELD_TOKEN) ? replaceYield(low, \"\") : low;\n }\n\n if (high.includes(YIELD_TOKEN)) {\n return replaceYield(high, low);\n }\n\n if (low.includes(YIELD_TOKEN)) {\n return replaceYield(low, high);\n }\n\n return high;\n}\n\nfunction replaceYield(prompt: string, replacement: string): string {\n return prompt.split(YIELD_TOKEN).join(replacement);\n}\n\nasync function expandPromptPartials(\n documentLayer: DataLayer,\n baseLayers: DataLayer[],\n promptFiles: string[],\n options: ResolveOptions\n): Promise<{ baseLayers: DataLayer[]; documentLayer: DataLayer; partialFiles: string[] }> {\n const directories = unique(promptFiles.map((filePath) => path.dirname(filePath)));\n const partials: Record<string, string> = Object.create(null) as Record<string, string>;\n const partialFiles: string[] = [];\n\n const loadPartial = async (name: string): Promise<void> => {\n if (name.trim().length === 0) {\n throw new Error(\"Partial name must be non-empty.\");\n }\n\n if (Object.hasOwn(partials, name)) {\n return;\n }\n\n const partial = await findPartial(name, directories, options.fs);\n partials[name] = partial.content;\n partialFiles.push(partial.filePath);\n for (const nestedName of getTemplatePartialNames(partial.content)) {\n await loadPartial(nestedName);\n }\n };\n\n const promptLayers = [documentLayer, ...baseLayers];\n for (const layer of promptLayers) {\n const prompt = getOwnEntry(layer.data, \"prompt\");\n if (typeof prompt !== \"string\") {\n continue;\n }\n for (const name of getTemplatePartialNames(prompt)) {\n await loadPartial(name);\n }\n }\n\n const expandedLayers = promptLayers.map((layer) => withExpandedPrompt(layer, partials));\n\n return {\n documentLayer: expandedLayers[0],\n baseLayers: expandedLayers.slice(1),\n partialFiles\n };\n}\n\nfunction withExpandedPrompt(layer: DataLayer, partials: Record<string, string>): DataLayer {\n const prompt = getOwnEntry(layer.data, \"prompt\");\n if (typeof prompt !== \"string\") {\n return layer;\n }\n\n return {\n source: layer.source,\n data: {\n ...layer.data,\n prompt: resolveTemplatePartials(prompt, partials)\n }\n };\n}\n\nfunction renderPrompt(prompt: string, options: ResolveOptions): string {\n if (options.view === undefined && options.validate !== true) {\n return prompt;\n }\n\n return renderTemplate(prompt, options.view ?? {}, { escape: \"none\", validate: options.validate });\n}\n\nasync function findPartial(\n name: string,\n directories: string[],\n fs: ResolveOptions[\"fs\"]\n): Promise<{ content: string; filePath: string }> {\n const checkedPaths: string[] = [];\n\n for (const directory of directories) {\n const filePath = path.join(directory, `${name}.md`);\n assertInsideDirectory(name, directory, filePath);\n checkedPaths.push(filePath);\n\n try {\n return { content: await fs.readFile(filePath, \"utf8\"), filePath };\n } catch (error) {\n if (hasOwnErrorCode(error, \"ENOENT\")) {\n continue;\n }\n throw error;\n }\n }\n\n throw new Error(`Partial \"${name}\" not found.\\nChecked paths:\\n- ${checkedPaths.join(\"\\n- \")}`);\n}\n\nfunction assertInsideDirectory(name: string, directory: string, filePath: string): void {\n const relativePath = path.relative(path.resolve(directory), path.resolve(filePath));\n if (\n relativePath === \"..\" ||\n relativePath.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativePath)\n ) {\n throw new Error(`Partial name must remain inside prompt directories: \"${name}\".`);\n }\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction assertValidYieldCount(prompt: string): void {\n if (countYieldTokens(prompt) > 1) {\n throw new Error('Prompt composition supports exactly one \"{{yield}}\" token per prompt.');\n }\n}\n\nfunction countYieldTokens(prompt: string): number {\n return prompt.split(YIELD_TOKEN).length - 1;\n}\n\nfunction withResolvedPrompt(\n data: Record<string, unknown>,\n prompt: string | undefined\n): Record<string, unknown> {\n if (prompt === undefined) {\n return data;\n }\n\n return {\n ...data,\n prompt\n };\n}\n\nfunction stripResolvedBasePrompts(\n layers: DataLayer[],\n consumedBaseIndexes: Set<number>\n): DataLayer[] {\n return layers.map((layer, index) => {\n if (!consumedBaseIndexes.has(index) || typeof getOwnEntry(layer.data, \"prompt\") !== \"string\") {\n return layer;\n }\n\n const { prompt: ignoredPrompt, ...data } = layer.data;\n\n void ignoredPrompt;\n\n return {\n source: layer.source,\n data\n };\n });\n}\n\nfunction getBaseName(filePath: string): string {\n return path.basename(filePath, path.extname(filePath));\n}\n\nfunction shouldResolveBase(\n parsedDocument: ReturnType<typeof parseDocument>,\n autoExtend: boolean | undefined\n): boolean {\n return parsedDocument.extends !== false || (autoExtend === true && !parsedDocument.hasExtendsField);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction isBaseNotFoundError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n error.message.startsWith('Base \"') &&\n error.message.includes('\" not found.\\nChecked paths:')\n );\n}\n\nfunction isDataLayer(layer: ChainLayer): layer is DataLayer {\n return \"data\" in layer;\n}\n\nfunction isDocumentLayer(layer: ChainLayer): layer is DocumentLayer {\n return \"filePath\" in layer && \"content\" in layer;\n}\n\nfunction isBaseLayer(layer: ChainLayer): layer is BaseLayer {\n return \"path\" in layer;\n}\n", "export interface ColorSupportEnv {\n NO_COLOR?: string;\n FORCE_COLOR?: string;\n TERM?: string;\n}\n\nexport interface ColorSupportStream {\n isTTY?: boolean;\n}\n\nexport function supportsColor(\n env: ColorSupportEnv = process.env as ColorSupportEnv,\n stream: ColorSupportStream = process.stdout\n): boolean {\n if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") {\n return true;\n }\n\n if (env.NO_COLOR !== undefined) {\n return false;\n }\n\n if (stream.isTTY !== true) {\n return false;\n }\n\n return typeof env.TERM === \"string\" && env.TERM.length > 0 && env.TERM !== \"dumb\";\n}\n", "import { supportsColor } from \"../internal/color-support.js\";\n\ntype AnsiStyleName =\n | \"reset\"\n | \"bold\"\n | \"dim\"\n | \"italic\"\n | \"underline\"\n | \"inverse\"\n | \"strikethrough\"\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"gray\"\n | \"magentaBright\"\n | \"cyanBright\"\n | \"bgRed\"\n | \"bgGreen\"\n | \"bgYellow\"\n | \"bgBlue\"\n | \"bgMagenta\";\n\ninterface AnsiPair {\n open: string;\n}\n\nexport interface Color {\n (text: string): string;\n reset: Color;\n bold: Color;\n dim: Color;\n italic: Color;\n underline: Color;\n inverse: Color;\n strikethrough: Color;\n black: Color;\n red: Color;\n green: Color;\n yellow: Color;\n blue: Color;\n magenta: Color;\n cyan: Color;\n white: Color;\n gray: Color;\n magentaBright: Color;\n cyanBright: Color;\n bgRed: Color;\n bgGreen: Color;\n bgYellow: Color;\n bgBlue: Color;\n bgMagenta: Color;\n hex: (value: string) => Color;\n rgb: (red: number, green: number, blue: number) => Color;\n bgHex: (value: string) => Color;\n bgRgb: (red: number, green: number, blue: number) => Color;\n}\n\nconst reset = \"\\x1b[0m\";\n\nconst ansiStyles: Record<AnsiStyleName, AnsiPair> = {\n reset: { open: reset },\n bold: { open: \"\\x1b[1m\" },\n dim: { open: \"\\x1b[2m\" },\n italic: { open: \"\\x1b[3m\" },\n underline: { open: \"\\x1b[4m\" },\n inverse: { open: \"\\x1b[7m\" },\n strikethrough: { open: \"\\x1b[9m\" },\n black: { open: \"\\x1b[30m\" },\n red: { open: \"\\x1b[31m\" },\n green: { open: \"\\x1b[32m\" },\n yellow: { open: \"\\x1b[33m\" },\n blue: { open: \"\\x1b[34m\" },\n magenta: { open: \"\\x1b[35m\" },\n cyan: { open: \"\\x1b[36m\" },\n white: { open: \"\\x1b[37m\" },\n gray: { open: \"\\x1b[90m\" },\n magentaBright: { open: \"\\x1b[95m\" },\n cyanBright: { open: \"\\x1b[96m\" },\n bgRed: { open: \"\\x1b[41m\" },\n bgGreen: { open: \"\\x1b[42m\" },\n bgYellow: { open: \"\\x1b[43m\" },\n bgBlue: { open: \"\\x1b[44m\" },\n bgMagenta: { open: \"\\x1b[45m\" }\n};\n\nconst styleNames = Object.keys(ansiStyles) as AnsiStyleName[];\n\nfunction replaceAll(value: string, search: string, replacement: string): string {\n return value.split(search).join(replacement);\n}\n\nfunction applyStyles(text: string, styles: AnsiPair[]): string {\n if (!supportsColor() || styles.length === 0) {\n return text;\n }\n\n const open = styles.map((style) => style.open).join(\"\");\n const output = text.includes(reset) ? replaceAll(text, reset, `${reset}${open}`) : text;\n\n return `${open}${output}${reset}`;\n}\n\nfunction clampRgb(value: number): number {\n if (Number.isNaN(value)) {\n return 0;\n }\n\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction hexChannel(value: string, offset: number): number {\n return Number.parseInt(value.slice(offset, offset + 2), 16);\n}\n\nfunction normalizeHex(value: string): [number, number, number] {\n const normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\n if ((normalized.length !== 3 && normalized.length !== 6) ||\n Array.from(normalized).some((char) => !\"0123456789abcdefABCDEF\".includes(char))) {\n throw new Error(`Invalid hexadecimal color: ${value}`);\n }\n\n if (normalized.length === 3) {\n const red = normalized[0]!;\n const green = normalized[1]!;\n const blue = normalized[2]!;\n\n return [\n Number.parseInt(`${red}${red}`, 16),\n Number.parseInt(`${green}${green}`, 16),\n Number.parseInt(`${blue}${blue}`, 16)\n ];\n }\n\n return [\n hexChannel(normalized, 0),\n hexChannel(normalized, 2),\n hexChannel(normalized, 4)\n ];\n}\n\nfunction rgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[38;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction bgRgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[48;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction createColor(styles: AnsiPair[] = []): Color {\n const builder = ((text: string) => applyStyles(String(text), styles)) as Color;\n\n for (const name of styleNames) {\n Object.defineProperty(builder, name, {\n configurable: true,\n enumerable: true,\n get: () => createColor([...styles, ansiStyles[name]])\n });\n }\n\n builder.hex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, rgbStyle(red, green, blue)]);\n };\n\n builder.rgb = (red: number, green: number, blue: number) =>\n createColor([...styles, rgbStyle(red, green, blue)]);\n\n builder.bgHex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, bgRgbStyle(red, green, blue)]);\n };\n\n builder.bgRgb = (red: number, green: number, blue: number) =>\n createColor([...styles, bgRgbStyle(red, green, blue)]);\n\n return builder;\n}\n\nexport const color = createColor();\n", "export interface Brand {\n name: string;\n primary: string;\n}\n\nexport const brands: Record<string, Brand> = {\n purple: { name: \"purple\", primary: \"#a200ff\" },\n blue: { name: \"blue\", primary: \"#2f6fed\" },\n green: { name: \"green\", primary: \"#1f9d57\" }\n};\n", "import { brands } from \"../tokens/brand.js\";\n\nexport interface ThemeConfig {\n brand: string;\n label: string;\n}\n\nconst defaults: ThemeConfig = {\n brand: \"purple\",\n label: \"Poe\"\n};\n\nlet config: ThemeConfig = { ...defaults };\nlet revision = 0;\nlet brandConfigured = false;\n\nexport function configureTheme(patch: { brand?: string; label?: string }): void {\n if (patch.brand !== undefined && !Object.hasOwn(brands, patch.brand)) {\n throw new Error(`Unknown brand: ${patch.brand}`);\n }\n\n config = {\n brand: patch.brand ?? config.brand,\n label: patch.label ?? config.label\n };\n if (patch.brand !== undefined) {\n brandConfigured = true;\n }\n revision += 1;\n}\n\nexport function getThemeConfig(): ThemeConfig {\n return { ...config };\n}\n\nexport function getThemeRevision(): number {\n return revision;\n}\n\nexport function isThemeBrandConfigured(): boolean {\n return brandConfigured;\n}\n\nexport function resetTheme(): void {\n config = { ...defaults };\n brandConfigured = false;\n revision += 1;\n}\n", "import { color, type Color } from \"../components/color.js\";\nimport { getThemeConfig } from \"../internal/theme-state.js\";\nimport { brands, type Brand } from \"./brand.js\";\n\nexport const brand = brands.purple!.primary;\n\nexport type ThemeName = \"dark\" | \"light\";\n\nexport interface ThemeCellStyle {\n fg?: string;\n bold?: boolean;\n dim?: boolean;\n underline?: boolean;\n}\n\nexport interface ThemeCellStyles {\n accent: ThemeCellStyle;\n muted: ThemeCellStyle;\n success: ThemeCellStyle;\n warning: ThemeCellStyle;\n error: ThemeCellStyle;\n info: ThemeCellStyle;\n}\n\nexport interface ThemePalette {\n header: (text: string) => string;\n divider: (text: string) => string;\n prompt: (text: string) => string;\n number: (text: string) => string;\n intro: (text: string) => string;\n resolvedSymbol: string;\n errorSymbol: string;\n accent: (text: string) => string;\n muted: (text: string) => string;\n success: (text: string) => string;\n warning: (text: string) => string;\n error: (text: string) => string;\n info: (text: string) => string;\n badge: (text: string) => string;\n styles: ThemeCellStyles;\n}\n\nfunction withStyles(palette: Omit<ThemePalette, \"styles\">, styles: ThemeCellStyles): ThemePalette {\n return Object.defineProperty(palette, \"styles\", {\n value: styles,\n enumerable: false\n }) as ThemePalette;\n}\n\nfunction brandColor(activeBrand: Brand, purple: Color): Color {\n return activeBrand.name === \"purple\" ? purple : color.hex(activeBrand.primary);\n}\n\nfunction brandBackground(activeBrand: Brand, purple: Color): Color {\n return activeBrand.name === \"purple\" ? purple : color.bgHex(activeBrand.primary);\n}\n\nexport function createPalette(activeBrand: Brand, mode: ThemeName): ThemePalette {\n const isPurple = activeBrand.name === \"purple\";\n if (mode === \"light\") {\n const active = color.hex(activeBrand.primary);\n const prompt = isPurple ? color.hex(\"#006699\") : active;\n const number = isPurple ? color.hex(\"#0077cc\") : active;\n return withStyles(\n {\n header: (text: string) => active.bold(text),\n divider: (text: string) => color.hex(\"#666666\")(text),\n prompt: (text: string) => prompt.bold(text),\n number: (text: string) => number.bold(text),\n intro: (text: string) =>\n color.bgHex(activeBrand.primary).white(` ${getThemeConfig().label} - ${text} `),\n get resolvedSymbol() {\n return active(\"\u25C7\");\n },\n get errorSymbol() {\n return color.hex(\"#cc0000\")(\"\u25A0\");\n },\n accent: (text: string) => prompt.bold(text),\n muted: (text: string) => color.hex(\"#666666\")(text),\n success: (text: string) => color.hex(\"#008800\")(text),\n warning: (text: string) => color.hex(\"#cc6600\")(text),\n error: (text: string) => color.hex(\"#cc0000\")(text),\n info: (text: string) => active(text),\n badge: (text: string) => color.bgHex(\"#cc6600\").white(` ${text} `)\n },\n {\n accent: { fg: isPurple ? \"#006699\" : activeBrand.primary, bold: true },\n muted: { fg: \"#666666\" },\n success: { fg: \"#008800\" },\n warning: { fg: \"#cc6600\" },\n error: { fg: \"#cc0000\" },\n info: { fg: activeBrand.primary }\n }\n );\n }\n\n const active = brandColor(activeBrand, color.magenta);\n const activeBright = brandColor(activeBrand, color.magentaBright);\n const activeBackground = brandBackground(activeBrand, color.bgMagenta);\n const prompt = isPurple ? color.cyan : active;\n const number = isPurple ? color.cyanBright : active;\n return withStyles(\n {\n header: (text: string) => activeBright.bold(text),\n divider: (text: string) => color.dim(text),\n prompt: (text: string) => prompt(text),\n number: (text: string) => number(text),\n intro: (text: string) => activeBackground.white(` ${getThemeConfig().label} - ${text} `),\n get resolvedSymbol() {\n return active(\"\u25C7\");\n },\n get errorSymbol() {\n return color.red(\"\u25A0\");\n },\n accent: (text: string) => prompt(text),\n muted: (text: string) => color.dim(text),\n success: (text: string) => color.green(text),\n warning: (text: string) => color.yellow(text),\n error: (text: string) => color.red(text),\n info: (text: string) => active(text),\n badge: (text: string) => color.bgYellow.black(` ${text} `)\n },\n {\n accent: { fg: isPurple ? \"cyan\" : activeBrand.primary, bold: true },\n muted: { dim: true },\n success: { fg: \"green\" },\n warning: { fg: \"yellow\" },\n error: { fg: \"red\" },\n info: { fg: isPurple ? \"magenta\" : activeBrand.primary }\n }\n );\n}\n\nexport const dark = createPalette(brands.purple!, \"dark\");\nexport const light = createPalette(brands.purple!, \"light\");\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { getThemeConfig, getThemeRevision, isThemeBrandConfigured } from \"./theme-state.js\";\nimport { brands } from \"../tokens/brand.js\";\nimport { createPalette, dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n POE_BRAND?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nconst themeCache = new Map<string, ThemePalette>();\nlet cachedRevision = -1;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n const themeName = resolveThemeName(env);\n const config = getThemeConfig();\n const requestedBrand = env?.POE_BRAND?.toLowerCase();\n const activeBrandName =\n !isThemeBrandConfigured() && requestedBrand && Object.hasOwn(brands, requestedBrand)\n ? requestedBrand\n : config.brand;\n const revision = getThemeRevision();\n if (revision !== cachedRevision) {\n themeCache.clear();\n cachedRevision = revision;\n }\n const cacheKey = `${activeBrandName}:${themeName}`;\n const cachedTheme = themeCache.get(cacheKey);\n if (cachedTheme) {\n return cachedTheme;\n }\n const activeBrand = brands[activeBrandName]!;\n const theme =\n activeBrandName === \"purple\"\n ? themeName === \"light\"\n ? light\n : dark\n : createPalette(activeBrand, themeName);\n themeCache.set(cacheKey, theme);\n return theme;\n}\n\nexport function resetThemeCache(): void {\n themeCache.clear();\n cachedRevision = getThemeRevision();\n}\n", "import { color } from \"./color.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return color.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return color.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "export function stripAnsi(value: string): string {\n let output = \"\";\n let index = 0;\n\n while (index < value.length) {\n const char = value[index];\n\n if (char === \"\\u001b\") {\n index = skipEscapeSequence(value, index);\n continue;\n }\n\n if (char === \"\\u009b\") {\n index = skipCsiSequence(value, index + 1);\n continue;\n }\n\n output += char;\n index += char.length;\n }\n\n return output;\n}\n\nfunction skipEscapeSequence(value: string, index: number): number {\n const next = value[index + 1];\n\n if (next === \"[\") {\n return skipCsiSequence(value, index + 2);\n }\n\n if (next === \"]\") {\n return skipOscSequence(value, index + 2);\n }\n\n return Math.min(value.length, index + 2);\n}\n\nfunction skipCsiSequence(value: string, index: number): number {\n while (index < value.length) {\n const codePoint = value.charCodeAt(index);\n index += 1;\n\n if (codePoint >= 0x40 && codePoint <= 0x7e) {\n break;\n }\n }\n\n return index;\n}\n\nfunction skipOscSequence(value: string, index: number): number {\n while (index < value.length) {\n if (value[index] === \"\\u0007\") {\n return index + 1;\n }\n\n if (value[index] === \"\\u001b\" && value[index + 1] === \"\\\\\") {\n return index + 2;\n }\n\n index += 1;\n }\n\n return index;\n}\n", "import { color } from \"../../components/color.js\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction renderMarkdownInline(value: string): string {\n return stripAnsi(value).replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = color.gray(\"\u2502\"),\n secondarySymbol = color.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${renderMarkdownInline(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${renderMarkdownInline(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${renderMarkdownInline(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${renderMarkdownInline(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: color.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${renderMarkdownInline(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: color.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "import { color } from \"./color.js\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? color.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { typography } from \"../tokens/typography.js\";\nimport { text } from \"./text.js\";\n\nexport type HelpTokenRole = \"command\" | \"argument\" | \"option\" | \"literal\" | \"dim\";\n\nexport interface HelpToken {\n text: string;\n role: HelpTokenRole;\n}\n\nexport interface CommandInfo {\n name: string;\n /** Structured tokens for TTY/markdown styling. Plain `name` is used when absent. */\n nameTokens?: HelpToken[];\n description: string;\n /** Nesting depth relative to the help target. Depth 0 is a direct child. */\n depth?: number;\n}\n\nexport interface OptionInfo {\n flags: string;\n /** Structured tokens for TTY/markdown styling. Plain `flags` is used when absent. */\n flagTokens?: HelpToken[];\n description: string;\n}\n\nexport interface FormatColumnsOptions {\n rows: Array<{ left: string; right: string }>;\n totalWidth?: number;\n minLeftWidth?: number;\n maxLeftWidth?: number;\n gap?: number;\n indent?: number;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction normalizeInline(value: string): string {\n return value.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nfunction readControlSequence(value: string, index: number): number | undefined {\n if (value[index] !== \"\\u001b\") {\n return undefined;\n }\n\n if (value[index + 1] === \"[\") {\n let nextIndex = index + 2;\n while (nextIndex < value.length) {\n const code = value.charCodeAt(nextIndex);\n nextIndex += 1;\n if (code >= 0x40 && code <= 0x7e) {\n return nextIndex;\n }\n }\n return value.length;\n }\n\n if (value[index + 1] === \"]\") {\n let nextIndex = index + 2;\n while (nextIndex < value.length) {\n if (value[nextIndex] === \"\\u0007\") {\n return nextIndex + 1;\n }\n if (value[nextIndex] === \"\\u001b\" && value[nextIndex + 1] === \"\\\\\") {\n return nextIndex + 2;\n }\n nextIndex += 1;\n }\n return value.length;\n }\n\n return index + 1;\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n if (codePoints.some((codePoint) => codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f))) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => {\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return width;\n }\n return width + (isWideCodePoint(codePoint) ? 2 : 1);\n }, 0);\n}\n\nfunction visibleWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n const nextIndex = readControlSequence(value, index);\n if (nextIndex !== undefined) {\n index = nextIndex;\n continue;\n }\n\n const segment = graphemeSegmenter.segment(value.slice(index))[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n const cluster = segment?.segment ?? \"\";\n width += clusterWidth(cluster);\n index += cluster.length || 1;\n }\n\n return width;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction padEndVisible(value: string, width: number): string {\n return value + \" \".repeat(Math.max(0, width - visibleWidth(value)));\n}\n\nfunction isWhitespace(char: string | undefined): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\t\" || char === \"\\r\";\n}\n\nfunction splitWords(value: string): string[] {\n const words: string[] = [];\n let word = \"\";\n\n for (const char of value) {\n if (isWhitespace(char)) {\n if (word) {\n words.push(word);\n word = \"\";\n }\n continue;\n }\n word += char;\n }\n\n if (word) {\n words.push(word);\n }\n\n return words;\n}\n\nfunction leadingWhitespaceWidth(value: string): { prefix: string; rest: string } {\n let index = 0;\n while (index < value.length && isWhitespace(value[index])) {\n index += 1;\n }\n return { prefix: value.slice(0, index), rest: value.slice(index) };\n}\n\nfunction takeVisiblePrefix(value: string, width: number): { prefix: string; rest: string } {\n let visible = 0;\n let index = 0;\n\n while (index < value.length) {\n const controlEnd = readControlSequence(value, index);\n if (controlEnd !== undefined) {\n index = controlEnd;\n continue;\n }\n\n const segment = graphemeSegmenter.segment(value.slice(index))[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n const cluster = segment?.segment ?? value[index] ?? \"\";\n const nextWidth = clusterWidth(cluster);\n if (visible > 0 && visible + nextWidth > width) {\n break;\n }\n visible += nextWidth;\n index += cluster.length || 1;\n }\n\n return { prefix: value.slice(0, index), rest: value.slice(index) };\n}\n\nfunction wrapWords(value: string, width: number, continuationWidth = width): string[] {\n // Preserve leading whitespace only on the first wrapped line so hang-indented\n // left cells (command depth prefixes) do not re-indent every continuation.\n const { prefix, rest } = leadingWhitespaceWidth(value);\n const prefixWidth = visibleWidth(prefix);\n const firstContentWidth = Math.max(1, width - prefixWidth);\n const words = splitWords(rest);\n if (words.length === 0) {\n return [prefix];\n }\n\n const lines: string[] = [];\n let line = \"\";\n let isFirstLine = true;\n\n for (const word of words) {\n const limit = isFirstLine ? firstContentWidth : continuationWidth;\n if (line && visibleWidth(line) + 1 + visibleWidth(word) <= limit) {\n line += ` ${word}`;\n continue;\n }\n if (line) {\n lines.push(isFirstLine ? `${prefix}${line}` : line);\n isFirstLine = false;\n line = \"\";\n }\n\n let remaining = word;\n while (visibleWidth(remaining) > (isFirstLine ? firstContentWidth : continuationWidth)) {\n const chunk = takeVisiblePrefix(\n remaining,\n isFirstLine ? firstContentWidth : continuationWidth\n );\n lines.push(isFirstLine ? `${prefix}${chunk.prefix}` : chunk.prefix);\n isFirstLine = false;\n remaining = chunk.rest;\n }\n line = remaining;\n }\n\n lines.push(isFirstLine ? `${prefix}${line}` : line);\n return lines;\n}\n\nfunction validateLayoutValue(value: number, name: keyof Omit<FormatColumnsOptions, \"rows\">): void {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite non-negative number.`);\n }\n}\n\nexport function formatColumns(opts: FormatColumnsOptions): string {\n const rows = opts.rows.map((row) => ({\n left: normalizeInline(row.left),\n right: row.right\n }));\n if (rows.length === 0) {\n return \"\";\n }\n\n const totalWidth = opts.totalWidth ?? process.stdout.columns ?? 100;\n const minLeftWidth = opts.minLeftWidth ?? 12;\n const maxLeftWidth = opts.maxLeftWidth ?? 32;\n const gap = opts.gap ?? 3;\n const indent = opts.indent ?? 2;\n validateLayoutValue(totalWidth, \"totalWidth\");\n validateLayoutValue(minLeftWidth, \"minLeftWidth\");\n validateLayoutValue(maxLeftWidth, \"maxLeftWidth\");\n validateLayoutValue(gap, \"gap\");\n validateLayoutValue(indent, \"indent\");\n const maxLeftContentWidth = Math.max(...rows.map((row) => visibleWidth(row.left)));\n const leftWidth = clamp(maxLeftContentWidth + gap, minLeftWidth, maxLeftWidth);\n const rightWidth = Math.max(1, totalWidth - leftWidth - indent);\n const leftWrapWidth = Math.max(1, totalWidth - indent);\n const firstIndent = \" \".repeat(indent);\n const continuationIndent = \" \".repeat(indent + leftWidth);\n\n return rows\n .flatMap((row) => {\n const leftLeading = leadingWhitespaceWidth(row.left).prefix;\n // Continuations hang under the left cell start (including depth prefix) by +2.\n const leftHangIndent = \" \".repeat(indent + visibleWidth(leftLeading) + 2);\n const leftLines = wrapWords(\n row.left,\n leftWrapWidth,\n Math.max(1, totalWidth - visibleWidth(leftHangIndent))\n );\n\n if (row.right.length === 0) {\n return leftLines.map((line, index) =>\n index === 0 ? `${firstIndent}${line}` : `${leftHangIndent}${line}`\n );\n }\n\n const rightLines = wrapWords(row.right, rightWidth);\n const leftFitsInColumn = visibleWidth(row.left) < leftWidth;\n\n if (leftFitsInColumn && leftLines.length === 1) {\n const firstLine = `${firstIndent}${padEndVisible(leftLines[0] ?? \"\", leftWidth)}${rightLines[0]}`;\n const continuationLines = rightLines\n .slice(1)\n .map((line) => `${continuationIndent}${line}`);\n return [firstLine, ...continuationLines];\n }\n\n const renderedLeft = leftLines.map((line, index) =>\n index === 0 ? `${firstIndent}${line}` : `${leftHangIndent}${line}`\n );\n const renderedRight = rightLines.map((line) => `${continuationIndent}${line}`);\n return [...renderedLeft, ...renderedRight];\n })\n .join(\"\\n\");\n}\n\nexport function styleHelpToken(token: HelpToken): string {\n switch (token.role) {\n case \"command\":\n return text.command(token.text);\n case \"argument\":\n return styleArgumentToken(token.text);\n case \"option\":\n return text.option(token.text);\n case \"dim\":\n return styleDim(token.text);\n case \"literal\":\n return token.text;\n }\n}\n\nfunction styleArgumentToken(content: string): string {\n // Token text already includes angle brackets. text.argument re-wraps in markdown,\n // so strip first there; terminal/json keep the full `<value>` form.\n const format = resolveOutputFormat();\n if (format === \"markdown\" && content.startsWith(\"<\") && content.endsWith(\">\")) {\n return text.argument(content.slice(1, -1));\n }\n if (format === \"json\") {\n return content;\n }\n return text.argument(content);\n}\n\nfunction styleDim(content: string): string {\n // Structural brackets stay unstyled in markdown/json; italicizing them as muted is wrong.\n const format = resolveOutputFormat();\n if (format === \"json\" || format === \"markdown\") {\n return content;\n }\n return typography.dim(content);\n}\n\nexport function joinHelpTokens(tokens: HelpToken[]): string {\n return tokens.map((token) => token.text).join(\"\");\n}\n\nexport function renderHelpTokens(tokens: HelpToken[]): string {\n return tokens.map((token) => styleHelpToken(token)).join(\"\");\n}\n\nexport function formatCommand(name: string, description: string): string {\n return formatColumns({\n rows: [{ left: text.command(name), right: description }]\n });\n}\n\nexport function formatUsage(command: string, args?: string): string {\n const argsStr = args ? ` ${text.argument(args)}` : \"\";\n return `${text.usageCommand(command)}${argsStr}`;\n}\n\nexport function formatOption(flags: string, description: string): string {\n return formatColumns({\n rows: [{ left: text.option(flags), right: description }]\n });\n}\n\nexport function formatCommandList(commands: CommandInfo[]): string {\n return formatColumns({\n rows: commands.map((cmd) => {\n const depthPrefix = \" \".repeat((cmd.depth ?? 0) * 2);\n const styledName =\n cmd.nameTokens !== undefined && cmd.nameTokens.length > 0\n ? renderHelpTokens(cmd.nameTokens)\n : text.command(cmd.name);\n return {\n left: `${depthPrefix}${styledName}`,\n right: cmd.description\n };\n })\n });\n}\n\nexport function formatOptionList(options: OptionInfo[]): string {\n return formatColumns({\n rows: options.map((opt) => ({\n left:\n opt.flagTokens !== undefined && opt.flagTokens.length > 0\n ? renderHelpTokens(opt.flagTokens)\n : text.option(opt.flags),\n right: opt.description\n }))\n });\n}\n\nexport const helpFormatter = {\n formatColumns,\n formatCommand,\n formatUsage,\n formatOption,\n formatCommandList,\n formatOptionList,\n styleHelpToken,\n joinHelpTokens,\n renderHelpTokens\n} as const;\n", "import type { ThemePalette } from \"../tokens/colors.js\";\nimport { widths } from \"../tokens/widths.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n variant?: \"table\" | \"detail\";\n maxWidth?: number;\n}\n\ntype TableAlignment = TableColumn[\"alignment\"] | \"center\";\n\ninterface ComputedColumn {\n name: string;\n title: string;\n alignment: TableAlignment;\n width: number;\n}\n\nconst reset = \"\\x1b[0m\";\nconst ellipsis = \"\u2026\";\nconst minCellWidth = 4;\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction getCell(row: Record<string, string>, name: string): string {\n return Object.prototype.hasOwnProperty.call(row, name) ? row[name] ?? \"\" : \"\";\n}\n\nfunction renderMarkdownCell(value: string): string {\n return stripAnsi(value)\n .replaceAll(\"\\r\\n\", \" \")\n .replaceAll(\"\\n\", \" \")\n .replaceAll(\"\\r\", \" \")\n .replaceAll(\"|\", \"\\\\|\");\n}\n\nfunction isAnsiSequence(value: string, index: number): boolean {\n return value[index] === \"\\u001b\" && value[index + 1] === \"[\";\n}\n\nfunction readAnsiSequence(value: string, index: number): { sequence: string; nextIndex: number } {\n let nextIndex = index + 2;\n while (nextIndex < value.length && value[nextIndex] !== \"m\") {\n nextIndex += 1;\n }\n\n if (nextIndex < value.length) {\n nextIndex += 1;\n }\n\n return { sequence: value.slice(index, nextIndex), nextIndex };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction isEmojiClusterCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf)\n );\n}\n\nfunction codePointWidth(char: string): number {\n const codePoint = char.codePointAt(0) ?? 0;\n\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return 0;\n }\n\n if (\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isCombiningCodePoint(codePoint)\n ) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) ? 2 : 1;\n}\n\nfunction readPrintableCluster(value: string, index: number): string {\n const nextAnsiIndex = value.indexOf(\"\\u001b[\", index);\n const plainText = value.slice(index, nextAnsiIndex === -1 ? undefined : nextAnsiIndex);\n const firstSegment = graphemeSegmenter.segment(plainText)[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n\n return firstSegment?.segment ?? Array.from(plainText)[0] ?? \"\";\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n const isEmojiCluster =\n codePoints.length > 1 &&\n codePoints.some(\n (codePoint) =>\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isEmojiClusterCodePoint(codePoint)\n );\n\n if (isEmojiCluster) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => width + codePointWidth(String.fromCodePoint(codePoint)), 0);\n}\n\nfunction displayWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n index = readAnsiSequence(value, index).nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n width += clusterWidth(cluster);\n index += cluster.length;\n }\n\n return width;\n}\n\nfunction truncateToWidth(value: string, width: number): string {\n if (displayWidth(value) <= width) {\n return value;\n }\n\n if (width <= 0) {\n return \"\";\n }\n\n const targetWidth = width <= 1 ? 0 : width - displayWidth(ellipsis);\n let output = \"\";\n let currentWidth = 0;\n let index = 0;\n let sawAnsi = false;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n const ansi = readAnsiSequence(value, index);\n sawAnsi = true;\n output += ansi.sequence;\n index = ansi.nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n const width = clusterWidth(cluster);\n if (currentWidth + width > targetWidth) {\n break;\n }\n\n output += cluster;\n currentWidth += width;\n index += cluster.length;\n }\n\n return `${output}${ellipsis}${sawAnsi ? reset : \"\"}`;\n}\n\nfunction padCell(value: string, width: number, alignment: TableAlignment): string {\n const visibleWidth = displayWidth(value);\n const padding = Math.max(0, width - visibleWidth);\n\n if (alignment === \"right\") {\n return `${\" \".repeat(padding)}${value}`;\n }\n\n if (alignment === \"center\") {\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return `${\" \".repeat(left)}${value}${\" \".repeat(right)}`;\n }\n\n return `${value}${\" \".repeat(padding)}`;\n}\n\nfunction getAlignment(column: TableColumn): TableAlignment {\n const alignment = (column as { alignment: TableAlignment }).alignment;\n return alignment === \"right\" || alignment === \"center\" ? alignment : \"left\";\n}\n\nfunction getColumnWidth(column: TableColumn): number {\n if (!Number.isFinite(column.maxLen) || column.maxLen <= 0) {\n throw new Error(\"maxLen must be a positive finite number.\");\n }\n const configuredMin = (column as { minLen?: number }).minLen;\n const minWidth = Math.max(1, configuredMin ?? 1);\n return Math.max(minWidth, column.maxLen);\n}\n\nfunction computeColumns(columns: TableColumn[]): ComputedColumn[] {\n return columns.map((column) => ({\n name: column.name,\n title: column.title,\n alignment: getAlignment(column),\n width: getColumnWidth(column)\n }));\n}\n\n// Each column is framed as \"\u2502 cell \", plus the closing \"\u2502\".\nfunction frameWidth(columnCount: number): number {\n return columnCount * 3 + 1;\n}\n\n// Log output indents every line with a \"\u2502 \" guide, so a table emitted through the\n// logger has that much less room than the terminal. Undefined without a terminal:\n// piped output has no width to fit.\nexport function loggerTableWidth(): number | undefined {\n const columns = process.stdout.columns;\n return columns === undefined ? undefined : columns - 3;\n}\n\n// Without an explicit budget or a TTY there is no width to fit: the consumer of the\n// piped output decides, so columns keep their declared widths.\nfunction budgetColumns(columns: ComputedColumn[], maxWidth: number | undefined): ComputedColumn[] {\n if (maxWidth === undefined) {\n return columns;\n }\n\n const available = maxWidth - frameWidth(columns.length);\n const contentWidth = (cap: number) =>\n columns.reduce((total, column) => total + Math.min(column.width, cap), 0);\n\n if (columns.reduce((total, column) => total + column.width, 0) <= available) {\n return columns;\n }\n\n // Widest-first: raise a shared cap as far as the budget allows, so narrow columns\n // keep their declared width and only the columns above the cap lose room.\n let cap = minCellWidth;\n while (contentWidth(cap + 1) <= available) {\n cap += 1;\n }\n\n const budgeted = columns.map((column) => ({ ...column, width: Math.min(column.width, cap) }));\n let slack = available - contentWidth(cap);\n while (slack > 0) {\n const growable = budgeted.filter((column, index) => column.width < columns[index]!.width);\n if (growable.length === 0) {\n break;\n }\n for (const column of growable) {\n if (slack === 0) {\n break;\n }\n column.width += 1;\n slack -= 1;\n }\n }\n\n return budgeted;\n}\n\nfunction renderBorder(\n columns: ComputedColumn[],\n theme: ThemePalette,\n parts: { left: string; mid: string; right: string }\n): string {\n const horizontal = theme.muted(\"\u2500\");\n const segments = columns.map((column) => horizontal.repeat(column.width + 2));\n return [\n theme.muted(parts.left),\n segments.join(theme.muted(parts.mid)),\n theme.muted(parts.right)\n ].join(\"\");\n}\n\nfunction renderTerminalRow(values: string[], columns: ComputedColumn[], theme: ThemePalette): string {\n const vertical = theme.muted(\"\u2502\");\n const cells = values.map((value, index) => {\n const column = columns[index]!;\n const truncated = truncateToWidth(value, column.width);\n return ` ${padCell(truncated, column.width, column.alignment)} `;\n });\n\n return `${vertical}${cells.join(vertical)}${vertical}`;\n}\n\nfunction wrapDetailValue(value: string, width: number): string[] {\n const lines: string[] = [];\n\n for (const paragraph of value.split(\"\\n\")) {\n let line = \"\";\n\n for (const rawWord of paragraph.split(\" \")) {\n const words: string[] = [];\n let word = rawWord;\n\n while (displayWidth(word) > width) {\n let chunk = \"\";\n let index = 0;\n\n while (index < word.length) {\n const cluster = readPrintableCluster(word, index);\n if (displayWidth(`${chunk}${cluster}`) > width) {\n break;\n }\n chunk += cluster;\n index += cluster.length;\n }\n\n words.push(chunk);\n word = word.slice(chunk.length);\n }\n\n words.push(word);\n\n for (const word of words) {\n if (line.length === 0) {\n line = word;\n continue;\n }\n\n if (displayWidth(`${line} ${word}`) <= width) {\n line = `${line} ${word}`;\n continue;\n }\n\n lines.push(line);\n line = word;\n }\n }\n\n lines.push(line);\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n const computedColumns = computeColumns(columns);\n if (options.variant === \"detail\") {\n const labelColumn = computedColumns[0];\n const valueColumn = computedColumns[1];\n if (!labelColumn || !valueColumn) {\n return \"\";\n }\n\n const detailLabelWidth = widths.helpColumn + 12;\n const labelWidth = Math.min(labelColumn.width, detailLabelWidth);\n const valueWidth = Math.max(20, (options.maxWidth ?? widths.maxLine) - labelWidth - 2);\n const continuation = \" \".repeat(labelWidth + 2);\n\n return rows\n .flatMap((row) => {\n const label = truncateToWidth(getCell(row, labelColumn.name), labelWidth);\n const values = wrapDetailValue(getCell(row, valueColumn.name), valueWidth);\n if (values.length === 1 && values[0] === \"\") {\n return [theme.header(label)];\n }\n return [\n `${theme.muted(padCell(label, labelWidth, \"left\"))} ${values[0] ?? \"\"}`,\n ...values.slice(1).map((value) => `${continuation}${value}`)\n ];\n })\n .join(\"\\n\");\n }\n\n const separatorOptions = options as { rowSeparator?: boolean; rowSeparators?: boolean };\n const includeRowSeparators =\n separatorOptions.rowSeparator === true || separatorOptions.rowSeparators === true;\n\n const budgetedColumns = budgetColumns(computedColumns, options.maxWidth ?? process.stdout.columns);\n\n const top = renderBorder(budgetedColumns, theme, { left: \"\u250C\", mid: \"\u252C\", right: \"\u2510\" });\n const header = renderTerminalRow(\n budgetedColumns.map((column) => theme.header(column.title)),\n budgetedColumns,\n theme\n );\n const headerBottom = renderBorder(budgetedColumns, theme, { left: \"\u251C\", mid: \"\u253C\", right: \"\u2524\" });\n const bottom = renderBorder(budgetedColumns, theme, { left: \"\u2514\", mid: \"\u2534\", right: \"\u2518\" });\n\n const renderedRows: string[] = [];\n for (const [index, row] of rows.entries()) {\n if (includeRowSeparators && index > 0) {\n renderedRows.push(headerBottom);\n }\n renderedRows.push(\n renderTerminalRow(\n budgetedColumns.map((column) => getCell(row, column.name)),\n budgetedColumns,\n theme\n )\n );\n }\n\n return [top, header, headerBottom, ...renderedRows, bottom].join(\"\\n\");\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => renderMarkdownCell(c.title)).join(\" | \")} |`;\n const separator = `| ${columns\n .map((c) => {\n const alignment = getAlignment(c);\n if (alignment === \"right\") {\n return \"---:\";\n }\n if (alignment === \"center\") {\n return \":---:\";\n }\n return \":---\";\n })\n .join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => renderMarkdownCell(getCell(row, c.name))).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj = Object.create(null) as Record<string, string>;\n for (const col of columns) {\n obj[col.name] = stripAnsi(getCell(row, col.name));\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import stringWidth from \"fast-string-width\";\nimport { wrapAnsi } from \"fast-wrap-ansi\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { widths } from \"../tokens/widths.js\";\n\nexport interface DetailCardRow {\n label: string;\n value: string;\n}\n\nexport interface DetailCardSection {\n title?: string;\n rows: DetailCardRow[];\n}\n\nexport interface RenderDetailCardOptions {\n theme: ThemePalette;\n title: string;\n subtitle?: string;\n badges?: string[];\n prose?: Array<{ title?: string; value: string }>;\n sections?: DetailCardSection[];\n width?: number;\n}\n\nfunction wrap(value: string, width: number): string[] {\n return wrapAnsi(value, Math.max(1, width), { hard: true, trim: true }).split(\"\\n\");\n}\n\nfunction renderRows(rows: DetailCardRow[], theme: ThemePalette, width: number): string[] {\n if (rows.length === 0) return [];\n const labelWidth = Math.max(...rows.map((row) => stringWidth(row.label)));\n const valueWidth = Math.max(20, width - labelWidth - 2);\n const continuation = \" \".repeat(labelWidth + 2);\n\n return rows.flatMap((row) => {\n const values = wrap(row.value, valueWidth);\n return [\n `${theme.muted(row.label.padEnd(labelWidth))} ${values[0] ?? \"\"}`,\n ...values.slice(1).map((value) => `${continuation}${value}`)\n ];\n });\n}\n\nexport function renderDetailCard(options: RenderDetailCardOptions): string {\n const width = options.width ?? widths.maxLine;\n const identity = [\n options.theme.header(options.title),\n options.subtitle ? options.theme.muted(options.subtitle) : undefined\n ]\n .filter((value): value is string => value !== undefined)\n .join(\" \");\n\n const hero = options.badges?.length\n ? `${identity}\\n${options.theme.muted(options.badges.map((badge) => badge[0] + badge.slice(1).toLowerCase()).join(\" \u00B7 \"))}`\n : identity;\n const blocks: string[] = [hero];\n for (const prose of options.prose ?? []) {\n blocks.push(\n prose.title\n ? [options.theme.header(prose.title), wrap(prose.value, width).join(\"\\n\")].join(\"\\n\")\n : wrap(prose.value, width).join(\"\\n\")\n );\n }\n\n for (const section of options.sections ?? []) {\n if (section.rows.length === 0) continue;\n const rows = renderRows(section.rows, options.theme, width);\n blocks.push(\n section.title ? [options.theme.header(section.title), ...rows].join(\"\\n\") : rows.join(\"\\n\")\n );\n }\n\n return blocks.join(\"\\n\\n\");\n}\n", "export type TemplateEscape = \"html\" | \"none\";\n\nexport interface RenderTemplateOptions {\n escape?: TemplateEscape;\n partials?: Record<string, string>;\n validate?: boolean;\n yield?: string;\n}\n\ntype Token =\n | { type: \"text\"; value: string; start: number }\n | { type: \"name\" | \"unescaped\"; name: string; raw: string }\n | { type: \"partial\"; name: string; indent: string }\n | {\n type: \"section\" | \"inverted\";\n name: string;\n children: Token[];\n rawStart: number;\n rawEnd: number;\n };\n\ninterface SectionFrame {\n token: Extract<Token, { type: \"section\" | \"inverted\" }>;\n parent: Token[];\n}\n\ninterface Context {\n view: unknown;\n parent?: Context;\n}\n\ntype Lambda = (...args: unknown[]) => unknown;\n\ninterface RenderState {\n escape: (value: string) => string;\n partials: Record<string, string>;\n partialStack: string[];\n preserveMissing: boolean;\n validate: boolean;\n}\n\nconst MAX_PARTIAL_DEPTH = 100;\n\nconst MAX_TAG_EXCERPT_LENGTH = 40;\n\nexport class TemplateParseError extends Error {\n readonly description: string;\n readonly line: number;\n readonly column: number;\n\n constructor(description: string, position: { line: number; column: number }) {\n super(`${description} at line ${position.line}, column ${position.column}`);\n this.name = \"TemplateParseError\";\n this.description = description;\n this.line = position.line;\n this.column = position.column;\n }\n}\n\nconst HTML_ESCAPE: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n \"/\": \"&#x2F;\",\n \"`\": \"&#x60;\",\n \"=\": \"&#x3D;\"\n};\n\nexport function renderTemplate(\n template: string,\n view: Record<string, unknown>,\n options: RenderTemplateOptions = {}\n): string {\n const prepared =\n options.yield === undefined\n ? template\n : resolveTemplatePartials(template, options.partials ?? {})\n .split(\"{{yield}}\")\n .join(options.yield);\n const tokens = parseTemplate(prepared);\n validatePartialReferences(tokens, options.partials ?? {}, []);\n if (options.validate === true) {\n const expanded = resolveTemplatePartials(prepared, options.partials ?? {});\n validateVariables(parseTemplate(expanded), { view });\n }\n const state: RenderState = {\n escape: options.escape === \"none\" ? String : escapeHtml,\n partials: options.partials ?? {},\n partialStack: [],\n preserveMissing: options.yield !== undefined && options.escape === \"none\",\n validate: options.validate === true\n };\n\n return renderTokens(tokens, { view }, prepared, state);\n}\n\nexport function getTemplatePartialNames(template: string): string[] {\n const names = new Set<string>();\n collectPartialNames(parseTemplate(template), names);\n return [...names];\n}\n\nexport function resolveTemplatePartials(\n template: string,\n partials: Record<string, string>\n): string {\n return expandTemplatePartials(template, partials, []);\n}\n\nfunction renderTemplateInContext(template: string, context: Context, state: RenderState): string {\n return renderTokens(parseTemplate(template), context, template, state);\n}\n\nfunction parseTemplate(template: string): Token[] {\n const root: Token[] = [];\n const stack: SectionFrame[] = [];\n let tokens = root;\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n appendText(tokens, template.slice(index), index);\n break;\n }\n\n appendText(tokens, template.slice(index, open), index);\n\n const parsed = parseTag(template, open);\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n if (standalone !== undefined) {\n trimTextAfter(tokens, standalone.lineStart);\n }\n\n if (parsed.kind === \"comment\") {\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"delimiter\") {\n throw new Error(\"Custom delimiters are not supported\");\n }\n\n if (parsed.kind === \"section\" || parsed.kind === \"inverted\") {\n const token: Token = {\n type: parsed.kind,\n name: parsed.name,\n children: [],\n rawStart: parsed.end,\n rawEnd: standalone?.lineStart ?? open\n };\n tokens.push(token);\n stack.push({ token, parent: tokens });\n tokens = token.children;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"partial\") {\n tokens.push({\n type: \"partial\",\n name: parsed.name,\n indent: standalone === undefined ? \"\" : template.slice(standalone.lineStart, open)\n });\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"close\") {\n const frame = stack.pop();\n if (frame === undefined) {\n throw new Error(`Closing unopened section \"${parsed.name}\"`);\n }\n if (frame.token.name !== parsed.name) {\n throw new Error(`Unclosed section \"${frame.token.name}\" before closing \"${parsed.name}\"`);\n }\n frame.token.rawEnd = open;\n tokens = frame.parent;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n tokens.push({ type: parsed.kind, name: parsed.name, raw: template.slice(open, parsed.end) });\n index = parsed.end;\n }\n\n const frame = stack.pop();\n if (frame !== undefined) {\n throw new Error(`Unclosed section \"${frame.token.name}\"`);\n }\n\n return root;\n}\n\nfunction parseTag(\n template: string,\n open: number\n): {\n kind:\n | \"name\"\n | \"unescaped\"\n | \"section\"\n | \"inverted\"\n | \"close\"\n | \"comment\"\n | \"partial\"\n | \"delimiter\";\n name: string;\n end: number;\n} {\n if (template.startsWith(\"{{{\", open)) {\n const close = template.indexOf(\"}}}\", open + 3);\n if (close === -1) {\n throw unclosedTagError(template, open, \"}}}\");\n }\n return { kind: \"unescaped\", name: template.slice(open + 3, close).trim(), end: close + 3 };\n }\n\n const close = template.indexOf(\"}}\", open + 2);\n if (close === -1) {\n throw unclosedTagError(template, open, \"}}\");\n }\n\n const raw = template.slice(open + 2, close).trim();\n const sigil = raw[0];\n const name = sigil === undefined ? \"\" : raw.slice(1).trim();\n const end = close + 2;\n\n if (sigil === \"#\") return { kind: \"section\", name, end };\n if (sigil === \"^\") return { kind: \"inverted\", name, end };\n if (sigil === \"/\") return { kind: \"close\", name, end };\n if (sigil === \"!\") return { kind: \"comment\", name, end };\n if (sigil === \"&\") return { kind: \"unescaped\", name, end };\n if (sigil === \">\") return { kind: \"partial\", name, end };\n if (sigil === \"=\" && raw.endsWith(\"=\")) return { kind: \"delimiter\", name, end };\n\n return { kind: \"name\", name: raw, end };\n}\n\nfunction unclosedTagError(template: string, open: number, expected: string): TemplateParseError {\n const before = template.slice(0, open);\n const lineEnd = template.indexOf(\"\\n\", open);\n const opened = template.slice(open, lineEnd === -1 ? template.length : lineEnd).trimEnd();\n const tag =\n opened.length > MAX_TAG_EXCERPT_LENGTH\n ? `${opened.slice(0, MAX_TAG_EXCERPT_LENGTH)}...`\n : opened;\n\n return new TemplateParseError(`Unclosed tag \"${tag}\": expected \"${expected}\"`, {\n line: before.split(\"\\n\").length,\n column: open - (before.lastIndexOf(\"\\n\") + 1) + 1\n });\n}\n\nfunction getStandalone(\n template: string,\n tagStart: number,\n tagEnd: number,\n kind: ReturnType<typeof parseTag>[\"kind\"]\n): { lineStart: number; nextIndex: number } | undefined {\n if (![\"section\", \"inverted\", \"close\", \"comment\", \"partial\", \"delimiter\"].includes(kind)) {\n return undefined;\n }\n\n const lineStart = template.lastIndexOf(\"\\n\", tagStart - 1) + 1;\n if (!isWhitespace(template.slice(lineStart, tagStart))) {\n return undefined;\n }\n\n let cursor = tagEnd;\n while (cursor < template.length && (template[cursor] === \" \" || template[cursor] === \"\\t\")) {\n cursor += 1;\n }\n\n if (template.startsWith(\"\\r\\n\", cursor)) {\n return { lineStart, nextIndex: cursor + 2 };\n }\n\n if (template[cursor] === \"\\n\") {\n return { lineStart, nextIndex: cursor + 1 };\n }\n\n if (cursor === template.length) {\n return { lineStart, nextIndex: cursor };\n }\n\n return undefined;\n}\n\nfunction renderTokens(\n tokens: Token[],\n context: Context,\n template: string,\n state: RenderState\n): string {\n let output = \"\";\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n output += token.value;\n continue;\n\n case \"name\":\n case \"unescaped\": {\n const result = lookup(context, token.name);\n if (!result.hit || result.value == null) {\n if (state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n if (state.preserveMissing) {\n output += token.raw;\n }\n continue;\n }\n const rendered = String(result.value);\n output += token.type === \"name\" ? state.escape(rendered) : rendered;\n continue;\n }\n\n case \"partial\": {\n if (!Object.hasOwn(state.partials, token.name)) {\n throw new Error(`Partial \"${token.name}\" not found.`);\n }\n if (state.partialStack.includes(token.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...state.partialStack, token.name].join(\" -> \")}.`\n );\n }\n if (state.partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n const partial = indentPartial(state.partials[token.name], token.indent);\n output += renderTokens(parseTemplate(partial), context, partial, {\n ...state,\n partialStack: [...state.partialStack, token.name]\n });\n continue;\n }\n\n case \"inverted\": {\n const result = lookup(context, token.name);\n if (!result.hit && state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n const value = result.value;\n if (!value || (Array.isArray(value) && value.length === 0)) {\n output += renderTokens(token.children, context, template, state);\n }\n continue;\n }\n\n case \"section\": {\n const result = lookup(context, token.name);\n if (!result.hit && state.validate) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n const value = result.value;\n if (!value) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n output += renderTokens(token.children, pushContext(context, item), template, state);\n }\n continue;\n }\n\n if (typeof value === \"function\") {\n const raw = template.slice(token.rawStart, token.rawEnd);\n const rendered = (value as Lambda).call(context.view, raw, (nextTemplate: string) =>\n renderTemplateInContext(nextTemplate, context, state)\n );\n if (rendered != null) {\n output += String(rendered);\n }\n continue;\n }\n\n if (typeof value === \"object\" || typeof value === \"string\" || typeof value === \"number\") {\n output += renderTokens(token.children, pushContext(context, value), template, state);\n continue;\n }\n\n output += renderTokens(token.children, context, template, state);\n }\n }\n }\n\n return output;\n}\n\nfunction lookup(context: Context, name: string): { hit: boolean; value: unknown } {\n if (name === \".\") {\n return { hit: true, value: callLambda(context.view, context.view) };\n }\n\n let cursor: Context | undefined = context;\n while (cursor !== undefined) {\n const result = name.includes(\".\")\n ? lookupDotted(cursor.view, name)\n : lookupName(cursor.view, name);\n\n if (result.hit) {\n return { hit: true, value: callLambda(result.value, cursor.view) };\n }\n\n cursor = cursor.parent;\n }\n\n return { hit: false, value: undefined };\n}\n\nfunction collectPartialNames(tokens: Token[], names: Set<string>): void {\n for (const token of tokens) {\n if (token.type === \"partial\") {\n names.add(token.name);\n continue;\n }\n if (token.type === \"section\" || token.type === \"inverted\") {\n collectPartialNames(token.children, names);\n }\n }\n}\n\nfunction validateVariables(tokens: Token[], context: Context): void {\n for (const token of tokens) {\n if (token.type === \"text\" || token.type === \"partial\") {\n continue;\n }\n if (token.type === \"name\" || token.type === \"unescaped\") {\n if (!lookup(context, token.name).hit) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n continue;\n }\n if (token.type !== \"section\" && token.type !== \"inverted\") {\n continue;\n }\n\n const result = lookup(context, token.name);\n if (!result.hit) {\n throw new Error(`Template variable \"${token.name}\" not found.`);\n }\n if (Array.isArray(result.value) && result.value.length > 0) {\n for (const item of result.value) {\n validateVariables(token.children, pushContext(context, item));\n }\n continue;\n }\n if (\n typeof result.value === \"object\" && result.value !== null ||\n typeof result.value === \"string\" ||\n typeof result.value === \"number\"\n ) {\n validateVariables(token.children, pushContext(context, result.value));\n continue;\n }\n\n validateVariables(token.children, context);\n }\n}\n\nfunction validatePartialReferences(\n tokens: Token[],\n partials: Record<string, string>,\n partialStack: string[]\n): void {\n for (const token of tokens) {\n if (token.type === \"section\" || token.type === \"inverted\") {\n validatePartialReferences(token.children, partials, partialStack);\n continue;\n }\n if (token.type !== \"partial\") {\n continue;\n }\n if (!Object.hasOwn(partials, token.name)) {\n throw new Error(`Partial \"${token.name}\" not found.`);\n }\n if (partialStack.includes(token.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...partialStack, token.name].join(\" -> \")}.`\n );\n }\n if (partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n validatePartialReferences(parseTemplate(partials[token.name]), partials, [\n ...partialStack,\n token.name\n ]);\n }\n}\n\nfunction indentPartial(partial: string, indent: string): string {\n if (indent === \"\") {\n return partial;\n }\n\n return partial\n .split(\"\\n\")\n .map((line) => (line === \"\" ? \"\" : `${indent}${line}`))\n .join(\"\\n\");\n}\n\nfunction expandTemplatePartials(\n template: string,\n partials: Record<string, string>,\n partialStack: string[]\n): string {\n let output = \"\";\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n output += template.slice(index);\n break;\n }\n\n const parsed = parseTag(template, open);\n if (parsed.kind !== \"partial\") {\n output += template.slice(index, parsed.end);\n index = parsed.end;\n continue;\n }\n\n if (!Object.hasOwn(partials, parsed.name)) {\n throw new Error(`Partial \"${parsed.name}\" not found.`);\n }\n if (partialStack.includes(parsed.name)) {\n throw new Error(\n `Circular partial reference detected: ${[...partialStack, parsed.name].join(\" -> \")}.`\n );\n }\n if (partialStack.length >= MAX_PARTIAL_DEPTH) {\n throw new Error(`Maximum partial depth exceeded (${MAX_PARTIAL_DEPTH}).`);\n }\n\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n const beforePartial =\n standalone === undefined\n ? template.slice(index, open)\n : template.slice(index, standalone.lineStart);\n const indent = standalone === undefined ? \"\" : template.slice(standalone.lineStart, open);\n const partial = indentPartial(partials[parsed.name], indent);\n output +=\n beforePartial + expandTemplatePartials(partial, partials, [...partialStack, parsed.name]);\n index = standalone?.nextIndex ?? parsed.end;\n }\n\n return output;\n}\n\nfunction lookupName(view: unknown, name: string): { hit: boolean; value: unknown } {\n if (!isPropertyContainer(view) || !hasProperty(view, name)) {\n return { hit: false, value: undefined };\n }\n\n return { hit: true, value: view[name] };\n}\n\nfunction lookupDotted(view: unknown, name: string): { hit: boolean; value: unknown } {\n const parts = name.split(\".\");\n let value = view;\n\n for (const part of parts) {\n if (!isPropertyContainer(value) || !hasProperty(value, part)) {\n return { hit: false, value: undefined };\n }\n value = Object(value)[part as keyof typeof value];\n }\n\n return { hit: true, value };\n}\n\nfunction callLambda(value: unknown, view: unknown): unknown {\n return typeof value === \"function\" ? (value as Lambda).call(view) : value;\n}\n\nfunction pushContext(parent: Context, view: unknown): Context {\n return { view, parent };\n}\n\nfunction appendText(tokens: Token[], value: string, start: number): void {\n if (value === \"\") {\n return;\n }\n\n const previous = tokens[tokens.length - 1];\n if (previous?.type === \"text\") {\n previous.value += value;\n return;\n }\n\n tokens.push({ type: \"text\", value, start });\n}\n\nfunction trimTextAfter(tokens: Token[], lineStart: number): void {\n const previous = tokens[tokens.length - 1];\n if (previous?.type !== \"text\") {\n return;\n }\n\n const keep = Math.max(0, lineStart - previous.start);\n previous.value = previous.value.slice(0, keep);\n if (previous.value === \"\") {\n tokens.pop();\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"'`=/]/g, (char) => HTML_ESCAPE[char] ?? char);\n}\n\nfunction isWhitespace(value: string): boolean {\n return value.trim() === \"\";\n}\n\nfunction isPropertyContainer(value: unknown): value is Record<string, unknown> {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nfunction hasProperty(value: object, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(value, key);\n}\n", "import { spawn } from \"node:child_process\";\nimport process from \"node:process\";\n\ninterface BrowserProcess {\n once(event: \"error\", listener: (error: Error) => void): this;\n once(event: \"close\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;\n unref(): void;\n}\n\ntype SpawnBrowserProcess = (\n command: string,\n args: string[],\n options: { detached: true; stdio: \"ignore\" }\n) => BrowserProcess;\n\nexport interface OpenExternalOptions {\n platform?: NodeJS.Platform;\n spawnProcess?: SpawnBrowserProcess;\n}\n\nexport async function openExternal(url: string, options: OpenExternalOptions = {}): Promise<void> {\n const parsed = new URL(url);\n const { command, args } = browserCommand(parsed.href, options.platform ?? process.platform);\n await launchBrowser(command, args, options.spawnProcess ?? spawn);\n}\n\nfunction browserCommand(url: string, platform: NodeJS.Platform): { command: string; args: string[] } {\n if (platform === \"darwin\") {\n return { command: \"open\", args: [url] };\n }\n\n if (platform === \"win32\") {\n return { command: \"rundll32.exe\", args: [\"url.dll,FileProtocolHandler\", url] };\n }\n\n return { command: \"xdg-open\", args: [url] };\n}\n\nfunction launchBrowser(\n command: string,\n args: string[],\n spawnProcess: SpawnBrowserProcess\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawnProcess(command, args, { detached: true, stdio: \"ignore\" });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (code !== 0) {\n const reason = code === null ? `signal ${signal ?? \"unknown\"}` : `code ${code}`;\n reject(new Error(`Browser launcher exited with ${reason}`));\n return;\n }\n\n child.unref();\n resolve();\n });\n });\n}\n", "import type { CodeToken, CodeTokenKind, MdNode } from \"../ast.js\";\n\ntype CodeHighlightFamily = \"lexical\" | \"data\" | \"style\" | \"line\" | \"markup\";\n\ntype CodeLanguageInfo = {\n id: string;\n aliases: readonly string[];\n family?: CodeHighlightFamily;\n spec?: string;\n plain?: boolean;\n};\n\ntype CodeTokenizer = (source: string, language: CodeLanguageInfo) => CodeToken[];\n\ntype TokenEmitter = {\n push(kind: CodeTokenKind, start: number, end: number): void;\n pushPlain(start: number, end: number): void;\n};\n\ntype LexicalSpec = {\n keywords?: ReadonlySet<string>;\n types?: ReadonlySet<string>;\n constants?: ReadonlySet<string>;\n booleans?: ReadonlySet<string>;\n nulls?: ReadonlySet<string>;\n commands?: ReadonlySet<string>;\n lineComments?: readonly string[];\n blockComments?: readonly BlockCommentDelimiter[];\n stringQuotes?: readonly string[];\n templateQuotes?: boolean;\n tripleStringQuotes?: boolean;\n decorators?: boolean;\n rustAttributes?: boolean;\n variablePrefix?: \"$\";\n flags?: boolean;\n caseInsensitive?: boolean;\n};\n\ntype BlockCommentDelimiter = {\n start: string;\n end: string;\n};\n\nconst cStyleBlockComments = [{ start: \"/*\", end: \"*/\" }] as const;\n\nconst codeLanguages: readonly CodeLanguageInfo[] = [\n {\n id: \"javascript\",\n aliases: [\"js\", \"javascript\", \"mjs\", \"cjs\", \"es6\"],\n family: \"lexical\",\n spec: \"javascript\"\n },\n { id: \"javascriptreact\", aliases: [\"jsx\"], family: \"lexical\", spec: \"javascript\" },\n {\n id: \"typescript\",\n aliases: [\"ts\", \"typescript\", \"mts\", \"cts\"],\n family: \"lexical\",\n spec: \"typescript\"\n },\n { id: \"typescriptreact\", aliases: [\"tsx\"], family: \"lexical\", spec: \"typescript\" },\n { id: \"json\", aliases: [\"json\"], family: \"data\", spec: \"json\" },\n { id: \"jsonc\", aliases: [\"jsonc\"], family: \"data\", spec: \"jsonc\" },\n { id: \"jsonl\", aliases: [\"jsonl\"], family: \"data\", spec: \"json\" },\n { id: \"yaml\", aliases: [\"yaml\", \"yml\"], family: \"data\", spec: \"yaml\" },\n { id: \"css\", aliases: [\"css\"], family: \"style\", spec: \"css\" },\n { id: \"scss\", aliases: [\"scss\"], family: \"style\", spec: \"css\" },\n { id: \"sass\", aliases: [\"sass\"], family: \"style\", spec: \"css\" },\n { id: \"less\", aliases: [\"less\"], family: \"style\", spec: \"css\" },\n { id: \"postcss\", aliases: [\"postcss\"], family: \"style\", spec: \"css\" },\n { id: \"shellscript\", aliases: [\"sh\", \"bash\", \"shell\", \"shellscript\", \"zsh\", \"fish\"], family: \"lexical\", spec: \"shell\" },\n { id: \"python\", aliases: [\"py\", \"python\"], family: \"lexical\", spec: \"python\" },\n { id: \"sql\", aliases: [\"sql\", \"ddl\", \"dml\"], family: \"lexical\", spec: \"sql\" },\n { id: \"html\", aliases: [\"html\"], family: \"markup\", spec: \"html\" },\n { id: \"xml\", aliases: [\"xml\", \"svg\"], family: \"markup\", spec: \"xml\" },\n { id: \"markdown\", aliases: [\"md\", \"markdown\"], family: \"line\", spec: \"markdown\" },\n { id: \"diff\", aliases: [\"diff\", \"patch\"], family: \"line\", spec: \"diff\" },\n { id: \"dockerfile\", aliases: [\"dockerfile\", \"docker\"], family: \"line\", spec: \"dockerfile\" },\n { id: \"ini\", aliases: [\"ini\", \"properties\"], family: \"data\", spec: \"ini\" },\n { id: \"toml\", aliases: [\"toml\"], family: \"data\", spec: \"toml\" },\n { id: \"plaintext\", aliases: [\"text\", \"txt\", \"plain\", \"plaintext\"], plain: true },\n { id: \"ruby\", aliases: [\"rb\", \"ruby\"], family: \"lexical\", spec: \"ruby\" },\n { id: \"go\", aliases: [\"go\", \"golang\"], family: \"lexical\", spec: \"go\" },\n { id: \"java\", aliases: [\"java\"], family: \"lexical\", spec: \"java\" },\n { id: \"kotlin\", aliases: [\"kt\", \"kotlin\", \"kts\"], family: \"lexical\", spec: \"kotlin\" },\n { id: \"swift\", aliases: [\"swift\"], family: \"lexical\", spec: \"swift\" },\n { id: \"dart\", aliases: [\"dart\"], family: \"lexical\", spec: \"dart\" },\n { id: \"scala\", aliases: [\"scala\", \"sc\"], family: \"lexical\", spec: \"scala\" },\n { id: \"groovy\", aliases: [\"groovy\", \"gvy\", \"gy\", \"gsp\"], family: \"lexical\", spec: \"groovy\" },\n { id: \"c\", aliases: [\"c\"], family: \"lexical\", spec: \"c\" },\n { id: \"cpp\", aliases: [\"cpp\", \"c++\", \"cc\", \"cxx\"], family: \"lexical\", spec: \"cpp\" },\n { id: \"csharp\", aliases: [\"cs\", \"csharp\", \"c#\"], family: \"lexical\", spec: \"csharp\" },\n { id: \"objective-c\", aliases: [\"objc\", \"objectivec\", \"objective-c\", \"m\", \"mm\"], family: \"lexical\", spec: \"objectivec\" },\n { id: \"rust\", aliases: [\"rs\", \"rust\"], family: \"lexical\", spec: \"rust\" },\n { id: \"php\", aliases: [\"php\"], family: \"lexical\", spec: \"php\" },\n { id: \"lua\", aliases: [\"lua\"], family: \"lexical\", spec: \"lua\" },\n { id: \"perl\", aliases: [\"pl\", \"perl\", \"pm\"], family: \"lexical\", spec: \"perl\" },\n { id: \"r\", aliases: [\"r\", \"rscript\"], family: \"lexical\", spec: \"r\" },\n { id: \"powershell\", aliases: [\"ps1\", \"powershell\", \"pwsh\"], family: \"lexical\", spec: \"powershell\" },\n { id: \"elixir\", aliases: [\"ex\", \"exs\", \"elixir\"], family: \"lexical\", spec: \"elixir\" },\n { id: \"erlang\", aliases: [\"erl\", \"erlang\", \"hrl\"], family: \"lexical\", spec: \"erlang\" },\n { id: \"haskell\", aliases: [\"hs\", \"haskell\"], family: \"lexical\", spec: \"haskell\" },\n { id: \"clojure\", aliases: [\"clj\", \"cljs\", \"cljc\", \"clojure\"], family: \"lexical\", spec: \"clojure\" },\n { id: \"fsharp\", aliases: [\"fs\", \"fsi\", \"fsx\", \"fsharp\"], family: \"lexical\", spec: \"fsharp\" },\n { id: \"vb\", aliases: [\"vb\", \"vbnet\"], family: \"lexical\", spec: \"vb\" },\n { id: \"graphql\", aliases: [\"graphql\", \"gql\"], family: \"lexical\", spec: \"graphql\" },\n { id: \"protobuf\", aliases: [\"proto\", \"protobuf\"], family: \"lexical\", spec: \"protobuf\" },\n { id: \"hcl\", aliases: [\"hcl\", \"tf\", \"terraform\"], family: \"lexical\", spec: \"hcl\" },\n { id: \"nginx\", aliases: [\"nginx\", \"nginxconf\"], family: \"lexical\", spec: \"nginx\" },\n { id: \"makefile\", aliases: [\"makefile\", \"mk\"], family: \"lexical\", spec: \"makefile\" },\n { id: \"cmake\", aliases: [\"cmake\"], family: \"lexical\", spec: \"cmake\" },\n { id: \"gradle\", aliases: [\"gradle\"], family: \"lexical\", spec: \"groovy\" },\n { id: \"env\", aliases: [\"env\", \"dotenv\"], family: \"data\", spec: \"ini\" },\n { id: \"vue\", aliases: [\"vue\"], family: \"markup\", spec: \"html\" },\n { id: \"svelte\", aliases: [\"svelte\"], family: \"markup\", spec: \"html\" }\n] as const;\n\nconst languageByAlias = new Map<string, CodeLanguageInfo>();\n\nfor (const language of codeLanguages) {\n languageByAlias.set(language.id.toLowerCase(), language);\n\n for (const alias of language.aliases) {\n languageByAlias.set(alias.toLowerCase(), language);\n }\n}\n\nconst jsKeywords = new Set([\n \"as\",\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"export\",\n \"extends\",\n \"finally\",\n \"for\",\n \"from\",\n \"function\",\n \"get\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"of\",\n \"return\",\n \"set\",\n \"static\",\n \"super\",\n \"switch\",\n \"throw\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nconst tsKeywords = new Set([\n ...jsKeywords,\n \"abstract\",\n \"declare\",\n \"enum\",\n \"implements\",\n \"interface\",\n \"keyof\",\n \"namespace\",\n \"private\",\n \"protected\",\n \"public\",\n \"readonly\",\n \"satisfies\",\n \"type\"\n]);\n\nconst tsTypes = new Set([\n \"any\",\n \"bigint\",\n \"boolean\",\n \"never\",\n \"number\",\n \"object\",\n \"string\",\n \"symbol\",\n \"unknown\",\n \"void\"\n]);\n\nconst jsConstants = new Set([\"true\", \"false\", \"null\", \"undefined\", \"NaN\", \"Infinity\"]);\n\nconst pythonKeywords = new Set([\n \"and\",\n \"as\",\n \"assert\",\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"class\",\n \"continue\",\n \"def\",\n \"del\",\n \"elif\",\n \"else\",\n \"except\",\n \"finally\",\n \"for\",\n \"from\",\n \"global\",\n \"if\",\n \"import\",\n \"in\",\n \"is\",\n \"lambda\",\n \"match\",\n \"nonlocal\",\n \"not\",\n \"or\",\n \"pass\",\n \"raise\",\n \"return\",\n \"try\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nconst pythonTypes = new Set([\"Any\", \"Callable\", \"Iterable\", \"None\", \"Protocol\", \"Self\", \"TypeVar\", \"bool\", \"bytes\", \"dict\", \"float\", \"int\", \"list\", \"object\", \"set\", \"str\", \"tuple\"]);\nconst pythonBooleans = new Set([\"True\", \"False\"]);\nconst pythonNulls = new Set([\"None\", \"NotImplemented\", \"Ellipsis\"]);\n\nconst shellKeywords = new Set([\"case\", \"do\", \"done\", \"elif\", \"else\", \"esac\", \"fi\", \"for\", \"function\", \"if\", \"in\", \"select\", \"then\", \"until\", \"while\"]);\nconst shellCommands = new Set([\"awk\", \"cat\", \"cd\", \"chmod\", \"cp\", \"echo\", \"env\", \"export\", \"find\", \"grep\", \"mkdir\", \"mv\", \"printf\", \"pwd\", \"rm\", \"sed\", \"test\"]);\n\nconst sqlKeywords = new Set([\n \"add\",\n \"alter\",\n \"and\",\n \"as\",\n \"by\",\n \"case\",\n \"create\",\n \"delete\",\n \"desc\",\n \"distinct\",\n \"drop\",\n \"else\",\n \"end\",\n \"exists\",\n \"from\",\n \"group\",\n \"having\",\n \"in\",\n \"insert\",\n \"into\",\n \"is\",\n \"join\",\n \"left\",\n \"limit\",\n \"not\",\n \"null\",\n \"on\",\n \"or\",\n \"order\",\n \"outer\",\n \"primary\",\n \"references\",\n \"right\",\n \"select\",\n \"set\",\n \"table\",\n \"then\",\n \"union\",\n \"update\",\n \"values\",\n \"when\",\n \"where\"\n]);\n\nconst rubyKeywords = new Set([\"alias\", \"and\", \"begin\", \"break\", \"case\", \"class\", \"def\", \"defined?\", \"do\", \"else\", \"elsif\", \"end\", \"ensure\", \"false\", \"for\", \"if\", \"in\", \"module\", \"next\", \"nil\", \"not\", \"or\", \"redo\", \"rescue\", \"retry\", \"return\", \"self\", \"super\", \"then\", \"true\", \"undef\", \"unless\", \"until\", \"when\", \"while\", \"yield\"]);\nconst rubyBooleans = new Set([\"true\", \"false\"]);\nconst rubyNulls = new Set([\"nil\"]);\n\nconst goKeywords = new Set([\"break\", \"case\", \"chan\", \"const\", \"continue\", \"default\", \"defer\", \"else\", \"fallthrough\", \"for\", \"func\", \"go\", \"goto\", \"if\", \"import\", \"interface\", \"map\", \"package\", \"range\", \"return\", \"select\", \"struct\", \"switch\", \"type\", \"var\"]);\nconst goTypes = new Set([\"any\", \"bool\", \"byte\", \"complex128\", \"complex64\", \"error\", \"float32\", \"float64\", \"int\", \"int16\", \"int32\", \"int64\", \"int8\", \"rune\", \"string\", \"uint\", \"uint16\", \"uint32\", \"uint64\", \"uint8\", \"uintptr\"]);\nconst goBooleans = new Set([\"true\", \"false\"]);\nconst goNulls = new Set([\"nil\"]);\n\nconst javaKeywords = new Set([\"abstract\", \"assert\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"default\", \"do\", \"else\", \"enum\", \"extends\", \"final\", \"finally\", \"for\", \"if\", \"implements\", \"import\", \"instanceof\", \"interface\", \"native\", \"new\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"static\", \"strictfp\", \"super\", \"switch\", \"synchronized\", \"this\", \"throw\", \"throws\", \"transient\", \"try\", \"volatile\", \"while\"]);\nconst javaTypes = new Set([\"Boolean\", \"Byte\", \"Character\", \"Double\", \"Float\", \"Integer\", \"Long\", \"Object\", \"Optional\", \"Short\", \"String\", \"Void\", \"boolean\", \"byte\", \"char\", \"double\", \"float\", \"int\", \"long\", \"short\", \"void\"]);\nconst javaBooleans = new Set([\"true\", \"false\"]);\nconst javaNulls = new Set([\"null\"]);\n\nconst kotlinKeywords = new Set([\"as\", \"break\", \"by\", \"catch\", \"class\", \"companion\", \"constructor\", \"continue\", \"data\", \"do\", \"else\", \"enum\", \"expect\", \"finally\", \"for\", \"fun\", \"if\", \"import\", \"in\", \"interface\", \"internal\", \"is\", \"object\", \"out\", \"override\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"sealed\", \"suspend\", \"throw\", \"try\", \"typealias\", \"val\", \"var\", \"when\", \"where\", \"while\"]);\nconst kotlinTypes = new Set([\"Any\", \"Boolean\", \"Byte\", \"Char\", \"Double\", \"Float\", \"Int\", \"List\", \"Long\", \"Map\", \"Nothing\", \"Set\", \"Short\", \"String\", \"Unit\"]);\n\nconst swiftKeywords = new Set([\"actor\", \"as\", \"associatedtype\", \"async\", \"await\", \"break\", \"case\", \"catch\", \"class\", \"continue\", \"defer\", \"deinit\", \"do\", \"else\", \"enum\", \"extension\", \"fallthrough\", \"for\", \"func\", \"guard\", \"if\", \"import\", \"in\", \"init\", \"inout\", \"let\", \"nil\", \"operator\", \"private\", \"protocol\", \"public\", \"repeat\", \"return\", \"self\", \"Self\", \"static\", \"struct\", \"subscript\", \"super\", \"switch\", \"throw\", \"throws\", \"try\", \"typealias\", \"var\", \"where\", \"while\"]);\nconst swiftTypes = new Set([\"Any\", \"Array\", \"Bool\", \"Character\", \"Dictionary\", \"Double\", \"Float\", \"Int\", \"Optional\", \"Result\", \"Set\", \"String\", \"UInt\", \"Void\"]);\n\nconst dartKeywords = new Set([\"abstract\", \"as\", \"assert\", \"async\", \"await\", \"base\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"covariant\", \"default\", \"deferred\", \"do\", \"else\", \"enum\", \"export\", \"extends\", \"extension\", \"external\", \"factory\", \"false\", \"final\", \"finally\", \"for\", \"function\", \"get\", \"hide\", \"if\", \"implements\", \"import\", \"in\", \"interface\", \"is\", \"late\", \"library\", \"mixin\", \"new\", \"null\", \"on\", \"operator\", \"part\", \"required\", \"return\", \"sealed\", \"set\", \"show\", \"static\", \"super\", \"switch\", \"sync\", \"this\", \"throw\", \"true\", \"try\", \"typedef\", \"var\", \"void\", \"when\", \"while\", \"with\", \"yield\"]);\nconst dartTypes = new Set([\"BigInt\", \"bool\", \"DateTime\", \"double\", \"Duration\", \"dynamic\", \"Future\", \"int\", \"Iterable\", \"List\", \"Map\", \"Never\", \"num\", \"Object\", \"Pattern\", \"Record\", \"Set\", \"Stream\", \"String\", \"Symbol\", \"Uri\", \"void\"]);\n\nconst scalaKeywords = new Set([\"abstract\", \"case\", \"catch\", \"class\", \"def\", \"do\", \"else\", \"enum\", \"export\", \"extends\", \"false\", \"final\", \"finally\", \"for\", \"forSome\", \"given\", \"if\", \"implicit\", \"import\", \"lazy\", \"macro\", \"match\", \"new\", \"null\", \"object\", \"override\", \"package\", \"private\", \"protected\", \"return\", \"sealed\", \"super\", \"then\", \"this\", \"throw\", \"trait\", \"true\", \"try\", \"type\", \"val\", \"var\", \"while\", \"with\", \"yield\"]);\nconst scalaTypes = new Set([\"Any\", \"Boolean\", \"Byte\", \"Char\", \"Double\", \"Either\", \"Float\", \"Int\", \"List\", \"Long\", \"Map\", \"None\", \"Option\", \"Seq\", \"Set\", \"Short\", \"Some\", \"String\", \"Unit\"]);\n\nconst groovyKeywords = new Set([\"abstract\", \"as\", \"assert\", \"break\", \"case\", \"catch\", \"class\", \"const\", \"continue\", \"def\", \"default\", \"do\", \"else\", \"enum\", \"extends\", \"false\", \"final\", \"finally\", \"for\", \"goto\", \"if\", \"implements\", \"import\", \"in\", \"instanceof\", \"interface\", \"new\", \"null\", \"package\", \"private\", \"protected\", \"public\", \"return\", \"static\", \"super\", \"switch\", \"this\", \"throw\", \"throws\", \"trait\", \"true\", \"try\", \"var\", \"void\", \"while\"]);\nconst groovyTypes = new Set([\"BigDecimal\", \"Boolean\", \"Closure\", \"Date\", \"Integer\", \"List\", \"Map\", \"Object\", \"String\", \"boolean\", \"def\", \"int\", \"long\", \"void\"]);\n\nconst cKeywords = new Set([\"auto\", \"break\", \"case\", \"const\", \"continue\", \"default\", \"do\", \"else\", \"enum\", \"extern\", \"for\", \"goto\", \"if\", \"inline\", \"register\", \"restrict\", \"return\", \"sizeof\", \"static\", \"struct\", \"switch\", \"typedef\", \"union\", \"volatile\", \"while\"]);\nconst cTypes = new Set([\"bool\", \"char\", \"double\", \"float\", \"int\", \"int16_t\", \"int32_t\", \"int64_t\", \"int8_t\", \"long\", \"short\", \"size_t\", \"uint16_t\", \"uint32_t\", \"uint64_t\", \"uint8_t\", \"void\"]);\n\nconst cppKeywords = new Set([...cKeywords, \"alignas\", \"alignof\", \"and\", \"bitand\", \"bitor\", \"catch\", \"class\", \"concept\", \"constexpr\", \"consteval\", \"constinit\", \"decltype\", \"delete\", \"explicit\", \"export\", \"friend\", \"mutable\", \"namespace\", \"new\", \"noexcept\", \"not\", \"operator\", \"or\", \"private\", \"protected\", \"public\", \"requires\", \"template\", \"this\", \"throw\", \"try\", \"typename\", \"using\", \"virtual\", \"xor\"]);\nconst cppTypes = new Set([...cTypes, \"auto\", \"bool\", \"char16_t\", \"char32_t\", \"std\", \"string\", \"wstring\"]);\nconst cppBooleans = new Set([\"true\", \"false\"]);\nconst cppNulls = new Set([\"nullptr\", \"NULL\"]);\n\nconst csharpKeywords = new Set([\"abstract\", \"as\", \"base\", \"break\", \"case\", \"catch\", \"checked\", \"class\", \"const\", \"continue\", \"default\", \"delegate\", \"do\", \"else\", \"enum\", \"event\", \"explicit\", \"extern\", \"finally\", \"fixed\", \"for\", \"foreach\", \"if\", \"implicit\", \"in\", \"interface\", \"internal\", \"is\", \"lock\", \"namespace\", \"new\", \"operator\", \"out\", \"override\", \"params\", \"private\", \"protected\", \"public\", \"readonly\", \"record\", \"ref\", \"return\", \"sealed\", \"sizeof\", \"stackalloc\", \"static\", \"struct\", \"switch\", \"this\", \"throw\", \"try\", \"typeof\", \"unchecked\", \"unsafe\", \"using\", \"virtual\", \"void\", \"volatile\", \"while\"]);\nconst csharpTypes = new Set([\"bool\", \"byte\", \"char\", \"decimal\", \"double\", \"dynamic\", \"float\", \"int\", \"long\", \"nint\", \"nuint\", \"object\", \"sbyte\", \"short\", \"string\", \"uint\", \"ulong\", \"ushort\", \"var\"]);\n\nconst objectiveCKeywords = new Set([...cKeywords, \"@autoreleasepool\", \"@catch\", \"@class\", \"@dynamic\", \"@end\", \"@finally\", \"@implementation\", \"@import\", \"@interface\", \"@optional\", \"@package\", \"@private\", \"@property\", \"@protected\", \"@protocol\", \"@public\", \"@selector\", \"@synthesize\", \"@throw\", \"@try\", \"YES\", \"NO\", \"nil\", \"self\", \"super\"]);\nconst objectiveCTypes = new Set([...cTypes, \"BOOL\", \"Class\", \"CGFloat\", \"NSInteger\", \"NSObject\", \"NSString\", \"NSUInteger\", \"SEL\", \"id\"]);\n\nconst rustKeywords = new Set([\"as\", \"async\", \"await\", \"box\", \"break\", \"const\", \"continue\", \"crate\", \"dyn\", \"else\", \"enum\", \"extern\", \"false\", \"fn\", \"for\", \"if\", \"impl\", \"in\", \"let\", \"loop\", \"match\", \"mod\", \"move\", \"mut\", \"pub\", \"ref\", \"return\", \"self\", \"Self\", \"static\", \"struct\", \"super\", \"trait\", \"true\", \"type\", \"unsafe\", \"use\", \"where\", \"while\"]);\nconst rustTypes = new Set([\"Box\", \"Option\", \"Result\", \"Some\", \"String\", \"Vec\", \"bool\", \"char\", \"f32\", \"f64\", \"i128\", \"i16\", \"i32\", \"i64\", \"i8\", \"isize\", \"str\", \"u128\", \"u16\", \"u32\", \"u64\", \"u8\", \"usize\"]);\nconst rustBooleans = new Set([\"true\", \"false\"]);\nconst rustNulls = new Set([\"None\"]);\n\nconst phpKeywords = new Set([\"abstract\", \"and\", \"array\", \"as\", \"break\", \"callable\", \"case\", \"catch\", \"class\", \"clone\", \"const\", \"continue\", \"declare\", \"default\", \"do\", \"echo\", \"else\", \"elseif\", \"empty\", \"enddeclare\", \"endfor\", \"endforeach\", \"endif\", \"endswitch\", \"endwhile\", \"enum\", \"extends\", \"final\", \"finally\", \"fn\", \"for\", \"foreach\", \"function\", \"global\", \"if\", \"implements\", \"include\", \"instanceof\", \"interface\", \"isset\", \"match\", \"namespace\", \"new\", \"or\", \"private\", \"protected\", \"public\", \"readonly\", \"require\", \"return\", \"static\", \"switch\", \"throw\", \"trait\", \"try\", \"use\", \"var\", \"while\", \"xor\", \"yield\"]);\nconst phpTypes = new Set([\"array\", \"bool\", \"callable\", \"false\", \"float\", \"int\", \"iterable\", \"mixed\", \"never\", \"null\", \"object\", \"self\", \"static\", \"string\", \"true\", \"void\"]);\n\nconst luaKeywords = new Set([\"and\", \"break\", \"do\", \"else\", \"elseif\", \"end\", \"false\", \"for\", \"function\", \"goto\", \"if\", \"in\", \"local\", \"nil\", \"not\", \"or\", \"repeat\", \"return\", \"then\", \"true\", \"until\", \"while\"]);\nconst perlKeywords = new Set([\"continue\", \"do\", \"else\", \"elsif\", \"for\", \"foreach\", \"given\", \"if\", \"last\", \"local\", \"my\", \"next\", \"our\", \"package\", \"redo\", \"require\", \"return\", \"state\", \"sub\", \"unless\", \"until\", \"use\", \"when\", \"while\"]);\nconst rKeywords = new Set([\"break\", \"else\", \"FALSE\", \"for\", \"function\", \"if\", \"Inf\", \"in\", \"NA\", \"NaN\", \"next\", \"NULL\", \"repeat\", \"return\", \"TRUE\", \"while\"]);\nconst powershellKeywords = new Set([\"begin\", \"break\", \"catch\", \"class\", \"continue\", \"data\", \"default\", \"do\", \"dynamicparam\", \"else\", \"elseif\", \"end\", \"enum\", \"exit\", \"filter\", \"finally\", \"for\", \"foreach\", \"from\", \"function\", \"if\", \"in\", \"param\", \"process\", \"return\", \"switch\", \"throw\", \"trap\", \"try\", \"until\", \"using\", \"var\", \"while\"]);\nconst elixirKeywords = new Set([\"after\", \"alias\", \"and\", \"case\", \"catch\", \"cond\", \"def\", \"defdelegate\", \"defexception\", \"defimpl\", \"defmacro\", \"defmodule\", \"defp\", \"defprotocol\", \"defstruct\", \"do\", \"else\", \"end\", \"false\", \"fn\", \"for\", \"if\", \"import\", \"in\", \"nil\", \"not\", \"or\", \"quote\", \"raise\", \"receive\", \"require\", \"rescue\", \"super\", \"throw\", \"true\", \"try\", \"unless\", \"unquote\", \"use\", \"when\", \"with\"]);\nconst erlangKeywords = new Set([\"after\", \"and\", \"andalso\", \"band\", \"begin\", \"bnot\", \"bor\", \"bsl\", \"bsr\", \"bxor\", \"case\", \"catch\", \"cond\", \"div\", \"end\", \"fun\", \"if\", \"let\", \"not\", \"of\", \"or\", \"orelse\", \"receive\", \"rem\", \"try\", \"when\", \"xor\"]);\nconst haskellKeywords = new Set([\"as\", \"case\", \"class\", \"data\", \"default\", \"deriving\", \"do\", \"else\", \"family\", \"forall\", \"foreign\", \"hiding\", \"if\", \"import\", \"in\", \"infix\", \"infixl\", \"infixr\", \"instance\", \"let\", \"module\", \"newtype\", \"of\", \"qualified\", \"then\", \"type\", \"where\"]);\nconst clojureKeywords = new Set([\"def\", \"defmacro\", \"defmethod\", \"defmulti\", \"defn\", \"defonce\", \"do\", \"doseq\", \"false\", \"fn\", \"for\", \"if\", \"let\", \"loop\", \"nil\", \"ns\", \"quote\", \"recur\", \"require\", \"true\", \"try\", \"when\"]);\nconst fsharpKeywords = new Set([\"abstract\", \"and\", \"as\", \"assert\", \"base\", \"begin\", \"class\", \"default\", \"delegate\", \"do\", \"done\", \"downcast\", \"downto\", \"elif\", \"else\", \"end\", \"exception\", \"extern\", \"false\", \"finally\", \"for\", \"fun\", \"function\", \"global\", \"if\", \"in\", \"inherit\", \"inline\", \"interface\", \"internal\", \"lazy\", \"let\", \"match\", \"member\", \"module\", \"mutable\", \"namespace\", \"new\", \"null\", \"of\", \"open\", \"or\", \"override\", \"private\", \"public\", \"rec\", \"return\", \"static\", \"struct\", \"then\", \"to\", \"true\", \"try\", \"type\", \"upcast\", \"use\", \"val\", \"void\", \"when\", \"while\", \"with\", \"yield\"]);\nconst vbKeywords = new Set([\"AddHandler\", \"And\", \"As\", \"Boolean\", \"ByRef\", \"Byte\", \"ByVal\", \"Call\", \"Case\", \"Catch\", \"Class\", \"Const\", \"Continue\", \"Date\", \"Decimal\", \"Dim\", \"Do\", \"Double\", \"Each\", \"Else\", \"ElseIf\", \"End\", \"Enum\", \"Erase\", \"Error\", \"Event\", \"Exit\", \"False\", \"Finally\", \"For\", \"Friend\", \"Function\", \"Get\", \"Global\", \"GoTo\", \"Handles\", \"If\", \"Implements\", \"Imports\", \"In\", \"Inherits\", \"Integer\", \"Interface\", \"Is\", \"Let\", \"Lib\", \"Like\", \"Long\", \"Loop\", \"Me\", \"Mod\", \"Module\", \"MustInherit\", \"MustOverride\", \"MyBase\", \"Namespace\", \"New\", \"Next\", \"Not\", \"Nothing\", \"Object\", \"Of\", \"On\", \"Option\", \"Or\", \"Overloads\", \"Overrides\", \"ParamArray\", \"Partial\", \"Private\", \"Property\", \"Protected\", \"Public\", \"RaiseEvent\", \"ReadOnly\", \"ReDim\", \"REM\", \"RemoveHandler\", \"Resume\", \"Return\", \"Select\", \"Set\", \"Shadows\", \"Shared\", \"Short\", \"Single\", \"Static\", \"Step\", \"Stop\", \"String\", \"Structure\", \"Sub\", \"SyncLock\", \"Then\", \"Throw\", \"To\", \"True\", \"Try\", \"Using\", \"Variant\", \"Wend\", \"When\", \"While\", \"With\", \"WithEvents\", \"WriteOnly\"]);\nconst graphqlKeywords = new Set([\"directive\", \"enum\", \"extend\", \"false\", \"fragment\", \"implements\", \"input\", \"interface\", \"mutation\", \"null\", \"on\", \"query\", \"repeatable\", \"scalar\", \"schema\", \"subscription\", \"true\", \"type\", \"union\"]);\nconst protobufKeywords = new Set([\"bool\", \"bytes\", \"double\", \"enum\", \"false\", \"fixed32\", \"fixed64\", \"float\", \"import\", \"int32\", \"int64\", \"map\", \"message\", \"oneof\", \"optional\", \"package\", \"proto2\", \"proto3\", \"public\", \"repeated\", \"reserved\", \"returns\", \"rpc\", \"service\", \"sfixed32\", \"sfixed64\", \"sint32\", \"sint64\", \"stream\", \"string\", \"syntax\", \"to\", \"true\", \"uint32\", \"uint64\"]);\nconst hclKeywords = new Set([\"and\", \"bool\", \"data\", \"dynamic\", \"false\", \"for\", \"if\", \"in\", \"locals\", \"module\", \"null\", \"number\", \"or\", \"output\", \"provider\", \"resource\", \"string\", \"terraform\", \"true\", \"variable\"]);\nconst nginxKeywords = new Set([\"access_log\", \"add_header\", \"deny\", \"error_log\", \"events\", \"fastcgi_pass\", \"gzip\", \"http\", \"include\", \"index\", \"listen\", \"location\", \"log_format\", \"proxy_pass\", \"return\", \"rewrite\", \"root\", \"server\", \"server_name\", \"try_files\", \"upstream\"]);\nconst makefileKeywords = new Set([\"define\", \"else\", \"endef\", \"endif\", \"export\", \"ifneq\", \"ifeq\", \"ifdef\", \"ifndef\", \"include\", \"override\", \"private\", \"sinclude\", \"undefine\", \"unexport\", \"vpath\"]);\nconst cmakeKeywords = new Set([\"add_compile_definitions\", \"add_custom_command\", \"add_custom_target\", \"add_executable\", \"add_library\", \"cmake_minimum_required\", \"else\", \"elseif\", \"endforeach\", \"endif\", \"endfunction\", \"endmacro\", \"find_package\", \"foreach\", \"function\", \"if\", \"include\", \"macro\", \"message\", \"option\", \"project\", \"return\", \"set\", \"target_compile_features\", \"target_include_directories\", \"target_link_libraries\"]);\n\nconst lexicalSpecs: Readonly<Record<string, LexicalSpec>> = {\n javascript: {\n keywords: jsKeywords,\n constants: jsConstants,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n typescript: {\n keywords: tsKeywords,\n types: tsTypes,\n constants: jsConstants,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n shell: {\n keywords: shellKeywords,\n commands: shellCommands,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n python: {\n keywords: pythonKeywords,\n types: pythonTypes,\n booleans: pythonBooleans,\n nulls: pythonNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n tripleStringQuotes: true,\n decorators: true\n },\n sql: {\n keywords: sqlKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"--\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n caseInsensitive: true\n },\n ruby: {\n keywords: rubyKeywords,\n booleans: rubyBooleans,\n nulls: rubyNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n go: {\n keywords: goKeywords,\n types: goTypes,\n booleans: goBooleans,\n nulls: goNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\", \"`\"]\n },\n java: {\n keywords: javaKeywords,\n types: javaTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n kotlin: {\n keywords: kotlinKeywords,\n types: kotlinTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n templateQuotes: true,\n decorators: true\n },\n swift: {\n keywords: swiftKeywords,\n types: swiftTypes,\n booleans: cppBooleans,\n nulls: new Set([\"nil\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n dart: {\n keywords: dartKeywords,\n types: dartTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n scala: {\n keywords: scalaKeywords,\n types: scalaTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n groovy: {\n keywords: groovyKeywords,\n types: groovyTypes,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n c: {\n keywords: cKeywords,\n types: cTypes,\n booleans: cppBooleans,\n nulls: cppNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n cpp: {\n keywords: cppKeywords,\n types: cppTypes,\n booleans: cppBooleans,\n nulls: cppNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n csharp: {\n keywords: csharpKeywords,\n types: csharpTypes,\n booleans: cppBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n objectivec: {\n keywords: objectiveCKeywords,\n types: objectiveCTypes,\n booleans: new Set([\"YES\", \"NO\", \"true\", \"false\"]),\n nulls: new Set([\"nil\", \"NULL\", \"nullptr\"]),\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n rust: {\n keywords: rustKeywords,\n types: rustTypes,\n booleans: rustBooleans,\n nulls: rustNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n rustAttributes: true\n },\n php: {\n keywords: phpKeywords,\n types: phpTypes,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\"]),\n lineComments: [\"//\", \"#\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\"\n },\n lua: {\n keywords: luaKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\"--\"],\n stringQuotes: ['\"', \"'\"]\n },\n perl: {\n keywords: perlKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"undef\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\"\n },\n r: {\n keywords: rKeywords,\n booleans: new Set([\"TRUE\", \"FALSE\", \"T\", \"F\"]),\n nulls: new Set([\"NULL\", \"NA\", \"NaN\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n powershell: {\n keywords: powershellKeywords,\n booleans: new Set([\"$true\", \"$false\", \"true\", \"false\"]),\n nulls: new Set([\"$null\", \"null\"]),\n commands: new Set([\"Get-ChildItem\", \"Get-Content\", \"Invoke-Run\", \"Join-Path\", \"New-Item\", \"Remove-Item\", \"Set-Content\", \"Test-Path\", \"Write-Host\", \"Write-Output\"]),\n lineComments: [\"#\"],\n blockComments: [{ start: \"<#\", end: \"#>\" }],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n elixir: {\n keywords: elixirKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n erlang: {\n keywords: erlangKeywords,\n booleans: new Set([\"true\", \"false\"]),\n lineComments: [\"%\"],\n stringQuotes: ['\"', \"'\"]\n },\n haskell: {\n keywords: haskellKeywords,\n types: new Set([\"Bool\", \"Char\", \"Double\", \"Either\", \"False\", \"Float\", \"IO\", \"Int\", \"Integer\", \"Maybe\", \"Nothing\", \"String\", \"True\"]),\n booleans: new Set([\"True\", \"False\"]),\n nulls: new Set([\"Nothing\"]),\n lineComments: [\"--\"],\n blockComments: [{ start: \"{-\", end: \"-}\" }],\n stringQuotes: ['\"', \"'\"]\n },\n clojure: {\n keywords: clojureKeywords,\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"nil\"]),\n lineComments: [\";\"],\n stringQuotes: ['\"']\n },\n fsharp: {\n keywords: fsharpKeywords,\n types: new Set([\"Async\", \"bool\", \"decimal\", \"float\", \"int\", \"list\", \"Map\", \"option\", \"Result\", \"seq\", \"string\", \"unit\"]),\n booleans: new Set([\"true\", \"false\"]),\n nulls: new Set([\"null\", \"None\"]),\n lineComments: [\"//\"],\n blockComments: [{ start: \"(*\", end: \"*)\" }],\n stringQuotes: ['\"', \"'\"],\n decorators: true\n },\n vb: {\n keywords: vbKeywords,\n types: new Set([\"Boolean\", \"Byte\", \"Date\", \"Decimal\", \"Double\", \"Integer\", \"Long\", \"Object\", \"Short\", \"Single\", \"String\"]),\n booleans: new Set([\"True\", \"False\"]),\n nulls: new Set([\"Nothing\", \"Null\"]),\n lineComments: [\"'\"],\n stringQuotes: ['\"'],\n caseInsensitive: true\n },\n graphql: {\n keywords: graphqlKeywords,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"#\"],\n stringQuotes: ['\"']\n },\n protobuf: {\n keywords: protobufKeywords,\n types: new Set([\"Any\", \"Duration\", \"Timestamp\"]),\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n hcl: {\n keywords: hclKeywords,\n booleans: javaBooleans,\n nulls: javaNulls,\n lineComments: [\"#\", \"//\"],\n blockComments: cStyleBlockComments,\n stringQuotes: ['\"', \"'\"]\n },\n nginx: {\n keywords: nginxKeywords,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"]\n },\n makefile: {\n keywords: makefileKeywords,\n commands: shellCommands,\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n variablePrefix: \"$\",\n flags: true\n },\n cmake: {\n keywords: cmakeKeywords,\n booleans: new Set([\"ON\", \"OFF\", \"TRUE\", \"FALSE\"]),\n nulls: new Set([\"NOTFOUND\"]),\n lineComments: [\"#\"],\n stringQuotes: ['\"', \"'\"],\n caseInsensitive: true\n }\n};\n\nconst tokenizers: Readonly<Record<CodeHighlightFamily, CodeTokenizer>> = {\n lexical: tokenizeLexical,\n data: tokenizeData,\n style: tokenizeStyle,\n line: tokenizeLine,\n markup: tokenizeMarkup\n};\n\nexport function highlightCodeBlock(\n node: Pick<Extract<MdNode, { type: \"code\" }>, \"lang\" | \"value\" | \"tokens\">\n): CodeToken[] | undefined {\n if (node.tokens !== undefined) {\n return node.tokens;\n }\n\n const language = resolveCodeLanguage(node.lang);\n if (\n language === undefined ||\n language.plain === true ||\n language.family === undefined ||\n node.value.length === 0\n ) {\n return undefined;\n }\n\n const tokenize = tokenizers[language.family];\n const tokens = tokenize(node.value, language);\n\n return tokens.some((token) => token.kind !== \"plain\") ? tokens : undefined;\n}\n\nfunction resolveCodeLanguage(lang: string | undefined): CodeLanguageInfo | undefined {\n if (lang === undefined || lang.length === 0) {\n return undefined;\n }\n\n return languageByAlias.get(lang.toLowerCase());\n}\n\nfunction tokenizeLexical(source: string, language: CodeLanguageInfo): CodeToken[] {\n const spec = lexicalSpecs[language.spec ?? \"\"];\n if (spec === undefined) {\n return [{ kind: \"plain\", value: source }];\n }\n\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n const char = source[index]!;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n const lineCommentEnd = readAnyLineComment(source, index, spec.lineComments ?? []);\n if (lineCommentEnd > index) {\n emitter.push(\"comment\", index, lineCommentEnd);\n index = lineCommentEnd;\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, spec.blockComments ?? []);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n\n if (spec.rustAttributes === true && source.startsWith(\"#[\", index)) {\n index = readUntil(source, index + 2, \"]\");\n emitter.push(\"decorator\", start, index);\n continue;\n }\n\n if (spec.decorators === true && char === \"@\" && isIdentifierStart(source[index + 1] ?? \"\")) {\n index = readIdentifier(source, index + 1);\n emitter.push(\"decorator\", start, index);\n continue;\n }\n\n if (spec.variablePrefix === \"$\" && char === \"$\" && isIdentifierStart(source[index + 1] ?? \"\")) {\n index = readIdentifier(source, index + 1);\n const variableKind = classifyLexicalWord(source.slice(start, index), spec);\n emitter.push(variableKind === \"plain\" ? \"variable\" : variableKind, start, index);\n continue;\n }\n\n const commandEnd = readCommandIdentifier(source, index);\n if (commandEnd > index) {\n const commandKind = classifyLexicalWord(source.slice(start, commandEnd), spec);\n if (commandKind === \"command\") {\n emitter.push(\"command\", start, commandEnd);\n index = commandEnd;\n continue;\n }\n }\n\n if (spec.flags === true && char === \"-\" && isFlagStart(source[index + 1] ?? \"\")) {\n index = readFlag(source, index + 1);\n emitter.push(\"flag\", start, index);\n continue;\n }\n\n if (\n spec.tripleStringQuotes === true &&\n (char === '\"' || char === \"'\") &&\n source.startsWith(char.repeat(3), index)\n ) {\n index = readTripleQuotedString(source, index, char);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n if ((spec.stringQuotes ?? []).includes(char)) {\n index = readQuotedString(source, index, char);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n if (spec.templateQuotes === true && char === \"`\") {\n index = readQuotedString(source, index, \"`\");\n emitter.push(\"template\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyLexicalWord(source.slice(start, index), spec), start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeData(source: string, language: CodeLanguageInfo): CodeToken[] {\n if (language.spec === \"toml\" || language.spec === \"ini\") {\n return tokenizeConfig(source);\n }\n\n return language.spec === \"yaml\" ? tokenizeYaml(source) : tokenizeJsonLike(source, language.spec === \"jsonc\");\n}\n\nfunction tokenizeJsonLike(source: string, allowComments: boolean): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n if (allowComments) {\n const lineCommentEnd = readAnyLineComment(source, index, [\"//\"]);\n if (lineCommentEnd > index) {\n emitter.push(\"comment\", index, lineCommentEnd);\n index = lineCommentEnd;\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, cStyleBlockComments);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n }\n\n if (source[index] === '\"') {\n index = readQuotedString(source, index, '\"');\n emitter.push(isJsonKey(source, index) ? \"key\" : \"string\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeYaml(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n const whitespaceEnd = readSpacesAndTabs(source, index);\n if (whitespaceEnd > index) {\n emitter.pushPlain(index, whitespaceEnd);\n index = whitespaceEnd;\n continue;\n }\n\n if (source[index] === \"#\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart) {\n const keyEnd = readYamlKey(source, index);\n if (keyEnd > index) {\n emitter.push(\"key\", index, keyEnd);\n index = keyEnd;\n atLineStart = false;\n continue;\n }\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeStyle(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n index = readWhitespace(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n const blockCommentEnd = readAnyBlockComment(source, index, cStyleBlockComments);\n if (blockCommentEnd > index) {\n emitter.push(\"comment\", index, blockCommentEnd);\n index = blockCommentEnd;\n continue;\n }\n\n if (source[index] === \"@\") {\n index = readCssName(source, index + 1);\n if (index > start + 1) {\n emitter.push(\"at-rule\", start, index);\n continue;\n }\n }\n\n if (source[index] === \"#\" && isHex(source[index + 1] ?? \"\")) {\n index = readCssColor(source, index + 1);\n emitter.push(\"color\", start, index);\n continue;\n }\n\n if (source.startsWith(\"!important\", index)) {\n index += \"!important\".length;\n emitter.push(\"important\", start, index);\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n continue;\n }\n\n index = readCssName(source, index);\n if (index > start) {\n emitter.push(isCssProperty(source, index) ? \"property\" : \"selector\", start, index);\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeConfig(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n index = readSpacesAndTabs(source, index);\n if (index > start) {\n emitter.pushPlain(start, index);\n continue;\n }\n\n if (source[index] === \"#\" || source[index] === \";\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && source[index] === \"[\") {\n index = readUntil(source, index + 1, \"]\");\n emitter.push(\"selector\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart) {\n const keyEnd = readConfigKey(source, index);\n if (keyEnd > index) {\n emitter.push(\"key\", index, keyEnd);\n index = keyEnd;\n atLineStart = false;\n continue;\n }\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > start) {\n emitter.push(classifyDataWord(source.slice(start, index)), start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeLine(source: string, language: CodeLanguageInfo): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n let atLineStart = true;\n\n while (index < source.length) {\n const start = index;\n\n if (source[index] === \"\\n\") {\n emitter.pushPlain(index, index + 1);\n index += 1;\n atLineStart = true;\n continue;\n }\n\n if (atLineStart && language.spec === \"diff\" && (source[index] === \"+\" || source[index] === \"-\")) {\n index = readUntilLineEnd(source, index);\n emitter.push(source[start] === \"+\" ? \"string\" : \"important\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && language.spec === \"markdown\" && source[index] === \"#\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"keyword\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (atLineStart && language.spec === \"dockerfile\") {\n const directiveEnd = readIdentifier(source, index);\n if (directiveEnd > index) {\n emitter.push(\"directive\", index, directiveEnd);\n index = directiveEnd;\n atLineStart = false;\n continue;\n }\n }\n\n if (source[index] === \"#\" && language.spec !== \"diff\") {\n index = readUntilLineEnd(source, index);\n emitter.push(\"comment\", start, index);\n atLineStart = false;\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", start, index);\n atLineStart = false;\n continue;\n }\n\n index = readNumber(source, index);\n if (index > start) {\n emitter.push(\"number\", start, index);\n atLineStart = false;\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n atLineStart = false;\n }\n\n return emitter.tokens;\n}\n\nfunction tokenizeMarkup(source: string): CodeToken[] {\n const emitter = createEmitter(source);\n let index = 0;\n\n while (index < source.length) {\n const start = index;\n\n if (source.startsWith(\"<!--\", index)) {\n index = readUntil(source, index + 4, \"-->\");\n emitter.push(\"comment\", start, index);\n continue;\n }\n\n if (source[index] === \"<\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n if (source[index] === \"/\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n }\n\n const tagStart = index;\n index = readIdentifier(source, index);\n if (index > tagStart) {\n emitter.push(\"tag\", tagStart, index);\n }\n\n while (index < source.length && source[index] !== \">\") {\n const innerStart = index;\n index = readWhitespace(source, index);\n if (index > innerStart) {\n emitter.pushPlain(innerStart, index);\n continue;\n }\n\n if (source[index] === '\"' || source[index] === \"'\") {\n const quote = source[index]!;\n index = readQuotedString(source, index, quote);\n emitter.push(\"string\", innerStart, index);\n continue;\n }\n\n index = readIdentifier(source, index);\n if (index > innerStart) {\n emitter.push(\"attribute\", innerStart, index);\n continue;\n }\n\n emitter.push(\"punctuation\", innerStart, innerStart + 1);\n index = innerStart + 1;\n }\n\n if (source[index] === \">\") {\n emitter.push(\"punctuation\", index, index + 1);\n index += 1;\n }\n continue;\n }\n\n emitter.pushPlain(start, start + 1);\n index = start + 1;\n }\n\n return emitter.tokens;\n}\n\nfunction createEmitter(source: string): TokenEmitter & { tokens: CodeToken[] } {\n const tokens: CodeToken[] = [];\n\n return {\n tokens,\n push(kind, start, end) {\n pushToken(tokens, source, kind, start, end);\n },\n pushPlain(start, end) {\n pushToken(tokens, source, \"plain\", start, end);\n }\n };\n}\n\nfunction pushToken(\n tokens: CodeToken[],\n source: string,\n kind: CodeTokenKind,\n start: number,\n end: number\n): void {\n if (end <= start) {\n return;\n }\n\n const value = source.slice(start, end);\n const previous = tokens[tokens.length - 1];\n if (previous?.kind === kind) {\n previous.value += value;\n return;\n }\n\n tokens.push({ kind, value });\n}\n\nfunction classifyLexicalWord(word: string, spec: LexicalSpec): CodeTokenKind {\n const lookup = spec.caseInsensitive === true ? word.toLowerCase() : word;\n\n if (spec.booleans?.has(lookup) === true || spec.booleans?.has(word) === true) {\n return \"boolean\";\n }\n\n if (spec.nulls?.has(lookup) === true || spec.nulls?.has(word) === true) {\n return \"null\";\n }\n\n if (spec.keywords?.has(lookup) === true || spec.keywords?.has(word) === true) {\n return \"keyword\";\n }\n\n if (spec.types?.has(lookup) === true || spec.types?.has(word) === true) {\n return \"type\";\n }\n\n if (spec.commands?.has(lookup) === true || spec.commands?.has(word) === true) {\n return \"command\";\n }\n\n if (spec.constants?.has(lookup) === true || spec.constants?.has(word) === true) {\n return \"number\";\n }\n\n return \"plain\";\n}\n\nfunction classifyDataWord(word: string): CodeTokenKind {\n switch (word) {\n case \"true\":\n case \"false\":\n return \"boolean\";\n case \"null\":\n case \"Null\":\n case \"NULL\":\n case \"~\":\n return \"null\";\n default:\n return \"plain\";\n }\n}\n\nfunction readWhitespace(source: string, index: number): number {\n while (index < source.length && isWhitespace(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readSpacesAndTabs(source: string, index: number): number {\n while (index < source.length && (source[index] === \" \" || source[index] === \"\\t\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readIdentifier(source: string, index: number): number {\n if (!isIdentifierStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && isIdentifierPart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readCommandIdentifier(source: string, index: number): number {\n if (!isIdentifierStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && (isIdentifierPart(source[index]!) || source[index] === \"-\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readCssName(source: string, index: number): number {\n if (!isCssNameStart(source[index] ?? \"\")) {\n return index;\n }\n\n index += 1;\n while (index < source.length && isCssNamePart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction readNumber(source: string, index: number): number {\n const start = index;\n if (source[index] === \"-\") {\n index += 1;\n }\n\n let hasDigit = false;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n hasDigit = true;\n }\n\n if (source[index] === \".\" && isDigit(source[index + 1] ?? \"\")) {\n index += 1;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n hasDigit = true;\n }\n }\n\n if (!hasDigit) {\n return start;\n }\n\n if ((source[index] === \"e\" || source[index] === \"E\") && isExponentStart(source[index + 1] ?? \"\")) {\n const exponentStart = index;\n index += 1;\n if (source[index] === \"+\" || source[index] === \"-\") {\n index += 1;\n }\n\n const digitsStart = index;\n while (index < source.length && isDigit(source[index]!)) {\n index += 1;\n }\n\n if (index === digitsStart) {\n return exponentStart;\n }\n }\n\n return index;\n}\n\nfunction readQuotedString(source: string, index: number, quote: string): number {\n index += 1;\n\n while (index < source.length) {\n const char = source[index]!;\n index += 1;\n\n if (char === \"\\\\\") {\n index = Math.min(source.length, index + 1);\n continue;\n }\n\n if (char === quote) {\n return index;\n }\n }\n\n return index;\n}\n\nfunction readTripleQuotedString(source: string, index: number, quote: string): number {\n const marker = quote.repeat(3);\n index += marker.length;\n\n while (index < source.length) {\n if (source.startsWith(marker, index)) {\n return index + marker.length;\n }\n\n if (source[index] === \"\\\\\") {\n index = Math.min(source.length, index + 2);\n continue;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction readAnyLineComment(\n source: string,\n index: number,\n markers: readonly string[]\n): number {\n for (const marker of markers) {\n if (source.startsWith(marker, index)) {\n return readUntilLineEnd(source, index);\n }\n }\n\n return index;\n}\n\nfunction readAnyBlockComment(\n source: string,\n index: number,\n delimiters: readonly BlockCommentDelimiter[]\n): number {\n for (const delimiter of delimiters) {\n if (source.startsWith(delimiter.start, index)) {\n return readDelimitedBlock(source, index + delimiter.start.length, delimiter.end);\n }\n }\n\n return index;\n}\n\nfunction readDelimitedBlock(source: string, index: number, endMarker: string): number {\n while (index < source.length) {\n if (source.startsWith(endMarker, index)) {\n return index + endMarker.length;\n }\n\n index += 1;\n }\n\n return source.length;\n}\n\nfunction readUntilLineEnd(source: string, index: number): number {\n while (index < source.length && source[index] !== \"\\n\") {\n index += 1;\n }\n\n return index;\n}\n\nfunction readUntil(source: string, index: number, marker: string): number {\n while (index < source.length) {\n if (source.startsWith(marker, index)) {\n return index + marker.length;\n }\n\n index += 1;\n }\n\n return index;\n}\n\nfunction readYamlKey(source: string, index: number): number {\n const start = index;\n while (index < source.length) {\n const char = source[index]!;\n if (char === \":\") {\n return index > start ? index : start;\n }\n\n if (char === \"\\n\" || char === \"#\" || char === \"{\" || char === \"}\" || char === \"[\" || char === \"]\") {\n return start;\n }\n\n index += 1;\n }\n\n return start;\n}\n\nfunction readConfigKey(source: string, index: number): number {\n const start = index;\n while (index < source.length) {\n const char = source[index]!;\n if (char === \"=\" || char === \":\") {\n return trimRightIndex(source, start, index);\n }\n\n if (char === \"\\n\" || char === \"#\" || char === \";\") {\n return start;\n }\n\n index += 1;\n }\n\n return start;\n}\n\nfunction readFlag(source: string, index: number): number {\n while (index < source.length && isFlagPart(source[index]!)) {\n index += 1;\n }\n\n return index;\n}\n\nfunction trimRightIndex(source: string, start: number, end: number): number {\n while (end > start && (source[end - 1] === \" \" || source[end - 1] === \"\\t\")) {\n end -= 1;\n }\n\n return end;\n}\n\nfunction readCssColor(source: string, index: number): number {\n let count = 0;\n\n while (index < source.length && isHex(source[index]!) && count < 8) {\n index += 1;\n count += 1;\n }\n\n return index;\n}\n\nfunction isJsonKey(source: string, index: number): boolean {\n index = readWhitespace(source, index);\n return source[index] === \":\";\n}\n\nfunction isCssProperty(source: string, index: number): boolean {\n index = readWhitespace(source, index);\n return source[index] === \":\";\n}\n\nfunction isWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\n\" || char === \"\\r\" || char === \"\\t\";\n}\n\nfunction isIdentifierStart(char: string): boolean {\n return isAlpha(char) || char === \"_\" || char === \"$\";\n}\n\nfunction isIdentifierPart(char: string): boolean {\n return isIdentifierStart(char) || isDigit(char);\n}\n\nfunction isCssNameStart(char: string): boolean {\n return isAlpha(char) || char === \"_\" || char === \"-\" || char === \".\";\n}\n\nfunction isCssNamePart(char: string): boolean {\n return isCssNameStart(char) || isDigit(char);\n}\n\nfunction isFlagStart(char: string): boolean {\n return isAlpha(char) || char === \"-\";\n}\n\nfunction isFlagPart(char: string): boolean {\n return isAlpha(char) || isDigit(char) || char === \"-\";\n}\n\nfunction isExponentStart(char: string): boolean {\n return isDigit(char) || char === \"+\" || char === \"-\";\n}\n\nfunction isAlpha(char: string): boolean {\n const code = char.charCodeAt(0);\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\n}\n\nfunction isDigit(char: string): boolean {\n const code = char.charCodeAt(0);\n return code >= 48 && code <= 57;\n}\n\nfunction isHex(char: string): boolean {\n const code = char.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 70) ||\n (code >= 97 && code <= 102)\n );\n}\n", "const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport function graphemes(value: string): string[] {\n return Array.from(graphemeSegmenter.segment(value), ({ segment }) => segment);\n}\n\nexport function displayWidth(value: string, startColumn = 0): number {\n let column = startColumn;\n\n for (const segment of graphemes(value)) {\n if (segment === \"\\t\") {\n column += 8 - (column % 8);\n continue;\n }\n\n column += graphemeWidth(segment);\n }\n\n return column - startColumn;\n}\n\nexport function expandTabs(value: string, startColumn = 0): string {\n let column = startColumn;\n let expanded = \"\";\n\n for (const segment of graphemes(value)) {\n if (segment === \"\\t\") {\n const spaces = 8 - (column % 8);\n expanded += \" \".repeat(spaces);\n column += spaces;\n continue;\n }\n\n expanded += segment;\n column += graphemeWidth(segment);\n }\n\n return expanded;\n}\n\nexport function graphemeWidth(segment: string): number {\n const codePoint = segment.codePointAt(0);\n\n if (codePoint === undefined || isZeroWidthCodePoint(codePoint)) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) || isFlagSegment(segment) || segment.includes(\"\\ufe0f\") ? 2 : 1;\n}\n\nexport function truncateToWidth(text: string, width: number): string {\n if (width <= 0) return \"\";\n if (displayWidth(text) <= width) return text;\n const target = Math.max(0, width - 1);\n let result = \"\";\n let used = 0;\n for (const segment of graphemes(text)) {\n const segmentWidth = graphemeWidth(segment);\n if (used + segmentWidth > target) break;\n result += segment;\n used += segmentWidth;\n }\n return `${result}\u2026`;\n}\n\nfunction isZeroWidthCodePoint(codePoint: number): boolean {\n return (codePoint >= 0x0300 && codePoint <= 0x036f)\n || (codePoint >= 0x1ab0 && codePoint <= 0x1aff)\n || (codePoint >= 0x1dc0 && codePoint <= 0x1dff)\n || (codePoint >= 0x20d0 && codePoint <= 0x20ff)\n || (codePoint >= 0xfe20 && codePoint <= 0xfe2f);\n}\n\nfunction isFlagSegment(segment: string): boolean {\n const codePoints = [...segment].map((character) => character.codePointAt(0));\n return codePoints.length === 2\n && codePoints.every(\n (codePoint) => codePoint !== undefined && codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f)\n || codePoint === 0x2329\n || codePoint === 0x232a\n || (codePoint >= 0x2e80 && codePoint <= 0x303e)\n || (codePoint >= 0x3041 && codePoint <= 0x33bf)\n || (codePoint >= 0x3400 && codePoint <= 0x4dbf)\n || (codePoint >= 0x4e00 && codePoint <= 0xa4cf)\n || (codePoint >= 0xa960 && codePoint <= 0xa97f)\n || (codePoint >= 0xac00 && codePoint <= 0xd7af)\n || (codePoint >= 0xf900 && codePoint <= 0xfaff)\n || (codePoint >= 0xfe10 && codePoint <= 0xfe19)\n || (codePoint >= 0xfe30 && codePoint <= 0xfe6f)\n || (codePoint >= 0xff00 && codePoint <= 0xff60)\n || (codePoint >= 0xffe0 && codePoint <= 0xffe6)\n || (codePoint >= 0x1b000 && codePoint <= 0x1b0ff)\n || codePoint === 0x1f004\n || codePoint === 0x1f0cf\n || (codePoint >= 0x1f200 && codePoint <= 0x1fffd)\n || (codePoint >= 0x20000 && codePoint <= 0x2fffd)\n || (codePoint >= 0x30000 && codePoint <= 0x3fffd)\n );\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n on(event: \"data\", listener: (chunk: Buffer | string) => void): KeypressInput;\n off(event: \"data\", listener: (chunk: Buffer | string) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(chunk: Buffer | string) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (chunk: Buffer | string) => {\n for (const event of parseKeypressChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"data\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"data\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"data\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n if (data.length === 1 && data[0] === 0x1b) {\n return { name: \"escape\", ctrl: false, meta: false, shift: false };\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction parseKeypressChunk(data: Buffer): KeypressEvent[] {\n const events: KeypressEvent[] = [];\n const input = data.toString(\"utf8\");\n let index = 0;\n\n while (index < input.length) {\n const sequence = nextKeySequence(input, index);\n if (sequence.length === 0) {\n break;\n }\n\n const event = parseKeypress(Buffer.from(sequence));\n if (event !== undefined) {\n events.push(event);\n }\n index += sequence.length;\n }\n\n return events;\n}\n\nfunction nextKeySequence(input: string, index: number): string {\n const character = input[index];\n if (character === undefined) {\n return \"\";\n }\n\n if (character !== \"\\u001b\") {\n return character;\n }\n\n const next = input[index + 1];\n if (next === undefined) {\n return character;\n }\n\n if (next !== \"[\") {\n return input.slice(index, index + 2);\n }\n\n for (let cursor = index + 2; cursor < input.length; cursor += 1) {\n const code = input.charCodeAt(cursor);\n if ((code >= 0x40 && code <= 0x7e) || input[cursor] === \"~\") {\n return input.slice(index, cursor + 1);\n }\n }\n\n return input.slice(index);\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const controlCharacter = controlCharacterToKeypress(key?.sequence);\n if (controlCharacter !== undefined) {\n return controlCharacter;\n }\n\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (isSinglePrintableSequence(sequence)) {\n return sequence;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isSinglePrintableSequence(value: string | undefined): boolean {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction controlCharacterToKeypress(sequence: string | undefined): KeypressEvent | undefined {\n if (sequence === \"\\u001f\") {\n return { ch: \"/\", ctrl: true, meta: false, shift: false };\n }\n\n if (sequence !== undefined && sequence.length === 1) {\n const code = sequence.charCodeAt(0);\n if (code >= 1 && code <= 26 && code !== 9 && code !== 10 && code !== 13) {\n return {\n name: String.fromCharCode(code + 96),\n ctrl: true,\n meta: false,\n shift: false\n };\n }\n }\n\n return undefined;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "export const STYLE_BOLD = 1 << 0;\nexport const STYLE_DIM = 1 << 1;\nexport const STYLE_UNDERLINE = 1 << 2;\nexport const STYLE_INVERSE = 1 << 3;\nconst FG_SHIFT = 8;\nconst BG_SHIFT = 16;\nconst COLOR_MASK = 0xff;\n\nexport type PackedStyle = number;\n\nexport function packStyle(style: {\n bold?: boolean;\n dim?: boolean;\n underline?: boolean;\n inverse?: boolean;\n fg?: number;\n bg?: number;\n}): PackedStyle {\n let packed = 0;\n if (style.bold) packed |= STYLE_BOLD;\n if (style.dim) packed |= STYLE_DIM;\n if (style.underline) packed |= STYLE_UNDERLINE;\n if (style.inverse) packed |= STYLE_INVERSE;\n packed |= ((style.fg ?? 0) & COLOR_MASK) << FG_SHIFT;\n packed |= ((style.bg ?? 0) & COLOR_MASK) << BG_SHIFT;\n return packed;\n}\n\nexport function foreground(style: PackedStyle): number { return (style >> FG_SHIFT) & COLOR_MASK; }\nexport function background(style: PackedStyle): number { return (style >> BG_SHIFT) & COLOR_MASK; }\n\nexport function styleToSgrDelta(previous: PackedStyle, next: PackedStyle, colors = process.env.NO_COLOR === undefined && process.env.TERM !== \"dumb\"): string {\n if (!colors) return \"\";\n if (previous === next) return \"\";\n const codes: number[] = [];\n const previousIntensity = previous & (STYLE_BOLD | STYLE_DIM);\n const nextIntensity = next & (STYLE_BOLD | STYLE_DIM);\n if (previousIntensity !== nextIntensity) {\n if ((previousIntensity & ~nextIntensity) !== 0) codes.push(22);\n if ((nextIntensity & STYLE_BOLD) !== 0 && ((previousIntensity & ~nextIntensity) !== 0 || (previousIntensity & STYLE_BOLD) === 0)) codes.push(1);\n if ((nextIntensity & STYLE_DIM) !== 0 && ((previousIntensity & ~nextIntensity) !== 0 || (previousIntensity & STYLE_DIM) === 0)) codes.push(2);\n }\n flagDelta(codes, previous, next, STYLE_UNDERLINE, 4, 24);\n flagDelta(codes, previous, next, STYLE_INVERSE, 7, 27);\n const previousFg = foreground(previous);\n const nextFg = foreground(next);\n if (previousFg !== nextFg) codes.push(nextFg === 0 ? 39 : 30 + nextFg);\n const previousBg = background(previous);\n const nextBg = background(next);\n if (previousBg !== nextBg) codes.push(nextBg === 0 ? 49 : 40 + nextBg);\n return codes.length === 0 ? \"\" : `\\u001b[${[...new Set(codes)].join(\";\")}m`;\n}\n\nfunction flagDelta(codes: number[], previous: number, next: number, flag: number, on: number, off: number): void {\n if ((previous & flag) !== (next & flag)) codes.push((next & flag) === 0 ? off : on);\n}\n", "import { Screen } from \"../screen/screen.js\";\nimport { appendFileSync } from \"node:fs\";\nimport { createTerminalDriver, type TerminalDriver } from \"../terminal/driver.js\";\nimport { type ActionRuntimeHandles } from \"./actions.js\";\nimport { type Effect, type ExplorerEvent } from \"./events.js\";\nimport { createDetailJobs } from \"./jobs.js\";\nimport { computeExplorerLayout } from \"./layout.js\";\nimport { renderExplorer } from \"./render/index.js\";\nimport { step } from \"./reducer.js\";\nimport {\n createInitialState,\n REGION_ALL,\n REGION_FOOTER,\n REGION_MODAL,\n REGION_TOAST,\n type ExplorerConfig,\n type ConfirmPromptOptions,\n type NormalizedExplorerConfig,\n type ExplorerState,\n type Row,\n type Tone,\n normalizeExplorerConfig\n} from \"./state.js\";\n\nconst TOAST_MS = 2500;\n\nexport async function runExplorer<R = void>(config: ExplorerConfig<R>): Promise<R | null> {\n if (process.stdout.isTTY !== true) {\n throw new Error(\"explorer requires a TTY\");\n }\n\n const driver = createTerminalDriver({ mouse: config.mouse });\n const runtime = new ExplorerRuntime(config, driver);\n return runtime.run();\n}\n\nclass ExplorerRuntime<R> {\n private readonly config: NormalizedExplorerConfig<R>;\n private state: ExplorerState;\n private readonly screen: Screen;\n private readonly detailJobs;\n private readonly runtimeHandles: ActionRuntimeHandles;\n private readonly pendingEffects = new Set<Promise<void>>();\n private unsubscribeKeypress: (() => void) | undefined;\n private unsubscribeResize: (() => void) | undefined;\n private toastTimer: ReturnType<typeof setTimeout> | undefined;\n private rowsRequestToken = 0;\n private reorderToken = 0;\n private stopped = false;\n private renderScheduled = false;\n private readonly tracePath = process.env.POE_CODE_TUI_TRACE;\n private settle:\n | { resolve: (value: R | null) => void; reject: (error: unknown) => void }\n | undefined;\n\n constructor(\n config: ExplorerConfig<R>,\n private readonly driver: TerminalDriver\n ) {\n this.config = normalizeExplorerConfig(config);\n this.state = createInitialState(this.config, driver.getSize());\n this.screen = new Screen(driver.getSize());\n this.detailJobs = createDetailJobs((event) => {\n if (event.type === \"detailLoaded\") {\n this.loadDetailContent(event.rowId, event.token, event.items);\n return;\n }\n this.dispatch(event);\n });\n this.runtimeHandles = {\n refresh: async () => {\n await this.refreshRowsFromSource();\n },\n reloadDetail: (rowId) => {\n this.reloadFocusedDetail(rowId);\n },\n suspendAnd: async (fn) => this.suspendAnd(fn),\n openModal: (content) => {\n this.dispatch({ type: \"modalOpened\", title: content.title, content: content.content });\n },\n toast: (msg, tone) => {\n this.showToast(msg, tone);\n },\n confirm: async (prompt) => this.confirm(prompt),\n promptText: async (options) => this.promptText(options),\n exit: (after) => {\n this.exit(null, after);\n }\n };\n }\n\n run(): Promise<R | null> {\n return new Promise<R | null>((resolve, reject) => {\n this.settle = { resolve, reject };\n\n try {\n this.startTerminal();\n if (this.config.initialRows !== undefined && this.config.initialRows.length > 0) {\n // Seed list/detail before first paint so callers with known rows avoid an empty flash.\n this.dispatch({ type: \"rowsLoaded\", rows: this.config.initialRows });\n }\n this.renderNow();\n this.loadRows().catch((error) => {\n this.fail(error);\n });\n } catch (error) {\n this.fail(error);\n }\n });\n }\n\n private startTerminal(): void {\n this.driver.start();\n\n this.subscribeKeypress();\n this.unsubscribeResize = this.driver.onResize((size) => {\n this.dispatch({ type: \"resize\", cols: size.cols, rows: size.rows });\n });\n }\n\n private subscribeKeypress(): void {\n if (this.unsubscribeKeypress !== undefined) {\n return;\n }\n\n this.unsubscribeKeypress = this.driver.onEvent((event) => {\n this.trace(\"input\", { event });\n if (event.type === \"paste\") {\n for (const ch of event.text.replaceAll(\"\\n\", \"\").replaceAll(\"\\r\", \"\")) {\n this.dispatch({\n type: \"key\",\n key: { ch, name: ch, ctrl: false, meta: false, shift: false }\n });\n }\n return;\n }\n if (event.type === \"wheel\") {\n this.dispatch({\n type: \"key\",\n key: { name: event.direction, ctrl: false, meta: false, shift: false }\n });\n return;\n }\n this.dispatch({\n type: \"key\",\n key: {\n name: event.name,\n ch: event.ch,\n ctrl: event.ctrl,\n meta: event.alt,\n shift: event.shift\n }\n });\n });\n }\n\n private pauseKeypress(): void {\n this.unsubscribeKeypress?.();\n this.unsubscribeKeypress = undefined;\n }\n\n private async loadRows(requestToken = ++this.rowsRequestToken): Promise<void> {\n const rows = await this.config.rows();\n if (requestToken === this.rowsRequestToken) {\n this.dispatch({ type: \"rowsLoaded\", rows });\n }\n }\n\n private async refreshRowsFromSource(): Promise<void> {\n const requestToken = ++this.rowsRequestToken;\n await this.config.refresh?.();\n await this.loadRows(requestToken);\n }\n\n private dispatch(event: ExplorerEvent): void {\n if (this.stopped) {\n return;\n }\n\n const previousState = this.state;\n const next = step(this.state, event, this.runtimeHandles);\n this.state = next.state;\n this.scheduleRender();\n this.applyEffects(next.effects, previousState);\n }\n\n private applyEffects(effects: Effect[], previousState: ExplorerState): void {\n for (const effect of effects) {\n if (effect.type === \"renderDetail\") {\n this.renderDetail(effect.rowId, effect.token);\n continue;\n }\n\n if (effect.type === \"persistOrder\") {\n this.track(this.persistOrder(effect.orderedIds, previousState.rows, ++this.reorderToken));\n continue;\n }\n\n if (effect.type === \"suspend\") {\n this.track(this.runActionEffect(effect));\n continue;\n }\n\n if (effect.type === \"exit\") {\n this.exit(effect.result as R | null, effect.after);\n }\n }\n }\n\n private renderDetail(rowId: string, token: number): void {\n const row = this.state.rows.find((candidate) => candidate.id === rowId);\n if (row === undefined) {\n return;\n }\n\n const layout = computeExplorerLayout({\n cols: this.state.size.cols,\n rows: this.state.size.rows,\n detailHidden: this.state.layout === \"narrow-list-only\" || this.state.layout === \"too-narrow\",\n focused: this.state.focused\n });\n\n const reloadDetail = () => this.reloadFocusedDetail(rowId);\n void this.detailJobs.schedule(\n rowId,\n token,\n (ctx) => this.config.detail.items(row, { ...ctx, reloadDetail }),\n {\n width: layout.detail.width,\n height: layout.detail.height,\n row,\n signal: new AbortController().signal,\n reloadDetail\n }\n );\n }\n\n private reloadFocusedDetail(rowId?: string): void {\n const focusedId = this.state.detail.rowId;\n if (focusedId === null) {\n return;\n }\n if (rowId !== undefined && rowId !== focusedId) {\n return;\n }\n const token = this.state.detail.token + 1;\n this.state = { ...this.state, detail: { ...this.state.detail, token } };\n this.renderDetail(focusedId, token);\n }\n\n private loadDetailContent(\n rowId: string,\n token: number,\n items: import(\"./state.js\").DetailItem[]\n ): void {\n const row = this.state.rows.find((candidate) => candidate.id === rowId);\n if (row === undefined) {\n return;\n }\n\n const layout = computeExplorerLayout({\n cols: this.state.size.cols,\n rows: this.state.size.rows,\n detailHidden: this.state.layout === \"narrow-list-only\" || this.state.layout === \"too-narrow\",\n focused: this.state.focused\n });\n const context = {\n width: layout.detail.width,\n height: layout.detail.height,\n row,\n signal: new AbortController().signal\n };\n\n const preparedItems = items.map((item, itemIndex) => {\n try {\n const content = item.render(context);\n if (typeof content === \"string\") {\n return { ...item, renderedContent: content };\n }\n this.track(\n content.then(\n (resolved) =>\n this.dispatch({\n type: \"detailItemRendered\",\n rowId,\n token,\n itemIndex,\n content: resolved\n }),\n (error) =>\n this.dispatch({\n type: \"detailItemRendered\",\n rowId,\n token,\n itemIndex,\n content: error instanceof Error ? `Error: ${error.message}` : \"Error: detail failed\"\n })\n )\n );\n return { ...item, renderedContent: \"Loading detail...\" };\n } catch (error) {\n return {\n ...item,\n renderedContent:\n error instanceof Error ? `Error: ${error.message}` : \"Error: detail failed\"\n };\n }\n });\n this.dispatch({ type: \"detailLoaded\", rowId, token, items: preparedItems });\n }\n\n private async persistOrder(\n orderedIds: string[],\n previousRows: Row[],\n token: number\n ): Promise<void> {\n try {\n await this.config.reorder?.onReorder(orderedIds, {\n refresh: this.runtimeHandles.refresh,\n toast: this.runtimeHandles.toast\n });\n } catch (error) {\n this.showToast(error instanceof Error ? error.message : \"Could not persist order\", \"error\");\n if (token === this.reorderToken) {\n this.dispatch({ type: \"rowsLoaded\", rows: previousRows });\n }\n }\n }\n\n private async runActionEffect(effect: Extract<Effect, { type: \"suspend\" }>): Promise<void> {\n try {\n const value = await effect.fn();\n this.dispatch(effect.resumeWith(value));\n } catch (error) {\n this.showToast(error instanceof Error ? error.message : \"Action failed\", \"error\");\n this.dispatch(effect.resumeWith(error));\n }\n }\n\n private async suspendAnd<T>(fn: () => Promise<T>): Promise<T> {\n this.pauseKeypress();\n this.state = { ...this.state, suspended: true };\n this.driver.stop();\n\n try {\n return await fn();\n } finally {\n if (!this.stopped) {\n this.driver.start();\n this.state = { ...this.state, suspended: false };\n this.subscribeKeypress();\n const size = this.driver.getSize();\n this.dispatch({\n type: \"suspendResumed\",\n value: null,\n emit: { type: \"resize\", cols: size.cols, rows: size.rows }\n });\n }\n }\n }\n\n private confirm(prompt: string | ConfirmPromptOptions): Promise<boolean> {\n return new Promise((resolve) => {\n const options = typeof prompt === \"string\"\n ? { title: \"Confirm\", message: prompt }\n : prompt;\n this.state = {\n ...this.state,\n modal: {\n kind: \"confirm\",\n title: options.title,\n message: options.message,\n confirmLabel: options.confirmLabel ?? \"Yes\",\n cancelLabel: options.cancelLabel ?? \"No\",\n destructive: options.destructive ?? false,\n resolver: resolve\n },\n dirty: REGION_MODAL | REGION_FOOTER\n };\n this.scheduleRender();\n });\n }\n\n private promptText(options: {\n title: string;\n label: string;\n initialValue?: string;\n placeholder?: string;\n }): Promise<string | null> {\n return new Promise((resolve) => {\n this.state = {\n ...this.state,\n modal: {\n kind: \"input\",\n title: options.title,\n label: options.label,\n value: options.initialValue ?? \"\",\n placeholder: options.placeholder,\n resolver: resolve\n },\n dirty: REGION_MODAL | REGION_FOOTER\n };\n this.scheduleRender();\n });\n }\n\n private showToast(message: string, tone: Tone = \"info\"): void {\n if (this.stopped) {\n return;\n }\n\n if (this.toastTimer !== undefined) {\n clearTimeout(this.toastTimer);\n }\n\n this.state = {\n ...this.state,\n toast: { message, tone, expiresAt: Date.now() + TOAST_MS },\n dirty: REGION_TOAST\n };\n this.scheduleRender();\n this.toastTimer = setTimeout(() => {\n this.dispatch({ type: \"toastExpired\" });\n }, TOAST_MS);\n }\n\n private currentRow(): Row | undefined {\n return this.state.rows[this.state.filtered[this.state.cursor] ?? -1];\n }\n\n private scheduleRender(): void {\n if (this.stopped || this.state.suspended || this.renderScheduled) {\n return;\n }\n this.renderScheduled = true;\n setImmediate(() => {\n this.renderScheduled = false;\n this.renderNow();\n });\n }\n\n private renderNow(): void {\n if (this.stopped || this.state.suspended) return;\n\n const size = this.driver.getSize();\n if (size.cols !== this.state.size.cols || size.rows !== this.state.size.rows) {\n this.state = step(\n this.state,\n { type: \"resize\", cols: size.cols, rows: size.rows },\n this.runtimeHandles\n ).state;\n }\n\n if (this.screen.width !== this.state.size.cols || this.screen.height !== this.state.size.rows)\n this.screen.resize(this.state.size);\n renderExplorer({ ...this.state, dirty: REGION_ALL }, this.screen);\n const frame = this.screen.flush();\n this.driver.writeFrame(frame);\n this.trace(\"frame\", {\n bytes: Buffer.byteLength(frame),\n cols: this.state.size.cols,\n rows: this.state.size.rows\n });\n this.state = { ...this.state, dirty: 0 };\n }\n\n private track(promise: Promise<void>): void {\n this.pendingEffects.add(promise);\n promise.finally(() => {\n this.pendingEffects.delete(promise);\n });\n }\n\n private exit(result: R | null, after?: () => void | Promise<void>): void {\n if (this.stopped) {\n return;\n }\n\n this.stopped = true;\n this.unsubscribeKeypress?.();\n this.unsubscribeResize?.();\n this.detailJobs.abort();\n if (this.toastTimer !== undefined) {\n clearTimeout(this.toastTimer);\n }\n this.driver.stop();\n\n Promise.allSettled([...this.pendingEffects])\n .then(() => after?.())\n .then(() => {\n this.settle?.resolve(result);\n })\n .catch((error) => {\n this.settle?.reject(error);\n });\n }\n\n private fail(error: unknown): void {\n if (!this.stopped) {\n this.stopped = true;\n this.driver.stop();\n }\n this.settle?.reject(error);\n }\n\n private trace(type: string, fields: Record<string, unknown>): void {\n if (this.tracePath === undefined || this.tracePath.length === 0) return;\n appendFileSync(\n this.tracePath,\n `${JSON.stringify({ type, timestamp: new Date().toISOString(), ...fields })}\\n`\n );\n }\n}\n", "export type TerminalInputEvent =\n | { type: \"key\"; name: string; ch?: string; ctrl: boolean; alt: boolean; shift: boolean }\n | { type: \"paste\"; text: string }\n | { type: \"wheel\"; direction: \"up\" | \"down\"; x: number; y: number };\n\nexport interface InputParser {\n feed(chunk: Buffer): TerminalInputEvent[];\n flush(): TerminalInputEvent[];\n destroy(): void;\n}\n\nconst ESC = 0x1b;\nconst PASTE_START = Buffer.from(\"\\u001b[200~\");\nconst PASTE_END = Buffer.from(\"\\u001b[201~\");\n\nexport function createInputParser(options: { escTimeoutMs?: number; onEvent?: (event: TerminalInputEvent) => void } = {}): InputParser {\n const escTimeoutMs = options.escTimeoutMs ?? 50;\n let pending = Buffer.alloc(0);\n let paste = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let escapeReady = false;\n\n const clearEscapeTimer = () => {\n if (timer !== undefined) clearTimeout(timer);\n timer = undefined;\n escapeReady = false;\n };\n\n const armEscapeTimer = () => {\n if (timer !== undefined) return;\n timer = setTimeout(() => {\n timer = undefined;\n if (options.onEvent !== undefined && pending.length === 1 && pending[0] === ESC) {\n pending = pending.subarray(1);\n options.onEvent(key(\"escape\"));\n } else {\n escapeReady = true;\n }\n }, escTimeoutMs);\n };\n\n const parse = (): TerminalInputEvent[] => {\n const events: TerminalInputEvent[] = [];\n while (pending.length > 0) {\n if (paste) {\n const end = pending.indexOf(PASTE_END);\n if (end < 0) break;\n events.push({ type: \"paste\", text: pending.subarray(0, end).toString(\"utf8\") });\n pending = pending.subarray(end + PASTE_END.length);\n paste = false;\n continue;\n }\n\n if (pending[0] === ESC) {\n if (pending.length === 1) {\n if (escapeReady) {\n pending = pending.subarray(1);\n escapeReady = false;\n events.push(key(\"escape\"));\n } else {\n armEscapeTimer();\n }\n break;\n }\n clearEscapeTimer();\n if (pending.subarray(0, PASTE_START.length).equals(PASTE_START)) {\n pending = pending.subarray(PASTE_START.length);\n paste = true;\n continue;\n }\n if (pending[1] === 0x5b) {\n const final = findCsiFinal(pending);\n if (final < 0) break;\n const sequence = pending.subarray(0, final + 1).toString(\"ascii\");\n pending = pending.subarray(final + 1);\n const event = parseCsi(sequence);\n if (event !== undefined) events.push(event);\n continue;\n }\n if (pending[1] === 0x4f) {\n if (pending.length < 3) break;\n const name = navigationName(String.fromCharCode(pending[2]!));\n pending = pending.subarray(3);\n if (name !== undefined) events.push(key(name));\n continue;\n }\n if (pending[1] === 0x03) {\n pending = pending.subarray(1);\n events.push(key(\"escape\"));\n continue;\n }\n const decoded = decodeFirstCharacter(pending.subarray(1));\n if (decoded === undefined) break;\n pending = pending.subarray(1 + decoded.bytes);\n events.push(character(decoded.ch, true));\n continue;\n }\n\n const byte = pending[0]!;\n if (byte < 0x20 || byte === 0x7f) {\n pending = pending.subarray(1);\n events.push(control(byte));\n continue;\n }\n const decoded = decodeFirstCharacter(pending);\n if (decoded === undefined) break;\n pending = pending.subarray(decoded.bytes);\n events.push(character(decoded.ch, false));\n }\n return events;\n };\n\n return {\n feed(chunk) {\n if (chunk.length > 0) {\n if (pending.length === 1 && pending[0] === ESC) clearEscapeTimer();\n pending = pending.length === 0 ? Buffer.from(chunk) : Buffer.concat([pending, chunk]);\n }\n return parse();\n },\n flush() {\n return parse();\n },\n destroy() {\n clearEscapeTimer();\n pending = Buffer.alloc(0);\n }\n };\n}\n\nfunction findCsiFinal(input: Buffer): number {\n for (let index = 2; index < input.length; index += 1) {\n const byte = input[index]!;\n if (byte >= 0x40 && byte <= 0x7e) return index;\n }\n return -1;\n}\n\nfunction parseCsi(sequence: string): TerminalInputEvent | undefined {\n if (sequence.startsWith(\"\\u001b[<\") && (sequence.endsWith(\"M\") || sequence.endsWith(\"m\"))) {\n const fields = sequence.slice(3, -1).split(\";\");\n if ((fields[0] === \"64\" || fields[0] === \"65\") && fields.length === 3) {\n return {\n type: \"wheel\",\n direction: fields[0] === \"64\" ? \"up\" : \"down\",\n x: Number(fields[1]) - 1,\n y: Number(fields[2]) - 1\n };\n }\n }\n const final = sequence.at(-1)!;\n const name = navigationName(final) ?? ({ \"5\": \"pageup\", \"6\": \"pagedown\" }[sequence.slice(2, -1)]);\n if (name === undefined) return undefined;\n const modifier = sequence.includes(\";5\") ? { ctrl: true } : {};\n return key(name, modifier);\n}\n\nfunction navigationName(final: string): string | undefined {\n return ({ A: \"up\", B: \"down\", C: \"right\", D: \"left\", H: \"home\", F: \"end\" } as Record<string, string>)[final];\n}\n\nfunction control(byte: number): Extract<TerminalInputEvent, { type: \"key\" }> {\n if (byte === 0x0d || byte === 0x0a) return key(\"enter\");\n if (byte === 0x09) return key(\"tab\");\n if (byte === 0x7f || byte === 0x08) return key(\"backspace\");\n if (byte === 0x20) return character(\" \", false);\n if (byte >= 1 && byte <= 26) return key(String.fromCharCode(96 + byte), { ctrl: true });\n return key(`control-${byte}`);\n}\n\nfunction character(ch: string, alt: boolean): Extract<TerminalInputEvent, { type: \"key\" }> {\n return { type: \"key\", name: ch, ch, ctrl: false, alt, shift: ch.toLocaleUpperCase() === ch && ch.toLocaleLowerCase() !== ch };\n}\n\nfunction key(name: string, flags: Partial<Pick<Extract<TerminalInputEvent, { type: \"key\" }>, \"ctrl\" | \"alt\" | \"shift\">> = {}): Extract<TerminalInputEvent, { type: \"key\" }> {\n return { type: \"key\", name, ctrl: flags.ctrl ?? false, alt: flags.alt ?? false, shift: flags.shift ?? false };\n}\n\nfunction decodeFirstCharacter(input: Buffer): { ch: string; bytes: number } | undefined {\n if (input.length === 0) return undefined;\n const first = input[0]!;\n const bytes = first < 0x80 ? 1 : first < 0xe0 ? 2 : first < 0xf0 ? 3 : 4;\n if (input.length < bytes) return undefined;\n return { ch: input.subarray(0, bytes).toString(\"utf8\"), bytes };\n}\n", "import { resolveBindings, type ResolvedBindings } from \"./keymap.js\";\n\nexport type Tone = \"success\" | \"warning\" | \"error\" | \"info\" | \"muted\";\n\nexport interface ConfirmPromptOptions {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n}\n\nexport interface Row {\n id: string;\n title: string;\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n group?: string; // grouped rendering; rows with same group cluster under a header\n}\n\nexport interface DetailItem {\n id: string;\n title?: string; // absent => item fills pane with no cursor / no selection chrome\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n render: (ctx: DetailCtx) => string | Promise<string>;\n renderedContent?: string;\n}\n\nexport interface Detail<R> {\n items: (row: Row, ctx: DetailCtx) => Promise<DetailItem[]>;\n actions?: Action<R>[]; // run against the focused detail item\n}\n\nexport interface DetailCtx {\n width: number;\n height: number;\n signal: AbortSignal;\n row: Row;\n /** Re-run detail.items for the focused row and repaint the preview pane. */\n reloadDetail?: () => void;\n}\n\nexport interface Action<R> {\n id: string;\n label: string | (() => string); // function form re-evaluated when state changes\n key?: string | string[];\n accelerator?: string;\n predicate?: (ctx: ActionContext<R>) => boolean;\n visible?: (row: Row) => boolean;\n handler: (ctx: ActionContext<R>) => void | Promise<void>;\n destructive?: boolean;\n primary?: boolean; // bound to Enter\n showInFooter?: boolean; // default true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ActionContext<R> {\n row: Row; // currently highlighted left-pane row\n rows: Row[]; // multi-select; falls back to [row] if no selection\n item?: DetailItem; // populated for actions declared under detail.actions\n filter: string;\n refresh: () => Promise<void>;\n /** Re-run detail.items for the focused row and repaint the preview pane. */\n reloadDetail: () => void;\n suspendAnd: <T>(fn: () => Promise<T>) => Promise<T>;\n openModal: (content: { title: string; content: string }) => void;\n toast: (msg: string, tone?: Tone) => void;\n confirm: (prompt: string | ConfirmPromptOptions) => Promise<boolean>;\n promptText: (options: {\n title: string;\n label: string;\n initialValue?: string;\n placeholder?: string;\n }) => Promise<string | null>;\n exit: (after?: () => void | Promise<void>) => void;\n activePane?: PaneRuntimeState;\n inactivePane?: PaneRuntimeState;\n}\n\nexport interface ListPaneConfig {\n id: string;\n kind: \"list\";\n title: string;\n rows: () => Promise<Row[]>;\n emptyHint?: string;\n multiSelect?: boolean;\n}\n\nexport interface DetailPaneConfig {\n id: string;\n kind: \"detail\";\n title: string;\n titleForRow?: (row: Row | undefined) => string;\n render: (row: Row | undefined, ctx: DetailCtx) => string | Promise<string>;\n}\n\nexport type PaneConfig = ListPaneConfig | DetailPaneConfig;\nexport interface PaneRuntimeState {\n id: string;\n title: string;\n rows: Row[];\n cursor: number;\n selected: Set<string>;\n filter: string;\n}\n\nexport interface ReorderContext {\n refresh: () => Promise<void>;\n toast: (msg: string, tone?: Tone) => void;\n}\n\nexport interface ExplorerConfig<R> {\n title: string;\n panes?: PaneConfig[];\n rows?: () => Promise<Row[]>;\n refresh?: () => void | Promise<void>;\n detail?: Detail<R>;\n actions: Action<R>[];\n reorder?: { onReorder: (orderedIds: string[], ctx?: ReorderContext) => void | Promise<void> };\n multiSelect?: boolean;\n keybindOverrides?: Record<string, string | string[]>;\n emptyHint?: string;\n initialFilter?: string;\n /** Synchronous first paint rows; still refreshed via `rows()` after start. */\n initialRows?: Row[];\n /** Disable terminal mouse reporting when native text selection is more useful than wheel input. */\n mouse?: boolean;\n}\n\nexport type NormalizedExplorerConfig<R> = ExplorerConfig<R> & {\n rows: () => Promise<Row[]>;\n detail: Detail<R>;\n};\n\nexport function normalizeExplorerConfig<R>(config: ExplorerConfig<R>): NormalizedExplorerConfig<R> {\n if (config.panes === undefined) {\n if (config.rows === undefined || config.detail === undefined)\n throw new Error(\"Explorer requires panes\");\n return config as NormalizedExplorerConfig<R>;\n }\n if (config.panes.length < 1 || config.panes.length > 3)\n throw new Error(\"Explorer requires 1 to 3 panes\");\n const list = config.panes.find((pane): pane is ListPaneConfig => pane.kind === \"list\");\n if (list === undefined) throw new Error(\"Explorer requires a list pane\");\n const companion = config.panes.find((pane) => pane !== list);\n const detail: Detail<R> =\n companion?.kind === \"detail\"\n ? {\n items: async (row, ctx) => {\n const content = await companion.render(row, ctx);\n if (ctx.signal.aborted) return [];\n return [{ id: row.id, render: () => content, renderedContent: content }];\n }\n }\n : companion?.kind === \"list\"\n ? {\n items: async () =>\n (await companion.rows()).map((row) => ({ ...row, render: () => \"\" })),\n actions: config.actions\n }\n : { items: async () => [] };\n return {\n ...config,\n rows: list.rows,\n detail,\n multiSelect: list.multiSelect ?? config.multiSelect,\n emptyHint: list.emptyHint ?? config.emptyHint\n };\n}\n\nexport const REGION_HEADER = 1 << 0;\nexport const REGION_LIST = 1 << 1;\nexport const REGION_DETAIL = 1 << 2;\nexport const REGION_FOOTER = 1 << 3;\nexport const REGION_MODAL = 1 << 4;\nexport const REGION_TOAST = 1 << 5;\nexport const REGION_ALL =\n REGION_HEADER | REGION_LIST | REGION_DETAIL | REGION_FOOTER | REGION_MODAL | REGION_TOAST;\n\nexport type Dirty = number;\n\nexport type ExplorerLayoutMode =\n | \"wide\"\n | \"medium\"\n | \"narrow-vertical\"\n | \"narrow-list-only\"\n | \"too-narrow\";\n\nexport interface ExplorerSize {\n cols: number;\n rows: number;\n}\n\nexport interface ExplorerState {\n title: string;\n emptyHint: string;\n rows: Row[];\n rowsLoading: boolean;\n filtered: number[];\n matchPositions: Map<number, number[]>;\n cursor: number;\n filter: string;\n filterFocused: boolean;\n focused: \"list\" | \"detail\";\n detail: {\n rowId: string | null;\n items: DetailItem[] | null;\n allItems?: DetailItem[] | null;\n filter?: string;\n cursor: number;\n scroll: number;\n token: number;\n loading: boolean;\n };\n selected: Set<string>;\n multiSelect: boolean;\n modal:\n | null\n | { kind: \"help\" }\n | {\n kind: \"confirm\";\n title: string;\n message: string;\n confirmLabel: string;\n cancelLabel: string;\n destructive: boolean;\n resolver: (ok: boolean) => void;\n action?: Action<unknown>;\n rows?: Row[];\n }\n | {\n kind: \"input\";\n title: string;\n label: string;\n value: string;\n placeholder?: string;\n resolver: (value: string | null) => void;\n }\n | { kind: \"palette\"; query: string; cursor: number }\n | { kind: \"content\"; title: string; content: string; scroll: number };\n toast: { message: string; tone: Tone; expiresAt: number } | null;\n dirty: Dirty;\n size: ExplorerSize;\n layout: ExplorerLayoutMode;\n bindings: ResolvedBindings;\n actionState: Map<string, ActionStateEntry>;\n suspended: boolean;\n paneDefinitions: Array<{\n id: string;\n title: string;\n kind: \"list\" | \"detail\";\n titleForRow?: (row: Row | undefined) => string;\n }>;\n}\n\nexport interface ActionStateEntry {\n available: boolean;\n label: string;\n running?: boolean;\n action?: Action<unknown>;\n source?: \"row\" | \"detail\" | \"both\";\n}\n\nexport function createInitialState<R>(\n config: ExplorerConfig<R>,\n size: ExplorerSize\n): ExplorerState {\n const normalizedConfig = normalizeExplorerConfig(config);\n const normalizedSize = {\n cols: normalizeSize(size.cols),\n rows: normalizeSize(size.rows)\n };\n const multiSelect = normalizedConfig.multiSelect ?? true;\n\n const initialRows = normalizedConfig.initialRows ?? [];\n const initialFilter = normalizedConfig.initialFilter ?? \"\";\n // Defer filtering to first rowsLoaded when empty; seed list immediately when provided.\n return {\n title: normalizedConfig.title,\n emptyHint: normalizedConfig.emptyHint ?? \"No detail\",\n rows: initialRows,\n rowsLoading: true,\n filtered: initialRows.map((_, index) => index),\n matchPositions: new Map(),\n cursor: 0,\n filter: initialFilter,\n filterFocused: false,\n focused: \"list\",\n detail: {\n rowId: initialRows[0]?.id ?? null,\n items: null,\n allItems: null,\n filter: \"\",\n cursor: 0,\n scroll: 0,\n token: initialRows.length > 0 ? 1 : 0,\n loading: initialRows.length > 0\n },\n selected: new Set(),\n multiSelect,\n modal: null,\n toast: null,\n dirty: REGION_ALL,\n size: normalizedSize,\n layout: resolveExplorerLayoutMode(normalizedSize.cols, normalizedSize.rows),\n bindings: resolveBindings(normalizedConfig),\n actionState: createInitialActionState(normalizedConfig),\n suspended: false,\n paneDefinitions: normalizedConfig.panes?.map(({ id, title, kind, ...pane }) => ({\n id,\n title,\n kind,\n ...(kind === \"detail\" && \"titleForRow\" in pane ? { titleForRow: pane.titleForRow } : {})\n })) ?? [\n { id: \"list\", title: normalizedConfig.title, kind: \"list\" },\n { id: \"detail\", title: \"Preview\", kind: \"detail\" }\n ]\n };\n}\n\nfunction createInitialActionState<R>(config: ExplorerConfig<R>): Map<string, ActionStateEntry> {\n const state = new Map<string, ActionStateEntry>();\n\n for (const [source, actions] of [\n [\"row\", config.actions],\n [\"detail\", config.detail?.actions ?? []]\n ] as const) {\n for (const action of actions) {\n if (state.has(action.id)) {\n const isSharedListAction =\n config.panes?.some((pane) => pane.kind === \"list\" && pane !== config.panes?.[0]) === true;\n if (!isSharedListAction) throw new Error(`Duplicate explorer action id: ${action.id}`);\n const existing = state.get(action.id)!;\n state.set(action.id, { ...existing, source: \"both\" });\n continue;\n }\n\n state.set(action.id, {\n available: true,\n label: typeof action.label === \"function\" ? action.id : action.label,\n action: action as Action<unknown>,\n source\n });\n }\n }\n\n return state;\n}\n\nexport function resolveExplorerLayoutMode(cols: number, rows = 24): ExplorerLayoutMode {\n if (cols < 60 || rows < 8) {\n return \"too-narrow\";\n }\n\n if (cols < 80) {\n return \"narrow-list-only\";\n }\n\n if (cols < 100) {\n return \"narrow-vertical\";\n }\n\n if (cols < 120) {\n return \"medium\";\n }\n\n return \"wide\";\n}\n\nfunction normalizeSize(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import { color } from \"../../components/color.js\";\nimport type { PromptStateName } from \"./core.js\";\n\nfunction supportsUnicode(): boolean {\n if (!process.platform.startsWith(\"win\")) {\n return process.env.TERM !== \"linux\";\n }\n\n return Boolean(\n process.env.CI ||\n process.env.WT_SESSION ||\n process.env.TERMINUS_SUBLIME ||\n process.env.ConEmuTask === \"{cmd::Cmder}\" ||\n process.env.TERM_PROGRAM === \"Terminus-Sublime\" ||\n process.env.TERM_PROGRAM === \"vscode\" ||\n process.env.TERM === \"xterm-256color\" ||\n process.env.TERM === \"alacritty\" ||\n process.env.TERMINAL_EMULATOR === \"JetBrains-JediTerm\"\n );\n}\n\nexport const UNICODE = supportsUnicode();\n\nfunction glyph(unicode: string, ascii: string): string {\n return UNICODE ? unicode : ascii;\n}\n\nexport const GLYPHS = {\n stepActive: glyph(\"\u25C6\", \"*\"),\n stepCancel: glyph(\"\u25A0\", \"x\"),\n stepError: glyph(\"\u25B2\", \"x\"),\n stepSubmit: glyph(\"\u25C7\", \"o\"),\n barStart: glyph(\"\u250C\", \"T\"),\n bar: glyph(\"\u2502\", \"|\"),\n barEnd: glyph(\"\u2514\", \"-\"),\n radioActive: glyph(\"\u25CF\", \">\"),\n radioInactive: glyph(\"\u25CB\", \" \"),\n checkboxActive: \"[ ]\",\n checkboxSelected: \"[x]\",\n checkboxInactive: \"[ ]\",\n passwordMask: glyph(\"\u2022\", \"*\"),\n ellipsis: \"...\"\n} as const;\n\nexport function symbol(state: PromptStateName): string {\n if (state === \"cancel\") return color.red(GLYPHS.stepCancel);\n if (state === \"error\") return color.yellow(GLYPHS.stepError);\n if (state === \"submit\") return color.green(GLYPHS.stepSubmit);\n return color.cyan(GLYPHS.stepActive);\n}\n\nexport function symbolBar(state: PromptStateName): string {\n if (state === \"cancel\") return color.red(GLYPHS.bar);\n if (state === \"error\") return color.yellow(GLYPHS.bar);\n if (state === \"submit\") return color.green(GLYPHS.bar);\n return color.cyan(GLYPHS.bar);\n}\n", "import { EventEmitter } from \"node:events\";\nimport * as readline from \"node:readline\";\nimport { CANCEL } from \"./cancel-symbol.js\";\nimport { mapKey, type Action } from \"./keys.js\";\nimport { wrapFrame } from \"./wrap.js\";\n\nconst cursor = {\n hide: \"\\x1b[?25l\",\n show: \"\\x1b[?25h\",\n move: (x: number, y: number) => {\n let output = \"\";\n if (x < 0) output += `\\x1b[${-x}D`;\n if (x > 0) output += `\\x1b[${x}C`;\n if (y < 0) output += `\\x1b[${-y}A`;\n if (y > 0) output += `\\x1b[${y}B`;\n return output;\n }\n};\n\nconst erase = {\n down: \"\\x1b[J\"\n};\n\nexport type PromptStateName = \"initial\" | \"active\" | \"submit\" | \"cancel\" | \"error\";\n\n/**\n * Builds the non-TTY rejection message, naming the documented `--yes` flag for the\n * command being run and keeping `POE_NO_PROMPT=1` as the secondary CI alternative.\n */\nexport function nonTtyPromptMessage(argv: string[] = process.argv): string {\n const tokens: string[] = [];\n for (const arg of argv.slice(2)) {\n if (arg.startsWith(\"-\")) break;\n tokens.push(arg);\n }\n const retry = [...tokens, \"--yes\"].join(\" \");\n return `Interactive prompt requires a TTY. Re-run with \\`${retry}\\` to accept defaults non-interactively, or set POE_NO_PROMPT=1 in CI.`;\n}\n\nexport interface PromptState<Value> {\n state: PromptStateName;\n value: Value | undefined;\n error: string;\n cursor: number;\n userInput: string;\n}\n\nexport interface PromptOptions<Value> {\n render: (state: Prompt<Value>) => string;\n initialValue?: Value;\n initialUserInput?: string;\n validate?: (value: Value | undefined) => string | Error | undefined;\n signal?: AbortSignal;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n}\n\ntype InputStream = NodeJS.ReadableStream & {\n isTTY?: boolean;\n setRawMode?: (enabled: boolean) => void;\n unpipe?: () => void;\n};\n\ntype KeyMeta = {\n name?: string;\n ctrl?: boolean;\n};\n\nexport class Prompt<Value> extends EventEmitter {\n state: PromptStateName = \"initial\";\n value: Value | undefined;\n error = \"\";\n userInput = \"\";\n protected _cursor = 0;\n protected input: InputStream;\n protected output: NodeJS.WritableStream;\n private readonly renderFrame: (state: Prompt<Value>) => string;\n private readonly validate?: (value: Value | undefined) => string | Error | undefined;\n private readonly signal?: AbortSignal;\n private readonly trackValue: boolean;\n private previousFrame = \"\";\n private readlineInterface?: readline.Interface;\n private abortListener?: () => void;\n private closed = false;\n\n constructor(opts: PromptOptions<Value>, trackValue = true) {\n super();\n this.input = (opts.input ?? process.stdin) as InputStream;\n this.output = opts.output ?? process.stdout;\n this.renderFrame = opts.render;\n this.validate = opts.validate;\n this.signal = opts.signal;\n this.value = opts.initialValue;\n this.trackValue = trackValue;\n this.userInput = opts.initialUserInput ?? \"\";\n this._cursor = this.userInput.length;\n }\n\n get cursor(): number {\n return this._cursor;\n }\n\n prompt(): Promise<Value | typeof CANCEL> {\n if (this.signal?.aborted) {\n this.state = \"cancel\";\n return Promise.resolve(CANCEL);\n }\n\n if (this.input.isTTY !== true) {\n return this.promptNonTty();\n }\n\n return new Promise((resolve) => {\n const onSubmit = (value: Value | undefined) => resolve(value as Value);\n const onCancel = () => resolve(CANCEL);\n this.once(\"submit\", onSubmit);\n this.once(\"cancel\", onCancel);\n\n this.abortListener = () => {\n this.state = \"cancel\";\n this.emit(\"finalize\");\n this.render();\n this.close();\n };\n this.signal?.addEventListener(\"abort\", this.abortListener, { once: true });\n\n this.readlineInterface = readline.createInterface({\n input: this.input,\n output: undefined,\n tabSize: 2,\n prompt: \"\",\n escapeCodeTimeout: 50,\n terminal: true\n });\n readline.emitKeypressEvents(this.input, this.readlineInterface);\n this.readlineInterface.prompt();\n this.input.on(\"keypress\", this.onKeypress);\n if (this.input.setRawMode) {\n this.input.setRawMode(true);\n }\n this.output.on(\"resize\", this.render);\n this.render();\n });\n }\n\n protected promptNonTty(): Promise<Value | typeof CANCEL> {\n return Promise.reject(new Error(nonTtyPromptMessage()));\n }\n\n protected readNonTtyLine(): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: this.input, terminal: false });\n let settled = false;\n\n const settle = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n rl.close();\n resolve(value);\n };\n\n rl.once(\"line\", settle);\n rl.once(\"close\", () => settle(rl.line));\n });\n }\n\n protected setValue(value: Value | undefined): void {\n this.value = value;\n this.emit(\"value\", value);\n }\n\n protected setError(message: string): void {\n this.error = message;\n }\n\n protected setUserInput(value: string): void {\n this.userInput = value;\n this._cursor = Math.min(this._cursor, this.userInput.length);\n this.emit(\"userInput\", this.userInput);\n }\n\n protected clearUserInput(): void {\n this.userInput = \"\";\n this._cursor = 0;\n this.emit(\"userInput\", this.userInput);\n }\n\n private readonly onKeypress = (char: string | undefined, key: KeyMeta = {}) => {\n let action = mapKey(key.name, char);\n if (this.trackValue && char && char >= \" \" && key.name !== \"return\" && key.name !== \"enter\" && key.name !== \"escape\") {\n action = undefined;\n }\n\n if (this.trackValue && action !== \"enter\") {\n this.updateTrackedInput(char, key, action);\n }\n\n if (this.state === \"error\") {\n this.state = \"active\";\n this.error = \"\";\n }\n\n if (!this.trackValue && action) {\n this.emit(\"cursor\", action);\n } else if (this.trackValue && action && action !== \"enter\") {\n this.emit(\"cursor\", action);\n }\n\n if (char && /^[yn]$/i.test(char)) {\n this.emit(\"confirm\", char.toLowerCase() === \"y\");\n }\n\n if (char) {\n this.emit(\"key\", char.toLowerCase(), key);\n }\n\n if (action === \"enter\") {\n const error = this.validate?.(this.value);\n if (error) {\n this.error = error instanceof Error ? error.message : error;\n this.state = \"error\";\n } else {\n this.state = \"submit\";\n }\n }\n\n if (action === \"cancel\") {\n this.state = \"cancel\";\n }\n\n if (this.state === \"submit\" || this.state === \"cancel\") {\n this.emit(\"finalize\");\n }\n\n this.render();\n\n if (this.state === \"submit\" || this.state === \"cancel\") {\n this.close();\n }\n };\n\n private updateTrackedInput(char: string | undefined, key: KeyMeta, action: Action | undefined): void {\n if (key.ctrl) {\n if (key.name === \"a\") {\n this._cursor = 0;\n return;\n }\n if (key.name === \"e\") {\n this._cursor = this.userInput.length;\n return;\n }\n if (key.name === \"u\") {\n this.userInput = this.userInput.slice(this._cursor);\n this._cursor = 0;\n this.emit(\"userInput\", this.userInput);\n return;\n }\n if (key.name === \"k\") {\n this.userInput = this.userInput.slice(0, this._cursor);\n this.emit(\"userInput\", this.userInput);\n return;\n }\n }\n\n if (action === \"left\") {\n this._cursor = Math.max(0, this._cursor - 1);\n return;\n }\n if (action === \"right\") {\n this._cursor = Math.min(this.userInput.length, this._cursor + 1);\n return;\n }\n if (action === \"cancel\" || action === \"up\" || action === \"down\" || action === \"space\") {\n return;\n }\n if (key.name === \"backspace\" || char === \"\\b\" || char === \"\\x7f\") {\n if (this._cursor > 0) {\n this.userInput = `${this.userInput.slice(0, this._cursor - 1)}${this.userInput.slice(this._cursor)}`;\n this._cursor -= 1;\n this.emit(\"userInput\", this.userInput);\n }\n return;\n }\n if (key.name === \"delete\") {\n if (this._cursor < this.userInput.length) {\n this.userInput = `${this.userInput.slice(0, this._cursor)}${this.userInput.slice(this._cursor + 1)}`;\n this.emit(\"userInput\", this.userInput);\n }\n return;\n }\n if (!char || char < \" \" || key.ctrl) {\n return;\n }\n\n this.userInput = `${this.userInput.slice(0, this._cursor)}${char}${this.userInput.slice(this._cursor)}`;\n this._cursor += char.length;\n this.emit(\"userInput\", this.userInput);\n }\n\n protected readonly render = () => {\n if (this.closed) {\n return;\n }\n\n const frame = wrapFrame(this.output, this.renderFrame(this) ?? \"\");\n if (frame === this.previousFrame) {\n return;\n }\n\n if (!this.previousFrame) {\n this.output.write(`${cursor.hide}${frame}`);\n this.previousFrame = frame;\n if (this.state === \"initial\") {\n this.state = \"active\";\n }\n return;\n }\n\n const previousLineCount = this.previousFrame.split(\"\\n\").length - 1;\n this.output.write(`${cursor.move(-999, -previousLineCount)}${erase.down}${frame}`);\n this.previousFrame = frame;\n };\n\n protected close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.input.removeListener(\"keypress\", this.onKeypress);\n this.output.removeListener(\"resize\", this.render);\n if (this.abortListener) {\n this.signal?.removeEventListener(\"abort\", this.abortListener);\n }\n this.output.write(`${cursor.show}\\n`);\n if (!process.platform.startsWith(\"win\") && this.input.setRawMode) {\n this.input.setRawMode(false);\n }\n this.readlineInterface?.close();\n this.input.unpipe?.();\n\n if (this.state === \"cancel\") {\n this.emit(\"cancel\");\n } else {\n this.emit(\"submit\", this.value);\n }\n this.removeAllListeners();\n }\n}\n", "import { wrapAnsi } from \"fast-wrap-ansi\";\nimport stringWidth from \"fast-string-width\";\n\ninterface StreamSize {\n columns?: number;\n rows?: number;\n}\n\nexport function getColumns(output: NodeJS.WritableStream): number {\n return Math.max(1, (output as StreamSize).columns ?? 80);\n}\n\nexport function getRows(output: NodeJS.WritableStream): number {\n return Math.max(1, (output as StreamSize).rows ?? 20);\n}\n\nexport function wrapTextWithPrefix(\n output: NodeJS.WritableStream,\n text: string,\n prefix: string,\n startPrefix = prefix\n): string {\n const width = Math.max(1, getColumns(output) - stringWidth(prefix));\n return wrapAnsi(text, width, { hard: true, trim: false })\n .split(\"\\n\")\n .map((line, index) => `${index === 0 ? startPrefix : prefix}${line}`)\n .join(\"\\n\");\n}\n\nexport function wrapFrame(output: NodeJS.WritableStream, frame: string): string {\n return wrapAnsi(frame, getColumns(output), { hard: true, trim: false });\n}\n", "import { color } from \"../../components/color.js\";\nimport { GLYPHS } from \"./glyphs.js\";\nimport { getColumns, getRows } from \"./wrap.js\";\nimport { wrapAnsi } from \"fast-wrap-ansi\";\n\nexport interface PaginationOptions<Option> {\n cursor: number;\n options: Option[];\n style: (option: Option, active: boolean) => string;\n output: NodeJS.WritableStream;\n maxItems?: number;\n columnPadding?: number;\n rowPadding?: number;\n}\n\nfunction countLines(values: string[]): number {\n return values.reduce((sum, value) => sum + value.split(\"\\n\").length, 0);\n}\n\nfunction trimToRows(values: string[], cursorOffset: number, rows: number, hasTop: boolean, hasBottom: boolean): string[] {\n const output = [...values];\n while (countLines(output) > rows && output.length > 1) {\n const removeFromTop = hasTop && cursorOffset > 0;\n const removeFromBottom = hasBottom && cursorOffset < output.length - 1;\n if (removeFromTop) {\n output.shift();\n cursorOffset -= 1;\n } else if (removeFromBottom) {\n output.pop();\n } else {\n output.pop();\n }\n }\n return output;\n}\n\nexport function limitOptions<Option>(opts: PaginationOptions<Option>): string[] {\n const {\n cursor,\n options,\n style,\n output,\n maxItems = Number.POSITIVE_INFINITY,\n columnPadding = 0,\n rowPadding = 4\n } = opts;\n\n if (options.length === 0) {\n return [];\n }\n\n const columns = Math.max(1, getColumns(output) - columnPadding);\n const rowBudget = Math.max(getRows(output) - rowPadding, 0);\n const visibleCount = Math.max(Math.min(maxItems, rowBudget), 5);\n const cappedVisibleCount = Math.min(visibleCount, options.length);\n let start = 0;\n\n if (cursor >= cappedVisibleCount - 3) {\n start = Math.max(Math.min(cursor - cappedVisibleCount + 3, options.length - cappedVisibleCount), 0);\n }\n\n const hasTopMarker = cappedVisibleCount < options.length && start > 0;\n const hasBottomMarker = cappedVisibleCount < options.length && start + cappedVisibleCount < options.length;\n const visible = options\n .slice(start, start + cappedVisibleCount)\n .map((option, index) => wrapAnsi(style(option, start + index === cursor), columns, { hard: true, trim: false }));\n const trimmed = trimToRows(\n visible,\n Math.max(cursor - start, 0),\n Math.max(rowBudget - Number(hasTopMarker) - Number(hasBottomMarker), 1),\n hasTopMarker,\n hasBottomMarker\n );\n\n if (hasTopMarker) {\n trimmed.unshift(color.dim(GLYPHS.ellipsis));\n }\n if (hasBottomMarker) {\n trimmed.push(color.dim(GLYPHS.ellipsis));\n }\n\n return trimmed;\n}\n", "import { color } from \"../components/color.js\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = Object.freeze([\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const);\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${renderMarkdownInline(options.message)}${options.timer ? ` [${renderMarkdownInline(options.timer)}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const index = ((frame % SPINNER_FRAMES.length) + SPINNER_FRAMES.length) % SPINNER_FRAMES.length;\n const spinnerChar = color.magenta(SPINNER_FRAMES[index]);\n const timerSuffix = options.timer ? color.dim(` [${options.timer}]`) : \"\";\n const bar = color.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nfunction renderMarkdownInline(value: string): string {\n return value.replaceAll(\"\\r\\n\", \" \").replaceAll(\"\\n\", \" \").replaceAll(\"\\r\", \" \");\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${renderMarkdownInline(options.message)}${options.timer ? ` [${renderMarkdownInline(options.timer)}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n code: options.code ?? 0,\n ...(options.timer ? { timer: options.timer } : {}),\n ...(options.subtext ? { subtext: options.subtext } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? color.green(\"\u25C6\") : color.red(\"\u25A0\");\n const timerSuffix = options.timer ? color.dim(` [${options.timer}]`) : \"\";\n const bar = color.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${color.dim(options.subtext)}`;\n }\n return output;\n}\n", "import { readFile, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport { resolve as resolveConfigDocument } from \"./resolve.js\";\n\nexport interface PromptDocumentFileSystem {\n readFile(filePath: string, encoding: BufferEncoding): Promise<string>;\n realpath(filePath: string): Promise<string>;\n}\n\nexport interface PromptDocumentBaseDocument {\n filePath: string;\n content: string;\n}\n\nexport interface ResolvePromptDocumentInput {\n cwd: string;\n filePath: string;\n content?: string;\n optional?: boolean;\n basePaths?: readonly string[];\n baseDocuments?: readonly PromptDocumentBaseDocument[];\n variables?: Record<string, unknown>;\n validate?: boolean;\n fs?: PromptDocumentFileSystem;\n}\n\nexport interface ResolvedPromptDocument {\n template: string;\n prompt: string;\n metadata: Record<string, unknown>;\n sources: Record<string, string>;\n source: string;\n chain: string[];\n}\n\nconst nativeFs: PromptDocumentFileSystem = {\n readFile: (filePath, encoding) => readFile(filePath, encoding),\n realpath: (filePath) => realpath(filePath)\n};\n\nexport async function resolvePromptDocument(\n input: ResolvePromptDocumentInput\n): Promise<ResolvedPromptDocument> {\n const cwd = path.resolve(input.cwd);\n const filePath = path.resolve(cwd, input.filePath);\n assertInsideRoot(filePath, cwd, \"Prompt document path must remain inside cwd\");\n const baseDocuments = (input.baseDocuments ?? []).map((document) => ({\n filePath: requireAbsolutePath(document.filePath, \"Prompt document base document paths\"),\n content: document.content\n }));\n const basePaths = [\n ...(input.basePaths ?? []).map((basePath) =>\n requireAbsolutePath(basePath, \"Prompt document base paths\")\n ),\n ...baseDocuments.map(({ filePath: baseFilePath }) => path.dirname(baseFilePath))\n ];\n const fs = createRootedFileSystem(\n createDocumentFileSystem(input.fs ?? nativeFs, baseDocuments),\n [cwd, ...basePaths]\n );\n const content = input.content ?? (await readDocumentContent(fs, filePath, input.optional));\n const chain = [\n { source: \"document\", filePath, content },\n ...basePaths.map((basePath, index) => ({ source: `base-${index + 1}`, path: basePath }))\n ];\n const composed = await resolveConfigDocument(chain, { fs });\n const rendered = await resolveConfigDocument(chain, {\n fs,\n view: input.variables ?? {},\n validate: input.validate ?? true\n });\n const template = requirePrompt(getOwnEntry(composed.data, \"prompt\"), filePath);\n const prompt = requirePrompt(getOwnEntry(rendered.data, \"prompt\"), filePath);\n const { prompt: _ignored, ...metadata } = rendered.data;\n void _ignored;\n return {\n template,\n prompt,\n metadata,\n sources: rendered.sources,\n source: filePath,\n chain: rendered.chain\n };\n}\n\nfunction createDocumentFileSystem(\n fs: PromptDocumentFileSystem,\n documents: readonly PromptDocumentBaseDocument[]\n): PromptDocumentFileSystem {\n const contentByPath = new Map(\n documents.map(({ filePath, content }) => [path.resolve(filePath), content] as const)\n );\n return {\n readFile(filePath, encoding) {\n const content = contentByPath.get(path.resolve(filePath));\n return content === undefined ? fs.readFile(filePath, encoding) : Promise.resolve(content);\n },\n realpath(filePath) {\n const resolvedPath = path.resolve(filePath);\n return contentByPath.has(resolvedPath) ? Promise.resolve(resolvedPath) : fs.realpath(filePath);\n }\n };\n}\n\nasync function readDocumentContent(\n fs: PromptDocumentFileSystem,\n filePath: string,\n optional: boolean | undefined\n): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (optional && hasOwnErrorCode(error, \"ENOENT\")) {\n return \"---\\nextends: true\\n---\\n\";\n }\n throw error;\n }\n}\n\nfunction createRootedFileSystem(\n fs: PromptDocumentFileSystem,\n roots: readonly string[]\n): PromptDocumentFileSystem {\n return {\n async readFile(filePath, encoding) {\n await assertRealPathInsideOriginalRoot(fs, filePath, roots);\n return fs.readFile(filePath, encoding);\n },\n realpath: (filePath) => fs.realpath(filePath)\n };\n}\n\nasync function assertRealPathInsideOriginalRoot(\n fs: PromptDocumentFileSystem,\n filePath: string,\n roots: readonly string[]\n): Promise<void> {\n const resolvedPath = path.resolve(await fs.realpath(filePath));\n const originalRoot = roots.find((root) => isInsideRoot(filePath, root));\n if (!originalRoot) {\n throw new Error(`Prompt document path escapes configured root: ${filePath}`);\n }\n\n const resolvedRoot = await resolveRootPath(fs, originalRoot);\n if (!isInsideRoot(resolvedPath, resolvedRoot)) {\n throw new Error(`Prompt document path escapes configured root: ${filePath}`);\n }\n}\n\nasync function resolveRootPath(\n fs: PromptDocumentFileSystem,\n root: string\n): Promise<string> {\n try {\n return path.resolve(await fs.realpath(root));\n } catch {\n return path.resolve(root);\n }\n}\n\nfunction requireAbsolutePath(filePath: string, label: string): string {\n if (!path.isAbsolute(filePath)) {\n throw new Error(`${label} must be absolute: ${filePath}`);\n }\n return path.resolve(filePath);\n}\n\nfunction assertInsideRoot(filePath: string, root: string, message: string): void {\n if (!isInsideRoot(filePath, root)) {\n throw new Error(`${message}: ${filePath}`);\n }\n}\n\nfunction isInsideRoot(filePath: string, root: string): boolean {\n const relativePath = path.relative(path.resolve(root), path.resolve(filePath));\n return (\n relativePath === \"\" ||\n (relativePath !== \"..\" && !relativePath.startsWith(`..${path.sep}`) && !path.isAbsolute(relativePath))\n );\n}\n\nfunction requirePrompt(value: unknown, filePath: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`Prompt document does not resolve to a Markdown prompt: ${filePath}`);\n }\n return value;\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { renderTemplate } from \"toolcraft-design\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { cloneConfigObject, setConfigEntry } from \"../formats/object.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\nimport { hasOwnErrorCode } from \"../error-codes.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n context: MutationContext,\n targetPath: string,\n content: string\n): Promise<void> {\n const baseBackupPath = createInvalidDocumentBackupPath(targetPath);\n let attempt = 0;\n while (true) {\n const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;\n await assertRegularWriteTarget(context, backupPath);\n try {\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\", flag: \"wx\" });\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await context.fs.unlink(backupPath).catch(() => undefined);\n throw error;\n }\n attempt += 1;\n }\n }\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nasync function assertRegularWriteTarget(\n context: MutationContext,\n targetPath: string\n): Promise<void> {\n // Symlinks inside the managed home directory are untrusted: an attacker could\n // plant one to redirect a credential/config write outside it. Symlinks at or\n // above home are legitimate system links (e.g. /tmp -> /private/tmp on macOS,\n // /var -> /private/var) and must not block writes, so bound the walk at home.\n const boundary = path.dirname(path.resolve(context.homeDir));\n let currentPath = path.resolve(targetPath);\n while (currentPath !== boundary) {\n try {\n if ((await context.fs.lstat(currentPath)).isSymbolicLink()) {\n throw new Error(`Refusing mutation write through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n\n const parentPath = path.dirname(currentPath);\n if (parentPath === currentPath) {\n return;\n }\n currentPath = parentPath;\n }\n}\n\nasync function writeAtomically(\n context: MutationContext,\n targetPath: string,\n content: string\n): Promise<void> {\n await assertRegularWriteTarget(context, targetPath);\n for (let attempt = 0; attempt < 10; attempt += 1) {\n const tempPath = `${targetPath}.mutation-tmp-${process.pid}-${randomUUID()}`;\n let tempCreated = false;\n try {\n await assertRegularWriteTarget(context, tempPath);\n await context.fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n await context.fs.rename(tempPath, targetPath);\n tempCreated = false;\n return;\n } catch (error) {\n const alreadyExists = isAlreadyExists(error);\n if (tempCreated || !alreadyExists) {\n try {\n await context.fs.unlink(tempPath);\n } catch (cleanupError) {\n if (!isNotFound(cleanupError)) {\n void cleanupError;\n }\n }\n }\n\n if (alreadyExists) {\n continue;\n }\n\n throw error;\n }\n }\n\n throw new Error(`Unable to create temporary mutation file for ${targetPath}.`);\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"restoreBackup\":\n return `Restore ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction mutationTargetPath(\n mutation: Mutation,\n options: MutationOptions\n): string | undefined {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n case \"removeDirectory\":\n return resolveValue(mutation.path, options);\n case \"removeFile\":\n case \"chmod\":\n case \"backup\":\n case \"restoreBackup\":\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateWrite\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return resolveValue(mutation.target, options);\n default:\n return undefined;\n }\n}\n\nexport function resolveMutationDetails(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): MutationDetails {\n try {\n const rawTarget = mutationTargetPath(mutation, options);\n if (rawTarget === undefined) {\n return {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind\n };\n }\n\n try {\n const targetPath = resolvePath(rawTarget, context.homeDir, context.pathMapper);\n return {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n } catch {\n return {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, rawTarget),\n targetPath: undefined\n };\n }\n } catch {\n return {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind\n };\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n setConfigEntry(result, key, value);\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result = cloneConfigObject(base);\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n setConfigEntry(result, key, mergePrunedConfigObject(pruned, value));\n } else {\n setConfigEntry(result, key, mergeWithPruneByPrefix(current, value, prefixMap));\n }\n continue;\n }\n setConfigEntry(result, key, value);\n }\n return result;\n}\n\nfunction mergePrunedConfigObject(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result = cloneConfigObject(base);\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n\n setConfigEntry(result, key, value);\n }\n\n return result;\n}\n\nfunction serializeConfigUpdate(\n format: ReturnType<typeof getConfigFormat>,\n rawContent: string | null,\n current: ConfigObject,\n next: ConfigObject\n): string {\n if (rawContent !== null && format.serializeUpdate) {\n return format.serializeUpdate(rawContent, current, next);\n }\n return format.serialize(next);\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"restoreBackup\":\n return applyRestoreBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n await assertRegularWriteTarget(context, targetPath);\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches) {\n mutation.whenContentMatches.lastIndex = 0;\n }\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n await assertRegularWriteTarget(context, targetPath);\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n await assertRegularWriteTarget(context, targetPath);\n if (mutation.once && (await findLatestGeneratedBackup(context.fs, targetPath)) !== null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null && !mutation.once) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const baseBackupPath = `${targetPath}.backup-${createTimestamp()}${content === null ? \".missing\" : \"\"}`;\n let attempt = 0;\n while (true) {\n const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;\n try {\n await assertRegularWriteTarget(context, backupPath);\n await context.fs.writeFile(backupPath, content ?? \"\", { encoding: \"utf8\", flag: \"wx\" });\n break;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await context.fs.unlink(backupPath).catch(() => undefined);\n throw error;\n }\n attempt += 1;\n }\n }\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\nasync function applyRestoreBackup(\n mutation: Extract<Mutation, { kind: \"restoreBackup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n const backup = await findLatestGeneratedBackup(context.fs, targetPath);\n\n if (backup === null) {\n return { outcome: { changed: false, effect: \"none\", detail: \"noop\" }, details };\n }\n\n if (!context.dryRun) {\n await assertRegularWriteTarget(context, backup.path);\n if (backup.originallyMissing) {\n try {\n await context.fs.unlink(targetPath);\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n } else {\n const content = await context.fs.readFile(backup.path, \"utf8\");\n await writeAtomically(context, targetPath, content);\n }\n await context.fs.unlink(backup.path);\n }\n\n return { outcome: { changed: true, effect: \"copy\", detail: \"restore\" }, details };\n}\n\nasync function findLatestGeneratedBackup(\n fs: FileSystem,\n targetPath: string\n): Promise<{ path: string; originallyMissing: boolean } | null> {\n const separatorIndex = targetPath.lastIndexOf(\"/\");\n const directoryPath = separatorIndex <= 0 ? \"/\" : targetPath.slice(0, separatorIndex);\n const targetName = targetPath.slice(separatorIndex + 1);\n let entries: string[];\n\n try {\n entries = await fs.readdir(directoryPath);\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n\n const backupName = entries\n .filter((entry) => isGeneratedBackupName(entry, targetName))\n .sort()\n .at(-1);\n return backupName === undefined\n ? null\n : {\n path: `${directoryPath}/${backupName}`,\n originallyMissing: backupName.endsWith(\".missing\")\n };\n}\n\nfunction isGeneratedBackupName(entry: string, targetName: string): boolean {\n const prefix = `${targetName}.backup-`;\n if (!entry.startsWith(prefix)) {\n return false;\n }\n\n const suffix = entry.slice(prefix.length);\n const timestamp = suffix.slice(0, 24);\n if (timestamp.length !== 24 || timestamp[4] !== \"-\" || timestamp[7] !== \"-\" || timestamp[10] !== \"T\" || timestamp[13] !== \"-\" || timestamp[16] !== \"-\" || timestamp[19] !== \"-\" || timestamp[23] !== \"Z\") {\n return false;\n }\n const parsedTimestamp = `${timestamp.slice(0, 13)}:${timestamp.slice(14, 16)}:${timestamp.slice(17, 19)}.${timestamp.slice(20)}`;\n if (Number.isNaN(Date.parse(parsedTimestamp))) {\n return false;\n }\n const collisionSuffix = suffix.slice(24);\n if (collisionSuffix.length === 0) {\n return true;\n }\n if (collisionSuffix === \".missing\") {\n return true;\n }\n return collisionSuffix[0] === \"-\" && collisionSuffix.slice(1).length > 0 && [...collisionSuffix.slice(1)].every((character) => character >= \"0\" && character <= \"9\");\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let preserveContent = rawContent;\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n preserveContent = null;\n }\n\n const value = resolveValue(mutation.value, options);\n if (!isConfigObject(value)) {\n throw new Error(`configMerge value must be an object for \"${rawPath}\".`);\n }\n\n // Keep prefix pruning on the same proto-safe object-write path as normal merges.\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = serializeConfigUpdate(format, preserveContent, current, merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = serializeConfigUpdate(format, rawContent, current, result);\n if (!context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let preserveContent = rawContent;\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n preserveContent = null;\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = serializeConfigUpdate(format, preserveContent, current, transformed);\n const serializedChanged = serialized !== rawContent;\n if (!serializedChanged) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = renderTemplate(template, templateContext);\n\n const current = await readFileIfExists(context.fs, targetPath);\n const changed = current !== rendered;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, rendered);\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (current === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = renderTemplate(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null && !context.dryRun) {\n await backupInvalidDocument(context, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await writeAtomically(context, targetPath, serialized);\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return cloneConfigObject(parsed);\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(result, key, value as ConfigValue);\n }\n return result;\n}\n\nfunction configValuesEqual(left: ConfigValue | undefined, right: ConfigValue | undefined): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (isConfigObject(pattern) && Object.keys(pattern).length > 0) {\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n const current = parse(content);\n return serializeUpdate(content || \"{}\", current, merge(current, patch));\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nfunction serializeUpdate(\n content: string,\n current: ConfigObject,\n next: ConfigObject\n): string {\n let result = content || \"{}\";\n result = applyObjectUpdate(result, [], current, next);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\nfunction applyObjectUpdate(\n content: string,\n path: (string | number)[],\n current: ConfigObject,\n next: ConfigObject\n): string {\n let result = content;\n\n for (const key of Object.keys(current)) {\n if (!hasConfigEntry(next, key)) {\n result = removeAtPath(result, [...path, key]);\n }\n }\n\n for (const [key, nextValue] of Object.entries(next)) {\n const nextPath = [...path, key];\n const hasCurrent = hasConfigEntry(current, key);\n const currentValue = hasCurrent ? current[key] : undefined;\n\n if (hasCurrent && isConfigObject(currentValue) && isConfigObject(nextValue)) {\n result = applyObjectUpdate(result, nextPath, currentValue, nextValue);\n continue;\n }\n\n if (!hasCurrent || !configValuesEqual(currentValue, nextValue)) {\n result = modifyAtPath(result, nextPath, nextValue as ConfigValue);\n }\n }\n\n return result;\n}\n\nexport {\n detectIndent,\n modifyAtPath,\n mergePreservingComments,\n removeAtPath,\n serializeUpdate\n};\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n serializeUpdate,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return cloneConfigObject(parsed as ConfigObject);\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(result, key, value as ConfigValue);\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (!isConfigObject(pattern) || Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n }\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\nimport { cloneConfigObject, hasConfigEntry, setConfigEntry } from \"./object.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return cloneConfigObject(parsed);\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result = cloneConfigObject(base);\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = hasConfigEntry(result, key) ? result[key] : undefined;\n if (isConfigObject(existing) && isConfigObject(value)) {\n setConfigEntry(result, key, merge(existing, value));\n continue;\n }\n setConfigEntry(result, key, value as ConfigValue);\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result = cloneConfigObject(obj);\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!hasConfigEntry(result, key)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n setConfigEntry(result, key, childResult);\n }\n continue;\n }\n\n if (!isConfigObject(pattern) || Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n }\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n const canonicalHome = path.resolve(homeDir);\n const canonicalExpanded = path.resolve(expanded);\n const relative = path.relative(canonicalHome, canonicalExpanded);\n if (relative === \"..\" || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {\n throw new Error(`Target path resolves outside home directory: \"${rawPath}\"`);\n }\n\n if (!pathMapper) {\n return canonicalExpanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "export function hasOwnErrorCode(\n error: unknown,\n code: string,\n): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import type { FileSystem } from \"./types.js\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import type {\n InferConfig,\n InferSchemaField,\n JsonSchemaField,\n SchemaField,\n ScopeSchema\n} from \"./types.js\";\n\nexport function resolveScope<S extends ScopeSchema>(\n schema: S,\n fileValues?: Record<string, unknown>,\n env: Record<string, string | undefined> = {}\n): InferConfig<S> {\n const resolved = {} as InferConfig<S>;\n\n for (const key of Object.keys(schema) as Array<keyof S & string>) {\n const field = schema[key];\n const envValue = resolveEnvValue(field, env, key);\n const fileValue = resolveFileValue(field, getOwnRecordValue(fileValues, key), key);\n const value = envValue ?? fileValue;\n defineDataProperty(\n resolved,\n key,\n (value === undefined ? cloneValue(field.default) : value) as InferConfig<S>[typeof key]\n );\n }\n\n return resolved;\n}\n\nfunction defineDataProperty(object: object, key: string, value: unknown): void {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n\nfunction getOwnRecordValue(\n record: Record<string, unknown> | undefined,\n key: string\n): unknown | undefined {\n return record !== undefined && Object.prototype.hasOwnProperty.call(record, key)\n ? record[key]\n : undefined;\n}\n\nfunction cloneValue<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneValue(entry)) as T;\n }\n\n if (!value || typeof value !== \"object\") {\n return value;\n }\n\n const clone = Object.create(Object.getPrototypeOf(value)) as Record<string, unknown>;\n for (const [key, entry] of Object.entries(value)) {\n defineDataProperty(clone, key, cloneValue(entry));\n }\n return clone as T;\n}\n\nfunction resolveEnvValue<T extends SchemaField>(\n field: T,\n env: Record<string, string | undefined>,\n key: string\n): InferSchemaField<T> | undefined {\n if (!field.env) {\n return undefined;\n }\n\n const raw = getOwnRecordValue(env, field.env);\n if (raw === undefined) {\n return undefined;\n }\n\n return typeof raw === \"string\" ? coerceValue(field, raw, key) : undefined;\n}\n\nfunction resolveFileValue<T extends SchemaField>(\n field: T,\n value: unknown,\n key: string\n): InferSchemaField<T> | undefined {\n return coerceValue(field, value, key);\n}\n\nfunction coerceValue<T extends SchemaField>(\n field: T,\n value: unknown,\n key: string\n): InferSchemaField<T> | undefined {\n switch (field.type) {\n case \"string\":\n return typeof value === \"string\" ? value as InferSchemaField<T> : undefined;\n case \"number\":\n return coerceNumber(value) as InferSchemaField<T> | undefined;\n case \"boolean\":\n return coerceBoolean(value) as InferSchemaField<T> | undefined;\n case \"json\":\n return coerceJson(field, value, key) as InferSchemaField<T> | undefined;\n }\n}\n\nfunction coerceNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return undefined;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction coerceBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (value === \"true\" || value === \"1\") {\n return true;\n }\n\n if (value === \"false\" || value === \"0\") {\n return false;\n }\n\n return undefined;\n}\n\nfunction coerceJson<T>(\n field: JsonSchemaField<T>,\n value: unknown,\n key: string\n): T | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsedValue = parseJsonValue(value, key);\n try {\n return field.parse(parsedValue);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON value.\";\n throw new Error(`Invalid config value for \"${key}\": ${message}`);\n }\n}\n\nfunction parseJsonValue(value: unknown, key: string): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n throw new Error(`Invalid config value for \"${key}\": expected valid JSON.`);\n }\n}\n", "import { readDocument, readMergedDocument, writeScope } from \"./store.js\";\nimport { resolveScope } from \"./resolve.js\";\nimport type {\n ConfigStore,\n ConfigStoreOptions,\n InferConfig,\n ScopedConfig,\n ScopeDefinition,\n ScopeSchema\n} from \"./types.js\";\n\nexport function createConfigStore(options: ConfigStoreOptions): ConfigStore {\n const env = options.env ?? {};\n\n return {\n scope<S extends ScopeSchema>(definition: ScopeDefinition<S>): ScopedConfig<S> {\n return {\n async get<K extends keyof S & string>(key: K) {\n const resolved = await resolveScopedValues(options, definition, env);\n return resolved[key];\n },\n\n async getAll() {\n return resolveScopedValues(options, definition, env);\n },\n\n async set<K extends keyof S & string>(key: K, value: InferConfig<S>[K]) {\n const document = await readDocument(options.fs, options.filePath);\n const currentValues = getOwnRecordEntry(document, definition.scope);\n await writeScope(options.fs, options.filePath, definition.scope, {\n ...currentValues,\n [key]: value\n });\n }\n };\n }\n };\n}\n\nasync function resolveScopedValues<S extends ScopeSchema>(\n options: ConfigStoreOptions,\n definition: ScopeDefinition<S>,\n env: Record<string, string | undefined>\n): Promise<InferConfig<S>> {\n const document = await readMergedDocument(options.fs, options.filePath, options.projectFilePath);\n return resolveScope(definition.schema, getOwnRecordEntry(document, definition.scope), env);\n}\n\nfunction getOwnRecordEntry(record: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n}\n", "import type { ConfigDocument } from \"./types.js\";\n\nexport function deepMergeDocuments(base: ConfigDocument, override: ConfigDocument): ConfigDocument {\n const merged: ConfigDocument = {};\n const scopes = new Set([...Object.keys(base), ...Object.keys(override)]);\n\n for (const scope of scopes) {\n const baseScope = getOwnRecordEntry(base, scope);\n const overrideScope = getOwnRecordEntry(override, scope);\n const nextScope = mergeScope(scope, baseScope, overrideScope);\n\n if (Object.keys(nextScope).length > 0) {\n setOwnEntry(merged, scope, nextScope);\n }\n }\n\n return merged;\n}\n\nfunction mergeScope(\n scope: string,\n baseScope: Record<string, unknown>,\n overrideScope: Record<string, unknown>\n): Record<string, unknown> {\n if (scope === \"runtime\") {\n return mergeRuntimeScope(baseScope, overrideScope);\n }\n\n const scopeEntries = Object.entries(overrideScope).filter(([, value]) => value !== undefined);\n const merged: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(baseScope)) {\n setOwnEntry(merged, key, value);\n }\n\n for (const [key, value] of scopeEntries) {\n setOwnEntry(merged, key, value);\n }\n\n return merged;\n}\n\nfunction mergeRuntimeScope(\n baseScope: Record<string, unknown>,\n overrideScope: Record<string, unknown>,\n path: string[] = []\n): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n const keys = new Set([...Object.keys(baseScope), ...Object.keys(overrideScope)]);\n\n for (const key of keys) {\n const baseValue = getOwnEntry(baseScope, key);\n const overrideValue = getOwnEntry(overrideScope, key);\n if (overrideValue === undefined) {\n if (baseValue !== undefined) {\n setOwnEntry(merged, key, baseValue);\n }\n continue;\n }\n\n if (isRecord(baseValue) && isRecord(overrideValue)) {\n setOwnEntry(merged, key, mergeRuntimeScope(baseValue, overrideValue, [...path, key]));\n continue;\n }\n\n setOwnEntry(merged, key, overrideValue);\n }\n\n return merged;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnRecordEntry(record: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = getOwnEntry(record, key);\n return isRecord(value) ? value : {};\n}\n\nfunction setOwnEntry(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true\n });\n}\n", "type BivariantCallback<Args extends unknown[], Return = void> = {\n callback(...args: Args): Return;\n}[\"callback\"];\n\nexport type PipelineCallbackFields = {\n onPlanResolved?: BivariantCallback<[summary: unknown]>;\n onTaskStart?: BivariantCallback<[progress: unknown]>;\n onTaskComplete?: BivariantCallback<[progress: unknown]>;\n};\n\nexport type ExperimentCallbackFields = {\n onExperimentStart?: BivariantCallback<[index: number, agent: string]>;\n onBaselineCollected?: BivariantCallback<[baseline: Record<string, number>]>;\n onMetricResult?: BivariantCallback<[metric: unknown, result: unknown]>;\n onCommit?: BivariantCallback<[commitHash: string]>;\n onReset?: BivariantCallback<[targetHash: string]>;\n onExperimentComplete?: BivariantCallback<[index: number, entry: unknown]>;\n};\n\nexport type LoopCallbacks = {\n runRole?: <T>(\n role: \"builder\" | \"inspector\" | \"superintendent\" | \"owner\",\n name: string | undefined,\n run: () => Promise<T>\n ) => Promise<T>;\n onBuilderStart?: () => void;\n onBuilderComplete?: BivariantCallback<[result: unknown]>;\n onBuilderFailed?: BivariantCallback<[error: Error]>;\n onInspectorStart?: BivariantCallback<[name: string]>;\n onInspectorComplete?: BivariantCallback<[result: unknown]>;\n onInspectorFailed?: BivariantCallback<[name: string, error: Error]>;\n onSuperintendentStart?: () => void;\n onSuperintendentComplete?: BivariantCallback<[result: unknown]>;\n onOwnerStart?: () => void;\n onOwnerComplete?: BivariantCallback<[result: unknown]>;\n onRoundComplete?: BivariantCallback<[round: number]>;\n onLoopComplete?: BivariantCallback<[state: unknown]>;\n onStateChange?: BivariantCallback<[state: unknown]>;\n shouldPause?: () => boolean;\n shouldStop?: () => boolean;\n};\n\ntype Callback = (this: unknown, ...args: never[]) => unknown;\ntype CallbackFields = Record<string, Callback | undefined>;\n\nexport function mergePipelineCallbacks(\n user: PipelineCallbackFields | undefined,\n added: PipelineCallbackFields | undefined\n): PipelineCallbackFields | undefined {\n return mergeCallbacks(user, added);\n}\n\nexport function mergeExperimentCallbacks(\n user: ExperimentCallbackFields | undefined,\n added: ExperimentCallbackFields | undefined\n): ExperimentCallbackFields | undefined {\n return mergeCallbacks(user, added);\n}\n\nexport function mergeLoopCallbacks(\n user: LoopCallbacks | undefined,\n added: LoopCallbacks | undefined\n): LoopCallbacks | undefined {\n const merged = mergeCallbacks(user, added);\n if (user?.runRole && added?.runRole && merged) {\n merged.runRole = (role, name, run) =>\n added.runRole!(role, name, () => user.runRole!(role, name, run));\n }\n return merged;\n}\n\nfunction mergeCallbacks<T extends object>(\n user: T | undefined,\n added: T | undefined\n): T | undefined {\n if (!user) {\n return added;\n }\n\n if (!added) {\n return user;\n }\n\n const userCallbacks = user as unknown as CallbackFields;\n const addedCallbacks = added as unknown as CallbackFields;\n const result: CallbackFields = {};\n const keys = new Set([...Object.keys(user), ...Object.keys(added)]);\n\n for (const key of keys) {\n const userCallback = userCallbacks[key];\n const addedCallback = addedCallbacks[key];\n\n if (userCallback && addedCallback) {\n result[key] = function mergedCallback(this: unknown, ...args: never[]) {\n const userResult = userCallback.apply(this, args);\n\n try {\n const addedResult = addedCallback.apply(this, args);\n if (isPromiseLike(addedResult)) {\n void addedResult.catch((error) => {\n console.warn(`Added callback ${key} failed`, error);\n });\n }\n } catch (error) {\n console.warn(`Added callback ${key} failed`, error);\n }\n\n return userResult;\n };\n continue;\n }\n\n result[key] = userCallback ?? addedCallback;\n }\n\n return result as unknown as T;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> & { catch(callback: (error: unknown) => void): unknown } {\n return Boolean(value && typeof value === \"object\" && \"catch\" in value && typeof value.catch === \"function\");\n}\n", "import type { FileSystem } from \"@poe-code/config-mutations\";\nimport { readDocument, readDocumentReadonly, writeScope } from \"./store.js\";\n\nconst SCOPE = \"models\";\nconst DEFAULT_KEY = \"default\";\n\nexport interface ModelsConfigOptions {\n fs: FileSystem;\n filePath: string;\n readOnly?: boolean;\n}\n\nexport async function loadAgentModel(\n options: ModelsConfigOptions,\n agentId: string\n): Promise<string | null> {\n const models = await readModelsScope(options);\n const value = getOwnEntry(models, agentId);\n return typeof value === \"string\" ? value : null;\n}\n\nexport async function loadDefaultModel(\n options: ModelsConfigOptions\n): Promise<string | null> {\n const models = await readModelsScope(options);\n const value = getOwnEntry(models, DEFAULT_KEY);\n return typeof value === \"string\" ? value : null;\n}\n\nexport async function resolveModel(\n options: ModelsConfigOptions,\n agentId: string\n): Promise<string | null> {\n return (await loadAgentModel(options, agentId)) ?? await loadDefaultModel(options);\n}\n\nexport async function saveAgentModel(\n options: ModelsConfigOptions,\n agentId: string,\n model: string\n): Promise<void> {\n const models = await readModelsScope(options);\n await writeScope(options.fs, options.filePath, SCOPE, {\n ...models,\n [agentId]: model\n });\n}\n\nexport async function saveDefaultModel(\n options: ModelsConfigOptions,\n model: string\n): Promise<void> {\n const models = await readModelsScope(options);\n await writeScope(options.fs, options.filePath, SCOPE, {\n ...models,\n [DEFAULT_KEY]: model\n });\n}\n\nasync function readModelsScope(\n options: ModelsConfigOptions\n): Promise<Record<string, unknown>> {\n const readConfigDocument = getOwnEntry(options as unknown as Record<string, unknown>, \"readOnly\")\n ? readDocumentReadonly\n : readDocument;\n const document = await readConfigDocument(options.fs, options.filePath);\n return getOwnRecordEntry(document, SCOPE);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnRecordEntry(record: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = getOwnEntry(record, key);\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {};\n}\n", "import type { FileSystem } from \"@poe-code/config-mutations\";\nimport { readMergedDocument } from \"./store.js\";\n\n/** Memory context budget used when memory.query.defaultBudgetTokens is unset. */\nexport const DEFAULT_QUERY_BUDGET_TOKENS = 4_096;\n\nexport interface MemoryConfigOptions {\n fs: FileSystem;\n filePath: string;\n projectFilePath?: string;\n}\n\ninterface ResolvedMemoryConfig {\n root?: string;\n ingestAgent?: string;\n ingestTimeoutMs: number;\n cacheEnabled: boolean;\n mcpWritesAllowed: boolean;\n defaultQueryBudget: number;\n}\n\nexport async function configuredMemoryRoot(\n options: MemoryConfigOptions\n): Promise<string | undefined> {\n return (await resolveMemoryConfig(options)).root;\n}\n\nexport async function resolveAgent(\n options: MemoryConfigOptions,\n fallbackAgent: string | null\n): Promise<string | null> {\n const memory = await resolveMemoryConfig(options);\n return memory.ingestAgent ?? fallbackAgent;\n}\n\nexport async function configuredTimeout(options: MemoryConfigOptions): Promise<number> {\n return (await resolveMemoryConfig(options)).ingestTimeoutMs;\n}\n\nexport async function cacheEnabled(options: MemoryConfigOptions): Promise<boolean> {\n return (await resolveMemoryConfig(options)).cacheEnabled;\n}\n\nexport async function mcpWritesAllowed(options: MemoryConfigOptions): Promise<boolean> {\n return (await resolveMemoryConfig(options)).mcpWritesAllowed;\n}\n\nexport async function defaultQueryBudget(options: MemoryConfigOptions): Promise<number> {\n return (await resolveMemoryConfig(options)).defaultQueryBudget;\n}\n\nasync function resolveMemoryConfig(\n options: MemoryConfigOptions\n): Promise<ResolvedMemoryConfig> {\n const document = await readMergedDocument(options.fs, options.filePath, options.projectFilePath);\n const memory = getOwnRecordEntry(document, \"memory\");\n const cache = readOptionalRecord(getOwnEntry(memory, \"cache\"), \"memory.cache\");\n const mcp = readOptionalRecord(getOwnEntry(memory, \"mcp\"), \"memory.mcp\");\n const query = readOptionalRecord(getOwnEntry(memory, \"query\"), \"memory.query\");\n const ingestTimeoutMs =\n readOptionalNumber(getOwnEntry(memory, \"ingestTimeoutMs\"), \"memory.ingestTimeoutMs\") ??\n 300_000;\n const defaultQueryBudget =\n readOptionalNumber(getOwnEntry(query, \"defaultBudgetTokens\"), \"memory.query.defaultBudgetTokens\") ??\n DEFAULT_QUERY_BUDGET_TOKENS;\n\n if (ingestTimeoutMs < 0) {\n throw new Error(\"memory.ingestTimeoutMs: expected a non-negative finite number.\");\n }\n if (!Number.isInteger(defaultQueryBudget) || defaultQueryBudget <= 0) {\n throw new Error(\"memory.query.defaultBudgetTokens: expected a positive integer.\");\n }\n\n return {\n root: readOptionalString(getOwnEntry(memory, \"root\"), \"memory.root\"),\n ingestAgent: readOptionalString(getOwnEntry(memory, \"ingestAgent\"), \"memory.ingestAgent\"),\n ingestTimeoutMs,\n cacheEnabled: readOptionalBoolean(getOwnEntry(cache, \"enabled\"), \"memory.cache.enabled\") ?? true,\n mcpWritesAllowed:\n readOptionalBoolean(getOwnEntry(mcp, \"allowWrites\"), \"memory.mcp.allowWrites\") ?? false,\n defaultQueryBudget\n };\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnRecordEntry(record: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = getOwnEntry(record, key);\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction readOptionalRecord(value: unknown, field: string): Record<string, unknown> {\n if (value === undefined) {\n return {};\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${field}: expected an object.`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction readOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(`${field}: expected a string.`);\n }\n return value;\n}\n\nfunction readOptionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${field}: expected a finite number.`);\n }\n return value;\n}\n\nfunction readOptionalBoolean(value: unknown, field: string): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`${field}: expected a boolean.`);\n }\n return value;\n}\n", "import path from \"node:path\";\nimport { pathExists, type FileSystem } from \"@poe-code/config-mutations\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport { assertConfigPathSafe } from \"./store.js\";\nimport type { ConfigDocument, ConfigFieldType, ScopeDefinition, ScopeSchema } from \"./types.js\";\n\nexport interface EnvOverrides {\n entries: string[];\n document: ConfigDocument;\n}\n\nexport interface EditTargetOptions {\n global?: boolean;\n project?: boolean;\n}\n\nexport function collectEnvOverrides(\n scopes: ReadonlyArray<ScopeDefinition<ScopeSchema>>,\n env: Record<string, string | undefined>\n): EnvOverrides {\n const document: ConfigDocument = {};\n const entries: string[] = [];\n\n for (const definition of scopes) {\n const scopeResult = collectScopeEnvOverrides(definition, env);\n if (Object.keys(scopeResult.values).length === 0) {\n continue;\n }\n\n defineDataProperty(document, definition.scope, scopeResult.values);\n entries.push(...scopeResult.entries);\n }\n\n return { entries, document };\n}\n\nexport async function resolveEditTarget(\n fs: FileSystem,\n configPath: string,\n projectConfigPath: string,\n options: EditTargetOptions\n): Promise<string> {\n if (options.global && options.project) {\n throw new Error(\"Choose either --global or --project, not both.\");\n }\n\n if (options.global) {\n return configPath;\n }\n if (options.project) {\n return projectConfigPath;\n }\n if (await pathExists(fs, projectConfigPath)) {\n return projectConfigPath;\n }\n return configPath;\n}\n\nexport async function initProjectConfig(\n fs: FileSystem,\n targetPath: string\n): Promise<\"created\" | \"already-exists\"> {\n await assertConfigPathSafe(fs, targetPath);\n if (await pathExists(fs, targetPath)) {\n return \"already-exists\";\n }\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await assertConfigPathSafe(fs, targetPath);\n try {\n await fs.writeFile(targetPath, EMPTY_DOCUMENT, { encoding: \"utf8\", flag: \"wx\" });\n return \"created\";\n } catch (error) {\n if (isAlreadyExists(error)) {\n return \"already-exists\";\n }\n await fs.unlink(targetPath).catch(() => undefined);\n throw error;\n }\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction collectScopeEnvOverrides<S extends ScopeSchema>(\n definition: ScopeDefinition<S>,\n env: Record<string, string | undefined>\n): {\n entries: string[];\n values: Record<string, unknown>;\n} {\n const entries: string[] = [];\n const values: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(definition.schema) as Array<\n [keyof S & string, S[keyof S & string]]\n >) {\n if (!field.env) {\n continue;\n }\n\n const value = coerceEnvValue(field.type, env[field.env]);\n if (value === undefined) {\n continue;\n }\n\n defineDataProperty(values, key, value);\n entries.push(` ${field.env} = ${String(value)}`);\n }\n\n return { entries, values };\n}\n\nfunction defineDataProperty(object: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n\nfunction coerceEnvValue(\n type: ConfigFieldType,\n raw: string | undefined\n): unknown {\n if (raw === undefined) {\n return undefined;\n }\n\n if (type === \"string\") {\n return raw;\n }\n if (type === \"number\") {\n if (raw.length === 0) {\n return undefined;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n if (type === \"json\") {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n }\n if (raw === \"true\" || raw === \"1\") {\n return true;\n }\n if (raw === \"false\" || raw === \"0\") {\n return false;\n }\n return undefined;\n}\n\nconst EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\\n`;\n", "import type { FileSystem } from \"@poe-code/config-mutations\";\nimport type { ApiShapeId } from \"@poe-code/providers\";\nimport { readDocument, readDocumentReadonly, writeScope } from \"./store.js\";\n\nexport interface ProviderConfigStoreOptions {\n fs: FileSystem;\n filePath: string;\n}\n\nexport interface LoadProviderShapeBaseUrlsOptions extends ProviderConfigStoreOptions {\n providerId: string;\n readOnly?: boolean;\n}\n\nexport interface SaveProviderShapeBaseUrlsOptions extends ProviderConfigStoreOptions {\n providerId: string;\n shapeBaseUrls: Partial<Record<ApiShapeId, string>>;\n}\n\nexport async function loadProviderShapeBaseUrls(\n options: LoadProviderShapeBaseUrlsOptions\n): Promise<Partial<Record<ApiShapeId, string>>> {\n const readConfig = options.readOnly ? readDocumentReadonly : readDocument;\n const document = await readConfig(options.fs, options.filePath);\n const providers = getOwnRecordEntry(document, providersScope);\n const providerConfig = getOwnRecordEntry(providers, options.providerId);\n if (Object.keys(providerConfig).length === 0) {\n return {};\n }\n\n return normalizeShapeBaseUrls(getOwnEntry(providerConfig, \"shapeBaseUrls\"));\n}\n\nexport async function saveProviderShapeBaseUrls(\n options: SaveProviderShapeBaseUrlsOptions\n): Promise<void> {\n const shapeBaseUrls = normalizeShapeBaseUrls(options.shapeBaseUrls);\n if (Object.keys(shapeBaseUrls).length === 0) {\n return;\n }\n\n const document = await readDocument(options.fs, options.filePath);\n const providers = getOwnRecordEntry(document, providersScope);\n const providerConfig = getOwnRecordEntry(providers, options.providerId);\n const existingShapeBaseUrls = normalizeShapeBaseUrls(\n getOwnEntry(providerConfig, \"shapeBaseUrls\")\n );\n\n await writeScope(options.fs, options.filePath, providersScope, {\n ...providers,\n [options.providerId]: {\n ...providerConfig,\n shapeBaseUrls: {\n ...existingShapeBaseUrls,\n ...shapeBaseUrls\n }\n }\n });\n}\n\nfunction normalizeShapeBaseUrls(value: unknown): Partial<Record<ApiShapeId, string>> {\n if (!isRecord(value)) {\n return {};\n }\n\n const entries: Partial<Record<ApiShapeId, string>> = {};\n for (const [shapeId, baseUrl] of Object.entries(value)) {\n if (typeof baseUrl === \"string\" && baseUrl.trim().length > 0) {\n entries[shapeId as ApiShapeId] = baseUrl.trim();\n }\n }\n return entries;\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnRecordEntry(record: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = getOwnEntry(record, key);\n return isRecord(value) ? value : {};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nconst providersScope = \"providers\";\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { allAgents, resolveAgentId, type AgentDefinition } from \"@poe-code/agent-defs\";\nimport { createTimestamp, readFileIfExists, type FileSystem } from \"@poe-code/config-mutations\";\nimport {\n allAuthProviders,\n ProviderRegistry,\n resolveApiShape,\n type ApiShapeId\n} from \"@poe-code/providers\";\nimport { hasOwnErrorCode } from \"./errors.js\";\nimport { readDocument, readMergedDocument, readMergedDocumentReadonly, writeScope } from \"./store.js\";\n\nexport interface ConfigStoreOptions {\n fs: FileSystem;\n filePath: string;\n projectFilePath?: string;\n providerRegistry?: Pick<ProviderRegistry, \"get\">;\n warn?: (message: string) => void;\n readOnly?: boolean;\n}\n\nexport interface ConfiguredServiceMetadata {\n provider: string;\n apiShape?: ApiShapeId;\n files: string[];\n model?: string;\n reasoningEffort?: string;\n baseUrl?: string;\n shapeBaseUrl?: string[];\n}\n\ninterface LegacyConfigDocument {\n apiKey?: string;\n configured_services?: Record<string, ConfiguredServiceMetadata>;\n}\n\nexport interface SaveConfiguredServiceOptions extends ConfigStoreOptions {\n service: string;\n metadata: ConfiguredServiceMetadata;\n}\n\nexport interface UnconfigureServiceOptions extends ConfigStoreOptions {\n service: string;\n}\n\nexport async function loadConfiguredServices(\n options: ConfigStoreOptions\n): Promise<Record<string, ConfiguredServiceMetadata>> {\n const { fs, filePath, projectFilePath } = options;\n if (!options.readOnly) {\n await migrateLegacyCredentialsIfNeeded(fs, filePath);\n await migrateConfiguredServiceLayers(options, [\n filePath,\n ...(projectFilePath && projectFilePath !== filePath ? [projectFilePath] : [])\n ]);\n }\n\n const readConfig = options.readOnly ? readMergedDocumentReadonly : readMergedDocument;\n const document = await readConfig(fs, filePath, projectFilePath);\n return normalizeConfiguredServices(getOwnEntry(document, configuredServicesScope));\n}\n\nexport async function saveConfiguredService(options: SaveConfiguredServiceOptions): Promise<void> {\n const { fs, filePath, service, metadata } = options;\n await migrateLegacyCredentialsIfNeeded(fs, filePath);\n await migrateConfiguredServicesIfNeeded(options, filePath);\n\n const document = await readDocument(fs, filePath);\n const services = normalizeConfiguredServices(getOwnEntry(document, configuredServicesScope));\n const registry = options.providerRegistry ?? defaultProviderRegistry;\n defineDataProperty(services, service, normalizeConfiguredServiceMetadata({\n ...metadata,\n apiShape:\n metadata.apiShape ??\n deriveApiShape({\n service,\n provider: metadata.provider,\n registry,\n warn: options.warn ?? console.warn\n })\n }));\n\n await writeScope(fs, filePath, configuredServicesScope, services);\n}\n\nexport async function unconfigureService(options: UnconfigureServiceOptions): Promise<boolean> {\n const { fs, filePath, projectFilePath, service } = options;\n await migrateLegacyCredentialsIfNeeded(fs, filePath);\n const filePaths = [\n filePath,\n ...(projectFilePath && projectFilePath !== filePath ? [projectFilePath] : [])\n ];\n await migrateConfiguredServiceLayers(options, filePaths);\n\n const removals: ConfiguredServicesRemoval[] = [];\n for (const configPath of filePaths) {\n const document = await readDocument(fs, configPath);\n const original = normalizeConfiguredServices(getOwnEntry(document, configuredServicesScope));\n if (!Object.hasOwn(original, service)) {\n continue;\n }\n\n const updated = { ...original };\n delete updated[service];\n removals.push({ filePath: configPath, original, updated });\n }\n\n if (removals.length === 0) {\n return false;\n }\n\n const committed: ConfiguredServicesRemoval[] = [];\n try {\n for (const removal of removals) {\n await writeScope(fs, removal.filePath, configuredServicesScope, removal.updated);\n committed.push(removal);\n }\n } catch (error) {\n for (const removal of committed.reverse()) {\n await writeScope(fs, removal.filePath, configuredServicesScope, removal.original).catch(() => undefined);\n }\n throw error;\n }\n\n return true;\n}\n\nasync function migrateConfiguredServicesIfNeeded(\n options: ConfigStoreOptions,\n filePath: string\n): Promise<void> {\n const migration = await prepareConfiguredServicesMigration(options, filePath);\n if (migration) {\n await writeScope(options.fs, filePath, configuredServicesScope, migration.migrated);\n }\n}\n\nasync function migrateConfiguredServiceLayers(\n options: ConfigStoreOptions,\n filePaths: string[]\n): Promise<void> {\n const migrations = (await Promise.all(\n filePaths.map((filePath) => prepareConfiguredServicesMigration(options, filePath))\n )).filter((migration) => migration !== undefined);\n const committed: ConfiguredServicesMigration[] = [];\n\n try {\n for (const migration of migrations) {\n await writeScope(options.fs, migration.filePath, configuredServicesScope, migration.migrated);\n committed.push(migration);\n }\n } catch (error) {\n for (const migration of committed.reverse()) {\n await writeScope(options.fs, migration.filePath, configuredServicesScope, migration.original).catch(() => undefined);\n }\n throw error;\n }\n}\n\ninterface ConfiguredServicesMigration {\n filePath: string;\n migrated: Record<string, unknown>;\n original: Record<string, unknown>;\n}\n\ninterface ConfiguredServicesRemoval {\n filePath: string;\n original: Record<string, ConfiguredServiceMetadata>;\n updated: Record<string, ConfiguredServiceMetadata>;\n}\n\nasync function prepareConfiguredServicesMigration(\n options: ConfigStoreOptions,\n filePath: string\n): Promise<ConfiguredServicesMigration | undefined> {\n const document = await readDocument(options.fs, filePath);\n const rawServices = getOwnEntry(document, configuredServicesScope);\n if (!isRecord(rawServices)) {\n return undefined;\n }\n\n let needsMigration = false;\n const migrated: Record<string, unknown> = {};\n const registry = options.providerRegistry ?? defaultProviderRegistry;\n\n for (const [service, entry] of Object.entries(rawServices)) {\n if (!isRecord(entry)) {\n continue;\n }\n\n const providerValue = getOwnEntry(entry, \"provider\");\n const provider = typeof providerValue === \"string\" ? providerValue : \"poe\";\n const normalizedEntry: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entry)) {\n defineDataProperty(normalizedEntry, key, value);\n }\n defineDataProperty(normalizedEntry, \"provider\", provider);\n\n if (typeof providerValue !== \"string\") {\n needsMigration = true;\n }\n\n const apiShapeValue = getOwnEntry(entry, \"apiShape\");\n if (!isApiShape(apiShapeValue)) {\n const apiShape = deriveApiShape({\n service,\n provider,\n registry,\n warn: options.warn ?? console.warn\n });\n if (apiShape) {\n defineDataProperty(normalizedEntry, \"apiShape\", apiShape);\n needsMigration = true;\n }\n }\n\n defineDataProperty(migrated, service, normalizedEntry);\n }\n\n if (needsMigration) {\n return {\n filePath,\n migrated,\n original: rawServices\n };\n }\n\n return undefined;\n}\n\nfunction deriveApiShape(input: {\n service: string;\n provider: string;\n registry: Pick<ProviderRegistry, \"get\">;\n warn: (message: string) => void;\n}): ApiShapeId | undefined {\n const provider = input.registry.get(input.provider);\n const agent = resolveConfiguredAgent(input.service);\n const apiShape = provider && agent ? resolveApiShape(provider, agent) : undefined;\n if (!apiShape) {\n input.warn(\n `Unable to derive apiShape for configured service \"${input.service}\" with provider \"${input.provider}\".`\n );\n }\n return apiShape;\n}\n\nfunction resolveConfiguredAgent(service: string): AgentDefinition | undefined {\n const agentId = resolveAgentId(service);\n return agentId ? agentsById.get(agentId) : undefined;\n}\n\nfunction normalizeConfiguredServices(value: unknown): Record<string, ConfiguredServiceMetadata> {\n if (!isRecord(value)) {\n return {};\n }\n\n const entries: Record<string, ConfiguredServiceMetadata> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (!isRecord(entry)) {\n continue;\n }\n\n const providerValue = getOwnEntry(entry, \"provider\");\n const apiShapeValue = getOwnEntry(entry, \"apiShape\");\n const filesValue = getOwnEntry(entry, \"files\");\n const modelValue = getOwnEntry(entry, \"model\");\n const reasoningEffortValue = getOwnEntry(entry, \"reasoningEffort\");\n const baseUrlValue = getOwnEntry(entry, \"baseUrl\");\n const shapeBaseUrlValue = getOwnEntry(entry, \"shapeBaseUrl\");\n\n defineDataProperty(entries, key, normalizeConfiguredServiceMetadata({\n provider: typeof providerValue === \"string\" ? providerValue : \"poe\",\n apiShape: isApiShape(apiShapeValue) ? apiShapeValue : undefined,\n files: Array.isArray(filesValue) ? filesValue : [],\n model: typeof modelValue === \"string\" ? modelValue : undefined,\n reasoningEffort: typeof reasoningEffortValue === \"string\" ? reasoningEffortValue : undefined,\n baseUrl: typeof baseUrlValue === \"string\" ? baseUrlValue : undefined,\n shapeBaseUrl: Array.isArray(shapeBaseUrlValue) ? shapeBaseUrlValue : undefined\n }));\n }\n\n return entries;\n}\n\nfunction normalizeConfiguredServiceMetadata(\n metadata: ConfiguredServiceMetadata\n): ConfiguredServiceMetadata {\n const seen = new Set<string>();\n const files: string[] = [];\n\n for (const entry of metadata.files ?? []) {\n if (typeof entry !== \"string\" || entry.length === 0) {\n continue;\n }\n if (!seen.has(entry)) {\n files.push(entry);\n seen.add(entry);\n }\n }\n\n return omitUndefined({\n provider: metadata.provider,\n apiShape: metadata.apiShape,\n files,\n model: normalizeOptionalText(metadata.model),\n reasoningEffort: normalizeOptionalText(metadata.reasoningEffort),\n baseUrl: normalizeOptionalText(metadata.baseUrl),\n shapeBaseUrl: normalizeOptionalTextList(metadata.shapeBaseUrl)\n });\n}\n\nfunction normalizeOptionalText(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeOptionalTextList(value: string[] | undefined): string[] | undefined {\n if (!value) {\n return undefined;\n }\n const normalized = value.map((entry) => entry.trim()).filter((entry) => entry.length > 0);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nasync function migrateLegacyCredentialsIfNeeded(fs: FileSystem, filePath: string): Promise<void> {\n const currentRaw = await readFileIfExists(fs, filePath);\n if (currentRaw !== null) {\n return;\n }\n\n await migrateLegacyCredentialsFile(fs, filePath);\n}\n\nasync function migrateLegacyCredentialsFile(fs: FileSystem, configPath: string): Promise<void> {\n const legacyPath = path.join(path.dirname(configPath), \"credentials.json\");\n const raw = await readFileIfExists(fs, legacyPath);\n if (raw === null) {\n return;\n }\n\n let legacyDocument: LegacyConfigDocument;\n try {\n legacyDocument = normalizeLegacyConfigDocument(JSON.parse(raw));\n } catch (error) {\n if (error instanceof SyntaxError) {\n await recoverInvalidConfig(fs, legacyPath, raw);\n await fs.unlink(legacyPath);\n return;\n }\n throw error;\n }\n\n const configuredServices = getOwnEntry(legacyDocument, \"configured_services\");\n if (isRecord(configuredServices)) {\n await writeScope(fs, configPath, configuredServicesScope, configuredServices);\n }\n\n const apiKey = getOwnEntry(legacyDocument, \"apiKey\");\n if (typeof apiKey === \"string\" && apiKey.length > 0) {\n await writeScope(fs, configPath, CORE_SCOPE, {\n apiKey\n });\n }\n\n await fs.unlink(legacyPath);\n}\n\nfunction normalizeLegacyConfigDocument(value: unknown): LegacyConfigDocument {\n if (!isRecord(value)) {\n return {};\n }\n\n const document = Object.create(null) as LegacyConfigDocument;\n const apiKey = getOwnEntry(value, \"apiKey\");\n if (typeof apiKey === \"string\" && apiKey.length > 0) {\n document.apiKey = apiKey;\n }\n\n const services = normalizeConfiguredServices(getOwnEntry(value, \"configured_services\"));\n if (Object.keys(services).length > 0) {\n document.configured_services = services;\n }\n\n return document;\n}\n\nasync function recoverInvalidConfig(\n fs: FileSystem,\n filePath: string,\n content: string\n): Promise<void> {\n await writeInvalidBackup(fs, filePath, content);\n await writeFileAtomically(fs, filePath, EMPTY_DOCUMENT);\n}\n\nfunction createInvalidBackupPath(filePath: string): string {\n const directory = path.dirname(filePath);\n const baseName = path.basename(filePath);\n return path.join(directory, `${baseName}.invalid-${createTimestamp()}.json`);\n}\n\nasync function writeInvalidBackup(fs: FileSystem, filePath: string, content: string): Promise<void> {\n const backupPath = createInvalidBackupPath(filePath);\n const backupStem = backupPath.slice(0, -\".json\".length);\n\n for (let suffix = 0; ; suffix += 1) {\n const candidate = suffix === 0 ? backupPath : `${backupStem}-${suffix}.json`;\n\n try {\n await fs.writeFile(candidate, content, { encoding: \"utf8\", flag: \"wx\" });\n return;\n } catch (error) {\n if (!isAlreadyExists(error)) {\n await fs.unlink(candidate).catch(() => undefined);\n throw error;\n }\n }\n }\n}\n\nasync function writeFileAtomically(fs: FileSystem, filePath: string, content: string): Promise<void> {\n const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n let tempCreated = false;\n\n try {\n await fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n tempCreated = true;\n await fs.rename(tempPath, filePath);\n } catch (error) {\n if (tempCreated || !isAlreadyExists(error)) {\n await fs.unlink(tempPath).catch(() => undefined);\n }\n throw error;\n }\n}\n\nfunction isAlreadyExists(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction isApiShape(value: unknown): value is ApiShapeId {\n return (\n value === \"openai-chat-completions\" ||\n value === \"openai-responses\" ||\n value === \"anthropic-messages\" ||\n value === \"google-generations\"\n );\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction defineDataProperty(object: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nconst agentsById = new Map(allAgents.map((agent) => [agent.id, agent]));\nconst defaultProviderRegistry = new ProviderRegistry(allAuthProviders);\nconst CORE_SCOPE = \"core\";\nconst configuredServicesScope = \"configured_services\";\nconst EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\\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: \"Anthropic's agentic coding tool for the terminal.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n apiShapes: [\"anthropic-messages\"],\n otelCapture: {\n env: {\n CLAUDE_CODE_ENABLE_TELEMETRY: \"1\"\n }\n },\n configPath: \"~/.claude.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.config/Claude/claude_desktop_config.json\",\n configPaths: {\n darwin: \"~/Library/Application Support/Claude/claude_desktop_config.json\",\n linux: \"~/.config/Claude/claude_desktop_config.json\",\n win32: \"~/AppData/Roaming/Claude/claude_desktop_config.json\"\n },\n capabilities: [\"mcp\"],\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: \"OpenAI's coding agent for the terminal.\",\n binaryName: \"codex\",\n apiShapes: [\"openai-responses\"],\n otelCapture: {\n args: (endpoint, content) => [\n \"-c\",\n `otel.trace_exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/traces`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/logs`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.log_user_prompt=${content}`\n ]\n },\n configPath: \"~/.codex/config.toml\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const cursorAgent: AgentDefinition = {\n id: \"cursor\",\n name: \"cursor\",\n aliases: [\"cursor-agent\"],\n label: \"Cursor\",\n summary: \"Cursor's CLI coding agent.\",\n binaryName: \"cursor-agent\",\n configPath: \"~/.cursor/mcp.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#FFFFFF\",\n light: \"#000000\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const geminiCliAgent: AgentDefinition = {\n id: \"gemini-cli\",\n name: \"gemini-cli\",\n aliases: [\"gemini\"],\n label: \"Gemini CLI\",\n summary: \"Google's open-source AI agent for the terminal.\",\n binaryName: \"gemini\",\n configPath: \"~/.gemini/settings.json\",\n apiShapes: [\"google-generations\"],\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\"],\n branding: {\n colors: {\n dark: \"#8AB4F8\",\n light: \"#1A73E8\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Open-source AI coding agent for the terminal.\",\n binaryName: \"opencode\",\n apiShapes: [\"openai-chat-completions\"],\n otelCapture: {\n env: {\n OPENCODE_CONFIG_CONTENT: '{\"experimental\":{\"openTelemetry\":true}}'\n }\n },\n configPath: \"~/.config/opencode/opencode.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\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: \"Moonshot AI's coding agent for the terminal.\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n apiShapes: [\"openai-chat-completions\"],\n configPath: \"~/.kimi/mcp.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n apiShapes: [\"openai-chat-completions\"],\n otelCapture: {},\n configPath: \"~/.config/goose/config.yaml\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const piAgent: AgentDefinition = {\n id: \"pi\",\n name: \"pi\",\n aliases: [\"pi-agent\"],\n label: \"Pi\",\n summary: \"Minimal AI coding agent for the terminal.\",\n binaryName: \"pi\",\n capabilities: [\"spawn\"],\n branding: {\n colors: {\n dark: \"#F2F2F2\",\n light: \"#242424\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n apiShapes: [\"openai-responses\", \"openai-chat-completions\"],\n configPath: \"~/.poe-code/config.json\",\n capabilities: [\"configure\"],\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n cursorAgent,\n geminiCliAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n piAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nfunction freezeAgent(agent: AgentDefinition): AgentDefinition {\n if (agent.aliases !== undefined) {\n Object.freeze(agent.aliases);\n }\n if (agent.apiShapes !== undefined) {\n Object.freeze(agent.apiShapes);\n }\n if (agent.capabilities !== undefined) {\n Object.freeze(agent.capabilities);\n }\n if (agent.otelCapture?.env !== undefined) {\n Object.freeze(agent.otelCapture.env);\n }\n if (agent.otelCapture !== undefined) {\n Object.freeze(agent.otelCapture);\n }\n Object.freeze(agent.branding.colors);\n Object.freeze(agent.branding);\n return Object.freeze(agent);\n}\n\nexport const allAgents: readonly AgentDefinition[] = Object.freeze([\n freezeAgent(claudeCodeAgent),\n freezeAgent(claudeDesktopAgent),\n freezeAgent(codexAgent),\n freezeAgent(cursorAgent),\n freezeAgent(geminiCliAgent),\n freezeAgent(openCodeAgent),\n freezeAgent(kimiAgent),\n freezeAgent(gooseAgent),\n freezeAgent(piAgent),\n freezeAgent(poeAgentAgent)\n]);\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.trim().toLowerCase());\n}\n", "import type { ApiKeyAuth, AuthProvider } from \"../types.js\";\nimport type { AuthStrategy, AuthStrategyContext } from \"./types.js\";\n\nexport interface ApiKeyLoginOptions {\n apiKey?: string;\n}\n\nfunction requireApiKeyAuth(provider: AuthProvider): ApiKeyAuth {\n if (provider.auth.kind !== \"api-key\") {\n throw new Error(\n `Provider ${provider.id} does not use api-key auth (got ${provider.auth.kind}).`\n );\n }\n return provider.auth;\n}\n\nasync function acquireApiKey(\n provider: AuthProvider,\n options: ApiKeyLoginOptions,\n context: AuthStrategyContext\n): Promise<string> {\n const auth = requireApiKeyAuth(provider);\n const candidate =\n options.apiKey ?? (await context.promptForSecret?.(auth.prompt));\n const trimmed = candidate?.trim();\n if (!trimmed) {\n throw new Error(\n `No API key available for provider \"${provider.id}\". Pass --api-key or run interactively.`\n );\n }\n return trimmed;\n}\n\nexport const apiKeyAuthStrategy: AuthStrategy<ApiKeyLoginOptions> = {\n async login(provider, options, context) {\n const apiKey = await acquireApiKey(provider, options, context);\n await context.secretStore.set(apiKey);\n return apiKey;\n },\n\n async logout(_provider, context) {\n await context.secretStore.delete();\n },\n\n async isLoggedIn(_provider, context) {\n const value = await context.secretStore.get({ readOnly: context.readOnly });\n return typeof value === \"string\" && value.trim().length > 0;\n },\n\n async resolveCredential(provider, context) {\n requireApiKeyAuth(provider);\n const value = await context.secretStore.get({ readOnly: context.readOnly });\n if (!value || value.trim().length === 0) {\n throw new Error(\n `No stored credential for provider \"${provider.id}\". Run \\`poe-code provider login ${provider.id}\\`.`\n );\n }\n return value.trim();\n }\n};\n", "import type { ApiShapeId, AuthProvider } from \"./types.js\";\n\nexport function resolveApiShape(\n provider: AuthProvider,\n agent: { apiShapes?: readonly ApiShapeId[] }\n): ApiShapeId | undefined {\n if (!provider.apiShapes || !agent.apiShapes) {\n return undefined;\n }\n for (const shapeId of agent.apiShapes) {\n if (provider.apiShapes.some((shape) => shape.id === shapeId)) {\n return shapeId;\n }\n }\n return undefined;\n}\n", "import type { ApiShapeId, AuthProvider } from \"./types.js\";\nimport type { SecretStore } from \"auth-store\";\nimport { apiKeyAuthStrategy } from \"./auth/api-key.js\";\nimport type { ApiKeyLoginOptions } from \"./auth/api-key.js\";\nimport type { PromptForSecret } from \"./auth/types.js\";\nimport { resolveApiShape } from \"./compatibility.js\";\n\nexport interface LoginContext {\n promptForSecret?: PromptForSecret;\n envVars?: Record<string, string | undefined>;\n store?: SecretStore;\n resolvePreferredLogin?: (input: {\n provider: AuthProvider;\n apiKey?: string;\n envValue?: string;\n }) => Promise<string>;\n}\n\nexport type ProviderStoreFactory = (provider: AuthProvider) => SecretStore;\n\nexport interface ProviderRegistryOptions {\n envVars?: Record<string, string | undefined>;\n}\n\nexport interface ProviderAgent {\n id: string;\n apiShapes?: readonly ApiShapeId[];\n}\n\nexport class ProviderRegistry {\n private readonly providers: readonly AuthProvider[];\n private readonly byId: ReadonlyMap<string, AuthProvider>;\n private readonly storeFactory?: ProviderStoreFactory;\n private readonly envVars: Record<string, string | undefined>;\n\n constructor(\n providers: readonly AuthProvider[],\n storeFactory?: ProviderStoreFactory,\n options?: ProviderRegistryOptions\n ) {\n const byId = new Map<string, AuthProvider>();\n const storageKeys = new Map<string, string>();\n for (const provider of providers) {\n const providerId = provider.id.trim();\n if (providerId.length === 0) {\n throw new Error(\"Provider id must not be blank.\");\n }\n if (provider.id !== providerId) {\n throw new Error(\n `Provider id must not include surrounding whitespace: ${JSON.stringify(provider.id)}`\n );\n }\n if (byId.has(providerId)) {\n throw new Error(`Duplicate provider id: ${providerId}`);\n }\n if (provider.auth.kind === \"api-key\") {\n if (storageKeys.has(provider.auth.storageKey)) {\n throw new Error(\n `Duplicate provider credential storage key: ${provider.auth.storageKey}`\n );\n }\n storageKeys.set(provider.auth.storageKey, providerId);\n }\n byId.set(providerId, provider);\n }\n this.providers = Object.freeze([...providers]);\n this.byId = byId;\n this.storeFactory = storeFactory;\n this.envVars = options?.envVars ?? {};\n }\n\n list(): readonly AuthProvider[] {\n return this.providers;\n }\n\n get(id: string): AuthProvider | undefined {\n return this.byId.get(id);\n }\n\n forAgent(agent: ProviderAgent): readonly AuthProvider[] {\n return this.providers.filter((provider) => {\n return resolveApiShape(provider, agent) !== undefined;\n });\n }\n\n async isLoggedIn(id: string, options: { readOnly?: boolean } = {}): Promise<boolean> {\n const provider = this.requireProvider(id);\n if (provider.auth.kind === \"api-key\") {\n const envValue = readOwnEnvValue(this.envVars, provider.auth.envVar);\n if (typeof envValue === \"string\" && envValue.trim().length > 0) {\n return true;\n }\n }\n const store = this.requireStore(provider);\n const credential = await store.get({ readOnly: options.readOnly });\n return typeof credential === \"string\" && credential.trim().length > 0;\n }\n\n async login(id: string, options: ApiKeyLoginOptions, context?: LoginContext): Promise<void> {\n const provider = this.requireProvider(id);\n const store = context?.store ?? this.requireStore(provider);\n if (provider.auth.kind !== \"api-key\") {\n throw new Error(`Provider \"${id}\" does not use api-key auth.`);\n }\n const auth = provider.auth;\n const envApiKey = readOwnEnvValue(context?.envVars ?? this.envVars, auth.envVar);\n const resolvedApiKey =\n options.apiKey ??\n (typeof envApiKey === \"string\" && envApiKey.trim() ? envApiKey : undefined);\n if (auth.preferredLogin && context?.resolvePreferredLogin) {\n const apiKey = normalizeRequiredCredential(provider.id, await context.resolvePreferredLogin({\n provider,\n apiKey: options.apiKey,\n envValue: typeof envApiKey === \"string\" ? envApiKey : undefined\n }));\n await store.set(apiKey);\n return;\n }\n await apiKeyAuthStrategy.login(\n provider,\n { apiKey: resolvedApiKey },\n { secretStore: store, promptForSecret: context?.promptForSecret }\n );\n }\n\n async resolveCredential(\n id: string,\n options: ApiKeyLoginOptions = {},\n context?: Pick<LoginContext, \"envVars\"> & { readOnly?: boolean }\n ): Promise<string> {\n const provider = this.requireProvider(id);\n if (provider.auth.kind !== \"api-key\") {\n throw new Error(`Provider \"${id}\" does not use api-key auth.`);\n }\n\n if (options.apiKey !== undefined) {\n return normalizeRequiredCredential(provider.id, options.apiKey);\n }\n\n const envVars = context?.envVars ?? this.envVars;\n const envApiKey = readOwnEnvValue(envVars, provider.auth.envVar);\n if (typeof envApiKey === \"string\" && envApiKey.trim().length > 0) {\n return envApiKey.trim();\n }\n\n const store = this.requireStore(provider);\n return apiKeyAuthStrategy.resolveCredential(provider, {\n secretStore: store,\n readOnly: context?.readOnly\n });\n }\n\n async logout(id: string, options: { store?: SecretStore } = {}): Promise<void> {\n const provider = this.requireProvider(id);\n const store = options.store ?? this.requireStore(provider);\n await store.delete();\n }\n\n private requireProvider(id: string): AuthProvider {\n const provider = this.byId.get(id);\n if (!provider) {\n throw new Error(`Unknown provider: \"${id}\".`);\n }\n return provider;\n }\n\n private requireStore(provider: AuthProvider): SecretStore {\n if (!this.storeFactory) {\n throw new Error(`No store factory configured for ProviderRegistry.`);\n }\n return this.storeFactory(provider);\n }\n}\n\nfunction normalizeRequiredCredential(providerId: string, value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error(`No API key available for provider \"${providerId}\".`);\n }\n return trimmed;\n}\n\nfunction readOwnEnvValue(\n envVars: Record<string, string | undefined>,\n name: string\n): string | undefined {\n return Object.prototype.hasOwnProperty.call(envVars, name) ? envVars[name] : undefined;\n}\n", "import type { ApiShapeId } from \"@poe-code/agent-defs\";\n\nexport type { ApiShapeId } from \"@poe-code/agent-defs\";\n\nexport type EnvValueSource =\n | { kind: \"literal\"; value: string }\n | { kind: \"providerCredential\"; prefix?: string }\n | { kind: \"providerBaseUrl\" }\n | { kind: \"providerField\"; path: string };\n\nexport interface ApiKeyPrompt {\n title: string;\n placeholder?: string;\n}\n\nexport interface ApiKeyAuth {\n kind: \"api-key\";\n envVar: string;\n storageKey: string;\n prompt: ApiKeyPrompt;\n preferredLogin?: \"oauth\";\n}\n\nexport interface OAuthAuth {\n kind: \"oauth\";\n}\n\nexport type AuthMethod = ApiKeyAuth | OAuthAuth;\n\nexport interface ApiShapeBinding {\n readonly id: ApiShapeId;\n readonly baseUrlPath?: string;\n readonly envBaseUrlPath?: string;\n readonly defaultBaseUrl?: string;\n}\n\nexport interface ProviderModelInput {\n readonly kind: \"freeform\";\n}\n\nexport interface AuthProvider {\n readonly id: string;\n readonly label: string;\n readonly summary?: string;\n readonly baseUrl?: string;\n readonly agentBaseUrl?: string;\n readonly baseUrlEnvVar?: string;\n readonly baseUrlEnvPath?: string;\n readonly agentBaseUrlPath?: string;\n readonly requiresBaseUrl?: boolean;\n readonly modelInput?: ProviderModelInput;\n readonly auth: AuthMethod;\n readonly apiShapes?: readonly ApiShapeBinding[];\n readonly env?: Readonly<Record<string, EnvValueSource>>;\n}\n\nexport function defineProvider(provider: AuthProvider): AuthProvider {\n if (provider.auth.kind === \"api-key\") {\n Object.freeze(provider.auth.prompt);\n }\n Object.freeze(provider.auth);\n for (const shape of provider.apiShapes ?? []) {\n Object.freeze(shape);\n }\n if (provider.apiShapes !== undefined) {\n Object.freeze(provider.apiShapes);\n }\n if (provider.modelInput !== undefined) {\n Object.freeze(provider.modelInput);\n }\n for (const source of Object.values(provider.env ?? {})) {\n Object.freeze(source);\n }\n if (provider.env !== undefined) {\n Object.freeze(provider.env);\n }\n return Object.freeze(provider);\n}\n", "import { defineProvider } from \"../types.js\";\n\nexport const POE_PROVIDER_ID = \"poe\" as const;\n\nexport const poeProvider = defineProvider({\n id: POE_PROVIDER_ID,\n label: \"Poe\",\n summary: \"Route AI coding agents through Poe's API.\",\n baseUrl: \"https://api.poe.com\",\n agentBaseUrl: \"https://api.poe.com\",\n baseUrlEnvVar: \"POE_BASE_URL\",\n baseUrlEnvPath: \"v1\",\n agentBaseUrlPath: \"\",\n auth: {\n kind: \"api-key\",\n envVar: \"POE_API_KEY\",\n storageKey: \"provider:poe\",\n prompt: { title: \"Poe API key\" },\n preferredLogin: \"oauth\"\n },\n env: {\n ANTHROPIC_API_KEY: { kind: \"providerCredential\" }\n },\n apiShapes: [\n {\n id: \"openai-chat-completions\",\n envBaseUrlPath: \"v1\"\n },\n {\n id: \"openai-responses\",\n envBaseUrlPath: \"v1\"\n },\n {\n id: \"anthropic-messages\",\n envBaseUrlPath: \"anthropic\"\n }\n ]\n});\n", "import type { AuthProvider } from \"./types.js\";\n\nexport function orderAuthProviders(providers: readonly AuthProvider[]): readonly AuthProvider[] {\n return Object.freeze([...providers].sort(compareAuthProviders));\n}\n\nfunction compareAuthProviders(left: AuthProvider, right: AuthProvider): number {\n const rankDifference = authProviderRank(left) - authProviderRank(right);\n if (rankDifference !== 0) {\n return rankDifference;\n }\n return left.id.localeCompare(right.id);\n}\n\nfunction authProviderRank(provider: AuthProvider): number {\n if (provider.auth.kind === \"api-key\" && provider.auth.preferredLogin === \"oauth\") {\n return 0;\n }\n if (provider.requiresBaseUrl === true) {\n return 2;\n }\n return 1;\n}\n", "import { defineProvider } from \"../types.js\";\n\nexport const anthropicProvider = defineProvider({\n id: \"anthropic\",\n label: \"Anthropic\",\n summary: \"Route AI coding agents through Anthropic's API.\",\n baseUrl: \"https://api.anthropic.com\",\n auth: {\n kind: \"api-key\",\n envVar: \"ANTHROPIC_API_KEY\",\n storageKey: \"provider:anthropic\",\n prompt: { title: \"Anthropic API key\" }\n },\n env: {\n ANTHROPIC_API_KEY: { kind: \"providerCredential\" }\n },\n apiShapes: [\n {\n id: \"anthropic-messages\"\n }\n ]\n});\n", "import { defineProvider } from \"../types.js\";\n\nexport const cloudflareProvider = defineProvider({\n id: \"cloudflare\",\n label: \"Cloudflare AI Gateway\",\n summary: \"Route coding agents through Cloudflare AI Gateway.\",\n baseUrlEnvVar: \"CF_AIG_BASE_URL\",\n requiresBaseUrl: true,\n modelInput: { kind: \"freeform\" },\n auth: {\n kind: \"api-key\",\n envVar: \"CF_AIG_TOKEN\",\n storageKey: \"provider:cloudflare\",\n prompt: { title: \"Cloudflare AI Gateway token\" }\n },\n env: {\n ANTHROPIC_CUSTOM_HEADERS: {\n kind: \"providerCredential\",\n prefix: \"Authorization: Bearer \"\n }\n },\n apiShapes: [\n {\n id: \"openai-chat-completions\",\n baseUrlPath: \"compat\"\n },\n {\n id: \"openai-responses\",\n baseUrlPath: \"openai\"\n },\n {\n id: \"anthropic-messages\",\n baseUrlPath: \"anthropic\"\n },\n {\n id: \"google-generations\",\n baseUrlPath: \"google-ai-studio\"\n }\n ]\n});\n", "import { defineProvider } from \"../types.js\";\n\nexport const openaiProvider = defineProvider({\n id: \"openai\",\n label: \"OpenAI\",\n summary: \"Route AI coding agents through OpenAI's API.\",\n baseUrl: \"https://api.openai.com/v1\",\n auth: {\n kind: \"api-key\",\n envVar: \"OPENAI_API_KEY\",\n storageKey: \"provider:openai\",\n prompt: { title: \"OpenAI API key\" }\n },\n apiShapes: [\n {\n id: \"openai-responses\"\n },\n {\n id: \"openai-chat-completions\"\n }\n ]\n});\n", "// Generated by packages/providers/scripts/generate-provider-registry.mjs. Do not edit manually.\nimport { orderAuthProviders } from \"../provider-order.js\";\nimport { anthropicProvider } from \"./anthropic.js\";\nimport { cloudflareProvider } from \"./cloudflare.js\";\nimport { openaiProvider } from \"./openai.js\";\nimport { poeProvider } from \"./poe.js\";\n\nexport * from \"./anthropic.js\";\nexport * from \"./cloudflare.js\";\nexport * from \"./openai.js\";\nexport * from \"./poe.js\";\n\nexport const allAuthProviders = orderAuthProviders([\n anthropicProvider,\n cloudflareProvider,\n openaiProvider,\n poeProvider\n]);\n", "import os from \"node:os\";\nimport { createJobRegistry, type JobRegistry } from \"./jobs.js\";\nimport { createTemplateRegistry, type TemplateRegistry } from \"./templates.js\";\nimport type { StateFileSystem } from \"./fs.js\";\n\nexport interface StateManager {\n templates: TemplateRegistry;\n jobs: JobRegistry;\n}\n\nexport async function loadStateManager(homeDir: string = os.homedir()): Promise<StateManager> {\n return {\n templates: createTemplateRegistry(homeDir),\n jobs: createJobRegistry(homeDir)\n };\n}\n\nexport function createStateManager(homeDir: string, fs?: StateFileSystem): StateManager {\n return {\n templates: createTemplateRegistry(homeDir, fs),\n jobs: createJobRegistry(homeDir, fs)\n };\n}\n\nexport {\n createJobRegistry,\n type JobEntry,\n type JobListFilter,\n type JobRegistry,\n type JobStatus\n} from \"./jobs.js\";\nexport {\n createTemplateRegistry,\n type TemplateBackend,\n type TemplateEntry,\n type TemplateRegistry\n} from \"./templates.js\";\nexport type { StateFileSystem } from \"./fs.js\";\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n assertPathHasNoSymbolicLinks,\n defaultStateFs,\n isNotFoundError,\n type StateFileSystem\n} from \"./fs.js\";\nimport { hasOwnErrorCode } from \"../errors.js\";\n\nexport type JobStatus = \"pending\" | \"running\" | \"exited\" | \"killed\" | \"lost\";\n\nexport interface JobEntry {\n id: string;\n env_id: string;\n env_kind: string;\n tool: string;\n argv: string[];\n cwd: string;\n started_at: string;\n status: JobStatus;\n exit_code?: number;\n exited_at?: string;\n log_file?: string;\n reattach_context?: Record<string, unknown>;\n}\n\nexport interface JobListFilter {\n env_id?: string;\n env_kind?: string;\n tool?: string;\n status?: JobStatus;\n since?: Date;\n limit?: number;\n}\n\nexport interface JobRegistry {\n get(id: string): Promise<JobEntry | null>;\n put(entry: JobEntry): Promise<void>;\n update(id: string, patch: Partial<JobEntry>): Promise<JobEntry | null>;\n /** Newest first, capped by filter.limit when provided. */\n list(filter?: JobListFilter): Promise<JobEntry[]>;\n remove(id: string): Promise<void>;\n}\n\nexport function createJobRegistry(\n homeDir: string,\n fs: StateFileSystem = defaultStateFs\n): JobRegistry {\n const jobsDir = path.join(homeDir, \".poe-code\", \"state\", \"jobs\");\n let pendingMutation: Promise<void> = Promise.resolve();\n\n function jobPath(id: string): string {\n assertSafeJobId(id);\n return path.join(jobsDir, `${id}.json`);\n }\n\n async function assertSafeJobsDir(): Promise<void> {\n await assertPathHasNoSymbolicLinks(\n fs,\n jobsDir,\n \"Refusing runtime job state access through symbolic link\"\n );\n }\n\n async function assertSafeJobPath(filePath: string): Promise<void> {\n await assertPathHasNoSymbolicLinks(\n fs,\n filePath,\n \"Refusing runtime job state access through symbolic link\"\n );\n }\n\n async function get(id: string): Promise<JobEntry | null> {\n const filePath = jobPath(id);\n await assertSafeJobPath(filePath);\n try {\n return parseJobEntry(await fs.readFile(filePath, \"utf8\"), id);\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n\n throw error;\n }\n }\n\n async function put(entry: JobEntry): Promise<void> {\n assertJobEntry(entry);\n const filePath = jobPath(entry.id);\n await mutate(async () => {\n await assertSafeJobsDir();\n await fs.mkdir(jobsDir, { recursive: true });\n await assertSafeJobsDir();\n await writeJobAtomically(filePath, entry);\n });\n }\n\n async function update(id: string, patch: Partial<JobEntry>): Promise<JobEntry | null> {\n const filePath = jobPath(id);\n return mutate(async () => {\n await assertSafeJobsDir();\n await fs.mkdir(jobsDir, { recursive: true });\n await assertSafeJobsDir();\n const current = await get(id);\n if (current === null) {\n return null;\n }\n\n const updated = {\n ...current,\n ...patch,\n id: current.id\n };\n assertJobEntry(updated);\n await writeJobAtomically(filePath, updated);\n return updated;\n });\n }\n\n async function list(filter: JobListFilter = {}): Promise<JobEntry[]> {\n await assertSafeJobsDir();\n let entries: string[];\n\n try {\n entries = await fs.readdir(jobsDir);\n } catch (error) {\n if (isNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const jobs: JobEntry[] = [];\n for (const entry of entries.sort()) {\n if (!entry.endsWith(\".json\")) {\n continue;\n }\n\n const filePath = path.join(jobsDir, entry);\n await assertSafeJobPath(filePath);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) {\n continue;\n }\n\n const job = parseJobEntry(\n await fs.readFile(filePath, \"utf8\"),\n entry.slice(0, -\".json\".length)\n );\n if (job !== null && matchesFilter(job, filter)) {\n jobs.push(job);\n }\n }\n\n jobs.sort((left, right) => startedAtTime(right) - startedAtTime(left));\n return filter.limit === undefined ? jobs : jobs.slice(0, filter.limit);\n }\n\n async function remove(id: string): Promise<void> {\n const filePath = jobPath(id);\n await mutate(async () => {\n await assertSafeJobsDir();\n try {\n await fs.stat(jobsDir);\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n\n throw error;\n }\n\n try {\n await assertSafeJobPath(filePath);\n await fs.unlink(filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n });\n }\n\n async function mutate<Result>(operation: () => Promise<Result>): Promise<Result> {\n const mutation = pendingMutation.then(operation);\n pendingMutation = mutation.then(\n () => undefined,\n () => undefined\n );\n return mutation;\n }\n\n async function writeJobAtomically(filePath: string, entry: JobEntry): Promise<void> {\n await assertSafeJobPath(filePath);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n let tempCreated = false;\n\n try {\n await assertSafeJobPath(tempPath);\n await fs.writeFile(tempPath, `${JSON.stringify(entry, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\"\n });\n tempCreated = true;\n await assertSafeJobPath(filePath);\n await fs.rename(tempPath, filePath);\n } catch (error) {\n if (tempCreated || !isAlreadyExistsError(error)) {\n await removeTempFile(tempPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async function removeTempFile(tempPath: string): Promise<void> {\n try {\n await fs.unlink(tempPath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n return {\n get,\n put,\n update,\n list,\n remove\n };\n}\n\nfunction assertSafeJobId(id: string): void {\n if (\n id.length === 0 ||\n id === \".\" ||\n id === \"..\" ||\n path.isAbsolute(id) ||\n id.includes(\"/\") ||\n id.includes(\"\\\\\") ||\n id.includes(\"\\0\")\n ) {\n throw new Error(\"Invalid job id.\");\n }\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction assertJobEntry(entry: JobEntry): void {\n if (!isJobEntry(entry)) {\n throw new Error(\"Invalid job entry.\");\n }\n}\n\nfunction matchesFilter(job: JobEntry, filter: JobListFilter): boolean {\n return (\n (filter.env_id === undefined || job.env_id === filter.env_id) &&\n (filter.env_kind === undefined || job.env_kind === filter.env_kind) &&\n (filter.tool === undefined || job.tool === filter.tool) &&\n (filter.status === undefined || job.status === filter.status) &&\n isWithinSince(job, filter.since)\n );\n}\n\nfunction isWithinSince(job: JobEntry, since: Date | undefined): boolean {\n if (since === undefined) {\n return true;\n }\n\n const startedAt = Date.parse(job.started_at);\n return !Number.isFinite(startedAt) || startedAt >= since.getTime();\n}\n\nfunction startedAtTime(job: JobEntry): number {\n const startedAt = Date.parse(job.started_at);\n return Number.isFinite(startedAt) ? startedAt : 0;\n}\n\nfunction parseJobEntry(content: string, expectedId: string): JobEntry | null {\n const parsed = JSON.parse(content) as unknown;\n if (!isJobEntry(parsed)) {\n throw new Error(\"Invalid job state file.\");\n }\n return parsed.id === expectedId ? parsed : null;\n}\n\nfunction isJobEntry(value: unknown): value is JobEntry {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.env_id === \"string\" &&\n typeof value.env_kind === \"string\" &&\n typeof value.tool === \"string\" &&\n Array.isArray(value.argv) &&\n value.argv.every((arg) => typeof arg === \"string\") &&\n typeof value.cwd === \"string\" &&\n typeof value.started_at === \"string\" &&\n isJobStatus(value.status) &&\n (value.exit_code === undefined ||\n (typeof value.exit_code === \"number\" && Number.isInteger(value.exit_code))) &&\n (value.exited_at === undefined || typeof value.exited_at === \"string\") &&\n (value.log_file === undefined || typeof value.log_file === \"string\") &&\n (value.reattach_context === undefined || isRecord(value.reattach_context))\n );\n}\n\nfunction isJobStatus(value: unknown): value is JobStatus {\n return (\n value === \"pending\" ||\n value === \"running\" ||\n value === \"exited\" ||\n value === \"killed\" ||\n value === \"lost\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport type { StateFileSystem } from \"./fs.js\";\n", "import * as nodeFs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"../errors.js\";\n\nexport interface StateFileSystem {\n mkdir(path: string, options: { recursive: true }): Promise<unknown>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string,\n options?: BufferEncoding | { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n rename(oldPath: string, newPath: string): Promise<void>;\n readdir(path: string): Promise<string[]>;\n stat(path: string): Promise<{\n isFile(): boolean;\n mtimeMs: number;\n }>;\n lstat?(path: string): Promise<{\n isSymbolicLink(): boolean;\n }>;\n unlink(path: string): Promise<void>;\n}\n\nexport const defaultStateFs = nodeFs as unknown as StateFileSystem;\n\nexport function isNotFoundError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nexport async function assertPathHasNoSymbolicLinks(\n fs: StateFileSystem,\n targetPath: string,\n message: string\n): Promise<void> {\n if (fs.lstat === undefined) {\n return;\n }\n\n const absolutePath = path.resolve(targetPath);\n const root = path.parse(absolutePath).root;\n let inspectedPath = root;\n\n for (const segment of absolutePath.slice(root.length).split(path.sep).filter(Boolean)) {\n inspectedPath = path.join(inspectedPath, segment);\n try {\n if ((await fs.lstat(inspectedPath)).isSymbolicLink()) {\n throw new Error(`${message}: ${targetPath}`);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n\n throw error;\n }\n }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n assertPathHasNoSymbolicLinks,\n defaultStateFs,\n isNotFoundError,\n type StateFileSystem\n} from \"./fs.js\";\nimport { hasOwnErrorCode } from \"../errors.js\";\n\nexport type TemplateBackend = \"docker\";\n\nexport interface TemplateEntry {\n hash: string;\n template_id?: string;\n image?: string;\n runtime_type: string;\n dockerfile_path: string;\n built_at: string;\n}\n\ntype TemplateState = Record<TemplateBackend, Record<string, TemplateEntry>>;\n\nexport interface TemplateRegistry {\n get(backend: TemplateBackend, hash: string): Promise<TemplateEntry | null>;\n put(backend: TemplateBackend, entry: TemplateEntry): Promise<void>;\n remove(backend: TemplateBackend, hash: string): Promise<void>;\n list(backend?: TemplateBackend): Promise<TemplateEntry[]>;\n}\n\nexport function createTemplateRegistry(\n homeDir: string,\n fs: StateFileSystem = defaultStateFs\n): TemplateRegistry {\n const filePath = path.join(homeDir, \".poe-code\", \"state\", \"templates.json\");\n let pendingUpdate: Promise<void> = Promise.resolve();\n\n async function readState(): Promise<TemplateState> {\n await assertSafeStateFile();\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return normalizeTemplateState(JSON.parse(raw));\n } catch (error) {\n if (isNotFoundError(error)) {\n return createEmptyState();\n }\n\n throw error;\n }\n }\n\n async function writeState(state: TemplateState): Promise<void> {\n await assertSafeStateFile();\n const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n let tempCreated = false;\n\n try {\n await assertSafeStatePath(tempPath);\n await fs.writeFile(tempPath, `${JSON.stringify(state, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\"\n });\n tempCreated = true;\n await assertSafeStateFile();\n await fs.rename(tempPath, filePath);\n } catch (error) {\n if (tempCreated || !isAlreadyExistsError(error)) {\n await fs.unlink(tempPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async function updateState(mutator: (state: TemplateState) => void): Promise<void> {\n const update = pendingUpdate.then(async () => {\n await assertSafeStateFile();\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await assertSafeStateFile();\n const state = await readState();\n mutator(state);\n await writeState(state);\n });\n pendingUpdate = update.catch(() => undefined);\n await update;\n }\n\n async function assertSafeStateFile(): Promise<void> {\n await assertSafeStatePath(filePath);\n }\n\n async function assertSafeStatePath(statePath: string): Promise<void> {\n await assertPathHasNoSymbolicLinks(\n fs,\n statePath,\n \"Refusing template state access through symbolic link\"\n );\n }\n\n async function get(backend: TemplateBackend, hash: string): Promise<TemplateEntry | null> {\n const state = await readState();\n return state[backend][hash] ?? null;\n }\n\n async function put(backend: TemplateBackend, entry: TemplateEntry): Promise<void> {\n await updateState((state) => {\n state[backend][entry.hash] = entry;\n });\n }\n\n async function remove(backend: TemplateBackend, hash: string): Promise<void> {\n await updateState((state) => {\n delete state[backend][hash];\n });\n }\n\n async function list(backend?: TemplateBackend): Promise<TemplateEntry[]> {\n const state = await readState();\n const entries = Object.values(state[backend ?? \"docker\"]);\n\n return entries.sort((left, right) => left.hash.localeCompare(right.hash));\n }\n\n return {\n get,\n put,\n remove,\n list\n };\n}\n\nfunction createEmptyState(): TemplateState {\n return {\n docker: Object.create(null) as Record<string, TemplateEntry>\n };\n}\n\nfunction normalizeTemplateState(value: unknown): TemplateState {\n if (!isRecord(value)) {\n return createEmptyState();\n }\n\n return {\n docker: normalizeTemplateEntries(value.docker)\n };\n}\n\nfunction normalizeTemplateEntries(value: unknown): Record<string, TemplateEntry> {\n if (!isRecord(value)) {\n return Object.create(null) as Record<string, TemplateEntry>;\n }\n\n const entries = Object.create(null) as Record<string, TemplateEntry>;\n for (const [hash, entry] of Object.entries(value)) {\n if (isTemplateEntry(entry) && entry.hash === hash) {\n entries[hash] = entry;\n }\n }\n return entries;\n}\n\nfunction isTemplateEntry(value: unknown): value is TemplateEntry {\n return (\n isRecord(value) &&\n typeof value.hash === \"string\" &&\n typeof value.runtime_type === \"string\" &&\n typeof value.dockerfile_path === \"string\" &&\n typeof value.built_at === \"string\" &&\n (value.template_id === undefined || typeof value.template_id === \"string\") &&\n (value.image === undefined || typeof value.image === \"string\")\n );\n}\n\nfunction isAlreadyExistsError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport type { StateFileSystem } from \"./fs.js\";\n"],
5
+ "mappings": "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",
6
+ "names": ["config", "existsSync", "path", "config", "assertValidBranches", "path", "message", "isOptionalSchema", "existsSync", "path", "randomUUID", "path", "path", "error", "path", "error", "path", "message", "error", "message", "isPlainRecord", "isRecord", "parseDocument", "path", "error", "message", "path", "defineDataProperty", "getOwnEntry", "path", "text", "active", "prompt", "number", "text", "background", "config", "revision", "symbol", "spacing", "message", "symbol", "graphemeSegmenter", "frame", "close", "process", "graphemeSegmenter", "AsyncLocalStorage", "readline", "wrapAnsi", "stringWidth", "wrapAnsi", "parseDocument", "path", "getOwnEntry", "error", "path", "path", "parseYaml", "path", "hasOwnErrorCode", "error", "error", "hasOwnErrorCode", "hasOwnErrorCode", "error", "defineDataProperty", "path", "error", "isRecord", "randomUUID", "hasOwnErrorCode", "defineDataProperty", "cloneValue", "error", "message", "getOwnRecordEntry", "path", "getOwnEntry", "isRecord", "error", "getOwnEntry", "getOwnRecordEntry", "getOwnRecordEntry", "getOwnEntry", "defaultQueryBudget", "path", "defineDataProperty", "path", "EMPTY_DOCUMENT", "error", "isAlreadyExists", "hasOwnErrorCode", "getOwnRecordEntry", "getOwnEntry", "isRecord", "randomUUID", "path", "lookup", "getOwnEntry", "defineDataProperty", "error", "isRecord", "omitUndefined", "path", "writeInvalidBackup", "writeFileAtomically", "EMPTY_DOCUMENT", "createInvalidBackupPath", "isAlreadyExists", "randomUUID", "hasOwnErrorCode", "randomUUID", "path", "path", "error", "hasOwnErrorCode", "message", "path", "path", "error", "randomUUID", "hasOwnErrorCode", "isRecord", "randomUUID", "path", "path", "error", "randomUUID", "isAlreadyExistsError", "isRecord", "hasOwnErrorCode"]
7
+ }