poe-code 3.0.198 → 3.0.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/constants.d.ts +1 -1
- package/dist/cli/constants.js +0 -1
- package/dist/cli/constants.js.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +2 -2
- package/dist/providers/claude-code.js +0 -1
- package/dist/providers/claude-code.js.map +2 -2
- package/dist/providers/codex.js +0 -1
- package/dist/providers/codex.js.map +2 -2
- package/dist/providers/goose.js +0 -1
- package/dist/providers/goose.js.map +2 -2
- package/dist/providers/kimi.js +0 -1
- package/dist/providers/kimi.js.map +2 -2
- package/dist/providers/opencode.js +0 -1
- package/dist/providers/opencode.js.map +2 -2
- package/dist/providers/poe-agent.js +4 -2
- package/dist/providers/poe-agent.js.map +2 -2
- package/package.json +1 -1
- package/packages/memory/dist/index.js +4 -1
- package/packages/memory/dist/index.js.map +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/paths.ts", "../src/resolve-root.ts", "../../poe-code-config/src/schema.ts", "../../poe-code-config/src/plan-scope.ts", "../../poe-code-config/src/store.ts", "../../config-extends/src/discover.ts", "../../config-extends/src/parse.ts", "../../config-extends/src/merge.ts", "../../config-extends/src/resolve.ts", "../../config-mutations/src/mutations/config-mutation.ts", "../../config-mutations/src/mutations/file-mutation.ts", "../../config-mutations/src/mutations/template-mutation.ts", "../../config-mutations/src/execution/apply-mutation.ts", "../../config-mutations/src/formats/json.ts", "../../config-mutations/src/formats/toml.ts", "../../config-mutations/src/formats/yaml.ts", "../../config-mutations/src/formats/index.ts", "../../config-mutations/src/execution/path-utils.ts", "../../config-mutations/src/fs-utils.ts", "../../config-mutations/src/execution/run-mutations.ts", "../../config-mutations/src/template/render.ts", "../../poe-code-config/src/memory.ts", "../../poe-code-config/src/inspect.ts", "../src/init.ts", "../src/pages.ts", "../src/frontmatter.ts", "../src/search.ts", "../src/status.ts", "../src/edit.ts", "../src/write.ts", "../src/lock.ts", "../src/reconcile.ts", "../src/confidence.ts", "../src/audit.ts", "../src/cache.ts", "../src/cache.cli.ts", "../src/ingest.ts", "../../agent-spawn/src/run-command.ts", "../../agent-spawn/src/types.ts", "../../agent-defs/src/agents/claude-code.ts", "../../agent-defs/src/agents/claude-desktop.ts", "../../agent-defs/src/agents/codex.ts", "../../agent-defs/src/agents/opencode.ts", "../../agent-defs/src/agents/kimi.ts", "../../agent-defs/src/agents/goose.ts", "../../agent-defs/src/agents/poe-agent.ts", "../../agent-defs/src/registry.ts", "../../agent-spawn/src/configs/mcp.ts", "../../agent-spawn/src/configs/claude-code.ts", "../../agent-spawn/src/configs/codex.ts", "../../agent-spawn/src/configs/opencode.ts", "../../agent-spawn/src/configs/kimi.ts", "../../agent-spawn/src/configs/goose.ts", "../../agent-spawn/src/configs/index.ts", "../../agent-spawn/src/spawn.ts", "../../agent-spawn/src/configs/resolve-config.ts", "../../agent-spawn/src/mcp-args.ts", "../../agent-spawn/src/model-utils.ts", "../../agent-spawn/src/spawn-interactive.ts", "../../design-system/src/tokens/colors.ts", "../../design-system/src/tokens/typography.ts", "../../design-system/src/components/text.ts", "../../design-system/src/internal/output-format.ts", "../../design-system/src/internal/theme-detect.ts", "../../design-system/src/components/symbols.ts", "../../design-system/src/components/logger.ts", "../../design-system/src/prompts/primitives/log.ts", "../../design-system/src/internal/strip-ansi.ts", "../../design-system/src/components/table.ts", "../../design-system/src/acp/components.ts", "../../design-system/src/acp/writer.ts", "../../design-system/src/dashboard/buffer.ts", "../../design-system/src/dashboard/terminal.ts", "../../design-system/src/prompts/index.ts", "../../design-system/src/prompts/primitives/cancel.ts", "../../design-system/src/prompts/primitives/intro.ts", "../../design-system/src/prompts/primitives/note.ts", "../../design-system/src/prompts/primitives/outro.ts", "../../design-system/src/prompts/primitives/spinner.ts", "../../design-system/src/static/spinner.ts", "../../design-system/src/static/menu.ts", "../../agent-spawn/src/autonomous.ts", "../../agent-spawn/src/acp/replay.ts", "../../poe-acp-client/src/acp-client.ts", "../../poe-acp-client/src/acp-transport.ts", "../../poe-acp-client/src/run-report.ts", "../../agent-spawn/src/acp/spawn.ts", "../../agent-spawn/src/acp/middlewares/spawn-log.ts", "../src/tokens.ts", "../../tokenfill/dist/tokenizer.js", "../../tokenfill/dist/corpus.js", "../../tokenfill/dist/tokenfill.js", "../../tiny-stdio-mcp-server/src/server.ts", "../../tiny-stdio-mcp-server/src/types.ts", "../../tiny-stdio-mcp-server/src/jsonrpc.ts", "../../tiny-stdio-mcp-server/src/content/file-type.ts", "../../tiny-stdio-mcp-server/src/content/image.ts", "../../tiny-stdio-mcp-server/src/content/audio.ts", "../../tiny-stdio-mcp-server/src/content/file.ts", "../../tiny-stdio-mcp-server/src/content/convert.ts", "../../tiny-stdio-mcp-server/src/schema.ts", "../src/mcp.ts", "../../agent-skill-config/src/configs.ts", "../../agent-skill-config/src/templates.ts", "../../agent-skill-config/src/apply.ts", "../../agent-mcp-config/src/configs.ts", "../../agent-mcp-config/src/apply.ts", "../../agent-mcp-config/src/shapes.ts", "../src/install.ts", "../src/query.ts", "../src/explain.ts", "../src/explain.cli.ts", "../src/handle.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"node:path\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport const MEMORY_INDEX_RELPATH = \"INDEX.md\";\nexport const MEMORY_LOG_RELPATH = \"LOG.md\";\nexport const MEMORY_LOCK_RELPATH = \".lock\";\nexport const MEMORY_PAGES_DIR_RELPATH = \"pages\";\nexport const MEMORY_CACHE_DIR_RELPATH = \".cache\";\nexport const MEMORY_INGEST_CACHE_DIR_RELPATH = `${MEMORY_CACHE_DIR_RELPATH}/ingest`;\n\nexport class MemoryPathError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MemoryPathError\";\n }\n}\n\nexport function resolveMemoryRoot(cwd: string): MemoryRoot {\n return path.resolve(cwd, \".poe-code\", \"memory\");\n}\n\nexport function assertSafeRelPath(input: string): string {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new MemoryPathError(\"Expected a non-empty relative path.\");\n }\n\n const slashNormalized = trimmed.replaceAll(\"\\\\\", \"/\");\n if (path.posix.isAbsolute(slashNormalized) || path.win32.isAbsolute(slashNormalized)) {\n throw new MemoryPathError(`Expected a relative path, received absolute path \"${input}\".`);\n }\n\n const normalized = path.posix.normalize(slashNormalized);\n if (normalized === \".\" || normalized.length === 0) {\n throw new MemoryPathError(\"Expected a relative path to a file or directory.\");\n }\n\n if (normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new MemoryPathError(`Relative path \"${input}\" cannot escape the memory root.`);\n }\n\n return normalized;\n}\n", "import path from \"node:path\";\nimport type { FileSystem } from \"@poe-code/config-mutations\";\nimport { configuredMemoryRoot } from \"@poe-code/poe-code-config\";\nimport { resolveMemoryRoot } from \"./paths.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport const MEMORY_ROOT_ENV_VAR = \"POE_CODE_MEMORY_ROOT\";\n\nexport interface ResolveConfiguredMemoryRootOptions {\n cwd: string;\n env: Record<string, string | undefined>;\n fs: FileSystem;\n configPath: string;\n projectConfigPath?: string;\n}\n\nexport async function resolveConfiguredMemoryRoot(\n options: ResolveConfiguredMemoryRootOptions\n): Promise<MemoryRoot> {\n const envOverride = options.env[MEMORY_ROOT_ENV_VAR]?.trim();\n if (envOverride && envOverride.length > 0) {\n return resolveAgainstCwd(options.cwd, envOverride);\n }\n\n const configOverride = (\n await configuredMemoryRoot({\n fs: options.fs,\n filePath: options.configPath,\n projectFilePath: options.projectConfigPath\n })\n )?.trim();\n if (configOverride && configOverride.length > 0) {\n return resolveAgainstCwd(options.cwd, configOverride);\n }\n\n return resolveMemoryRoot(options.cwd);\n}\n\nfunction resolveAgainstCwd(cwd: string, value: string): string {\n return path.isAbsolute(value) ? value : path.resolve(cwd, value);\n}\n", "import type { ScopeDefinition, ScopeSchema } 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", "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 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 type { ConfigDocument } from \"./types.js\";\n\nexport async function readDocument(fs: FileSystem, filePath: string): Promise<ConfigDocument> {\n const document = await readStoredDocument(fs, filePath);\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 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 const globalDocument = await readStoredDocument(fs, globalPath);\n if (!projectPath) {\n return globalDocument.data;\n }\n\n const projectDocument = await readStoredDocument(fs, projectPath);\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): Promise<{ content: string; data: ConfigDocument }> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return await parseStoredDocument(fs, filePath, raw);\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): 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 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 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 normalized[key] = entry;\n }\n }\n\n return normalized;\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\nasync function writeDocument(\n fs: FileSystem,\n filePath: string,\n document: ConfigDocument\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\"\n });\n}\n\nasync function recoverInvalidDocument(\n fs: FileSystem,\n filePath: string,\n content: string\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const backupPath = createInvalidBackupPath(filePath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n await fs.writeFile(filePath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\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\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 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 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 checkedPaths.push(filePath);\n\n try {\n return {\n content: await fs.readFile(filePath, \"utf8\"),\n filePath\n };\n } catch (error) {\n if (hasCode(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\nfunction hasCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import path from \"node:path\";\nimport matter from \"gray-matter\";\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)\n : toData(format === \"json\" ? JSON.parse(normalizedContent) : parseYaml(normalizedContent));\n const hasExtendsField = Object.hasOwn(data, \"extends\");\n const extendsValue = data.extends === true;\n\n delete data.extends;\n\n return {\n data,\n format,\n extends: extendsValue,\n hasExtendsField\n };\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\")) {\n return \"markdown\";\n }\n\n return \"yaml\";\n}\n\nfunction parseMarkdown(content: string): Record<string, unknown> {\n const document = matter(content);\n return {\n ...toData(document.data),\n prompt: document.content\n };\n}\n\nfunction toData(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n return { ...(value as Record<string, unknown>) };\n}\n\nfunction stripBom(content: string): string {\n if (!content.startsWith(\"\\uFEFF\")) {\n return content;\n }\n\n return content.slice(1);\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 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 data[key] = resolved.value;\n Object.assign(sources, resolved.sources);\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 = 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 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 buildPath(path: string[], key: string): string {\n return [...path, key].join(\".\");\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 clone[key] = cloneValue(entry);\n }\n\n return clone;\n}\n", "import path from \"node:path\";\nimport { findBase } from \"./discover.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\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 options,\n optional: !parsedDocument.extends,\n visited: new Set([documentLayer.filePath]),\n depth: 1\n })\n : undefined;\n const composedPrompt = composePromptChain(\n {\n source: documentLayer.source,\n data: parsedDocument.data\n },\n resolvedBase?.layers ?? []\n );\n const merged = mergeLayers([\n ...collectDataLayers(chain.slice(0, documentIndex)),\n {\n source: documentLayer.source,\n data: withResolvedPrompt(parsedDocument.data, composedPrompt?.prompt)\n },\n ...stripResolvedBasePrompts(resolvedBase?.layers ?? [], composedPrompt?.consumedBaseIndexes ?? new Set<number>()),\n ...collectDataLayers(chain.slice(documentIndex + 1))\n ]);\n\n if (composedPrompt !== undefined && merged.sources.prompt === documentLayer.source && composedPrompt.source !== undefined) {\n merged.sources.prompt = composedPrompt.source;\n }\n\n return {\n data: merged.data,\n sources: merged.sources,\n chain: [documentLayer.filePath, ...(resolvedBase?.chain ?? [])]\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 options,\n optional,\n visited,\n depth\n}: {\n name: string;\n baseLayers: BaseLayer[];\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 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 if (visited.has(discoveredBase.filePath)) {\n throw new Error(\n `Circular extends detected.\\nVisited files:\\n- ${[...visited, discoveredBase.filePath].join(\"\\n- \")}`\n );\n }\n\n const matchedBaseIndex = baseLayers.findIndex(\n (layer) => layer.path === path.dirname(discoveredBase.filePath)\n );\n\n if (matchedBaseIndex === -1) {\n throw new Error(`Resolved base is outside configured base paths: ${discoveredBase.filePath}`);\n }\n\n const parsedBase = parseDocument(discoveredBase.content, discoveredBase.filePath);\n const nextVisited = new Set(visited);\n nextVisited.add(discoveredBase.filePath);\n const nestedBase = parsedBase.extends\n ? await resolveBaseChain({\n name: getBaseName(discoveredBase.filePath),\n baseLayers: baseLayers.slice(matchedBaseIndex + 1),\n options,\n optional: false,\n visited: nextVisited,\n depth: depth + 1\n })\n : undefined;\n\n return {\n layers: [\n {\n source: baseLayers[matchedBaseIndex].source,\n data: parsedBase.data\n },\n ...(nestedBase?.layers ?? [])\n ],\n chain: [discoveredBase.filePath, ...(nestedBase?.chain ?? [])]\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 = 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 = 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(\n high: string | undefined,\n low: string\n): 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(\n prompt: string,\n replacement: string\n): string {\n return prompt.replace(YIELD_TOKEN, replacement);\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 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 || (autoExtend === true && !parsedDocument.hasExtendsField);\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", "import type {\n ConfigMergeMutation,\n ConfigPruneMutation,\n ConfigTransformMutation,\n ConfigObject,\n ValueResolver,\n MutationOptions\n} from \"../types.js\";\n\nexport interface MergeOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Value to merge into the config file */\n value: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\" | \"yaml\";\n /** Optional prune by prefix before merging (TOML) */\n pruneByPrefix?: Record<string, string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface PruneOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Shape to prune from the config file */\n shape: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\" | \"yaml\";\n /** Optional guard - only prune if predicate returns true */\n onlyIf?: (doc: ConfigObject, ctx: MutationOptions) => boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface TransformOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\" | \"yaml\";\n /** Transform function - receives parsed content, returns transformed content */\n transform: (\n content: ConfigObject,\n ctx: MutationOptions\n ) => { content: ConfigObject | null; changed: boolean };\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction merge(options: MergeOptions): ConfigMergeMutation {\n return {\n kind: \"configMerge\",\n target: options.target,\n value: options.value,\n format: options.format,\n pruneByPrefix: options.pruneByPrefix,\n label: options.label\n };\n}\n\nfunction prune(options: PruneOptions): ConfigPruneMutation {\n return {\n kind: \"configPrune\",\n target: options.target,\n shape: options.shape,\n format: options.format,\n onlyIf: options.onlyIf,\n label: options.label\n };\n}\n\nfunction transform(options: TransformOptions): ConfigTransformMutation {\n return {\n kind: \"configTransform\",\n target: options.target,\n format: options.format,\n transform: options.transform,\n label: options.label\n };\n}\n\nexport const configMutation = {\n merge,\n prune,\n transform\n};\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import type {\n TemplateWriteMutation,\n TemplateMergeTomlMutation,\n TemplateMergeJsonMutation,\n ConfigObject,\n ValueResolver\n} from \"../types.js\";\n\nexport interface WriteOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeTomlOptions {\n /** Target TOML file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeJsonOptions {\n /** Target JSON file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction write(options: WriteOptions): TemplateWriteMutation {\n return {\n kind: \"templateWrite\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeToml(options: MergeTomlOptions): TemplateMergeTomlMutation {\n return {\n kind: \"templateMergeToml\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeJson(options: MergeJsonOptions): TemplateMergeJsonMutation {\n return {\n kind: \"templateMergeJson\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nexport const templateMutation = {\n write,\n mergeToml,\n mergeJson\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\nimport { yamlFormat } from \"./yaml.js\";\n\nexport type FormatName = \"json\" | \"toml\" | \"yaml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat,\n yaml: yamlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\nexport { yamlFormat } from \"./yaml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import type { FileSystem } from \"@poe-code/config-mutations\";\nimport { readMergedDocument } from \"./store.js\";\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 = asRecord(document.memory);\n const cache = asRecord(memory?.cache);\n const mcp = asRecord(memory?.mcp);\n const query = asRecord(memory?.query);\n\n return {\n root: readString(memory?.root),\n ingestAgent: readString(memory?.ingestAgent),\n ingestTimeoutMs: readNumber(memory?.ingestTimeoutMs) ?? 300_000,\n cacheEnabled: readBoolean(cache?.enabled) ?? true,\n mcpWritesAllowed: readBoolean(mcp?.allowWrites) ?? false,\n defaultQueryBudget: readNumber(query?.defaultBudgetTokens) ?? 4_096\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n", "import path from \"node:path\";\nimport { pathExists, type FileSystem } from \"@poe-code/config-mutations\";\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 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 if (await pathExists(fs, targetPath)) {\n return \"already-exists\";\n }\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\n return \"created\";\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 values[key] = value;\n entries.push(` ${field.env} = ${String(value)}`);\n }\n\n return { entries, values };\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.isNaN(parsed) ? undefined : parsed;\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 * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n MEMORY_INDEX_RELPATH,\n MEMORY_LOG_RELPATH,\n MEMORY_PAGES_DIR_RELPATH\n} from \"./paths.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport async function initMemory(root: MemoryRoot): Promise<void> {\n await fs.mkdir(path.join(root, MEMORY_PAGES_DIR_RELPATH), { recursive: true });\n await writeFileIfMissing(path.join(root, MEMORY_INDEX_RELPATH), \"# Memory index\\n\");\n await writeFileIfMissing(path.join(root, MEMORY_LOG_RELPATH), \"\");\n}\n\nasync function writeFileIfMissing(filePath: string, content: string): Promise<void> {\n try {\n await fs.writeFile(filePath, content, { encoding: \"utf8\", flag: \"wx\" });\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport {\n assertSafeRelPath,\n MEMORY_CACHE_DIR_RELPATH,\n MEMORY_LOCK_RELPATH,\n MEMORY_PAGES_DIR_RELPATH\n} from \"./paths.js\";\nimport type { MemoryPage, MemoryRoot } from \"./types.js\";\n\nexport async function listPages(root: MemoryRoot): Promise<MemoryPage[]> {\n const relPaths = await collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH);\n const pages = await Promise.all(relPaths.map(async (relPath) => readPage(root, relPath)));\n return pages.sort((left, right) => left.relPath.localeCompare(right.relPath));\n}\n\nexport async function readPage(root: MemoryRoot, relPath: string): Promise<MemoryPage> {\n const normalizedRelPath = assertMarkdownRelPath(relPath);\n const absPath = path.join(root, normalizedRelPath);\n const [content, stat] = await Promise.all([fs.readFile(absPath, \"utf8\"), fs.stat(absPath)]);\n\n try {\n const parsed = parseFrontmatter(content);\n return {\n relPath: normalizedRelPath,\n frontmatter: parsed.frontmatter,\n body: parsed.body,\n bytes: Buffer.byteLength(content),\n mtimeMs: stat.mtimeMs\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to parse frontmatter for \"${normalizedRelPath}\": ${message}`);\n return {\n relPath: normalizedRelPath,\n frontmatter: {},\n body: content,\n bytes: Buffer.byteLength(content),\n mtimeMs: stat.mtimeMs\n };\n }\n}\n\nexport async function collectMarkdownRelPaths(\n root: MemoryRoot,\n startRelPath = \"\"\n): Promise<string[]> {\n const relPaths: string[] = [];\n await collectMarkdownRelPathsInto(root, startRelPath, relPaths);\n return relPaths.sort((left, right) => left.localeCompare(right));\n}\n\nasync function collectMarkdownRelPathsInto(\n root: MemoryRoot,\n currentRelPath: string,\n relPaths: string[]\n): Promise<void> {\n const absPath = path.join(root, currentRelPath);\n\n let entryNames: string[];\n try {\n entryNames = await fs.readdir(absPath);\n } catch (error) {\n if (isMissing(error)) {\n return;\n }\n\n throw error;\n }\n\n for (const entryName of entryNames.sort((left, right) => left.localeCompare(right))) {\n const entryRelPath =\n currentRelPath.length === 0 ? entryName : path.posix.join(currentRelPath, entryName);\n const entryAbsPath = path.join(root, entryRelPath);\n const entryStat = await fs.stat(entryAbsPath);\n\n if (entryStat.isDirectory()) {\n if (entryName === MEMORY_CACHE_DIR_RELPATH) {\n continue;\n }\n\n await collectMarkdownRelPathsInto(root, entryRelPath, relPaths);\n continue;\n }\n\n if (!entryStat.isFile()) {\n continue;\n }\n\n if (!isMarkdownPath(entryRelPath)) {\n if (entryName === MEMORY_LOCK_RELPATH) {\n continue;\n }\n\n console.warn(`Skipping non-markdown memory file \"${entryRelPath}\".`);\n continue;\n }\n\n relPaths.push(entryRelPath);\n }\n}\n\nfunction assertMarkdownRelPath(relPath: string): string {\n const normalizedRelPath = assertSafeRelPath(relPath);\n if (!isMarkdownPath(normalizedRelPath)) {\n throw new Error(`Expected a markdown path, received \"${relPath}\".`);\n }\n\n return normalizedRelPath;\n}\n\nfunction isMarkdownPath(relPath: string): boolean {\n return path.posix.extname(relPath).toLowerCase() === \".md\";\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n", "import { parse, stringify } from \"yaml\";\nimport type { PageFrontmatter, SourceRef } from \"./types.js\";\n\nexport interface ParsedFrontmatter {\n frontmatter: PageFrontmatter;\n body: string;\n}\n\nexport function parseFrontmatter(markdown: string): ParsedFrontmatter {\n const content = markdown.startsWith(\"\\uFEFF\") ? markdown.slice(1) : markdown;\n const openingLineBreak = readOpeningLineBreak(content);\n if (openingLineBreak === undefined) {\n return {\n frontmatter: {},\n body: markdown\n };\n }\n\n const frontmatterStart = 3 + openingLineBreak.length;\n const closingFenceIndex = findClosingFence(content, frontmatterStart);\n const yamlBlock = content.slice(frontmatterStart, closingFenceIndex);\n const bodyStart = closingFenceIndex + 4;\n\n return {\n frontmatter: parsePageFrontmatter(parseYamlFrontmatter(yamlBlock)),\n body: readBody(content, bodyStart)\n };\n}\n\nexport function serializeFrontmatter(frontmatter: PageFrontmatter, body: string): string {\n const serialized = {\n ...(frontmatter.name === undefined ? {} : { name: frontmatter.name }),\n ...(frontmatter.description === undefined ? {} : { description: frontmatter.description }),\n ...(frontmatter.lastTouchedAt === undefined\n ? {}\n : { last_touched_at: frontmatter.lastTouchedAt }),\n ...(frontmatter.sources === undefined || frontmatter.sources.length === 0\n ? {}\n : { sources: frontmatter.sources.map((source) => serializeSourceRef(source)) })\n };\n\n if (Object.keys(serialized).length === 0) {\n return body;\n }\n\n return `---\\n${stringify(serialized).trimEnd()}\\n---\\n${body}`;\n}\n\nexport function parseSourceRef(serialized: string): SourceRef {\n const [rawPath, rawAnchor] = serialized.split(\"#\", 2);\n const normalizedPath = rawPath?.trim();\n if (normalizedPath === undefined || normalizedPath.length === 0) {\n throw new Error(`Invalid source ref \"${serialized}\".`);\n }\n\n if (rawAnchor === undefined) {\n return { path: normalizedPath };\n }\n\n const singleLineMatch = /^L(\\d+)$/.exec(rawAnchor);\n if (singleLineMatch !== null) {\n const startLine = Number.parseInt(singleLineMatch[1], 10);\n assertValidLineNumber(startLine, serialized);\n return {\n path: normalizedPath,\n startLine\n };\n }\n\n const rangeMatch = /^L(\\d+)-L?(\\d+)$/.exec(rawAnchor);\n if (rangeMatch !== null) {\n const startLine = Number.parseInt(rangeMatch[1], 10);\n const endLine = Number.parseInt(rangeMatch[2], 10);\n assertValidLineNumber(startLine, serialized);\n assertValidLineNumber(endLine, serialized);\n if (endLine < startLine) {\n throw new Error(`Invalid source ref \"${serialized}\": line range is reversed.`);\n }\n\n return {\n path: normalizedPath,\n startLine,\n endLine\n };\n }\n\n throw new Error(`Invalid source ref \"${serialized}\".`);\n}\n\nexport function serializeSourceRef(source: SourceRef): string {\n if (source.path.trim().length === 0) {\n throw new Error(\"Source path cannot be empty.\");\n }\n\n if (source.startLine === undefined) {\n if (source.endLine !== undefined) {\n throw new Error(\"Source endLine requires startLine.\");\n }\n\n return source.path;\n }\n\n assertValidLineNumber(source.startLine, source.path);\n if (source.endLine === undefined) {\n return `${source.path}#L${source.startLine}`;\n }\n\n assertValidLineNumber(source.endLine, source.path);\n if (source.endLine < source.startLine) {\n throw new Error(`Invalid source ref \"${source.path}\": line range is reversed.`);\n }\n\n return `${source.path}#L${source.startLine}-L${source.endLine}`;\n}\n\nfunction readOpeningLineBreak(markdown: string): \"\\n\" | \"\\r\\n\" | undefined {\n if (!markdown.startsWith(\"---\")) {\n return undefined;\n }\n\n const nextCharacter = markdown[3];\n if (nextCharacter === \"\\n\") {\n return \"\\n\";\n }\n\n if (nextCharacter === \"\\r\" && markdown[4] === \"\\n\") {\n return \"\\r\\n\";\n }\n\n return nextCharacter === undefined ? \"\\n\" : undefined;\n}\n\nfunction findClosingFence(markdown: string, searchFrom: number): number {\n let currentIndex = searchFrom - 1;\n\n while (currentIndex < markdown.length) {\n const candidateIndex = markdown.indexOf(\"\\n---\", currentIndex);\n if (candidateIndex === -1) {\n throw new Error(\"Missing YAML frontmatter end delimiter (---).\");\n }\n\n const fenceEnd = candidateIndex + 4;\n const nextCharacter = markdown[fenceEnd];\n if (nextCharacter === \"\\n\" || nextCharacter === undefined) {\n return candidateIndex;\n }\n\n if (nextCharacter === \"\\r\" && markdown[fenceEnd + 1] === \"\\n\") {\n return candidateIndex;\n }\n\n currentIndex = fenceEnd;\n }\n\n throw new Error(\"Missing YAML frontmatter end delimiter (---).\");\n}\n\nfunction readBody(markdown: string, bodyStart: number): string {\n const nextCharacter = markdown[bodyStart];\n if (nextCharacter === \"\\n\") {\n return markdown.slice(bodyStart + 1);\n }\n\n if (nextCharacter === \"\\r\" && markdown[bodyStart + 1] === \"\\n\") {\n return markdown.slice(bodyStart + 2);\n }\n\n return markdown.slice(bodyStart);\n}\n\nfunction parseYamlFrontmatter(yamlBlock: string): Record<string, unknown> {\n const normalizedYamlBlock = yamlBlock.includes(\"\\r\")\n ? yamlBlock.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\")\n : yamlBlock;\n\n let parsed: unknown;\n try {\n parsed = parse(normalizedYamlBlock);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error\";\n throw new Error(`Invalid YAML frontmatter: ${message}`);\n }\n\n if (parsed === null) {\n return {};\n }\n\n if (!isRecord(parsed)) {\n throw new Error(\"YAML frontmatter must parse to an object.\");\n }\n\n return parsed;\n}\n\nfunction parsePageFrontmatter(value: Record<string, unknown>): PageFrontmatter {\n const name = readOptionalString(value.name, \"name\");\n const description = readOptionalString(value.description, \"description\");\n const lastTouchedAt = readOptionalString(\n value.last_touched_at ?? value.lastTouchedAt,\n \"last_touched_at\"\n );\n const sources = parseSources(value.sources);\n\n return {\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(lastTouchedAt === undefined ? {} : { lastTouchedAt }),\n ...(sources === undefined ? {} : { sources })\n };\n}\n\nfunction parseSources(value: unknown): SourceRef[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n throw new Error('Invalid \"sources\" frontmatter. Expected an array.');\n }\n\n return value.map((item) => {\n if (typeof item === \"string\") {\n return parseSourceRef(item);\n }\n\n if (!isRecord(item)) {\n throw new Error('Invalid \"sources\" frontmatter. Expected each source to be a string or object.');\n }\n\n const path = readRequiredString(item.path, \"sources[].path\");\n const startLine = readOptionalPositiveInteger(item.startLine, \"sources[].startLine\");\n const endLine = readOptionalPositiveInteger(item.endLine, \"sources[].endLine\");\n return parseSourceRef(serializeSourceRef({ path, ...(startLine === undefined ? {} : { startLine }), ...(endLine === undefined ? {} : { endLine }) }));\n });\n}\n\nfunction readOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`Invalid \"${field}\" frontmatter. Expected a string.`);\n }\n\n return value;\n}\n\nfunction readRequiredString(value: unknown, field: string): string {\n const parsed = readOptionalString(value, field);\n if (parsed === undefined) {\n throw new Error(`Invalid \"${field}\" frontmatter. Expected a string.`);\n }\n\n return parsed;\n}\n\nfunction readOptionalPositiveInteger(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isInteger(value) || value <= 0) {\n throw new Error(`Invalid \"${field}\" frontmatter. Expected a positive integer.`);\n }\n\n return value;\n}\n\nfunction assertValidLineNumber(line: number, value: string): void {\n if (!Number.isInteger(line) || line <= 0) {\n throw new Error(`Invalid source ref \"${value}\": line numbers must be positive integers.`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collectMarkdownRelPaths } from \"./pages.js\";\nimport type { MemoryRoot, SearchHit } from \"./types.js\";\n\nexport async function searchMemory(root: MemoryRoot, query: string): Promise<SearchHit[]> {\n const normalizedQuery = query.trim();\n if (normalizedQuery.length === 0) {\n throw new Error(\"Search query cannot be empty.\");\n }\n\n const relPaths = await collectMarkdownRelPaths(root);\n const hits: SearchHit[] = [];\n\n for (const relPath of relPaths) {\n const content = await fs.readFile(path.join(root, relPath), \"utf8\");\n if (content.length === 0) {\n continue;\n }\n\n const lines = content.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\");\n for (const [index, line] of lines.entries()) {\n if (!line.includes(normalizedQuery)) {\n continue;\n }\n\n hits.push({\n relPath,\n lineNumber: index + 1,\n line\n });\n }\n }\n\n return hits;\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MEMORY_PAGES_DIR_RELPATH } from \"./paths.js\";\nimport { collectMarkdownRelPaths } from \"./pages.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport async function statusOf(root: MemoryRoot): Promise<{\n pageCount: number;\n totalBytes: number;\n lastWriteAt: string | null;\n initialized: boolean;\n}> {\n if (!(await pathExists(root))) {\n return {\n pageCount: 0,\n totalBytes: 0,\n lastWriteAt: null,\n initialized: false\n };\n }\n\n const [pageRelPaths, markdownRelPaths] = await Promise.all([\n collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH),\n collectMarkdownRelPaths(root)\n ]);\n\n let totalBytes = 0;\n let lastWriteAtMs = Number.NEGATIVE_INFINITY;\n\n for (const relPath of markdownRelPaths) {\n const stat = await fs.stat(path.join(root, relPath));\n totalBytes += stat.size;\n lastWriteAtMs = Math.max(lastWriteAtMs, stat.mtimeMs);\n }\n\n return {\n pageCount: pageRelPaths.length,\n totalBytes,\n lastWriteAt: Number.isFinite(lastWriteAtMs) ? new Date(lastWriteAtMs).toISOString() : null,\n initialized: true\n };\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport type { MemoryDiff, MemoryRoot, PageFrontmatter } from \"./types.js\";\nimport { writePage } from \"./write.js\";\n\nexport type EditPageOptions = {\n reason: string;\n launchEditor: (filePath: string) => Promise<void>;\n};\n\nexport type EditPageResult = {\n changed: boolean;\n diff?: MemoryDiff;\n};\n\nexport async function editPage(\n root: MemoryRoot,\n relPath: string,\n opts: EditPageOptions\n): Promise<EditPageResult> {\n const pagePath = path.join(root, relPath);\n const original = await readIfPresent(pagePath);\n const tempRoot = path.join(root, \".tmp\");\n await fs.mkdir(tempRoot, { recursive: true });\n const tempDir = await fs.mkdtemp(path.join(tempRoot, \"poe-code-memory-edit-\"));\n const tempPath = path.join(tempDir, path.basename(relPath));\n\n try {\n await fs.writeFile(tempPath, original ?? \"\", \"utf8\");\n await opts.launchEditor(tempPath);\n const edited = await fs.readFile(tempPath, \"utf8\");\n\n if (edited === (original ?? \"\")) {\n return { changed: false };\n }\n\n const parsed = parseFrontmatter(edited);\n const diff = await writePage(root, relPath, parsed.body, {\n frontmatter: parsed.frontmatter as PageFrontmatter,\n reason: opts.reason\n });\n\n return {\n changed: true,\n diff\n };\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\nasync function readIfPresent(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseFrontmatter, serializeFrontmatter } from \"./frontmatter.js\";\nimport { initMemory } from \"./init.js\";\nimport { withLock } from \"./lock.js\";\nimport { assertSafeRelPath, MEMORY_LOCK_RELPATH, MEMORY_PAGES_DIR_RELPATH } from \"./paths.js\";\nimport { reconcile, snapshot } from \"./reconcile.js\";\nimport type { MemoryDiff, MemoryRoot, PageFrontmatter } from \"./types.js\";\n\nexport async function writePage(\n root: MemoryRoot,\n relPath: string,\n body: string,\n opts: { frontmatter?: PageFrontmatter; reason: string }\n): Promise<MemoryDiff> {\n const pageRelPath = assertPageRelPath(relPath);\n\n return withLock(root, async () => {\n const before = await snapshot(root);\n await fs.mkdir(path.dirname(path.join(root, pageRelPath)), { recursive: true });\n await fs.writeFile(\n path.join(root, pageRelPath),\n serializeFrontmatter(opts.frontmatter ?? {}, body),\n \"utf8\"\n );\n return reconcile(root, before, \"update\", opts.reason);\n });\n}\n\nexport async function appendToPage(\n root: MemoryRoot,\n relPath: string,\n content: string,\n opts: { reason: string }\n): Promise<MemoryDiff> {\n const pageRelPath = assertPageRelPath(relPath);\n\n return withLock(root, async () => {\n const before = await snapshot(root);\n const pagePath = path.join(root, pageRelPath);\n await fs.mkdir(path.dirname(pagePath), { recursive: true });\n\n const existing = await readMarkdownIfPresent(pagePath);\n const parsed = existing === undefined ? { frontmatter: {}, body: \"\" } : parseFrontmatter(existing);\n\n await fs.writeFile(\n pagePath,\n serializeFrontmatter(parsed.frontmatter, `${parsed.body}${content}`),\n \"utf8\"\n );\n\n return reconcile(root, before, \"update\", opts.reason);\n });\n}\n\nexport async function clearMemory(root: MemoryRoot): Promise<void> {\n await withLock(root, async () => {\n await removeChildren(root);\n await initMemory(root);\n });\n}\n\nasync function removeChildren(directoryPath: string): Promise<void> {\n for (const entryName of await fs.readdir(directoryPath)) {\n if (entryName === MEMORY_LOCK_RELPATH) {\n continue;\n }\n\n const entryPath = path.join(directoryPath, entryName);\n const stat = await fs.stat(entryPath);\n\n if (stat.isDirectory()) {\n await removeDirectory(entryPath);\n continue;\n }\n\n if (stat.isFile()) {\n await fs.unlink(entryPath);\n }\n }\n}\n\nasync function removeDirectory(directoryPath: string): Promise<void> {\n await removeChildren(directoryPath);\n await fs.rmdir(directoryPath);\n}\n\nfunction assertPageRelPath(relPath: string): string {\n const normalizedRelPath = assertSafeRelPath(relPath);\n if (\n !normalizedRelPath.startsWith(`${MEMORY_PAGES_DIR_RELPATH}/`) ||\n path.posix.extname(normalizedRelPath).toLowerCase() !== \".md\"\n ) {\n throw new Error(`Expected a markdown page path under \"${MEMORY_PAGES_DIR_RELPATH}/\".`);\n }\n\n return normalizedRelPath;\n}\n\nasync function readMarkdownIfPresent(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MEMORY_LOCK_RELPATH } from \"./paths.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\ninterface LockFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n unlink(path: string): Promise<void>;\n writeFile(\n path: string,\n data: string,\n options?: {\n encoding?: BufferEncoding;\n flag?: string;\n }\n ): Promise<void>;\n}\n\nexport interface LockOptions {\n fs?: LockFileSystem;\n isPidRunning?: (pid: number) => boolean;\n maxTimeoutMs?: number;\n minTimeoutMs?: number;\n pid?: number;\n retries?: number;\n}\n\nfunction createDefaultFs(): LockFileSystem {\n return {\n readFile: (filePath, encoding) => fsPromises.readFile(filePath, encoding),\n unlink: fsPromises.unlink,\n writeFile: (filePath, data, options) => fsPromises.writeFile(filePath, data, options)\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction lockDelay(attempt: number, minTimeoutMs: number, maxTimeoutMs: number): number {\n return Math.min(maxTimeoutMs, minTimeoutMs * Math.pow(2, attempt));\n}\n\nfunction parsePid(input: string): number | undefined {\n const value = input.trim();\n if (value.length === 0) {\n return undefined;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return undefined;\n }\n }\n\n const pid = Number.parseInt(value, 10);\n return Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;\n}\n\nfunction isPidRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !hasErrorCode(error, \"ESRCH\");\n }\n}\n\nasync function removeLockFile(fs: LockFileSystem, lockPath: string): Promise<void> {\n try {\n await fs.unlink(lockPath);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n}\n\nasync function readLockPid(fs: LockFileSystem, lockPath: string): Promise<number | undefined | null> {\n try {\n return parsePid(await fs.readFile(lockPath, \"utf8\"));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return null;\n }\n\n throw error;\n }\n}\n\nexport async function withLock<TResult>(\n root: MemoryRoot,\n run: () => Promise<TResult> | TResult,\n options: LockOptions = {}\n): Promise<TResult> {\n const fs = options.fs ?? createDefaultFs();\n const lockPath = path.join(root, MEMORY_LOCK_RELPATH);\n const pid = options.pid ?? process.pid;\n const retries = options.retries ?? 20;\n const minTimeoutMs = options.minTimeoutMs ?? 25;\n const maxTimeoutMs = options.maxTimeoutMs ?? 250;\n const pidIsRunning = options.isPidRunning ?? isPidRunning;\n\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n await fs.writeFile(lockPath, `${pid}\\n`, { encoding: \"utf8\", flag: \"wx\" });\n\n try {\n return await run();\n } finally {\n await removeLockFile(fs, lockPath);\n }\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n\n const existingPid = await readLockPid(fs, lockPath);\n if (existingPid === null) {\n continue;\n }\n\n if (existingPid === undefined || !pidIsRunning(existingPid)) {\n await removeLockFile(fs, lockPath);\n continue;\n }\n\n if (attempt < retries) {\n await sleep(lockDelay(attempt, minTimeoutMs, maxTimeoutMs));\n }\n }\n\n throw new Error(`Failed to acquire memory lock at \"${lockPath}\".`);\n}\n", "import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseClaims } from \"./confidence.js\";\nimport { parseFrontmatter, serializeFrontmatter, serializeSourceRef } from \"./frontmatter.js\";\nimport { initMemory } from \"./init.js\";\nimport { collectMarkdownRelPaths, listPages } from \"./pages.js\";\nimport { MEMORY_INDEX_RELPATH, MEMORY_LOG_RELPATH, MEMORY_PAGES_DIR_RELPATH } from \"./paths.js\";\nimport type {\n LogVerb,\n MemoryDiff,\n MemoryRoot,\n MemorySnapshot,\n PageFrontmatter,\n SourceRef\n} from \"./types.js\";\n\nexport async function snapshot(root: MemoryRoot): Promise<MemorySnapshot> {\n const pages = Object.fromEntries(\n await Promise.all(\n (await collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH)).map(async (relPath) => [\n relPath,\n hashContent(await fs.readFile(path.join(root, relPath), \"utf8\"))\n ])\n )\n );\n\n return { pages };\n}\n\nexport async function reconcile(\n root: MemoryRoot,\n before: MemorySnapshot,\n _verb: LogVerb,\n detail: string\n): Promise<MemoryDiff> {\n await initMemory(root);\n\n const timestamp = new Date().toISOString();\n const currentPages = await Promise.all(\n (await collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH)).map(async (relPath) => {\n const absPath = path.join(root, relPath);\n const markdown = await fs.readFile(absPath, \"utf8\");\n const parsed = parsePageMarkdown(relPath, markdown);\n const normalizedFrontmatter = withDenormalizedSources(parsed.frontmatter, parsed.body);\n const normalizedMarkdown = serializeFrontmatter(normalizedFrontmatter, parsed.body);\n const changed = before.pages[relPath] !== hashContent(normalizedMarkdown);\n const nextMarkdown = changed\n ? serializeFrontmatter(\n {\n ...normalizedFrontmatter,\n lastTouchedAt: timestamp\n },\n parsed.body\n )\n : normalizedMarkdown;\n\n return {\n relPath,\n changed,\n currentMarkdown: markdown,\n nextMarkdown\n };\n })\n );\n\n await Promise.all(\n currentPages\n .filter((page) => page.currentMarkdown !== page.nextMarkdown)\n .map((page) => fs.writeFile(path.join(root, page.relPath), page.nextMarkdown, \"utf8\"))\n );\n\n const diff = diffSnapshots(before, await snapshot(root));\n await writeIndex(root);\n await appendLogEntries(root, diff, detail, timestamp);\n return diff;\n}\n\nexport function renderIndex(entries: Array<{ relPath: string; description: string }>): string {\n if (entries.length === 0) {\n return \"# Memory index\\n\";\n }\n\n return [\n \"# Memory index\",\n \"\",\n ...entries.map(({ relPath, description }) => {\n const pageName = relPath.slice(`${MEMORY_PAGES_DIR_RELPATH}/`.length).replace(/\\.md$/i, \"\");\n\n return description.length === 0\n ? `- [${pageName}](${relPath})`\n : `- [${pageName}](${relPath}) \u2014 ${description}`;\n }),\n \"\"\n ].join(\"\\n\");\n}\n\nexport async function appendLogEntries(\n root: MemoryRoot,\n diff: MemoryDiff,\n detail: string,\n timestamp = new Date().toISOString()\n): Promise<void> {\n const entries = [\n ...diff.updated.map((relPath) => formatLogLine(timestamp, \"update\", relPath, detail)),\n ...diff.deleted.map((relPath) => formatLogLine(timestamp, \"delete\", relPath, detail)),\n ...diff.created.map((relPath) => formatLogLine(timestamp, \"create\", relPath, detail))\n ];\n\n if (entries.length === 0) {\n return;\n }\n\n const logPath = path.join(root, MEMORY_LOG_RELPATH);\n const existing = await fs.readFile(logPath, \"utf8\");\n const separator = existing.length === 0 || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await fs.writeFile(logPath, `${existing}${separator}${entries.join(\"\\n\")}\\n`, \"utf8\");\n}\n\nexport function denormalizeSources(markdown: string): SourceRef[] {\n const seen = new Map<string, SourceRef>();\n\n for (const claim of parseClaims(parsePageMarkdown(\"inline-memory-page\", markdown).body)) {\n const source = \"source\" in claim.tag ? claim.tag.source : undefined;\n if (source === undefined) {\n continue;\n }\n\n seen.set(serializeSourceRef(source), source);\n }\n\n return Array.from(seen.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, source]) => source);\n}\n\nasync function writeIndex(root: MemoryRoot): Promise<void> {\n const index = renderIndex(\n (await listPages(root)).map((page) => ({\n relPath: page.relPath,\n description: page.frontmatter.description ?? \"\"\n }))\n );\n\n await fs.writeFile(path.join(root, MEMORY_INDEX_RELPATH), index, \"utf8\");\n}\n\nfunction parsePageMarkdown(\n relPath: string,\n markdown: string\n): {\n frontmatter: PageFrontmatter;\n body: string;\n} {\n try {\n return parseFrontmatter(markdown);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to parse frontmatter for \"${relPath}\": ${message}`);\n return {\n frontmatter: {},\n body: markdown\n };\n }\n}\n\nfunction withDenormalizedSources(frontmatter: PageFrontmatter, body: string): PageFrontmatter {\n const sources = denormalizeSources(body);\n return {\n ...frontmatter,\n ...(sources.length === 0 ? { sources: undefined } : { sources })\n };\n}\n\nfunction diffSnapshots(before: MemorySnapshot, after: MemorySnapshot): MemoryDiff {\n const created = Object.keys(after.pages)\n .filter((relPath) => before.pages[relPath] === undefined)\n .sort((left, right) => left.localeCompare(right));\n const updated = Object.keys(after.pages)\n .filter(\n (relPath) =>\n before.pages[relPath] !== undefined && before.pages[relPath] !== after.pages[relPath]\n )\n .sort((left, right) => left.localeCompare(right));\n const deleted = Object.keys(before.pages)\n .filter((relPath) => after.pages[relPath] === undefined)\n .sort((left, right) => left.localeCompare(right));\n\n return {\n created,\n updated,\n deleted\n };\n}\n\nfunction formatLogLine(\n timestamp: string,\n verb: \"create\" | \"update\" | \"delete\",\n relPath: string,\n detail: string\n): string {\n return `- ${timestamp} **${verb}** \\`${relPath}\\` \u2014 ${detail}`;\n}\n\nfunction hashContent(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n", "import { parseSourceRef, serializeSourceRef } from \"./frontmatter.js\";\nimport type { ConfidenceTag, ConfidenceVerb, TaggedClaim } from \"./types.js\";\n\nexport const TAG_RE = /^<!--\\s*memory:(?<verb>extracted|inferred|ambiguous)(?<rest>[^>]*?)-->\\s*$/;\n\nexport function parseClaims(body: string): TaggedClaim[] {\n const lines = normalizeNewlines(body).split(\"\\n\");\n const claims: TaggedClaim[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const tagLine = lines[index] ?? \"\";\n const match = TAG_RE.exec(tagLine);\n if (match?.groups?.verb === undefined) {\n continue;\n }\n\n const claimLines: string[] = [];\n for (let claimIndex = index + 1; claimIndex < lines.length; claimIndex += 1) {\n const line = lines[claimIndex] ?? \"\";\n if (line.trim().length === 0 || TAG_RE.test(line)) {\n break;\n }\n\n claimLines.push(line);\n }\n\n if (claimLines.length === 0) {\n throw new Error(`Confidence tag on line ${index + 1} is not followed by a claim paragraph.`);\n }\n\n claims.push({\n tag: parseTag(match.groups.verb as ConfidenceVerb, match.groups.rest ?? \"\"),\n body: claimLines.join(\"\\n\"),\n lineNumber: index + 1\n });\n }\n\n return claims;\n}\n\nexport function serializeTag(tag: ConfidenceTag): string {\n switch (tag.verb) {\n case \"extracted\":\n return serializeComment(\"extracted\", {\n source: serializeSourceRef(tag.source),\n ...(tag.note === undefined ? {} : { note: tag.note })\n });\n case \"inferred\":\n return serializeComment(\"inferred\", {\n confidence: serializeConfidence(tag.confidence),\n ...(tag.source === undefined ? {} : { source: serializeSourceRef(tag.source) }),\n ...(tag.note === undefined ? {} : { note: tag.note })\n });\n case \"ambiguous\": {\n const reason = tag.reason.trim();\n if (reason.length === 0) {\n throw new Error('Ambiguous confidence tags require a non-empty \"reason\".');\n }\n\n return serializeComment(\"ambiguous\", { reason });\n }\n }\n}\n\ntype TagAttributes = Record<string, string>;\n\nfunction parseTag(verb: ConfidenceVerb, rest: string): ConfidenceTag {\n const attrs = parseAttributes(rest);\n\n switch (verb) {\n case \"extracted\": {\n const source = attrs.source;\n if (source === undefined) {\n throw new Error('Extracted confidence tags require \"source\".');\n }\n\n assertOnlyKeys(attrs, verb, [\"source\", \"note\"]);\n return {\n verb,\n source: parseSourceRef(source),\n ...(attrs.note === undefined ? {} : { note: attrs.note })\n };\n }\n case \"inferred\": {\n const confidence = attrs.confidence;\n if (confidence === undefined) {\n throw new Error('Inferred confidence tags require \"confidence\".');\n }\n\n assertOnlyKeys(attrs, verb, [\"confidence\", \"source\", \"note\"]);\n return {\n verb,\n confidence: parseConfidence(confidence),\n ...(attrs.source === undefined ? {} : { source: parseSourceRef(attrs.source) }),\n ...(attrs.note === undefined ? {} : { note: attrs.note })\n };\n }\n case \"ambiguous\": {\n const reason = attrs.reason?.trim();\n if (reason === undefined || reason.length === 0) {\n throw new Error('Ambiguous confidence tags require a non-empty \"reason\".');\n }\n\n assertOnlyKeys(attrs, verb, [\"reason\"]);\n return {\n verb,\n reason\n };\n }\n }\n}\n\nfunction parseAttributes(rest: string): TagAttributes {\n const attrs: TagAttributes = {};\n let index = 0;\n\n while (index < rest.length) {\n index = skipWhitespace(rest, index);\n if (index >= rest.length) {\n break;\n }\n\n const keyStart = index;\n while (index < rest.length && isKeyCharacter(rest[index] ?? \"\")) {\n index += 1;\n }\n\n if (keyStart === index) {\n throw new Error(`Invalid confidence tag attribute near \"${rest.slice(index).trim()}\".`);\n }\n\n const key = rest.slice(keyStart, index);\n if ((rest[index] ?? \"\") !== \"=\") {\n throw new Error(`Invalid confidence tag attribute \"${key}\".`);\n }\n\n index += 1;\n const { value, nextIndex } = readAttributeValue(rest, index);\n if (attrs[key] !== undefined) {\n throw new Error(`Duplicate confidence tag attribute \"${key}\".`);\n }\n\n attrs[key] = value;\n index = nextIndex;\n }\n\n return attrs;\n}\n\nfunction readAttributeValue(input: string, index: number): { value: string; nextIndex: number } {\n if (index >= input.length) {\n throw new Error(\"Missing confidence tag attribute value.\");\n }\n\n if (input[index] === '\"') {\n const endQuote = findClosingQuote(input, index + 1);\n return {\n value: JSON.parse(input.slice(index, endQuote + 1)) as string,\n nextIndex: endQuote + 1\n };\n }\n\n let nextIndex = index;\n while (nextIndex < input.length && !isWhitespace(input[nextIndex] ?? \"\")) {\n nextIndex += 1;\n }\n\n if (nextIndex === index) {\n throw new Error(\"Missing confidence tag attribute value.\");\n }\n\n return {\n value: input.slice(index, nextIndex),\n nextIndex\n };\n}\n\nfunction findClosingQuote(input: string, start: number): number {\n let escaped = false;\n\n for (let index = start; index < input.length; index += 1) {\n const char = input[index] ?? \"\";\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n return index;\n }\n }\n\n throw new Error(\"Unterminated quoted confidence tag attribute.\");\n}\n\nfunction assertOnlyKeys(\n attrs: TagAttributes,\n verb: ConfidenceVerb,\n allowedKeys: string[]\n): void {\n const disallowedKeys = Object.keys(attrs).filter((key) => !allowedKeys.includes(key));\n if (disallowedKeys.length > 0) {\n throw new Error(\n `${verb} confidence tags do not support: ${disallowedKeys.map((key) => `\"${key}\"`).join(\", \")}.`\n );\n }\n}\n\nfunction parseConfidence(rawConfidence: string): number {\n const confidence = Number(rawConfidence);\n if (!Number.isFinite(confidence) || confidence <= 0 || confidence > 1) {\n throw new Error(`Invalid confidence value \"${rawConfidence}\". Expected a number in (0, 1].`);\n }\n\n return confidence;\n}\n\nfunction serializeComment(verb: ConfidenceVerb, attrs: TagAttributes): string {\n const parts = Object.entries(attrs).map(([key, value]) => `${key}=${serializeAttributeValue(key, value)}`);\n return `<!-- memory:${verb}${parts.length === 0 ? \"\" : ` ${parts.join(\" \")}`} -->`;\n}\n\nfunction serializeAttributeValue(key: string, value: string): string {\n return key === \"source\" || key === \"confidence\" ? value : JSON.stringify(value);\n}\n\nfunction serializeConfidence(confidence: number): string {\n return String(parseConfidence(String(confidence)));\n}\n\nfunction normalizeNewlines(value: string): string {\n return value.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\");\n}\n\nfunction skipWhitespace(input: string, index: number): number {\n while (index < input.length && isWhitespace(input[index] ?? \"\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction isKeyCharacter(char: string): boolean {\n return (char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\");\n}\n\nfunction isWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\";\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseClaims } from \"./confidence.js\";\nimport { serializeSourceRef } from \"./frontmatter.js\";\nimport { listPages } from \"./pages.js\";\nimport type { MemoryRoot, SourceRef } from \"./types.js\";\n\nconst DEFAULT_MIN_INFERRED_CONFIDENCE = 0.3;\nconst DEFAULT_REJECT_UNTAGGED = false;\nconst DEFAULT_UNTAGGED_BODY_THRESHOLD_CHARS = 200;\n\nexport type AuditClaimsOptions = {\n minInferredConfidence?: number;\n rejectUntagged?: boolean;\n untaggedBodyThresholdChars?: number;\n};\n\nexport type PageAudit = {\n page: string;\n issues: string[];\n};\n\ntype SourceFileMeta =\n | { exists: false; absPath: string }\n | { exists: true; absPath: string; lineCount: number };\n\nexport async function auditClaims(\n root: MemoryRoot,\n repoRoot: string,\n options: AuditClaimsOptions = {}\n): Promise<PageAudit[]> {\n const minInferredConfidence =\n options.minInferredConfidence ?? DEFAULT_MIN_INFERRED_CONFIDENCE;\n const rejectUntagged = options.rejectUntagged ?? DEFAULT_REJECT_UNTAGGED;\n const untaggedBodyThresholdChars =\n options.untaggedBodyThresholdChars ?? DEFAULT_UNTAGGED_BODY_THRESHOLD_CHARS;\n const sourceCache = new Map<string, Promise<SourceFileMeta>>();\n\n const pages = await listPages(root);\n const audits: PageAudit[] = [];\n\n for (const page of pages) {\n const issues: string[] = [];\n let claims;\n\n try {\n claims = parseClaims(page.body);\n } catch (error) {\n issues.push(formatError(error));\n audits.push({ page: page.relPath, issues });\n continue;\n }\n\n if (rejectUntagged && claims.length === 0 && page.body.trim().length > untaggedBodyThresholdChars) {\n issues.push(\n `Page has a long untagged body (>${untaggedBodyThresholdChars} chars) with no memory:* tags.`\n );\n }\n\n const inlineSources = new Set<string>();\n\n for (const claim of claims) {\n if (claim.tag.verb === \"inferred\" && claim.tag.confidence < minInferredConfidence) {\n issues.push(\n `Claim on line ${claim.lineNumber} uses inferred confidence=${claim.tag.confidence}, below the minimum ${minInferredConfidence}.`\n );\n }\n\n const source = \"source\" in claim.tag ? claim.tag.source : undefined;\n if (source === undefined) {\n continue;\n }\n\n const serializedSource = serializeSourceRef(source);\n inlineSources.add(serializedSource);\n\n const sourceIssue = await auditSourceRef(source, claim.lineNumber, repoRoot, sourceCache);\n if (sourceIssue !== undefined) {\n issues.push(sourceIssue);\n }\n }\n\n issues.push(...auditFrontmatterSources(page.frontmatter.sources ?? [], inlineSources));\n\n if (issues.length > 0) {\n audits.push({ page: page.relPath, issues });\n }\n }\n\n return audits;\n}\n\nasync function auditSourceRef(\n source: SourceRef,\n claimLineNumber: number,\n repoRoot: string,\n sourceCache: Map<string, Promise<SourceFileMeta>>\n): Promise<string | undefined> {\n if (isUrlLike(source.path)) {\n return undefined;\n }\n\n if (path.isAbsolute(source.path)) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", but source paths must be repo-relative or URLs.`;\n }\n\n const absPath = path.resolve(repoRoot, source.path);\n if (!isWithinRoot(repoRoot, absPath)) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", which resolves outside the repo root.`;\n }\n\n const meta = await readSourceFile(absPath, sourceCache);\n if (!meta.exists) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", resolved to \"${meta.absPath}\", but the file does not exist.`;\n }\n\n const lastReferencedLine = source.endLine ?? source.startLine;\n if (lastReferencedLine !== undefined && lastReferencedLine > meta.lineCount) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", but current EOF ${meta.lineCount} is before the referenced line.`;\n }\n\n return undefined;\n}\n\nfunction auditFrontmatterSources(frontmatterSources: SourceRef[], inlineSources: Set<string>): string[] {\n const serializedFrontmatterSources = new Set(frontmatterSources.map((source) => serializeSourceRef(source)));\n const issues: string[] = [];\n\n const missingSources = [...inlineSources].filter((source) => !serializedFrontmatterSources.has(source));\n for (const source of missingSources.sort((left, right) => left.localeCompare(right))) {\n issues.push(`Page frontmatter sources are missing \"${source}\" from inline tags.`);\n }\n\n const staleSources = [...serializedFrontmatterSources].filter((source) => !inlineSources.has(source));\n for (const source of staleSources.sort((left, right) => left.localeCompare(right))) {\n issues.push(`Page frontmatter sources contain stale entry \"${source}\" not found in inline tags.`);\n }\n\n return issues;\n}\n\nfunction readSourceFile(\n absPath: string,\n sourceCache: Map<string, Promise<SourceFileMeta>>\n): Promise<SourceFileMeta> {\n const cached = sourceCache.get(absPath);\n if (cached !== undefined) {\n return cached;\n }\n\n const pending = fs\n .readFile(absPath, \"utf8\")\n .then((content) => ({\n exists: true as const,\n absPath,\n lineCount: countLines(content)\n }))\n .catch((error: unknown) => {\n if (isMissing(error)) {\n return {\n exists: false as const,\n absPath\n };\n }\n\n throw error;\n });\n\n sourceCache.set(absPath, pending);\n return pending;\n}\n\nfunction countLines(content: string): number {\n if (content.length === 0) {\n return 0;\n }\n\n const normalized = content.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\");\n const trimmed = normalized.endsWith(\"\\n\") ? normalized.slice(0, -1) : normalized;\n return trimmed.length === 0 ? 0 : trimmed.split(\"\\n\").length;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isMissing(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isUrlLike(value: string): boolean {\n return /^[a-z][a-z\\d+.-]*:\\/\\//i.test(value);\n}\n\nfunction isWithinRoot(root: string, absPath: string): boolean {\n const relative = path.relative(root, absPath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n", "import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MEMORY_CACHE_DIR_RELPATH, MEMORY_INGEST_CACHE_DIR_RELPATH } from \"./paths.js\";\nimport type { IngestCacheEntry, IngestCacheKey, MemoryRoot } from \"./types.js\";\n\nexport function computeIngestKey(input: {\n sourceBytes: Buffer;\n indexMdBytes: Buffer;\n promptTemplateVersion: string;\n agentId: string;\n}): IngestCacheKey {\n const hash = createHash(\"sha256\");\n hash.update(input.sourceBytes);\n hash.update(\"\\0\");\n hash.update(input.indexMdBytes);\n hash.update(\"\\0\");\n hash.update(input.promptTemplateVersion);\n hash.update(\"\\0\");\n hash.update(input.agentId);\n return hash.digest(\"hex\");\n}\n\nexport async function readCacheEntry(\n root: MemoryRoot,\n key: IngestCacheKey\n): Promise<IngestCacheEntry | null> {\n const cachePath = path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH, `${key}.json`);\n\n let raw: string;\n try {\n raw = await fs.readFile(cachePath, \"utf8\");\n } catch (error) {\n if (isMissing(error)) {\n return null;\n }\n\n throw error;\n }\n\n try {\n return parseCacheEntry(JSON.parse(raw), key);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Ignoring ingest cache entry \"${key}\": ${message}`);\n return null;\n }\n}\n\nexport async function writeCacheEntry(root: MemoryRoot, entry: IngestCacheEntry): Promise<void> {\n await fs.mkdir(path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH), { recursive: true });\n await fs.writeFile(\n path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH, `${entry.key}.json`),\n `${JSON.stringify(entry)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function clearCache(\n root: MemoryRoot,\n opts: { olderThanMs?: number } = {}\n): Promise<{ removed: number }> {\n const ingestDir = path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH);\n const cacheDir = path.join(root, MEMORY_CACHE_DIR_RELPATH);\n const fileNames = await readCacheFileNames(ingestDir);\n\n if (fileNames.length === 0) {\n if (opts.olderThanMs === undefined) {\n await fs.rm(cacheDir, { recursive: true, force: true });\n }\n\n return { removed: 0 };\n }\n\n if (opts.olderThanMs === undefined) {\n await fs.rm(cacheDir, { recursive: true, force: true });\n return { removed: fileNames.length };\n }\n\n const cutoff = Date.now() - opts.olderThanMs;\n let removed = 0;\n\n for (const fileName of fileNames) {\n const key = fileName.slice(0, -\".json\".length);\n const entry = await readCacheEntry(root, key);\n\n if (entry === null || Date.parse(entry.ingestedAt) > cutoff) {\n continue;\n }\n\n await fs.rm(path.join(ingestDir, fileName), { force: true });\n removed += 1;\n }\n\n await removeEmptyDirectory(ingestDir);\n await removeEmptyDirectory(cacheDir);\n\n return { removed };\n}\n\nfunction parseCacheEntry(value: unknown, _key: string): IngestCacheEntry {\n const object = expectRecord(value);\n\n return {\n key: expectString(object.key, \"key\"),\n ingestedAt: expectString(object.ingestedAt, \"ingestedAt\"),\n sourceLabel: expectString(object.sourceLabel, \"sourceLabel\"),\n diff: parseMemoryDiff(object.diff),\n exitCode: expectNumber(object.exitCode, \"exitCode\"),\n durationMs: expectNumber(object.durationMs, \"durationMs\"),\n memoryTokens: expectNumber(object.memoryTokens, \"memoryTokens\"),\n sourceTokens: expectNumber(object.sourceTokens, \"sourceTokens\"),\n promptTemplateVersion: expectString(object.promptTemplateVersion, \"promptTemplateVersion\"),\n agentId: expectString(object.agentId, \"agentId\")\n };\n}\n\nfunction parseMemoryDiff(value: unknown): IngestCacheEntry[\"diff\"] {\n const object = expectRecord(value);\n\n return {\n created: expectStringArray(object.created, \"diff.created\"),\n updated: expectStringArray(object.updated, \"diff.updated\"),\n deleted: expectStringArray(object.deleted, \"diff.deleted\")\n };\n}\n\nfunction expectRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Expected a JSON object.\");\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction expectString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`Expected string at \"${field}\".`);\n }\n\n return value;\n}\n\nfunction expectNumber(value: unknown, field: string): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new Error(`Expected number at \"${field}\".`);\n }\n\n return value;\n}\n\nfunction expectStringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\")) {\n throw new Error(`Expected string[] at \"${field}\".`);\n }\n\n return value;\n}\n\nasync function readCacheFileNames(ingestDir: string): Promise<string[]> {\n try {\n return (await fs.readdir(ingestDir))\n .filter((fileName) => path.posix.extname(fileName).toLowerCase() === \".json\")\n .sort((left, right) => left.localeCompare(right));\n } catch (error) {\n if (isMissing(error)) {\n return [];\n }\n\n throw error;\n }\n}\n\nasync function removeEmptyDirectory(directoryPath: string): Promise<void> {\n try {\n const remainingEntries = await fs.readdir(directoryPath);\n if (remainingEntries.length === 0) {\n await fs.rmdir(directoryPath);\n }\n } catch (error) {\n if (isMissing(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n", "import parseDuration from \"parse-duration\";\nimport { clearCache } from \"./cache.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport async function runMemoryCacheStatus(): Promise<void> {\n console.log(\"cache status not implemented yet\");\n}\n\nexport async function runMemoryCacheClear(input: {\n root: MemoryRoot;\n olderThan?: string;\n yes?: boolean;\n}): Promise<{ removed: number }> {\n if (!input.yes) {\n throw new Error(\"Refusing to clear cache without --yes.\");\n }\n\n const olderThanMs = parseOlderThan(input.olderThan);\n const result = await clearCache(input.root, olderThanMs === undefined ? {} : { olderThanMs });\n console.log(`removed ${result.removed} cache ${result.removed === 1 ? \"entry\" : \"entries\"}`);\n return result;\n}\n\nfunction parseOlderThan(value: string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const duration = parseDuration(value);\n if (duration === null || Number.isNaN(duration) || duration < 0) {\n throw new Error(`Invalid duration for --older-than: \"${value}\".`);\n }\n\n return duration;\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"@poe-code/agent-spawn\";\nimport { cacheEnabled, configuredTimeout, resolveAgent } from \"@poe-code/poe-code-config\";\nimport { computeIngestKey, readCacheEntry, writeCacheEntry } from \"./cache.js\";\nimport { MEMORY_INDEX_RELPATH } from \"./paths.js\";\nimport { reconcile, snapshot } from \"./reconcile.js\";\nimport { computeTokenStats } from \"./tokens.js\";\nimport type { MemoryConfigOptions } from \"@poe-code/poe-code-config\";\nimport type { IngestOptions, IngestResult, MemoryRoot } from \"./types.js\";\n\nexport const INGEST_PROMPT_VERSION = \"v1\";\n\nexport type IngestRunners = {\n computeIngestKey?: typeof computeIngestKey;\n readCacheEntry?: typeof readCacheEntry;\n writeCacheEntry?: typeof writeCacheEntry;\n computeTokenStats?: typeof computeTokenStats;\n snapshot?: typeof snapshot;\n reconcile?: typeof reconcile;\n};\n\ntype ResolvedIngestRunners = {\n computeIngestKey: typeof computeIngestKey;\n readCacheEntry: typeof readCacheEntry;\n writeCacheEntry: typeof writeCacheEntry;\n computeTokenStats: typeof computeTokenStats;\n snapshot: typeof snapshot;\n reconcile: typeof reconcile;\n};\n\nfunction resolveRunners(overrides?: IngestRunners): ResolvedIngestRunners {\n return {\n computeIngestKey: overrides?.computeIngestKey ?? computeIngestKey,\n readCacheEntry: overrides?.readCacheEntry ?? readCacheEntry,\n writeCacheEntry: overrides?.writeCacheEntry ?? writeCacheEntry,\n computeTokenStats: overrides?.computeTokenStats ?? computeTokenStats,\n snapshot: overrides?.snapshot ?? snapshot,\n reconcile: overrides?.reconcile ?? reconcile\n };\n}\n\nexport async function ingest(\n root: MemoryRoot,\n opts: IngestOptions,\n runners?: IngestRunners\n): Promise<IngestResult> {\n const resolved = resolveRunners(runners);\n const source = await materializeSource(opts.source);\n const indexMdBytes = await fs.readFile(path.join(root, MEMORY_INDEX_RELPATH));\n const configOptions = {\n fs: fs as MemoryConfigOptions[\"fs\"],\n filePath: path.join(inferRepoRoot(root), \"poe-code.json\")\n } satisfies MemoryConfigOptions;\n const agentId =\n (await resolveAgent(configOptions, opts.agent ?? null)) ?? opts.agent ?? \"claude-code\";\n const key = resolved.computeIngestKey({\n sourceBytes: source.bytes,\n indexMdBytes,\n promptTemplateVersion: INGEST_PROMPT_VERSION,\n agentId\n });\n\n if (!opts.force && (await cacheEnabled(configOptions))) {\n const hit = await resolved.readCacheEntry(root, key);\n if (hit !== null) {\n return {\n diff: { created: [], updated: [], deleted: [] },\n exitCode: 0,\n durationMs: 0,\n cacheHit: true,\n tokens: await resolved.computeTokenStats(root)\n };\n }\n }\n\n const prompt = buildIngestPrompt(root, source.label, source.text);\n if (opts.dryRun) {\n console.log(prompt);\n return {\n diff: { created: [], updated: [], deleted: [] },\n exitCode: 0,\n durationMs: 0,\n cacheHit: false,\n tokens: await resolved.computeTokenStats(root)\n };\n }\n\n const before = await resolved.snapshot(root);\n\n let exitCode = 1;\n let durationMs = 0;\n let timeoutError: Error | undefined;\n\n try {\n const result = await runWithTimeout(\n spawn(agentId, { prompt }),\n opts.timeoutMs ?? (await configuredTimeout(configOptions))\n );\n exitCode = result.exitCode;\n durationMs = result.durationMs ?? 0;\n } catch (error) {\n timeoutError = error instanceof Error ? error : new Error(String(error));\n }\n\n const diff = await resolved.reconcile(root, before, \"ingest\", opts.reason ?? `ingest ${source.label}`);\n const tokens = await resolved.computeTokenStats(root);\n\n if (timeoutError !== undefined) {\n throw timeoutError;\n }\n\n if (!opts.noCacheWrite && (await cacheEnabled(configOptions)) && exitCode === 0) {\n await resolved.writeCacheEntry(root, {\n key,\n ingestedAt: new Date().toISOString(),\n sourceLabel: source.label,\n diff,\n exitCode,\n durationMs,\n memoryTokens: tokens.memoryTokens,\n sourceTokens: tokens.sourceTokens,\n promptTemplateVersion: INGEST_PROMPT_VERSION,\n agentId\n });\n }\n\n return { diff, exitCode, durationMs, cacheHit: false, tokens };\n}\n\nfunction buildIngestPrompt(root: string, sourceLabel: string, sourceText: string): string {\n return [\n `Prompt version: ${INGEST_PROMPT_VERSION}`,\n `Memory root: ${root}`,\n `Source: ${sourceLabel}`,\n \"Update memory pages under pages/ only. Do not edit INDEX.md directly.\",\n \"Add confidence tags to non-trivial claims.\",\n \"\",\n sourceText\n ].join(\"\\n\");\n}\n\nasync function materializeSource(source: IngestOptions[\"source\"]): Promise<{\n label: string;\n bytes: Buffer;\n text: string;\n}> {\n if (source.kind === \"file\") {\n const bytes = await fs.readFile(source.absPath);\n return {\n label: source.absPath,\n bytes,\n text: bytes.toString(\"utf8\")\n };\n }\n\n throw new Error(\"URL ingest not implemented yet.\");\n}\n\nfunction inferRepoRoot(root: string): string {\n return path.resolve(root, \"..\", \"..\");\n}\n\nasync function runWithTimeout<T extends { exitCode: number; durationMs?: number }>(\n promise: Promise<T>,\n timeoutMs: number\n): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`ingest timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n }\n );\n });\n}\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandRunnerResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface CommandRunnerOptions {\n cwd?: string;\n env?: Record<string, string | undefined>;\n stdin?: string | Buffer;\n}\n\nexport type CommandRunner = (\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n) => Promise<CommandRunnerResult>;\n\nexport function runCommand(\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n): Promise<CommandRunnerResult> {\n return new Promise((resolve) => {\n const hasStdin = options?.stdin != null;\n const child = spawn(command, args, {\n stdio: [hasStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n cwd: options?.cwd,\n env: options?.env\n ? {\n ...(process.env as Record<string, string | undefined>),\n ...options.env\n }\n : undefined\n });\n let stdout = \"\";\n let stderr = \"\";\n\n if (hasStdin && child.stdin) {\n child.stdin.on(\"error\", () => {});\n child.stdin.end(options!.stdin);\n }\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const exitCode =\n typeof error.code === \"number\"\n ? error.code\n : typeof error.errno === \"number\"\n ? error.errno\n : 127;\n const message =\n error instanceof Error ? error.message : String(error ?? \"error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n", "import type { AdapterType } from \"./adapters/index.js\";\n\nexport type SpawnMode = \"yolo\" | \"edit\" | \"read\";\n\nexport type SpawnModeConfig = string[] | { args?: string[]; env?: Record<string, string> };\n\nexport function resolveModeConfig(modeConfig: SpawnModeConfig): { args: string[]; env?: Record<string, string> } {\n if (Array.isArray(modeConfig)) {\n return { args: modeConfig };\n }\n return {\n args: modeConfig.args ?? [],\n env: modeConfig.env && Object.keys(modeConfig.env).length > 0 ? modeConfig.env : undefined\n };\n}\n\nexport interface McpSpawnServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n /**\n * Maximum time in seconds the agent should wait for a single tool call\n * to this MCP server before timing out. Omit to use the agent's default.\n */\n timeout?: number;\n}\n\nexport type McpSpawnConfig = Record<string, McpSpawnServer>;\n\nexport interface SpawnOptions {\n prompt: string;\n cwd?: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n useStdin?: boolean;\n interactive?: boolean;\n signal?: AbortSignal;\n tee?: {\n stdout?: { write(chunk: string): void };\n stderr?: { write(chunk: string): void };\n };\n /**\n * Kill the spawned process after this many milliseconds of inactivity (no stdout data).\n * Resets on every chunk of stdout/stderr received. Disabled when undefined.\n */\n activityTimeoutMs?: number;\n /**\n * Full path for the spawn log file. When set, stdout (and stderr for CLI spawns)\n * are appended to this file, and the absolute path is returned in `SpawnResult.logFile`.\n * Takes precedence over `logDir` + `logFileName`.\n */\n logPath?: string;\n /**\n * Directory for the spawn log file. When set together with `logFileName`, stdout\n * (and stderr for CLI spawns) are appended to `<logDir>/<logFileName>`, and the\n * absolute path is returned in `SpawnResult.logFile`.\n */\n logDir?: string;\n /** Overrides the auto-generated log filename. Must be used together with `logDir`. */\n logFileName?: string;\n}\n\nexport interface SpawnUsage {\n inputTokens: number;\n outputTokens: number;\n cachedTokens?: number;\n costUsd?: number;\n}\n\nexport interface SpawnResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs?: number;\n threadId?: string;\n usage?: SpawnUsage;\n logFile?: string;\n}\n\nexport interface AutonomousResult {\n summary?: string;\n log?: string;\n output?: string;\n stdout?: string;\n text?: string;\n logFile?: string;\n toolCalls?: unknown[];\n sessionResult?: {\n toolCalls?: unknown[];\n };\n}\n\nexport interface SpawnLogger {\n dryRun(message: string): void;\n}\n\nexport interface SpawnContext {\n dryRun?: boolean;\n logger?: SpawnLogger;\n homeDir?: string;\n}\n\nexport interface StdinMode {\n omitPrompt: boolean;\n extraArgs: string[];\n}\n\nexport interface InteractiveSpawnConfig {\n defaultArgs: string[];\n defaultArgsPosition?: \"beforePrompt\" | \"afterPrompt\";\n promptFlag?: string;\n}\n\nexport interface CliSpawnConfig {\n kind: \"cli\";\n agentId: string;\n adapter: AdapterType;\n promptFlag: string;\n defaultArgs: string[];\n defaultArgsPosition?: \"beforePrompt\" | \"afterPrompt\";\n modes: Record<SpawnMode, SpawnModeConfig>;\n stdinMode?: StdinMode;\n modelFlag?: string;\n /**\n * Controls whether the provider prefix is stripped from model IDs before passing to the CLI binary.\n *\n * When `true`: \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\", \"openai/gpt-5.2\" \u2192 \"gpt-5.2\"\n * When `false`: \"anthropic/claude-opus-4.6\" stays as-is, \"openai/gpt-5.2\" stays as-is\n *\n * Most CLI binaries only accept bare model IDs (e.g. `claude --model claude-opus-4.6`),\n * so they need `true`. OpenCode routes through poe and needs the full provider path, so it uses `false`.\n */\n modelStripProviderPrefix: boolean;\n /** Transform model ID before passing to CLI. Runs after provider prefix stripping (if enabled). */\n modelTransform?: (model: string) => string;\n /**\n * Transforms MCP server config into CLI args for this agent.\n * Presence of this function declares spawn-time MCP support.\n */\n mcpArgs?: (servers: McpSpawnConfig) => string[];\n /**\n * Transforms MCP server config into env vars for this agent.\n * Use instead of `mcpArgs` when the agent reads MCP config from the environment.\n */\n mcpEnv?: (servers: McpSpawnConfig) => Record<string, string>;\n /**\n * Controls where serialized MCP args are inserted relative to the command.\n *\n * - \"beforeCommand\": before the prompt/subcommand section (e.g. `codex -c ... exec \"prompt\"`)\n * - \"beforePrompt\": after `defaultArgs` but before the prompt/model section\n * - \"afterCommand\": after `defaultArgs` (default)\n */\n mcpArgsPosition?: \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\";\n /**\n * @deprecated Prefer `mcpArgsPosition`.\n * When true, MCP args are placed before the subcommand (e.g. `codex -c ... exec \"prompt\"`).\n * When false/undefined, they are placed after defaultArgs (e.g. `claude -p \"prompt\" --mcp-servers ...`).\n */\n mcpArgsBeforeCommand?: boolean;\n interactive?: InteractiveSpawnConfig;\n resumeCommand?: (threadId: string, cwd: string) => string[];\n}\n\nexport interface FileSpawnConfig {\n kind: \"file\";\n agentId: string;\n launchCommand?: string;\n launchArgs?: string[];\n}\n\nexport interface AcpSpawnConfig {\n kind: \"acp\";\n agentId: string;\n /** Args passed to the agent binary to start its ACP server (e.g. [\"acp\"]). */\n acpArgs: string[];\n /** Environment variables required by the ACP server process. */\n env?: Record<string, string>;\n /** Whether to skip the ACP authenticate step (workaround for servers that advertise but don't implement auth). */\n skipAuth?: boolean;\n /** MCP server env serializer, same as CliSpawnConfig. */\n mcpEnv?: (servers: McpSpawnConfig) => Record<string, string>;\n}\n\nexport type SpawnConfig = CliSpawnConfig | FileSpawnConfig | AcpSpawnConfig;\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type { McpSpawnConfig } from \"../types.js\";\n\ninterface JsonMcpServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n timeout?: number;\n}\n\nfunction toJsonMcpServers(servers: McpSpawnConfig): Record<string, JsonMcpServer> {\n const out: Record<string, JsonMcpServer> = {};\n\n for (const [name, server] of Object.entries(servers)) {\n const mapped: JsonMcpServer = { command: server.command };\n if (server.args && server.args.length > 0) {\n mapped.args = server.args;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n mapped.env = server.env;\n }\n if (server.timeout !== undefined) {\n mapped.timeout = server.timeout;\n }\n out[name] = mapped;\n }\n\n return out;\n}\n\nfunction toTomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toTomlArray(values: string[]): string {\n const serialized = values.map((value) => toTomlString(value));\n return `[${serialized.join(\", \")}]`;\n}\n\nfunction toTomlInlineTable(values: Record<string, string>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(values)) {\n parts.push(`${JSON.stringify(key)}=${toTomlString(value)}`);\n }\n return `{${parts.join(\", \")}}`;\n}\n\nexport function serializeJsonMcpArgs(servers: McpSpawnConfig): string[] {\n return [\"--mcp-config\", JSON.stringify({ mcpServers: toJsonMcpServers(servers) })];\n}\n\nexport function serializeOpenCodeMcpEnv(servers: McpSpawnConfig): Record<string, string> {\n const mcp: Record<\n string,\n { type: \"local\"; command: string[]; environment?: Record<string, string> }\n > = {};\n for (const [name, server] of Object.entries(servers)) {\n const entry: {\n type: \"local\";\n command: string[];\n environment?: Record<string, string>;\n } = { type: \"local\", command: [server.command, ...(server.args ?? [])] };\n if (server.env && Object.keys(server.env).length > 0) {\n entry.environment = server.env;\n }\n mcp[name] = entry;\n }\n return { OPENCODE_CONFIG_CONTENT: JSON.stringify({ mcp }) };\n}\n\nexport function serializeCodexMcpArgs(servers: McpSpawnConfig): string[] {\n const args: string[] = [];\n\n for (const [name, server] of Object.entries(servers)) {\n const prefix = `mcp_servers.${name}`;\n args.push(\"-c\", `${prefix}.command=${toTomlString(server.command)}`);\n\n if (server.args && server.args.length > 0) {\n args.push(\"-c\", `${prefix}.args=${toTomlArray(server.args)}`);\n }\n\n if (server.env && Object.keys(server.env).length > 0) {\n args.push(\"-c\", `${prefix}.env=${toTomlInlineTable(server.env)}`);\n }\n\n if (server.timeout !== undefined) {\n args.push(\"-c\", `${prefix}.timeout=${server.timeout}`);\n }\n }\n\n return args;\n}\n\nexport function serializeGooseMcpArgs(servers: McpSpawnConfig): string[] {\n return Object.values(servers).flatMap((server) => [\n \"--with-extension\",\n [server.command, ...(server.args ?? [])].join(\" \")\n ]);\n}\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const claudeCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"claude-code\",\n // ACP adapter support: yes (adapter: \"claude\")\n adapter: \"claude\",\n promptFlag: \"-p\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n modelTransform: (model) => model.replaceAll(\".\", \"-\"),\n defaultArgs: [\n \"--output-format\",\n \"stream-json\",\n \"--verbose\"\n ],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--dangerously-skip-permissions\"],\n edit: [\"--permission-mode\", \"acceptEdits\", \"--allowedTools\", \"Bash,Read,Write,Edit,Glob,Grep,NotebookEdit\"],\n read: [\"--permission-mode\", \"plan\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"text\"]\n },\n interactive: {\n defaultArgs: []\n },\n resumeCommand: (threadId) => [\"--resume\", threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeCodexMcpArgs } from \"./mcp.js\";\n\nexport const codexSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"codex\",\n // ACP adapter support: yes (adapter: \"codex\")\n adapter: \"codex\",\n promptFlag: \"exec\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--skip-git-repo-check\", \"--json\"],\n mcpArgs: serializeCodexMcpArgs,\n mcpArgsBeforeCommand: true,\n modes: {\n yolo: [\"-s\", \"danger-full-access\"],\n edit: [\"-s\", \"workspace-write\"],\n read: [\"-s\", \"read-only\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"-\"]\n },\n interactive: {\n defaultArgs: [\"-a\", \"never\"]\n },\n resumeCommand: (threadId, cwd) => [\"resume\", \"-C\", cwd, threadId]\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeOpenCodeMcpEnv } from \"./mcp.js\";\n\n/**\n * OpenCode JSON output format (empirically observed)\n *\n * OpenCode can emit \"raw JSON events\" when running a prompt via:\n * - `opencode run \"<prompt>\" --format json ...`\n *\n * Key observations (OpenCode CLI v1.1.47):\n * - Output is **NDJSON / line-delimited JSON**: one JSON object per stdout line.\n * - Each line is an event object with a top-level `type` string (NOT ACP's `{ event: ... }`).\n * - Common top-level fields:\n * - `type`: `\"step_start\" | \"text\" | \"tool_use\" | \"step_finish\" | ...`\n * - `timestamp`: number (ms since epoch)\n * - `sessionID`: string (e.g. `\"ses_...\"`)\n * - `part`: object with event-specific payload\n *\n * `text` events:\n * ```ts\n * {\n * type: \"text\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"text\",\n * messageID: \"msg_...\",\n * text: \"Hello ...\",\n * time: { start: 1770000000000, end: 1770000000000 }\n * }\n * }\n * ```\n *\n * Tool calls (`tool_use`):\n * - Represented as a single event with `part.type: \"tool\"` and `state.status`.\n * - `state.input` includes tool arguments; `state.output` is the tool result string.\n * ```ts\n * {\n * type: \"tool_use\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"tool\",\n * callID: \"call_...\",\n * tool: \"bash\",\n * state: {\n * status: \"completed\",\n * input: { command: \"echo hello\", description: \"...\" },\n * output: \"hello\\n\"\n * }\n * }\n * }\n * ```\n *\n * Step boundaries:\n * - `step_start` and `step_finish` wrap a single model/tool turn.\n * - `step_finish.part.tokens` contains token accounting:\n * `{ input, output, reasoning, cache: { read, write } }`\n *\n * Negative cases / gotchas:\n * - Some failures (e.g. invalid `--model` / unknown provider) can print a non-JSON stack trace\n * before any JSON events are emitted, even with `--format json`.\n * - If `--format json` is ever removed upstream, OpenCode will need a text-mode fallback\n * (no streaming event adapter).\n */\nexport const openCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"opencode\",\n // ACP adapter support: yes (adapter: \"opencode\").\n // OpenCode's `--format json` emits NDJSON events with `{ type, sessionID, part }`\n // (no `{ event, ... }` field), so it needs the OpenCode adapter (not \"native\").\n adapter: \"opencode\",\n promptFlag: \"run\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n modelTransform: (model) => {\n return model.startsWith(\"poe/\") ? model : `poe/${model}`;\n },\n defaultArgs: [\"--format\", \"json\"],\n modes: {\n yolo: [],\n edit: [],\n read: [\"--agent\", \"plan\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"--prompt\"\n },\n resumeCommand: (threadId, cwd) => [cwd, \"--session\", threadId],\n mcpEnv: serializeOpenCodeMcpEnv\n};\n\nexport const openCodeAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"opencode\",\n acpArgs: [\"acp\"],\n skipAuth: true,\n mcpEnv: serializeOpenCodeMcpEnv,\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const kimiSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"kimi\",\n // ACP adapter support: yes (adapter: \"kimi\").\n // Kimi's `--output-format stream-json` emits OpenAI-style `{ role, content }` JSON\n // (no `{ event, ... }` field), so it needs the Kimi adapter (not \"native\").\n adapter: \"kimi\",\n promptFlag: \"-p\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--print\", \"--output-format\", \"stream-json\"],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--yolo\"],\n edit: [],\n read: []\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"stream-json\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"-p\"\n },\n resumeCommand: (threadId, cwd) => [\"--session\", threadId, \"--work-dir\", cwd]\n};\n\nexport const kimiAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"kimi\",\n acpArgs: [\"acp\"],\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeGooseMcpArgs } from \"./mcp.js\";\n\nconst gooseFileSecretsEnv = { GOOSE_DISABLE_KEYRING: \"1\" };\n\nexport const gooseSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"goose\",\n adapter: \"native\",\n promptFlag: \"--text\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n defaultArgs: [\"run\", \"--output-format\", \"stream-json\"],\n defaultArgsPosition: \"beforePrompt\",\n mcpArgs: serializeGooseMcpArgs,\n mcpArgsPosition: \"beforePrompt\",\n modes: {\n yolo: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"auto\" } },\n edit: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"smart_approve\" } },\n read: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"chat\" } }\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--instructions\", \"-\"]\n },\n interactive: {\n defaultArgs: [\"session\"],\n defaultArgsPosition: \"beforePrompt\"\n },\n resumeCommand: () => [\"run\", \"--resume\", \"--text\", \"continue\"]\n};\n\nexport const gooseAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"goose\",\n acpArgs: [\"acp\"],\n env: gooseFileSecretsEnv,\n skipAuth: true\n};\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { AcpSpawnConfig, SpawnConfig } from \"../types.js\";\nimport { claudeCodeSpawnConfig } from \"./claude-code.js\";\nimport { codexSpawnConfig } from \"./codex.js\";\nimport { openCodeSpawnConfig, openCodeAcpSpawnConfig } from \"./opencode.js\";\nimport { kimiSpawnConfig, kimiAcpSpawnConfig } from \"./kimi.js\";\nimport { gooseSpawnConfig, gooseAcpSpawnConfig } from \"./goose.js\";\n\n// ACP adapter support (spawn streaming):\n// - Supported (has `adapter`): claude-code, codex, opencode, kimi, goose\nexport const allSpawnConfigs: readonly SpawnConfig[] = [\n claudeCodeSpawnConfig,\n codexSpawnConfig,\n openCodeSpawnConfig,\n kimiSpawnConfig,\n gooseSpawnConfig\n];\n\nconst lookup = new Map<string, SpawnConfig>();\n\nfor (const config of allSpawnConfigs) {\n lookup.set(config.agentId, config);\n}\n\nconst acpLookup = new Map<string, AcpSpawnConfig>();\nacpLookup.set(openCodeAcpSpawnConfig.agentId, openCodeAcpSpawnConfig);\nacpLookup.set(kimiAcpSpawnConfig.agentId, kimiAcpSpawnConfig);\nacpLookup.set(gooseAcpSpawnConfig.agentId, gooseAcpSpawnConfig);\n\nexport function getSpawnConfig(input: string): SpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return lookup.get(resolvedId);\n}\n\nexport function getAcpSpawnConfig(input: string): AcpSpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return acpLookup.get(resolvedId);\n}\n\nexport function supportsMcpAtSpawn(input: string): boolean {\n const config = getSpawnConfig(input);\n return (\n !!config &&\n config.kind === \"cli\" &&\n (typeof config.mcpArgs === \"function\" || typeof config.mcpEnv === \"function\")\n );\n}\n\nexport function listMcpSupportedAgents(): string[] {\n const supported: string[] = [];\n\n for (const config of allSpawnConfigs) {\n if (\n config.kind !== \"cli\" ||\n (typeof config.mcpArgs !== \"function\" && typeof config.mcpEnv !== \"function\")\n ) {\n continue;\n }\n supported.push(config.agentId);\n }\n\n return supported;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { mkdirSync, openSync, writeSync, closeSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport {\n resolveModeConfig,\n type CliSpawnConfig,\n type McpSpawnConfig,\n type SpawnContext,\n type SpawnMode,\n type SpawnOptions,\n type SpawnResult,\n type StdinMode\n} from \"./types.js\";\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createActivityTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `Agent spawn timed out after ${timeoutMs / 1000}s of inactivity`\n );\n error.name = \"ActivityTimeoutError\";\n return error;\n}\n\nexport function isActivityTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"ActivityTimeoutError\";\n}\n\nexport interface BuildSpawnArgsOptions {\n prompt: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n useStdin?: boolean;\n}\n\nexport interface BuildSpawnArgsResult {\n binaryName: string;\n args: string[];\n env?: Record<string, string>;\n}\n\nfunction resolveCliConfig(agentId: string) {\n const resolved = resolveConfig(agentId);\n\n if (!resolved.spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (resolved.spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n return {\n agentId: resolved.agentId,\n binaryName: resolved.binaryName,\n spawnConfig: resolved.spawnConfig\n };\n}\n\nfunction getDefaultArgsPosition(config: CliSpawnConfig): \"beforePrompt\" | \"afterPrompt\" {\n return config.defaultArgsPosition ?? \"afterPrompt\";\n}\n\nfunction getMcpArgsPosition(\n config: CliSpawnConfig\n): \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\" {\n if (config.mcpArgsPosition) {\n return config.mcpArgsPosition;\n }\n return config.mcpArgsBeforeCommand ? \"beforeCommand\" : \"afterCommand\";\n}\n\nfunction buildCliArgs(\n config: CliSpawnConfig,\n options: BuildSpawnArgsOptions,\n stdinMode?: StdinMode\n): { args: string[]; env?: Record<string, string> } {\n const mcpArgs = getMcpArgs(config, options.mcpServers);\n const defaultArgsPosition = getDefaultArgsPosition(config);\n const mcpArgsPosition = getMcpArgsPosition(config);\n\n const args: string[] = [];\n\n if (mcpArgsPosition === \"beforeCommand\") {\n args.push(...mcpArgs);\n }\n\n if (defaultArgsPosition === \"beforePrompt\") {\n args.push(...config.defaultArgs);\n }\n\n if (mcpArgsPosition === \"beforePrompt\") {\n args.push(...mcpArgs);\n }\n\n if (stdinMode) {\n args.push(\n config.promptFlag,\n ...(stdinMode.omitPrompt ? [] : [options.prompt]),\n ...stdinMode.extraArgs\n );\n } else {\n args.push(config.promptFlag, options.prompt);\n }\n\n if (options.model && config.modelFlag) {\n let model = config.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (config.modelTransform) model = config.modelTransform(model);\n args.push(config.modelFlag, model);\n }\n\n if (defaultArgsPosition === \"afterPrompt\") {\n args.push(...config.defaultArgs);\n }\n\n if (mcpArgsPosition === \"afterCommand\") {\n args.push(...mcpArgs);\n }\n\n const mode = resolveModeConfig(config.modes[options.mode ?? \"yolo\"]);\n args.push(...mode.args);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n return { args, env: mode.env };\n}\n\nexport function buildSpawnArgs(\n agentId: string,\n options: BuildSpawnArgsOptions\n): BuildSpawnArgsResult {\n const { binaryName, spawnConfig } = resolveCliConfig(agentId);\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n const result = buildCliArgs(spawnConfig, options, stdinMode);\n return { binaryName, args: result.args, env: result.env };\n}\n\nexport async function spawn(\n agentId: string,\n options: SpawnOptions,\n context?: SpawnContext\n): Promise<SpawnResult> {\n if (options.signal?.aborted) {\n throw createAbortError();\n }\n\n const { agentId: resolvedId, binaryName, spawnConfig } = resolveCliConfig(agentId);\n\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n\n const { args: spawnArgs, env: modeEnv } = buildCliArgs(spawnConfig, options, stdinMode);\n\n if (context?.dryRun) {\n const rendered = [binaryName, ...spawnArgs].join(\" \");\n context.logger?.dryRun(rendered);\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n }\n\n const logFilePath = resolveSpawnLogPath(options);\n const logFd = logFilePath ? openSpawnLog(logFilePath) : undefined;\n\n const child = spawnChildProcess(binaryName, spawnArgs, {\n cwd: options.cwd,\n stdio: [stdinMode ? \"pipe\" : \"inherit\", \"pipe\", \"pipe\"],\n ...(modeEnv ? { env: { ...process.env, ...modeEnv } } : {})\n });\n\n if (!child.stdout || !child.stderr) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdio pipes.`);\n }\n\n const stdoutStream = child.stdout;\n const stderrStream = child.stderr;\n\n if (stdinMode) {\n if (!child.stdin) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdin pipe.`);\n }\n child.stdin.setDefaultEncoding(\"utf8\");\n child.stdin.write(options.prompt);\n child.stdin.end();\n }\n\n return new Promise<SpawnResult>((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let aborted = false;\n let timedOut = false;\n\n const onAbort = () => {\n aborted = true;\n child.kill(\"SIGTERM\");\n };\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n let activityTimer: ReturnType<typeof setTimeout> | undefined;\n const resetActivityTimer = options.activityTimeoutMs\n ? () => {\n if (activityTimer) clearTimeout(activityTimer);\n activityTimer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, options.activityTimeoutMs);\n }\n : undefined;\n\n resetActivityTimer?.();\n\n const cleanup = () => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (activityTimer) clearTimeout(activityTimer);\n };\n\n stdoutStream.setEncoding(\"utf8\");\n stdoutStream.on(\"data\", (chunk) => {\n stdout += chunk;\n resetActivityTimer?.();\n if (options.tee?.stdout) options.tee.stdout.write(chunk);\n appendSpawnLog(logFd, chunk);\n });\n\n stderrStream.setEncoding(\"utf8\");\n stderrStream.on(\"data\", (chunk) => {\n stderr += chunk;\n resetActivityTimer?.();\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n appendSpawnLog(logFd, chunk);\n });\n\n child.on(\"error\", (error) => {\n cleanup();\n closeSpawnLog(logFd);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n cleanup();\n closeSpawnLog(logFd);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n if (timedOut) {\n reject(createActivityTimeoutError(options.activityTimeoutMs!));\n return;\n }\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1,\n ...(logFilePath ? { logFile: logFilePath } : {})\n });\n });\n });\n}\n\nfunction resolveSpawnLogPath(options: SpawnOptions): string | undefined {\n if (options.logPath) {\n return options.logPath;\n }\n if (!options.logDir || !options.logFileName) {\n return undefined;\n }\n return path.join(options.logDir, options.logFileName);\n}\n\nfunction openSpawnLog(filePath: string): number | undefined {\n try {\n mkdirSync(path.dirname(filePath), { recursive: true });\n return openSync(filePath, \"a\");\n } catch {\n return undefined;\n }\n}\n\nfunction appendSpawnLog(fd: number | undefined, chunk: string): void {\n if (fd === undefined) return;\n try {\n writeSync(fd, chunk);\n } catch {\n // ignore \u2014 logging is best-effort\n }\n}\n\nfunction closeSpawnLog(fd: number | undefined): void {\n if (fd === undefined) return;\n try {\n closeSync(fd);\n } catch {\n // ignore\n }\n}\n", "import { allAgents, resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { SpawnConfig } from \"../types.js\";\nimport { getSpawnConfig } from \"./index.js\";\n\nexport interface ResolvedSpawnConfig {\n agentId: string;\n binaryName?: string;\n spawnConfig?: SpawnConfig;\n}\n\nexport function resolveConfig(agentId: string): ResolvedSpawnConfig {\n const resolvedAgentId = resolveAgentId(agentId);\n if (!resolvedAgentId) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const agentDefinition = allAgents.find((agent) => agent.id === resolvedAgentId);\n if (!agentDefinition) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const spawnConfig = getSpawnConfig(resolvedAgentId);\n const binaryName = agentDefinition.binaryName;\n\n return { agentId: resolvedAgentId, binaryName, spawnConfig };\n}\n", "import { listMcpSupportedAgents } from \"./configs/index.js\";\nimport type { CliSpawnConfig, McpSpawnConfig } from \"./types.js\";\n\nexport function hasMcpServers(servers?: McpSpawnConfig): servers is McpSpawnConfig {\n if (!servers) {\n return false;\n }\n return Object.keys(servers).length > 0;\n}\n\nexport function getMcpArgs(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): string[] {\n if (!hasMcpServers(servers)) {\n return [];\n }\n if (!config.mcpArgs && !config.mcpEnv) {\n throw new Error(formatUnsupportedMcpSpawnMessage(config.agentId));\n }\n if (!config.mcpArgs) {\n return [];\n }\n return config.mcpArgs(servers);\n}\n\nexport function getMcpEnv(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): Record<string, string> {\n if (!hasMcpServers(servers) || !config.mcpEnv) {\n return {};\n }\n return config.mcpEnv(servers);\n}\n\nexport function formatUnsupportedMcpSpawnMessage(agentId: string): string {\n const supported = listMcpSupportedAgents();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"(none)\";\n return (\n `Agent \"${agentId}\" does not support MCP servers at spawn time.\\n` +\n `Agents with spawn-time MCP support: ${supportedText}`\n );\n}\n", "/**\n * Strips the provider namespace prefix from a model identifier.\n * e.g., \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\"\n *\n * CLI binaries (claude, codex, opencode, kimi) only accept bare model IDs.\n * Passing a namespaced model like \"anthropic/claude-opus-4.6\" causes the\n * binary to fail with \"model not found\". This function MUST be called\n * before passing any model to a CLI binary via spawn args.\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n return slashIndex === -1 ? model : model.slice(slashIndex + 1);\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport { resolveModeConfig, type SpawnOptions, type SpawnResult } from \"./types.js\";\n\nexport async function spawnInteractive(\n agentId: string,\n options: SpawnOptions\n): Promise<SpawnResult> {\n const resolved = resolveConfig(agentId);\n const spawnConfig = resolved.spawnConfig;\n\n if (!spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n if (!spawnConfig.interactive) {\n throw new Error(`Agent \"${resolved.agentId}\" does not support interactive mode.`);\n }\n\n const { interactive } = spawnConfig;\n\n const args: string[] = [];\n\n if (interactive.defaultArgsPosition === \"beforePrompt\") {\n args.push(...interactive.defaultArgs);\n }\n\n if (options.prompt) {\n if (interactive.promptFlag) {\n args.push(interactive.promptFlag, options.prompt);\n } else {\n args.push(options.prompt);\n }\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n if (interactive.defaultArgsPosition !== \"beforePrompt\") {\n args.push(...interactive.defaultArgs);\n }\n args.push(...getMcpArgs(spawnConfig, options.mcpServers));\n\n const modeResolved = resolveModeConfig(spawnConfig.modes[options.mode ?? \"yolo\"]);\n args.push(...modeResolved.args);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const child = spawnChildProcess(resolved.binaryName, args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n ...(modeResolved.env ? { env: { ...process.env, ...modeResolved.env } } : {})\n });\n\n return new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout: \"\",\n stderr: \"\",\n exitCode: code ?? 1\n });\n });\n });\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().intro(content);\n },\n heading(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return getTheme().header(content);\n },\n section(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return typography.bold(content);\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().accent(content);\n },\n argument(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `<${content}>`;\n return getTheme().muted(content);\n },\n option(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().muted(content);\n },\n usageCommand(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}](${content})`;\n return getTheme().accent(content);\n },\n muted(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `*${content}*`;\n return getTheme().muted(content);\n },\n badge(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}]`;\n return getTheme().badge(content);\n },\n selectLabel(label: string, detail?: string): string {\n if (!detail) {\n return label;\n }\n const format = resolveOutputFormat();\n if (format !== \"terminal\") {\n return `${label} \u2014 ${detail}`;\n }\n return `${label} ${typography.dim(\"\u2014\")} ${typography.dim(detail)}`;\n }\n} as const;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "import chalk from \"chalk\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import chalk from \"chalk\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = chalk.gray(\"\u2502\"),\n secondarySymbol = chalk.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { renderMarkdown } from \"../terminal-markdown/index.js\";\nimport { getAcpWriter } from \"./writer.js\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n getAcpWriter()(line);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nfunction formatCost(costUsd: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(costUsd);\n}\n\nexport function renderAgentMessage(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **agent:** ${text}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"agent_message\", text }));\n return;\n }\n\n const rendered = renderMarkdown(text).trimEnd();\n writeLine(`${AGENT_PREFIX}${rendered}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2192 ${kind}: ${title}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_start\", kind, title }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2713 ${kind}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_complete\", kind }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *thinking:* ${truncate(text, 80)}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"reasoning\", text }));\n return;\n }\n\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const format = resolveOutputFormat();\n const cached =\n typeof tokens.cached === \"number\" && tokens.cached > 0 ? ` (${tokens.cached} cached)` : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n cost = ` (${formatCost(tokens.costUsd)})`;\n }\n\n if (format === \"markdown\") {\n writeLine(`- **tokens:** ${tokens.input} in \u2192 ${tokens.output} out${cost}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(\n JSON.stringify({\n event: \"usage\",\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n cachedTokens: tokens.cached ?? 0,\n costUsd: tokens.costUsd ?? 0\n })\n );\n return;\n }\n\n writeLine(\"\");\n writeLine(chalk.green(`\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`));\n}\n\nexport function renderError(message: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **error:** ${message}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"error\", message }));\n return;\n }\n\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import chalk from \"chalk\";\nimport type { Cell, CellStyle, Rect } from \"./types.js\";\n\nconst EMPTY_CELL: Cell = { ch: \" \", style: {} };\n\nexport class ScreenBuffer {\n private _width: number;\n private _height: number;\n private _cells: Cell[];\n\n constructor(width: number, height: number) {\n this._width = normalizeSize(width);\n this._height = normalizeSize(height);\n this._cells = createCells(this._width, this._height);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n put(x: number, y: number, text: string, style?: CellStyle): void {\n if (!this.isInBoundsY(y) || text.length === 0) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n let offset = 0;\n\n for (const ch of text) {\n const targetX = x + offset;\n offset += 1;\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n get(x: number, y: number): Cell {\n if (!this.isInBounds(x, y)) {\n return cloneCell(EMPTY_CELL);\n }\n\n return cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n\n clear(style?: CellStyle): void {\n this._cells = createCells(this._width, this._height, style);\n }\n\n clearRect(rect: Rect, style?: CellStyle): void {\n const startX = Math.max(0, rect.x);\n const startY = Math.max(0, rect.y);\n const endX = Math.min(this._width, rect.x + Math.max(0, rect.width));\n const endY = Math.min(this._height, rect.y + Math.max(0, rect.height));\n const normalizedStyle = normalizeStyle(style);\n\n for (let y = startY; y < endY; y += 1) {\n for (let x = startX; x < endX; x += 1) {\n this._cells[this.index(x, y)] = { ch: \" \", style: normalizedStyle };\n }\n }\n }\n\n resize(width: number, height: number): void {\n const nextWidth = normalizeSize(width);\n const nextHeight = normalizeSize(height);\n const nextCells = createCells(nextWidth, nextHeight);\n const copyWidth = Math.min(this._width, nextWidth);\n const copyHeight = Math.min(this._height, nextHeight);\n\n for (let y = 0; y < copyHeight; y += 1) {\n for (let x = 0; x < copyWidth; x += 1) {\n nextCells[(y * nextWidth) + x] = cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n }\n\n this._width = nextWidth;\n this._height = nextHeight;\n this._cells = nextCells;\n }\n\n putInRect(rect: Rect, row: number, text: string, style?: CellStyle): void {\n if (row < 0 || row >= rect.height || text.length === 0 || rect.width <= 0) {\n return;\n }\n\n const y = rect.y + row;\n if (!this.isInBoundsY(y)) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n const rectEndX = rect.x + rect.width;\n let offset = 0;\n\n for (const ch of text) {\n const targetX = rect.x + offset;\n offset += 1;\n\n if (targetX >= rectEndX) {\n break;\n }\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n private index(x: number, y: number): number {\n return (y * this._width) + x;\n }\n\n private isInBounds(x: number, y: number): boolean {\n return this.isInBoundsX(x) && this.isInBoundsY(y);\n }\n\n private isInBoundsX(x: number): boolean {\n return x >= 0 && x < this._width;\n }\n\n private isInBoundsY(y: number): boolean {\n return y >= 0 && y < this._height;\n }\n}\n\nexport function diff(\n prev: ScreenBuffer,\n next: ScreenBuffer\n): Array<{ x: number; y: number; cell: Cell }> {\n const changes: Array<{ x: number; y: number; cell: Cell }> = [];\n const width = Math.max(prev.width, next.width);\n const height = Math.max(prev.height, next.height);\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const previousCell = prev.get(x, y);\n const nextCell = next.get(x, y);\n\n if (!cellsEqual(previousCell, nextCell)) {\n changes.push({ x, y, cell: nextCell });\n }\n }\n }\n\n return changes;\n}\n\nexport function cellToAnsi(cell: Cell): string {\n const style = cell.style ?? {};\n let painter = chalk;\n\n if (style.bold) {\n painter = painter.bold;\n }\n\n if (style.dim) {\n painter = painter.dim;\n }\n\n if (style.fg) {\n painter = applyForegroundColor(painter, style.fg);\n }\n\n if (style.bg) {\n painter = applyBackgroundColor(painter, style.bg);\n }\n\n return painter(cell.ch);\n}\n\nfunction createCells(width: number, height: number, style?: CellStyle): Cell[] {\n const normalizedStyle = normalizeStyle(style);\n return Array.from({ length: width * height }, () => ({ ch: \" \", style: normalizedStyle }));\n}\n\nfunction cloneCell(cell: Cell): Cell {\n return {\n ch: cell.ch,\n style: normalizeStyle(cell.style)\n };\n}\n\nfunction normalizeStyle(style?: CellStyle): CellStyle {\n const next: CellStyle = {};\n\n if (style?.fg !== undefined) {\n next.fg = style.fg;\n }\n\n if (style?.bg !== undefined) {\n next.bg = style.bg;\n }\n\n if (style?.bold !== undefined) {\n next.bold = style.bold;\n }\n\n if (style?.dim !== undefined) {\n next.dim = style.dim;\n }\n\n return next;\n}\n\nfunction normalizeSize(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction cellsEqual(left: Cell, right: Cell): boolean {\n return left.ch === right.ch\n && left.style.fg === right.style.fg\n && left.style.bg === right.style.bg\n && left.style.bold === right.style.bold\n && left.style.dim === right.style.dim;\n}\n\nfunction applyForegroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.hex(color);\n }\n\n const painter = (instance as unknown as Record<string, unknown>)[color];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n\nfunction applyBackgroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.bgHex(color);\n }\n\n const methodName = color.startsWith(\"bg\")\n ? color\n : `bg${color.charAt(0).toUpperCase()}${color.slice(1)}`;\n const painter = (instance as unknown as Record<string, unknown>)[methodName];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import chalk from \"chalk\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nexport { isCancel } from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2514\")} ${chalk.red(msg)}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { text } from \"../../components/text.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${text.intro(title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nfunction getVisibleWidth(value: string): number {\n return stripAnsi(value).length;\n}\n\nfunction renderTerminalNote(message: string, title?: string): string {\n const contentLines = [\"\", ...message.split(\"\\n\"), \"\"];\n const visibleTitle = stripAnsi(title ?? \"\");\n const contentWidth = Math.max(\n visibleTitle.length,\n ...contentLines.map((line) => getVisibleWidth(line))\n ) + 2;\n const titleLine = `${chalk.green(\"\u25C7\")} ${chalk.reset(title ?? \"\")} ${chalk.gray(\n `${\"\u2500\".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`\n )}`;\n const content = contentLines.map((line) => {\n const padding = \" \".repeat(contentWidth - getVisibleWidth(line));\n return `${chalk.gray(\"\u2502\")} ${line}${padding}${chalk.gray(\"\u2502\")}`;\n });\n const bottom = chalk.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [chalk.gray(\"\u2502\"), titleLine, ...content, bottom].join(\"\\n\");\n}\n\nexport function note(message: string, title?: string): void {\n const format = resolveOutputFormat();\n const strippedMessage = stripAnsi(message);\n const strippedTitle = stripAnsi(title ?? \"\");\n\n if (format === \"markdown\") {\n const lines = strippedMessage.split(\"\\n\");\n const heading = strippedTitle ? `> **${strippedTitle}**\\n` : \"\";\n const body = lines.map((line) => `> ${line}`).join(\"\\n\");\n process.stdout.write(`${heading}${body}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({\n type: \"note\",\n title: strippedTitle,\n message: strippedMessage\n })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${renderTerminalNote(message, title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function outro(message: string): void {\n const format = resolveOutputFormat();\n const stripped = stripAnsi(message);\n\n if (format === \"markdown\") {\n process.stdout.write(`---\\n${stripped}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"outro\", message: stripped })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2502\")}\\n${chalk.gray(\"\u2514\")} ${message}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\nimport { SPINNER_FRAMES } from \"../../static/spinner.js\";\n\nexport interface SpinnerOptions {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n}\n\nfunction writeTerminalFrame(frame: string, message: string): void {\n process.stdout.write(`\\r\\x1b[K${frame} ${message}`);\n}\n\nexport function spinner(): SpinnerOptions {\n let currentMessage = \"\";\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n let fallback = false;\n\n const format = resolveOutputFormat();\n\n const renderFrame = (): void => {\n writeTerminalFrame(SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length], currentMessage);\n };\n\n const clearTimer = (): void => {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n };\n\n return {\n start(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}...\\n`);\n return;\n }\n\n fallback = process.env.POE_NO_SPINNER === \"1\" || !process.stdout.isTTY;\n if (fallback) {\n process.stdout.write(`${currentMessage}\\n`);\n return;\n }\n\n frameIndex = 0;\n renderFrame();\n timer = setInterval(() => {\n frameIndex += 1;\n renderFrame();\n }, 16);\n },\n\n message(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format !== \"terminal\" || fallback || !timer) {\n return;\n }\n\n renderFrame();\n },\n\n stop(message = currentMessage, code?: number): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"spinner\", state: \"stopped\", message: currentMessage })}\\n`\n );\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}\\n`);\n return;\n }\n\n clearTimer();\n\n const symbol = code === undefined || code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n\n if (fallback) {\n process.stdout.write(`${symbol} ${currentMessage}\\n`);\n return;\n }\n\n process.stdout.write(`\\r\\x1b[K${symbol} ${currentMessage}\\n`);\n }\n };\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? chalk.green(\"\u25C6\") : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const format = resolveOutputFormat();\n const selectedIndex = opts.selectedIndex ?? 0;\n\n if (format === \"markdown\") {\n return [\n `**${opts.message}**`,\n ...opts.options.map(\n (option, index) => `- [${index === selectedIndex ? \"x\" : \" \"}] ${option.label}`\n )\n ].join(\"\\n\");\n }\n\n if (format === \"json\") {\n return JSON.stringify({\n type: \"menu\",\n message: opts.message,\n options: opts.options,\n selected: selectedIndex\n });\n }\n\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { renderAcpStream } from \"./acp/renderer.js\";\nimport type { AcpEvent } from \"./acp/types.js\";\nimport { isActivityTimeoutError } from \"./spawn.js\";\n\nconst DEFAULT_ACTIVITY_TIMEOUT_MS = 10 * 60 * 1000;\nconst DEFAULT_MAX_TIMEOUT_RETRIES = 3;\n\nexport interface StreamingSpawnReturn<TResult> {\n events: AsyncIterable<AcpEvent>;\n result: Promise<TResult>;\n}\n\nexport type StreamingSpawnFn<TOptions, TResult> = (\n service: string,\n options: TOptions\n) => StreamingSpawnReturn<TResult>;\n\nexport type AutonomousOptions<TOptions> = TOptions & {\n service: string;\n maxTimeoutRetries?: number;\n activityTimeoutMs?: number;\n};\n\n/**\n * Drive a streaming spawn end-to-end: pipe ACP events through `renderAcpStream`\n * (which routes through `withAcpWriter` if bound) and return the final result.\n * Retries on activity timeout up to `maxTimeoutRetries` attempts.\n *\n * Both the SDK `spawn.autonomous` and the superintendent loop consume this \u2014\n * callers supply a streaming spawn function whose `result` promise resolves\n * to their own result shape.\n */\nexport async function spawnAutonomous<\n TOptions extends { activityTimeoutMs?: number },\n TResult\n>(\n streamSpawn: StreamingSpawnFn<TOptions, TResult>,\n options: AutonomousOptions<TOptions>\n): Promise<TResult> {\n const {\n service,\n maxTimeoutRetries = DEFAULT_MAX_TIMEOUT_RETRIES,\n activityTimeoutMs = DEFAULT_ACTIVITY_TIMEOUT_MS,\n ...rest\n } = options;\n\n const spawnOptions = { ...rest, activityTimeoutMs } as unknown as TOptions;\n\n for (let attempt = 1; attempt <= maxTimeoutRetries; attempt += 1) {\n let result: Promise<TResult> | undefined;\n try {\n const stream = streamSpawn(service, spawnOptions);\n result = stream.result;\n // Attach to the final result immediately so a failed attempt can retry\n // without hanging behind ACP rendering that is still flushing.\n const [spawnResult] = await Promise.all([\n result,\n renderAcpStream(stream.events)\n ]);\n return spawnResult;\n } catch (error) {\n result?.catch(() => {});\n if (!isActivityTimeoutError(error) || attempt === maxTimeoutRetries) {\n throw error;\n }\n }\n }\n\n throw new Error(\"Unreachable\");\n}\n", "import path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Dirent } from \"node:fs\";\nimport { open, readdir } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline\";\nimport type { SessionUpdate } from \"@poe-code/poe-acp-client\";\nimport { mapLegacyEventToSessionUpdates } from \"@poe-code/poe-acp-client\";\nimport { renderSessionUpdateStream } from \"./renderer.js\";\nimport type { AcpEvent } from \"./types.js\";\n\nconst DEFAULT_LOG_LIMIT = 80;\nconst JSONL_EXTENSION = \".jsonl\";\n\nexport interface LogEntry {\n path: string;\n filename: string;\n agent?: string;\n timestamp?: Date;\n}\n\ninterface ListSpawnLogsOptions {\n agent?: string;\n limit?: number;\n}\n\nfunction isDigitString(value: string, length: number): boolean {\n if (value.length !== length) return false;\n for (const char of value) {\n if (char < \"0\" || char > \"9\") return false;\n }\n return true;\n}\n\nfunction parseTimestamp(day: string, time: string, milliseconds: string): Date | undefined {\n if (!isDigitString(day, 8) || !isDigitString(time, 6) || !isDigitString(milliseconds, 3)) {\n return undefined;\n }\n\n const year = Number(day.slice(0, 4));\n const month = Number(day.slice(4, 6));\n const date = Number(day.slice(6, 8));\n const hours = Number(time.slice(0, 2));\n const minutes = Number(time.slice(2, 4));\n const seconds = Number(time.slice(4, 6));\n const millis = Number(milliseconds);\n\n const timestamp = new Date(Date.UTC(year, month - 1, date, hours, minutes, seconds, millis));\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp.getUTCFullYear() !== year ||\n timestamp.getUTCMonth() !== month - 1 ||\n timestamp.getUTCDate() !== date ||\n timestamp.getUTCHours() !== hours ||\n timestamp.getUTCMinutes() !== minutes ||\n timestamp.getUTCSeconds() !== seconds ||\n timestamp.getUTCMilliseconds() !== millis\n ) {\n return undefined;\n }\n\n return timestamp;\n}\n\nfunction parseLogFilename(filename: string): { agent?: string; timestamp?: Date } {\n if (!filename.endsWith(JSONL_EXTENSION)) return {};\n\n const baseName = filename.slice(0, -JSONL_EXTENSION.length);\n const parts = baseName.split(\"-\");\n\n if (parts.length < 4) return {};\n\n const timestamp = parseTimestamp(parts[0], parts[1], parts[2]);\n const agent = parts.slice(3).join(\"-\");\n\n return {\n agent: agent.length > 0 ? agent : undefined,\n timestamp\n };\n}\n\nfunction normalizeLimit(limit: number | undefined): number {\n if (typeof limit !== \"number\" || !Number.isFinite(limit) || limit < 0) {\n return DEFAULT_LOG_LIMIT;\n }\n return Math.floor(limit);\n}\n\nfunction isSessionUpdate(parsed: unknown): parsed is SessionUpdate {\n return (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"sessionUpdate\" in parsed &&\n typeof (parsed as Record<string, unknown>).sessionUpdate === \"string\"\n );\n}\n\nfunction isLegacyEvent(parsed: unknown): parsed is AcpEvent {\n return (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"event\" in parsed &&\n typeof (parsed as Record<string, unknown>).event === \"string\"\n );\n}\n\nexport async function* readSpawnLog(filePath: string): AsyncIterable<SessionUpdate> {\n const fileHandle = await open(filePath, \"r\");\n const stream = fileHandle.createReadStream({ encoding: \"utf8\" });\n const reader = createInterface({\n input: stream,\n crlfDelay: Infinity\n });\n\n try {\n for await (const line of reader) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n\n const parsed: unknown = JSON.parse(trimmed);\n\n if (isSessionUpdate(parsed)) {\n yield parsed;\n continue;\n }\n\n if (isLegacyEvent(parsed)) {\n for (const update of mapLegacyEventToSessionUpdates(parsed as { event: string } & Record<string, unknown>)) {\n yield update;\n }\n }\n }\n } finally {\n reader.close();\n if (!stream.destroyed) {\n stream.destroy();\n }\n await fileHandle.close().catch(() => {});\n }\n}\n\nexport async function listSpawnLogs(options: ListSpawnLogsOptions = {}): Promise<LogEntry[]> {\n const logDir = path.join(homedir(), \".poe-code\", \"spawn-logs\");\n const limit = normalizeLimit(options.limit);\n\n let entries: Dirent[];\n try {\n entries = await readdir(logDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n }\n\n const logs: LogEntry[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(JSONL_EXTENSION)) continue;\n\n const logEntry: LogEntry = {\n path: path.join(logDir, entry.name),\n filename: entry.name,\n ...parseLogFilename(entry.name)\n };\n\n if (options.agent && logEntry.agent !== options.agent) continue;\n\n logs.push(logEntry);\n }\n\n logs.sort((a, b) => (a.filename < b.filename ? 1 : a.filename > b.filename ? -1 : 0));\n return logs.slice(0, limit);\n}\n\nexport async function findLatestLog(agent?: string): Promise<string | undefined> {\n const [entry] = await listSpawnLogs({ agent, limit: 1 });\n return entry?.path;\n}\n\nexport async function pickRandomLog(agent?: string): Promise<string | undefined> {\n const entries = await listSpawnLogs({ agent });\n if (entries.length === 0) return undefined;\n return entries[Math.floor(Math.random() * entries.length)]?.path;\n}\n\nexport async function replaySpawnLog(filePath: string): Promise<void> {\n await renderSessionUpdateStream(readSpawnLog(filePath));\n}\n", "import { isAbsolute } from \"node:path\";\nimport {\n AcpTransport,\n type AcpTransportClosedEvent,\n type AcpTransportOptions,\n} from \"./acp-transport.js\";\nimport type { JsonRpcRequestOptions } from \"./jsonrpc-message-layer.js\";\nimport {\n ACP_ERROR_CODE_INVALID_PARAMS,\n ACP_ERROR_CODE_RESOURCE_NOT_FOUND,\n AcpError,\n type AgentCapabilities,\n type AuthenticateResponse,\n type AuthMethod,\n type CancelNotification,\n type ClientCapabilities,\n type ContentBlock,\n type CreateTerminalRequest,\n type CreateTerminalResponse,\n type EnvVariable,\n type Implementation,\n type InitializeResponse,\n type KillTerminalCommandRequest,\n type KillTerminalCommandResponse,\n type LoadSessionResponse,\n type McpServer,\n type NewSessionResponse,\n type PermissionOption,\n type PromptResponse,\n type RequestId,\n type SessionConfigId,\n type SessionConfigOption,\n type SessionConfigValueId,\n type RequestPermissionOutcome,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n type ProtocolVersion,\n type SessionModeId,\n type SessionNotification,\n type SessionId,\n type SetSessionModeResponse,\n type SessionUpdateNotification,\n type ToolCallUpdate,\n type TerminalOutputRequest,\n type TerminalOutputResponse,\n type WaitForTerminalExitRequest,\n type WaitForTerminalExitResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n type ReleaseTerminalRequest,\n type ReleaseTerminalResponse,\n} from \"./types.js\";\n\nexport type AcpClientState = \"uninitialized\" | \"initialized\" | \"ready\";\ntype ExtensionMethod = `_${string}`;\n\nexport interface PromptTurn extends AsyncIterable<SessionUpdateNotification> {\n response: Promise<PromptResponse>;\n}\n\ninterface AsyncQueue<T> extends AsyncIterable<T>, AsyncIterator<T> {\n push(value: T): void;\n complete(): void;\n fail(error: Error): void;\n}\n\nexport interface AcpClientFsHandler {\n readTextFile?: (args: {\n sessionId: SessionId;\n path: string;\n line?: number | null;\n limit?: number | null;\n }) => string | Promise<string>;\n writeTextFile?: (args: {\n sessionId: SessionId;\n path: string;\n content: string;\n }) => void | Promise<void>;\n}\n\nexport interface AcpClientTerminalHandler {\n create: (args: {\n sessionId: SessionId;\n command: string;\n args?: string[];\n cwd?: string | null;\n env?: EnvVariable[];\n outputByteLimit?: number | null;\n }) => string | Promise<string>;\n output: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => TerminalOutputResponse | Promise<TerminalOutputResponse>;\n waitForExit: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => WaitForTerminalExitResponse | Promise<WaitForTerminalExitResponse>;\n kill: (args: { sessionId: SessionId; terminalId: string }) => void | Promise<void>;\n release: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => void | Promise<void>;\n}\n\ntype AcpClientPermissionHandler = (args: {\n toolCall: ToolCallUpdate;\n options: PermissionOption[];\n}) => RequestPermissionOutcome | Promise<RequestPermissionOutcome>;\n\nexport interface AcpClientHandlers {\n permission?: AcpClientPermissionHandler;\n fs?: AcpClientFsHandler;\n terminal?: AcpClientTerminalHandler;\n}\n\ntype AcpClientTransport = Pick<\n AcpTransport,\n \"sendRequest\" | \"sendNotification\" | \"onRequest\" | \"onNotification\"\n> &\n Partial<Pick<AcpTransport, \"dispose\" | \"closed\">>;\n\ninterface AcpClientSharedOptions {\n protocolVersion?: ProtocolVersion;\n clientCapabilities?: ClientCapabilities;\n clientInfo?: Implementation | null;\n handlers?: AcpClientHandlers;\n permissionHandler?: AcpClientPermissionHandler;\n fsHandler?: AcpClientFsHandler;\n terminalHandler?: AcpClientTerminalHandler;\n skipAuth?: boolean;\n /**\n * Automatically approve all permission requests (selects the first\n * \"allow_always\" or \"allow_once\" option). Ignored when a custom\n * `permissionHandler` is provided.\n */\n autoApprove?: boolean;\n}\n\nexport interface AcpClientProcessOptions extends AcpClientSharedOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n firstRequestId?: number;\n spawn?: AcpTransportOptions[\"spawn\"];\n}\n\nexport interface AcpClientInjectedTransportOptions extends AcpClientSharedOptions {\n transport: AcpClientTransport;\n}\n\nexport type AcpClientOptions = AcpClientProcessOptions | AcpClientInjectedTransportOptions;\n\nfunction toError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason));\n}\n\nfunction invalidParams(message: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_INVALID_PARAMS,\n `Invalid params: ${message}`\n );\n}\n\nfunction resourceNotFound(resource: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_RESOURCE_NOT_FOUND,\n `Resource not found: ${resource}`\n );\n}\n\nfunction assertAbsolutePath(path: string): void {\n if (!isAbsolute(path)) {\n throw invalidParams('\"path\" must be an absolute path');\n }\n}\n\nfunction assertOneBasedLineNumber(line: number | null | undefined): void {\n if (line === null || line === undefined) {\n return;\n }\n\n if (!Number.isInteger(line) || line < 1) {\n throw invalidParams('\"line\" must be a 1-based integer');\n }\n}\n\nfunction assertExtensionMethod(method: string): asserts method is ExtensionMethod {\n if (!method.startsWith(\"_\")) {\n throw new Error('Extension method must start with \"_\"');\n }\n}\n\nfunction isInjectedTransportOptions(\n options: AcpClientOptions\n): options is AcpClientInjectedTransportOptions {\n return \"transport\" in options;\n}\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: Error) => void;\n }> = [];\n let closed = false;\n let failure: Error | null = null;\n\n const resolveOne = (value: T): boolean => {\n const waiter = waiters.shift();\n if (!waiter) {\n return false;\n }\n\n waiter.resolve({ done: false, value });\n return true;\n };\n\n const iterator: AsyncQueue<T> = {\n push(value: T): void {\n if (closed || failure) {\n return;\n }\n\n if (!resolveOne(value)) {\n values.push(value);\n }\n },\n complete(): void {\n if (closed || failure) {\n return;\n }\n\n closed = true;\n while (waiters.length > 0) {\n waiters.shift()?.resolve({ done: true, value: undefined });\n }\n },\n fail(error: Error): void {\n if (closed || failure) {\n return;\n }\n\n failure = error;\n while (waiters.length > 0) {\n waiters.shift()?.reject(error);\n }\n },\n async next(): Promise<IteratorResult<T>> {\n if (values.length > 0) {\n const value = values.shift() as T;\n return { done: false, value };\n }\n\n if (failure) {\n throw failure;\n }\n\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n async return(): Promise<IteratorResult<T>> {\n iterator.complete();\n return { done: true, value: undefined };\n },\n async throw(error: unknown): Promise<IteratorResult<T>> {\n const normalizedError = toError(error);\n iterator.fail(normalizedError);\n throw normalizedError;\n },\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n\nexport class AcpClient {\n private readonly transport: AcpClientTransport;\n private readonly clientProtocolVersion: ProtocolVersion;\n private clientCapabilities?: ClientCapabilities;\n private readonly clientInfo?: Implementation | null;\n private readonly skipAuth: boolean;\n private readonly permissionHandler?: AcpClientPermissionHandler;\n private readonly fsHandler?: AcpClientFsHandler;\n private readonly terminalHandler?: AcpClientTerminalHandler;\n private readonly activePromptUpdates = new Map<\n SessionId,\n AsyncQueue<SessionUpdateNotification>\n >();\n private readonly trackedTerminalIds = new Map<SessionId, Set<string>>();\n private hasRegisteredFsReadHandler = false;\n private hasRegisteredFsWriteHandler = false;\n private hasRegisteredTerminalHandlers = false;\n private disposed = false;\n\n private lifecycleState: AcpClientState = \"uninitialized\";\n private negotiatedVersion: ProtocolVersion | null = null;\n private availableAuthMethods: AuthMethod[] = [];\n private negotiatedAgentCapabilities: AgentCapabilities | undefined;\n private negotiatedAgentInfo: Implementation | null | undefined;\n\n constructor(options: AcpClientOptions) {\n this.transport = isInjectedTransportOptions(options)\n ? options.transport\n : new AcpTransport({\n command: options.command,\n args: options.args,\n cwd: options.cwd,\n env: options.env,\n firstRequestId: options.firstRequestId,\n spawn: options.spawn,\n });\n this.clientProtocolVersion = options.protocolVersion ?? 1;\n this.clientCapabilities = options.clientCapabilities;\n this.clientInfo = options.clientInfo;\n this.skipAuth = options.skipAuth ?? false;\n this.permissionHandler = options.handlers?.permission ?? options.permissionHandler;\n this.fsHandler = options.handlers?.fs ?? options.fsHandler;\n this.terminalHandler = options.handlers?.terminal ?? options.terminalHandler;\n\n const autoApprove = options.autoApprove === true && !this.permissionHandler;\n\n this.transport.onRequest(\n \"session/request_permission\",\n async (params: RequestPermissionRequest): Promise<RequestPermissionResponse> => {\n if (this.permissionHandler) {\n const outcome = await this.permissionHandler({\n toolCall: params.toolCall,\n options: params.options,\n });\n return { outcome };\n }\n\n if (autoApprove) {\n const allow =\n params.options.find((o: PermissionOption) => o.kind === \"allow_always\") ??\n params.options.find((o: PermissionOption) => o.kind === \"allow_once\");\n if (allow) {\n return { outcome: { outcome: \"selected\", optionId: allow.optionId } };\n }\n }\n\n return { outcome: { outcome: \"cancelled\" } };\n }\n );\n\n this.registerCapabilityHandlers(this.clientCapabilities);\n\n this.transport.onNotification(\"session/update\", (params: SessionNotification) => {\n this.handleSessionUpdateNotification(params);\n });\n }\n\n get state(): AcpClientState {\n return this.lifecycleState;\n }\n\n get negotiatedProtocolVersion(): ProtocolVersion | null {\n return this.negotiatedVersion;\n }\n\n get authMethods(): AuthMethod[] {\n return [...this.availableAuthMethods];\n }\n\n get agentCapabilities(): AgentCapabilities | undefined {\n return this.negotiatedAgentCapabilities;\n }\n\n get agentInfo(): Implementation | null | undefined {\n return this.negotiatedAgentInfo;\n }\n\n get closed(): Promise<AcpTransportClosedEvent> | undefined {\n return this.transport.closed;\n }\n\n async initialize(clientCapabilities?: ClientCapabilities): Promise<InitializeResponse> {\n if (this.lifecycleState !== \"uninitialized\") {\n throw new Error(\"initialize() can only be called once.\");\n }\n\n if (clientCapabilities !== undefined) {\n this.clientCapabilities = clientCapabilities;\n this.registerCapabilityHandlers(clientCapabilities);\n }\n\n const response = await this.transport.sendRequest(\"initialize\", {\n protocolVersion: this.clientProtocolVersion,\n clientInfo: this.clientInfo,\n clientCapabilities: this.clientCapabilities,\n });\n\n const negotiatedProtocolVersion = Math.min(\n this.clientProtocolVersion,\n response.protocolVersion\n );\n\n this.negotiatedVersion = negotiatedProtocolVersion;\n this.negotiatedAgentCapabilities = response.agentCapabilities;\n this.negotiatedAgentInfo = response.agentInfo;\n this.availableAuthMethods = response.authMethods ? [...response.authMethods] : [];\n\n const requiresAuth = this.availableAuthMethods.length > 0 && !this.skipAuth;\n this.lifecycleState = requiresAuth ? \"initialized\" : \"ready\";\n\n return {\n protocolVersion: negotiatedProtocolVersion,\n ...(this.negotiatedAgentCapabilities !== undefined\n ? { agentCapabilities: this.negotiatedAgentCapabilities }\n : {}),\n ...(this.negotiatedAgentInfo !== undefined ? { agentInfo: this.negotiatedAgentInfo } : {}),\n ...(this.availableAuthMethods.length > 0 ? { authMethods: this.authMethods } : {}),\n };\n }\n\n async authenticate(methodId: string): Promise<AuthenticateResponse> {\n if (this.lifecycleState === \"uninitialized\") {\n throw new Error(\"Cannot authenticate before initialize().\");\n }\n\n if (this.lifecycleState === \"ready\") {\n throw new Error(\"Authentication is not required for this agent.\");\n }\n\n if (!this.availableAuthMethods.some((authMethod) => authMethod.id === methodId)) {\n throw new Error(`Unknown auth method \"${methodId}\".`);\n }\n\n const response = await this.transport.sendRequest(\"authenticate\", {\n methodId,\n });\n\n this.lifecycleState = \"ready\";\n return response;\n }\n\n async newSession(cwd: string, mcpServers: McpServer[]): Promise<NewSessionResponse> {\n this.assertReady(\"session/new\");\n this.assertMcpServerCapabilitySupport(mcpServers);\n\n return this.transport.sendRequest(\"session/new\", {\n cwd,\n mcpServers,\n });\n }\n\n async loadSession(\n sessionId: SessionId,\n cwd: string,\n mcpServers: McpServer[]\n ): Promise<LoadSessionResponse> {\n this.assertReady(\"session/load\");\n if (this.negotiatedAgentCapabilities?.loadSession !== true) {\n throw new Error(\n 'Cannot call \"session/load\" because the agent does not support session loading.'\n );\n }\n this.assertMcpServerCapabilitySupport(mcpServers);\n\n return this.transport.sendRequest(\"session/load\", {\n sessionId,\n cwd,\n mcpServers,\n });\n }\n\n async cancelSession(sessionId: SessionId): Promise<void> {\n this.assertReady(\"session/cancel\");\n const payload: CancelNotification = { sessionId };\n this.transport.sendNotification(\"session/cancel\", payload);\n }\n\n async setMode(\n sessionId: SessionId,\n modeId: SessionModeId\n ): Promise<SetSessionModeResponse> {\n this.assertReady(\"session/set_mode\");\n return this.transport.sendRequest(\"session/set_mode\", {\n sessionId,\n modeId,\n });\n }\n\n async setConfigOption(\n sessionId: SessionId,\n configId: SessionConfigId,\n value: SessionConfigValueId\n ): Promise<SessionConfigOption[]> {\n this.assertReady(\"session/set_config_option\");\n const response = await this.transport.sendRequest(\"session/set_config_option\", {\n sessionId,\n configId,\n value,\n });\n\n return response.configOptions;\n }\n\n prompt(sessionId: SessionId, content: ContentBlock[]): PromptTurn {\n this.assertReady(\"session/prompt\");\n this.assertPromptContentCapabilitySupport(content);\n\n if (this.activePromptUpdates.has(sessionId)) {\n throw new Error(\n `Cannot call \"session/prompt\" while another prompt is in progress for session \"${sessionId}\".`\n );\n }\n\n const updates = createAsyncQueue<SessionUpdateNotification>();\n this.activePromptUpdates.set(sessionId, updates);\n\n let requestPromise: Promise<PromptResponse>;\n try {\n requestPromise = this.transport.sendRequest(\"session/prompt\", {\n sessionId,\n prompt: content,\n });\n } catch (error) {\n const normalizedError = toError(error);\n this.activePromptUpdates.delete(sessionId);\n updates.fail(normalizedError);\n throw normalizedError;\n }\n\n const response = requestPromise\n .then((promptResponse) => {\n this.activePromptUpdates.delete(sessionId);\n updates.complete();\n return promptResponse;\n })\n .catch((error) => {\n const normalizedError = toError(error);\n this.activePromptUpdates.delete(sessionId);\n updates.fail(normalizedError);\n throw normalizedError;\n });\n\n return {\n response,\n [Symbol.asyncIterator](): AsyncIterator<SessionUpdateNotification> {\n return updates;\n },\n };\n }\n\n async sendExtRequest<TResult = unknown>(\n method: ExtensionMethod,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n async sendExtRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<TResult> {\n assertExtensionMethod(method);\n return this.transport.sendRequest(method, params, options) as Promise<TResult>;\n }\n\n async sendExtNotification(method: ExtensionMethod, params?: unknown): Promise<void>;\n async sendExtNotification(method: string, params?: unknown): Promise<void> {\n assertExtensionMethod(method);\n this.transport.sendNotification(method, params);\n }\n\n onExtRequest<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (\n params: unknown,\n context: { id: RequestId; method: TMethod }\n ) => unknown | Promise<unknown>\n ): void;\n onExtRequest(\n method: string,\n handler: (params: unknown, context: { id: RequestId; method: string }) => unknown\n ): void {\n assertExtensionMethod(method);\n this.transport.onRequest(method, handler);\n }\n\n onExtNotification<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (params: unknown, context: { method: TMethod }) => void | Promise<void>\n ): void;\n onExtNotification(\n method: string,\n handler: (params: unknown, context: { method: string }) => void | Promise<void>\n ): void {\n assertExtensionMethod(method);\n this.transport.onNotification(method, handler);\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) {\n if (this.transport.closed) {\n await this.transport.closed;\n }\n return;\n }\n\n this.disposed = true;\n const disposeReason = new Error(\"ACP client disposed\");\n for (const updates of this.activePromptUpdates.values()) {\n updates.fail(disposeReason);\n }\n this.activePromptUpdates.clear();\n\n if (typeof this.transport.dispose === \"function\") {\n this.transport.dispose(disposeReason);\n }\n\n if (this.transport.closed) {\n await this.transport.closed;\n }\n }\n\n assertReady(operation: string): void {\n if (this.lifecycleState === \"ready\") {\n return;\n }\n\n if (this.lifecycleState === \"uninitialized\") {\n throw new Error(`Cannot call \"${operation}\" before initialize().`);\n }\n\n throw new Error(`Cannot call \"${operation}\" before authentication completes.`);\n }\n\n private registerCapabilityHandlers(capabilities: ClientCapabilities | undefined): void {\n if (\n !this.hasRegisteredFsReadHandler &&\n capabilities?.fs?.readTextFile === true &&\n this.fsHandler?.readTextFile\n ) {\n const readTextFile = this.fsHandler.readTextFile;\n this.transport.onRequest(\n \"fs/read_text_file\",\n async (params: ReadTextFileRequest): Promise<ReadTextFileResponse> => {\n assertAbsolutePath(params.path);\n assertOneBasedLineNumber(params.line);\n\n const content = await readTextFile({\n sessionId: params.sessionId,\n path: params.path,\n line: params.line,\n limit: params.limit,\n });\n return { content };\n }\n );\n this.hasRegisteredFsReadHandler = true;\n }\n\n if (\n !this.hasRegisteredFsWriteHandler &&\n capabilities?.fs?.writeTextFile === true &&\n this.fsHandler?.writeTextFile\n ) {\n const writeTextFile = this.fsHandler.writeTextFile;\n this.transport.onRequest(\n \"fs/write_text_file\",\n async (params: WriteTextFileRequest): Promise<WriteTextFileResponse> => {\n assertAbsolutePath(params.path);\n\n await writeTextFile({\n sessionId: params.sessionId,\n path: params.path,\n content: params.content,\n });\n\n return {};\n }\n );\n this.hasRegisteredFsWriteHandler = true;\n }\n\n if (\n !this.hasRegisteredTerminalHandlers &&\n capabilities?.terminal === true &&\n this.terminalHandler\n ) {\n const terminalHandler = this.terminalHandler;\n this.transport.onRequest(\n \"terminal/create\",\n async (params: CreateTerminalRequest): Promise<CreateTerminalResponse> => {\n const terminalId = await terminalHandler.create({\n sessionId: params.sessionId,\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n outputByteLimit: params.outputByteLimit,\n });\n this.trackTerminal(params.sessionId, terminalId);\n\n return { terminalId };\n }\n );\n\n this.transport.onRequest(\n \"terminal/output\",\n async (params: TerminalOutputRequest): Promise<TerminalOutputResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n return terminalHandler.output({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n }\n );\n\n this.transport.onRequest(\n \"terminal/wait_for_exit\",\n async (params: WaitForTerminalExitRequest): Promise<WaitForTerminalExitResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n return terminalHandler.waitForExit({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n }\n );\n\n this.transport.onRequest(\n \"terminal/kill\",\n async (params: KillTerminalCommandRequest): Promise<KillTerminalCommandResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n await terminalHandler.kill({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n\n return {};\n }\n );\n\n this.transport.onRequest(\n \"terminal/release\",\n async (params: ReleaseTerminalRequest): Promise<ReleaseTerminalResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n await terminalHandler.release({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n this.untrackTerminal(params.sessionId, params.terminalId);\n\n return {};\n }\n );\n this.hasRegisteredTerminalHandlers = true;\n }\n }\n\n private assertMcpServerCapabilitySupport(mcpServers: McpServer[]): void {\n const mcpCapabilities = this.negotiatedAgentCapabilities?.mcpCapabilities;\n\n for (const mcpServer of mcpServers) {\n if (!(\"type\" in mcpServer)) {\n continue;\n }\n\n if (mcpServer.type === \"http\" && mcpCapabilities?.http !== true) {\n throw new Error('Agent does not support MCP server type \"http\".');\n }\n\n if (mcpServer.type === \"sse\" && mcpCapabilities?.sse !== true) {\n throw new Error('Agent does not support MCP server type \"sse\".');\n }\n }\n }\n\n private handleSessionUpdateNotification(notification: SessionNotification): void {\n const activePrompt = this.activePromptUpdates.get(notification.sessionId);\n if (!activePrompt) {\n return;\n }\n\n activePrompt.push({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n }\n\n private trackTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (sessionTerminals) {\n sessionTerminals.add(terminalId);\n return;\n }\n\n this.trackedTerminalIds.set(sessionId, new Set([terminalId]));\n }\n\n private assertKnownTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (sessionTerminals?.has(terminalId) === true) {\n return;\n }\n\n throw resourceNotFound(`terminal \"${terminalId}\"`);\n }\n\n private untrackTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (!sessionTerminals) {\n return;\n }\n\n sessionTerminals.delete(terminalId);\n if (sessionTerminals.size === 0) {\n this.trackedTerminalIds.delete(sessionId);\n }\n }\n\n private assertPromptContentCapabilitySupport(content: ContentBlock[]): void {\n const promptCapabilities = this.negotiatedAgentCapabilities?.promptCapabilities;\n\n for (const block of content) {\n if (block.type === \"image\" && promptCapabilities?.image !== true) {\n throw new Error('Agent does not support prompt content type \"image\".');\n }\n\n if (block.type === \"audio\" && promptCapabilities?.audio !== true) {\n throw new Error('Agent does not support prompt content type \"audio\".');\n }\n\n if (block.type === \"resource\" && promptCapabilities?.embeddedContext !== true) {\n throw new Error('Agent does not support prompt content type \"resource\".');\n }\n }\n }\n}\n", "import {\n spawn as spawnChildProcess,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"node:child_process\";\nimport {\n JsonRpcMessageLayer,\n type JsonRpcNotificationHandler,\n type JsonRpcRequestHandler,\n type JsonRpcRequestOptions,\n} from \"./jsonrpc-message-layer.js\";\nimport type {\n AuthenticateRequest,\n AuthenticateResponse,\n CancelNotification,\n CreateTerminalRequest,\n CreateTerminalResponse,\n InitializeRequest,\n InitializeResponse,\n KillTerminalCommandRequest,\n KillTerminalCommandResponse,\n LoadSessionRequest,\n LoadSessionResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n RequestId,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SetSessionConfigOptionRequest,\n SetSessionConfigOptionResponse,\n SetSessionModeRequest,\n SetSessionModeResponse,\n TerminalOutputRequest,\n TerminalOutputResponse,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"./types.js\";\n\ninterface AcpRequestShape<TParams, TResult> {\n params: TParams;\n result: TResult;\n}\n\nexport interface AcpAgentRequestMap {\n initialize: AcpRequestShape<InitializeRequest, InitializeResponse>;\n authenticate: AcpRequestShape<AuthenticateRequest, AuthenticateResponse>;\n \"session/new\": AcpRequestShape<NewSessionRequest, NewSessionResponse>;\n \"session/load\": AcpRequestShape<LoadSessionRequest, LoadSessionResponse>;\n \"session/prompt\": AcpRequestShape<PromptRequest, PromptResponse>;\n \"session/set_mode\": AcpRequestShape<SetSessionModeRequest, SetSessionModeResponse>;\n \"session/set_config_option\": AcpRequestShape<\n SetSessionConfigOptionRequest,\n SetSessionConfigOptionResponse\n >;\n}\n\nexport interface AcpAgentNotificationMap {\n \"session/cancel\": CancelNotification;\n}\n\nexport interface AcpClientRequestMap {\n \"session/request_permission\": AcpRequestShape<\n RequestPermissionRequest,\n RequestPermissionResponse\n >;\n \"fs/read_text_file\": AcpRequestShape<ReadTextFileRequest, ReadTextFileResponse>;\n \"fs/write_text_file\": AcpRequestShape<WriteTextFileRequest, WriteTextFileResponse>;\n \"terminal/create\": AcpRequestShape<CreateTerminalRequest, CreateTerminalResponse>;\n \"terminal/output\": AcpRequestShape<TerminalOutputRequest, TerminalOutputResponse>;\n \"terminal/wait_for_exit\": AcpRequestShape<\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse\n >;\n \"terminal/kill\": AcpRequestShape<\n KillTerminalCommandRequest,\n KillTerminalCommandResponse\n >;\n \"terminal/release\": AcpRequestShape<ReleaseTerminalRequest, ReleaseTerminalResponse>;\n}\n\nexport interface AcpClientNotificationMap {\n \"session/update\": SessionNotification;\n}\n\ntype ExtensionMethod = `_${string}`;\n\nfunction assertExtensionMethod(method: string): asserts method is ExtensionMethod {\n if (!method.startsWith(\"_\")) {\n throw new Error('Extension method must start with \"_\"');\n }\n}\n\ntype SpawnFunction = (\n command: string,\n args?: ReadonlyArray<string>,\n options?: SpawnOptionsWithoutStdio\n) => ChildProcessWithoutNullStreams;\n\nexport interface AcpTransportOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n firstRequestId?: number;\n spawn?: SpawnFunction;\n}\n\nexport interface AcpTransportClosedEvent {\n code: number | null;\n signal: NodeJS.Signals | null;\n reason: Error;\n stderr: string;\n}\n\nexport class AcpTransport {\n readonly closed: Promise<AcpTransportClosedEvent>;\n\n private readonly command: string;\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly layer: JsonRpcMessageLayer;\n private readonly stderrChunks: string[] = [];\n private resolveClosed: ((value: AcpTransportClosedEvent) => void) | null = null;\n private closeEvent: AcpTransportClosedEvent | null = null;\n private closeReason: Error | null = null;\n\n constructor(options: AcpTransportOptions) {\n const {\n command,\n args = [],\n cwd,\n env,\n firstRequestId,\n spawn = spawnChildProcess,\n } = options;\n\n this.command = command;\n this.closed = new Promise<AcpTransportClosedEvent>((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.child = spawn(command, [...args], {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n this.child.stderr.setEncoding(\"utf8\");\n this.child.stderr.on(\"data\", (chunk) => {\n this.stderrChunks.push(String(chunk));\n });\n\n this.child.stdin.on(\"error\", (error) => {\n const reason = error instanceof Error ? error : new Error(String(error));\n this.close(reason, this.child.exitCode ?? null, this.child.signalCode ?? null);\n });\n\n this.layer = new JsonRpcMessageLayer({\n input: this.child.stdout,\n output: this.child.stdin,\n firstRequestId,\n });\n\n this.child.once(\"error\", (error) => {\n const reason = error instanceof Error ? error : new Error(String(error));\n this.close(reason, this.child.exitCode ?? null, this.child.signalCode ?? null);\n });\n\n this.child.once(\"close\", (code, signal) => {\n const reason =\n this.closeReason ??\n new Error(\n `ACP transport closed (command \"${this.command}\", code: ${code ?? \"null\"}${\n signal ? `, signal: ${signal}` : \"\"\n })`\n );\n this.close(reason, code ?? null, signal ?? null);\n });\n }\n\n sendRequest<TMethod extends keyof AcpAgentRequestMap>(\n method: TMethod,\n params: AcpAgentRequestMap[TMethod][\"params\"],\n options?: JsonRpcRequestOptions\n ): Promise<AcpAgentRequestMap[TMethod][\"result\"]>;\n sendRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n return this.layer.sendRequest(method, params, options);\n }\n\n sendExtRequest<TResult = unknown>(\n method: ExtensionMethod,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n sendExtRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<TResult> {\n assertExtensionMethod(method);\n return this.layer.sendRequest(method, params, options) as Promise<TResult>;\n }\n\n sendNotification<TMethod extends keyof AcpAgentNotificationMap>(\n method: TMethod,\n params: AcpAgentNotificationMap[TMethod]\n ): void;\n sendNotification(method: string, params?: unknown): void;\n sendNotification(method: string, params?: unknown): void {\n this.layer.sendNotification(method, params);\n }\n\n sendExtNotification(method: ExtensionMethod, params?: unknown): void;\n sendExtNotification(method: string, params?: unknown): void;\n sendExtNotification(method: string, params?: unknown): void {\n assertExtensionMethod(method);\n this.layer.sendNotification(method, params);\n }\n\n onRequest<TMethod extends keyof AcpClientRequestMap>(\n method: TMethod,\n handler: (\n params: AcpClientRequestMap[TMethod][\"params\"],\n context: { id: RequestId; method: TMethod }\n ) =>\n | AcpClientRequestMap[TMethod][\"result\"]\n | Promise<AcpClientRequestMap[TMethod][\"result\"]>\n ): void;\n onRequest(method: string, handler: JsonRpcRequestHandler): void;\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.layer.onRequest(method, handler);\n }\n\n onExtRequest<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (\n params: unknown,\n context: { id: RequestId; method: TMethod }\n ) => unknown | Promise<unknown>\n ): void;\n onExtRequest(method: string, handler: JsonRpcRequestHandler): void;\n onExtRequest(method: string, handler: JsonRpcRequestHandler): void {\n assertExtensionMethod(method);\n this.layer.onRequest(method, handler);\n }\n\n onNotification<TMethod extends keyof AcpClientNotificationMap>(\n method: TMethod,\n handler: (\n params: AcpClientNotificationMap[TMethod],\n context: { method: TMethod }\n ) => void | Promise<void>\n ): void;\n onNotification(method: string, handler: JsonRpcNotificationHandler): void;\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.layer.onNotification(method, handler);\n }\n\n onExtNotification<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (params: unknown, context: { method: TMethod }) => void | Promise<void>\n ): void;\n onExtNotification(method: string, handler: JsonRpcNotificationHandler): void;\n onExtNotification(method: string, handler: JsonRpcNotificationHandler): void {\n assertExtensionMethod(method);\n this.layer.onNotification(method, handler);\n }\n\n getStderrOutput(): string {\n return this.stderrChunks.join(\"\");\n }\n\n pendingRequestCount(): number {\n return this.layer.pendingRequestCount();\n }\n\n dispose(reason: Error = new Error(\"ACP transport disposed\")): void {\n if (this.closeEvent !== null) {\n return;\n }\n\n this.closeReason = reason;\n this.layer.dispose(reason);\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode !== null || this.child.signalCode !== null) {\n this.close(reason, this.child.exitCode, this.child.signalCode);\n return;\n }\n\n const killed = this.child.kill();\n if (!killed) {\n this.close(reason, this.child.exitCode, this.child.signalCode);\n }\n }\n\n private close(reason: Error, code: number | null, signal: NodeJS.Signals | null): void {\n if (this.closeEvent !== null) {\n return;\n }\n\n this.layer.dispose(reason);\n this.closeEvent = {\n code,\n signal,\n reason,\n stderr: this.getStderrOutput(),\n };\n this.resolveClosed?.(this.closeEvent);\n this.resolveClosed = null;\n }\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n extractToolCallSummariesFromSessionUpdateStream,\n extractUsageFromSessionUpdateStream,\n type ToolCallSummary,\n} from \"./stream-helpers.js\";\nimport type { Cost, SessionUpdate, SessionUpdateNotification, UsageUpdate } from \"./types.js\";\n\ntype SessionUpdateStreamItem = SessionUpdateNotification | SessionUpdate;\n\nexport type RunExitStatus = \"success\" | \"failed\";\n\nexport interface RunReportUsage {\n used: number;\n size: number;\n updates: number;\n cost?: Cost | null;\n}\n\nexport interface RunReportError {\n message: string;\n toolCallId?: string;\n}\n\nexport interface RunReport {\n runId: string;\n startTime: string;\n endTime: string;\n exitStatus: RunExitStatus;\n toolCalls: ToolCallSummary[];\n usage: RunReportUsage;\n errors: RunReportError[];\n}\n\nexport interface GenerateRunReportOptions {\n runId?: string;\n startTime?: string | Date;\n endTime?: string | Date;\n exitStatus?: RunExitStatus;\n errors?: string[];\n now?: () => Date;\n}\n\nexport type RunReportFileSystem = {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n writeFile(\n path: string,\n data: string,\n options?: { encoding?: BufferEncoding },\n ): Promise<void>;\n};\n\nexport interface SaveRunReportOptions {\n fs?: RunReportFileSystem;\n homeDir?: string;\n now?: () => Date;\n}\n\nexport interface SavedRunReportPaths {\n reportsDir: string;\n jsonPath: string;\n summaryPath: string;\n}\n\nexport async function generateRunReportFromSessionUpdateStream(\n stream: AsyncIterable<SessionUpdateStreamItem> | Iterable<SessionUpdateStreamItem>,\n options: GenerateRunReportOptions = {},\n): Promise<RunReport> {\n const now = options.now ?? (() => new Date());\n\n const bufferedEntries: SessionUpdateStreamItem[] = [];\n let runIdFromStream: string | undefined;\n\n for await (const entry of stream) {\n bufferedEntries.push(entry);\n if (runIdFromStream) {\n continue;\n }\n\n if (isSessionUpdateNotification(entry)) {\n const sessionId = toNonEmptyString(entry.params.sessionId);\n if (sessionId) {\n runIdFromStream = sessionId;\n }\n }\n }\n\n const runId = toNonEmptyString(options.runId) ?? runIdFromStream;\n if (!runId) {\n throw new Error(\"Run id is required via options.runId or session/update stream items\");\n }\n\n const startTime = normalizeTime(options.startTime, now);\n const endTime = normalizeTime(options.endTime, now);\n\n const toolCalls = await extractToolCallSummariesFromSessionUpdateStream(bufferedEntries);\n const usageUpdates = await extractUsageFromSessionUpdateStream(bufferedEntries);\n\n const usage = summarizeUsage(usageUpdates);\n const errors = collectErrors(toolCalls, options.errors);\n const exitStatus = options.exitStatus ?? (errors.length > 0 ? \"failed\" : \"success\");\n\n return {\n runId,\n startTime,\n endTime,\n exitStatus,\n toolCalls,\n usage,\n errors,\n };\n}\n\nexport function formatRunReportSummary(report: RunReport): string {\n const lines = [\n `Run ID: ${report.runId}`,\n `Start time: ${report.startTime}`,\n `End time: ${report.endTime}`,\n `Duration: ${toDuration(report.startTime, report.endTime)}`,\n `Exit status: ${report.exitStatus}`,\n `Tool count: ${report.toolCalls.length}`,\n `Token usage: ${report.usage.used}/${report.usage.size}`,\n `Error count: ${report.errors.length}`,\n ];\n\n if (report.usage.cost) {\n lines.push(`Cost: ${report.usage.cost.amount} ${report.usage.cost.currency}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function saveRunReport(\n report: RunReport,\n options: SaveRunReportOptions = {},\n): Promise<SavedRunReportPaths> {\n const fs = options.fs ?? fsPromises;\n const now = options.now ?? (() => new Date());\n\n const reportsDir = join(options.homeDir ?? homedir(), \".poe-code\", \"reports\");\n await fs.mkdir(reportsDir, { recursive: true });\n\n const timestamp = toTimestampForFileName(now());\n const safeRunId = toSafeFileSegment(report.runId);\n const baseFileName = `${timestamp}-${safeRunId}`;\n\n const jsonPath = join(reportsDir, `${baseFileName}.json`);\n const summaryPath = join(reportsDir, `${baseFileName}.txt`);\n\n await fs.writeFile(jsonPath, JSON.stringify(report, null, 2), { encoding: \"utf8\" });\n await fs.writeFile(summaryPath, formatRunReportSummary(report), { encoding: \"utf8\" });\n\n return {\n reportsDir,\n jsonPath,\n summaryPath,\n };\n}\n\nfunction isSessionUpdateNotification(entry: SessionUpdateStreamItem): entry is SessionUpdateNotification {\n return (\n typeof (entry as SessionUpdateNotification).jsonrpc === \"string\" &&\n (entry as SessionUpdateNotification).method === \"session/update\"\n );\n}\n\nfunction normalizeTime(value: string | Date | undefined, now: () => Date): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"string\" && value.length > 0) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n }\n\n return now().toISOString();\n}\n\nfunction summarizeUsage(updates: readonly UsageUpdate[]): RunReportUsage {\n let used = 0;\n let size = 0;\n let cost: Cost | null | undefined;\n\n for (const update of updates) {\n used += update.used;\n size += update.size;\n\n if (update.cost !== undefined) {\n cost = update.cost;\n }\n }\n\n const usage: RunReportUsage = {\n used,\n size,\n updates: updates.length,\n };\n\n if (cost !== undefined) {\n usage.cost = cost;\n }\n\n return usage;\n}\n\nfunction collectErrors(\n toolCalls: readonly ToolCallSummary[],\n additionalErrors: readonly string[] | undefined,\n): RunReportError[] {\n const errors: RunReportError[] = [];\n\n for (const toolCall of toolCalls) {\n if (toolCall.status !== \"failed\") {\n continue;\n }\n\n errors.push({\n toolCallId: toolCall.toolCallId,\n message: toErrorMessage(toolCall),\n });\n }\n\n if (additionalErrors) {\n for (const message of additionalErrors) {\n const text = toNonEmptyString(message);\n if (text) {\n errors.push({ message: text });\n }\n }\n }\n\n return errors;\n}\n\nfunction toErrorMessage(toolCall: ToolCallSummary): string {\n if (typeof toolCall.rawOutput === \"string\" && toolCall.rawOutput.length > 0) {\n return toolCall.rawOutput;\n }\n\n if (toolCall.rawOutput instanceof Error && toolCall.rawOutput.message.length > 0) {\n return toolCall.rawOutput.message;\n }\n\n if (toolCall.rawOutput !== undefined && toolCall.rawOutput !== null) {\n const encoded = trySerialize(toolCall.rawOutput);\n if (encoded) {\n return encoded;\n }\n }\n\n return `${toolCall.title} failed`;\n}\n\nfunction trySerialize(value: unknown): string | undefined {\n try {\n const serialized = JSON.stringify(value);\n if (typeof serialized === \"string\" && serialized.length > 0) {\n return serialized;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nfunction toDuration(startTime: string, endTime: string): string {\n const startMs = Date.parse(startTime);\n const endMs = Date.parse(endTime);\n\n if (Number.isNaN(startMs) || Number.isNaN(endMs) || endMs < startMs) {\n return \"unknown\";\n }\n\n const seconds = (endMs - startMs) / 1000;\n return `${Number(seconds.toFixed(3))}s`;\n}\n\nfunction toSafeFileSegment(value: string): string {\n let output = \"\";\n\n for (const char of value) {\n if (isAsciiLetterOrDigit(char) || char === \"-\" || char === \"_\") {\n output += char;\n continue;\n }\n\n output += \"-\";\n }\n\n return output.length > 0 ? output : \"run\";\n}\n\nfunction isAsciiLetterOrDigit(value: string): boolean {\n const code = value.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122)\n );\n}\n\nfunction toTimestampForFileName(value: Date): string {\n return [\n String(value.getUTCFullYear()),\n pad(value.getUTCMonth() + 1, 2),\n pad(value.getUTCDate(), 2),\n ].join(\"\")\n + \"-\"\n + [\n pad(value.getUTCHours(), 2),\n pad(value.getUTCMinutes(), 2),\n pad(value.getUTCSeconds(), 2),\n ].join(\"\")\n + \"-\"\n + pad(value.getUTCMilliseconds(), 3);\n}\n\nfunction pad(value: number, size: number): string {\n const text = String(value);\n if (text.length >= size) {\n return text;\n }\n\n return `${\"0\".repeat(size - text.length)}${text}`;\n}\n\nfunction toNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n\n return value;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport type { AcpEvent } from \"./types.js\";\nimport { readLines } from \"./line-reader.js\";\nimport { resolveConfig } from \"../configs/resolve-config.js\";\nimport { getMcpArgs, getMcpEnv } from \"../mcp-args.js\";\nimport { stripModelNamespace } from \"../model-utils.js\";\nimport { resolveModeConfig, type CliSpawnConfig, type SpawnOptions, type SpawnResult } from \"../types.js\";\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createActivityTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `Agent spawn timed out after ${timeoutMs / 1000}s of inactivity`\n );\n error.name = \"ActivityTimeoutError\";\n return error;\n}\n\nexport interface SpawnStreamingOptions extends SpawnOptions {\n agentId: string;\n}\n\nexport interface SpawnStreamingResult {\n events: AsyncIterable<AcpEvent>;\n done: Promise<SpawnResult>;\n}\n\nfunction isAcpEvent(value: unknown): value is AcpEvent {\n return !!value && typeof value === \"object\" && \"event\" in value;\n}\n\nfunction getDefaultArgsPosition(config: CliSpawnConfig): \"beforePrompt\" | \"afterPrompt\" {\n return config.defaultArgsPosition ?? \"afterPrompt\";\n}\n\nfunction getMcpArgsPosition(\n config: CliSpawnConfig\n): \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\" {\n if (config.mcpArgsPosition) {\n return config.mcpArgsPosition;\n }\n return config.mcpArgsBeforeCommand ? \"beforeCommand\" : \"afterCommand\";\n}\n\nexport function spawnStreaming(options: SpawnStreamingOptions): SpawnStreamingResult {\n if (options.signal?.aborted) {\n throw createAbortError();\n }\n\n const { agentId, binaryName, spawnConfig } = resolveConfig(options.agentId);\n\n if (spawnConfig === undefined) {\n throw new Error(`Agent \"${agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${agentId}\" does not support CLI spawn.`);\n }\n\n if (!binaryName) {\n throw new Error(`Agent \"${agentId}\" has no binaryName.`);\n }\n\n const mcpArgs = getMcpArgs(spawnConfig, options.mcpServers);\n const mcpEnvVars = getMcpEnv(spawnConfig, options.mcpServers);\n const defaultArgsPosition = getDefaultArgsPosition(spawnConfig);\n const mcpArgsPosition = getMcpArgsPosition(spawnConfig);\n const args: string[] = [];\n\n if (mcpArgsPosition === \"beforeCommand\") {\n args.push(...mcpArgs);\n }\n\n if (defaultArgsPosition === \"beforePrompt\") {\n args.push(...spawnConfig.defaultArgs);\n }\n\n if (mcpArgsPosition === \"beforePrompt\") {\n args.push(...mcpArgs);\n }\n\n args.push(spawnConfig.promptFlag);\n\n const useStdin = !!options.useStdin && !!spawnConfig.stdinMode;\n if (!useStdin || !spawnConfig.stdinMode?.omitPrompt) {\n args.push(options.prompt);\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n if (defaultArgsPosition === \"afterPrompt\") {\n args.push(...spawnConfig.defaultArgs);\n }\n\n if (mcpArgsPosition === \"afterCommand\") {\n args.push(...mcpArgs);\n }\n\n const modeResolved = resolveModeConfig(spawnConfig.modes[options.mode ?? \"yolo\"]);\n args.push(...modeResolved.args);\n\n if (useStdin) {\n args.push(...spawnConfig.stdinMode!.extraArgs);\n }\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const envOverrides = { ...mcpEnvVars, ...modeResolved.env };\n const child = spawnChildProcess(binaryName, args, {\n cwd: options.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: Object.keys(envOverrides).length > 0\n ? { ...process.env, ...envOverrides }\n : undefined\n });\n let aborted = false;\n let timedOut = false;\n const onAbort = () => {\n aborted = true;\n child.kill(\"SIGTERM\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n let activityTimer: ReturnType<typeof setTimeout> | undefined;\n const resetActivityTimer = options.activityTimeoutMs\n ? () => {\n if (activityTimer) clearTimeout(activityTimer);\n activityTimer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, options.activityTimeoutMs);\n }\n : undefined;\n\n resetActivityTimer?.();\n\n const result: SpawnResult = { stdout: \"\", stderr: \"\", exitCode: 1 };\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk) => {\n result.stderr += chunk;\n resetActivityTimer?.();\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n });\n\n if (useStdin) {\n child.stdin.write(options.prompt);\n }\n child.stdin.end();\n\n const adapter = getAdapter(spawnConfig.adapter);\n\n const events: AsyncIterable<AcpEvent> = (async function* () {\n for await (const output of adapter(readLines(child.stdout))) {\n if (!isAcpEvent(output)) continue;\n resetActivityTimer?.();\n yield output;\n }\n })();\n\n const done = new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (activityTimer) clearTimeout(activityTimer);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (activityTimer) clearTimeout(activityTimer);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n if (timedOut) {\n reject(createActivityTimeoutError(options.activityTimeoutMs!));\n return;\n }\n result.exitCode = code ?? 1;\n resolve(result);\n });\n });\n\n return { events, done };\n}\n", "import path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir, open, type FileHandle } from \"node:fs/promises\";\nimport type { AcpEvent } from \"../types.js\";\nimport type { AcpMiddleware, SpawnContext } from \"../middleware.js\";\n\nfunction pad(value: number, width: number): string {\n return String(value).padStart(width, \"0\");\n}\n\nfunction formatTimestamp(date: Date): { day: string; time: string; milliseconds: string } {\n const day = `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1, 2)}${pad(date.getUTCDate(), 2)}`;\n const time = `${pad(date.getUTCHours(), 2)}${pad(date.getUTCMinutes(), 2)}${pad(date.getUTCSeconds(), 2)}`;\n const milliseconds = pad(date.getUTCMilliseconds(), 3);\n return { day, time, milliseconds };\n}\n\nfunction normalizeAgent(agent: string): string {\n let normalized = \"\";\n for (const char of agent) {\n const code = char.charCodeAt(0);\n const isLower = code >= 97 && code <= 122;\n const isUpper = code >= 65 && code <= 90;\n const isDigit = code >= 48 && code <= 57;\n\n if (isLower || isUpper || isDigit || char === \"-\" || char === \"_\") {\n normalized += char;\n } else {\n normalized += \"-\";\n }\n }\n\n return normalized.length > 0 ? normalized : \"agent\";\n}\n\nfunction resolveStartedAt(value: Date | undefined): Date {\n if (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n return new Date();\n }\n\n return value;\n}\n\nfunction resolveLogFilePath(ctx: SpawnContext): string {\n if (ctx.logPath) {\n return ctx.logPath;\n }\n const baseDir = ctx.logDir ?? path.join(homedir(), \".poe-code\", \"spawn-logs\");\n if (ctx.logFileName) {\n return path.join(baseDir, ctx.logFileName);\n }\n const startedAt = resolveStartedAt(ctx.startedAt);\n const { day, time, milliseconds } = formatTimestamp(startedAt);\n const fileName = `${day}-${time}-${milliseconds}-${normalizeAgent(ctx.agent)}.jsonl`;\n return path.join(baseDir, fileName);\n}\n\nclass SpawnLogWriter {\n private fileHandle: FileHandle | undefined;\n\n private isDisabled = false;\n\n readonly filePath: string;\n\n private readonly logDirPath: string;\n\n constructor(ctx: SpawnContext) {\n this.filePath = resolveLogFilePath(ctx);\n this.logDirPath = path.dirname(this.filePath);\n }\n\n async writeEvent(event: AcpEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n try {\n await this.ensureOpen();\n if (!this.fileHandle) {\n return;\n }\n\n const meta = (event as { _meta?: Record<string, unknown> })._meta;\n const toLog = meta?.raw ?? event;\n await this.fileHandle.appendFile(`${JSON.stringify(toLog)}\\n`, \"utf8\");\n } catch {\n this.isDisabled = true;\n await this.close();\n }\n }\n\n async close(): Promise<void> {\n if (!this.fileHandle) {\n return;\n }\n\n try {\n await this.fileHandle.close();\n } catch {\n // Ignore close errors to avoid disrupting event processing.\n } finally {\n this.fileHandle = undefined;\n }\n }\n\n private async ensureOpen(): Promise<void> {\n if (this.fileHandle || this.isDisabled) {\n return;\n }\n\n try {\n await mkdir(this.logDirPath, { recursive: true });\n this.fileHandle = await open(this.filePath, \"a\");\n } catch {\n this.isDisabled = true;\n }\n }\n}\n\nasync function writePreloadedEvents(writer: SpawnLogWriter, events: AcpEvent[]): Promise<void> {\n for (const event of events) {\n await writer.writeEvent(event);\n }\n}\n\nexport const spawnLog: AcpMiddleware = async (ctx, next) => {\n await next();\n\n const source = ctx.eventStream;\n const writer = new SpawnLogWriter(ctx);\n ctx.logFile = writer.filePath;\n\n await writePreloadedEvents(writer, ctx.events);\n\n if (!source) {\n await writer.close();\n return;\n }\n\n ctx.eventStream = (async function* () {\n try {\n for await (const event of source) {\n await writer.writeEvent(event);\n yield event;\n }\n } finally {\n await writer.close();\n }\n })();\n};\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { countTokens } from \"../../tokenfill/dist/index.js\";\nimport { listPages } from \"./pages.js\";\nimport type { MemoryRoot, TokenStats } from \"./types.js\";\n\nexport async function computeTokenStats(root: MemoryRoot): Promise<TokenStats> {\n if (!(await pathExists(root))) {\n return {\n memoryTokens: 0,\n sourceTokens: 0,\n reductionRatio: 0,\n missingSources: []\n };\n }\n\n const pages = await listPages(root);\n\n let memoryTokens = 0;\n const sourcePaths = new Set<string>();\n\n for (const page of pages) {\n memoryTokens += countTokens(page.body);\n for (const source of page.frontmatter.sources ?? []) {\n const normalized = source.path.trim();\n if (normalized.length > 0) {\n sourcePaths.add(normalized);\n }\n }\n }\n\n const repoRoot = path.resolve(root, \"..\", \"..\");\n\n let sourceTokens = 0;\n const missingSources: string[] = [];\n\n for (const sourcePath of sourcePaths) {\n const absPath = path.isAbsolute(sourcePath)\n ? sourcePath\n : path.resolve(repoRoot, sourcePath);\n try {\n const content = await fs.readFile(absPath, \"utf8\");\n sourceTokens += countTokens(content);\n } catch (error) {\n if (isMissing(error)) {\n missingSources.push(sourcePath);\n continue;\n }\n throw error;\n }\n }\n\n missingSources.sort((left, right) => left.localeCompare(right));\n\n const reductionRatio =\n sourceTokens === 0 ? 0 : sourceTokens / Math.max(memoryTokens, 1);\n\n return {\n memoryTokens,\n sourceTokens,\n reductionRatio,\n missingSources\n };\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.stat(targetPath);\n return true;\n } catch (error) {\n if (isMissing(error)) {\n return false;\n }\n throw error;\n }\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n", "import { get_encoding } from \"tiktoken\";\nexport const DEFAULT_ENCODING = \"cl100k_base\";\nexport function createTokenizer(options = {}) {\n const encoding = options.encoding ?? DEFAULT_ENCODING;\n const tokenizer = get_encoding(encoding);\n const utf8Decoder = new TextDecoder();\n const encode = (text) => tokenizer.encode(text);\n const decode = (tokens) => {\n const tokenArray = tokens instanceof Uint32Array ? tokens : Uint32Array.from(tokens);\n return utf8Decoder.decode(tokenizer.decode(tokenArray));\n };\n const count = (text) => encode(text).length;\n const truncate = (text, tokenCount) => {\n if (tokenCount <= 0) {\n return \"\";\n }\n const tokens = encode(text);\n if (tokens.length <= tokenCount) {\n return text;\n }\n return decode(tokens.slice(0, tokenCount));\n };\n return {\n encoding,\n encode,\n decode,\n count,\n truncate,\n free: () => tokenizer.free()\n };\n}\nlet defaultTokenizer;\nexport function countTokens(text) {\n defaultTokenizer ??= createTokenizer();\n return defaultTokenizer.count(text);\n}\n", "import { readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nexport const CORPUS_ARTICLE_SEPARATOR = \"\\n\\n\";\nconst corpusDirectoryPath = join(dirname(fileURLToPath(import.meta.url)), \"corpus\");\nfunction getCorpusFileNames() {\n return readdirSync(corpusDirectoryPath, { withFileTypes: true })\n .filter(entry => entry.isFile() && entry.name.endsWith(\".md\"))\n .map(entry => entry.name)\n .sort((left, right) => left.localeCompare(right));\n}\nfunction loadBuiltInCorpusArticles() {\n const corpusFileNames = getCorpusFileNames();\n if (corpusFileNames.length === 0) {\n throw new Error(`No built-in corpus markdown files found in ${corpusDirectoryPath}`);\n }\n return corpusFileNames.map(fileName => readFileSync(join(corpusDirectoryPath, fileName), \"utf8\").trim());\n}\nexport const BUILT_IN_CORPUS_ARTICLES = loadBuiltInCorpusArticles();\n", "import { BUILT_IN_CORPUS_ARTICLES, CORPUS_ARTICLE_SEPARATOR } from \"./corpus.js\";\nimport { createTokenizer } from \"./tokenizer.js\";\nconst builtInCorpusText = BUILT_IN_CORPUS_ARTICLES.join(CORPUS_ARTICLE_SEPARATOR);\nconst builtInCorpusByteLength = Buffer.byteLength(builtInCorpusText, \"utf8\");\nconst prefixCacheByEncoding = new Map();\nfunction getEncodingCache(encoding) {\n const cached = prefixCacheByEncoding.get(encoding);\n if (cached) {\n return cached;\n }\n const initial = {\n prefixCharLength: 0,\n prefixTokens: new Uint32Array(0)\n };\n prefixCacheByEncoding.set(encoding, initial);\n return initial;\n}\nfunction nextPrefixLength(currentLength, targetTokenCount) {\n if (currentLength === 0) {\n return Math.max(256, targetTokenCount * 8);\n }\n return Math.max(currentLength * 2, currentLength + 4096);\n}\nfunction ensurePrefixTokens(args) {\n const { cache, tokenCount, encode } = args;\n if (cache.prefixTokens.length >= tokenCount) {\n return cache.prefixTokens;\n }\n const corpusLength = builtInCorpusText.length;\n while (cache.prefixTokens.length < tokenCount &&\n cache.prefixCharLength < corpusLength) {\n const nextLength = Math.min(corpusLength, nextPrefixLength(cache.prefixCharLength, tokenCount));\n cache.prefixCharLength = nextLength;\n cache.prefixTokens = encode(builtInCorpusText.slice(0, nextLength));\n }\n return cache.prefixTokens;\n}\nexport function tokenfill(tokenCount, options = {}) {\n if (!Number.isInteger(tokenCount) || tokenCount < 0) {\n throw new TypeError(`tokenCount must be a non-negative integer, received ${tokenCount}`);\n }\n if (tokenCount > builtInCorpusByteLength) {\n throw new Error(`Requested token count ${tokenCount} exceeds built-in corpus size ${builtInCorpusByteLength} for encoding ${options.encoding ?? \"default\"}`);\n }\n const tokenizer = createTokenizer({ encoding: options.encoding });\n try {\n const cache = getEncodingCache(tokenizer.encoding);\n const prefixTokens = ensurePrefixTokens({\n cache,\n tokenCount,\n encode: tokenizer.encode\n });\n if (prefixTokens.length < tokenCount) {\n throw new Error(`Requested token count ${tokenCount} exceeds built-in corpus size ${prefixTokens.length} for encoding ${tokenizer.encoding}`);\n }\n const text = tokenizer.decode(prefixTokens.slice(0, tokenCount));\n return {\n text,\n actualTokens: tokenCount\n };\n }\n finally {\n tokenizer.free();\n }\n}\n", "import * as readline from \"readline\";\nimport type {\n ServerOptions,\n ToolDefinition,\n ToolHandler,\n CallToolResult,\n HandleResult,\n InitializeResult,\n Tool,\n Transport,\n JSONSchema,\n SDKTransport,\n JSONRPCMessage,\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES, ToolError } from \"./types.js\";\nimport {\n parseMessage,\n formatSuccessResponse,\n formatErrorResponse,\n} from \"./jsonrpc.js\";\nimport type { TypedSchema } from \"./schema.js\";\nimport { toContentBlocks } from \"./content/convert.js\";\n\nconst PROTOCOL_VERSION = \"2025-11-25\";\n\nexport interface Server {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server;\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void;\n removeTool(name: string): boolean;\n notifyToolsChanged(): Promise<void>;\n handleMessage(\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult>;\n listen(): Promise<void>;\n connect(transport: Transport): Promise<void>;\n connectSDK(transport: SDKTransport): Promise<void>;\n}\n\nexport function createServer(options: ServerOptions): Server {\n const tools = new Map<string, ToolDefinition>();\n const notificationListeners = new Set<\n (notification: JSONRPCNotification) => void\n >();\n let initialized = false;\n\n const handleMessage = async (\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult> => {\n // Allow ping and initialize before initialization\n if (method === \"ping\") {\n return { result: {} };\n }\n\n if (method === \"initialize\") {\n initialized = true;\n const requestedProtocol =\n typeof params?.protocolVersion === \"string\"\n ? params.protocolVersion\n : null;\n const result: InitializeResult = {\n protocolVersion: requestedProtocol ?? PROTOCOL_VERSION,\n capabilities: {\n tools: {\n listChanged: true,\n },\n },\n serverInfo: {\n name: options.name,\n version: options.version,\n },\n };\n return { result };\n }\n\n if (method === \"notifications/initialized\") {\n return { result: undefined };\n }\n\n // All other methods require initialization\n if (!initialized) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Server not initialized\",\n },\n };\n }\n\n if (method === \"tools/list\") {\n const toolList: Tool[] = [];\n for (const tool of tools.values()) {\n toolList.push({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n });\n }\n return { result: { tools: toolList } };\n }\n\n if (method === \"tools/call\") {\n const toolName = params?.name as string | undefined;\n const toolArgs = (params?.arguments as Record<string, unknown>) || {};\n\n if (!toolName) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: \"Tool name required\",\n },\n };\n }\n\n const tool = tools.get(toolName);\n if (!tool) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: `Tool not found: ${toolName}`,\n },\n };\n }\n\n try {\n const handlerResult = await tool.handler(toolArgs);\n const result: CallToolResult = isCallToolResult(handlerResult)\n ? handlerResult\n : { content: toContentBlocks(handlerResult) };\n return { result };\n } catch (err) {\n if (err instanceof ToolError) {\n return {\n error: {\n code: err.code,\n message: err.message,\n },\n };\n }\n\n const errorMessage =\n err instanceof Error ? err.message : String(err);\n const result: CallToolResult = {\n content: [{ type: \"text\", text: `Error: ${errorMessage}` }],\n isError: true,\n };\n return { result };\n }\n }\n\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.METHOD_NOT_FOUND,\n message: \"Method not found\",\n },\n };\n };\n\n const processLine = async (\n line: string,\n write: (data: string) => void\n ): Promise<void> => {\n const parsed = parseMessage(line);\n\n if (!parsed.success) {\n write(formatErrorResponse(parsed.id, parsed.error) + \"\\n\");\n return;\n }\n\n const { request, isNotification } = parsed;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (isNotification) {\n return;\n }\n\n const requestWithId = request as JSONRPCRequest;\n\n if (error) {\n write(formatErrorResponse(requestWithId.id, error) + \"\\n\");\n } else if (result !== undefined) {\n write(formatSuccessResponse(requestWithId.id, result) + \"\\n\");\n }\n };\n\n const broadcastNotification = (method: string): void => {\n const notification: JSONRPCNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n for (const listener of notificationListeners) {\n listener(notification);\n }\n };\n\n const server: Server = {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server {\n tools.set(name, {\n name,\n description,\n inputSchema: inputSchema as JSONSchema,\n handler: handler as ToolHandler,\n });\n return server;\n },\n\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void {\n notificationListeners.add(listener);\n return () => {\n notificationListeners.delete(listener);\n };\n },\n\n removeTool(name: string): boolean {\n return tools.delete(name);\n },\n\n async notifyToolsChanged(): Promise<void> {\n if (initialized) {\n broadcastNotification(\"notifications/tools/list_changed\");\n }\n },\n\n handleMessage,\n\n async listen(): Promise<void> {\n return server.connect({\n readable: process.stdin,\n writable: process.stdout,\n });\n },\n\n async connect(transport: Transport): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n transport.writable.write(`${JSON.stringify(notification)}\\n`);\n });\n const rl = readline.createInterface({\n input: transport.readable,\n crlfDelay: Infinity,\n });\n\n rl.on(\"line\", (line) => {\n processLine(line, (data) => transport.writable.write(data));\n });\n\n rl.on(\"close\", () => {\n unsubscribe();\n resolve();\n });\n });\n },\n\n async connectSDK(transport: SDKTransport): Promise<void> {\n return new Promise<void>((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n void transport.send(notification);\n });\n\n transport.onmessage = async (message: JSONRPCMessage) => {\n // Ignore responses (we only handle requests/notifications)\n if (!(\"method\" in message)) {\n return;\n }\n\n // Handle notifications (no id) - don't respond\n if (!(\"id\" in message) || message.id === undefined) {\n await server.handleMessage(message.method, message.params);\n return;\n }\n\n const request = message as JSONRPCRequest;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (error) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n error,\n };\n await transport.send(response);\n } else if (result !== undefined) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n await transport.send(response);\n }\n };\n\n transport.onclose = () => {\n unsubscribe();\n resolve();\n };\n\n transport.start();\n });\n },\n };\n\n return server;\n}\n\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (typeof value !== \"object\" || value === null || !(\"content\" in value)) {\n return false;\n }\n\n return Array.isArray((value as { content: unknown }).content);\n}\n", "// JSON-RPC 2.0 types\nexport interface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JSONRPCError;\n}\n\nexport interface JSONRPCError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// JSON-RPC error codes\nexport const JSON_RPC_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603\n} as const;\n\nexport class ToolError extends Error {\n constructor(\n public readonly code: number,\n message: string\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\n// MCP protocol types\nexport interface ToolsCapability {\n listChanged?: boolean;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: {\n tools?: ToolsCapability;\n };\n serverInfo: {\n name: string;\n version: string;\n };\n}\n\nexport interface Tool {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface HandleResult {\n result?: unknown;\n error?: { code: number; message: string };\n}\n\n// ContentItem is a union of all possible content block types\nexport type ContentItem =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; mimeType: string; text: string }\n | { uri: string; mimeType: string; blob: string };\n };\n\nexport interface JSONSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n}\n\nexport interface JSONSchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n description?: string;\n}\n\n// Server types\nexport interface ServerOptions {\n name: string;\n version: string;\n}\n\nimport type { ToolReturn } from \"./content/index.js\";\n\nexport type ToolHandler<T = Record<string, unknown>> = (\n args: T\n) => Promise<ToolReturn | CallToolResult> | ToolReturn | CallToolResult;\n\nexport interface ToolDefinition<T = Record<string, unknown>> {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n handler: ToolHandler<T>;\n}\n\n// Transport types\nexport interface Transport {\n readable: NodeJS.ReadableStream;\n writable: NodeJS.WritableStream;\n}\n\n// SDK-compatible transport interface\nexport interface SDKTransport {\n onmessage?: (message: JSONRPCMessage) => void;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n start: () => Promise<void>;\n close: () => Promise<void>;\n send: (message: JSONRPCMessage) => Promise<void>;\n}\n\nexport type JSONRPCMessage = JSONRPCRequest | JSONRPCResponse | JSONRPCNotification;\n\nexport interface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n}\n", "import type {\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCError,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES } from \"./types.js\";\n\nexport interface ParseResult {\n success: true;\n request: JSONRPCRequest | JSONRPCNotification;\n isNotification: boolean;\n}\n\nexport interface ParseError {\n success: false;\n error: JSONRPCError;\n id: string | number | null;\n}\n\nexport function parseMessage(line: string): ParseResult | ParseError {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.PARSE_ERROR,\n message: \"Parse error\",\n },\n id: null,\n };\n }\n\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n const obj = parsed as Record<string, unknown>;\n const hasId = \"id\" in obj;\n const id = typeof obj.id === \"string\" || typeof obj.id === \"number\" ? obj.id : null;\n\n if (obj.jsonrpc !== \"2.0\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (typeof obj.method !== \"string\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (!hasId) {\n return {\n success: true,\n isNotification: true,\n request: {\n jsonrpc: \"2.0\",\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n }\n\n if (id === null) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n return {\n success: true,\n isNotification: false,\n request: {\n jsonrpc: \"2.0\",\n id,\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n}\n\nexport function formatSuccessResponse(\n id: string | number | null,\n result: unknown\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n result,\n };\n return JSON.stringify(response);\n}\n\nexport function formatErrorResponse(\n id: string | number | null,\n error: JSONRPCError\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n return JSON.stringify(response);\n}\n", "/**\n * Minimal magic bytes detection for common media types.\n * This can be replaced with `file-type` package (https://npm.im/file-type)\n * if more comprehensive detection is needed. The API is designed to be\n * compatible: fileTypeFromBuffer(data) returns { mime: string, ext: string } | undefined\n */\n\nexport interface FileTypeResult {\n mime: string;\n ext: string;\n}\n\nexport function fileTypeFromBuffer(data: Uint8Array): FileTypeResult | undefined {\n if (data.length < 12) {\n return undefined;\n }\n\n // PNG: 89 50 4E 47 0D 0A 1A 0A\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47 &&\n data[4] === 0x0d &&\n data[5] === 0x0a &&\n data[6] === 0x1a &&\n data[7] === 0x0a\n ) {\n return { mime: \"image/png\", ext: \"png\" };\n }\n\n // JPEG: FF D8 FF\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return { mime: \"image/jpeg\", ext: \"jpg\" };\n }\n\n // GIF: 47 49 46 38 (GIF8)\n if (\n data[0] === 0x47 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x38\n ) {\n return { mime: \"image/gif\", ext: \"gif\" };\n }\n\n // WEBP: 52 49 46 46 ... 57 45 42 50 (RIFF...WEBP)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x45 &&\n data[10] === 0x42 &&\n data[11] === 0x50\n ) {\n return { mime: \"image/webp\", ext: \"webp\" };\n }\n\n // MP3: FF FB or FF FA (MPEG audio) or 49 44 33 (ID3 tag)\n if (\n (data[0] === 0xff && (data[1] === 0xfb || data[1] === 0xfa)) ||\n (data[0] === 0x49 && data[1] === 0x44 && data[2] === 0x33)\n ) {\n return { mime: \"audio/mpeg\", ext: \"mp3\" };\n }\n\n // WAV: 52 49 46 46 ... 57 41 56 45 (RIFF...WAVE)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x41 &&\n data[10] === 0x56 &&\n data[11] === 0x45\n ) {\n return { mime: \"audio/wav\", ext: \"wav\" };\n }\n\n // OGG: 4F 67 67 53 (OggS)\n if (\n data[0] === 0x4f &&\n data[1] === 0x67 &&\n data[2] === 0x67 &&\n data[3] === 0x53\n ) {\n return { mime: \"audio/ogg\", ext: \"ogg\" };\n }\n\n // M4A: MP4 container with audio - check for M4A brand at offset 8\n // ftyp followed by M4A brand\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70 &&\n data[8] === 0x4d &&\n data[9] === 0x34 &&\n data[10] === 0x41\n ) {\n return { mime: \"audio/mp4\", ext: \"m4a\" };\n }\n\n // MP4: ... 66 74 79 70 (ftyp box, offset 4)\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70\n ) {\n return { mime: \"video/mp4\", ext: \"mp4\" };\n }\n\n // WEBM: 1A 45 DF A3 (EBML header)\n if (\n data[0] === 0x1a &&\n data[1] === 0x45 &&\n data[2] === 0xdf &&\n data[3] === 0xa3\n ) {\n return { mime: \"video/webm\", ext: \"webm\" };\n }\n\n return undefined;\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_IMAGE_MIMES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nexport class Image {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Image> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch image from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_IMAGE_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect image MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Image {\n let mimeType: string;\n\n if (format) {\n mimeType = format.includes(\"/\") ? format : `image/${format}`;\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect image MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Image {\n return new Image(base64, mimeType);\n }\n\n toContentBlock(): ImageContent {\n return {\n type: \"image\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_AUDIO_MIMES = new Set([\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/ogg\",\n \"audio/mp4\",\n]);\n\nconst AUDIO_FORMAT_MAP: Record<string, string> = {\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n m4a: \"audio/mp4\",\n mpeg: \"audio/mpeg\",\n};\n\nexport class Audio {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Audio> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch audio from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_AUDIO_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect audio MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Audio {\n let mimeType: string;\n\n if (format) {\n if (format.includes(\"/\")) {\n mimeType = format;\n } else {\n mimeType = AUDIO_FORMAT_MAP[format.toLowerCase()] || `audio/${format}`;\n }\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect audio MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Audio {\n return new Audio(base64, mimeType);\n }\n\n toContentBlock(): AudioContent {\n return {\n type: \"audio\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface TextResourceContents {\n uri: string;\n mimeType: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType: string;\n blob: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: TextResourceContents | BlobResourceContents;\n}\n\nfunction isTextMimeType(mimeType: string): boolean {\n return (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"application/javascript\" ||\n mimeType === \"application/typescript\"\n );\n}\n\nexport class File {\n private constructor(\n private readonly data: Uint8Array | string,\n private readonly mimeType: string,\n private readonly isText: boolean,\n private readonly name?: string\n ) {}\n\n static async fromUrl(url: string): Promise<File> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect MIME type from ${url}`);\n }\n }\n\n const isText = isTextMimeType(mimeType);\n const name = url.split(\"/\").pop() || \"file\";\n\n return new File(data, mimeType, isText, name);\n }\n\n static fromBytes(data: Uint8Array, mimeType: string): File {\n const isText = isTextMimeType(mimeType);\n return new File(data, mimeType, isText);\n }\n\n static fromText(text: string, mimeType = \"text/plain\"): File {\n return new File(text, mimeType, true);\n }\n\n static fromBase64(base64: string, mimeType: string): File {\n const data = Buffer.from(base64, \"base64\");\n const isText = isTextMimeType(mimeType);\n return new File(new Uint8Array(data), mimeType, isText);\n }\n\n toContentBlock(): EmbeddedResource {\n const uri = this.name ? `file:///${this.name}` : \"file:///data\";\n\n if (this.isText) {\n let text: string;\n if (typeof this.data === \"string\") {\n text = this.data;\n } else {\n text = new TextDecoder(\"utf-8\").decode(this.data);\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n text,\n } as TextResourceContents,\n };\n } else {\n let blob: string;\n if (typeof this.data === \"string\") {\n blob = Buffer.from(this.data).toString(\"base64\");\n } else {\n blob = Buffer.from(this.data).toString(\"base64\");\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n blob,\n } as BlobResourceContents,\n };\n }\n }\n}\n", "import { Image, type ImageContent } from \"./image.js\";\nimport { Audio, type AudioContent } from \"./audio.js\";\nimport { File, type EmbeddedResource } from \"./file.js\";\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport type ContentBlock = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\ntype JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type ToolReturn =\n | undefined\n | JsonPrimitive\n | JsonObject\n | Image\n | Audio\n | File\n | ContentBlock\n | Array<undefined | JsonPrimitive | JsonObject | Image | Audio | File | ContentBlock>;\n\nfunction convertSingleValue(value: Exclude<ToolReturn, Array<unknown> | undefined>): ContentBlock {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return { type: \"text\", text: String(value) };\n }\n\n if (value === null) {\n return { type: \"text\", text: \"null\" };\n }\n\n if (value instanceof Image) {\n return value.toContentBlock();\n }\n\n if (value instanceof Audio) {\n return value.toContentBlock();\n }\n\n if (value instanceof File) {\n return value.toContentBlock();\n }\n\n if (isContentBlock(value)) {\n return value;\n }\n\n return { type: \"text\", text: JSON.stringify(value) };\n}\n\nexport function toContentBlocks(result: ToolReturn): ContentBlock[] {\n if (result === undefined) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.flatMap((item) => toContentBlocks(item));\n }\n\n return [convertSingleValue(result)];\n}\n\nfunction isContentBlock(value: object): value is ContentBlock {\n if (!(\"type\" in value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" ||\n value.type === \"image\" ||\n value.type === \"audio\" ||\n value.type === \"resource\"\n );\n}\n", "import type { JSONSchema } from \"./types.js\";\n\ntype SchemaPropertyType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n\ninterface SchemaPropertyDef {\n type: SchemaPropertyType;\n description?: string;\n optional?: boolean;\n}\n\ntype SchemaDefinition = Record<string, SchemaPropertyDef>;\n\ntype InferType<T extends SchemaPropertyType> = T extends \"string\"\n ? string\n : T extends \"number\"\n ? number\n : T extends \"boolean\"\n ? boolean\n : T extends \"object\"\n ? Record<string, unknown>\n : T extends \"array\"\n ? unknown[]\n : never;\n\ntype InferSchema<T extends SchemaDefinition> = {\n [K in keyof T as T[K][\"optional\"] extends true ? never : K]: InferType<\n T[K][\"type\"]\n >;\n} & {\n [K in keyof T as T[K][\"optional\"] extends true ? K : never]?: InferType<\n T[K][\"type\"]\n >;\n};\n\nexport interface TypedSchema<T> extends JSONSchema {\n __type?: T;\n}\n\nexport function defineSchema<T extends SchemaDefinition>(\n definition: T\n): TypedSchema<InferSchema<T>> {\n const properties: JSONSchema[\"properties\"] = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(definition)) {\n properties[key] = {\n type: prop.type,\n ...(prop.description !== undefined && { description: prop.description }),\n };\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n}\n", "import { createServer, defineSchema } from \"tiny-stdio-mcp-server\";\nimport type { Server } from \"tiny-stdio-mcp-server\";\nimport type { MemoryHandle } from \"./handle.js\";\n\nexport async function startMemoryMcpServer(\n handle: MemoryHandle,\n opts: { allowWrites: boolean }\n): Promise<{ stop: () => Promise<void>; server: Server }> {\n const server = createServer({\n name: \"poe-code-memory\",\n version: \"0.0.1\"\n });\n\n server.tool(\"list_pages\", \"List memory pages.\", defineSchema({}), async () => ({\n pages: (await handle.listPages()).map((page) => ({\n rel_path: page.relPath,\n description: page.frontmatter.description ?? \"\"\n }))\n }));\n\n server.tool(\n \"read_page\",\n \"Read a memory page.\",\n defineSchema({ rel_path: { type: \"string\" } }),\n async ({ rel_path }: { rel_path: string }) => {\n const page = await handle.readPage(rel_path);\n return {\n rel_path: page.relPath,\n frontmatter: page.frontmatter,\n body: page.body,\n bytes: page.bytes\n };\n }\n );\n\n server.tool(\n \"search_memory\",\n \"Search memory pages.\",\n defineSchema({\n query: { type: \"string\" },\n limit: { type: \"number\", optional: true }\n }),\n async ({ query, limit }: { query: string; limit?: number }) => {\n const hits = await handle.searchMemory(query);\n return { hits: typeof limit === \"number\" ? hits.slice(0, limit) : hits };\n }\n );\n\n server.tool(\"status\", \"Show memory status.\", defineSchema({}), async () => handle.statusOf());\n\n if (opts.allowWrites) {\n server.tool(\n \"append_to_page\",\n \"Append content to a memory page.\",\n defineSchema({\n rel_path: { type: \"string\" },\n content: { type: \"string\" },\n reason: { type: \"string\" }\n }),\n async ({ rel_path, content, reason }: { rel_path: string; content: string; reason: string }) => ({\n diff: await handle.appendToPage(rel_path, content, { reason })\n })\n );\n }\n\n return {\n server,\n stop: async () => {},\n };\n}\n\nexport function printMcpConfig(): string {\n return JSON.stringify(\n {\n mcpServers: {\n \"poe-code-memory\": {\n type: \"stdio\",\n command: \"poe-code\",\n args: [\"memory-mcp\"]\n }\n }\n },\n null,\n 2\n );\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return os.homedir();\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? os.homedir() : path.join(os.homedir(), remainder);\n}\n\nexport function resolveSkillDir(config: AgentSkillConfig, scope: SkillScope, cwd: string): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { TemplateLoader } from \"@poe-code/config-mutations\";\n\nconst TEMPLATE_IDS = [\"poe-generate.md\", \"terminal-pilot.md\"] as const;\ntype TemplateId = (typeof TEMPLATE_IDS)[number];\n\nconst cache = new Map<TemplateId, string>();\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await stat(target);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function findPackageRoot(entryFilePath: string): Promise<string> {\n let current = path.dirname(entryFilePath);\n while (true) {\n if (await pathExists(path.join(current, \"package.json\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(\"Unable to locate package root for agent-skill-config templates.\");\n }\n current = parent;\n }\n}\n\nasync function resolveTemplatePath(templateId: TemplateId): Promise<string> {\n const packageRoot = await findPackageRoot(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(packageRoot, \"src\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", \"skill\", templateId)\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Template not found: ${templateId}`);\n}\n\nfunction isKnownTemplate(templateId: string): templateId is TemplateId {\n return (TEMPLATE_IDS as readonly string[]).includes(templateId);\n}\n\nexport async function loadTemplate(templateId: string): Promise<string> {\n if (!isKnownTemplate(templateId)) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const cached = cache.get(templateId);\n if (cached !== undefined) {\n return cached;\n }\n\n const resolved = await resolveTemplatePath(templateId);\n const content = await readFile(resolved, \"utf8\");\n cache.set(templateId, content);\n return content;\n}\n\nexport function createTemplateLoader(): TemplateLoader {\n return loadTemplate;\n}\n", "import { fileMutation, runMutations, templateMutation } from \"@poe-code/config-mutations\";\nimport { resolveAgentSupport } from \"./configs.js\";\nimport { createTemplateLoader } from \"./templates.js\";\nimport type { ApplyOptions, SkillFile } from \"./types.js\";\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction toHomeRelative(localSkillDir: string): string {\n if (localSkillDir.startsWith(\"~/\") || localSkillDir === \"~\") {\n return localSkillDir;\n }\n\n const normalized = localSkillDir.startsWith(\"./\")\n ? localSkillDir.slice(2)\n : localSkillDir;\n\n return `~/${normalized}`;\n}\n\nconst bundledSkillTemplateIds = [\"poe-generate.md\"] as const;\n\nexport async function configure(agentId: string, options: ApplyOptions): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillDir,\n label: `Ensure directory ${skillDir}`\n }),\n ...bundledSkillTemplateIds.map((templateId) =>\n templateMutation.write({\n target: `${skillDir}/${templateId}`,\n templateId,\n label: `Write bundled skill ${templateId} to ${skillDir}`\n })\n )\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: createTemplateLoader()\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n options: ApplyOptions & { force?: boolean }\n): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.removeDirectory({\n path: skillDir,\n force: options.force,\n label: `Remove skills directory ${skillDir}`\n })\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport type InstallSkillOptions = {\n fs: ApplyOptions[\"fs\"];\n cwd: string;\n homeDir: string;\n scope: ApplyOptions[\"scope\"];\n dryRun?: boolean;\n observers?: ApplyOptions[\"observers\"];\n};\n\nexport type InstallSkillResult = {\n skillPath: string;\n displayPath: string;\n};\n\nconst SKILL_TEMPLATE_ID = \"__skill_content__\";\n\n/**\n * Install a skill for an agent.\n * Creates folder structure: skillDir/<skill.name>/SKILL.md\n */\nexport async function installSkill(\n agentId: string,\n skill: SkillFile,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"local\";\n const config = support.config!;\n\n // Use home-relative paths for mutations (same pattern as configure/unconfigure)\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const skillFolderPath = `${skillDir}/${skill.name}`;\n const skillFilePath = `${skillFolderPath}/SKILL.md`;\n const displayPath = `${scope === \"global\" ? config.globalSkillDir : config.localSkillDir}/${skill.name}/SKILL.md`;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillFolderPath,\n label: `Ensure skill directory ${skill.name}`\n }),\n templateMutation.write({\n target: skillFilePath,\n templateId: SKILL_TEMPLATE_ID,\n label: `Write skill ${skill.name}`\n })\n ],\n {\n fs: options.fs,\n homeDir: scope === \"global\" ? options.homeDir : options.cwd,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: async (templateId) => {\n if (templateId === SKILL_TEMPLATE_ID) {\n return skill.content;\n }\n throw new Error(`Unknown template: ${templateId}`);\n }\n }\n );\n\n return { skillPath: skillFilePath, displayPath };\n}\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { ShapeName } from \"./shapes.js\";\n\nexport type ConfigFormat = \"json\" | \"toml\" | \"yaml\";\nexport type Platform = \"darwin\" | \"linux\" | \"win32\";\n\nexport interface AgentMcpConfig {\n configFile: string | ((platform: Platform) => string);\n configKey: string;\n format: ConfigFormat;\n shape: ShapeName;\n mcpOutputFormat?: string;\n}\n\nconst agentMcpConfigs: Record<string, AgentMcpConfig> = {\n \"claude-code\": {\n configFile: \"~/.claude.json\",\n configKey: \"mcpServers\",\n format: \"json\",\n shape: \"standard\"\n },\n \"claude-desktop\": {\n configFile: (platform: Platform) => {\n switch (platform) {\n case \"darwin\":\n return \"~/Library/Application Support/Claude/claude_desktop_config.json\";\n case \"win32\":\n return \"~/AppData/Roaming/Claude/claude_desktop_config.json\";\n default:\n return \"~/.config/Claude/claude_desktop_config.json\";\n }\n },\n configKey: \"mcpServers\",\n format: \"json\",\n shape: \"standard\",\n mcpOutputFormat: \"markdown_instructions\"\n },\n codex: {\n configFile: \"~/.codex/config.toml\",\n configKey: \"mcp_servers\",\n format: \"toml\",\n shape: \"standard\"\n },\n opencode: {\n configFile: \"~/.config/opencode/opencode.json\",\n configKey: \"mcp\",\n format: \"json\",\n shape: \"opencode\"\n },\n kimi: {\n configFile: \"~/.kimi/mcp.json\",\n configKey: \"mcpServers\",\n format: \"json\",\n shape: \"standard\"\n },\n goose: {\n configFile: \"~/.config/goose/config.yaml\",\n configKey: \"extensions\",\n format: \"yaml\",\n shape: \"goose\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentMcpConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentMcpConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentMcpConfig> = agentMcpConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function isSupported(agentId: string): boolean {\n return resolveAgentSupport(agentId).status === \"supported\";\n}\n\nexport function getAgentConfig(agentId: string): AgentMcpConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nexport function resolveConfigPath(\n config: AgentMcpConfig,\n platform: Platform\n): string {\n if (typeof config.configFile === \"function\") {\n return config.configFile(platform);\n }\n return config.configFile;\n}\n", "import path from \"node:path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport {\n runMutations,\n configMutation,\n fileMutation,\n readFileIfExists,\n type ConfigObject\n} from \"@poe-code/config-mutations\";\nimport type { McpServerEntry, ApplyOptions } from \"./types.js\";\nimport {\n getAgentConfig,\n resolveConfigPath,\n isSupported\n} from \"./configs.js\";\nimport { getShapeTransformer } from \"./shapes.js\";\n\nfunction getConfigDirectory(configPath: string): string {\n return path.dirname(configPath);\n}\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction resolveServerMap(\n document: ConfigObject,\n configKey: string\n): ConfigObject {\n const value = document[configKey];\n return isConfigObject(value) ? value : {};\n}\n\nfunction mergeServerMap(\n document: ConfigObject,\n configKey: string,\n servers: ConfigObject\n): ConfigObject {\n return { ...document, [configKey]: servers };\n}\n\nfunction expandHomePath(configPath: string, homeDir: string): string {\n if (!configPath.startsWith(\"~\")) {\n return configPath;\n }\n\n if (configPath === \"~\") {\n return homeDir;\n }\n\n if (configPath.startsWith(\"~/\")) {\n return path.join(homeDir, configPath.slice(2));\n }\n\n return path.join(homeDir, configPath.slice(1));\n}\n\nfunction parseYamlDocument(content: string): ConfigObject {\n if (content.trim() === \"\") {\n return {};\n }\n\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML document to be an object.\");\n }\n\n return parsed;\n}\n\nfunction serializeYamlDocument(document: ConfigObject): string {\n const serialized = stringifyYaml(document);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nasync function readYamlConfig(\n configPath: string,\n options: ApplyOptions\n): Promise<ConfigObject> {\n const absolutePath = expandHomePath(configPath, options.homeDir);\n const existingContent = await readFileIfExists(options.fs, absolutePath);\n\n if (existingContent === null) {\n return {};\n }\n\n return parseYamlDocument(existingContent);\n}\n\nasync function writeYamlConfig(\n configPath: string,\n document: ConfigObject,\n options: ApplyOptions\n): Promise<void> {\n if (options.dryRun) {\n return;\n }\n\n const absolutePath = expandHomePath(configPath, options.homeDir);\n const configDir = path.dirname(absolutePath);\n\n await options.fs.mkdir(configDir, { recursive: true });\n await options.fs.writeFile(absolutePath, serializeYamlDocument(document), {\n encoding: \"utf8\"\n });\n}\n\nfunction removeServer(\n document: ConfigObject,\n configKey: string,\n serverName: string\n): { changed: boolean; content: ConfigObject } {\n const servers = resolveServerMap(document, configKey);\n if (!(serverName in servers)) {\n return { changed: false, content: document };\n }\n\n const nextServers = { ...servers };\n delete nextServers[serverName];\n\n if (Object.keys(nextServers).length === 0) {\n const nextDocument = { ...document };\n delete nextDocument[configKey];\n return { changed: true, content: nextDocument };\n }\n\n return {\n changed: true,\n content: mergeServerMap(document, configKey, nextServers)\n };\n}\n\nexport async function configure(\n agentId: string,\n server: McpServerEntry,\n options: ApplyOptions\n): Promise<void> {\n if (!isSupported(agentId)) {\n throw new UnsupportedAgentError(agentId);\n }\n\n const config = getAgentConfig(agentId)!;\n const configPath = resolveConfigPath(config, options.platform);\n const shapeTransformer = getShapeTransformer(config.shape);\n const shaped = shapeTransformer(server);\n\n if (shaped === undefined) {\n await unconfigure(agentId, server.name, options);\n return;\n }\n\n if (config.format === \"yaml\") {\n const document = await readYamlConfig(configPath, options);\n const servers = resolveServerMap(document, config.configKey);\n const nextDocument = mergeServerMap(document, config.configKey, {\n ...servers,\n [server.name]: shaped as unknown as ConfigObject\n });\n\n await writeYamlConfig(configPath, nextDocument, options);\n return;\n }\n\n const configDir = getConfigDirectory(configPath);\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: configDir,\n label: `Ensure directory ${configDir}`\n }),\n // Use transform to replace the server entry entirely (not deep-merge)\n // This ensures old fields like 'args' are removed when switching to array 'command'\n configMutation.transform({\n target: configPath,\n format: config.format,\n transform: (document) => {\n const servers = resolveServerMap(document, config.configKey);\n const newServers = {\n ...servers,\n [server.name]: shaped as unknown as ConfigObject\n };\n return {\n changed: true,\n content: mergeServerMap(document, config.configKey, newServers)\n };\n },\n label: `Add ${server.name} to ${configPath}`\n })\n ],\n {\n fs: options.fs,\n homeDir: options.homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n serverName: string,\n options: ApplyOptions\n): Promise<void> {\n if (!isSupported(agentId)) {\n throw new UnsupportedAgentError(agentId);\n }\n\n const config = getAgentConfig(agentId)!;\n const configPath = resolveConfigPath(config, options.platform);\n\n if (config.format === \"yaml\") {\n const document = await readYamlConfig(configPath, options);\n const { changed, content } = removeServer(\n document,\n config.configKey,\n serverName\n );\n\n if (!changed) {\n return;\n }\n\n await writeYamlConfig(configPath, content, options);\n return;\n }\n\n await runMutations(\n [\n configMutation.prune({\n target: configPath,\n format: config.format,\n shape: {\n [config.configKey]: {\n [serverName]: {}\n }\n },\n label: `Remove ${serverName} from ${configPath}`\n })\n ],\n {\n fs: options.fs,\n homeDir: options.homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n", "import type { McpServerConfig, McpServerEntry } from \"./types.js\";\n\nexport type ShapeName = \"standard\" | \"opencode\" | \"goose\";\n\nexport interface StandardShapeOutput {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface OpencodeShapeOutput {\n type: \"local\";\n command: string[];\n env?: Record<string, string>;\n enabled: boolean;\n}\n\nexport interface GooseStdioShapeOutput {\n type: \"stdio\";\n cmd: string;\n args?: string[];\n envs?: Record<string, string>;\n}\n\nexport interface GooseHttpShapeOutput {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\nexport type GooseShapeOutput = GooseStdioShapeOutput | GooseHttpShapeOutput;\n\nexport type ShapeOutput =\n | StandardShapeOutput\n | OpencodeShapeOutput\n | GooseShapeOutput;\n\nexport type ShapeTransformer = (\n entry: McpServerEntry\n) => ShapeOutput | undefined;\n\nfunction transformStdioServer(\n config: Extract<McpServerConfig, { transport: \"stdio\" }>,\n enabled: boolean\n): StandardShapeOutput | undefined {\n if (!enabled) {\n return undefined;\n }\n const result: StandardShapeOutput = {\n command: config.command\n };\n if (config.args && config.args.length > 0) {\n result.args = config.args;\n }\n if (config.env && Object.keys(config.env).length > 0) {\n result.env = config.env;\n }\n return result;\n}\n\nexport function standardShape(entry: McpServerEntry): ShapeOutput | undefined {\n const enabled = entry.enabled !== false;\n\n if (entry.config.transport === \"stdio\") {\n return transformStdioServer(entry.config, enabled);\n }\n\n if (!enabled) {\n return undefined;\n }\n\n return {\n command: entry.config.url\n };\n}\n\nfunction transformStdioServerOpencode(\n config: Extract<McpServerConfig, { transport: \"stdio\" }>,\n enabled: boolean\n): OpencodeShapeOutput {\n const command = config.args && config.args.length > 0\n ? [config.command, ...config.args]\n : [config.command];\n\n const result: OpencodeShapeOutput = {\n type: \"local\",\n command,\n enabled\n };\n if (config.env && Object.keys(config.env).length > 0) {\n result.env = config.env;\n }\n return result;\n}\n\nexport function opencodeShape(entry: McpServerEntry): OpencodeShapeOutput {\n const enabled = entry.enabled !== false;\n\n if (entry.config.transport === \"stdio\") {\n return transformStdioServerOpencode(entry.config, enabled);\n }\n\n return {\n type: \"local\",\n command: [entry.config.url],\n enabled\n };\n}\n\nexport function gooseShape(entry: McpServerEntry): GooseShapeOutput | undefined {\n const enabled = entry.enabled !== false;\n\n if (!enabled) {\n return undefined;\n }\n\n if (entry.config.transport === \"stdio\") {\n const result: GooseStdioShapeOutput = {\n type: \"stdio\",\n cmd: entry.config.command\n };\n\n if (entry.config.args && entry.config.args.length > 0) {\n result.args = entry.config.args;\n }\n\n if (entry.config.env && Object.keys(entry.config.env).length > 0) {\n result.envs = entry.config.env;\n }\n\n return result;\n }\n\n const result: GooseHttpShapeOutput = {\n type: \"http\",\n url: entry.config.url\n };\n\n if (entry.config.headers && Object.keys(entry.config.headers).length > 0) {\n result.headers = entry.config.headers;\n }\n\n return result;\n}\n\nconst shapeTransformers: Record<ShapeName, ShapeTransformer> = {\n standard: standardShape,\n opencode: opencodeShape,\n goose: gooseShape\n};\n\nexport function getShapeTransformer(shape: ShapeName): ShapeTransformer {\n return shapeTransformers[shape];\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { configure } from \"@poe-code/agent-mcp-config\";\nimport type { ApplyOptions as McpApplyOptions } from \"@poe-code/agent-mcp-config\";\nimport type { FileSystem, MutationObservers } from \"@poe-code/config-mutations\";\nimport type { MemoryInstallResult } from \"./types.js\";\n\nexport type MemoryInstallOptions = {\n agent: string;\n skillContent: string;\n fs: FileSystem;\n cwd: string;\n homeDir: string;\n platform: McpApplyOptions[\"platform\"];\n scope?: \"local\" | \"global\";\n skillOnly?: boolean;\n mcpOnly?: boolean;\n allowWrites?: boolean;\n dryRun?: boolean;\n observers?: MutationObservers;\n};\n\nconst SKILL_NAME = \"poe-code-memory\";\n\nexport async function installMemory(\n options: MemoryInstallOptions\n): Promise<MemoryInstallResult> {\n if (options.skillOnly && options.mcpOnly) {\n throw new Error(\"--skill-only and --mcp-only cannot be combined.\");\n }\n\n const scope = options.scope ?? \"local\";\n let skillPath: string | undefined;\n\n if (!options.mcpOnly) {\n const installed = await installSkill(\n options.agent,\n {\n name: SKILL_NAME,\n content: options.skillContent\n },\n {\n fs: options.fs,\n cwd: options.cwd,\n homeDir: options.homeDir,\n scope,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n\n skillPath = installed.displayPath;\n }\n\n let mcpConfigPath: string | undefined;\n\n if (!options.skillOnly) {\n await configure(\n options.agent,\n {\n name: SKILL_NAME,\n config: {\n transport: \"stdio\",\n command: \"poe-code\",\n args: options.allowWrites ? [\"memory-mcp\", \"--allow-writes\"] : [\"memory-mcp\"]\n }\n },\n {\n fs: options.fs,\n homeDir: options.homeDir,\n platform: options.platform,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n\n mcpConfigPath = options.agent === \"codex\"\n ? `${options.homeDir}/.config/codex/mcp-config.json`\n : `${options.homeDir}/.mcp.json`;\n }\n\n return {\n skillInstalled: !options.mcpOnly,\n mcpConfigured: !options.skillOnly,\n skillPath,\n mcpConfigPath\n };\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { countTokens } from \"../../tokenfill/dist/index.js\";\nimport { spawn } from \"@poe-code/agent-spawn\";\nimport { resolveAgent } from \"@poe-code/poe-code-config\";\nimport { listPages } from \"./pages.js\";\nimport { MEMORY_INDEX_RELPATH } from \"./paths.js\";\nimport type { MemoryConfigOptions } from \"@poe-code/poe-code-config\";\nimport type { MemoryPage, MemoryRoot, QueryOptions, QueryResult } from \"./types.js\";\n\nexport type QueryContext = {\n prompt: string;\n selectedPages: MemoryPage[];\n tokensUsed: number;\n truncated: boolean;\n};\n\nexport async function queryMemory(root: MemoryRoot, options: QueryOptions): Promise<QueryResult> {\n const pages = await listPages(root);\n if (pages.length === 0) {\n return {\n answer: \"\",\n citations: [],\n tokensUsed: 0,\n budget: options.budget,\n exitCode: 0\n };\n }\n\n const configOptions = {\n fs: fs as MemoryConfigOptions[\"fs\"],\n filePath: path.join(inferRepoRoot(root), \"poe-code.json\")\n } satisfies MemoryConfigOptions;\n const agentId =\n (await resolveAgent(configOptions, options.agent ?? null)) ?? options.agent ?? \"claude-code\";\n const context = await selectQueryContext(root, options.question, options.budget);\n const result = (await spawn(agentId, { prompt: context.prompt })) as unknown as QueryResult;\n\n return {\n answer: result.answer,\n citations: result.citations,\n tokensUsed: result.tokensUsed,\n budget: options.budget,\n exitCode: result.exitCode\n };\n}\n\nexport async function selectQueryContext(\n root: MemoryRoot,\n question: string,\n budget: number\n): Promise<QueryContext> {\n const [indexText, pages] = await Promise.all([\n fs.readFile(path.join(root, MEMORY_INDEX_RELPATH), \"utf8\"),\n listPages(root)\n ]);\n\n const indexTokens = countTokens(indexText);\n if (indexTokens > budget) {\n throw new Error(`budget too small; needs at least ${indexTokens} tokens`);\n }\n\n const rankedPages = rankPagesForQuery(pages, question);\n const selectedPages: MemoryPage[] = [];\n let tokensUsed = indexTokens;\n let truncated = false;\n\n for (const page of rankedPages) {\n const pageTokens = countTokens(renderPageContext(page));\n if (tokensUsed + pageTokens > budget) {\n truncated = true;\n continue;\n }\n\n selectedPages.push(page);\n tokensUsed += pageTokens;\n }\n\n return {\n prompt: buildQueryPrompt(question, indexText, selectedPages),\n selectedPages,\n tokensUsed,\n truncated\n };\n}\n\nexport function rankPagesForQuery(pages: MemoryPage[], question: string): MemoryPage[] {\n const terms = tokenize(question);\n const documents = pages.map((page) => {\n const text = [page.relPath, page.frontmatter.name ?? \"\", page.frontmatter.description ?? \"\", page.body]\n .join(\"\\n\")\n .toLowerCase();\n const tokens = tokenize(text);\n const counts = new Map<string, number>();\n for (const token of tokens) {\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n return { page, counts, size: tokens.length };\n });\n\n const docFrequency = new Map<string, number>();\n for (const term of terms) {\n let count = 0;\n for (const document of documents) {\n if ((document.counts.get(term) ?? 0) > 0) {\n count += 1;\n }\n }\n docFrequency.set(term, count);\n }\n\n return documents\n .map((document) => ({\n page: document.page,\n score: terms.reduce((total, term) => {\n const tf = (document.counts.get(term) ?? 0) / Math.max(document.size, 1);\n const idf = Math.log((documents.length + 1) / ((docFrequency.get(term) ?? 0) + 1)) + 1;\n return total + tf * idf;\n }, 0)\n }))\n .sort((left, right) => right.score - left.score || left.page.relPath.localeCompare(right.page.relPath))\n .map((entry) => entry.page);\n}\n\nfunction buildQueryPrompt(question: string, indexText: string, pages: MemoryPage[]): string {\n const renderedPages = pages.map((page) => renderPageContext(page)).join(\"\\n\\n\");\n return [\n \"Answer using only the provided memory pages.\",\n \"Cite pages and sections with [rel_path \u00A7section]. If memory does not answer the question, say so.\",\n \"No tools are available.\",\n \"\",\n `Question: ${question}`,\n \"\",\n \"INDEX.md\",\n indexText,\n \"\",\n renderedPages\n ].join(\"\\n\");\n}\n\nfunction renderPageContext(page: MemoryPage): string {\n return [`FILE: ${page.relPath}`, page.body].join(\"\\n\");\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\nfunction inferRepoRoot(root: string): string {\n return path.resolve(root, \"..\", \"..\");\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { countTokens } from \"../../tokenfill/dist/index.js\";\nimport { spawn } from \"@poe-code/agent-spawn\";\nimport { resolveAgent } from \"@poe-code/poe-code-config\";\nimport { readPage } from \"./pages.js\";\nimport { selectQueryContext } from \"./query.js\";\nimport type { MemoryConfigOptions } from \"@poe-code/poe-code-config\";\nimport type { ExplainResult, MemoryPage, MemoryRoot, QueryResult, SourceRef } from \"./types.js\";\n\nexport type ExplainOptions = {\n relPath: string;\n budget: number;\n agent?: string;\n};\n\nexport async function explainPage(\n root: MemoryRoot,\n options: ExplainOptions\n): Promise<ExplainResult> {\n const targetPage = await readPageIfPresent(root, options.relPath);\n if (targetPage === undefined) {\n return {\n answer: \"\",\n citations: [],\n tokensUsed: 0,\n budget: options.budget,\n exitCode: 0,\n inboundPages: [],\n outboundSources: []\n };\n }\n\n const allContext = await selectQueryContext(root, options.relPath, Number.MAX_SAFE_INTEGER);\n const relatedPages = collectRelatedPages(allContext.selectedPages, targetPage.relPath, targetPage.frontmatter.sources ?? []);\n const prompt = buildExplainPrompt(targetPage.relPath, relatedPages);\n const tokensUsed = countTokens(prompt);\n if (tokensUsed > options.budget) {\n throw new Error(`budget too small; needs at least ${tokensUsed} tokens`);\n }\n\n const configOptions = {\n fs: fs as MemoryConfigOptions[\"fs\"],\n filePath: path.join(inferRepoRoot(root), \"poe-code.json\")\n } satisfies MemoryConfigOptions;\n const agentId =\n (await resolveAgent(configOptions, options.agent ?? null)) ?? options.agent ?? \"claude-code\";\n const response = (await spawn(agentId, { prompt })) as unknown as QueryResult;\n\n return {\n answer: response.answer,\n citations: response.citations,\n tokensUsed: response.tokensUsed,\n budget: options.budget,\n exitCode: response.exitCode,\n inboundPages: relatedPages\n .filter((page) => page.relPath !== targetPage.relPath)\n .filter((page) => (page.frontmatter.sources ?? []).some((source) => source.path === targetPage.relPath))\n .map((page) => page.relPath),\n outboundSources: targetPage.frontmatter.sources ?? []\n };\n}\n\nfunction collectRelatedPages(\n pages: MemoryPage[],\n targetRelPath: string,\n outboundSources: SourceRef[]\n): MemoryPage[] {\n const memorySourcePaths = new Set(outboundSources.map((source) => source.path));\n return pages.filter((page) => {\n if (page.relPath === targetRelPath) {\n return true;\n }\n\n if (memorySourcePaths.has(page.relPath)) {\n return true;\n }\n\n return (page.frontmatter.sources ?? []).some((source) => source.path === targetRelPath);\n });\n}\n\nfunction buildExplainPrompt(targetRelPath: string, pages: MemoryPage[]): string {\n return [\n \"Summarize the target page using only the provided memory pages.\",\n \"Return a 1-2 paragraph explanation plus the important inbound/outbound links.\",\n \"Cite pages and sections with [rel_path \u00A7section]. If memory is insufficient, say so.\",\n \"No tools are available.\",\n \"\",\n `Target page: ${targetRelPath}`,\n \"\",\n ...pages.map((page) => [`FILE: ${page.relPath}`, page.body].join(\"\\n\"))\n ].join(\"\\n\\n\");\n}\n\nasync function readPageIfPresent(root: MemoryRoot, relPath: string): Promise<MemoryPage | undefined> {\n try {\n return await readPage(root, relPath);\n } catch (error) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n}\n\nfunction inferRepoRoot(root: string): string {\n return path.resolve(root, \"..\", \"..\");\n}\n", "import { explainPage } from \"./explain.js\";\nimport type { ExplainResult } from \"./types.js\";\n\nexport async function runMemoryExplain(input: {\n root: string;\n relPath: string;\n budget: number;\n agent?: string;\n}): Promise<ExplainResult> {\n return explainPage(input.root, {\n relPath: input.relPath,\n budget: input.budget,\n agent: input.agent\n });\n}\n", "import path from \"node:path\";\nimport type { AuditClaimsOptions, PageAudit } from \"./audit.js\";\nimport { auditClaims as auditClaimsFree } from \"./audit.js\";\nimport type { ExplainOptions } from \"./explain.js\";\nimport { explainPage as explainPageFree } from \"./explain.js\";\nimport { ingest as ingestFree } from \"./ingest.js\";\nimport { listPages, readPage } from \"./pages.js\";\nimport { queryMemory } from \"./query.js\";\nimport { searchMemory } from \"./search.js\";\nimport { statusOf } from \"./status.js\";\nimport { computeTokenStats } from \"./tokens.js\";\nimport type {\n ExplainResult,\n IngestOptions,\n IngestResult,\n MemoryDiff,\n MemoryPage,\n MemoryRoot,\n PageFrontmatter,\n QueryOptions,\n QueryResult,\n SearchHit,\n TokenStats\n} from \"./types.js\";\nimport { appendToPage, clearMemory, writePage } from \"./write.js\";\n\nexport type OpenMemoryOptions = {\n root: MemoryRoot;\n agent?: string;\n};\n\nexport type StatusInfo = {\n pageCount: number;\n totalBytes: number;\n lastWriteAt: string | null;\n initialized: boolean;\n};\n\nexport type AuditCallOptions = AuditClaimsOptions & { repoRoot: string };\n\nexport interface MemoryHandle {\n readonly root: MemoryRoot;\n\n listPages(): Promise<MemoryPage[]>;\n readPage(relPath: string): Promise<MemoryPage>;\n searchMemory(query: string): Promise<SearchHit[]>;\n statusOf(): Promise<StatusInfo>;\n computeTokenStats(): Promise<TokenStats>;\n explainPage(opts: ExplainOptions): Promise<ExplainResult>;\n\n writePage(\n relPath: string,\n body: string,\n opts: { reason: string; frontmatter?: PageFrontmatter }\n ): Promise<MemoryDiff>;\n appendToPage(\n relPath: string,\n content: string,\n opts: { reason: string }\n ): Promise<MemoryDiff>;\n clearMemory(): Promise<void>;\n\n query(opts: QueryOptions): Promise<QueryResult>;\n ingest(opts: IngestOptions): Promise<IngestResult>;\n auditClaims(opts: AuditCallOptions): Promise<PageAudit[]>;\n}\n\nexport function openMemory(opts: OpenMemoryOptions): MemoryHandle {\n if (!path.isAbsolute(opts.root)) {\n throw new Error(`openMemory: root must be absolute, got ${opts.root}`);\n }\n\n const root = opts.root;\n const defaultAgent = opts.agent;\n\n return {\n root,\n listPages: async () => await listPages(root),\n readPage: async (relPath) => await readPage(root, relPath),\n searchMemory: async (query) => await searchMemory(root, query),\n statusOf: async () => await statusOf(root),\n computeTokenStats: async () => await computeTokenStats(root),\n explainPage: async (options) => await explainPageFree(root, withDefaultAgent(options, defaultAgent)),\n writePage: async (relPath, body, options) => await writePage(root, relPath, body, options),\n appendToPage: async (relPath, content, options) =>\n await appendToPage(root, relPath, content, options),\n clearMemory: async () => await clearMemory(root),\n query: async (options) => await queryMemory(root, withDefaultAgent(options, defaultAgent)),\n ingest: async (options) => await ingestFree(root, withDefaultAgent(options, defaultAgent)),\n auditClaims: async ({ repoRoot, ...options }) => await auditClaimsFree(root, repoRoot, options)\n };\n}\n\nfunction withDefaultAgent<T extends { agent?: string }>(options: T, agent: string | undefined): T {\n if (options.agent !== undefined || agent === undefined) {\n return options;\n }\n\n return {\n ...options,\n agent\n };\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,OAAO,UAAU;AAGV,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AACjC,IAAM,kCAAkC,GAAG,wBAAwB;AAEnE,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAYA,UAAiB;AAC3B,UAAMA,QAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,kBAAkB,KAAyB;AACzD,SAAO,KAAK,QAAQ,KAAK,aAAa,QAAQ;AAChD;AAEO,SAAS,kBAAkB,OAAuB;AACvD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,gBAAgB,qCAAqC;AAAA,EACjE;AAEA,QAAM,kBAAkB,QAAQ,WAAW,MAAM,GAAG;AACpD,MAAI,KAAK,MAAM,WAAW,eAAe,KAAK,KAAK,MAAM,WAAW,eAAe,GAAG;AACpF,UAAM,IAAI,gBAAgB,qDAAqD,KAAK,IAAI;AAAA,EAC1F;AAEA,QAAM,aAAa,KAAK,MAAM,UAAU,eAAe;AACvD,MAAI,eAAe,OAAO,WAAW,WAAW,GAAG;AACjD,UAAM,IAAI,gBAAgB,kDAAkD;AAAA,EAC9E;AAEA,MAAI,eAAe,QAAQ,WAAW,WAAW,KAAK,GAAG;AACvD,UAAM,IAAI,gBAAgB,kBAAkB,KAAK,kCAAkC;AAAA,EACrF;AAEA,SAAO;AACT;;;AC1CA,OAAOC,WAAU;;;ACEV,SAAS,YACd,OACA,QACoB;AACpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACRO,IAAM,kBAAkB,YAAY,QAAQ;AAAA,EACjD,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACF,CAAC;;;ACTD,OAAOC,WAAU;;;ACAjB,OAAOC,WAAU;AAQjB,eAAsB,SACpB,MACA,OACAC,MACyB;AACzB,QAAM,eAAyB,CAAC;AAEhC,aAAW,YAAY,OAAO;AAC5B,eAAW,aAAa,CAAC,OAAO,SAAS,QAAQ,OAAO,GAAG;AACzD,YAAM,WAAWD,MAAK,KAAK,UAAU,GAAG,IAAI,GAAG,SAAS,EAAE;AAC1D,mBAAa,KAAK,QAAQ;AAE1B,UAAI;AACF,eAAO;AAAA,UACL,SAAS,MAAMC,KAAG,SAAS,UAAU,MAAM;AAAA,UAC3C;AAAA,QACF;AAAA,MACF,SAASC,QAAO;AACd,YAAI,QAAQA,QAAO,QAAQ,GAAG;AAC5B;AAAA,QACF;AAEA,cAAMA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,SAAS,IAAI;AAAA;AAAA,IAAmC,aAAa,KAAK,MAAM,CAAC,EAAE;AAC7F;AAEA,SAAS,QAAQA,QAAgB,MAA8C;AAC7E,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS;AAEnB;;;AC7CA,OAAOC,WAAU;AACjB,OAAO,YAAY;AACnB,SAAS,SAAS,iBAAiB;AAG5B,SAAS,cAAc,SAAiB,UAAkC;AAC/E,QAAM,oBAAoB,SAAS,OAAO;AAC1C,QAAM,SAAS,aAAa,mBAAmB,QAAQ;AACvD,QAAM,OACJ,WAAW,aACP,cAAc,iBAAiB,IAC/B,OAAO,WAAW,SAAS,KAAK,MAAM,iBAAiB,IAAI,UAAU,iBAAiB,CAAC;AAC7F,QAAM,kBAAkB,OAAO,OAAO,MAAM,SAAS;AACrD,QAAM,eAAe,KAAK,YAAY;AAEtC,SAAO,KAAK;AAEZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,aACP,SACA,UAC0B;AAC1B,QAAM,YAAYA,MAAK,QAAQ,QAAQ,EAAE,YAAY;AAErD,MAAI,cAAc,OAAO;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,WAAW,cAAc,QAAQ;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,OAAO,KAAK,QAAQ,WAAW,SAAS,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAA0C;AAC/D,QAAM,WAAW,OAAO,OAAO;AAC/B,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,IAAI;AAAA,IACvB,QAAQ,SAAS;AAAA,EACnB;AACF;AAEA,SAAS,OAAO,OAAyC;AACvD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,EAAE,GAAI,MAAkC;AACjD;AAEA,SAAS,SAAS,SAAyB;AACzC,MAAI,CAAC,QAAQ,WAAW,QAAQ,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,MAAM,CAAC;AACxB;;;ACrEO,SAAS,YAAY,QAAwC;AAClE,SAAO,kBAAkB,QAAQ,CAAC,CAAC;AACrC;AAEA,SAAS,kBAAkB,QAAqBC,QAAmC;AACjF,QAAM,OAAgC,CAAC;AACvC,QAAM,UAAkC,CAAC;AAEzC,aAAW,OAAO,YAAY,MAAM,GAAG;AACrC,UAAM,WAAW,WAAW,QAAQ,KAAKA,MAAI;AAE7C,QAAI,aAAa,QAAW;AAC1B;AAAA,IACF;AAEA,SAAK,GAAG,IAAI,SAAS;AACrB,WAAO,OAAO,SAAS,SAAS,OAAO;AAAA,EACzC;AAEA,SAAO,EAAE,MAAM,QAAQ;AACzB;AAEA,SAAS,YAAY,QAA+B;AAClD,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,QAAQ;AAC1B,eAAW,OAAO,OAAO,KAAK,MAAM,IAAI,GAAG;AACzC,WAAK,IAAI,GAAG;AAAA,IACd;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,IAAI;AACjB;AAEA,SAAS,WACP,QACA,KACAA,QACiE;AACjE,MAAI;AACJ,MAAI;AACJ,QAAM,eAA4B,CAAC;AAEnC,aAAW,SAAS,QAAQ;AAC1B,UAAM,YAAY,MAAM,KAAK,GAAG;AAEhC,QAAI,CAAC,mBAAmB,KAAK,SAAS,GAAG;AACvC;AAAA,IACF;AAEA,QAAI,kBAAkB,QAAW;AAC/B,sBAAgB,MAAM;AACtB,qBAAe;AAEf,UAAI,cAAc,SAAS,GAAG;AAC5B,qBAAa,KAAK;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAEA;AAAA,IACF;AAEA,QAAI,cAAc,YAAY,KAAK,cAAc,SAAS,GAAG;AAC3D,mBAAa,KAAK;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,UAAUA,QAAM,GAAG;AAEpC,MAAI,cAAc,YAAY,GAAG;AAC/B,UAAM,SAAS,kBAAkB,cAAc,CAAC,GAAGA,QAAM,GAAG,CAAC;AAE7D,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,SAAS;AAAA,QACP,CAAC,QAAQ,GAAG;AAAA,QACZ,GAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,WAAW,YAAY;AAAA,IAC9B,SAAS;AAAA,MACP,CAAC,QAAQ,GAAG;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,KAAa,OAAyB;AAChE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,YAAY,UAAU,IAAI;AACpC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,UAAUA,QAAgB,KAAqB;AACtD,SAAO,CAAC,GAAGA,QAAM,GAAG,EAAE,KAAK,GAAG;AAChC;AAEA,SAAS,cAAc,OAAkD;AACvE,MAAI,UAAU,QAAQ,MAAM,QAAQ,KAAK,KAAK,OAAO,UAAU,UAAU;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAEA,SAAS,WAAW,OAAyB;AAC3C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC;AAAA,EAC/C;AAEA,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,OAAO,OAAO,eAAe,KAAK,CAAC;AAExD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAM,GAAG,IAAI,WAAW,KAAK;AAAA,EAC/B;AAEA,SAAO;AACT;;;AClJA,OAAOC,WAAU;AAajB,IAAM,oBAAoB;AAC1B,IAAM,cAAc;AAapB,eAAsB,QACpB,OACA,SAC2B;AAC3B,QAAM,EAAE,YAAY,eAAe,cAAc,IAAI,cAAc,KAAK;AACxE,QAAM,iBAAiB,cAAc,cAAc,SAAS,cAAc,QAAQ;AAClF,QAAM,eAAe,kBAAkB,gBAAgB,QAAQ,UAAU,IACrE,MAAM,iBAAiB;AAAA,IACrB,MAAM,cAAc,YAAY,YAAY,cAAc,QAAQ;AAAA,IAClE;AAAA,IACA;AAAA,IACA,UAAU,CAAC,eAAe;AAAA,IAC1B,SAAS,oBAAI,IAAI,CAAC,cAAc,QAAQ,CAAC;AAAA,IACzC,OAAO;AAAA,EACT,CAAC,IACD;AACJ,QAAM,iBAAiB;AAAA,IACrB;AAAA,MACE,QAAQ,cAAc;AAAA,MACtB,MAAM,eAAe;AAAA,IACvB;AAAA,IACA,cAAc,UAAU,CAAC;AAAA,EAC3B;AACA,QAAM,SAAS,YAAY;AAAA,IACzB,GAAG,kBAAkB,MAAM,MAAM,GAAG,aAAa,CAAC;AAAA,IAClD;AAAA,MACE,QAAQ,cAAc;AAAA,MACtB,MAAM,mBAAmB,eAAe,MAAM,gBAAgB,MAAM;AAAA,IACtE;AAAA,IACA,GAAG,yBAAyB,cAAc,UAAU,CAAC,GAAG,gBAAgB,uBAAuB,oBAAI,IAAY,CAAC;AAAA,IAChH,GAAG,kBAAkB,MAAM,MAAM,gBAAgB,CAAC,CAAC;AAAA,EACrD,CAAC;AAED,MAAI,mBAAmB,UAAa,OAAO,QAAQ,WAAW,cAAc,UAAU,eAAe,WAAW,QAAW;AACzH,WAAO,QAAQ,SAAS,eAAe;AAAA,EACzC;AAEA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,OAAO,CAAC,cAAc,UAAU,GAAI,cAAc,SAAS,CAAC,CAAE;AAAA,EAChE;AACF;AAEA,SAAS,cAAc,OAAsC;AAC3D,QAAM,aAA0B,CAAC;AACjC,QAAM,iBAAiE,CAAC;AAExE,aAAW,CAAC,OAAO,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC5C,QAAI,YAAY,KAAK,GAAG;AACtB;AAAA,IACF;AAEA,QAAI,gBAAgB,KAAK,GAAG;AAC1B,qBAAe,KAAK,EAAE,OAAO,MAAM,CAAC;AACpC;AAAA,IACF;AAEA,QAAI,YAAY,KAAK,GAAG;AACtB,iBAAW,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,eAAe,WAAW,GAAG;AAC/B,UAAM,IAAI,MAAM,oDAAoD,eAAe,MAAM,GAAG;AAAA,EAC9F;AAEA,SAAO;AAAA,IACL;AAAA,IACA,eAAe,eAAe,CAAC,EAAE;AAAA,IACjC,eAAe,eAAe,CAAC,EAAE;AAAA,EACnC;AACF;AAEA,eAAe,iBAAiB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAO2C;AACzC,MAAI,QAAQ,mBAAmB;AAC7B,UAAM,IAAI,MAAM,mCAAmC,iBAAiB,IAAI;AAAA,EAC1E;AAEA,MAAI;AAEJ,MAAI;AACF,qBAAiB,MAAM;AAAA,MACrB;AAAA,MACA,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACpC,QAAQ;AAAA,IACV;AAAA,EACF,SAASC,QAAO;AACd,QAAI,YAAY,oBAAoBA,MAAK,GAAG;AAC1C,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AAEA,MAAI,QAAQ,IAAI,eAAe,QAAQ,GAAG;AACxC,UAAM,IAAI;AAAA,MACR;AAAA;AAAA,IAAiD,CAAC,GAAG,SAAS,eAAe,QAAQ,EAAE,KAAK,MAAM,CAAC;AAAA,IACrG;AAAA,EACF;AAEA,QAAM,mBAAmB,WAAW;AAAA,IAClC,CAAC,UAAU,MAAM,SAASC,MAAK,QAAQ,eAAe,QAAQ;AAAA,EAChE;AAEA,MAAI,qBAAqB,IAAI;AAC3B,UAAM,IAAI,MAAM,mDAAmD,eAAe,QAAQ,EAAE;AAAA,EAC9F;AAEA,QAAM,aAAa,cAAc,eAAe,SAAS,eAAe,QAAQ;AAChF,QAAM,cAAc,IAAI,IAAI,OAAO;AACnC,cAAY,IAAI,eAAe,QAAQ;AACvC,QAAM,aAAa,WAAW,UAC1B,MAAM,iBAAiB;AAAA,IACrB,MAAM,YAAY,eAAe,QAAQ;AAAA,IACzC,YAAY,WAAW,MAAM,mBAAmB,CAAC;AAAA,IACjD;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC,IACD;AAEJ,SAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,QACE,QAAQ,WAAW,gBAAgB,EAAE;AAAA,QACrC,MAAM,WAAW;AAAA,MACnB;AAAA,MACA,GAAI,YAAY,UAAU,CAAC;AAAA,IAC7B;AAAA,IACA,OAAO,CAAC,eAAe,UAAU,GAAI,YAAY,SAAS,CAAC,CAAE;AAAA,EAC/D;AACF;AAEA,SAAS,kBAAkB,OAAkC;AAC3D,SAAO,MAAM,OAAO,WAAW;AACjC;AAQA,SAAS,mBACP,eACA,YACkC;AAClC,QAAM,iBAAiB,cAAc,KAAK;AAE1C,MAAI,mBAAmB,UAAa,OAAO,mBAAmB,UAAU;AACtE,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,QAAW;AAChC,0BAAsB,cAAc;AAAA,EACtC;AAEA,MAAI,SAAS;AACb,MAAI,SAAS,WAAW,UAAa,WAAW,KAAK,SAAY,cAAc;AAC/E,QAAM,sBAAsB,oBAAI,IAAY;AAE5C,aAAW,CAAC,OAAO,KAAK,KAAK,WAAW,QAAQ,GAAG;AACjD,UAAM,YAAY,MAAM,KAAK;AAE7B,QAAI,cAAc,QAAW;AAC3B;AAAA,IACF;AAEA,QAAI,OAAO,cAAc,UAAU;AACjC;AAAA,IACF;AAEA,0BAAsB,SAAS;AAC/B,wBAAoB,IAAI,KAAK;AAC7B,aAAS,uBAAuB,QAAQ,SAAS;AAEjD,QAAI,WAAW,UAAa,cAAc,IAAI;AAC5C,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,WAAW,UAAa,OAAO,SAAS,WAAW,GAAG;AACxD,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAEA,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBACP,MACA,KACQ;AACR,MAAI,SAAS,UAAa,SAAS,IAAI;AACrC,WAAO,IAAI,SAAS,WAAW,IAAI,aAAa,KAAK,EAAE,IAAI;AAAA,EAC7D;AAEA,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO,aAAa,MAAM,GAAG;AAAA,EAC/B;AAEA,MAAI,IAAI,SAAS,WAAW,GAAG;AAC7B,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B;AAEA,SAAO;AACT;AAEA,SAAS,aACP,QACA,aACQ;AACR,SAAO,OAAO,QAAQ,aAAa,WAAW;AAChD;AAEA,SAAS,sBAAsB,QAAsB;AACnD,MAAI,iBAAiB,MAAM,IAAI,GAAG;AAChC,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACF;AAEA,SAAS,iBAAiB,QAAwB;AAChD,SAAO,OAAO,MAAM,WAAW,EAAE,SAAS;AAC5C;AAEA,SAAS,mBACP,MACA,QACyB;AACzB,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,yBACP,QACA,qBACa;AACb,SAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAClC,QAAI,CAAC,oBAAoB,IAAI,KAAK,KAAK,OAAO,MAAM,KAAK,WAAW,UAAU;AAC5E,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,eAAe,GAAG,KAAK,IAAI,MAAM;AAEjD,SAAK;AAEL,WAAO;AAAA,MACL,QAAQ,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,UAA0B;AAC7C,SAAOA,MAAK,SAAS,UAAUA,MAAK,QAAQ,QAAQ,CAAC;AACvD;AAEA,SAAS,kBACP,gBACA,YACS;AACT,SAAO,eAAe,WAAY,eAAe,QAAQ,CAAC,eAAe;AAC3E;AAEA,SAAS,oBAAoBD,QAAgC;AAC3D,SACEA,kBAAiB,SACjBA,OAAM,QAAQ,WAAW,QAAQ,KACjCA,OAAM,QAAQ,SAAS,8BAA8B;AAEzD;AAEA,SAAS,YAAY,OAAuC;AAC1D,SAAO,UAAU;AACnB;AAEA,SAAS,gBAAgB,OAA2C;AAClE,SAAO,cAAc,SAAS,aAAa;AAC7C;AAEA,SAAS,YAAY,OAAuC;AAC1D,SAAO,UAAU;AACnB;;;ACjSA,SAAS,MAAM,SAA4C;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ;AAAA,IACvB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,MAAM,SAA4C;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,UAAU,SAAoD;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEO,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF;;;ACjCA,SAAS,gBAAgB,SAA0D;AACjF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,OAAO,SAA4C;AAC1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,oBAAoB,QAAQ;AAAA,IAC5B,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,gBACP,SACyB;AACzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,MAAM,SAAsC;AACnD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,OAAO,SAAwC;AACtD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEO,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC/DA,SAAS,MAAM,SAA8C;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,UAAU,SAAsD;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,UAAU,SAAsD;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF;;;AC3EA,OAAO,cAAc;;;ACArB,YAAY,WAAW;AAGvB,SAAS,eAAe,OAAuC;AAC7D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAUA,SAASE,OAAM,SAA+B;AAC5C,MAAI,CAAC,WAAW,QAAQ,KAAK,MAAM,IAAI;AACrC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAA6B,CAAC;AACpC,QAAM,SAAe,YAAM,SAAS,QAAQ;AAAA,IAC1C,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,EACpB,CAAC;AACD,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,MAAM,qBAA2B,0BAAoB,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE;AAAA,EACnF;AACA,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO,CAAC;AAAA,EACV;AACA,MAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAA2B;AAC5C,SAAO,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA;AACxC;AAEA,SAASC,OAAM,MAAoB,OAAmC;AACpE,QAAM,SAAuB,EAAE,GAAG,KAAK;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AACA,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAI,eAAe,QAAQ,KAAK,eAAe,KAAK,GAAG;AACrD,aAAO,GAAG,IAAIA,OAAM,UAAU,KAAK;AACnC;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAASC,OACP,KACA,OAC4C;AAC5C,MAAI,UAAU;AACd,QAAM,SAAuB,EAAE,GAAG,IAAI;AAEtC,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,QAAI,EAAE,OAAO,SAAS;AACpB;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,GAAG;AAG1B,QAAI,eAAe,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AAChE,aAAO,OAAO,GAAG;AACjB,gBAAU;AACV;AAAA,IACF;AAGA,QAAI,eAAe,OAAO,KAAK,eAAe,OAAO,GAAG;AACtD,YAAM,EAAE,SAAS,cAAc,QAAQ,YAAY,IAAIA;AAAA,QACrD;AAAA,QACA;AAAA,MACF;AACA,UAAI,cAAc;AAChB,kBAAU;AAAA,MACZ;AACA,UAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,eAAO,OAAO,GAAG;AAAA,MACnB,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AACA;AAAA,IACF;AAEA,WAAO,OAAO,GAAG;AACjB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAsEO,IAAM,aAA2B;AAAA,EACtC,OAAAC;AAAA,EACA;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AACF;;;AC9KA,SAAS,SAAS,WAAW,aAAa,qBAAqB;AAG/D,SAASC,gBAAe,OAAuC;AAC7D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,OAAM,SAA+B;AAC5C,MAAI,CAAC,WAAW,QAAQ,KAAK,MAAM,IAAI;AACrC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,UAAU,OAAO;AAChC,MAAI,CAACD,gBAAe,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAASE,WAAU,KAA2B;AAC5C,QAAM,aAAa,cAAc,GAAG;AACpC,SAAO,WAAW,SAAS,IAAI,IAAI,aAAa,GAAG,UAAU;AAAA;AAC/D;AAEA,SAASC,OAAM,MAAoB,OAAmC;AACpE,QAAM,SAAuB,EAAE,GAAG,KAAK;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AACA,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAIH,gBAAe,QAAQ,KAAKA,gBAAe,KAAK,GAAG;AACrD,aAAO,GAAG,IAAIG,OAAM,UAAU,KAAK;AACnC;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAASC,OACP,KACA,OAC4C;AAC5C,MAAI,UAAU;AACd,QAAM,SAAuB,EAAE,GAAG,IAAI;AAEtC,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,QAAI,EAAE,OAAO,SAAS;AACpB;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,GAAG;AAG1B,QAAIJ,gBAAe,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AAChE,aAAO,OAAO,GAAG;AACjB,gBAAU;AACV;AAAA,IACF;AAGA,QAAIA,gBAAe,OAAO,KAAKA,gBAAe,OAAO,GAAG;AACtD,YAAM,EAAE,SAAS,cAAc,QAAQ,YAAY,IAAII;AAAA,QACrD;AAAA,QACA;AAAA,MACF;AACA,UAAI,cAAc;AAChB,kBAAU;AAAA,MACZ;AACA,UAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,eAAO,OAAO,GAAG;AAAA,MACnB,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AACA;AAAA,IACF;AAEA,WAAO,OAAO,GAAG;AACjB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEO,IAAM,aAA2B;AAAA,EACtC,OAAAH;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AACF;;;ACzFA,SAAS,SAASC,YAAW,aAAa,qBAAqB;AAG/D,SAASC,gBAAe,OAAuC;AAC7D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,OAAM,SAA+B;AAC5C,MAAI,CAAC,WAAW,QAAQ,KAAK,MAAM,IAAI;AACrC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAASF,WAAU,OAAO;AAChC,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO,CAAC;AAAA,EACV;AACA,MAAI,CAACC,gBAAe,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAASE,WAAU,KAA2B;AAC5C,QAAM,aAAa,cAAc,GAAG;AACpC,SAAO,WAAW,SAAS,IAAI,IAAI,aAAa,GAAG,UAAU;AAAA;AAC/D;AAEA,SAASC,OAAM,MAAoB,OAAmC;AACpE,QAAM,SAAuB,EAAE,GAAG,KAAK;AACvC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AACA,UAAM,WAAW,OAAO,GAAG;AAC3B,QAAIH,gBAAe,QAAQ,KAAKA,gBAAe,KAAK,GAAG;AACrD,aAAO,GAAG,IAAIG,OAAM,UAAU,KAAK;AACnC;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAASC,OACP,KACA,OAC4C;AAC5C,MAAI,UAAU;AACd,QAAM,SAAuB,EAAE,GAAG,IAAI;AAEtC,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,QAAI,EAAE,OAAO,SAAS;AACpB;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,GAAG;AAE1B,QAAIJ,gBAAe,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AAChE,aAAO,OAAO,GAAG;AACjB,gBAAU;AACV;AAAA,IACF;AAEA,QAAIA,gBAAe,OAAO,KAAKA,gBAAe,OAAO,GAAG;AACtD,YAAM,EAAE,SAAS,cAAc,QAAQ,YAAY,IAAII,OAAM,SAAS,OAAO;AAC7E,UAAI,cAAc;AAChB,kBAAU;AAAA,MACZ;AACA,UAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,eAAO,OAAO,GAAG;AAAA,MACnB,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,MAChB;AACA;AAAA,IACF;AAEA,WAAO,OAAO,GAAG;AACjB,cAAU;AAAA,EACZ;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEO,IAAM,aAA2B;AAAA,EACtC,OAAAH;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AACF;;;AChFA,IAAM,iBAAmD;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,eAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AAKO,SAAS,gBAAgB,cAAoC;AAElE,MAAI,gBAAgB,gBAAgB;AAClC,WAAO,eAAe,YAA0B;AAAA,EAClD;AAGA,QAAM,MAAM,aAAa,YAAY;AACrC,QAAM,aAAa,aAAa,GAAG;AAEnC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,yDAAyD,YAAY,4BAC1C,OAAO,KAAK,YAAY,EAAE,KAAK,IAAI,CAAC,6BAClC,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,SAAO,eAAe,UAAU;AAClC;AAKO,SAASC,cAAaC,QAAsC;AACjE,QAAM,MAAM,aAAaA,MAAI;AAC7B,SAAO,aAAa,GAAG;AACzB;AAEA,SAAS,aAAaA,QAAsB;AAC1C,QAAM,UAAUA,OAAK,YAAY,GAAG;AACpC,MAAI,YAAY,IAAI;AAClB,WAAO;AAAA,EACT;AACA,SAAOA,OAAK,MAAM,OAAO,EAAE,YAAY;AACzC;;;AC1DA,OAAOC,WAAU;AAMV,SAAS,WAAW,YAAoB,SAAyB;AACtE,MAAI,CAAC,YAAY,WAAW,GAAG,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,WAAW,KAAK,GAAG;AAChC,iBAAa,MAAM,WAAW,MAAM,CAAC,CAAC;AAAA,EACxC;AAEA,MAAI,YAAY,WAAW,MAAM,CAAC;AAGlC,MAAI,UAAU,WAAW,GAAG,KAAK,UAAU,WAAW,IAAI,GAAG;AAC3D,gBAAY,UAAU,MAAM,CAAC;AAAA,EAC/B,WAAW,UAAU,WAAW,GAAG,GAAG;AAEpC,gBAAY,UAAU,MAAM,CAAC;AAC7B,QAAI,UAAU,WAAW,GAAG,KAAK,UAAU,WAAW,IAAI,GAAG;AAC3D,kBAAY,UAAU,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,UAAU,WAAW,IAAI,UAAUA,MAAK,KAAK,SAAS,SAAS;AACxE;AAMO,SAAS,iBAAiB,YAA0B;AACzD,MAAI,OAAO,eAAe,YAAY,WAAW,WAAW,GAAG;AAC7D,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,MAAI,CAAC,WAAW,WAAW,GAAG,GAAG;AAC/B,UAAM,IAAI;AAAA,MACR,qEAAqE,UAAU;AAAA,IACjF;AAAA,EACF;AACF;AAQO,SAAS,YACd,SACA,SACA,YACQ;AACR,mBAAiB,OAAO;AACxB,QAAM,WAAW,WAAW,SAAS,OAAO;AAE5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAGA,QAAM,eAAeA,MAAK,QAAQ,QAAQ;AAC1C,QAAM,kBAAkB,WAAW,mBAAmB;AAAA,IACpD,iBAAiB;AAAA,EACnB,CAAC;AACD,QAAM,WAAWA,MAAK,SAAS,QAAQ;AAEvC,SAAO,SAAS,WAAW,IAAI,kBAAkBA,MAAK,KAAK,iBAAiB,QAAQ;AACtF;;;ACrEO,SAAS,WAAWC,QAAyB;AAClD,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACTA,OAA4B,SAAS;AAE1C;AAKA,eAAsB,iBACpBC,MACA,QACwB;AACxB,MAAI;AACF,WAAO,MAAMA,KAAG,SAAS,QAAQ,MAAM;AAAA,EACzC,SAASD,QAAO;AACd,QAAI,WAAWA,MAAK,GAAG;AACrB,aAAO;AAAA,IACT;AACA,UAAMA;AAAA,EACR;AACF;AAKA,eAAsB,WACpBC,MACA,QACkB;AAClB,MAAI;AACF,UAAMA,KAAG,KAAK,MAAM;AACpB,WAAO;AAAA,EACT,SAASD,QAAO;AACd,QAAI,WAAWA,MAAK,GAAG;AACrB,aAAO;AAAA,IACT;AACA,UAAMA;AAAA,EACR;AACF;AAMO,SAAS,kBAA0B;AACxC,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG;AAC1E;;;AN/BA,SAAS,aACP,UACA,SACG;AACH,MAAI,OAAO,aAAa,YAAY;AAClC,WAAQ,SAAyC,OAAO;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,SAAS,gCAAgC,YAA4B;AACnE,QAAM,MAAM,WAAW,SAAS,GAAG,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI,IAAI;AACrE,SAAO,GAAG,UAAU,YAAY,gBAAgB,CAAC,IAAI,GAAG;AAC1D;AAEA,eAAe,sBACbE,MACA,YACA,SACe;AACf,QAAM,aAAa,gCAAgC,UAAU;AAC7D,QAAMA,KAAG,UAAU,YAAY,SAAS,EAAE,UAAU,OAAO,CAAC;AAC9D;AAEA,SAAS,iBAAiB,MAAc,YAA6B;AACnE,QAAM,cAAc,cAAc;AAClC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,UAAU,WAAW;AAAA,IAC9B,KAAK;AACH,aAAO,oBAAoB,WAAW;AAAA,IACxC,KAAK;AACH,aAAO,UAAU,WAAW;AAAA,IAC9B,KAAK;AACH,aAAO,SAAS,WAAW;AAAA,IAC7B,KAAK;AACH,aAAO,sBAAsB,WAAW;AAAA,IAC1C,KAAK;AACH,aAAO,UAAU,WAAW;AAAA,IAC9B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,WAAW;AAAA,IAC9B;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,kBACP,OACA,QACc;AACd,QAAM,SAAuB,CAAC;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,IAAI,WAAW,MAAM,GAAG;AAC3B,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASC,gBAAe,OAAuC;AAC7D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,uBACP,MACA,OACA,eACc;AACd,QAAM,SAAuB,EAAE,GAAG,KAAK;AACvC,QAAM,YAAY,iBAAiB,CAAC;AAEpC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAM,UAAU,OAAO,GAAG;AAC1B,UAAM,SAAS,UAAU,GAAG;AAE5B,QAAIA,gBAAe,OAAO,KAAKA,gBAAe,KAAK,GAAG;AACpD,UAAI,QAAQ;AACV,cAAM,SAAS,kBAAkB,SAAS,MAAM;AAChD,eAAO,GAAG,IAAI,EAAE,GAAG,QAAQ,GAAG,MAAM;AAAA,MACtC,OAAO;AACL,eAAO,GAAG,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;AAMA,eAAsB,cACpB,UACA,SACA,SACiE;AACjE,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK;AACH,aAAO,qBAAqB,UAAU,SAAS,OAAO;AAAA,IACxD,KAAK;AACH,aAAO,qBAAqB,UAAU,SAAS,OAAO;AAAA,IACxD,KAAK;AACH,aAAO,gBAAgB,UAAU,SAAS,OAAO;AAAA,IACnD,KAAK;AACH,aAAO,WAAW,UAAU,SAAS,OAAO;AAAA,IAC9C,KAAK;AACH,aAAO,YAAY,UAAU,SAAS,OAAO;AAAA,IAC/C,KAAK;AACH,aAAO,iBAAiB,UAAU,SAAS,OAAO;AAAA,IACpD,KAAK;AACH,aAAO,iBAAiB,UAAU,SAAS,OAAO;AAAA,IACpD,KAAK;AACH,aAAO,qBAAqB,UAAU,SAAS,OAAO;AAAA,IACxD,KAAK;AACH,aAAO,mBAAmB,UAAU,SAAS,OAAO;AAAA,IACtD,KAAK;AACH,aAAO,mBAAmB,UAAU,SAAS,SAAS,MAAM;AAAA,IAC9D,KAAK;AACH,aAAO,mBAAmB,UAAU,SAAS,SAAS,MAAM;AAAA,IAC9D,SAAS;AACP,YAAM,QAAe;AACrB,YAAM,IAAI,MAAM,0BAA2B,MAAmB,IAAI,EAAE;AAAA,IACtE;AAAA,EACF;AACF;AAMA,eAAe,qBACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,MAAM,OAAO;AACnD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,WAAW,QAAQ,IAAI,UAAU;AAEvD,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EACxD;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS,CAAC;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ,UAAU,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,qBACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,MAAM,OAAO;AACnD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,WAAW,QAAQ,IAAI,UAAU;AACvD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,GAAG,OAAO,YAAY;AACvC,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,OAAO;AAClB,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,QAAQ,GAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAClE;AACA,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,MAAM,QAAQ,UAAU,QAAQ,SAAS;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,QAAQ,GAAG,QAAQ,UAAU;AACnD,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,QAAQ,GAAG,GAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAClE;AAEA,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,MAAM,QAAQ,UAAU,QAAQ,SAAS;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,eAAe,gBACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,GAAG,SAAS,YAAY,MAAM;AAC5D,UAAM,UAAU,QAAQ,KAAK;AAG7B,QAAI,SAAS,sBAAsB,CAAC,SAAS,mBAAmB,KAAK,OAAO,GAAG;AAC7E,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,aAAa,QAAQ,SAAS,GAAG;AAC5C,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,QAAQ,GAAG,OAAO,UAAU;AAAA,IACpC;AAEA,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,MAAM,QAAQ,UAAU,QAAQ,SAAS;AAAA,MAC7D;AAAA,IACF;AAAA,EACF,SAASC,QAAO;AACd,QAAI,WAAWA,MAAK,GAAG;AACrB,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,UAAMA;AAAA,EACR;AACF;AAEA,eAAe,WACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,GAAG,UAAU,YAAY;AAC1C,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAMC,QAAO,MAAM,QAAQ,GAAG,KAAK,UAAU;AAC7C,UAAM,cAAc,OAAOA,MAAK,SAAS,WAAWA,MAAK,OAAO,MAAQ;AAExE,QAAI,gBAAgB,SAAS,MAAM;AACjC,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,QAAQ,GAAG,MAAM,YAAY,SAAS,IAAI;AAAA,IAClD;AAEA,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,SAAS;AAAA,MAC5D;AAAA,IACF;AAAA,EACF,SAASD,QAAO;AACd,QAAI,WAAWA,MAAK,GAAG;AACrB,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,UAAMA;AAAA,EACR;AACF;AAEA,eAAe,YACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,iBAAiB,QAAQ,IAAI,UAAU;AAC7D,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,aAAa,GAAG,UAAU,WAAW,gBAAgB,CAAC;AAC5D,UAAM,QAAQ,GAAG,UAAU,YAAY,SAAS,EAAE,UAAU,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,MAAM,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IAC3D;AAAA,EACF;AACF;AAMA,eAAe,iBACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,aAAa,SAAS,UAAUE,cAAa,OAAO;AAC1D,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,oCAAoC,OAAO;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,SAAS,gBAAgB,UAAU;AAEzC,QAAM,aAAa,MAAM,iBAAiB,QAAQ,IAAI,UAAU;AAChE,MAAI;AACJ,MAAI;AACF,cAAU,eAAe,OAAO,CAAC,IAAI,OAAO,MAAM,UAAU;AAAA,EAC9D,QAAQ;AAEN,QAAI,eAAe,MAAM;AACvB,YAAM,sBAAsB,QAAQ,IAAI,YAAY,UAAU;AAAA,IAChE;AACA,cAAU,CAAC;AAAA,EACb;AAEA,QAAM,QAAQ,aAAa,SAAS,OAAO,OAAO;AAGlD,MAAI;AACJ,MAAI,SAAS,eAAe;AAC1B,aAAS,uBAAuB,SAAS,OAAO,SAAS,aAAa;AAAA,EACxE,OAAO;AACL,aAAS,OAAO,MAAM,SAAS,KAAK;AAAA,EACtC;AAEA,QAAM,aAAa,OAAO,UAAU,MAAM;AAC1C,QAAM,UAAU,eAAe;AAE/B,MAAI,WAAW,CAAC,QAAQ,QAAQ;AAC9B,UAAM,QAAQ,GAAG,UAAU,YAAY,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,MACA,QAAQ,UAAU,UAAU;AAAA,MAC5B,QAAQ,UAAW,eAAe,OAAO,WAAW,WAAY;AAAA,IAClE;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,iBACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,iBAAiB,QAAQ,IAAI,UAAU;AAChE,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,SAAS,UAAUA,cAAa,OAAO;AAC1D,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,oCAAoC,OAAO;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,SAAS,gBAAgB,UAAU;AAEzC,MAAI;AACJ,MAAI;AACF,cAAU,OAAO,MAAM,UAAU;AAAA,EACnC,QAAQ;AAEN,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,MAAI,SAAS,UAAU,CAAC,SAAS,OAAO,SAAS,OAAO,GAAG;AACzD,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,aAAa,SAAS,OAAO,OAAO;AAClD,QAAM,EAAE,SAAS,OAAO,IAAI,OAAO,MAAM,SAAS,KAAK;AAEvD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,QAAQ,GAAG,OAAO,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,MAAM,QAAQ,UAAU,QAAQ,SAAS;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,UAAU,MAAM;AAC1C,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,QAAQ,GAAG,UAAU,YAAY,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,SAAS,EAAE,SAAS,MAAM,QAAQ,SAAS,QAAQ,SAAS;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAe,qBACb,UACA,SACA,SACiE;AACjE,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,aAAa,SAAS,UAAUA,cAAa,OAAO;AAC1D,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,oCAAoC,OAAO;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,SAAS,gBAAgB,UAAU;AAEzC,QAAM,aAAa,MAAM,iBAAiB,QAAQ,IAAI,UAAU;AAChE,MAAI;AACJ,MAAI;AACF,cAAU,eAAe,OAAO,CAAC,IAAI,OAAO,MAAM,UAAU;AAAA,EAC9D,QAAQ;AACN,QAAI,eAAe,MAAM;AACvB,YAAM,sBAAsB,QAAQ,IAAI,YAAY,UAAU;AAAA,IAChE;AACA,cAAU,CAAC;AAAA,EACb;AAEA,QAAM,EAAE,SAAS,aAAa,QAAQ,IAAI,SAAS,UAAU,SAAS,OAAO;AAE7E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,MAAI,gBAAgB,MAAM;AACxB,QAAI,eAAe,MAAM;AACvB,aAAO;AAAA,QACL,SAAS,EAAE,SAAS,OAAO,QAAQ,QAAQ,QAAQ,OAAO;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,QAAQ,GAAG,OAAO,UAAU;AAAA,IACpC;AACA,WAAO;AAAA,MACL,SAAS,EAAE,SAAS,MAAM,QAAQ,UAAU,QAAQ,SAAS;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,UAAU,WAAW;AAC/C,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,QAAQ,GAAG,UAAU,YAAY,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,eAAe,OAAO,WAAW;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACF;AAMA,eAAe,mBACb,UACA,SACA,SACiE;AACjE,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,QAAQ,UAAU,SAAS,UAAU;AAC5D,QAAM,kBAAkB,SAAS,UAC7B,aAAa,SAAS,SAAS,OAAO,IACtC,CAAC;AACL,QAAM,WAAW,SAAS,OAAO,UAAU,eAAe;AAE1D,QAAM,UAAU,MAAM,WAAW,QAAQ,IAAI,UAAU;AAEvD,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,QAAQ,GAAG,UAAU,YAAY,UAAU,EAAE,UAAU,OAAO,CAAC;AAAA,EACvE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,UAAU,WAAW;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,mBACb,UACA,SACA,SACA,YACiE;AACjE,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,SAAS,QAAQ,OAAO;AACrD,QAAM,aAAa,YAAY,SAAS,QAAQ,SAAS,QAAQ,UAAU;AAE3E,QAAM,UAA2B;AAAA,IAC/B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,iBAAiB,SAAS,MAAM,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,SAAS,gBAAgB,UAAU;AAGzC,QAAM,WAAW,MAAM,QAAQ,UAAU,SAAS,UAAU;AAC5D,QAAM,kBAAkB,SAAS,UAC7B,aAAa,SAAS,SAAS,OAAO,IACtC,CAAC;AACL,QAAM,WAAW,SAAS,OAAO,UAAU,eAAe;AAG1D,MAAI;AACJ,MAAI;AACF,kBAAc,OAAO,MAAM,QAAQ;AAAA,EACrC,SAASF,QAAO;AACd,UAAM,IAAI;AAAA,MACR,sCAAsC,SAAS,UAAU,QAAQ,WAAW,YAAY,CAAC,KAAKA,MAAK;AAAA,MACnG,EAAE,OAAOA,OAAM;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,aAAa,MAAM,iBAAiB,QAAQ,IAAI,UAAU;AAChE,MAAI;AACJ,MAAI;AACF,cAAU,eAAe,OAAO,CAAC,IAAI,OAAO,MAAM,UAAU;AAAA,EAC9D,QAAQ;AACN,QAAI,eAAe,MAAM;AACvB,YAAM,sBAAsB,QAAQ,IAAI,YAAY,UAAU;AAAA,IAChE;AACA,cAAU,CAAC;AAAA,EACb;AAGA,QAAM,SAAS,OAAO,MAAM,SAAS,WAAW;AAChD,QAAM,aAAa,OAAO,UAAU,MAAM;AAC1C,QAAM,UAAU,eAAe;AAE/B,MAAI,WAAW,CAAC,QAAQ,QAAQ;AAC9B,UAAM,QAAQ,GAAG,UAAU,YAAY,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,MACA,QAAQ,UAAU,UAAU;AAAA,MAC5B,QAAQ,UAAW,eAAe,OAAO,WAAW,WAAY;AAAA,IAClE;AAAA,IACA;AAAA,EACF;AACF;;;AOzsBA,eAAsB,aACpB,WACA,SACA,SACyB;AACzB,QAAM,UAAqC,CAAC;AAC5C,MAAI,aAAa;AACjB,QAAM,kBAAkB,WAAW,CAAC;AAEpC,aAAW,YAAY,WAAW;AAChC,UAAM,EAAE,QAAQ,IAAI,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,YAAQ,KAAK,OAAO;AACpB,QAAI,QAAQ,SAAS;AACnB,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,gBACb,UACA,SACA,SACwH;AAExH,UAAQ,WAAW,UAAU;AAAA,IAC3B,MAAM,SAAS;AAAA,IACf,OAAO,SAAS,SAAS,SAAS;AAAA,IAClC,YAAY;AAAA;AAAA,EACd,CAAC;AAED,MAAI;AACF,UAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,cAAc,UAAU,SAAS,OAAO;AAG3E,YAAQ,WAAW,aAAa,SAAS,OAAO;AAEhD,WAAO,EAAE,SAAS,QAAQ;AAAA,EAC5B,SAASG,QAAO;AAEd,YAAQ,WAAW;AAAA,MACjB;AAAA,QACE,MAAM,SAAS;AAAA,QACf,OAAO,SAAS,SAAS,SAAS;AAAA,QAClC,YAAY;AAAA,MACd;AAAA,MACAA;AAAA,IACF;AAGA,UAAMA;AAAA,EACR;AACF;;;ACzEA,OAAOC,eAAc;AAKrB,IAAM,iBAAiBA,UAAS;;;AhBuBhC,eAAsB,mBACpBC,MACA,YACA,aACyB;AACzB,QAAM,iBAAiB,MAAM,mBAAmBA,MAAI,UAAU;AAC9D,MAAI,CAAC,aAAa;AAChB,WAAO,eAAe;AAAA,EACxB;AAEA,QAAM,kBAAkB,MAAM,mBAAmBA,MAAI,WAAW;AAChE,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,MACE;AAAA,QACE,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,gBAAgB;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAMC,MAAK,QAAQ,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAI,uBAAuBD,MAAI,YAAY,eAAe,OAAO;AAAA,MACjE,YAAY;AAAA,IACd;AAAA,EACF;AAEA,SAAO,kBAAkB,SAAS,IAAI;AACxC;AAEA,eAAe,mBACbA,MACA,UACoD;AACpD,MAAI;AACF,UAAM,MAAM,MAAMA,KAAG,SAAS,UAAU,MAAM;AAC9C,WAAO,MAAM,oBAAoBA,MAAI,UAAU,GAAG;AAAA,EACpD,SAASE,QAAO;AACd,QAAI,WAAWA,MAAK,GAAG;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,MACT;AAAA,IACF;AAEA,UAAMA;AAAA,EACR;AACF;AAEA,eAAe,oBACbF,MACA,UACA,KACoD;AACpD,MAAI;AACF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,kBAAkB,KAAK,MAAM,GAAG,CAAC;AAAA,IACzC;AAAA,EACF,SAASE,QAAO;AACd,QAAIA,kBAAiB,aAAa;AAChC,YAAM,uBAAuBF,MAAI,UAAU,GAAG;AAC9C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,MACT;AAAA,IACF;AACA,UAAME;AAAA,EACR;AACF;AAEA,SAAS,kBAAkB,OAAgC;AACzD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAA2B,CAAC;AAClC,aAAW,CAAC,OAAO,WAAW,KAAK,OAAO,QAAQ,KAAK,GAAG;AACxD,UAAM,mBAAmB,qBAAqB,WAAW;AACzD,QAAI,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AAC5C,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAyC;AACrE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,QAAW;AACvB,iBAAW,GAAG,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBACPF,MACA,YACA,eACmB;AACnB,SAAO;AAAA,IACL,SAAS,UAAkB,WAA2B;AACpD,UAAI,aAAa,YAAY;AAC3B,eAAO,QAAQ,QAAQ,aAAa;AAAA,MACtC;AAEA,aAAOA,KAAG,SAAS,UAAU,MAAM;AAAA,IACrC;AAAA,EACF;AACF;AAaA,eAAe,uBACbG,MACA,UACA,SACe;AACf,QAAMA,KAAG,MAAMC,MAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAM,aAAa,wBAAwB,QAAQ;AACnD,QAAMD,KAAG,UAAU,YAAY,SAAS,EAAE,UAAU,OAAO,CAAC;AAC5D,QAAMA,KAAG,UAAU,UAAU,gBAAgB,EAAE,UAAU,OAAO,CAAC;AACnE;AAEA,SAAS,wBAAwB,UAA0B;AACzD,QAAM,YAAYC,MAAK,QAAQ,QAAQ;AACvC,QAAM,WAAWA,MAAK,SAAS,QAAQ;AACvC,SAAOA,MAAK,KAAK,WAAW,GAAG,QAAQ,YAAY,gBAAgB,CAAC,OAAO;AAC7E;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC;AAC5E;AAUA,IAAM,iBAAiB,GAAG,KAAK,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA;;;AiB1KrD,eAAsB,qBACpB,SAC6B;AAC7B,UAAQ,MAAM,oBAAoB,OAAO,GAAG;AAC9C;AAEA,eAAsB,aACpB,SACA,eACwB;AACxB,QAAM,SAAS,MAAM,oBAAoB,OAAO;AAChD,SAAO,OAAO,eAAe;AAC/B;AAEA,eAAsB,kBAAkB,SAA+C;AACrF,UAAQ,MAAM,oBAAoB,OAAO,GAAG;AAC9C;AAEA,eAAsB,aAAa,SAAgD;AACjF,UAAQ,MAAM,oBAAoB,OAAO,GAAG;AAC9C;AAUA,eAAe,oBACb,SAC+B;AAC/B,QAAM,WAAW,MAAM,mBAAmB,QAAQ,IAAI,QAAQ,UAAU,QAAQ,eAAe;AAC/F,QAAM,SAAS,SAAS,SAAS,MAAM;AACvC,QAAM,QAAQ,SAAS,QAAQ,KAAK;AACpC,QAAM,MAAM,SAAS,QAAQ,GAAG;AAChC,QAAM,QAAQ,SAAS,QAAQ,KAAK;AAEpC,SAAO;AAAA,IACL,MAAM,WAAW,QAAQ,IAAI;AAAA,IAC7B,aAAa,WAAW,QAAQ,WAAW;AAAA,IAC3C,iBAAiB,WAAW,QAAQ,eAAe,KAAK;AAAA,IACxD,cAAc,YAAY,OAAO,OAAO,KAAK;AAAA,IAC7C,kBAAkB,YAAY,KAAK,WAAW,KAAK;AAAA,IACnD,oBAAoB,WAAW,OAAO,mBAAmB,KAAK;AAAA,EAChE;AACF;AAEA,SAAS,SAAS,OAAqD;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,WAAW,OAAoC;AACtD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,YAAY,OAAqC;AACxD,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;;;ACrFA,OAAOC,WAAU;AAoIjB,IAAMC,kBAAiB,GAAG,KAAK,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA;;;ArB9H9C,IAAM,sBAAsB;AAUnC,eAAsB,4BACpB,SACqB;AACrB,QAAM,cAAc,QAAQ,IAAI,mBAAmB,GAAG,KAAK;AAC3D,MAAI,eAAe,YAAY,SAAS,GAAG;AACzC,WAAO,kBAAkB,QAAQ,KAAK,WAAW;AAAA,EACnD;AAEA,QAAM,kBACJ,MAAM,qBAAqB;AAAA,IACzB,IAAI,QAAQ;AAAA,IACZ,UAAU,QAAQ;AAAA,IAClB,iBAAiB,QAAQ;AAAA,EAC3B,CAAC,IACA,KAAK;AACR,MAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,WAAO,kBAAkB,QAAQ,KAAK,cAAc;AAAA,EACtD;AAEA,SAAO,kBAAkB,QAAQ,GAAG;AACtC;AAEA,SAAS,kBAAkB,KAAa,OAAuB;AAC7D,SAAOC,MAAK,WAAW,KAAK,IAAI,QAAQA,MAAK,QAAQ,KAAK,KAAK;AACjE;;;AsBxCA,YAAY,QAAQ;AACpB,OAAOC,WAAU;AAQjB,eAAsB,WAAW,MAAiC;AAChE,QAAS,SAAMC,MAAK,KAAK,MAAM,wBAAwB,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7E,QAAM,mBAAmBA,MAAK,KAAK,MAAM,oBAAoB,GAAG,kBAAkB;AAClF,QAAM,mBAAmBA,MAAK,KAAK,MAAM,kBAAkB,GAAG,EAAE;AAClE;AAEA,eAAe,mBAAmB,UAAkB,SAAgC;AAClF,MAAI;AACF,UAAS,aAAU,UAAU,SAAS,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAAA,EACxE,SAASC,QAAO;AACd,QAAI,CAAC,aAAaA,QAAO,QAAQ,GAAG;AAClC,YAAMA;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,aAAaA,QAAgB,MAAuB;AAC3D,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS;AAEnB;;;AChCA,YAAYC,SAAQ;AACpB,OAAOC,YAAU;;;ACDjB,SAAS,SAAAC,QAAO,iBAAiB;AAQ1B,SAAS,iBAAiB,UAAqC;AACpE,QAAM,UAAU,SAAS,WAAW,QAAQ,IAAI,SAAS,MAAM,CAAC,IAAI;AACpE,QAAM,mBAAmB,qBAAqB,OAAO;AACrD,MAAI,qBAAqB,QAAW;AAClC,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,mBAAmB,IAAI,iBAAiB;AAC9C,QAAM,oBAAoB,iBAAiB,SAAS,gBAAgB;AACpE,QAAM,YAAY,QAAQ,MAAM,kBAAkB,iBAAiB;AACnE,QAAM,YAAY,oBAAoB;AAEtC,SAAO;AAAA,IACL,aAAa,qBAAqB,qBAAqB,SAAS,CAAC;AAAA,IACjE,MAAM,SAAS,SAAS,SAAS;AAAA,EACnC;AACF;AAEO,SAAS,qBAAqB,aAA8B,MAAsB;AACvF,QAAM,aAAa;AAAA,IACjB,GAAI,YAAY,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,YAAY,KAAK;AAAA,IACnE,GAAI,YAAY,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,YAAY,YAAY;AAAA,IACxF,GAAI,YAAY,kBAAkB,SAC9B,CAAC,IACD,EAAE,iBAAiB,YAAY,cAAc;AAAA,IACjD,GAAI,YAAY,YAAY,UAAa,YAAY,QAAQ,WAAW,IACpE,CAAC,IACD,EAAE,SAAS,YAAY,QAAQ,IAAI,CAAC,WAAW,mBAAmB,MAAM,CAAC,EAAE;AAAA,EACjF;AAEA,MAAI,OAAO,KAAK,UAAU,EAAE,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAQ,UAAU,UAAU,EAAE,QAAQ,CAAC;AAAA;AAAA,EAAU,IAAI;AAC9D;AAEO,SAAS,eAAe,YAA+B;AAC5D,QAAM,CAAC,SAAS,SAAS,IAAI,WAAW,MAAM,KAAK,CAAC;AACpD,QAAM,iBAAiB,SAAS,KAAK;AACrC,MAAI,mBAAmB,UAAa,eAAe,WAAW,GAAG;AAC/D,UAAM,IAAI,MAAM,uBAAuB,UAAU,IAAI;AAAA,EACvD;AAEA,MAAI,cAAc,QAAW;AAC3B,WAAO,EAAE,MAAM,eAAe;AAAA,EAChC;AAEA,QAAM,kBAAkB,WAAW,KAAK,SAAS;AACjD,MAAI,oBAAoB,MAAM;AAC5B,UAAM,YAAY,OAAO,SAAS,gBAAgB,CAAC,GAAG,EAAE;AACxD,0BAAsB,WAAW,UAAU;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,mBAAmB,KAAK,SAAS;AACpD,MAAI,eAAe,MAAM;AACvB,UAAM,YAAY,OAAO,SAAS,WAAW,CAAC,GAAG,EAAE;AACnD,UAAM,UAAU,OAAO,SAAS,WAAW,CAAC,GAAG,EAAE;AACjD,0BAAsB,WAAW,UAAU;AAC3C,0BAAsB,SAAS,UAAU;AACzC,QAAI,UAAU,WAAW;AACvB,YAAM,IAAI,MAAM,uBAAuB,UAAU,4BAA4B;AAAA,IAC/E;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,uBAAuB,UAAU,IAAI;AACvD;AAEO,SAAS,mBAAmB,QAA2B;AAC5D,MAAI,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACnC,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,MAAI,OAAO,cAAc,QAAW;AAClC,QAAI,OAAO,YAAY,QAAW;AAChC,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,WAAO,OAAO;AAAA,EAChB;AAEA,wBAAsB,OAAO,WAAW,OAAO,IAAI;AACnD,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,GAAG,OAAO,IAAI,KAAK,OAAO,SAAS;AAAA,EAC5C;AAEA,wBAAsB,OAAO,SAAS,OAAO,IAAI;AACjD,MAAI,OAAO,UAAU,OAAO,WAAW;AACrC,UAAM,IAAI,MAAM,uBAAuB,OAAO,IAAI,4BAA4B;AAAA,EAChF;AAEA,SAAO,GAAG,OAAO,IAAI,KAAK,OAAO,SAAS,KAAK,OAAO,OAAO;AAC/D;AAEA,SAAS,qBAAqB,UAA6C;AACzE,MAAI,CAAC,SAAS,WAAW,KAAK,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,CAAC;AAChC,MAAI,kBAAkB,MAAM;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,QAAQ,SAAS,CAAC,MAAM,MAAM;AAClD,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,SAAY,OAAO;AAC9C;AAEA,SAAS,iBAAiB,UAAkB,YAA4B;AACtE,MAAI,eAAe,aAAa;AAEhC,SAAO,eAAe,SAAS,QAAQ;AACrC,UAAM,iBAAiB,SAAS,QAAQ,SAAS,YAAY;AAC7D,QAAI,mBAAmB,IAAI;AACzB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,UAAM,WAAW,iBAAiB;AAClC,UAAM,gBAAgB,SAAS,QAAQ;AACvC,QAAI,kBAAkB,QAAQ,kBAAkB,QAAW;AACzD,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,QAAQ,SAAS,WAAW,CAAC,MAAM,MAAM;AAC7D,aAAO;AAAA,IACT;AAEA,mBAAe;AAAA,EACjB;AAEA,QAAM,IAAI,MAAM,+CAA+C;AACjE;AAEA,SAAS,SAAS,UAAkB,WAA2B;AAC7D,QAAM,gBAAgB,SAAS,SAAS;AACxC,MAAI,kBAAkB,MAAM;AAC1B,WAAO,SAAS,MAAM,YAAY,CAAC;AAAA,EACrC;AAEA,MAAI,kBAAkB,QAAQ,SAAS,YAAY,CAAC,MAAM,MAAM;AAC9D,WAAO,SAAS,MAAM,YAAY,CAAC;AAAA,EACrC;AAEA,SAAO,SAAS,MAAM,SAAS;AACjC;AAEA,SAAS,qBAAqB,WAA4C;AACxE,QAAM,sBAAsB,UAAU,SAAS,IAAI,IAC/C,UAAU,WAAW,QAAQ,IAAI,EAAE,WAAW,MAAM,EAAE,IACtD;AAEJ,MAAI;AACJ,MAAI;AACF,aAASA,OAAM,mBAAmB;AAAA,EACpC,SAASC,QAAO;AACd,UAAMC,WAAUD,kBAAiB,QAAQA,OAAM,UAAU;AACzD,UAAM,IAAI,MAAM,6BAA6BC,QAAO,EAAE;AAAA,EACxD;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAACC,UAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAiD;AAC7E,QAAM,OAAO,mBAAmB,MAAM,MAAM,MAAM;AAClD,QAAM,cAAc,mBAAmB,MAAM,aAAa,aAAa;AACvE,QAAM,gBAAgB;AAAA,IACpB,MAAM,mBAAmB,MAAM;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,UAAU,aAAa,MAAM,OAAO;AAE1C,SAAO;AAAA,IACL,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,GAAI,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY;AAAA,IACnD,GAAI,kBAAkB,SAAY,CAAC,IAAI,EAAE,cAAc;AAAA,IACvD,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,EAC7C;AACF;AAEA,SAAS,aAAa,OAAyC;AAC7D,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,eAAe,IAAI;AAAA,IAC5B;AAEA,QAAI,CAACA,UAAS,IAAI,GAAG;AACnB,YAAM,IAAI,MAAM,+EAA+E;AAAA,IACjG;AAEA,UAAMC,SAAO,mBAAmB,KAAK,MAAM,gBAAgB;AAC3D,UAAM,YAAY,4BAA4B,KAAK,WAAW,qBAAqB;AACnF,UAAM,UAAU,4BAA4B,KAAK,SAAS,mBAAmB;AAC7E,WAAO,eAAe,mBAAmB,EAAE,MAAAA,QAAM,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,UAAU,GAAI,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ,EAAG,CAAC,CAAC;AAAA,EACtJ,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAgB,OAAmC;AAC7E,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,YAAY,KAAK,mCAAmC;AAAA,EACtE;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAgB,OAAuB;AACjE,QAAM,SAAS,mBAAmB,OAAO,KAAK;AAC9C,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,MAAM,YAAY,KAAK,mCAAmC;AAAA,EACtE;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,OAAgB,OAAmC;AACtF,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AACvE,UAAM,IAAI,MAAM,YAAY,KAAK,6CAA6C;AAAA,EAChF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAc,OAAqB;AAChE,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,GAAG;AACxC,UAAM,IAAI,MAAM,uBAAuB,KAAK,4CAA4C;AAAA,EAC1F;AACF;AAEA,SAASD,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AD1QA,eAAsB,UAAU,MAAyC;AACvE,QAAM,WAAW,MAAM,wBAAwB,MAAM,wBAAwB;AAC7E,QAAM,QAAQ,MAAM,QAAQ,IAAI,SAAS,IAAI,OAAO,YAAY,SAAS,MAAM,OAAO,CAAC,CAAC;AACxF,SAAO,MAAM,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC;AAC9E;AAEA,eAAsB,SAAS,MAAkB,SAAsC;AACrF,QAAM,oBAAoB,sBAAsB,OAAO;AACvD,QAAM,UAAUE,OAAK,KAAK,MAAM,iBAAiB;AACjD,QAAM,CAAC,SAASC,KAAI,IAAI,MAAM,QAAQ,IAAI,CAAI,aAAS,SAAS,MAAM,GAAM,SAAK,OAAO,CAAC,CAAC;AAE1F,MAAI;AACF,UAAM,SAAS,iBAAiB,OAAO;AACvC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa,OAAO;AAAA,MACpB,MAAM,OAAO;AAAA,MACb,OAAO,OAAO,WAAW,OAAO;AAAA,MAChC,SAASA,MAAK;AAAA,IAChB;AAAA,EACF,SAASC,QAAO;AACd,UAAMC,WAAUD,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,YAAQ,KAAK,oCAAoC,iBAAiB,MAAMC,QAAO,EAAE;AACjF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa,CAAC;AAAA,MACd,MAAM;AAAA,MACN,OAAO,OAAO,WAAW,OAAO;AAAA,MAChC,SAASF,MAAK;AAAA,IAChB;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,MACA,eAAe,IACI;AACnB,QAAM,WAAqB,CAAC;AAC5B,QAAM,4BAA4B,MAAM,cAAc,QAAQ;AAC9D,SAAO,SAAS,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACjE;AAEA,eAAe,4BACb,MACA,gBACA,UACe;AACf,QAAM,UAAUD,OAAK,KAAK,MAAM,cAAc;AAE9C,MAAI;AACJ,MAAI;AACF,iBAAa,MAAS,YAAQ,OAAO;AAAA,EACvC,SAASE,QAAO;AACd,QAAI,UAAUA,MAAK,GAAG;AACpB;AAAA,IACF;AAEA,UAAMA;AAAA,EACR;AAEA,aAAW,aAAa,WAAW,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,GAAG;AACnF,UAAM,eACJ,eAAe,WAAW,IAAI,YAAYF,OAAK,MAAM,KAAK,gBAAgB,SAAS;AACrF,UAAM,eAAeA,OAAK,KAAK,MAAM,YAAY;AACjD,UAAM,YAAY,MAAS,SAAK,YAAY;AAE5C,QAAI,UAAU,YAAY,GAAG;AAC3B,UAAI,cAAc,0BAA0B;AAC1C;AAAA,MACF;AAEA,YAAM,4BAA4B,MAAM,cAAc,QAAQ;AAC9D;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,OAAO,GAAG;AACvB;AAAA,IACF;AAEA,QAAI,CAAC,eAAe,YAAY,GAAG;AACjC,UAAI,cAAc,qBAAqB;AACrC;AAAA,MACF;AAEA,cAAQ,KAAK,sCAAsC,YAAY,IAAI;AACnE;AAAA,IACF;AAEA,aAAS,KAAK,YAAY;AAAA,EAC5B;AACF;AAEA,SAAS,sBAAsB,SAAyB;AACtD,QAAM,oBAAoB,kBAAkB,OAAO;AACnD,MAAI,CAAC,eAAe,iBAAiB,GAAG;AACtC,UAAM,IAAI,MAAM,uCAAuC,OAAO,IAAI;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,SAA0B;AAChD,SAAOA,OAAK,MAAM,QAAQ,OAAO,EAAE,YAAY,MAAM;AACvD;AAEA,SAAS,UAAUE,QAAyB;AAC1C,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS;AAEnB;;;AE3HA,YAAYE,SAAQ;AACpB,OAAOC,YAAU;AAIjB,eAAsB,aAAa,MAAkB,OAAqC;AACxF,QAAM,kBAAkB,MAAM,KAAK;AACnC,MAAI,gBAAgB,WAAW,GAAG;AAChC,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,QAAM,WAAW,MAAM,wBAAwB,IAAI;AACnD,QAAM,OAAoB,CAAC;AAE3B,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,MAAS,aAASC,OAAK,KAAK,MAAM,OAAO,GAAG,MAAM;AAClE,QAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,IAAI;AACzD,eAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAI,CAAC,KAAK,SAAS,eAAe,GAAG;AACnC;AAAA,MACF;AAEA,WAAK,KAAK;AAAA,QACR;AAAA,QACA,YAAY,QAAQ;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACnCA,YAAYC,SAAQ;AACpB,OAAOC,YAAU;AAKjB,eAAsB,SAAS,MAK5B;AACD,MAAI,CAAE,MAAMC,YAAW,IAAI,GAAI;AAC7B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,CAAC,cAAc,gBAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzD,wBAAwB,MAAM,wBAAwB;AAAA,IACtD,wBAAwB,IAAI;AAAA,EAC9B,CAAC;AAED,MAAI,aAAa;AACjB,MAAI,gBAAgB,OAAO;AAE3B,aAAW,WAAW,kBAAkB;AACtC,UAAMC,QAAO,MAAS,SAAKC,OAAK,KAAK,MAAM,OAAO,CAAC;AACnD,kBAAcD,MAAK;AACnB,oBAAgB,KAAK,IAAI,eAAeA,MAAK,OAAO;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,WAAW,aAAa;AAAA,IACxB;AAAA,IACA,aAAa,OAAO,SAAS,aAAa,IAAI,IAAI,KAAK,aAAa,EAAE,YAAY,IAAI;AAAA,IACtF,aAAa;AAAA,EACf;AACF;AAEA,eAAeD,YAAW,YAAsC;AAC9D,MAAI;AACF,UAAS,SAAK,UAAU;AACxB,WAAO;AAAA,EACT,SAASG,QAAO;AACd,QACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS,UACf;AACA,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AACF;;;AC3DA,YAAYC,SAAQ;AACpB,OAAOC,YAAU;;;ACDjB,YAAYC,SAAQ;AACpB,OAAOC,YAAU;;;ACDjB,YAAY,gBAAgB;AAC5B,OAAOC,YAAU;AA0BjB,SAAS,kBAAkC;AACzC,SAAO;AAAA,IACL,UAAU,CAAC,UAAU,aAAwB,oBAAS,UAAU,QAAQ;AAAA,IACxE,QAAmB;AAAA,IACnB,WAAW,CAAC,UAAU,MAAM,YAAuB,qBAAU,UAAU,MAAM,OAAO;AAAA,EACtF;AACF;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,SAASC,cAAaC,QAAgB,MAAuB;AAC3D,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACTA,OAA6B,SAAS;AAE3C;AAEA,SAAS,UAAU,SAAiB,cAAsB,cAA8B;AACtF,SAAO,KAAK,IAAI,cAAc,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC;AACnE;AAEA,SAAS,SAAS,OAAmC;AACnD,QAAM,QAAQ,MAAM,KAAK;AACzB,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,SAAS,OAAO,EAAE;AACrC,SAAO,OAAO,cAAc,GAAG,KAAK,MAAM,IAAI,MAAM;AACtD;AAEA,SAAS,aAAa,KAAsB;AAC1C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAASA,QAAO;AACd,WAAO,CAACD,cAAaC,QAAO,OAAO;AAAA,EACrC;AACF;AAEA,eAAe,eAAeC,MAAoB,UAAiC;AACjF,MAAI;AACF,UAAMA,KAAG,OAAO,QAAQ;AAAA,EAC1B,SAASD,QAAO;AACd,QAAI,CAACD,cAAaC,QAAO,QAAQ,GAAG;AAClC,YAAMA;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAe,YAAYC,MAAoB,UAAsD;AACnG,MAAI;AACF,WAAO,SAAS,MAAMA,KAAG,SAAS,UAAU,MAAM,CAAC;AAAA,EACrD,SAASD,QAAO;AACd,QAAID,cAAaC,QAAO,QAAQ,GAAG;AACjC,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AACF;AAEA,eAAsB,SACpB,MACA,KACA,UAAuB,CAAC,GACN;AAClB,QAAMC,OAAK,QAAQ,MAAM,gBAAgB;AACzC,QAAM,WAAWC,OAAK,KAAK,MAAM,mBAAmB;AACpD,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,eAAe,QAAQ,gBAAgB;AAE7C,WAAS,UAAU,GAAG,WAAW,SAAS,WAAW,GAAG;AACtD,QAAI;AACF,YAAMD,KAAG,UAAU,UAAU,GAAG,GAAG;AAAA,GAAM,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAEzE,UAAI;AACF,eAAO,MAAM,IAAI;AAAA,MACnB,UAAE;AACA,cAAM,eAAeA,MAAI,QAAQ;AAAA,MACnC;AAAA,IACF,SAASD,QAAO;AACd,UAAI,CAACD,cAAaC,QAAO,QAAQ,GAAG;AAClC,cAAMA;AAAA,MACR;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,YAAYC,MAAI,QAAQ;AAClD,QAAI,gBAAgB,MAAM;AACxB;AAAA,IACF;AAEA,QAAI,gBAAgB,UAAa,CAAC,aAAa,WAAW,GAAG;AAC3D,YAAM,eAAeA,MAAI,QAAQ;AACjC;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,YAAM,MAAM,UAAU,SAAS,cAAc,YAAY,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,qCAAqC,QAAQ,IAAI;AACnE;;;AC/IA,SAAS,kBAAkB;AAC3B,YAAYE,SAAQ;AACpB,OAAOC,YAAU;;;ACCV,IAAM,SAAS;AAEf,SAAS,YAAY,MAA6B;AACvD,QAAM,QAAQ,kBAAkB,IAAI,EAAE,MAAM,IAAI;AAChD,QAAM,SAAwB,CAAC;AAE/B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,QAAQ,OAAO,KAAK,OAAO;AACjC,QAAI,OAAO,QAAQ,SAAS,QAAW;AACrC;AAAA,IACF;AAEA,UAAM,aAAuB,CAAC;AAC9B,aAAS,aAAa,QAAQ,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;AAC3E,YAAM,OAAO,MAAM,UAAU,KAAK;AAClC,UAAI,KAAK,KAAK,EAAE,WAAW,KAAK,OAAO,KAAK,IAAI,GAAG;AACjD;AAAA,MACF;AAEA,iBAAW,KAAK,IAAI;AAAA,IACtB;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,IAAI,MAAM,0BAA0B,QAAQ,CAAC,wCAAwC;AAAA,IAC7F;AAEA,WAAO,KAAK;AAAA,MACV,KAAK,SAAS,MAAM,OAAO,MAAwB,MAAM,OAAO,QAAQ,EAAE;AAAA,MAC1E,MAAM,WAAW,KAAK,IAAI;AAAA,MAC1B,YAAY,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,KAA4B;AACvD,UAAQ,IAAI,MAAM;AAAA,IAChB,KAAK;AACH,aAAO,iBAAiB,aAAa;AAAA,QACnC,QAAQ,mBAAmB,IAAI,MAAM;AAAA,QACrC,GAAI,IAAI,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK;AAAA,MACrD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,iBAAiB,YAAY;AAAA,QAClC,YAAY,oBAAoB,IAAI,UAAU;AAAA,QAC9C,GAAI,IAAI,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,mBAAmB,IAAI,MAAM,EAAE;AAAA,QAC7E,GAAI,IAAI,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK;AAAA,MACrD,CAAC;AAAA,IACH,KAAK,aAAa;AAChB,YAAM,SAAS,IAAI,OAAO,KAAK;AAC/B,UAAI,OAAO,WAAW,GAAG;AACvB,cAAM,IAAI,MAAM,yDAAyD;AAAA,MAC3E;AAEA,aAAO,iBAAiB,aAAa,EAAE,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AACF;AAIA,SAAS,SAAS,MAAsB,MAA6B;AACnE,QAAM,QAAQ,gBAAgB,IAAI;AAElC,UAAQ,MAAM;AAAA,IACZ,KAAK,aAAa;AAChB,YAAM,SAAS,MAAM;AACrB,UAAI,WAAW,QAAW;AACxB,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AAEA,qBAAe,OAAO,MAAM,CAAC,UAAU,MAAM,CAAC;AAC9C,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,eAAe,MAAM;AAAA,QAC7B,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,YAAM,aAAa,MAAM;AACzB,UAAI,eAAe,QAAW;AAC5B,cAAM,IAAI,MAAM,gDAAgD;AAAA,MAClE;AAEA,qBAAe,OAAO,MAAM,CAAC,cAAc,UAAU,MAAM,CAAC;AAC5D,aAAO;AAAA,QACL;AAAA,QACA,YAAY,gBAAgB,UAAU;AAAA,QACtC,GAAI,MAAM,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,eAAe,MAAM,MAAM,EAAE;AAAA,QAC7E,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,UAAI,WAAW,UAAa,OAAO,WAAW,GAAG;AAC/C,cAAM,IAAI,MAAM,yDAAyD;AAAA,MAC3E;AAEA,qBAAe,OAAO,MAAM,CAAC,QAAQ,CAAC;AACtC,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAA6B;AACpD,QAAM,QAAuB,CAAC;AAC9B,MAAI,QAAQ;AAEZ,SAAO,QAAQ,KAAK,QAAQ;AAC1B,YAAQ,eAAe,MAAM,KAAK;AAClC,QAAI,SAAS,KAAK,QAAQ;AACxB;AAAA,IACF;AAEA,UAAM,WAAW;AACjB,WAAO,QAAQ,KAAK,UAAU,eAAe,KAAK,KAAK,KAAK,EAAE,GAAG;AAC/D,eAAS;AAAA,IACX;AAEA,QAAI,aAAa,OAAO;AACtB,YAAM,IAAI,MAAM,0CAA0C,KAAK,MAAM,KAAK,EAAE,KAAK,CAAC,IAAI;AAAA,IACxF;AAEA,UAAM,MAAM,KAAK,MAAM,UAAU,KAAK;AACtC,SAAK,KAAK,KAAK,KAAK,QAAQ,KAAK;AAC/B,YAAM,IAAI,MAAM,qCAAqC,GAAG,IAAI;AAAA,IAC9D;AAEA,aAAS;AACT,UAAM,EAAE,OAAO,UAAU,IAAI,mBAAmB,MAAM,KAAK;AAC3D,QAAI,MAAM,GAAG,MAAM,QAAW;AAC5B,YAAM,IAAI,MAAM,uCAAuC,GAAG,IAAI;AAAA,IAChE;AAEA,UAAM,GAAG,IAAI;AACb,YAAQ;AAAA,EACV;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAe,OAAqD;AAC9F,MAAI,SAAS,MAAM,QAAQ;AACzB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,MAAI,MAAM,KAAK,MAAM,KAAK;AACxB,UAAM,WAAW,iBAAiB,OAAO,QAAQ,CAAC;AAClD,WAAO;AAAA,MACL,OAAO,KAAK,MAAM,MAAM,MAAM,OAAO,WAAW,CAAC,CAAC;AAAA,MAClD,WAAW,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,SAAO,YAAY,MAAM,UAAU,CAAC,aAAa,MAAM,SAAS,KAAK,EAAE,GAAG;AACxE,iBAAa;AAAA,EACf;AAEA,MAAI,cAAc,OAAO;AACvB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,OAAO,MAAM,MAAM,OAAO,SAAS;AAAA,IACnC;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAe,OAAuB;AAC9D,MAAI,UAAU;AAEd,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAI,SAAS;AACX,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,MAAM;AACjB,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,+CAA+C;AACjE;AAEA,SAAS,eACP,OACA,MACA,aACM;AACN,QAAM,iBAAiB,OAAO,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,SAAS,GAAG,CAAC;AACpF,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,GAAG,IAAI,oCAAoC,eAAe,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IAC/F;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,eAA+B;AACtD,QAAM,aAAa,OAAO,aAAa;AACvC,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,KAAK,aAAa,GAAG;AACrE,UAAM,IAAI,MAAM,6BAA6B,aAAa,iCAAiC;AAAA,EAC7F;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAsB,OAA8B;AAC5E,QAAM,QAAQ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,wBAAwB,KAAK,KAAK,CAAC,EAAE;AACzG,SAAO,eAAe,IAAI,GAAG,MAAM,WAAW,IAAI,KAAK,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE;AAC9E;AAEA,SAAS,wBAAwB,KAAa,OAAuB;AACnE,SAAO,QAAQ,YAAY,QAAQ,eAAe,QAAQ,KAAK,UAAU,KAAK;AAChF;AAEA,SAAS,oBAAoB,YAA4B;AACvD,SAAO,OAAO,gBAAgB,OAAO,UAAU,CAAC,CAAC;AACnD;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,WAAW,QAAQ,IAAI,EAAE,WAAW,MAAM,IAAI;AAC7D;AAEA,SAAS,eAAe,OAAe,OAAuB;AAC5D,SAAO,QAAQ,MAAM,UAAU,aAAa,MAAM,KAAK,KAAK,EAAE,GAAG;AAC/D,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,MAAuB;AAC7C,SAAQ,QAAQ,OAAO,QAAQ,OAAS,QAAQ,OAAO,QAAQ;AACjE;AAEA,SAAS,aAAa,MAAuB;AAC3C,SAAO,SAAS,OAAO,SAAS,OAAQ,SAAS,QAAQ,SAAS;AACpE;;;AD5OA,eAAsB,SAAS,MAA2C;AACxE,QAAM,QAAQ,OAAO;AAAA,IACnB,MAAM,QAAQ;AAAA,OACX,MAAM,wBAAwB,MAAM,wBAAwB,GAAG,IAAI,OAAO,YAAY;AAAA,QACrF;AAAA,QACA,YAAY,MAAS,aAASC,OAAK,KAAK,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,MACjE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,MAAM;AACjB;AAEA,eAAsB,UACpB,MACA,QACA,OACA,QACqB;AACrB,QAAM,WAAW,IAAI;AAErB,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,eAAe,MAAM,QAAQ;AAAA,KAChC,MAAM,wBAAwB,MAAM,wBAAwB,GAAG,IAAI,OAAO,YAAY;AACrF,YAAM,UAAUA,OAAK,KAAK,MAAM,OAAO;AACvC,YAAM,WAAW,MAAS,aAAS,SAAS,MAAM;AAClD,YAAM,SAAS,kBAAkB,SAAS,QAAQ;AAClD,YAAM,wBAAwB,wBAAwB,OAAO,aAAa,OAAO,IAAI;AACrF,YAAM,qBAAqB,qBAAqB,uBAAuB,OAAO,IAAI;AAClF,YAAM,UAAU,OAAO,MAAM,OAAO,MAAM,YAAY,kBAAkB;AACxE,YAAM,eAAe,UACjB;AAAA,QACE;AAAA,UACE,GAAG;AAAA,UACH,eAAe;AAAA,QACjB;AAAA,QACA,OAAO;AAAA,MACT,IACA;AAEJ,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ;AAAA,IACZ,aACG,OAAO,CAAC,SAAS,KAAK,oBAAoB,KAAK,YAAY,EAC3D,IAAI,CAAC,SAAY,cAAUA,OAAK,KAAK,MAAM,KAAK,OAAO,GAAG,KAAK,cAAc,MAAM,CAAC;AAAA,EACzF;AAEA,QAAMC,QAAO,cAAc,QAAQ,MAAM,SAAS,IAAI,CAAC;AACvD,QAAM,WAAW,IAAI;AACrB,QAAM,iBAAiB,MAAMA,OAAM,QAAQ,SAAS;AACpD,SAAOA;AACT;AAEO,SAAS,YAAY,SAAkE;AAC5F,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,IAAI,CAAC,EAAE,SAAS,YAAY,MAAM;AAC3C,YAAM,WAAW,QAAQ,MAAM,GAAG,wBAAwB,IAAI,MAAM,EAAE,QAAQ,UAAU,EAAE;AAE1F,aAAO,YAAY,WAAW,IAC1B,MAAM,QAAQ,KAAK,OAAO,MAC1B,MAAM,QAAQ,KAAK,OAAO,YAAO,WAAW;AAAA,IAClD,CAAC;AAAA,IACD;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,iBACpB,MACAA,OACA,QACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,UAAU;AAAA,IACd,GAAGA,MAAK,QAAQ,IAAI,CAAC,YAAY,cAAc,WAAW,UAAU,SAAS,MAAM,CAAC;AAAA,IACpF,GAAGA,MAAK,QAAQ,IAAI,CAAC,YAAY,cAAc,WAAW,UAAU,SAAS,MAAM,CAAC;AAAA,IACpF,GAAGA,MAAK,QAAQ,IAAI,CAAC,YAAY,cAAc,WAAW,UAAU,SAAS,MAAM,CAAC;AAAA,EACtF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,EACF;AAEA,QAAM,UAAUD,OAAK,KAAK,MAAM,kBAAkB;AAClD,QAAM,WAAW,MAAS,aAAS,SAAS,MAAM;AAClD,QAAM,YAAY,SAAS,WAAW,KAAK,SAAS,SAAS,IAAI,IAAI,KAAK;AAC1E,QAAS,cAAU,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,GAAM,MAAM;AACtF;AAEO,SAAS,mBAAmB,UAA+B;AAChE,QAAM,OAAO,oBAAI,IAAuB;AAExC,aAAW,SAAS,YAAY,kBAAkB,sBAAsB,QAAQ,EAAE,IAAI,GAAG;AACvF,UAAM,SAAS,YAAY,MAAM,MAAM,MAAM,IAAI,SAAS;AAC1D,QAAI,WAAW,QAAW;AACxB;AAAA,IACF;AAEA,SAAK,IAAI,mBAAmB,MAAM,GAAG,MAAM;AAAA,EAC7C;AAEA,SAAO,MAAM,KAAK,KAAK,QAAQ,CAAC,EAC7B,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,EAAE,MAAM,MAAM,MAAM;AAC/B;AAEA,eAAe,WAAW,MAAiC;AACzD,QAAM,QAAQ;AAAA,KACX,MAAM,UAAU,IAAI,GAAG,IAAI,CAAC,UAAU;AAAA,MACrC,SAAS,KAAK;AAAA,MACd,aAAa,KAAK,YAAY,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ;AAEA,QAAS,cAAUA,OAAK,KAAK,MAAM,oBAAoB,GAAG,OAAO,MAAM;AACzE;AAEA,SAAS,kBACP,SACA,UAIA;AACA,MAAI;AACF,WAAO,iBAAiB,QAAQ;AAAA,EAClC,SAASE,QAAO;AACd,UAAMC,WAAUD,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,YAAQ,KAAK,oCAAoC,OAAO,MAAMC,QAAO,EAAE;AACvE,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,aAA8B,MAA+B;AAC5F,QAAM,UAAU,mBAAmB,IAAI;AACvC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,QAAQ,WAAW,IAAI,EAAE,SAAS,OAAU,IAAI,EAAE,QAAQ;AAAA,EAChE;AACF;AAEA,SAAS,cAAc,QAAwB,OAAmC;AAChF,QAAM,UAAU,OAAO,KAAK,MAAM,KAAK,EACpC,OAAO,CAAC,YAAY,OAAO,MAAM,OAAO,MAAM,MAAS,EACvD,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAClD,QAAM,UAAU,OAAO,KAAK,MAAM,KAAK,EACpC;AAAA,IACC,CAAC,YACC,OAAO,MAAM,OAAO,MAAM,UAAa,OAAO,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO;AAAA,EACxF,EACC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAClD,QAAM,UAAU,OAAO,KAAK,OAAO,KAAK,EACrC,OAAO,CAAC,YAAY,MAAM,MAAM,OAAO,MAAM,MAAS,EACtD,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,cACP,WACA,MACA,SACA,QACQ;AACR,SAAO,KAAK,SAAS,OAAO,IAAI,QAAQ,OAAO,aAAQ,MAAM;AAC/D;AAEA,SAAS,YAAY,SAAyB;AAC5C,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;;;AFrMA,eAAsB,UACpB,MACA,SACA,MACA,MACqB;AACrB,QAAM,cAAc,kBAAkB,OAAO;AAE7C,SAAO,SAAS,MAAM,YAAY;AAChC,UAAM,SAAS,MAAM,SAAS,IAAI;AAClC,UAAS,UAAMC,OAAK,QAAQA,OAAK,KAAK,MAAM,WAAW,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9E,UAAS;AAAA,MACPA,OAAK,KAAK,MAAM,WAAW;AAAA,MAC3B,qBAAqB,KAAK,eAAe,CAAC,GAAG,IAAI;AAAA,MACjD;AAAA,IACF;AACA,WAAO,UAAU,MAAM,QAAQ,UAAU,KAAK,MAAM;AAAA,EACtD,CAAC;AACH;AAEA,eAAsB,aACpB,MACA,SACA,SACA,MACqB;AACrB,QAAM,cAAc,kBAAkB,OAAO;AAE7C,SAAO,SAAS,MAAM,YAAY;AAChC,UAAM,SAAS,MAAM,SAAS,IAAI;AAClC,UAAM,WAAWA,OAAK,KAAK,MAAM,WAAW;AAC5C,UAAS,UAAMA,OAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAE1D,UAAM,WAAW,MAAM,sBAAsB,QAAQ;AACrD,UAAM,SAAS,aAAa,SAAY,EAAE,aAAa,CAAC,GAAG,MAAM,GAAG,IAAI,iBAAiB,QAAQ;AAEjG,UAAS;AAAA,MACP;AAAA,MACA,qBAAqB,OAAO,aAAa,GAAG,OAAO,IAAI,GAAG,OAAO,EAAE;AAAA,MACnE;AAAA,IACF;AAEA,WAAO,UAAU,MAAM,QAAQ,UAAU,KAAK,MAAM;AAAA,EACtD,CAAC;AACH;AAEA,eAAsB,YAAY,MAAiC;AACjE,QAAM,SAAS,MAAM,YAAY;AAC/B,UAAM,eAAe,IAAI;AACzB,UAAM,WAAW,IAAI;AAAA,EACvB,CAAC;AACH;AAEA,eAAe,eAAe,eAAsC;AAClE,aAAW,aAAa,MAAS,YAAQ,aAAa,GAAG;AACvD,QAAI,cAAc,qBAAqB;AACrC;AAAA,IACF;AAEA,UAAM,YAAYA,OAAK,KAAK,eAAe,SAAS;AACpD,UAAMC,QAAO,MAAS,SAAK,SAAS;AAEpC,QAAIA,MAAK,YAAY,GAAG;AACtB,YAAMC,iBAAgB,SAAS;AAC/B;AAAA,IACF;AAEA,QAAID,MAAK,OAAO,GAAG;AACjB,YAAS,WAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,eAAeC,iBAAgB,eAAsC;AACnE,QAAM,eAAe,aAAa;AAClC,QAAS,UAAM,aAAa;AAC9B;AAEA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,oBAAoB,kBAAkB,OAAO;AACnD,MACE,CAAC,kBAAkB,WAAW,GAAG,wBAAwB,GAAG,KAC5DF,OAAK,MAAM,QAAQ,iBAAiB,EAAE,YAAY,MAAM,OACxD;AACA,UAAM,IAAI,MAAM,wCAAwC,wBAAwB,KAAK;AAAA,EACvF;AAEA,SAAO;AACT;AAEA,eAAe,sBAAsB,UAA+C;AAClF,MAAI;AACF,WAAO,MAAS,aAAS,UAAU,MAAM;AAAA,EAC3C,SAASG,QAAO;AACd,QACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS,UACf;AACA,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AACF;;;ADlGA,eAAsB,SACpB,MACA,SACA,MACyB;AACzB,QAAM,WAAWC,OAAK,KAAK,MAAM,OAAO;AACxC,QAAM,WAAW,MAAM,cAAc,QAAQ;AAC7C,QAAM,WAAWA,OAAK,KAAK,MAAM,MAAM;AACvC,QAAS,UAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,UAAU,MAAS,YAAQA,OAAK,KAAK,UAAU,uBAAuB,CAAC;AAC7E,QAAM,WAAWA,OAAK,KAAK,SAASA,OAAK,SAAS,OAAO,CAAC;AAE1D,MAAI;AACF,UAAS,cAAU,UAAU,YAAY,IAAI,MAAM;AACnD,UAAM,KAAK,aAAa,QAAQ;AAChC,UAAM,SAAS,MAAS,aAAS,UAAU,MAAM;AAEjD,QAAI,YAAY,YAAY,KAAK;AAC/B,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AAEA,UAAM,SAAS,iBAAiB,MAAM;AACtC,UAAMC,QAAO,MAAM,UAAU,MAAM,SAAS,OAAO,MAAM;AAAA,MACvD,aAAa,OAAO;AAAA,MACpB,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAAA;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAS,OAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACvD;AACF;AAEA,eAAe,cAAc,UAA+C;AAC1E,MAAI;AACF,WAAO,MAAS,aAAS,UAAU,MAAM;AAAA,EAC3C,SAASC,QAAO;AACd,QAAI,OAAOA,WAAU,YAAYA,WAAU,QAAQ,UAAUA,UAASA,OAAM,SAAS,UAAU;AAC7F,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AACF;;;AK9DA,YAAYC,SAAQ;AACpB,OAAOC,YAAU;AAMjB,IAAM,kCAAkC;AACxC,IAAM,0BAA0B;AAChC,IAAM,wCAAwC;AAiB9C,eAAsB,YACpB,MACA,UACA,UAA8B,CAAC,GACT;AACtB,QAAM,wBACJ,QAAQ,yBAAyB;AACnC,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,6BACJ,QAAQ,8BAA8B;AACxC,QAAM,cAAc,oBAAI,IAAqC;AAE7D,QAAM,QAAQ,MAAM,UAAU,IAAI;AAClC,QAAM,SAAsB,CAAC;AAE7B,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAmB,CAAC;AAC1B,QAAI;AAEJ,QAAI;AACF,eAAS,YAAY,KAAK,IAAI;AAAA,IAChC,SAASC,QAAO;AACd,aAAO,KAAK,YAAYA,MAAK,CAAC;AAC9B,aAAO,KAAK,EAAE,MAAM,KAAK,SAAS,OAAO,CAAC;AAC1C;AAAA,IACF;AAEA,QAAI,kBAAkB,OAAO,WAAW,KAAK,KAAK,KAAK,KAAK,EAAE,SAAS,4BAA4B;AACjG,aAAO;AAAA,QACL,mCAAmC,0BAA0B;AAAA,MAC/D;AAAA,IACF;AAEA,UAAM,gBAAgB,oBAAI,IAAY;AAEtC,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,IAAI,SAAS,cAAc,MAAM,IAAI,aAAa,uBAAuB;AACjF,eAAO;AAAA,UACL,iBAAiB,MAAM,UAAU,6BAA6B,MAAM,IAAI,UAAU,uBAAuB,qBAAqB;AAAA,QAChI;AAAA,MACF;AAEA,YAAM,SAAS,YAAY,MAAM,MAAM,MAAM,IAAI,SAAS;AAC1D,UAAI,WAAW,QAAW;AACxB;AAAA,MACF;AAEA,YAAM,mBAAmB,mBAAmB,MAAM;AAClD,oBAAc,IAAI,gBAAgB;AAElC,YAAM,cAAc,MAAM,eAAe,QAAQ,MAAM,YAAY,UAAU,WAAW;AACxF,UAAI,gBAAgB,QAAW;AAC7B,eAAO,KAAK,WAAW;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,KAAK,GAAG,wBAAwB,KAAK,YAAY,WAAW,CAAC,GAAG,aAAa,CAAC;AAErF,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,KAAK,EAAE,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,eACb,QACA,iBACA,UACA,aAC6B;AAC7B,MAAI,UAAU,OAAO,IAAI,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAIC,OAAK,WAAW,OAAO,IAAI,GAAG;AAChC,WAAO,iBAAiB,eAAe,WAAW,mBAAmB,MAAM,CAAC;AAAA,EAC9E;AAEA,QAAM,UAAUA,OAAK,QAAQ,UAAU,OAAO,IAAI;AAClD,MAAI,CAAC,aAAa,UAAU,OAAO,GAAG;AACpC,WAAO,iBAAiB,eAAe,WAAW,mBAAmB,MAAM,CAAC;AAAA,EAC9E;AAEA,QAAM,OAAO,MAAM,eAAe,SAAS,WAAW;AACtD,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAO,iBAAiB,eAAe,WAAW,mBAAmB,MAAM,CAAC,mBAAmB,KAAK,OAAO;AAAA,EAC7G;AAEA,QAAM,qBAAqB,OAAO,WAAW,OAAO;AACpD,MAAI,uBAAuB,UAAa,qBAAqB,KAAK,WAAW;AAC3E,WAAO,iBAAiB,eAAe,WAAW,mBAAmB,MAAM,CAAC,sBAAsB,KAAK,SAAS;AAAA,EAClH;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,oBAAiC,eAAsC;AACtG,QAAM,+BAA+B,IAAI,IAAI,mBAAmB,IAAI,CAAC,WAAW,mBAAmB,MAAM,CAAC,CAAC;AAC3G,QAAM,SAAmB,CAAC;AAE1B,QAAM,iBAAiB,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC,6BAA6B,IAAI,MAAM,CAAC;AACtG,aAAW,UAAU,eAAe,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,GAAG;AACpF,WAAO,KAAK,yCAAyC,MAAM,qBAAqB;AAAA,EAClF;AAEA,QAAM,eAAe,CAAC,GAAG,4BAA4B,EAAE,OAAO,CAAC,WAAW,CAAC,cAAc,IAAI,MAAM,CAAC;AACpG,aAAW,UAAU,aAAa,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,GAAG;AAClF,WAAO,KAAK,iDAAiD,MAAM,6BAA6B;AAAA,EAClG;AAEA,SAAO;AACT;AAEA,SAAS,eACP,SACA,aACyB;AACzB,QAAMC,UAAS,YAAY,IAAI,OAAO;AACtC,MAAIA,YAAW,QAAW;AACxB,WAAOA;AAAA,EACT;AAEA,QAAM,UACH,aAAS,SAAS,MAAM,EACxB,KAAK,CAAC,aAAa;AAAA,IAClB,QAAQ;AAAA,IACR;AAAA,IACA,WAAW,WAAW,OAAO;AAAA,EAC/B,EAAE,EACD,MAAM,CAACF,WAAmB;AACzB,QAAIG,WAAUH,MAAK,GAAG;AACpB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAMA;AAAA,EACR,CAAC;AAEH,cAAY,IAAI,SAAS,OAAO;AAChC,SAAO;AACT;AAEA,SAAS,WAAW,SAAyB;AAC3C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,WAAW,QAAQ,IAAI,EAAE,WAAW,MAAM,IAAI;AACzE,QAAM,UAAU,WAAW,SAAS,IAAI,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI;AACtE,SAAO,QAAQ,WAAW,IAAI,IAAI,QAAQ,MAAM,IAAI,EAAE;AACxD;AAEA,SAAS,YAAYA,QAAwB;AAC3C,SAAOA,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AAC9D;AAEA,SAASG,WAAUH,QAAyB;AAC1C,SAAO,OAAOA,WAAU,YAAYA,WAAU,QAAQ,UAAUA,UAASA,OAAM,SAAS;AAC1F;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,0BAA0B,KAAK,KAAK;AAC7C;AAEA,SAAS,aAAa,MAAc,SAA0B;AAC5D,QAAM,WAAWC,OAAK,SAAS,MAAM,OAAO;AAC5C,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,QAAQ;AACpF;;;ACrMA,SAAS,cAAAG,mBAAkB;AAC3B,YAAYC,SAAQ;AACpB,OAAOC,YAAU;AAIV,SAAS,iBAAiB,OAKd;AACjB,QAAM,OAAOC,YAAW,QAAQ;AAChC,OAAK,OAAO,MAAM,WAAW;AAC7B,OAAK,OAAO,IAAI;AAChB,OAAK,OAAO,MAAM,YAAY;AAC9B,OAAK,OAAO,IAAI;AAChB,OAAK,OAAO,MAAM,qBAAqB;AACvC,OAAK,OAAO,IAAI;AAChB,OAAK,OAAO,MAAM,OAAO;AACzB,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEA,eAAsB,eACpB,MACA,KACkC;AAClC,QAAM,YAAYC,OAAK,KAAK,MAAM,iCAAiC,GAAG,GAAG,OAAO;AAEhF,MAAI;AACJ,MAAI;AACF,UAAM,MAAS,aAAS,WAAW,MAAM;AAAA,EAC3C,SAASC,QAAO;AACd,QAAIC,WAAUD,MAAK,GAAG;AACpB,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AAEA,MAAI;AACF,WAAO,gBAAgB,KAAK,MAAM,GAAG,GAAG,GAAG;AAAA,EAC7C,SAASA,QAAO;AACd,UAAME,WAAUF,kBAAiB,QAAQA,OAAM,UAAU,OAAOA,MAAK;AACrE,YAAQ,KAAK,gCAAgC,GAAG,MAAME,QAAO,EAAE;AAC/D,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBAAgB,MAAkB,OAAwC;AAC9F,QAAS,UAAMH,OAAK,KAAK,MAAM,+BAA+B,GAAG,EAAE,WAAW,KAAK,CAAC;AACpF,QAAS;AAAA,IACPA,OAAK,KAAK,MAAM,iCAAiC,GAAG,MAAM,GAAG,OAAO;AAAA,IACpE,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,IACxB;AAAA,EACF;AACF;AAEA,eAAsB,WACpB,MACA,OAAiC,CAAC,GACJ;AAC9B,QAAM,YAAYA,OAAK,KAAK,MAAM,+BAA+B;AACjE,QAAM,WAAWA,OAAK,KAAK,MAAM,wBAAwB;AACzD,QAAM,YAAY,MAAM,mBAAmB,SAAS;AAEpD,MAAI,UAAU,WAAW,GAAG;AAC1B,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAS,OAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACxD;AAEA,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB;AAEA,MAAI,KAAK,gBAAgB,QAAW;AAClC,UAAS,OAAG,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACtD,WAAO,EAAE,SAAS,UAAU,OAAO;AAAA,EACrC;AAEA,QAAM,SAAS,KAAK,IAAI,IAAI,KAAK;AACjC,MAAI,UAAU;AAEd,aAAW,YAAY,WAAW;AAChC,UAAM,MAAM,SAAS,MAAM,GAAG,CAAC,QAAQ,MAAM;AAC7C,UAAM,QAAQ,MAAM,eAAe,MAAM,GAAG;AAE5C,QAAI,UAAU,QAAQ,KAAK,MAAM,MAAM,UAAU,IAAI,QAAQ;AAC3D;AAAA,IACF;AAEA,UAAS,OAAGA,OAAK,KAAK,WAAW,QAAQ,GAAG,EAAE,OAAO,KAAK,CAAC;AAC3D,eAAW;AAAA,EACb;AAEA,QAAM,qBAAqB,SAAS;AACpC,QAAM,qBAAqB,QAAQ;AAEnC,SAAO,EAAE,QAAQ;AACnB;AAEA,SAAS,gBAAgB,OAAgB,MAAgC;AACvE,QAAM,SAAS,aAAa,KAAK;AAEjC,SAAO;AAAA,IACL,KAAK,aAAa,OAAO,KAAK,KAAK;AAAA,IACnC,YAAY,aAAa,OAAO,YAAY,YAAY;AAAA,IACxD,aAAa,aAAa,OAAO,aAAa,aAAa;AAAA,IAC3D,MAAM,gBAAgB,OAAO,IAAI;AAAA,IACjC,UAAU,aAAa,OAAO,UAAU,UAAU;AAAA,IAClD,YAAY,aAAa,OAAO,YAAY,YAAY;AAAA,IACxD,cAAc,aAAa,OAAO,cAAc,cAAc;AAAA,IAC9D,cAAc,aAAa,OAAO,cAAc,cAAc;AAAA,IAC9D,uBAAuB,aAAa,OAAO,uBAAuB,uBAAuB;AAAA,IACzF,SAAS,aAAa,OAAO,SAAS,SAAS;AAAA,EACjD;AACF;AAEA,SAAS,gBAAgB,OAA0C;AACjE,QAAM,SAAS,aAAa,KAAK;AAEjC,SAAO;AAAA,IACL,SAAS,kBAAkB,OAAO,SAAS,cAAc;AAAA,IACzD,SAAS,kBAAkB,OAAO,SAAS,cAAc;AAAA,IACzD,SAAS,kBAAkB,OAAO,SAAS,cAAc;AAAA,EAC3D;AACF;AAEA,SAAS,aAAa,OAAyC;AAC7D,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,OAAuB;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,uBAAuB,KAAK,IAAI;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,OAAuB;AAC3D,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,GAAG;AACpD,UAAM,IAAI,MAAM,uBAAuB,KAAK,IAAI;AAAA,EAClD;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAgB,OAAyB;AAClE,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,UAAU,OAAO,UAAU,QAAQ,GAAG;AAC7E,UAAM,IAAI,MAAM,yBAAyB,KAAK,IAAI;AAAA,EACpD;AAEA,SAAO;AACT;AAEA,eAAe,mBAAmB,WAAsC;AACtE,MAAI;AACF,YAAQ,MAAS,YAAQ,SAAS,GAC/B,OAAO,CAAC,aAAaA,OAAK,MAAM,QAAQ,QAAQ,EAAE,YAAY,MAAM,OAAO,EAC3E,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAAA,EACpD,SAASC,QAAO;AACd,QAAIC,WAAUD,MAAK,GAAG;AACpB,aAAO,CAAC;AAAA,IACV;AAEA,UAAMA;AAAA,EACR;AACF;AAEA,eAAe,qBAAqB,eAAsC;AACxE,MAAI;AACF,UAAM,mBAAmB,MAAS,YAAQ,aAAa;AACvD,QAAI,iBAAiB,WAAW,GAAG;AACjC,YAAS,UAAM,aAAa;AAAA,IAC9B;AAAA,EACF,SAASA,QAAO;AACd,QAAIC,WAAUD,MAAK,GAAG;AACpB;AAAA,IACF;AAEA,UAAMA;AAAA,EACR;AACF;AAEA,SAASC,WAAUD,QAAyB;AAC1C,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS;AAEnB;;;ACnMA,OAAO,mBAAmB;AAI1B,eAAsB,uBAAsC;AAC1D,UAAQ,IAAI,kCAAkC;AAChD;AAEA,eAAsB,oBAAoB,OAIT;AAC/B,MAAI,CAAC,MAAM,KAAK;AACd,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,QAAM,cAAc,eAAe,MAAM,SAAS;AAClD,QAAM,SAAS,MAAM,WAAW,MAAM,MAAM,gBAAgB,SAAY,CAAC,IAAI,EAAE,YAAY,CAAC;AAC5F,UAAQ,IAAI,WAAW,OAAO,OAAO,UAAU,OAAO,YAAY,IAAI,UAAU,SAAS,EAAE;AAC3F,SAAO;AACT;AAEA,SAAS,eAAe,OAA+C;AACrE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,cAAc,KAAK;AACpC,MAAI,aAAa,QAAQ,OAAO,MAAM,QAAQ,KAAK,WAAW,GAAG;AAC/D,UAAM,IAAI,MAAM,uCAAuC,KAAK,IAAI;AAAA,EAClE;AAEA,SAAO;AACT;;;AClCA,YAAYG,UAAQ;AACpB,OAAOC,YAAU;;;ACDjB,SAAS,aAAa;;;ACMf,SAAS,kBAAkB,YAA+E;AAC/G,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,WAAO,EAAE,MAAM,WAAW;AAAA,EAC5B;AACA,SAAO;AAAA,IACL,MAAM,WAAW,QAAQ,CAAC;AAAA,IAC1B,KAAK,WAAW,OAAO,OAAO,KAAK,WAAW,GAAG,EAAE,SAAS,IAAI,WAAW,MAAM;AAAA,EACnF;AACF;;;ACZO,IAAM,kBAAmC;AAAA,EAC9C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS,CAAC,QAAQ;AAAA,EAClB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACdO,IAAM,qBAAsC;AAAA,EACjD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACZO,IAAM,aAA8B;AAAA,EACzC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACbO,IAAM,gBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACbO,IAAM,YAA6B;AAAA,EACxC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS,CAAC,UAAU;AAAA,EACpB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACdO,IAAM,aAA8B;AAAA,EACzC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACbO,IAAM,gBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;;;ACHO,IAAM,YAA+B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,SAAS,oBAAI,IAAoB;AAEvC,WAAW,SAAS,WAAW;AAC7B,QAAM,SAAS,CAAC,MAAM,IAAI,MAAM,MAAM,GAAI,MAAM,WAAW,CAAC,CAAE;AAC9D,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,MAAM,YAAY;AACrC,QAAI,CAAC,OAAO,IAAI,UAAU,GAAG;AAC3B,aAAO,IAAI,YAAY,MAAM,EAAE;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,eAAe,OAAmC;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,OAAO,IAAI,MAAM,YAAY,CAAC;AACvC;;;AC7BA,SAAS,iBAAiB,SAAwD;AAChF,QAAM,MAAqC,CAAC;AAE5C,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,UAAM,SAAwB,EAAE,SAAS,OAAO,QAAQ;AACxD,QAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,aAAO,OAAO,OAAO;AAAA,IACvB;AACA,QAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,aAAO,MAAM,OAAO;AAAA,IACtB;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,aAAO,UAAU,OAAO;AAAA,IAC1B;AACA,QAAI,IAAI,IAAI;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,YAAY,QAA0B;AAC7C,QAAM,aAAa,OAAO,IAAI,CAAC,UAAU,aAAa,KAAK,CAAC;AAC5D,SAAO,IAAI,WAAW,KAAK,IAAI,CAAC;AAClC;AAEA,SAAS,kBAAkB,QAAwC;AACjE,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAM,KAAK,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE;AAAA,EAC5D;AACA,SAAO,IAAI,MAAM,KAAK,IAAI,CAAC;AAC7B;AAEO,SAAS,qBAAqB,SAAmC;AACtE,SAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE,YAAY,iBAAiB,OAAO,EAAE,CAAC,CAAC;AACnF;AAEO,SAAS,wBAAwB,SAAiD;AACvF,QAAM,MAGF,CAAC;AACL,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,UAAM,QAIF,EAAE,MAAM,SAAS,SAAS,CAAC,OAAO,SAAS,GAAI,OAAO,QAAQ,CAAC,CAAE,EAAE;AACvE,QAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,YAAM,cAAc,OAAO;AAAA,IAC7B;AACA,QAAI,IAAI,IAAI;AAAA,EACd;AACA,SAAO,EAAE,yBAAyB,KAAK,UAAU,EAAE,IAAI,CAAC,EAAE;AAC5D;AAEO,SAAS,sBAAsB,SAAmC;AACvE,QAAM,OAAiB,CAAC;AAExB,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,UAAM,SAAS,eAAe,IAAI;AAClC,SAAK,KAAK,MAAM,GAAG,MAAM,YAAY,aAAa,OAAO,OAAO,CAAC,EAAE;AAEnE,QAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,WAAK,KAAK,MAAM,GAAG,MAAM,SAAS,YAAY,OAAO,IAAI,CAAC,EAAE;AAAA,IAC9D;AAEA,QAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,WAAK,KAAK,MAAM,GAAG,MAAM,QAAQ,kBAAkB,OAAO,GAAG,CAAC,EAAE;AAAA,IAClE;AAEA,QAAI,OAAO,YAAY,QAAW;AAChC,WAAK,KAAK,MAAM,GAAG,MAAM,YAAY,OAAO,OAAO,EAAE;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,SAAmC;AACvE,SAAO,OAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,WAAW;AAAA,IAChD;AAAA,IACA,CAAC,OAAO,SAAS,GAAI,OAAO,QAAQ,CAAC,CAAE,EAAE,KAAK,GAAG;AAAA,EACnD,CAAC;AACH;;;AC9FO,IAAM,wBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAET,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,gBAAgB,CAAC,UAAU,MAAM,WAAW,KAAK,GAAG;AAAA,EACpD,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AAAA,IACL,MAAM,CAAC,gCAAgC;AAAA,IACvC,MAAM,CAAC,qBAAqB,eAAe,kBAAkB,6CAA6C;AAAA,IAC1G,MAAM,CAAC,qBAAqB,MAAM;AAAA,EACpC;AAAA,EACA,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,WAAW,CAAC,kBAAkB,MAAM;AAAA,EACtC;AAAA,EACA,aAAa;AAAA,IACX,aAAa,CAAC;AAAA,EAChB;AAAA,EACA,eAAe,CAAC,aAAa,CAAC,YAAY,QAAQ;AACpD;;;AC5BO,IAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAET,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,aAAa,CAAC,yBAAyB,QAAQ;AAAA,EAC/C,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,OAAO;AAAA,IACL,MAAM,CAAC,MAAM,oBAAoB;AAAA,IACjC,MAAM,CAAC,MAAM,iBAAiB;AAAA,IAC9B,MAAM,CAAC,MAAM,WAAW;AAAA,EAC1B;AAAA,EACA,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,WAAW,CAAC,GAAG;AAAA,EACjB;AAAA,EACA,aAAa;AAAA,IACX,aAAa,CAAC,MAAM,OAAO;AAAA,EAC7B;AAAA,EACA,eAAe,CAAC,UAAU,QAAQ,CAAC,UAAU,MAAM,KAAK,QAAQ;AAClE;;;ACoCO,IAAM,sBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,SAAS;AAAA;AAAA;AAAA;AAAA,EAIT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,gBAAgB,CAAC,UAAU;AACzB,WAAO,MAAM,WAAW,MAAM,IAAI,QAAQ,OAAO,KAAK;AAAA,EACxD;AAAA,EACA,aAAa,CAAC,YAAY,MAAM;AAAA,EAChC,OAAO;AAAA,IACL,MAAM,CAAC;AAAA,IACP,MAAM,CAAC;AAAA,IACP,MAAM,CAAC,WAAW,MAAM;AAAA,EAC1B;AAAA,EACA,aAAa;AAAA,IACX,aAAa,CAAC;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,eAAe,CAAC,UAAU,QAAQ,CAAC,KAAK,aAAa,QAAQ;AAAA,EAC7D,QAAQ;AACV;AAEO,IAAM,yBAAyC;AAAA,EACpD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS,CAAC,KAAK;AAAA,EACf,UAAU;AAAA,EACV,QAAQ;AACV;;;AC7FO,IAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,SAAS;AAAA;AAAA;AAAA;AAAA,EAIT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,aAAa,CAAC,WAAW,mBAAmB,aAAa;AAAA,EACzD,SAAS;AAAA,EACT,OAAO;AAAA,IACL,MAAM,CAAC,QAAQ;AAAA,IACf,MAAM,CAAC;AAAA,IACP,MAAM,CAAC;AAAA,EACT;AAAA,EACA,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,WAAW,CAAC,kBAAkB,aAAa;AAAA,EAC7C;AAAA,EACA,aAAa;AAAA,IACX,aAAa,CAAC;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,eAAe,CAAC,UAAU,QAAQ,CAAC,aAAa,UAAU,cAAc,GAAG;AAC7E;AAEO,IAAM,qBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS,CAAC,KAAK;AACjB;;;AC/BA,IAAM,sBAAsB,EAAE,uBAAuB,IAAI;AAElD,IAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,aAAa,CAAC,OAAO,mBAAmB,aAAa;AAAA,EACrD,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO;AAAA,IACL,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,YAAY,OAAO,EAAE;AAAA,IAC5D,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,YAAY,gBAAgB,EAAE;AAAA,IACrE,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,YAAY,OAAO,EAAE;AAAA,EAC9D;AAAA,EACA,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,WAAW,CAAC,kBAAkB,GAAG;AAAA,EACnC;AAAA,EACA,aAAa;AAAA,IACX,aAAa,CAAC,SAAS;AAAA,IACvB,qBAAqB;AAAA,EACvB;AAAA,EACA,eAAe,MAAM,CAAC,OAAO,YAAY,UAAU,UAAU;AAC/D;AAEO,IAAM,sBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS,CAAC,KAAK;AAAA,EACf,KAAK;AAAA,EACL,UAAU;AACZ;;;AC5BO,IAAM,kBAA0C;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,UAAS,oBAAI,IAAyB;AAE5C,WAAW,UAAU,iBAAiB;AACpC,EAAAA,QAAO,IAAI,OAAO,SAAS,MAAM;AACnC;AAEA,IAAM,YAAY,oBAAI,IAA4B;AAClD,UAAU,IAAI,uBAAuB,SAAS,sBAAsB;AACpE,UAAU,IAAI,mBAAmB,SAAS,kBAAkB;AAC5D,UAAU,IAAI,oBAAoB,SAAS,mBAAmB;AAEvD,SAAS,eAAe,OAAwC;AACrE,QAAM,aAAa,eAAe,KAAK;AACvC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,SAAOA,QAAO,IAAI,UAAU;AAC9B;AAmBO,SAAS,yBAAmC;AACjD,QAAM,YAAsB,CAAC;AAE7B,aAAW,UAAU,iBAAiB;AACpC,QACE,OAAO,SAAS,SACf,OAAO,OAAO,YAAY,cAAc,OAAO,OAAO,WAAW,YAClE;AACA;AAAA,IACF;AACA,cAAU,KAAK,OAAO,OAAO;AAAA,EAC/B;AAEA,SAAO;AACT;;;ACpEA,SAAS,SAAS,yBAAyB;AAC3C,SAAS,WAAW,UAAU,WAAW,iBAAiB;AAC1D,OAAOC,YAAU;;;ACQV,SAAS,cAAc,SAAsC;AAClE,QAAM,kBAAkB,eAAe,OAAO;AAC9C,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,kBAAkB,OAAO,IAAI;AAAA,EAC/C;AAEA,QAAM,kBAAkB,UAAU,KAAK,CAAC,UAAU,MAAM,OAAO,eAAe;AAC9E,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,kBAAkB,OAAO,IAAI;AAAA,EAC/C;AAEA,QAAM,cAAc,eAAe,eAAe;AAClD,QAAM,aAAa,gBAAgB;AAEnC,SAAO,EAAE,SAAS,iBAAiB,YAAY,YAAY;AAC7D;;;ACtBO,SAAS,cAAc,SAAqD;AACjF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS;AACvC;AAEO,SAAS,WACd,QACA,SACU;AACV,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AACA,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,QAAQ;AACrC,UAAM,IAAI,MAAM,iCAAiC,OAAO,OAAO,CAAC;AAAA,EAClE;AACA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,OAAO,QAAQ,OAAO;AAC/B;AAYO,SAAS,iCAAiC,SAAyB;AACxE,QAAM,YAAY,uBAAuB;AACzC,QAAM,gBAAgB,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACpE,SACE,UAAU,OAAO;AAAA,sCACsB,aAAa;AAExD;;;AClCO,SAAS,oBAAoB,OAAuB;AACzD,QAAM,aAAa,MAAM,QAAQ,GAAG;AACpC,SAAO,eAAe,KAAK,QAAQ,MAAM,MAAM,aAAa,CAAC;AAC/D;;;AHKA,SAAS,mBAA0B;AACjC,QAAMC,SAAQ,IAAI,MAAM,qBAAqB;AAC7C,EAAAA,OAAM,OAAO;AACb,SAAOA;AACT;AAEA,SAAS,2BAA2B,WAA0B;AAC5D,QAAMA,SAAQ,IAAI;AAAA,IAChB,+BAA+B,YAAY,GAAI;AAAA,EACjD;AACA,EAAAA,OAAM,OAAO;AACb,SAAOA;AACT;AAqBA,SAAS,iBAAiB,SAAiB;AACzC,QAAM,WAAW,cAAc,OAAO;AAEtC,MAAI,CAAC,SAAS,aAAa;AACzB,UAAM,IAAI,MAAM,UAAU,SAAS,OAAO,wBAAwB;AAAA,EACpE;AAEA,MAAI,SAAS,YAAY,SAAS,OAAO;AACvC,UAAM,IAAI,MAAM,UAAU,SAAS,OAAO,+BAA+B;AAAA,EAC3E;AAEA,MAAI,CAAC,SAAS,YAAY;AACxB,UAAM,IAAI,MAAM,UAAU,SAAS,OAAO,sBAAsB;AAAA,EAClE;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,YAAY,SAAS;AAAA,IACrB,aAAa,SAAS;AAAA,EACxB;AACF;AAEA,SAAS,uBAAuB,QAAwD;AACtF,SAAO,OAAO,uBAAuB;AACvC;AAEA,SAAS,mBACP,QACmD;AACnD,MAAI,OAAO,iBAAiB;AAC1B,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,uBAAuB,kBAAkB;AACzD;AAEA,SAAS,aACP,QACA,SACA,WACkD;AAClD,QAAM,UAAU,WAAW,QAAQ,QAAQ,UAAU;AACrD,QAAM,sBAAsB,uBAAuB,MAAM;AACzD,QAAM,kBAAkB,mBAAmB,MAAM;AAEjD,QAAM,OAAiB,CAAC;AAExB,MAAI,oBAAoB,iBAAiB;AACvC,SAAK,KAAK,GAAG,OAAO;AAAA,EACtB;AAEA,MAAI,wBAAwB,gBAAgB;AAC1C,SAAK,KAAK,GAAG,OAAO,WAAW;AAAA,EACjC;AAEA,MAAI,oBAAoB,gBAAgB;AACtC,SAAK,KAAK,GAAG,OAAO;AAAA,EACtB;AAEA,MAAI,WAAW;AACb,SAAK;AAAA,MACH,OAAO;AAAA,MACP,GAAI,UAAU,aAAa,CAAC,IAAI,CAAC,QAAQ,MAAM;AAAA,MAC/C,GAAG,UAAU;AAAA,IACf;AAAA,EACF,OAAO;AACL,SAAK,KAAK,OAAO,YAAY,QAAQ,MAAM;AAAA,EAC7C;AAEA,MAAI,QAAQ,SAAS,OAAO,WAAW;AACrC,QAAI,QAAQ,OAAO,2BACf,oBAAoB,QAAQ,KAAK,IACjC,QAAQ;AACZ,QAAI,OAAO,eAAgB,SAAQ,OAAO,eAAe,KAAK;AAC9D,SAAK,KAAK,OAAO,WAAW,KAAK;AAAA,EACnC;AAEA,MAAI,wBAAwB,eAAe;AACzC,SAAK,KAAK,GAAG,OAAO,WAAW;AAAA,EACjC;AAEA,MAAI,oBAAoB,gBAAgB;AACtC,SAAK,KAAK,GAAG,OAAO;AAAA,EACtB;AAEA,QAAM,OAAO,kBAAkB,OAAO,MAAM,QAAQ,QAAQ,MAAM,CAAC;AACnE,OAAK,KAAK,GAAG,KAAK,IAAI;AAEtB,MAAI,QAAQ,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAC3C,SAAK,KAAK,GAAG,QAAQ,IAAI;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,KAAK,KAAK,IAAI;AAC/B;AAaA,eAAsBC,OACpB,SACA,SACA,SACsB;AACtB,MAAI,QAAQ,QAAQ,SAAS;AAC3B,UAAM,iBAAiB;AAAA,EACzB;AAEA,QAAM,EAAE,SAAS,YAAY,YAAY,YAAY,IAAI,iBAAiB,OAAO;AAEjF,QAAM,YACJ,QAAQ,YAAY,YAAY,YAAY,YAAY,YAAY;AAEtE,QAAM,EAAE,MAAM,WAAW,KAAK,QAAQ,IAAI,aAAa,aAAa,SAAS,SAAS;AAEtF,MAAI,SAAS,QAAQ;AACnB,UAAM,WAAW,CAAC,YAAY,GAAG,SAAS,EAAE,KAAK,GAAG;AACpD,YAAQ,QAAQ,OAAO,QAAQ;AAC/B,WAAO,EAAE,QAAQ,IAAI,QAAQ,IAAI,UAAU,EAAE;AAAA,EAC/C;AAEA,QAAM,cAAc,oBAAoB,OAAO;AAC/C,QAAM,QAAQ,cAAc,aAAa,WAAW,IAAI;AAExD,QAAM,QAAQ,kBAAkB,YAAY,WAAW;AAAA,IACrD,KAAK,QAAQ;AAAA,IACb,OAAO,CAAC,YAAY,SAAS,WAAW,QAAQ,MAAM;AAAA,IACtD,GAAI,UAAU,EAAE,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,EAAE,IAAI,CAAC;AAAA,EAC3D,CAAC;AAED,MAAI,CAAC,MAAM,UAAU,CAAC,MAAM,QAAQ;AAClC,UAAM,IAAI,MAAM,oBAAoB,UAAU,yBAAyB;AAAA,EACzE;AAEA,QAAM,eAAe,MAAM;AAC3B,QAAM,eAAe,MAAM;AAE3B,MAAI,WAAW;AACb,QAAI,CAAC,MAAM,OAAO;AAChB,YAAM,IAAI,MAAM,oBAAoB,UAAU,wBAAwB;AAAA,IACxE;AACA,UAAM,MAAM,mBAAmB,MAAM;AACrC,UAAM,MAAM,MAAM,QAAQ,MAAM;AAChC,UAAM,MAAM,IAAI;AAAA,EAClB;AAEA,SAAO,IAAI,QAAqB,CAACC,UAAS,WAAW;AACnD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,UAAU;AACd,QAAI,WAAW;AAEf,UAAM,UAAU,MAAM;AACpB,gBAAU;AACV,YAAM,KAAK,SAAS;AAAA,IACtB;AAEA,YAAQ,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAEjE,QAAI;AACJ,UAAM,qBAAqB,QAAQ,oBAC/B,MAAM;AACJ,UAAI,cAAe,cAAa,aAAa;AAC7C,sBAAgB,WAAW,MAAM;AAC/B,mBAAW;AACX,cAAM,KAAK,SAAS;AAAA,MACtB,GAAG,QAAQ,iBAAiB;AAAA,IAC9B,IACA;AAEJ,yBAAqB;AAErB,UAAM,UAAU,MAAM;AACpB,cAAQ,QAAQ,oBAAoB,SAAS,OAAO;AACpD,UAAI,cAAe,cAAa,aAAa;AAAA,IAC/C;AAEA,iBAAa,YAAY,MAAM;AAC/B,iBAAa,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU;AACV,2BAAqB;AACrB,UAAI,QAAQ,KAAK,OAAQ,SAAQ,IAAI,OAAO,MAAM,KAAK;AACvD,qBAAe,OAAO,KAAK;AAAA,IAC7B,CAAC;AAED,iBAAa,YAAY,MAAM;AAC/B,iBAAa,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU;AACV,2BAAqB;AACrB,UAAI,QAAQ,KAAK,OAAQ,SAAQ,IAAI,OAAO,MAAM,KAAK;AACvD,qBAAe,OAAO,KAAK;AAAA,IAC7B,CAAC;AAED,UAAM,GAAG,SAAS,CAACC,WAAU;AAC3B,cAAQ;AACR,oBAAc,KAAK;AACnB,UAAI,SAAS;AACX,eAAO,iBAAiB,CAAC;AACzB;AAAA,MACF;AACA,aAAOA,MAAK;AAAA,IACd,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,cAAQ;AACR,oBAAc,KAAK;AACnB,UAAI,SAAS;AACX,eAAO,iBAAiB,CAAC;AACzB;AAAA,MACF;AACA,UAAI,UAAU;AACZ,eAAO,2BAA2B,QAAQ,iBAAkB,CAAC;AAC7D;AAAA,MACF;AACA,MAAAD,SAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,GAAI,cAAc,EAAE,SAAS,YAAY,IAAI,CAAC;AAAA,MAChD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,oBAAoB,SAA2C;AACtE,MAAI,QAAQ,SAAS;AACnB,WAAO,QAAQ;AAAA,EACjB;AACA,MAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,aAAa;AAC3C,WAAO;AAAA,EACT;AACA,SAAOE,OAAK,KAAK,QAAQ,QAAQ,QAAQ,WAAW;AACtD;AAEA,SAAS,aAAa,UAAsC;AAC1D,MAAI;AACF,cAAUA,OAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,WAAO,SAAS,UAAU,GAAG;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,IAAwB,OAAqB;AACnE,MAAI,OAAO,OAAW;AACtB,MAAI;AACF,cAAU,IAAI,KAAK;AAAA,EACrB,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,cAAc,IAA8B;AACnD,MAAI,OAAO,OAAW;AACtB,MAAI;AACF,cAAU,EAAE;AAAA,EACd,QAAQ;AAAA,EAER;AACF;;;AI3TA,SAAS,SAASC,0BAAyB;;;ACA3C,OAAO,WAAW;AAIX,IAAM,OAAO;AAAA,EAClB,QAAQ,CAACC,UAAiB,MAAM,cAAc,KAAKA,KAAI;AAAA,EACvD,SAAS,CAACA,UAAiB,MAAM,IAAIA,KAAI;AAAA,EACzC,QAAQ,CAACA,UAAiB,MAAM,KAAKA,KAAI;AAAA,EACzC,QAAQ,CAACA,UAAiB,MAAM,WAAWA,KAAI;AAAA,EAC/C,OAAO,CAACA,UAAiB,MAAM,UAAU,MAAM,UAAUA,KAAI,GAAG;AAAA,EAChE,gBAAgB,MAAM,QAAQ,QAAG;AAAA,EACjC,aAAa,MAAM,IAAI,QAAG;AAAA,EAC1B,QAAQ,CAACA,UAAiB,MAAM,KAAKA,KAAI;AAAA,EACzC,OAAO,CAACA,UAAiB,MAAM,IAAIA,KAAI;AAAA,EACvC,SAAS,CAACA,UAAiB,MAAM,MAAMA,KAAI;AAAA,EAC3C,SAAS,CAACA,UAAiB,MAAM,OAAOA,KAAI;AAAA,EAC5C,OAAO,CAACA,UAAiB,MAAM,IAAIA,KAAI;AAAA,EACvC,MAAM,CAACA,UAAiB,MAAM,QAAQA,KAAI;AAAA,EAC1C,OAAO,CAACA,UAAiB,MAAM,SAAS,MAAM,IAAIA,KAAI,GAAG;AAC3D;AAEO,IAAM,QAAQ;AAAA,EACnB,QAAQ,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAE,KAAKA,KAAI;AAAA,EACxD,SAAS,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAEA,KAAI;AAAA,EACpD,QAAQ,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAE,KAAKA,KAAI;AAAA,EACxD,QAAQ,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAE,KAAKA,KAAI;AAAA,EACxD,OAAO,CAACA,UAAiB,MAAM,MAAM,SAAS,EAAE,MAAM,UAAUA,KAAI,GAAG;AAAA,EACvE,gBAAgB,MAAM,IAAI,SAAS,EAAE,QAAG;AAAA,EACxC,aAAa,MAAM,IAAI,SAAS,EAAE,QAAG;AAAA,EACrC,QAAQ,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAE,KAAKA,KAAI;AAAA,EACxD,OAAO,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAEA,KAAI;AAAA,EAClD,SAAS,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAEA,KAAI;AAAA,EACpD,SAAS,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAEA,KAAI;AAAA,EACpD,OAAO,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAEA,KAAI;AAAA,EAClD,MAAM,CAACA,UAAiB,MAAM,IAAI,SAAS,EAAEA,KAAI;AAAA,EACjD,OAAO,CAACA,UAAiB,MAAM,MAAM,SAAS,EAAE,MAAM,IAAIA,KAAI,GAAG;AACnE;;;ACpCA,OAAOC,YAAW;;;ACAlB,OAAOC,YAAW;;;ACAlB,SAAS,yBAAyB;AAIlC,IAAM,gBAAgB,oBAAI,IAAkB,CAAC,YAAY,YAAY,MAAM,CAAC;AAC5E,IAAM,gBAAgB,IAAI,kBAAgC;AAE1D,IAAI;AAEG,SAAS,oBACd,MAAkC,QAAQ,KAC5B;AACd,QAAM,SAAS,cAAc,SAAS;AACtC,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,MAAM,IAAI,eAAe,YAAY;AAC3C,WAAS,cAAc,IAAI,GAAmB,IAAK,MAAuB;AAC1E,SAAO;AACT;;;ACZA,SAAS,mBAAmB,KAAsC;AAChE,QAAM,QAAQ,IAAI;AAClB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,YAAY,MAAM,SAAS,SAAS;AAAA,EACnD;AAEA,QAAM,aAAa,IAAI;AACvB,MAAI,OAAO,eAAe,UAAU;AAClC,UAAM,aAAa,WAAW,YAAY;AAC1C,QAAI,WAAW,SAAS,OAAO,GAAG;AAChC,aAAO;AAAA,IACT;AACA,QAAI,WAAW,SAAS,MAAM,GAAG;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,YAAY,IAAI;AACtB,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,QAAQ,UAAU,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC;AAC1E,UAAM,aAAa,MAAM,GAAG,EAAE;AAC9B,QAAI,OAAO,SAAS,UAAU,GAAG;AAC/B,aAAO,cAAe,IAAI,UAAU;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,MAAgB,QAAQ,KAA4B;AACnF,QAAM,OAAO,IAAI,kBAAkB,IAAI,YAAY,YAAY;AAC/D,MAAI,QAAQ,WAAW,QAAQ,QAAQ;AACrC,WAAO;AAAA,EACT;AACA,QAAM,WAAW,mBAAmB,GAAG;AACvC,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAI;AAEG,SAAS,SAAS,KAA8B;AACrD,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AACA,QAAM,YAAY,iBAAiB,GAAG;AACtC,gBAAc,cAAc,UAAU,QAAQ;AAC9C,SAAO;AACT;;;AC5DA,OAAOC,YAAW;AAIX,IAAM,UAAU;AAAA,EACrB,IAAI,OAAe;AACjB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAOC,OAAM,QAAQ,QAAG;AAAA,EAC1B;AAAA,EACA,IAAI,UAAkB;AACpB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAOA,OAAM,QAAQ,QAAG;AAAA,EAC1B;AAAA,EACA,IAAI,WAAmB;AACrB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO,SAAS,EAAE;AAAA,EACpB;AAAA,EACA,IAAI,gBAAwB;AAC1B,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO,SAAS,EAAE;AAAA,EACpB;AAAA,EACA,IAAI,MAAc;AAChB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,IAAI,UAAkB;AACpB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO;AAAA,EACT;AAAA,EACA,IAAI,SAAiB;AACnB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO;AAAA,EACT;AAAA,EACA,IAAI,WAAmB;AACrB,UAAM,SAAS,oBAAoB;AACnC,QAAI,WAAW,OAAQ,QAAO;AAC9B,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO;AAAA,EACT;AACF;;;ACvDA,OAAOC,YAAW;;;ACAlB,OAAOC,YAAW;;;ACAX,SAAS,UAAU,OAAuB;AAC/C,SAAO,MAAM,QAAQ,qBAAqB,EAAE;AAC9C;;;ADUA,SAAS,qBACP,KACA;AAAA,EACE,SAASC,OAAM,KAAK,QAAG;AAAA,EACvB,kBAAkBA,OAAM,KAAK,QAAG;AAAA,EAChC,SAAAC,WAAU;AAAA,EACV,YAAY;AACd,IAAuB,CAAC,GAClB;AACN,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAY,cAAc;AAChC,QAAM,eAAe,IAAI,MAAM,IAAI;AACnC,QAAM,SAAS,YAAY,GAAG,MAAM,OAAO;AAC3C,QAAM,qBAAqB,YAAY,GAAG,eAAe,OAAO;AAChE,QAAM,aAAa,YAAY,kBAAkB;AAEjD,WAAS,QAAQ,GAAG,QAAQA,UAAS,SAAS,GAAG;AAC/C,UAAM,KAAK,UAAU;AAAA,EACvB;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,OAAO,MAAM,IAAI;AACzB;AAAA,EACF;AAEA,QAAM,CAAC,YAAY,IAAI,GAAG,iBAAiB,IAAI;AAC/C,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,KAAK,GAAG,MAAM,GAAG,SAAS,EAAE;AAAA,EACpC,OAAO;AACL,UAAM,KAAK,YAAY,SAAS,EAAE;AAAA,EACpC;AAEA,aAAW,QAAQ,mBAAmB;AACpC,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,KAAK,GAAG,kBAAkB,GAAG,IAAI,EAAE;AACzC;AAAA,IACF;AACA,UAAM,KAAK,UAAU;AAAA,EACvB;AAEA,UAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAC9C;AAEO,SAAS,QAAQ,KAAa,SAAmC;AACtE,QAAM,SAAS,oBAAoB;AACnC,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AAC5C;AAAA,EACF;AACA,MAAI,WAAW,QAAQ;AACrB,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,UAAU,EAAE,OAAO,WAAW,SAAS,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA,IAClE;AACA;AAAA,EACF;AAEA,uBAAqB,KAAK,OAAO;AACnC;AAEO,SAAS,KAAK,KAAmB;AACtC,QAAM,SAAS,oBAAoB;AACnC,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,MAAM,eAAe,UAAU,GAAG,CAAC;AAAA,CAAI;AACtD;AAAA,EACF;AACA,MAAI,WAAW,QAAQ;AACrB,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,UAAU,EAAE,OAAO,QAAQ,SAAS,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA,IAC/D;AACA;AAAA,EACF;AAEA,UAAQ,KAAK,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACvC;AAEO,SAAS,QAAQ,KAAmB;AACzC,QAAM,SAAS,oBAAoB;AACnC,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,MAAM,kBAAkB,UAAU,GAAG,CAAC;AAAA,CAAI;AACzD;AAAA,EACF;AACA,MAAI,WAAW,QAAQ;AACrB,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,UAAU,EAAE,OAAO,WAAW,SAAS,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA,IAClE;AACA;AAAA,EACF;AAEA,UAAQ,KAAK,EAAE,QAAQ,QAAQ,QAAQ,CAAC;AAC1C;AAEO,SAAS,KAAK,KAAmB;AACtC,QAAM,SAAS,oBAAoB;AACnC,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,MAAM,kBAAkB,UAAU,GAAG,CAAC;AAAA,CAAI;AACzD;AAAA,EACF;AACA,MAAI,WAAW,QAAQ;AACrB,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,UAAU,EAAE,OAAO,QAAQ,SAAS,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA,IAC/D;AACA;AAAA,EACF;AAEA,UAAQ,KAAK,EAAE,QAAQD,OAAM,OAAO,QAAG,EAAE,CAAC;AAC5C;AAEO,SAAS,MAAM,KAAmB;AACvC,QAAM,SAAS,oBAAoB;AACnC,MAAI,WAAW,YAAY;AACzB,YAAQ,OAAO,MAAM,gBAAgB,UAAU,GAAG,CAAC;AAAA,CAAI;AACvD;AAAA,EACF;AACA,MAAI,WAAW,QAAQ;AACrB,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,UAAU,EAAE,OAAO,SAAS,SAAS,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA,IAChE;AACA;AAAA,EACF;AAEA,UAAQ,KAAK,EAAE,QAAQA,OAAM,IAAI,QAAG,EAAE,CAAC;AACzC;AAEO,IAAM,MAAM;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AD/HO,SAAS,aAAa,SAAmD;AAC9E,QAAM,OAAO,CACX,OACAE,aACS;AACT,QAAI,SAAS;AACX,cAAQA,QAAO;AACf;AAAA,IACF;AACA,QAAI,UAAU,WAAW;AACvB,UAAI,QAAQA,QAAO;AACnB;AAAA,IACF;AACA,QAAI,UAAU,QAAQ;AACpB,UAAI,KAAKA,QAAO;AAChB;AAAA,IACF;AACA,QAAI,UAAU,SAAS;AACrB,UAAI,MAAMA,QAAO;AACjB;AAAA,IACF;AACA,QAAI,KAAKA,QAAO;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,KAAKA,UAAuB;AAC1B,WAAK,QAAQA,QAAO;AAAA,IACtB;AAAA,IACA,QAAQA,UAAuB;AAC7B,WAAK,WAAWA,QAAO;AAAA,IACzB;AAAA,IACA,KAAKA,UAAuB;AAC1B,WAAK,QAAQA,QAAO;AAAA,IACtB;AAAA,IACA,MAAMA,UAAuB;AAC3B,WAAK,SAASA,QAAO;AAAA,IACvB;AAAA,IACA,SAAS,OAAe,OAAqB;AAC3C,UAAI,SAAS;AACX,gBAAQ,GAAG,KAAK,KAAK,KAAK,EAAE;AAC5B;AAAA,MACF;AACA,UAAI,QAAQ,GAAG,KAAK;AAAA,KAAQ,KAAK,IAAI,EAAE,QAAQ,QAAQ,SAAS,CAAC;AAAA,IACnE;AAAA,IACA,cAAc,OAAe,OAAqB;AAChD,UAAI,SAAS;AACX,gBAAQ,GAAG,KAAK,KAAK,KAAK,EAAE;AAC5B;AAAA,MACF;AACA,UAAI,QAAQ,GAAG,KAAK;AAAA,KAAQ,KAAK,IAAI,EAAE,QAAQ,QAAQ,cAAc,CAAC;AAAA,IACxE;AAAA,IACA,QAAQA,UAAiB,QAAuB;AAC9C,UAAI,SAAS;AACX,gBAAQA,QAAO;AACf;AAAA,MACF;AACA,UAAI,QAAQA,UAAS,EAAE,QAAQ,UAAUC,OAAM,KAAK,QAAG,EAAE,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,IAAM,SAAS,aAAa;;;AG3EnC,SAAS,aAAa;;;ACAtB,OAAOC,YAAW;;;ACAlB,SAAS,qBAAAC,0BAAyB;AAIlC,IAAM,UAAU,IAAIA,mBAAiC;;;ADwBrD,IAAM,eAAe,GAAGC,OAAM,MAAM,KAAK,QAAG,CAAC;;;AE5B7C,OAAOC,YAAW;;;ACAlB,OAAO,cAAc;AACrB,SAAS,mBAAmB;;;ACD5B,OAAOC,aAAW;AAClB,YAAY,WAAW;;;ACDvB,OAAOC,YAAW;AAClB,SAAS,gBAAgB;;;ACDzB,OAAOC,aAAW;;;ACAlB,OAAOC,aAAW;;;ACAlB,OAAOC,aAAW;;;ACAlB,OAAOC,aAAW;;;ACAlB,OAAOC,aAAW;;;ACAlB,OAAOC,aAAW;;;ACIlB,IAAM,8BAA8B,KAAK,KAAK;;;ACJ9C,OAAOC,YAAU;AACjB,SAAS,WAAAC,gBAAe;AAExB,SAAS,MAAM,WAAAC,gBAAe;AAC9B,SAAS,uBAAuB;;;ACJhC,SAAS,kBAAkB;;;ACA3B;AAAA,EACE,SAASC;AAAA,OAGJ;;;ACJP,YAAYC,iBAAgB;AAC5B,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACFrB,SAAS,SAASC,0BAAyB;;;ACA3C,OAAOC,YAAU;AACjB,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAAC,QAAO,QAAAC,aAA6B;;;ACF7C,YAAYC,UAAQ;AACpB,OAAOC,YAAU;;;ACDjB,SAAS,oBAAoB;AACtB,IAAM,mBAAmB;AACzB,SAAS,gBAAgB,UAAU,CAAC,GAAG;AAC1C,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,YAAY,aAAa,QAAQ;AACvC,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,SAAS,CAACC,UAAS,UAAU,OAAOA,KAAI;AAC9C,QAAM,SAAS,CAAC,WAAW;AACvB,UAAM,aAAa,kBAAkB,cAAc,SAAS,YAAY,KAAK,MAAM;AACnF,WAAO,YAAY,OAAO,UAAU,OAAO,UAAU,CAAC;AAAA,EAC1D;AACA,QAAM,QAAQ,CAACA,UAAS,OAAOA,KAAI,EAAE;AACrC,QAAMC,YAAW,CAACD,OAAM,eAAe;AACnC,QAAI,cAAc,GAAG;AACjB,aAAO;AAAA,IACX;AACA,UAAM,SAAS,OAAOA,KAAI;AAC1B,QAAI,OAAO,UAAU,YAAY;AAC7B,aAAOA;AAAA,IACX;AACA,WAAO,OAAO,OAAO,MAAM,GAAG,UAAU,CAAC;AAAA,EAC7C;AACA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAAC;AAAA,IACA,MAAM,MAAM,UAAU,KAAK;AAAA,EAC/B;AACJ;AACA,IAAI;AACG,SAAS,YAAYD,OAAM;AAC9B,uBAAqB,gBAAgB;AACrC,SAAO,iBAAiB,MAAMA,KAAI;AACtC;;;ACnCA,SAAS,aAAa,oBAAoB;AAC1C,SAAS,SAAS,QAAAE,aAAY;AAC9B,SAAS,qBAAqB;AACvB,IAAM,2BAA2B;AACxC,IAAM,sBAAsBA,MAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,QAAQ;AAClF,SAAS,qBAAqB;AAC1B,SAAO,YAAY,qBAAqB,EAAE,eAAe,KAAK,CAAC,EAC1D,OAAO,WAAS,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,CAAC,EAC5D,IAAI,WAAS,MAAM,IAAI,EACvB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACxD;AACA,SAAS,4BAA4B;AACjC,QAAM,kBAAkB,mBAAmB;AAC3C,MAAI,gBAAgB,WAAW,GAAG;AAC9B,UAAM,IAAI,MAAM,8CAA8C,mBAAmB,EAAE;AAAA,EACvF;AACA,SAAO,gBAAgB,IAAI,cAAY,aAAaA,MAAK,qBAAqB,QAAQ,GAAG,MAAM,EAAE,KAAK,CAAC;AAC3G;AACO,IAAM,2BAA2B,0BAA0B;;;AChBlE,IAAM,oBAAoB,yBAAyB,KAAK,wBAAwB;AAChF,IAAM,0BAA0B,OAAO,WAAW,mBAAmB,MAAM;;;AHG3E,eAAsB,kBAAkB,MAAuC;AAC7E,MAAI,CAAE,MAAMC,YAAW,IAAI,GAAI;AAC7B,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,UAAU,IAAI;AAElC,MAAI,eAAe;AACnB,QAAM,cAAc,oBAAI,IAAY;AAEpC,aAAW,QAAQ,OAAO;AACxB,oBAAgB,YAAY,KAAK,IAAI;AACrC,eAAW,UAAU,KAAK,YAAY,WAAW,CAAC,GAAG;AACnD,YAAM,aAAa,OAAO,KAAK,KAAK;AACpC,UAAI,WAAW,SAAS,GAAG;AACzB,oBAAY,IAAI,UAAU;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAWC,OAAK,QAAQ,MAAM,MAAM,IAAI;AAE9C,MAAI,eAAe;AACnB,QAAM,iBAA2B,CAAC;AAElC,aAAW,cAAc,aAAa;AACpC,UAAM,UAAUA,OAAK,WAAW,UAAU,IACtC,aACAA,OAAK,QAAQ,UAAU,UAAU;AACrC,QAAI;AACF,YAAM,UAAU,MAAS,cAAS,SAAS,MAAM;AACjD,sBAAgB,YAAY,OAAO;AAAA,IACrC,SAASC,QAAO;AACd,UAAIC,WAAUD,MAAK,GAAG;AACpB,uBAAe,KAAK,UAAU;AAC9B;AAAA,MACF;AACA,YAAMA;AAAA,IACR;AAAA,EACF;AAEA,iBAAe,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAE9D,QAAM,iBACJ,iBAAiB,IAAI,IAAI,eAAe,KAAK,IAAI,cAAc,CAAC;AAElE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAeF,YAAW,YAAsC;AAC9D,MAAI;AACF,UAAS,UAAK,UAAU;AACxB,WAAO;AAAA,EACT,SAASE,QAAO;AACd,QAAIC,WAAUD,MAAK,GAAG;AACpB,aAAO;AAAA,IACT;AACA,UAAMA;AAAA,EACR;AACF;AAEA,SAASC,WAAUD,QAAyB;AAC1C,SACE,OAAOA,WAAU,YACjBA,WAAU,QACV,UAAUA,UACVA,OAAM,SAAS;AAEnB;;;ApDzEO,IAAM,wBAAwB;AAoBrC,SAAS,eAAe,WAAkD;AACxE,SAAO;AAAA,IACL,kBAAkB,WAAW,oBAAoB;AAAA,IACjD,gBAAgB,WAAW,kBAAkB;AAAA,IAC7C,iBAAiB,WAAW,mBAAmB;AAAA,IAC/C,mBAAmB,WAAW,qBAAqB;AAAA,IACnD,UAAU,WAAW,YAAY;AAAA,IACjC,WAAW,WAAW,aAAa;AAAA,EACrC;AACF;AAEA,eAAsB,OACpB,MACA,MACA,SACuB;AACvB,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,SAAS,MAAM,kBAAkB,KAAK,MAAM;AAClD,QAAM,eAAe,MAAS,cAASE,OAAK,KAAK,MAAM,oBAAoB,CAAC;AAC5E,QAAM,gBAAgB;AAAA,IACpB,IAAIC;AAAA,IACJ,UAAUD,OAAK,KAAK,cAAc,IAAI,GAAG,eAAe;AAAA,EAC1D;AACA,QAAM,UACH,MAAM,aAAa,eAAe,KAAK,SAAS,IAAI,KAAM,KAAK,SAAS;AAC3E,QAAM,MAAM,SAAS,iBAAiB;AAAA,IACpC,aAAa,OAAO;AAAA,IACpB;AAAA,IACA,uBAAuB;AAAA,IACvB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,KAAK,SAAU,MAAM,aAAa,aAAa,GAAI;AACtD,UAAM,MAAM,MAAM,SAAS,eAAe,MAAM,GAAG;AACnD,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,QACL,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,QAC9C,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,MAAM,SAAS,kBAAkB,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,kBAAkB,MAAM,OAAO,OAAO,OAAO,IAAI;AAChE,MAAI,KAAK,QAAQ;AACf,YAAQ,IAAI,MAAM;AAClB,WAAO;AAAA,MACL,MAAM,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,MAC9C,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ,MAAM,SAAS,kBAAkB,IAAI;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,SAAS,SAAS,IAAI;AAE3C,MAAI,WAAW;AACf,MAAI,aAAa;AACjB,MAAI;AAEJ,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnBE,OAAM,SAAS,EAAE,OAAO,CAAC;AAAA,MACzB,KAAK,aAAc,MAAM,kBAAkB,aAAa;AAAA,IAC1D;AACA,eAAW,OAAO;AAClB,iBAAa,OAAO,cAAc;AAAA,EACpC,SAASC,QAAO;AACd,mBAAeA,kBAAiB,QAAQA,SAAQ,IAAI,MAAM,OAAOA,MAAK,CAAC;AAAA,EACzE;AAEA,QAAMC,QAAO,MAAM,SAAS,UAAU,MAAM,QAAQ,UAAU,KAAK,UAAU,UAAU,OAAO,KAAK,EAAE;AACrG,QAAM,SAAS,MAAM,SAAS,kBAAkB,IAAI;AAEpD,MAAI,iBAAiB,QAAW;AAC9B,UAAM;AAAA,EACR;AAEA,MAAI,CAAC,KAAK,gBAAiB,MAAM,aAAa,aAAa,KAAM,aAAa,GAAG;AAC/E,UAAM,SAAS,gBAAgB,MAAM;AAAA,MACnC;AAAA,MACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,aAAa,OAAO;AAAA,MACpB,MAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO;AAAA,MACrB,uBAAuB;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAAA,OAAM,UAAU,YAAY,UAAU,OAAO,OAAO;AAC/D;AAEA,SAAS,kBAAkB,MAAc,aAAqB,YAA4B;AACxF,SAAO;AAAA,IACL,mBAAmB,qBAAqB;AAAA,IACxC,gBAAgB,IAAI;AAAA,IACpB,WAAW,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,kBAAkB,QAI9B;AACD,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAM,QAAQ,MAAS,cAAS,OAAO,OAAO;AAC9C,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd;AAAA,MACA,MAAM,MAAM,SAAS,MAAM;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,iCAAiC;AACnD;AAEA,SAAS,cAAc,MAAsB;AAC3C,SAAOJ,OAAK,QAAQ,MAAM,MAAM,IAAI;AACtC;AAEA,eAAe,eACb,SACA,WACY;AACZ,SAAO,MAAM,IAAI,QAAW,CAACK,UAAS,WAAW;AAC/C,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,IAAI,MAAM,0BAA0B,SAAS,IAAI,CAAC;AAAA,IAC3D,GAAG,SAAS;AAEZ,YAAQ;AAAA,MACN,CAAC,UAAU;AACT,qBAAa,KAAK;AAClB,QAAAA,SAAQ,KAAK;AAAA,MACf;AAAA,MACA,CAACF,WAAU;AACT,qBAAa,KAAK;AAClB,eAAOA,MAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AwDvLA,YAAYG,eAAc;;;ACsBnB,IAAM,uBAAuB;AAAA,EAClC,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAEO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YACkB,MAChBC,UACA;AACA,UAAMA,QAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAMpB;;;AClBO,SAAS,aAAa,MAAwC;AACnE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,MAAM,qBAAqB;AAAA,QAC3B,SAAS;AAAA,MACX;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MACE,OAAO,WAAW,YAClB,WAAW,QACX,MAAM,QAAQ,MAAM,GACpB;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,MAAM,qBAAqB;AAAA,QAC3B,SAAS;AAAA,MACX;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,QAAM,QAAQ,QAAQ;AACtB,QAAM,KAAK,OAAO,IAAI,OAAO,YAAY,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK;AAE/E,MAAI,IAAI,YAAY,OAAO;AACzB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,MAAM,qBAAqB;AAAA,QAC3B,SAAS;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,IAAI,WAAW,UAAU;AAClC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,MAAM,qBAAqB;AAAA,QAC3B,SAAS;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,SAAS;AAAA,QACP,SAAS;AAAA,QACT,QAAQ,IAAI;AAAA,QACZ,QAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,MAAM;AACf,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,MAAM,qBAAqB;AAAA,QAC3B,SAAS;AAAA,MACX;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,SAAS;AAAA,MACP,SAAS;AAAA,MACT;AAAA,MACA,QAAQ,IAAI;AAAA,MACZ,QAAQ,IAAI;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,sBACd,IACA,QACQ;AACR,QAAM,WAA4B;AAAA,IAChC,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,SAAO,KAAK,UAAU,QAAQ;AAChC;AAEO,SAAS,oBACd,IACAC,QACQ;AACR,QAAM,WAA4B;AAAA,IAChC,SAAS;AAAA,IACT;AAAA,IACA,OAAAA;AAAA,EACF;AACA,SAAO,KAAK,UAAU,QAAQ;AAChC;;;ACzHO,SAAS,mBAAmB,MAA8C;AAC/E,MAAI,KAAK,SAAS,IAAI;AACpB,WAAO;AAAA,EACT;AAGA,MACE,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,IACZ;AACA,WAAO,EAAE,MAAM,aAAa,KAAK,MAAM;AAAA,EACzC;AAGA,MAAI,KAAK,CAAC,MAAM,OAAQ,KAAK,CAAC,MAAM,OAAQ,KAAK,CAAC,MAAM,KAAM;AAC5D,WAAO,EAAE,MAAM,cAAc,KAAK,MAAM;AAAA,EAC1C;AAGA,MACE,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,IACZ;AACA,WAAO,EAAE,MAAM,aAAa,KAAK,MAAM;AAAA,EACzC;AAGA,MACE,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,EAAE,MAAM,MACb,KAAK,EAAE,MAAM,IACb;AACA,WAAO,EAAE,MAAM,cAAc,KAAK,OAAO;AAAA,EAC3C;AAGA,MACG,KAAK,CAAC,MAAM,QAAS,KAAK,CAAC,MAAM,OAAQ,KAAK,CAAC,MAAM,QACrD,KAAK,CAAC,MAAM,MAAQ,KAAK,CAAC,MAAM,MAAQ,KAAK,CAAC,MAAM,IACrD;AACA,WAAO,EAAE,MAAM,cAAc,KAAK,MAAM;AAAA,EAC1C;AAGA,MACE,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,EAAE,MAAM,MACb,KAAK,EAAE,MAAM,IACb;AACA,WAAO,EAAE,MAAM,aAAa,KAAK,MAAM;AAAA,EACzC;AAGA,MACE,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,IACZ;AACA,WAAO,EAAE,MAAM,aAAa,KAAK,MAAM;AAAA,EACzC;AAIA,MACE,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,EAAE,MAAM,IACb;AACA,WAAO,EAAE,MAAM,aAAa,KAAK,MAAM;AAAA,EACzC;AAGA,MACE,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,KACZ;AACA,WAAO,EAAE,MAAM,aAAa,KAAK,MAAM;AAAA,EACzC;AAGA,MACE,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,MACZ,KAAK,CAAC,MAAM,OACZ,KAAK,CAAC,MAAM,KACZ;AACA,WAAO,EAAE,MAAM,cAAc,KAAK,OAAO;AAAA,EAC3C;AAEA,SAAO;AACT;;;ACvHA,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,QAAN,MAAM,OAAM;AAAA,EACT,YACW,YACA,UACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,aAAa,QAAQ,KAA6B;AAChD,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,GAAG,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,IAChG;AAEA,UAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,UAAM,OAAO,IAAI,WAAW,WAAW;AAEvC,UAAM,WAAW,mBAAmB,IAAI;AACxC,QAAI;AAEJ,QAAI,YAAY,sBAAsB,IAAI,SAAS,IAAI,GAAG;AACxD,iBAAW,SAAS;AAAA,IACtB,OAAO;AACL,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC;AACtE,UAAI,eAAe,sBAAsB,IAAI,WAAW,GAAG;AACzD,mBAAW;AAAA,MACb,OAAO;AACL,cAAM,IAAI,MAAM,yCAAyC,GAAG,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ;AAClD,WAAO,IAAI,OAAM,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,UAAU,MAAkB,QAAwB;AACzD,QAAI;AAEJ,QAAI,QAAQ;AACV,iBAAW,OAAO,SAAS,GAAG,IAAI,SAAS,SAAS,MAAM;AAAA,IAC5D,OAAO;AACL,YAAM,WAAW,mBAAmB,IAAI;AACxC,UAAI,CAAC,YAAY,CAAC,sBAAsB,IAAI,SAAS,IAAI,GAAG;AAC1D,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AACA,iBAAW,SAAS;AAAA,IACtB;AAEA,UAAM,SAAS,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ;AAClD,WAAO,IAAI,OAAM,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,WAAW,QAAgB,UAAyB;AACzD,WAAO,IAAI,OAAM,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEA,iBAA+B;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACF;;;ACpEA,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,mBAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AACR;AAEO,IAAM,QAAN,MAAM,OAAM;AAAA,EACT,YACW,YACA,UACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,aAAa,QAAQ,KAA6B;AAChD,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,GAAG,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,IAChG;AAEA,UAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,UAAM,OAAO,IAAI,WAAW,WAAW;AAEvC,UAAM,WAAW,mBAAmB,IAAI;AACxC,QAAI;AAEJ,QAAI,YAAY,sBAAsB,IAAI,SAAS,IAAI,GAAG;AACxD,iBAAW,SAAS;AAAA,IACtB,OAAO;AACL,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC;AACtE,UAAI,eAAe,sBAAsB,IAAI,WAAW,GAAG;AACzD,mBAAW;AAAA,MACb,OAAO;AACL,cAAM,IAAI,MAAM,yCAAyC,GAAG,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ;AAClD,WAAO,IAAI,OAAM,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,UAAU,MAAkB,QAAwB;AACzD,QAAI;AAEJ,QAAI,QAAQ;AACV,UAAI,OAAO,SAAS,GAAG,GAAG;AACxB,mBAAW;AAAA,MACb,OAAO;AACL,mBAAW,iBAAiB,OAAO,YAAY,CAAC,KAAK,SAAS,MAAM;AAAA,MACtE;AAAA,IACF,OAAO;AACL,YAAM,WAAW,mBAAmB,IAAI;AACxC,UAAI,CAAC,YAAY,CAAC,sBAAsB,IAAI,SAAS,IAAI,GAAG;AAC1D,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AACA,iBAAW,SAAS;AAAA,IACtB;AAEA,UAAM,SAAS,OAAO,KAAK,IAAI,EAAE,SAAS,QAAQ;AAClD,WAAO,IAAI,OAAM,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,WAAW,QAAgB,UAAyB;AACzD,WAAO,IAAI,OAAM,QAAQ,QAAQ;AAAA,EACnC;AAAA,EAEA,iBAA+B;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACF;;;ACrEA,SAAS,eAAe,UAA2B;AACjD,SACE,SAAS,WAAW,OAAO,KAC3B,aAAa,sBACb,aAAa,qBACb,aAAa,4BACb,aAAa;AAEjB;AAEO,IAAM,OAAN,MAAM,MAAK;AAAA,EACR,YACW,MACA,UACA,QACA,MACjB;AAJiB;AACA;AACA;AACA;AAAA,EAChB;AAAA,EAJgB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,aAAa,QAAQ,KAA4B;AAC/C,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6BAA6B,GAAG,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,IAC/F;AAEA,UAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,UAAM,OAAO,IAAI,WAAW,WAAW;AAEvC,UAAM,WAAW,mBAAmB,IAAI;AACxC,QAAI;AAEJ,QAAI,UAAU;AACZ,iBAAW,SAAS;AAAA,IACtB,OAAO;AACL,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC;AACtE,UAAI,aAAa;AACf,mBAAW;AAAA,MACb,OAAO;AACL,cAAM,IAAI,MAAM,mCAAmC,GAAG,EAAE;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,SAAS,eAAe,QAAQ;AACtC,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AAErC,WAAO,IAAI,MAAK,MAAM,UAAU,QAAQ,IAAI;AAAA,EAC9C;AAAA,EAEA,OAAO,UAAU,MAAkB,UAAwB;AACzD,UAAM,SAAS,eAAe,QAAQ;AACtC,WAAO,IAAI,MAAK,MAAM,UAAU,MAAM;AAAA,EACxC;AAAA,EAEA,OAAO,SAASC,OAAc,WAAW,cAAoB;AAC3D,WAAO,IAAI,MAAKA,OAAM,UAAU,IAAI;AAAA,EACtC;AAAA,EAEA,OAAO,WAAW,QAAgB,UAAwB;AACxD,UAAM,OAAO,OAAO,KAAK,QAAQ,QAAQ;AACzC,UAAM,SAAS,eAAe,QAAQ;AACtC,WAAO,IAAI,MAAK,IAAI,WAAW,IAAI,GAAG,UAAU,MAAM;AAAA,EACxD;AAAA,EAEA,iBAAmC;AACjC,UAAM,MAAM,KAAK,OAAO,WAAW,KAAK,IAAI,KAAK;AAEjD,QAAI,KAAK,QAAQ;AACf,UAAIA;AACJ,UAAI,OAAO,KAAK,SAAS,UAAU;AACjC,QAAAA,QAAO,KAAK;AAAA,MACd,OAAO;AACL,QAAAA,QAAO,IAAI,YAAY,OAAO,EAAE,OAAO,KAAK,IAAI;AAAA,MAClD;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR;AAAA,UACA,UAAU,KAAK;AAAA,UACf,MAAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI;AACJ,UAAI,OAAO,KAAK,SAAS,UAAU;AACjC,eAAO,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,MACjD,OAAO;AACL,eAAO,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;AAAA,MACjD;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR;AAAA,UACA,UAAU,KAAK;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC7FA,SAAS,mBAAmB,OAAsE;AAChG,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE;AAAA,EAC7C;AAEA,MAAI,UAAU,MAAM;AAClB,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO;AAAA,EACtC;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM,eAAe;AAAA,EAC9B;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM,eAAe;AAAA,EAC9B;AAEA,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,eAAe;AAAA,EAC9B;AAEA,MAAI,eAAe,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,KAAK,EAAE;AACrD;AAEO,SAAS,gBAAgB,QAAoC;AAClE,MAAI,WAAW,QAAW;AACxB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,WAAO,OAAO,QAAQ,CAAC,SAAS,gBAAgB,IAAI,CAAC;AAAA,EACvD;AAEA,SAAO,CAAC,mBAAmB,MAAM,CAAC;AACpC;AAEA,SAAS,eAAe,OAAsC;AAC5D,MAAI,EAAE,UAAU,UAAU,OAAO,MAAM,SAAS,UAAU;AACxD,WAAO;AAAA,EACT;AAEA,SACE,MAAM,SAAS,UACf,MAAM,SAAS,WACf,MAAM,SAAS,WACf,MAAM,SAAS;AAEnB;;;APlDA,IAAM,mBAAmB;AAuBlB,SAAS,aAAa,SAAgC;AAC3D,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,QAAM,wBAAwB,oBAAI,IAEhC;AACF,MAAI,cAAc;AAElB,QAAM,gBAAgB,OACpB,QACA,WAC0B;AAE1B,QAAI,WAAW,QAAQ;AACrB,aAAO,EAAE,QAAQ,CAAC,EAAE;AAAA,IACtB;AAEA,QAAI,WAAW,cAAc;AAC3B,oBAAc;AACd,YAAM,oBACJ,OAAO,QAAQ,oBAAoB,WAC/B,OAAO,kBACP;AACN,YAAM,SAA2B;AAAA,QAC/B,iBAAiB,qBAAqB;AAAA,QACtC,cAAc;AAAA,UACZ,OAAO;AAAA,YACL,aAAa;AAAA,UACf;AAAA,QACF;AAAA,QACA,YAAY;AAAA,UACV,MAAM,QAAQ;AAAA,UACd,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AACA,aAAO,EAAE,OAAO;AAAA,IAClB;AAEA,QAAI,WAAW,6BAA6B;AAC1C,aAAO,EAAE,QAAQ,OAAU;AAAA,IAC7B;AAGA,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM,qBAAqB;AAAA,UAC3B,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,cAAc;AAC3B,YAAM,WAAmB,CAAC;AAC1B,iBAAW,QAAQ,MAAM,OAAO,GAAG;AACjC,iBAAS,KAAK;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,aAAa,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AACA,aAAO,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE;AAAA,IACvC;AAEA,QAAI,WAAW,cAAc;AAC3B,YAAM,WAAW,QAAQ;AACzB,YAAM,WAAY,QAAQ,aAAyC,CAAC;AAEpE,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM,qBAAqB;AAAA,YAC3B,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,IAAI,QAAQ;AAC/B,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM,qBAAqB;AAAA,YAC3B,SAAS,mBAAmB,QAAQ;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,gBAAgB,MAAM,KAAK,QAAQ,QAAQ;AACjD,cAAM,SAAyB,iBAAiB,aAAa,IACzD,gBACA,EAAE,SAAS,gBAAgB,aAAa,EAAE;AAC9C,eAAO,EAAE,OAAO;AAAA,MAClB,SAAS,KAAK;AACZ,YAAI,eAAe,WAAW;AAC5B,iBAAO;AAAA,YACL,OAAO;AAAA,cACL,MAAM,IAAI;AAAA,cACV,SAAS,IAAI;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,cAAM,eACJ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACjD,cAAM,SAAyB;AAAA,UAC7B,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,YAAY,GAAG,CAAC;AAAA,UAC1D,SAAS;AAAA,QACX;AACA,eAAO,EAAE,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM,qBAAqB;AAAA,QAC3B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAClB,MACAC,WACkB;AAClB,UAAM,SAAS,aAAa,IAAI;AAEhC,QAAI,CAAC,OAAO,SAAS;AACnB,MAAAA,OAAM,oBAAoB,OAAO,IAAI,OAAO,KAAK,IAAI,IAAI;AACzD;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,eAAe,IAAI;AACpC,UAAM,EAAE,QAAQ,OAAAC,OAAM,IAAI,MAAM,OAAO;AAAA,MACrC,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,QAAI,gBAAgB;AAClB;AAAA,IACF;AAEA,UAAM,gBAAgB;AAEtB,QAAIA,QAAO;AACT,MAAAD,OAAM,oBAAoB,cAAc,IAAIC,MAAK,IAAI,IAAI;AAAA,IAC3D,WAAW,WAAW,QAAW;AAC/B,MAAAD,OAAM,sBAAsB,cAAc,IAAI,MAAM,IAAI,IAAI;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,wBAAwB,CAAC,WAAyB;AACtD,UAAM,eAAoC;AAAA,MACxC,SAAS;AAAA,MACT;AAAA,IACF;AAEA,eAAW,YAAY,uBAAuB;AAC5C,eAAS,YAAY;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,SAAiB;AAAA,IACrB,KACE,MACA,aACA,aACA,SACQ;AACR,YAAM,IAAI,MAAM;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IAEA,eACE,UACY;AACZ,4BAAsB,IAAI,QAAQ;AAClC,aAAO,MAAM;AACX,8BAAsB,OAAO,QAAQ;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,WAAW,MAAuB;AAChC,aAAO,MAAM,OAAO,IAAI;AAAA,IAC1B;AAAA,IAEA,MAAM,qBAAoC;AACxC,UAAI,aAAa;AACf,8BAAsB,kCAAkC;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA;AAAA,IAEA,MAAM,SAAwB;AAC5B,aAAO,OAAO,QAAQ;AAAA,QACpB,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,QAAQ,WAAqC;AACjD,aAAO,IAAI,QAAQ,CAACE,aAAY;AAC9B,cAAM,cAAc,OAAO,eAAe,CAAC,iBAAiB;AAC1D,oBAAU,SAAS,MAAM,GAAG,KAAK,UAAU,YAAY,CAAC;AAAA,CAAI;AAAA,QAC9D,CAAC;AACD,cAAM,KAAc,0BAAgB;AAAA,UAClC,OAAO,UAAU;AAAA,UACjB,WAAW;AAAA,QACb,CAAC;AAED,WAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,sBAAY,MAAM,CAAC,SAAS,UAAU,SAAS,MAAM,IAAI,CAAC;AAAA,QAC5D,CAAC;AAED,WAAG,GAAG,SAAS,MAAM;AACnB,sBAAY;AACZ,UAAAA,SAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,WAAW,WAAwC;AACvD,aAAO,IAAI,QAAc,CAACA,aAAY;AACpC,cAAM,cAAc,OAAO,eAAe,CAAC,iBAAiB;AAC1D,eAAK,UAAU,KAAK,YAAY;AAAA,QAClC,CAAC;AAED,kBAAU,YAAY,OAAOC,aAA4B;AAEvD,cAAI,EAAE,YAAYA,WAAU;AAC1B;AAAA,UACF;AAGA,cAAI,EAAE,QAAQA,aAAYA,SAAQ,OAAO,QAAW;AAClD,kBAAM,OAAO,cAAcA,SAAQ,QAAQA,SAAQ,MAAM;AACzD;AAAA,UACF;AAEA,gBAAM,UAAUA;AAChB,gBAAM,EAAE,QAAQ,OAAAF,OAAM,IAAI,MAAM,OAAO;AAAA,YACrC,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAEA,cAAIA,QAAO;AACT,kBAAM,WAA4B;AAAA,cAChC,SAAS;AAAA,cACT,IAAI,QAAQ;AAAA,cACZ,OAAAA;AAAA,YACF;AACA,kBAAM,UAAU,KAAK,QAAQ;AAAA,UAC/B,WAAW,WAAW,QAAW;AAC/B,kBAAM,WAA4B;AAAA,cAChC,SAAS;AAAA,cACT,IAAI,QAAQ;AAAA,cACZ;AAAA,YACF;AACA,kBAAM,UAAU,KAAK,QAAQ;AAAA,UAC/B;AAAA,QACF;AAEA,kBAAU,UAAU,MAAM;AACxB,sBAAY;AACZ,UAAAC,SAAQ;AAAA,QACV;AAEA,kBAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAyC;AACjE,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,aAAa,QAAQ;AACxE,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAS,MAA+B,OAAO;AAC9D;;;AQzSO,SAAS,aACd,YAC6B;AAC7B,QAAM,aAAuC,CAAC;AAC9C,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpD,eAAW,GAAG,IAAI;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,GAAI,KAAK,gBAAgB,UAAa,EAAE,aAAa,KAAK,YAAY;AAAA,IACxE;AACA,QAAI,CAAC,KAAK,UAAU;AAClB,eAAS,KAAK,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;ACvDA,eAAsB,qBACpB,QACA,MACwD;AACxD,QAAM,SAAS,aAAa;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAED,SAAO,KAAK,cAAc,sBAAsB,aAAa,CAAC,CAAC,GAAG,aAAa;AAAA,IAC7E,QAAQ,MAAM,OAAO,UAAU,GAAG,IAAI,CAAC,UAAU;AAAA,MAC/C,UAAU,KAAK;AAAA,MACf,aAAa,KAAK,YAAY,eAAe;AAAA,IAC/C,EAAE;AAAA,EACJ,EAAE;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,EAAE,CAAC;AAAA,IAC7C,OAAO,EAAE,SAAS,MAA4B;AAC5C,YAAM,OAAO,MAAM,OAAO,SAAS,QAAQ;AAC3C,aAAO;AAAA,QACL,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,QAClB,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,IAC1C,CAAC;AAAA,IACD,OAAO,EAAE,OAAO,MAAM,MAAyC;AAC7D,YAAM,OAAO,MAAM,OAAO,aAAa,KAAK;AAC5C,aAAO,EAAE,MAAM,OAAO,UAAU,WAAW,KAAK,MAAM,GAAG,KAAK,IAAI,KAAK;AAAA,IACzE;AAAA,EACF;AAEA,SAAO,KAAK,UAAU,uBAAuB,aAAa,CAAC,CAAC,GAAG,YAAY,OAAO,SAAS,CAAC;AAE5F,MAAI,KAAK,aAAa;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,EAAE,UAAU,SAAS,OAAO,OAA8D;AAAA,QAC/F,MAAM,MAAM,OAAO,aAAa,UAAU,SAAS,EAAE,OAAO,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,YAAY;AAAA,IAAC;AAAA,EACrB;AACF;AAEO,SAAS,iBAAyB;AACvC,SAAO,KAAK;AAAA,IACV;AAAA,MACE,YAAY;AAAA,QACV,mBAAmB;AAAA,UACjB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,CAAC,YAAY;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrFA,OAAO,QAAQ;AACf,OAAOE,YAAU;AAUjB,IAAM,oBAAsD;AAAA,EAC1D,eAAe;AAAA,IACb,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAAA,EACA,UAAU;AAAA,IACR,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,eAAe;AAAA,EACjB;AACF;AAEO,IAAM,kBAAkB,OAAO,KAAK,iBAAiB;AAWrD,SAAS,oBACd,OACA,WAA6C,mBACzB;AACpB,QAAM,aAAa,eAAe,KAAK;AACvC,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,QAAQ,WAAW,MAAM;AAAA,EACpC;AAEA,QAAM,SAAS,SAAS,UAAU;AAClC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,QAAQ,eAAe,OAAO,IAAI,WAAW;AAAA,EACxD;AAEA,SAAO,EAAE,QAAQ,aAAa,OAAO,IAAI,YAAY,OAAO;AAC9D;;;ACxDA,SAAS,YAAAC,YAAU,QAAAC,aAAY;AAC/B,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;;;ACGvB,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,SAAiB;AAC3B,UAAM,sBAAsB,OAAO,EAAE;AACrC,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,eAAe,eAA+B;AACrD,MAAI,cAAc,WAAW,IAAI,KAAK,kBAAkB,KAAK;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,cAAc,WAAW,IAAI,IAC5C,cAAc,MAAM,CAAC,IACrB;AAEJ,SAAO,KAAK,UAAU;AACxB;AAwFA,IAAM,oBAAoB;AAM1B,eAAsB,aACpB,SACA,OACA,SAC6B;AAC7B,QAAM,UAAU,oBAAoB,OAAO;AAC3C,MAAI,QAAQ,WAAW,aAAa;AAClC,UAAM,IAAI,sBAAsB,OAAO;AAAA,EACzC;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ;AAGvB,QAAM,WACJ,UAAU,WAAW,OAAO,iBAAiB,eAAe,OAAO,aAAa;AAClF,QAAM,kBAAkB,GAAG,QAAQ,IAAI,MAAM,IAAI;AACjD,QAAM,gBAAgB,GAAG,eAAe;AACxC,QAAM,cAAc,GAAG,UAAU,WAAW,OAAO,iBAAiB,OAAO,aAAa,IAAI,MAAM,IAAI;AAEtG,QAAM;AAAA,IACJ;AAAA,MACE,aAAa,gBAAgB;AAAA,QAC3B,MAAM;AAAA,QACN,OAAO,0BAA0B,MAAM,IAAI;AAAA,MAC7C,CAAC;AAAA,MACD,iBAAiB,MAAM;AAAA,QACrB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,OAAO,eAAe,MAAM,IAAI;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,IAAI,QAAQ;AAAA,MACZ,SAAS,UAAU,WAAW,QAAQ,UAAU,QAAQ;AAAA,MACxD,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,WAAW,OAAO,eAAe;AAC/B,YAAI,eAAe,mBAAmB;AACpC,iBAAO,MAAM;AAAA,QACf;AACA,cAAM,IAAI,MAAM,qBAAqB,UAAU,EAAE;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,eAAe,YAAY;AACjD;;;ACrJA,IAAM,kBAAkD;AAAA,EACtD,eAAe;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,YAAY,CAAC,aAAuB;AAClC,cAAQ,UAAU;AAAA,QAChB,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEO,IAAMC,mBAAkB,OAAO,KAAK,eAAe;AAWnD,SAASC,qBACd,OACA,WAA2C,iBACvB;AACpB,QAAM,aAAa,eAAe,KAAK;AACvC,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,QAAQ,WAAW,MAAM;AAAA,EACpC;AACA,QAAM,SAAS,SAAS,UAAU;AAClC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,QAAQ,eAAe,OAAO,IAAI,WAAW;AAAA,EACxD;AACA,SAAO,EAAE,QAAQ,aAAa,OAAO,IAAI,YAAY,OAAO;AAC9D;AAEO,SAAS,YAAY,SAA0B;AACpD,SAAOA,qBAAoB,OAAO,EAAE,WAAW;AACjD;AAEO,SAASC,gBAAe,SAA6C;AAC1E,QAAM,UAAUD,qBAAoB,OAAO;AAC3C,SAAO,QAAQ,WAAW,cAAc,QAAQ,SAAS;AAC3D;AAEO,SAASE,mBACd,QACA,UACQ;AACR,MAAI,OAAO,OAAO,eAAe,YAAY;AAC3C,WAAO,OAAO,WAAW,QAAQ;AAAA,EACnC;AACA,SAAO,OAAO;AAChB;;;AC1GA,OAAOC,YAAU;AACjB,SAAS,SAASC,YAAW,aAAaC,sBAAqB;;;ACwC/D,SAAS,qBACP,QACA,SACiC;AACjC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,SAA8B;AAAA,IAClC,SAAS,OAAO;AAAA,EAClB;AACA,MAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,WAAO,OAAO,OAAO;AAAA,EACvB;AACA,MAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,WAAO,MAAM,OAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAgD;AAC5E,QAAM,UAAU,MAAM,YAAY;AAElC,MAAI,MAAM,OAAO,cAAc,SAAS;AACtC,WAAO,qBAAqB,MAAM,QAAQ,OAAO;AAAA,EACnD;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,MAAM,OAAO;AAAA,EACxB;AACF;AAEA,SAAS,6BACP,QACA,SACqB;AACrB,QAAM,UAAU,OAAO,QAAQ,OAAO,KAAK,SAAS,IAChD,CAAC,OAAO,SAAS,GAAG,OAAO,IAAI,IAC/B,CAAC,OAAO,OAAO;AAEnB,QAAM,SAA8B;AAAA,IAClC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,MAAI,OAAO,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,GAAG;AACpD,WAAO,MAAM,OAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAA4C;AACxE,QAAM,UAAU,MAAM,YAAY;AAElC,MAAI,MAAM,OAAO,cAAc,SAAS;AACtC,WAAO,6BAA6B,MAAM,QAAQ,OAAO;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO,GAAG;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,WAAW,OAAqD;AAC9E,QAAM,UAAU,MAAM,YAAY;AAElC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,OAAO,cAAc,SAAS;AACtC,UAAMC,UAAgC;AAAA,MACpC,MAAM;AAAA,MACN,KAAK,MAAM,OAAO;AAAA,IACpB;AAEA,QAAI,MAAM,OAAO,QAAQ,MAAM,OAAO,KAAK,SAAS,GAAG;AACrD,MAAAA,QAAO,OAAO,MAAM,OAAO;AAAA,IAC7B;AAEA,QAAI,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM,OAAO,GAAG,EAAE,SAAS,GAAG;AAChE,MAAAA,QAAO,OAAO,MAAM,OAAO;AAAA,IAC7B;AAEA,WAAOA;AAAA,EACT;AAEA,QAAM,SAA+B;AAAA,IACnC,MAAM;AAAA,IACN,KAAK,MAAM,OAAO;AAAA,EACpB;AAEA,MAAI,MAAM,OAAO,WAAW,OAAO,KAAK,MAAM,OAAO,OAAO,EAAE,SAAS,GAAG;AACxE,WAAO,UAAU,MAAM,OAAO;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,IAAM,oBAAyD;AAAA,EAC7D,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AACT;AAEO,SAAS,oBAAoB,OAAoC;AACtE,SAAO,kBAAkB,KAAK;AAChC;;;ADxIA,SAAS,mBAAmB,YAA4B;AACtD,SAAOC,OAAK,QAAQ,UAAU;AAChC;AAEO,IAAMC,yBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,SAAiB;AAC3B,UAAM,sBAAsB,OAAO,EAAE;AACrC,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAASC,gBAAe,OAAuC;AAC7D,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,iBACP,UACA,WACc;AACd,QAAM,QAAQ,SAAS,SAAS;AAChC,SAAOA,gBAAe,KAAK,IAAI,QAAQ,CAAC;AAC1C;AAEA,SAAS,eACP,UACA,WACA,SACc;AACd,SAAO,EAAE,GAAG,UAAU,CAAC,SAAS,GAAG,QAAQ;AAC7C;AAEA,SAAS,eAAe,YAAoB,SAAyB;AACnE,MAAI,CAAC,WAAW,WAAW,GAAG,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,WAAW,IAAI,GAAG;AAC/B,WAAOF,OAAK,KAAK,SAAS,WAAW,MAAM,CAAC,CAAC;AAAA,EAC/C;AAEA,SAAOA,OAAK,KAAK,SAAS,WAAW,MAAM,CAAC,CAAC;AAC/C;AAEA,SAAS,kBAAkB,SAA+B;AACxD,MAAI,QAAQ,KAAK,MAAM,IAAI;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAASG,WAAU,OAAO;AAChC,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAACD,gBAAe,MAAM,GAAG;AAC3B,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAgC;AAC7D,QAAM,aAAaE,eAAc,QAAQ;AACzC,SAAO,WAAW,SAAS,IAAI,IAAI,aAAa,GAAG,UAAU;AAAA;AAC/D;AAEA,eAAe,eACb,YACA,SACuB;AACvB,QAAM,eAAe,eAAe,YAAY,QAAQ,OAAO;AAC/D,QAAM,kBAAkB,MAAM,iBAAiB,QAAQ,IAAI,YAAY;AAEvE,MAAI,oBAAoB,MAAM;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,kBAAkB,eAAe;AAC1C;AAEA,eAAe,gBACb,YACA,UACA,SACe;AACf,MAAI,QAAQ,QAAQ;AAClB;AAAA,EACF;AAEA,QAAM,eAAe,eAAe,YAAY,QAAQ,OAAO;AAC/D,QAAM,YAAYJ,OAAK,QAAQ,YAAY;AAE3C,QAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AACrD,QAAM,QAAQ,GAAG,UAAU,cAAc,sBAAsB,QAAQ,GAAG;AAAA,IACxE,UAAU;AAAA,EACZ,CAAC;AACH;AAEA,SAAS,aACP,UACA,WACA,YAC6C;AAC7C,QAAM,UAAU,iBAAiB,UAAU,SAAS;AACpD,MAAI,EAAE,cAAc,UAAU;AAC5B,WAAO,EAAE,SAAS,OAAO,SAAS,SAAS;AAAA,EAC7C;AAEA,QAAM,cAAc,EAAE,GAAG,QAAQ;AACjC,SAAO,YAAY,UAAU;AAE7B,MAAI,OAAO,KAAK,WAAW,EAAE,WAAW,GAAG;AACzC,UAAM,eAAe,EAAE,GAAG,SAAS;AACnC,WAAO,aAAa,SAAS;AAC7B,WAAO,EAAE,SAAS,MAAM,SAAS,aAAa;AAAA,EAChD;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,eAAe,UAAU,WAAW,WAAW;AAAA,EAC1D;AACF;AAEA,eAAsBK,WACpB,SACA,QACA,SACe;AACf,MAAI,CAAC,YAAY,OAAO,GAAG;AACzB,UAAM,IAAIJ,uBAAsB,OAAO;AAAA,EACzC;AAEA,QAAM,SAASK,gBAAe,OAAO;AACrC,QAAM,aAAaC,mBAAkB,QAAQ,QAAQ,QAAQ;AAC7D,QAAM,mBAAmB,oBAAoB,OAAO,KAAK;AACzD,QAAM,SAAS,iBAAiB,MAAM;AAEtC,MAAI,WAAW,QAAW;AACxB,UAAMC,aAAY,SAAS,OAAO,MAAM,OAAO;AAC/C;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,QAAQ;AAC5B,UAAM,WAAW,MAAM,eAAe,YAAY,OAAO;AACzD,UAAM,UAAU,iBAAiB,UAAU,OAAO,SAAS;AAC3D,UAAM,eAAe,eAAe,UAAU,OAAO,WAAW;AAAA,MAC9D,GAAG;AAAA,MACH,CAAC,OAAO,IAAI,GAAG;AAAA,IACjB,CAAC;AAED,UAAM,gBAAgB,YAAY,cAAc,OAAO;AACvD;AAAA,EACF;AAEA,QAAM,YAAY,mBAAmB,UAAU;AAE/C,QAAM;AAAA,IACJ;AAAA,MACE,aAAa,gBAAgB;AAAA,QAC3B,MAAM;AAAA,QACN,OAAO,oBAAoB,SAAS;AAAA,MACtC,CAAC;AAAA;AAAA;AAAA,MAGD,eAAe,UAAU;AAAA,QACvB,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,WAAW,CAAC,aAAa;AACvB,gBAAM,UAAU,iBAAiB,UAAU,OAAO,SAAS;AAC3D,gBAAM,aAAa;AAAA,YACjB,GAAG;AAAA,YACH,CAAC,OAAO,IAAI,GAAG;AAAA,UACjB;AACA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,eAAe,UAAU,OAAO,WAAW,UAAU;AAAA,UAChE;AAAA,QACF;AAAA,QACA,OAAO,OAAO,OAAO,IAAI,OAAO,UAAU;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,IAAI,QAAQ;AAAA,MACZ,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;AAEA,eAAsBA,aACpB,SACA,YACA,SACe;AACf,MAAI,CAAC,YAAY,OAAO,GAAG;AACzB,UAAM,IAAIP,uBAAsB,OAAO;AAAA,EACzC;AAEA,QAAM,SAASK,gBAAe,OAAO;AACrC,QAAM,aAAaC,mBAAkB,QAAQ,QAAQ,QAAQ;AAE7D,MAAI,OAAO,WAAW,QAAQ;AAC5B,UAAM,WAAW,MAAM,eAAe,YAAY,OAAO;AACzD,UAAM,EAAE,SAAS,QAAQ,IAAI;AAAA,MAC3B;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,gBAAgB,YAAY,SAAS,OAAO;AAClD;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,MACE,eAAe,MAAM;AAAA,QACnB,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,OAAO;AAAA,UACL,CAAC,OAAO,SAAS,GAAG;AAAA,YAClB,CAAC,UAAU,GAAG,CAAC;AAAA,UACjB;AAAA,QACF;AAAA,QACA,OAAO,UAAU,UAAU,SAAS,UAAU;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,IAAI,QAAQ;AAAA,MACZ,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;;;AE7OA,IAAM,aAAa;AAEnB,eAAsB,cACpB,SAC8B;AAC9B,MAAI,QAAQ,aAAa,QAAQ,SAAS;AACxC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,MAAI;AAEJ,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,YAAY,MAAM;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,SAAS,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,QACE,IAAI,QAAQ;AAAA,QACZ,KAAK,QAAQ;AAAA,QACb,SAAS,QAAQ;AAAA,QACjB;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEA,gBAAY,UAAU;AAAA,EACxB;AAEA,MAAI;AAEJ,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAME;AAAA,MACJ,QAAQ;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,MAAM,QAAQ,cAAc,CAAC,cAAc,gBAAgB,IAAI,CAAC,YAAY;AAAA,QAC9E;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI,QAAQ;AAAA,QACZ,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAEA,oBAAgB,QAAQ,UAAU,UAC9B,GAAG,QAAQ,OAAO,mCAClB,GAAG,QAAQ,OAAO;AAAA,EACxB;AAEA,SAAO;AAAA,IACL,gBAAgB,CAAC,QAAQ;AAAA,IACzB,eAAe,CAAC,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;;;ACtFA,YAAYC,UAAQ;AACpB,OAAOC,YAAU;AAgBjB,eAAsB,YAAY,MAAkB,SAA6C;AAC/F,QAAM,QAAQ,MAAM,UAAU,IAAI;AAClC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,CAAC;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,gBAAgB;AAAA,IACpB,IAAIC;AAAA,IACJ,UAAUC,OAAK,KAAKC,eAAc,IAAI,GAAG,eAAe;AAAA,EAC1D;AACA,QAAM,UACH,MAAM,aAAa,eAAe,QAAQ,SAAS,IAAI,KAAM,QAAQ,SAAS;AACjF,QAAM,UAAU,MAAM,mBAAmB,MAAM,QAAQ,UAAU,QAAQ,MAAM;AAC/E,QAAM,SAAU,MAAMC,OAAM,SAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAE/D,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,UAAU,OAAO;AAAA,EACnB;AACF;AAEA,eAAsB,mBACpB,MACA,UACA,QACuB;AACvB,QAAM,CAAC,WAAW,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxC,cAASF,OAAK,KAAK,MAAM,oBAAoB,GAAG,MAAM;AAAA,IACzD,UAAU,IAAI;AAAA,EAChB,CAAC;AAED,QAAM,cAAc,YAAY,SAAS;AACzC,MAAI,cAAc,QAAQ;AACxB,UAAM,IAAI,MAAM,oCAAoC,WAAW,SAAS;AAAA,EAC1E;AAEA,QAAM,cAAc,kBAAkB,OAAO,QAAQ;AACrD,QAAM,gBAA8B,CAAC;AACrC,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,aAAW,QAAQ,aAAa;AAC9B,UAAM,aAAa,YAAY,kBAAkB,IAAI,CAAC;AACtD,QAAI,aAAa,aAAa,QAAQ;AACpC,kBAAY;AACZ;AAAA,IACF;AAEA,kBAAc,KAAK,IAAI;AACvB,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,QAAQ,iBAAiB,UAAU,WAAW,aAAa;AAAA,IAC3D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,OAAqB,UAAgC;AACrF,QAAM,QAAQ,SAAS,QAAQ;AAC/B,QAAM,YAAY,MAAM,IAAI,CAAC,SAAS;AACpC,UAAMG,QAAO,CAAC,KAAK,SAAS,KAAK,YAAY,QAAQ,IAAI,KAAK,YAAY,eAAe,IAAI,KAAK,IAAI,EACnG,KAAK,IAAI,EACT,YAAY;AACf,UAAM,SAAS,SAASA,KAAI;AAC5B,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,SAAS,QAAQ;AAC1B,aAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,IAChD;AACA,WAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,OAAO;AAAA,EAC7C,CAAC;AAED,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ;AACZ,eAAW,YAAY,WAAW;AAChC,WAAK,SAAS,OAAO,IAAI,IAAI,KAAK,KAAK,GAAG;AACxC,iBAAS;AAAA,MACX;AAAA,IACF;AACA,iBAAa,IAAI,MAAM,KAAK;AAAA,EAC9B;AAEA,SAAO,UACJ,IAAI,CAAC,cAAc;AAAA,IAClB,MAAM,SAAS;AAAA,IACf,OAAO,MAAM,OAAO,CAAC,OAAO,SAAS;AACnC,YAAM,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,SAAS,MAAM,CAAC;AACvE,YAAM,MAAM,KAAK,KAAK,UAAU,SAAS,OAAO,aAAa,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI;AACrF,aAAO,QAAQ,KAAK;AAAA,IACtB,GAAG,CAAC;AAAA,EACN,EAAE,EACD,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,KAAK,QAAQ,cAAc,MAAM,KAAK,OAAO,CAAC,EACrG,IAAI,CAAC,UAAU,MAAM,IAAI;AAC9B;AAEA,SAAS,iBAAiB,UAAkB,WAAmB,OAA6B;AAC1F,QAAM,gBAAgB,MAAM,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,EAAE,KAAK,MAAM;AAC9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAAkB,MAA0B;AACnD,SAAO,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,EAAE,KAAK,IAAI;AACvD;AAEA,SAAS,SAASA,OAAwB;AACxC,SAAOA,MACJ,YAAY,EACZ,MAAM,YAAY,EAClB,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AACvC;AAEA,SAASF,eAAc,MAAsB;AAC3C,SAAOD,OAAK,QAAQ,MAAM,MAAM,IAAI;AACtC;;;ACzJA,YAAYI,UAAQ;AACpB,OAAOC,YAAU;AAejB,eAAsB,YACpB,MACA,SACwB;AACxB,QAAM,aAAa,MAAM,kBAAkB,MAAM,QAAQ,OAAO;AAChE,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,CAAC;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,MACV,cAAc,CAAC;AAAA,MACf,iBAAiB,CAAC;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,mBAAmB,MAAM,QAAQ,SAAS,OAAO,gBAAgB;AAC1F,QAAM,eAAe,oBAAoB,WAAW,eAAe,WAAW,SAAS,WAAW,YAAY,WAAW,CAAC,CAAC;AAC3H,QAAM,SAAS,mBAAmB,WAAW,SAAS,YAAY;AAClE,QAAM,aAAa,YAAY,MAAM;AACrC,MAAI,aAAa,QAAQ,QAAQ;AAC/B,UAAM,IAAI,MAAM,oCAAoC,UAAU,SAAS;AAAA,EACzE;AAEA,QAAM,gBAAgB;AAAA,IACpB,IAAIC;AAAA,IACJ,UAAUC,OAAK,KAAKC,eAAc,IAAI,GAAG,eAAe;AAAA,EAC1D;AACA,QAAM,UACH,MAAM,aAAa,eAAe,QAAQ,SAAS,IAAI,KAAM,QAAQ,SAAS;AACjF,QAAM,WAAY,MAAMC,OAAM,SAAS,EAAE,OAAO,CAAC;AAEjD,SAAO;AAAA,IACL,QAAQ,SAAS;AAAA,IACjB,WAAW,SAAS;AAAA,IACpB,YAAY,SAAS;AAAA,IACrB,QAAQ,QAAQ;AAAA,IAChB,UAAU,SAAS;AAAA,IACnB,cAAc,aACX,OAAO,CAAC,SAAS,KAAK,YAAY,WAAW,OAAO,EACpD,OAAO,CAAC,UAAU,KAAK,YAAY,WAAW,CAAC,GAAG,KAAK,CAAC,WAAW,OAAO,SAAS,WAAW,OAAO,CAAC,EACtG,IAAI,CAAC,SAAS,KAAK,OAAO;AAAA,IAC7B,iBAAiB,WAAW,YAAY,WAAW,CAAC;AAAA,EACtD;AACF;AAEA,SAAS,oBACP,OACA,eACA,iBACc;AACd,QAAM,oBAAoB,IAAI,IAAI,gBAAgB,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC;AAC9E,SAAO,MAAM,OAAO,CAAC,SAAS;AAC5B,QAAI,KAAK,YAAY,eAAe;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,IAAI,KAAK,OAAO,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,YAAQ,KAAK,YAAY,WAAW,CAAC,GAAG,KAAK,CAAC,WAAW,OAAO,SAAS,aAAa;AAAA,EACxF,CAAC;AACH;AAEA,SAAS,mBAAmB,eAAuB,OAA6B;AAC9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,aAAa;AAAA,IAC7B;AAAA,IACA,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,EACxE,EAAE,KAAK,MAAM;AACf;AAEA,eAAe,kBAAkB,MAAkB,SAAkD;AACnG,MAAI;AACF,WAAO,MAAM,SAAS,MAAM,OAAO;AAAA,EACrC,SAASC,QAAO;AACd,QAAI,OAAOA,WAAU,YAAYA,WAAU,QAAQ,UAAUA,UAASA,OAAM,SAAS,UAAU;AAC7F,aAAO;AAAA,IACT;AAEA,UAAMA;AAAA,EACR;AACF;AAEA,SAASF,eAAc,MAAsB;AAC3C,SAAOD,OAAK,QAAQ,MAAM,MAAM,IAAI;AACtC;;;AC1GA,eAAsB,iBAAiB,OAKZ;AACzB,SAAO,YAAY,MAAM,MAAM;AAAA,IAC7B,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,EACf,CAAC;AACH;;;ACdA,OAAOI,YAAU;AAmEV,SAAS,WAAW,MAAuC;AAChE,MAAI,CAACC,OAAK,WAAW,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,0CAA0C,KAAK,IAAI,EAAE;AAAA,EACvE;AAEA,QAAM,OAAO,KAAK;AAClB,QAAM,eAAe,KAAK;AAE1B,SAAO;AAAA,IACL;AAAA,IACA,WAAW,YAAY,MAAM,UAAU,IAAI;AAAA,IAC3C,UAAU,OAAO,YAAY,MAAM,SAAS,MAAM,OAAO;AAAA,IACzD,cAAc,OAAO,UAAU,MAAM,aAAa,MAAM,KAAK;AAAA,IAC7D,UAAU,YAAY,MAAM,SAAS,IAAI;AAAA,IACzC,mBAAmB,YAAY,MAAM,kBAAkB,IAAI;AAAA,IAC3D,aAAa,OAAO,YAAY,MAAM,YAAgB,MAAM,iBAAiB,SAAS,YAAY,CAAC;AAAA,IACnG,WAAW,OAAO,SAAS,MAAM,YAAY,MAAM,UAAU,MAAM,SAAS,MAAM,OAAO;AAAA,IACzF,cAAc,OAAO,SAAS,SAAS,YACrC,MAAM,aAAa,MAAM,SAAS,SAAS,OAAO;AAAA,IACpD,aAAa,YAAY,MAAM,YAAY,IAAI;AAAA,IAC/C,OAAO,OAAO,YAAY,MAAM,YAAY,MAAM,iBAAiB,SAAS,YAAY,CAAC;AAAA,IACzF,QAAQ,OAAO,YAAY,MAAM,OAAW,MAAM,iBAAiB,SAAS,YAAY,CAAC;AAAA,IACzF,aAAa,OAAO,EAAE,UAAU,GAAG,QAAQ,MAAM,MAAM,YAAgB,MAAM,UAAU,OAAO;AAAA,EAChG;AACF;AAEA,SAAS,iBAA+C,SAAY,OAA8B;AAChG,MAAI,QAAQ,UAAU,UAAa,UAAU,QAAW;AACtD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;",
|
|
4
|
+
"sourcesContent": ["import path from \"node:path\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport const MEMORY_INDEX_RELPATH = \"INDEX.md\";\nexport const MEMORY_LOG_RELPATH = \"LOG.md\";\nexport const MEMORY_LOCK_RELPATH = \".lock\";\nexport const MEMORY_PAGES_DIR_RELPATH = \"pages\";\nexport const MEMORY_CACHE_DIR_RELPATH = \".cache\";\nexport const MEMORY_INGEST_CACHE_DIR_RELPATH = `${MEMORY_CACHE_DIR_RELPATH}/ingest`;\n\nexport class MemoryPathError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MemoryPathError\";\n }\n}\n\nexport function resolveMemoryRoot(cwd: string): MemoryRoot {\n return path.resolve(cwd, \".poe-code\", \"memory\");\n}\n\nexport function assertSafeRelPath(input: string): string {\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new MemoryPathError(\"Expected a non-empty relative path.\");\n }\n\n const slashNormalized = trimmed.replaceAll(\"\\\\\", \"/\");\n if (path.posix.isAbsolute(slashNormalized) || path.win32.isAbsolute(slashNormalized)) {\n throw new MemoryPathError(`Expected a relative path, received absolute path \"${input}\".`);\n }\n\n const normalized = path.posix.normalize(slashNormalized);\n if (normalized === \".\" || normalized.length === 0) {\n throw new MemoryPathError(\"Expected a relative path to a file or directory.\");\n }\n\n if (normalized === \"..\" || normalized.startsWith(\"../\")) {\n throw new MemoryPathError(`Relative path \"${input}\" cannot escape the memory root.`);\n }\n\n return normalized;\n}\n", "import path from \"node:path\";\nimport type { FileSystem } from \"@poe-code/config-mutations\";\nimport { configuredMemoryRoot } from \"@poe-code/poe-code-config\";\nimport { resolveMemoryRoot } from \"./paths.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport const MEMORY_ROOT_ENV_VAR = \"POE_CODE_MEMORY_ROOT\";\n\nexport interface ResolveConfiguredMemoryRootOptions {\n cwd: string;\n env: Record<string, string | undefined>;\n fs: FileSystem;\n configPath: string;\n projectConfigPath?: string;\n}\n\nexport async function resolveConfiguredMemoryRoot(\n options: ResolveConfiguredMemoryRootOptions\n): Promise<MemoryRoot> {\n const envOverride = options.env[MEMORY_ROOT_ENV_VAR]?.trim();\n if (envOverride && envOverride.length > 0) {\n return resolveAgainstCwd(options.cwd, envOverride);\n }\n\n const configOverride = (\n await configuredMemoryRoot({\n fs: options.fs,\n filePath: options.configPath,\n projectFilePath: options.projectConfigPath\n })\n )?.trim();\n if (configOverride && configOverride.length > 0) {\n return resolveAgainstCwd(options.cwd, configOverride);\n }\n\n return resolveMemoryRoot(options.cwd);\n}\n\nfunction resolveAgainstCwd(cwd: string, value: string): string {\n return path.isAbsolute(value) ? value : path.resolve(cwd, value);\n}\n", "import type { ScopeDefinition, ScopeSchema } 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", "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 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 type { ConfigDocument } from \"./types.js\";\n\nexport async function readDocument(fs: FileSystem, filePath: string): Promise<ConfigDocument> {\n const document = await readStoredDocument(fs, filePath);\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 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 const globalDocument = await readStoredDocument(fs, globalPath);\n if (!projectPath || projectPath === globalPath) {\n return globalDocument.data;\n }\n\n const projectDocument = await readStoredDocument(fs, projectPath);\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): Promise<{ content: string; data: ConfigDocument }> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return await parseStoredDocument(fs, filePath, raw);\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): 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 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 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 normalized[key] = entry;\n }\n }\n\n return normalized;\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\nasync function writeDocument(\n fs: FileSystem,\n filePath: string,\n document: ConfigDocument\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\"\n });\n}\n\nasync function recoverInvalidDocument(\n fs: FileSystem,\n filePath: string,\n content: string\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const backupPath = createInvalidBackupPath(filePath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n await fs.writeFile(filePath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\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\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 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 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 checkedPaths.push(filePath);\n\n try {\n return {\n content: await fs.readFile(filePath, \"utf8\"),\n filePath\n };\n } catch (error) {\n if (hasCode(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\nfunction hasCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import path from \"node:path\";\nimport matter from \"gray-matter\";\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)\n : toData(format === \"json\" ? JSON.parse(normalizedContent) : parseYaml(normalizedContent));\n const hasExtendsField = Object.hasOwn(data, \"extends\");\n const extendsValue = data.extends === true;\n\n delete data.extends;\n\n return {\n data,\n format,\n extends: extendsValue,\n hasExtendsField\n };\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\")) {\n return \"markdown\";\n }\n\n return \"yaml\";\n}\n\nfunction parseMarkdown(content: string): Record<string, unknown> {\n const document = matter(content);\n return {\n ...toData(document.data),\n prompt: document.content\n };\n}\n\nfunction toData(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n return { ...(value as Record<string, unknown>) };\n}\n\nfunction stripBom(content: string): string {\n if (!content.startsWith(\"\\uFEFF\")) {\n return content;\n }\n\n return content.slice(1);\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 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 data[key] = resolved.value;\n Object.assign(sources, resolved.sources);\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 = 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 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 buildPath(path: string[], key: string): string {\n return [...path, key].join(\".\");\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 clone[key] = cloneValue(entry);\n }\n\n return clone;\n}\n", "import path from \"node:path\";\nimport { findBase } from \"./discover.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\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 options,\n optional: !parsedDocument.extends,\n visited: new Set([documentLayer.filePath]),\n depth: 1\n })\n : undefined;\n const composedPrompt = composePromptChain(\n {\n source: documentLayer.source,\n data: parsedDocument.data\n },\n resolvedBase?.layers ?? []\n );\n const merged = mergeLayers([\n ...collectDataLayers(chain.slice(0, documentIndex)),\n {\n source: documentLayer.source,\n data: withResolvedPrompt(parsedDocument.data, composedPrompt?.prompt)\n },\n ...stripResolvedBasePrompts(resolvedBase?.layers ?? [], composedPrompt?.consumedBaseIndexes ?? new Set<number>()),\n ...collectDataLayers(chain.slice(documentIndex + 1))\n ]);\n\n if (composedPrompt !== undefined && merged.sources.prompt === documentLayer.source && composedPrompt.source !== undefined) {\n merged.sources.prompt = composedPrompt.source;\n }\n\n return {\n data: merged.data,\n sources: merged.sources,\n chain: [documentLayer.filePath, ...(resolvedBase?.chain ?? [])]\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 options,\n optional,\n visited,\n depth\n}: {\n name: string;\n baseLayers: BaseLayer[];\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 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 if (visited.has(discoveredBase.filePath)) {\n if (optional) {\n return undefined;\n }\n\n throw new Error(\n `Circular extends detected.\\nVisited files:\\n- ${[...visited, discoveredBase.filePath].join(\"\\n- \")}`\n );\n }\n\n const matchedBaseIndex = baseLayers.findIndex(\n (layer) => layer.path === path.dirname(discoveredBase.filePath)\n );\n\n if (matchedBaseIndex === -1) {\n throw new Error(`Resolved base is outside configured base paths: ${discoveredBase.filePath}`);\n }\n\n const parsedBase = parseDocument(discoveredBase.content, discoveredBase.filePath);\n const nextVisited = new Set(visited);\n nextVisited.add(discoveredBase.filePath);\n const nestedBase = parsedBase.extends\n ? await resolveBaseChain({\n name: getBaseName(discoveredBase.filePath),\n baseLayers: baseLayers.slice(matchedBaseIndex + 1),\n options,\n optional: false,\n visited: nextVisited,\n depth: depth + 1\n })\n : undefined;\n\n return {\n layers: [\n {\n source: baseLayers[matchedBaseIndex].source,\n data: parsedBase.data\n },\n ...(nestedBase?.layers ?? [])\n ],\n chain: [discoveredBase.filePath, ...(nestedBase?.chain ?? [])]\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 = 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 = 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(\n high: string | undefined,\n low: string\n): 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(\n prompt: string,\n replacement: string\n): string {\n return prompt.replace(YIELD_TOKEN, replacement);\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 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 || (autoExtend === true && !parsedDocument.hasExtendsField);\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", "import type {\n ConfigMergeMutation,\n ConfigPruneMutation,\n ConfigTransformMutation,\n ConfigObject,\n ValueResolver,\n MutationOptions\n} from \"../types.js\";\n\nexport interface MergeOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Value to merge into the config file */\n value: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\" | \"yaml\";\n /** Optional prune by prefix before merging (TOML) */\n pruneByPrefix?: Record<string, string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface PruneOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Shape to prune from the config file */\n shape: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\" | \"yaml\";\n /** Optional guard - only prune if predicate returns true */\n onlyIf?: (doc: ConfigObject, ctx: MutationOptions) => boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface TransformOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\" | \"yaml\";\n /** Transform function - receives parsed content, returns transformed content */\n transform: (\n content: ConfigObject,\n ctx: MutationOptions\n ) => { content: ConfigObject | null; changed: boolean };\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction merge(options: MergeOptions): ConfigMergeMutation {\n return {\n kind: \"configMerge\",\n target: options.target,\n value: options.value,\n format: options.format,\n pruneByPrefix: options.pruneByPrefix,\n label: options.label\n };\n}\n\nfunction prune(options: PruneOptions): ConfigPruneMutation {\n return {\n kind: \"configPrune\",\n target: options.target,\n shape: options.shape,\n format: options.format,\n onlyIf: options.onlyIf,\n label: options.label\n };\n}\n\nfunction transform(options: TransformOptions): ConfigTransformMutation {\n return {\n kind: \"configTransform\",\n target: options.target,\n format: options.format,\n transform: options.transform,\n label: options.label\n };\n}\n\nexport const configMutation = {\n merge,\n prune,\n transform\n};\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import type {\n TemplateWriteMutation,\n TemplateMergeTomlMutation,\n TemplateMergeJsonMutation,\n ConfigObject,\n ValueResolver\n} from \"../types.js\";\n\nexport interface WriteOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeTomlOptions {\n /** Target TOML file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface MergeJsonOptions {\n /** Target JSON file path (must start with ~) */\n target: ValueResolver<string>;\n /** Template ID to load via template loader */\n templateId: string;\n /** Context to pass to Mustache.render() */\n context?: ValueResolver<ConfigObject>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction write(options: WriteOptions): TemplateWriteMutation {\n return {\n kind: \"templateWrite\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeToml(options: MergeTomlOptions): TemplateMergeTomlMutation {\n return {\n kind: \"templateMergeToml\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nfunction mergeJson(options: MergeJsonOptions): TemplateMergeJsonMutation {\n return {\n kind: \"templateMergeJson\",\n target: options.target,\n templateId: options.templateId,\n context: options.context,\n label: options.label\n };\n}\n\nexport const templateMutation = {\n write,\n mergeToml,\n mergeJson\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\nimport { yamlFormat } from \"./yaml.js\";\n\nexport type FormatName = \"json\" | \"toml\" | \"yaml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat,\n yaml: yamlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\nexport { yamlFormat } from \"./yaml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import type { FileSystem } from \"@poe-code/config-mutations\";\nimport { readMergedDocument } from \"./store.js\";\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 = asRecord(document.memory);\n const cache = asRecord(memory?.cache);\n const mcp = asRecord(memory?.mcp);\n const query = asRecord(memory?.query);\n\n return {\n root: readString(memory?.root),\n ingestAgent: readString(memory?.ingestAgent),\n ingestTimeoutMs: readNumber(memory?.ingestTimeoutMs) ?? 300_000,\n cacheEnabled: readBoolean(cache?.enabled) ?? true,\n mcpWritesAllowed: readBoolean(mcp?.allowWrites) ?? false,\n defaultQueryBudget: readNumber(query?.defaultBudgetTokens) ?? 4_096\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n", "import path from \"node:path\";\nimport { pathExists, type FileSystem } from \"@poe-code/config-mutations\";\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 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 if (await pathExists(fs, targetPath)) {\n return \"already-exists\";\n }\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\n return \"created\";\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 values[key] = value;\n entries.push(` ${field.env} = ${String(value)}`);\n }\n\n return { entries, values };\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.isNaN(parsed) ? undefined : parsed;\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 * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n MEMORY_INDEX_RELPATH,\n MEMORY_LOG_RELPATH,\n MEMORY_PAGES_DIR_RELPATH\n} from \"./paths.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport async function initMemory(root: MemoryRoot): Promise<void> {\n await fs.mkdir(path.join(root, MEMORY_PAGES_DIR_RELPATH), { recursive: true });\n await writeFileIfMissing(path.join(root, MEMORY_INDEX_RELPATH), \"# Memory index\\n\");\n await writeFileIfMissing(path.join(root, MEMORY_LOG_RELPATH), \"\");\n}\n\nasync function writeFileIfMissing(filePath: string, content: string): Promise<void> {\n try {\n await fs.writeFile(filePath, content, { encoding: \"utf8\", flag: \"wx\" });\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport {\n assertSafeRelPath,\n MEMORY_CACHE_DIR_RELPATH,\n MEMORY_LOCK_RELPATH,\n MEMORY_PAGES_DIR_RELPATH\n} from \"./paths.js\";\nimport type { MemoryPage, MemoryRoot } from \"./types.js\";\n\nexport async function listPages(root: MemoryRoot): Promise<MemoryPage[]> {\n const relPaths = await collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH);\n const pages = await Promise.all(relPaths.map(async (relPath) => readPage(root, relPath)));\n return pages.sort((left, right) => left.relPath.localeCompare(right.relPath));\n}\n\nexport async function readPage(root: MemoryRoot, relPath: string): Promise<MemoryPage> {\n const normalizedRelPath = assertMarkdownRelPath(relPath);\n const absPath = path.join(root, normalizedRelPath);\n const [content, stat] = await Promise.all([fs.readFile(absPath, \"utf8\"), fs.stat(absPath)]);\n\n try {\n const parsed = parseFrontmatter(content);\n return {\n relPath: normalizedRelPath,\n frontmatter: parsed.frontmatter,\n body: parsed.body,\n bytes: Buffer.byteLength(content),\n mtimeMs: stat.mtimeMs\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to parse frontmatter for \"${normalizedRelPath}\": ${message}`);\n return {\n relPath: normalizedRelPath,\n frontmatter: {},\n body: content,\n bytes: Buffer.byteLength(content),\n mtimeMs: stat.mtimeMs\n };\n }\n}\n\nexport async function collectMarkdownRelPaths(\n root: MemoryRoot,\n startRelPath = \"\"\n): Promise<string[]> {\n const relPaths: string[] = [];\n await collectMarkdownRelPathsInto(root, startRelPath, relPaths);\n return relPaths.sort((left, right) => left.localeCompare(right));\n}\n\nasync function collectMarkdownRelPathsInto(\n root: MemoryRoot,\n currentRelPath: string,\n relPaths: string[]\n): Promise<void> {\n const absPath = path.join(root, currentRelPath);\n\n let entryNames: string[];\n try {\n entryNames = await fs.readdir(absPath);\n } catch (error) {\n if (isMissing(error)) {\n return;\n }\n\n throw error;\n }\n\n for (const entryName of entryNames.sort((left, right) => left.localeCompare(right))) {\n const entryRelPath =\n currentRelPath.length === 0 ? entryName : path.posix.join(currentRelPath, entryName);\n const entryAbsPath = path.join(root, entryRelPath);\n const entryStat = await fs.stat(entryAbsPath);\n\n if (entryStat.isDirectory()) {\n if (entryName === MEMORY_CACHE_DIR_RELPATH) {\n continue;\n }\n\n await collectMarkdownRelPathsInto(root, entryRelPath, relPaths);\n continue;\n }\n\n if (!entryStat.isFile()) {\n continue;\n }\n\n if (!isMarkdownPath(entryRelPath)) {\n if (entryName === MEMORY_LOCK_RELPATH) {\n continue;\n }\n\n console.warn(`Skipping non-markdown memory file \"${entryRelPath}\".`);\n continue;\n }\n\n relPaths.push(entryRelPath);\n }\n}\n\nfunction assertMarkdownRelPath(relPath: string): string {\n const normalizedRelPath = assertSafeRelPath(relPath);\n if (!isMarkdownPath(normalizedRelPath)) {\n throw new Error(`Expected a markdown path, received \"${relPath}\".`);\n }\n\n return normalizedRelPath;\n}\n\nfunction isMarkdownPath(relPath: string): boolean {\n return path.posix.extname(relPath).toLowerCase() === \".md\";\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n", "import { parse, stringify } from \"yaml\";\nimport type { PageFrontmatter, SourceRef } from \"./types.js\";\n\nexport interface ParsedFrontmatter {\n frontmatter: PageFrontmatter;\n body: string;\n}\n\nexport function parseFrontmatter(markdown: string): ParsedFrontmatter {\n const content = markdown.startsWith(\"\\uFEFF\") ? markdown.slice(1) : markdown;\n const openingLineBreak = readOpeningLineBreak(content);\n if (openingLineBreak === undefined) {\n return {\n frontmatter: {},\n body: markdown\n };\n }\n\n const frontmatterStart = 3 + openingLineBreak.length;\n const closingFenceIndex = findClosingFence(content, frontmatterStart);\n const yamlBlock = content.slice(frontmatterStart, closingFenceIndex);\n const bodyStart = closingFenceIndex + 4;\n\n return {\n frontmatter: parsePageFrontmatter(parseYamlFrontmatter(yamlBlock)),\n body: readBody(content, bodyStart)\n };\n}\n\nexport function serializeFrontmatter(frontmatter: PageFrontmatter, body: string): string {\n const serialized = {\n ...(frontmatter.name === undefined ? {} : { name: frontmatter.name }),\n ...(frontmatter.description === undefined ? {} : { description: frontmatter.description }),\n ...(frontmatter.lastTouchedAt === undefined\n ? {}\n : { last_touched_at: frontmatter.lastTouchedAt }),\n ...(frontmatter.sources === undefined || frontmatter.sources.length === 0\n ? {}\n : { sources: frontmatter.sources.map((source) => serializeSourceRef(source)) })\n };\n\n if (Object.keys(serialized).length === 0) {\n return body;\n }\n\n return `---\\n${stringify(serialized).trimEnd()}\\n---\\n${body}`;\n}\n\nexport function parseSourceRef(serialized: string): SourceRef {\n const [rawPath, rawAnchor] = serialized.split(\"#\", 2);\n const normalizedPath = rawPath?.trim();\n if (normalizedPath === undefined || normalizedPath.length === 0) {\n throw new Error(`Invalid source ref \"${serialized}\".`);\n }\n\n if (rawAnchor === undefined) {\n return { path: normalizedPath };\n }\n\n const singleLineMatch = /^L(\\d+)$/.exec(rawAnchor);\n if (singleLineMatch !== null) {\n const startLine = Number.parseInt(singleLineMatch[1], 10);\n assertValidLineNumber(startLine, serialized);\n return {\n path: normalizedPath,\n startLine\n };\n }\n\n const rangeMatch = /^L(\\d+)-L?(\\d+)$/.exec(rawAnchor);\n if (rangeMatch !== null) {\n const startLine = Number.parseInt(rangeMatch[1], 10);\n const endLine = Number.parseInt(rangeMatch[2], 10);\n assertValidLineNumber(startLine, serialized);\n assertValidLineNumber(endLine, serialized);\n if (endLine < startLine) {\n throw new Error(`Invalid source ref \"${serialized}\": line range is reversed.`);\n }\n\n return {\n path: normalizedPath,\n startLine,\n endLine\n };\n }\n\n throw new Error(`Invalid source ref \"${serialized}\".`);\n}\n\nexport function serializeSourceRef(source: SourceRef): string {\n if (source.path.trim().length === 0) {\n throw new Error(\"Source path cannot be empty.\");\n }\n\n if (source.startLine === undefined) {\n if (source.endLine !== undefined) {\n throw new Error(\"Source endLine requires startLine.\");\n }\n\n return source.path;\n }\n\n assertValidLineNumber(source.startLine, source.path);\n if (source.endLine === undefined) {\n return `${source.path}#L${source.startLine}`;\n }\n\n assertValidLineNumber(source.endLine, source.path);\n if (source.endLine < source.startLine) {\n throw new Error(`Invalid source ref \"${source.path}\": line range is reversed.`);\n }\n\n return `${source.path}#L${source.startLine}-L${source.endLine}`;\n}\n\nfunction readOpeningLineBreak(markdown: string): \"\\n\" | \"\\r\\n\" | undefined {\n if (!markdown.startsWith(\"---\")) {\n return undefined;\n }\n\n const nextCharacter = markdown[3];\n if (nextCharacter === \"\\n\") {\n return \"\\n\";\n }\n\n if (nextCharacter === \"\\r\" && markdown[4] === \"\\n\") {\n return \"\\r\\n\";\n }\n\n return nextCharacter === undefined ? \"\\n\" : undefined;\n}\n\nfunction findClosingFence(markdown: string, searchFrom: number): number {\n let currentIndex = searchFrom - 1;\n\n while (currentIndex < markdown.length) {\n const candidateIndex = markdown.indexOf(\"\\n---\", currentIndex);\n if (candidateIndex === -1) {\n throw new Error(\"Missing YAML frontmatter end delimiter (---).\");\n }\n\n const fenceEnd = candidateIndex + 4;\n const nextCharacter = markdown[fenceEnd];\n if (nextCharacter === \"\\n\" || nextCharacter === undefined) {\n return candidateIndex;\n }\n\n if (nextCharacter === \"\\r\" && markdown[fenceEnd + 1] === \"\\n\") {\n return candidateIndex;\n }\n\n currentIndex = fenceEnd;\n }\n\n throw new Error(\"Missing YAML frontmatter end delimiter (---).\");\n}\n\nfunction readBody(markdown: string, bodyStart: number): string {\n const nextCharacter = markdown[bodyStart];\n if (nextCharacter === \"\\n\") {\n return markdown.slice(bodyStart + 1);\n }\n\n if (nextCharacter === \"\\r\" && markdown[bodyStart + 1] === \"\\n\") {\n return markdown.slice(bodyStart + 2);\n }\n\n return markdown.slice(bodyStart);\n}\n\nfunction parseYamlFrontmatter(yamlBlock: string): Record<string, unknown> {\n const normalizedYamlBlock = yamlBlock.includes(\"\\r\")\n ? yamlBlock.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\")\n : yamlBlock;\n\n let parsed: unknown;\n try {\n parsed = parse(normalizedYamlBlock);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error\";\n throw new Error(`Invalid YAML frontmatter: ${message}`);\n }\n\n if (parsed === null) {\n return {};\n }\n\n if (!isRecord(parsed)) {\n throw new Error(\"YAML frontmatter must parse to an object.\");\n }\n\n return parsed;\n}\n\nfunction parsePageFrontmatter(value: Record<string, unknown>): PageFrontmatter {\n const name = readOptionalString(value.name, \"name\");\n const description = readOptionalString(value.description, \"description\");\n const lastTouchedAt = readOptionalString(\n value.last_touched_at ?? value.lastTouchedAt,\n \"last_touched_at\"\n );\n const sources = parseSources(value.sources);\n\n return {\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(lastTouchedAt === undefined ? {} : { lastTouchedAt }),\n ...(sources === undefined ? {} : { sources })\n };\n}\n\nfunction parseSources(value: unknown): SourceRef[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n throw new Error('Invalid \"sources\" frontmatter. Expected an array.');\n }\n\n return value.map((item) => {\n if (typeof item === \"string\") {\n return parseSourceRef(item);\n }\n\n if (!isRecord(item)) {\n throw new Error('Invalid \"sources\" frontmatter. Expected each source to be a string or object.');\n }\n\n const path = readRequiredString(item.path, \"sources[].path\");\n const startLine = readOptionalPositiveInteger(item.startLine, \"sources[].startLine\");\n const endLine = readOptionalPositiveInteger(item.endLine, \"sources[].endLine\");\n return parseSourceRef(serializeSourceRef({ path, ...(startLine === undefined ? {} : { startLine }), ...(endLine === undefined ? {} : { endLine }) }));\n });\n}\n\nfunction readOptionalString(value: unknown, field: string): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`Invalid \"${field}\" frontmatter. Expected a string.`);\n }\n\n return value;\n}\n\nfunction readRequiredString(value: unknown, field: string): string {\n const parsed = readOptionalString(value, field);\n if (parsed === undefined) {\n throw new Error(`Invalid \"${field}\" frontmatter. Expected a string.`);\n }\n\n return parsed;\n}\n\nfunction readOptionalPositiveInteger(value: unknown, field: string): number | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isInteger(value) || value <= 0) {\n throw new Error(`Invalid \"${field}\" frontmatter. Expected a positive integer.`);\n }\n\n return value;\n}\n\nfunction assertValidLineNumber(line: number, value: string): void {\n if (!Number.isInteger(line) || line <= 0) {\n throw new Error(`Invalid source ref \"${value}\": line numbers must be positive integers.`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { collectMarkdownRelPaths } from \"./pages.js\";\nimport type { MemoryRoot, SearchHit } from \"./types.js\";\n\nexport async function searchMemory(root: MemoryRoot, query: string): Promise<SearchHit[]> {\n const normalizedQuery = query.trim();\n if (normalizedQuery.length === 0) {\n throw new Error(\"Search query cannot be empty.\");\n }\n\n const relPaths = await collectMarkdownRelPaths(root);\n const hits: SearchHit[] = [];\n\n for (const relPath of relPaths) {\n const content = await fs.readFile(path.join(root, relPath), \"utf8\");\n if (content.length === 0) {\n continue;\n }\n\n const lines = content.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\");\n for (const [index, line] of lines.entries()) {\n if (!line.includes(normalizedQuery)) {\n continue;\n }\n\n hits.push({\n relPath,\n lineNumber: index + 1,\n line\n });\n }\n }\n\n return hits;\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MEMORY_PAGES_DIR_RELPATH } from \"./paths.js\";\nimport { collectMarkdownRelPaths } from \"./pages.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport async function statusOf(root: MemoryRoot): Promise<{\n pageCount: number;\n totalBytes: number;\n lastWriteAt: string | null;\n initialized: boolean;\n}> {\n if (!(await pathExists(root))) {\n return {\n pageCount: 0,\n totalBytes: 0,\n lastWriteAt: null,\n initialized: false\n };\n }\n\n const [pageRelPaths, markdownRelPaths] = await Promise.all([\n collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH),\n collectMarkdownRelPaths(root)\n ]);\n\n let totalBytes = 0;\n let lastWriteAtMs = Number.NEGATIVE_INFINITY;\n\n for (const relPath of markdownRelPaths) {\n const stat = await fs.stat(path.join(root, relPath));\n totalBytes += stat.size;\n lastWriteAtMs = Math.max(lastWriteAtMs, stat.mtimeMs);\n }\n\n return {\n pageCount: pageRelPaths.length,\n totalBytes,\n lastWriteAt: Number.isFinite(lastWriteAtMs) ? new Date(lastWriteAtMs).toISOString() : null,\n initialized: true\n };\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.stat(targetPath);\n return true;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return false;\n }\n\n throw error;\n }\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseFrontmatter } from \"./frontmatter.js\";\nimport type { MemoryDiff, MemoryRoot, PageFrontmatter } from \"./types.js\";\nimport { writePage } from \"./write.js\";\n\nexport type EditPageOptions = {\n reason: string;\n launchEditor: (filePath: string) => Promise<void>;\n};\n\nexport type EditPageResult = {\n changed: boolean;\n diff?: MemoryDiff;\n};\n\nexport async function editPage(\n root: MemoryRoot,\n relPath: string,\n opts: EditPageOptions\n): Promise<EditPageResult> {\n const pagePath = path.join(root, relPath);\n const original = await readIfPresent(pagePath);\n const tempRoot = path.join(root, \".tmp\");\n await fs.mkdir(tempRoot, { recursive: true });\n const tempDir = await fs.mkdtemp(path.join(tempRoot, \"poe-code-memory-edit-\"));\n const tempPath = path.join(tempDir, path.basename(relPath));\n\n try {\n await fs.writeFile(tempPath, original ?? \"\", \"utf8\");\n await opts.launchEditor(tempPath);\n const edited = await fs.readFile(tempPath, \"utf8\");\n\n if (edited === (original ?? \"\")) {\n return { changed: false };\n }\n\n const parsed = parseFrontmatter(edited);\n const diff = await writePage(root, relPath, parsed.body, {\n frontmatter: parsed.frontmatter as PageFrontmatter,\n reason: opts.reason\n });\n\n return {\n changed: true,\n diff\n };\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\nasync function readIfPresent(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseFrontmatter, serializeFrontmatter } from \"./frontmatter.js\";\nimport { initMemory } from \"./init.js\";\nimport { withLock } from \"./lock.js\";\nimport { assertSafeRelPath, MEMORY_LOCK_RELPATH, MEMORY_PAGES_DIR_RELPATH } from \"./paths.js\";\nimport { reconcile, snapshot } from \"./reconcile.js\";\nimport type { MemoryDiff, MemoryRoot, PageFrontmatter } from \"./types.js\";\n\nexport async function writePage(\n root: MemoryRoot,\n relPath: string,\n body: string,\n opts: { frontmatter?: PageFrontmatter; reason: string }\n): Promise<MemoryDiff> {\n const pageRelPath = assertPageRelPath(relPath);\n\n return withLock(root, async () => {\n const before = await snapshot(root);\n await fs.mkdir(path.dirname(path.join(root, pageRelPath)), { recursive: true });\n await fs.writeFile(\n path.join(root, pageRelPath),\n serializeFrontmatter(opts.frontmatter ?? {}, body),\n \"utf8\"\n );\n return reconcile(root, before, \"update\", opts.reason);\n });\n}\n\nexport async function appendToPage(\n root: MemoryRoot,\n relPath: string,\n content: string,\n opts: { reason: string }\n): Promise<MemoryDiff> {\n const pageRelPath = assertPageRelPath(relPath);\n\n return withLock(root, async () => {\n const before = await snapshot(root);\n const pagePath = path.join(root, pageRelPath);\n await fs.mkdir(path.dirname(pagePath), { recursive: true });\n\n const existing = await readMarkdownIfPresent(pagePath);\n const parsed = existing === undefined ? { frontmatter: {}, body: \"\" } : parseFrontmatter(existing);\n\n await fs.writeFile(\n pagePath,\n serializeFrontmatter(parsed.frontmatter, `${parsed.body}${content}`),\n \"utf8\"\n );\n\n return reconcile(root, before, \"update\", opts.reason);\n });\n}\n\nexport async function clearMemory(root: MemoryRoot): Promise<void> {\n await withLock(root, async () => {\n await removeChildren(root);\n await initMemory(root);\n });\n}\n\nasync function removeChildren(directoryPath: string): Promise<void> {\n for (const entryName of await fs.readdir(directoryPath)) {\n if (entryName === MEMORY_LOCK_RELPATH) {\n continue;\n }\n\n const entryPath = path.join(directoryPath, entryName);\n const stat = await fs.stat(entryPath);\n\n if (stat.isDirectory()) {\n await removeDirectory(entryPath);\n continue;\n }\n\n if (stat.isFile()) {\n await fs.unlink(entryPath);\n }\n }\n}\n\nasync function removeDirectory(directoryPath: string): Promise<void> {\n await removeChildren(directoryPath);\n await fs.rmdir(directoryPath);\n}\n\nfunction assertPageRelPath(relPath: string): string {\n const normalizedRelPath = assertSafeRelPath(relPath);\n if (\n !normalizedRelPath.startsWith(`${MEMORY_PAGES_DIR_RELPATH}/`) ||\n path.posix.extname(normalizedRelPath).toLowerCase() !== \".md\"\n ) {\n throw new Error(`Expected a markdown page path under \"${MEMORY_PAGES_DIR_RELPATH}/\".`);\n }\n\n return normalizedRelPath;\n}\n\nasync function readMarkdownIfPresent(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MEMORY_LOCK_RELPATH } from \"./paths.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\ninterface LockFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n unlink(path: string): Promise<void>;\n writeFile(\n path: string,\n data: string,\n options?: {\n encoding?: BufferEncoding;\n flag?: string;\n }\n ): Promise<void>;\n}\n\nexport interface LockOptions {\n fs?: LockFileSystem;\n isPidRunning?: (pid: number) => boolean;\n maxTimeoutMs?: number;\n minTimeoutMs?: number;\n pid?: number;\n retries?: number;\n}\n\nfunction createDefaultFs(): LockFileSystem {\n return {\n readFile: (filePath, encoding) => fsPromises.readFile(filePath, encoding),\n unlink: fsPromises.unlink,\n writeFile: (filePath, data, options) => fsPromises.writeFile(filePath, data, options)\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction lockDelay(attempt: number, minTimeoutMs: number, maxTimeoutMs: number): number {\n return Math.min(maxTimeoutMs, minTimeoutMs * Math.pow(2, attempt));\n}\n\nfunction parsePid(input: string): number | undefined {\n const value = input.trim();\n if (value.length === 0) {\n return undefined;\n }\n\n for (const char of value) {\n if (char < \"0\" || char > \"9\") {\n return undefined;\n }\n }\n\n const pid = Number.parseInt(value, 10);\n return Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;\n}\n\nfunction isPidRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !hasErrorCode(error, \"ESRCH\");\n }\n}\n\nasync function removeLockFile(fs: LockFileSystem, lockPath: string): Promise<void> {\n try {\n await fs.unlink(lockPath);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n}\n\nasync function readLockPid(fs: LockFileSystem, lockPath: string): Promise<number | undefined | null> {\n try {\n return parsePid(await fs.readFile(lockPath, \"utf8\"));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return null;\n }\n\n throw error;\n }\n}\n\nexport async function withLock<TResult>(\n root: MemoryRoot,\n run: () => Promise<TResult> | TResult,\n options: LockOptions = {}\n): Promise<TResult> {\n const fs = options.fs ?? createDefaultFs();\n const lockPath = path.join(root, MEMORY_LOCK_RELPATH);\n const pid = options.pid ?? process.pid;\n const retries = options.retries ?? 20;\n const minTimeoutMs = options.minTimeoutMs ?? 25;\n const maxTimeoutMs = options.maxTimeoutMs ?? 250;\n const pidIsRunning = options.isPidRunning ?? isPidRunning;\n\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n await fs.writeFile(lockPath, `${pid}\\n`, { encoding: \"utf8\", flag: \"wx\" });\n\n try {\n return await run();\n } finally {\n await removeLockFile(fs, lockPath);\n }\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n\n const existingPid = await readLockPid(fs, lockPath);\n if (existingPid === null) {\n continue;\n }\n\n if (existingPid === undefined || !pidIsRunning(existingPid)) {\n await removeLockFile(fs, lockPath);\n continue;\n }\n\n if (attempt < retries) {\n await sleep(lockDelay(attempt, minTimeoutMs, maxTimeoutMs));\n }\n }\n\n throw new Error(`Failed to acquire memory lock at \"${lockPath}\".`);\n}\n", "import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseClaims } from \"./confidence.js\";\nimport { parseFrontmatter, serializeFrontmatter, serializeSourceRef } from \"./frontmatter.js\";\nimport { initMemory } from \"./init.js\";\nimport { collectMarkdownRelPaths, listPages } from \"./pages.js\";\nimport { MEMORY_INDEX_RELPATH, MEMORY_LOG_RELPATH, MEMORY_PAGES_DIR_RELPATH } from \"./paths.js\";\nimport type {\n LogVerb,\n MemoryDiff,\n MemoryRoot,\n MemorySnapshot,\n PageFrontmatter,\n SourceRef\n} from \"./types.js\";\n\nexport async function snapshot(root: MemoryRoot): Promise<MemorySnapshot> {\n const pages = Object.fromEntries(\n await Promise.all(\n (await collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH)).map(async (relPath) => [\n relPath,\n hashContent(await fs.readFile(path.join(root, relPath), \"utf8\"))\n ])\n )\n );\n\n return { pages };\n}\n\nexport async function reconcile(\n root: MemoryRoot,\n before: MemorySnapshot,\n _verb: LogVerb,\n detail: string\n): Promise<MemoryDiff> {\n await initMemory(root);\n\n const timestamp = new Date().toISOString();\n const currentPages = await Promise.all(\n (await collectMarkdownRelPaths(root, MEMORY_PAGES_DIR_RELPATH)).map(async (relPath) => {\n const absPath = path.join(root, relPath);\n const markdown = await fs.readFile(absPath, \"utf8\");\n const parsed = parsePageMarkdown(relPath, markdown);\n const normalizedFrontmatter = withDenormalizedSources(parsed.frontmatter, parsed.body);\n const normalizedMarkdown = serializeFrontmatter(normalizedFrontmatter, parsed.body);\n const changed = before.pages[relPath] !== hashContent(normalizedMarkdown);\n const nextMarkdown = changed\n ? serializeFrontmatter(\n {\n ...normalizedFrontmatter,\n lastTouchedAt: timestamp\n },\n parsed.body\n )\n : normalizedMarkdown;\n\n return {\n relPath,\n changed,\n currentMarkdown: markdown,\n nextMarkdown\n };\n })\n );\n\n await Promise.all(\n currentPages\n .filter((page) => page.currentMarkdown !== page.nextMarkdown)\n .map((page) => fs.writeFile(path.join(root, page.relPath), page.nextMarkdown, \"utf8\"))\n );\n\n const diff = diffSnapshots(before, await snapshot(root));\n await writeIndex(root);\n await appendLogEntries(root, diff, detail, timestamp);\n return diff;\n}\n\nexport function renderIndex(entries: Array<{ relPath: string; description: string }>): string {\n if (entries.length === 0) {\n return \"# Memory index\\n\";\n }\n\n return [\n \"# Memory index\",\n \"\",\n ...entries.map(({ relPath, description }) => {\n const pageName = relPath.slice(`${MEMORY_PAGES_DIR_RELPATH}/`.length).replace(/\\.md$/i, \"\");\n\n return description.length === 0\n ? `- [${pageName}](${relPath})`\n : `- [${pageName}](${relPath}) \u2014 ${description}`;\n }),\n \"\"\n ].join(\"\\n\");\n}\n\nexport async function appendLogEntries(\n root: MemoryRoot,\n diff: MemoryDiff,\n detail: string,\n timestamp = new Date().toISOString()\n): Promise<void> {\n const entries = [\n ...diff.updated.map((relPath) => formatLogLine(timestamp, \"update\", relPath, detail)),\n ...diff.deleted.map((relPath) => formatLogLine(timestamp, \"delete\", relPath, detail)),\n ...diff.created.map((relPath) => formatLogLine(timestamp, \"create\", relPath, detail))\n ];\n\n if (entries.length === 0) {\n return;\n }\n\n const logPath = path.join(root, MEMORY_LOG_RELPATH);\n const existing = await fs.readFile(logPath, \"utf8\");\n const separator = existing.length === 0 || existing.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await fs.writeFile(logPath, `${existing}${separator}${entries.join(\"\\n\")}\\n`, \"utf8\");\n}\n\nexport function denormalizeSources(markdown: string): SourceRef[] {\n const seen = new Map<string, SourceRef>();\n\n for (const claim of parseClaims(parsePageMarkdown(\"inline-memory-page\", markdown).body)) {\n const source = \"source\" in claim.tag ? claim.tag.source : undefined;\n if (source === undefined) {\n continue;\n }\n\n seen.set(serializeSourceRef(source), source);\n }\n\n return Array.from(seen.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, source]) => source);\n}\n\nasync function writeIndex(root: MemoryRoot): Promise<void> {\n const index = renderIndex(\n (await listPages(root)).map((page) => ({\n relPath: page.relPath,\n description: page.frontmatter.description ?? \"\"\n }))\n );\n\n await fs.writeFile(path.join(root, MEMORY_INDEX_RELPATH), index, \"utf8\");\n}\n\nfunction parsePageMarkdown(\n relPath: string,\n markdown: string\n): {\n frontmatter: PageFrontmatter;\n body: string;\n} {\n try {\n return parseFrontmatter(markdown);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to parse frontmatter for \"${relPath}\": ${message}`);\n return {\n frontmatter: {},\n body: markdown\n };\n }\n}\n\nfunction withDenormalizedSources(frontmatter: PageFrontmatter, body: string): PageFrontmatter {\n const sources = denormalizeSources(body);\n return {\n ...frontmatter,\n ...(sources.length === 0 ? { sources: undefined } : { sources })\n };\n}\n\nfunction diffSnapshots(before: MemorySnapshot, after: MemorySnapshot): MemoryDiff {\n const created = Object.keys(after.pages)\n .filter((relPath) => before.pages[relPath] === undefined)\n .sort((left, right) => left.localeCompare(right));\n const updated = Object.keys(after.pages)\n .filter(\n (relPath) =>\n before.pages[relPath] !== undefined && before.pages[relPath] !== after.pages[relPath]\n )\n .sort((left, right) => left.localeCompare(right));\n const deleted = Object.keys(before.pages)\n .filter((relPath) => after.pages[relPath] === undefined)\n .sort((left, right) => left.localeCompare(right));\n\n return {\n created,\n updated,\n deleted\n };\n}\n\nfunction formatLogLine(\n timestamp: string,\n verb: \"create\" | \"update\" | \"delete\",\n relPath: string,\n detail: string\n): string {\n return `- ${timestamp} **${verb}** \\`${relPath}\\` \u2014 ${detail}`;\n}\n\nfunction hashContent(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n", "import { parseSourceRef, serializeSourceRef } from \"./frontmatter.js\";\nimport type { ConfidenceTag, ConfidenceVerb, TaggedClaim } from \"./types.js\";\n\nexport const TAG_RE = /^<!--\\s*memory:(?<verb>extracted|inferred|ambiguous)(?<rest>[^>]*?)-->\\s*$/;\n\nexport function parseClaims(body: string): TaggedClaim[] {\n const lines = normalizeNewlines(body).split(\"\\n\");\n const claims: TaggedClaim[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n const tagLine = lines[index] ?? \"\";\n const match = TAG_RE.exec(tagLine);\n if (match?.groups?.verb === undefined) {\n continue;\n }\n\n const claimLines: string[] = [];\n for (let claimIndex = index + 1; claimIndex < lines.length; claimIndex += 1) {\n const line = lines[claimIndex] ?? \"\";\n if (line.trim().length === 0 || TAG_RE.test(line)) {\n break;\n }\n\n claimLines.push(line);\n }\n\n if (claimLines.length === 0) {\n throw new Error(`Confidence tag on line ${index + 1} is not followed by a claim paragraph.`);\n }\n\n claims.push({\n tag: parseTag(match.groups.verb as ConfidenceVerb, match.groups.rest ?? \"\"),\n body: claimLines.join(\"\\n\"),\n lineNumber: index + 1\n });\n }\n\n return claims;\n}\n\nexport function serializeTag(tag: ConfidenceTag): string {\n switch (tag.verb) {\n case \"extracted\":\n return serializeComment(\"extracted\", {\n source: serializeSourceRef(tag.source),\n ...(tag.note === undefined ? {} : { note: tag.note })\n });\n case \"inferred\":\n return serializeComment(\"inferred\", {\n confidence: serializeConfidence(tag.confidence),\n ...(tag.source === undefined ? {} : { source: serializeSourceRef(tag.source) }),\n ...(tag.note === undefined ? {} : { note: tag.note })\n });\n case \"ambiguous\": {\n const reason = tag.reason.trim();\n if (reason.length === 0) {\n throw new Error('Ambiguous confidence tags require a non-empty \"reason\".');\n }\n\n return serializeComment(\"ambiguous\", { reason });\n }\n }\n}\n\ntype TagAttributes = Record<string, string>;\n\nfunction parseTag(verb: ConfidenceVerb, rest: string): ConfidenceTag {\n const attrs = parseAttributes(rest);\n\n switch (verb) {\n case \"extracted\": {\n const source = attrs.source;\n if (source === undefined) {\n throw new Error('Extracted confidence tags require \"source\".');\n }\n\n assertOnlyKeys(attrs, verb, [\"source\", \"note\"]);\n return {\n verb,\n source: parseSourceRef(source),\n ...(attrs.note === undefined ? {} : { note: attrs.note })\n };\n }\n case \"inferred\": {\n const confidence = attrs.confidence;\n if (confidence === undefined) {\n throw new Error('Inferred confidence tags require \"confidence\".');\n }\n\n assertOnlyKeys(attrs, verb, [\"confidence\", \"source\", \"note\"]);\n return {\n verb,\n confidence: parseConfidence(confidence),\n ...(attrs.source === undefined ? {} : { source: parseSourceRef(attrs.source) }),\n ...(attrs.note === undefined ? {} : { note: attrs.note })\n };\n }\n case \"ambiguous\": {\n const reason = attrs.reason?.trim();\n if (reason === undefined || reason.length === 0) {\n throw new Error('Ambiguous confidence tags require a non-empty \"reason\".');\n }\n\n assertOnlyKeys(attrs, verb, [\"reason\"]);\n return {\n verb,\n reason\n };\n }\n }\n}\n\nfunction parseAttributes(rest: string): TagAttributes {\n const attrs: TagAttributes = {};\n let index = 0;\n\n while (index < rest.length) {\n index = skipWhitespace(rest, index);\n if (index >= rest.length) {\n break;\n }\n\n const keyStart = index;\n while (index < rest.length && isKeyCharacter(rest[index] ?? \"\")) {\n index += 1;\n }\n\n if (keyStart === index) {\n throw new Error(`Invalid confidence tag attribute near \"${rest.slice(index).trim()}\".`);\n }\n\n const key = rest.slice(keyStart, index);\n if ((rest[index] ?? \"\") !== \"=\") {\n throw new Error(`Invalid confidence tag attribute \"${key}\".`);\n }\n\n index += 1;\n const { value, nextIndex } = readAttributeValue(rest, index);\n if (attrs[key] !== undefined) {\n throw new Error(`Duplicate confidence tag attribute \"${key}\".`);\n }\n\n attrs[key] = value;\n index = nextIndex;\n }\n\n return attrs;\n}\n\nfunction readAttributeValue(input: string, index: number): { value: string; nextIndex: number } {\n if (index >= input.length) {\n throw new Error(\"Missing confidence tag attribute value.\");\n }\n\n if (input[index] === '\"') {\n const endQuote = findClosingQuote(input, index + 1);\n return {\n value: JSON.parse(input.slice(index, endQuote + 1)) as string,\n nextIndex: endQuote + 1\n };\n }\n\n let nextIndex = index;\n while (nextIndex < input.length && !isWhitespace(input[nextIndex] ?? \"\")) {\n nextIndex += 1;\n }\n\n if (nextIndex === index) {\n throw new Error(\"Missing confidence tag attribute value.\");\n }\n\n return {\n value: input.slice(index, nextIndex),\n nextIndex\n };\n}\n\nfunction findClosingQuote(input: string, start: number): number {\n let escaped = false;\n\n for (let index = start; index < input.length; index += 1) {\n const char = input[index] ?? \"\";\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n return index;\n }\n }\n\n throw new Error(\"Unterminated quoted confidence tag attribute.\");\n}\n\nfunction assertOnlyKeys(\n attrs: TagAttributes,\n verb: ConfidenceVerb,\n allowedKeys: string[]\n): void {\n const disallowedKeys = Object.keys(attrs).filter((key) => !allowedKeys.includes(key));\n if (disallowedKeys.length > 0) {\n throw new Error(\n `${verb} confidence tags do not support: ${disallowedKeys.map((key) => `\"${key}\"`).join(\", \")}.`\n );\n }\n}\n\nfunction parseConfidence(rawConfidence: string): number {\n const confidence = Number(rawConfidence);\n if (!Number.isFinite(confidence) || confidence <= 0 || confidence > 1) {\n throw new Error(`Invalid confidence value \"${rawConfidence}\". Expected a number in (0, 1].`);\n }\n\n return confidence;\n}\n\nfunction serializeComment(verb: ConfidenceVerb, attrs: TagAttributes): string {\n const parts = Object.entries(attrs).map(([key, value]) => `${key}=${serializeAttributeValue(key, value)}`);\n return `<!-- memory:${verb}${parts.length === 0 ? \"\" : ` ${parts.join(\" \")}`} -->`;\n}\n\nfunction serializeAttributeValue(key: string, value: string): string {\n return key === \"source\" || key === \"confidence\" ? value : JSON.stringify(value);\n}\n\nfunction serializeConfidence(confidence: number): string {\n return String(parseConfidence(String(confidence)));\n}\n\nfunction normalizeNewlines(value: string): string {\n return value.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\");\n}\n\nfunction skipWhitespace(input: string, index: number): number {\n while (index < input.length && isWhitespace(input[index] ?? \"\")) {\n index += 1;\n }\n\n return index;\n}\n\nfunction isKeyCharacter(char: string): boolean {\n return (char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\");\n}\n\nfunction isWhitespace(char: string): boolean {\n return char === \" \" || char === \"\\t\" || char === \"\\n\" || char === \"\\r\";\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseClaims } from \"./confidence.js\";\nimport { serializeSourceRef } from \"./frontmatter.js\";\nimport { listPages } from \"./pages.js\";\nimport type { MemoryRoot, SourceRef } from \"./types.js\";\n\nconst DEFAULT_MIN_INFERRED_CONFIDENCE = 0.3;\nconst DEFAULT_REJECT_UNTAGGED = false;\nconst DEFAULT_UNTAGGED_BODY_THRESHOLD_CHARS = 200;\n\nexport type AuditClaimsOptions = {\n minInferredConfidence?: number;\n rejectUntagged?: boolean;\n untaggedBodyThresholdChars?: number;\n};\n\nexport type PageAudit = {\n page: string;\n issues: string[];\n};\n\ntype SourceFileMeta =\n | { exists: false; absPath: string }\n | { exists: true; absPath: string; lineCount: number };\n\nexport async function auditClaims(\n root: MemoryRoot,\n repoRoot: string,\n options: AuditClaimsOptions = {}\n): Promise<PageAudit[]> {\n const minInferredConfidence =\n options.minInferredConfidence ?? DEFAULT_MIN_INFERRED_CONFIDENCE;\n const rejectUntagged = options.rejectUntagged ?? DEFAULT_REJECT_UNTAGGED;\n const untaggedBodyThresholdChars =\n options.untaggedBodyThresholdChars ?? DEFAULT_UNTAGGED_BODY_THRESHOLD_CHARS;\n const sourceCache = new Map<string, Promise<SourceFileMeta>>();\n\n const pages = await listPages(root);\n const audits: PageAudit[] = [];\n\n for (const page of pages) {\n const issues: string[] = [];\n let claims;\n\n try {\n claims = parseClaims(page.body);\n } catch (error) {\n issues.push(formatError(error));\n audits.push({ page: page.relPath, issues });\n continue;\n }\n\n if (rejectUntagged && claims.length === 0 && page.body.trim().length > untaggedBodyThresholdChars) {\n issues.push(\n `Page has a long untagged body (>${untaggedBodyThresholdChars} chars) with no memory:* tags.`\n );\n }\n\n const inlineSources = new Set<string>();\n\n for (const claim of claims) {\n if (claim.tag.verb === \"inferred\" && claim.tag.confidence < minInferredConfidence) {\n issues.push(\n `Claim on line ${claim.lineNumber} uses inferred confidence=${claim.tag.confidence}, below the minimum ${minInferredConfidence}.`\n );\n }\n\n const source = \"source\" in claim.tag ? claim.tag.source : undefined;\n if (source === undefined) {\n continue;\n }\n\n const serializedSource = serializeSourceRef(source);\n inlineSources.add(serializedSource);\n\n const sourceIssue = await auditSourceRef(source, claim.lineNumber, repoRoot, sourceCache);\n if (sourceIssue !== undefined) {\n issues.push(sourceIssue);\n }\n }\n\n issues.push(...auditFrontmatterSources(page.frontmatter.sources ?? [], inlineSources));\n\n if (issues.length > 0) {\n audits.push({ page: page.relPath, issues });\n }\n }\n\n return audits;\n}\n\nasync function auditSourceRef(\n source: SourceRef,\n claimLineNumber: number,\n repoRoot: string,\n sourceCache: Map<string, Promise<SourceFileMeta>>\n): Promise<string | undefined> {\n if (isUrlLike(source.path)) {\n return undefined;\n }\n\n if (path.isAbsolute(source.path)) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", but source paths must be repo-relative or URLs.`;\n }\n\n const absPath = path.resolve(repoRoot, source.path);\n if (!isWithinRoot(repoRoot, absPath)) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", which resolves outside the repo root.`;\n }\n\n const meta = await readSourceFile(absPath, sourceCache);\n if (!meta.exists) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", resolved to \"${meta.absPath}\", but the file does not exist.`;\n }\n\n const lastReferencedLine = source.endLine ?? source.startLine;\n if (lastReferencedLine !== undefined && lastReferencedLine > meta.lineCount) {\n return `Claim on line ${claimLineNumber} cites \"${serializeSourceRef(source)}\", but current EOF ${meta.lineCount} is before the referenced line.`;\n }\n\n return undefined;\n}\n\nfunction auditFrontmatterSources(frontmatterSources: SourceRef[], inlineSources: Set<string>): string[] {\n const serializedFrontmatterSources = new Set(frontmatterSources.map((source) => serializeSourceRef(source)));\n const issues: string[] = [];\n\n const missingSources = [...inlineSources].filter((source) => !serializedFrontmatterSources.has(source));\n for (const source of missingSources.sort((left, right) => left.localeCompare(right))) {\n issues.push(`Page frontmatter sources are missing \"${source}\" from inline tags.`);\n }\n\n const staleSources = [...serializedFrontmatterSources].filter((source) => !inlineSources.has(source));\n for (const source of staleSources.sort((left, right) => left.localeCompare(right))) {\n issues.push(`Page frontmatter sources contain stale entry \"${source}\" not found in inline tags.`);\n }\n\n return issues;\n}\n\nfunction readSourceFile(\n absPath: string,\n sourceCache: Map<string, Promise<SourceFileMeta>>\n): Promise<SourceFileMeta> {\n const cached = sourceCache.get(absPath);\n if (cached !== undefined) {\n return cached;\n }\n\n const pending = fs\n .readFile(absPath, \"utf8\")\n .then((content) => ({\n exists: true as const,\n absPath,\n lineCount: countLines(content)\n }))\n .catch((error: unknown) => {\n if (isMissing(error)) {\n return {\n exists: false as const,\n absPath\n };\n }\n\n throw error;\n });\n\n sourceCache.set(absPath, pending);\n return pending;\n}\n\nfunction countLines(content: string): number {\n if (content.length === 0) {\n return 0;\n }\n\n const normalized = content.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\");\n const trimmed = normalized.endsWith(\"\\n\") ? normalized.slice(0, -1) : normalized;\n return trimmed.length === 0 ? 0 : trimmed.split(\"\\n\").length;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isMissing(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isUrlLike(value: string): boolean {\n return /^[a-z][a-z\\d+.-]*:\\/\\//i.test(value);\n}\n\nfunction isWithinRoot(root: string, absPath: string): boolean {\n const relative = path.relative(root, absPath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n", "import { createHash } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MEMORY_CACHE_DIR_RELPATH, MEMORY_INGEST_CACHE_DIR_RELPATH } from \"./paths.js\";\nimport type { IngestCacheEntry, IngestCacheKey, MemoryRoot } from \"./types.js\";\n\nexport function computeIngestKey(input: {\n sourceBytes: Buffer;\n indexMdBytes: Buffer;\n promptTemplateVersion: string;\n agentId: string;\n}): IngestCacheKey {\n const hash = createHash(\"sha256\");\n hash.update(input.sourceBytes);\n hash.update(\"\\0\");\n hash.update(input.indexMdBytes);\n hash.update(\"\\0\");\n hash.update(input.promptTemplateVersion);\n hash.update(\"\\0\");\n hash.update(input.agentId);\n return hash.digest(\"hex\");\n}\n\nexport async function readCacheEntry(\n root: MemoryRoot,\n key: IngestCacheKey\n): Promise<IngestCacheEntry | null> {\n const cachePath = path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH, `${key}.json`);\n\n let raw: string;\n try {\n raw = await fs.readFile(cachePath, \"utf8\");\n } catch (error) {\n if (isMissing(error)) {\n return null;\n }\n\n throw error;\n }\n\n try {\n return parseCacheEntry(JSON.parse(raw), key);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Ignoring ingest cache entry \"${key}\": ${message}`);\n return null;\n }\n}\n\nexport async function writeCacheEntry(root: MemoryRoot, entry: IngestCacheEntry): Promise<void> {\n await fs.mkdir(path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH), { recursive: true });\n await fs.writeFile(\n path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH, `${entry.key}.json`),\n `${JSON.stringify(entry)}\\n`,\n \"utf8\"\n );\n}\n\nexport async function clearCache(\n root: MemoryRoot,\n opts: { olderThanMs?: number } = {}\n): Promise<{ removed: number }> {\n const ingestDir = path.join(root, MEMORY_INGEST_CACHE_DIR_RELPATH);\n const cacheDir = path.join(root, MEMORY_CACHE_DIR_RELPATH);\n const fileNames = await readCacheFileNames(ingestDir);\n\n if (fileNames.length === 0) {\n if (opts.olderThanMs === undefined) {\n await fs.rm(cacheDir, { recursive: true, force: true });\n }\n\n return { removed: 0 };\n }\n\n if (opts.olderThanMs === undefined) {\n await fs.rm(cacheDir, { recursive: true, force: true });\n return { removed: fileNames.length };\n }\n\n const cutoff = Date.now() - opts.olderThanMs;\n let removed = 0;\n\n for (const fileName of fileNames) {\n const key = fileName.slice(0, -\".json\".length);\n const entry = await readCacheEntry(root, key);\n\n if (entry === null || Date.parse(entry.ingestedAt) > cutoff) {\n continue;\n }\n\n await fs.rm(path.join(ingestDir, fileName), { force: true });\n removed += 1;\n }\n\n await removeEmptyDirectory(ingestDir);\n await removeEmptyDirectory(cacheDir);\n\n return { removed };\n}\n\nfunction parseCacheEntry(value: unknown, _key: string): IngestCacheEntry {\n const object = expectRecord(value);\n\n return {\n key: expectString(object.key, \"key\"),\n ingestedAt: expectString(object.ingestedAt, \"ingestedAt\"),\n sourceLabel: expectString(object.sourceLabel, \"sourceLabel\"),\n diff: parseMemoryDiff(object.diff),\n exitCode: expectNumber(object.exitCode, \"exitCode\"),\n durationMs: expectNumber(object.durationMs, \"durationMs\"),\n memoryTokens: expectNumber(object.memoryTokens, \"memoryTokens\"),\n sourceTokens: expectNumber(object.sourceTokens, \"sourceTokens\"),\n promptTemplateVersion: expectString(object.promptTemplateVersion, \"promptTemplateVersion\"),\n agentId: expectString(object.agentId, \"agentId\")\n };\n}\n\nfunction parseMemoryDiff(value: unknown): IngestCacheEntry[\"diff\"] {\n const object = expectRecord(value);\n\n return {\n created: expectStringArray(object.created, \"diff.created\"),\n updated: expectStringArray(object.updated, \"diff.updated\"),\n deleted: expectStringArray(object.deleted, \"diff.deleted\")\n };\n}\n\nfunction expectRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Expected a JSON object.\");\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction expectString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`Expected string at \"${field}\".`);\n }\n\n return value;\n}\n\nfunction expectNumber(value: unknown, field: string): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new Error(`Expected number at \"${field}\".`);\n }\n\n return value;\n}\n\nfunction expectStringArray(value: unknown, field: string): string[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\")) {\n throw new Error(`Expected string[] at \"${field}\".`);\n }\n\n return value;\n}\n\nasync function readCacheFileNames(ingestDir: string): Promise<string[]> {\n try {\n return (await fs.readdir(ingestDir))\n .filter((fileName) => path.posix.extname(fileName).toLowerCase() === \".json\")\n .sort((left, right) => left.localeCompare(right));\n } catch (error) {\n if (isMissing(error)) {\n return [];\n }\n\n throw error;\n }\n}\n\nasync function removeEmptyDirectory(directoryPath: string): Promise<void> {\n try {\n const remainingEntries = await fs.readdir(directoryPath);\n if (remainingEntries.length === 0) {\n await fs.rmdir(directoryPath);\n }\n } catch (error) {\n if (isMissing(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n", "import parseDuration from \"parse-duration\";\nimport { clearCache } from \"./cache.js\";\nimport type { MemoryRoot } from \"./types.js\";\n\nexport async function runMemoryCacheStatus(): Promise<void> {\n console.log(\"cache status not implemented yet\");\n}\n\nexport async function runMemoryCacheClear(input: {\n root: MemoryRoot;\n olderThan?: string;\n yes?: boolean;\n}): Promise<{ removed: number }> {\n if (!input.yes) {\n throw new Error(\"Refusing to clear cache without --yes.\");\n }\n\n const olderThanMs = parseOlderThan(input.olderThan);\n const result = await clearCache(input.root, olderThanMs === undefined ? {} : { olderThanMs });\n console.log(`removed ${result.removed} cache ${result.removed === 1 ? \"entry\" : \"entries\"}`);\n return result;\n}\n\nfunction parseOlderThan(value: string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const duration = parseDuration(value);\n if (duration === null || Number.isNaN(duration) || duration < 0) {\n throw new Error(`Invalid duration for --older-than: \"${value}\".`);\n }\n\n return duration;\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"@poe-code/agent-spawn\";\nimport { cacheEnabled, configuredTimeout, resolveAgent } from \"@poe-code/poe-code-config\";\nimport { computeIngestKey, readCacheEntry, writeCacheEntry } from \"./cache.js\";\nimport { MEMORY_INDEX_RELPATH } from \"./paths.js\";\nimport { reconcile, snapshot } from \"./reconcile.js\";\nimport { computeTokenStats } from \"./tokens.js\";\nimport type { MemoryConfigOptions } from \"@poe-code/poe-code-config\";\nimport type { IngestOptions, IngestResult, MemoryRoot } from \"./types.js\";\n\nexport const INGEST_PROMPT_VERSION = \"v1\";\n\nexport type IngestRunners = {\n computeIngestKey?: typeof computeIngestKey;\n readCacheEntry?: typeof readCacheEntry;\n writeCacheEntry?: typeof writeCacheEntry;\n computeTokenStats?: typeof computeTokenStats;\n snapshot?: typeof snapshot;\n reconcile?: typeof reconcile;\n};\n\ntype ResolvedIngestRunners = {\n computeIngestKey: typeof computeIngestKey;\n readCacheEntry: typeof readCacheEntry;\n writeCacheEntry: typeof writeCacheEntry;\n computeTokenStats: typeof computeTokenStats;\n snapshot: typeof snapshot;\n reconcile: typeof reconcile;\n};\n\nfunction resolveRunners(overrides?: IngestRunners): ResolvedIngestRunners {\n return {\n computeIngestKey: overrides?.computeIngestKey ?? computeIngestKey,\n readCacheEntry: overrides?.readCacheEntry ?? readCacheEntry,\n writeCacheEntry: overrides?.writeCacheEntry ?? writeCacheEntry,\n computeTokenStats: overrides?.computeTokenStats ?? computeTokenStats,\n snapshot: overrides?.snapshot ?? snapshot,\n reconcile: overrides?.reconcile ?? reconcile\n };\n}\n\nexport async function ingest(\n root: MemoryRoot,\n opts: IngestOptions,\n runners?: IngestRunners\n): Promise<IngestResult> {\n const resolved = resolveRunners(runners);\n const source = await materializeSource(opts.source);\n const indexMdBytes = await fs.readFile(path.join(root, MEMORY_INDEX_RELPATH));\n const configOptions = {\n fs: fs as MemoryConfigOptions[\"fs\"],\n filePath: path.join(inferRepoRoot(root), \"poe-code.json\")\n } satisfies MemoryConfigOptions;\n const agentId =\n (await resolveAgent(configOptions, opts.agent ?? null)) ?? opts.agent ?? \"claude-code\";\n const key = resolved.computeIngestKey({\n sourceBytes: source.bytes,\n indexMdBytes,\n promptTemplateVersion: INGEST_PROMPT_VERSION,\n agentId\n });\n\n if (!opts.force && (await cacheEnabled(configOptions))) {\n const hit = await resolved.readCacheEntry(root, key);\n if (hit !== null) {\n return {\n diff: { created: [], updated: [], deleted: [] },\n exitCode: 0,\n durationMs: 0,\n cacheHit: true,\n tokens: await resolved.computeTokenStats(root)\n };\n }\n }\n\n const prompt = buildIngestPrompt(root, source.label, source.text);\n if (opts.dryRun) {\n console.log(prompt);\n return {\n diff: { created: [], updated: [], deleted: [] },\n exitCode: 0,\n durationMs: 0,\n cacheHit: false,\n tokens: await resolved.computeTokenStats(root)\n };\n }\n\n const before = await resolved.snapshot(root);\n\n let exitCode = 1;\n let durationMs = 0;\n let timeoutError: Error | undefined;\n\n try {\n const result = await runWithTimeout(\n spawn(agentId, { prompt }),\n opts.timeoutMs ?? (await configuredTimeout(configOptions))\n );\n exitCode = result.exitCode;\n durationMs = result.durationMs ?? 0;\n } catch (error) {\n timeoutError = error instanceof Error ? error : new Error(String(error));\n }\n\n const diff = await resolved.reconcile(root, before, \"ingest\", opts.reason ?? `ingest ${source.label}`);\n const tokens = await resolved.computeTokenStats(root);\n\n if (timeoutError !== undefined) {\n throw timeoutError;\n }\n\n if (!opts.noCacheWrite && (await cacheEnabled(configOptions)) && exitCode === 0) {\n await resolved.writeCacheEntry(root, {\n key,\n ingestedAt: new Date().toISOString(),\n sourceLabel: source.label,\n diff,\n exitCode,\n durationMs,\n memoryTokens: tokens.memoryTokens,\n sourceTokens: tokens.sourceTokens,\n promptTemplateVersion: INGEST_PROMPT_VERSION,\n agentId\n });\n }\n\n return { diff, exitCode, durationMs, cacheHit: false, tokens };\n}\n\nfunction buildIngestPrompt(root: string, sourceLabel: string, sourceText: string): string {\n return [\n `Prompt version: ${INGEST_PROMPT_VERSION}`,\n `Memory root: ${root}`,\n `Source: ${sourceLabel}`,\n \"Update memory pages under pages/ only. Do not edit INDEX.md directly.\",\n \"Add confidence tags to non-trivial claims.\",\n \"\",\n sourceText\n ].join(\"\\n\");\n}\n\nasync function materializeSource(source: IngestOptions[\"source\"]): Promise<{\n label: string;\n bytes: Buffer;\n text: string;\n}> {\n if (source.kind === \"file\") {\n const bytes = await fs.readFile(source.absPath);\n return {\n label: source.absPath,\n bytes,\n text: bytes.toString(\"utf8\")\n };\n }\n\n throw new Error(\"URL ingest not implemented yet.\");\n}\n\nfunction inferRepoRoot(root: string): string {\n return path.resolve(root, \"..\", \"..\");\n}\n\nasync function runWithTimeout<T extends { exitCode: number; durationMs?: number }>(\n promise: Promise<T>,\n timeoutMs: number\n): Promise<T> {\n return await new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`ingest timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n }\n );\n });\n}\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandRunnerResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface CommandRunnerOptions {\n cwd?: string;\n env?: Record<string, string | undefined>;\n stdin?: string | Buffer;\n}\n\nexport type CommandRunner = (\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n) => Promise<CommandRunnerResult>;\n\nexport function runCommand(\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n): Promise<CommandRunnerResult> {\n return new Promise((resolve) => {\n const hasStdin = options?.stdin != null;\n const child = spawn(command, args, {\n stdio: [hasStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n cwd: options?.cwd,\n env: options?.env\n ? {\n ...(process.env as Record<string, string | undefined>),\n ...options.env\n }\n : undefined\n });\n let stdout = \"\";\n let stderr = \"\";\n\n if (hasStdin && child.stdin) {\n child.stdin.on(\"error\", () => {});\n child.stdin.end(options!.stdin);\n }\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const exitCode =\n typeof error.code === \"number\"\n ? error.code\n : typeof error.errno === \"number\"\n ? error.errno\n : 127;\n const message =\n error instanceof Error ? error.message : String(error ?? \"error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n", "import type { AdapterType } from \"./adapters/index.js\";\n\nexport type SpawnMode = \"yolo\" | \"edit\" | \"read\";\n\nexport type SpawnModeConfig = string[] | { args?: string[]; env?: Record<string, string> };\n\nexport function resolveModeConfig(modeConfig: SpawnModeConfig): { args: string[]; env?: Record<string, string> } {\n if (Array.isArray(modeConfig)) {\n return { args: modeConfig };\n }\n return {\n args: modeConfig.args ?? [],\n env: modeConfig.env && Object.keys(modeConfig.env).length > 0 ? modeConfig.env : undefined\n };\n}\n\nexport interface McpSpawnServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n /**\n * Maximum time in seconds the agent should wait for a single tool call\n * to this MCP server before timing out. Omit to use the agent's default.\n */\n timeout?: number;\n}\n\nexport type McpSpawnConfig = Record<string, McpSpawnServer>;\n\nexport interface SpawnOptions {\n prompt: string;\n cwd?: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n useStdin?: boolean;\n interactive?: boolean;\n signal?: AbortSignal;\n tee?: {\n stdout?: { write(chunk: string): void };\n stderr?: { write(chunk: string): void };\n };\n /**\n * Kill the spawned process after this many milliseconds of inactivity (no stdout data).\n * Resets on every chunk of stdout/stderr received. Disabled when undefined.\n */\n activityTimeoutMs?: number;\n /**\n * Full path for the spawn log file. When set, stdout (and stderr for CLI spawns)\n * are appended to this file, and the absolute path is returned in `SpawnResult.logFile`.\n * Takes precedence over `logDir` + `logFileName`.\n */\n logPath?: string;\n /**\n * Directory for the spawn log file. When set together with `logFileName`, stdout\n * (and stderr for CLI spawns) are appended to `<logDir>/<logFileName>`, and the\n * absolute path is returned in `SpawnResult.logFile`.\n */\n logDir?: string;\n /** Overrides the auto-generated log filename. Must be used together with `logDir`. */\n logFileName?: string;\n}\n\nexport interface SpawnUsage {\n inputTokens: number;\n outputTokens: number;\n cachedTokens?: number;\n costUsd?: number;\n}\n\nexport interface SpawnResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs?: number;\n threadId?: string;\n usage?: SpawnUsage;\n logFile?: string;\n}\n\nexport interface AutonomousResult {\n summary?: string;\n log?: string;\n output?: string;\n stdout?: string;\n text?: string;\n logFile?: string;\n toolCalls?: unknown[];\n sessionResult?: {\n toolCalls?: unknown[];\n };\n}\n\nexport interface SpawnLogger {\n dryRun(message: string): void;\n}\n\nexport interface SpawnContext {\n dryRun?: boolean;\n logger?: SpawnLogger;\n homeDir?: string;\n}\n\nexport interface StdinMode {\n omitPrompt: boolean;\n extraArgs: string[];\n}\n\nexport interface InteractiveSpawnConfig {\n defaultArgs: string[];\n defaultArgsPosition?: \"beforePrompt\" | \"afterPrompt\";\n promptFlag?: string;\n}\n\nexport interface CliSpawnConfig {\n kind: \"cli\";\n agentId: string;\n adapter: AdapterType;\n promptFlag: string;\n defaultArgs: string[];\n defaultArgsPosition?: \"beforePrompt\" | \"afterPrompt\";\n modes: Record<SpawnMode, SpawnModeConfig>;\n stdinMode?: StdinMode;\n modelFlag?: string;\n /**\n * Controls whether the provider prefix is stripped from model IDs before passing to the CLI binary.\n *\n * When `true`: \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\", \"openai/gpt-5.2\" \u2192 \"gpt-5.2\"\n * When `false`: \"anthropic/claude-opus-4.6\" stays as-is, \"openai/gpt-5.2\" stays as-is\n *\n * Most CLI binaries only accept bare model IDs (e.g. `claude --model claude-opus-4.6`),\n * so they need `true`. OpenCode routes through poe and needs the full provider path, so it uses `false`.\n */\n modelStripProviderPrefix: boolean;\n /** Transform model ID before passing to CLI. Runs after provider prefix stripping (if enabled). */\n modelTransform?: (model: string) => string;\n /**\n * Transforms MCP server config into CLI args for this agent.\n * Presence of this function declares spawn-time MCP support.\n */\n mcpArgs?: (servers: McpSpawnConfig) => string[];\n /**\n * Transforms MCP server config into env vars for this agent.\n * Use instead of `mcpArgs` when the agent reads MCP config from the environment.\n */\n mcpEnv?: (servers: McpSpawnConfig) => Record<string, string>;\n /**\n * Controls where serialized MCP args are inserted relative to the command.\n *\n * - \"beforeCommand\": before the prompt/subcommand section (e.g. `codex -c ... exec \"prompt\"`)\n * - \"beforePrompt\": after `defaultArgs` but before the prompt/model section\n * - \"afterCommand\": after `defaultArgs` (default)\n */\n mcpArgsPosition?: \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\";\n /**\n * @deprecated Prefer `mcpArgsPosition`.\n * When true, MCP args are placed before the subcommand (e.g. `codex -c ... exec \"prompt\"`).\n * When false/undefined, they are placed after defaultArgs (e.g. `claude -p \"prompt\" --mcp-servers ...`).\n */\n mcpArgsBeforeCommand?: boolean;\n interactive?: InteractiveSpawnConfig;\n resumeCommand?: (threadId: string, cwd: string) => string[];\n}\n\nexport interface FileSpawnConfig {\n kind: \"file\";\n agentId: string;\n launchCommand?: string;\n launchArgs?: string[];\n}\n\nexport interface AcpSpawnConfig {\n kind: \"acp\";\n agentId: string;\n /** Args passed to the agent binary to start its ACP server (e.g. [\"acp\"]). */\n acpArgs: string[];\n /** Environment variables required by the ACP server process. */\n env?: Record<string, string>;\n /** Whether to skip the ACP authenticate step (workaround for servers that advertise but don't implement auth). */\n skipAuth?: boolean;\n /** MCP server env serializer, same as CliSpawnConfig. */\n mcpEnv?: (servers: McpSpawnConfig) => Record<string, string>;\n}\n\nexport type SpawnConfig = CliSpawnConfig | FileSpawnConfig | AcpSpawnConfig;\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type { McpSpawnConfig } from \"../types.js\";\n\ninterface JsonMcpServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n timeout?: number;\n}\n\nfunction toJsonMcpServers(servers: McpSpawnConfig): Record<string, JsonMcpServer> {\n const out: Record<string, JsonMcpServer> = {};\n\n for (const [name, server] of Object.entries(servers)) {\n const mapped: JsonMcpServer = { command: server.command };\n if (server.args && server.args.length > 0) {\n mapped.args = server.args;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n mapped.env = server.env;\n }\n if (server.timeout !== undefined) {\n mapped.timeout = server.timeout;\n }\n out[name] = mapped;\n }\n\n return out;\n}\n\nfunction toTomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toTomlArray(values: string[]): string {\n const serialized = values.map((value) => toTomlString(value));\n return `[${serialized.join(\", \")}]`;\n}\n\nfunction toTomlInlineTable(values: Record<string, string>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(values)) {\n parts.push(`${JSON.stringify(key)}=${toTomlString(value)}`);\n }\n return `{${parts.join(\", \")}}`;\n}\n\nexport function serializeJsonMcpArgs(servers: McpSpawnConfig): string[] {\n return [\"--mcp-config\", JSON.stringify({ mcpServers: toJsonMcpServers(servers) })];\n}\n\nexport function serializeOpenCodeMcpEnv(servers: McpSpawnConfig): Record<string, string> {\n const mcp: Record<\n string,\n { type: \"local\"; command: string[]; environment?: Record<string, string> }\n > = {};\n for (const [name, server] of Object.entries(servers)) {\n const entry: {\n type: \"local\";\n command: string[];\n environment?: Record<string, string>;\n } = { type: \"local\", command: [server.command, ...(server.args ?? [])] };\n if (server.env && Object.keys(server.env).length > 0) {\n entry.environment = server.env;\n }\n mcp[name] = entry;\n }\n return { OPENCODE_CONFIG_CONTENT: JSON.stringify({ mcp }) };\n}\n\nexport function serializeCodexMcpArgs(servers: McpSpawnConfig): string[] {\n const args: string[] = [];\n\n for (const [name, server] of Object.entries(servers)) {\n const prefix = `mcp_servers.${name}`;\n args.push(\"-c\", `${prefix}.command=${toTomlString(server.command)}`);\n\n if (server.args && server.args.length > 0) {\n args.push(\"-c\", `${prefix}.args=${toTomlArray(server.args)}`);\n }\n\n if (server.env && Object.keys(server.env).length > 0) {\n args.push(\"-c\", `${prefix}.env=${toTomlInlineTable(server.env)}`);\n }\n\n if (server.timeout !== undefined) {\n args.push(\"-c\", `${prefix}.timeout=${server.timeout}`);\n }\n }\n\n return args;\n}\n\nexport function serializeGooseMcpArgs(servers: McpSpawnConfig): string[] {\n return Object.values(servers).flatMap((server) => [\n \"--with-extension\",\n [server.command, ...(server.args ?? [])].join(\" \")\n ]);\n}\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const claudeCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"claude-code\",\n // ACP adapter support: yes (adapter: \"claude\")\n adapter: \"claude\",\n promptFlag: \"-p\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n modelTransform: (model) => model.replaceAll(\".\", \"-\"),\n defaultArgs: [\n \"--output-format\",\n \"stream-json\",\n \"--verbose\"\n ],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--dangerously-skip-permissions\"],\n edit: [\"--permission-mode\", \"acceptEdits\", \"--allowedTools\", \"Bash,Read,Write,Edit,Glob,Grep,NotebookEdit\"],\n read: [\"--permission-mode\", \"plan\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"text\"]\n },\n interactive: {\n defaultArgs: []\n },\n resumeCommand: (threadId) => [\"--resume\", threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeCodexMcpArgs } from \"./mcp.js\";\n\nexport const codexSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"codex\",\n // ACP adapter support: yes (adapter: \"codex\")\n adapter: \"codex\",\n promptFlag: \"exec\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--skip-git-repo-check\", \"--json\"],\n mcpArgs: serializeCodexMcpArgs,\n mcpArgsBeforeCommand: true,\n modes: {\n yolo: [\"-s\", \"danger-full-access\"],\n edit: [\"-s\", \"workspace-write\"],\n read: [\"-s\", \"read-only\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"-\"]\n },\n interactive: {\n defaultArgs: [\"-a\", \"never\"]\n },\n resumeCommand: (threadId, cwd) => [\"resume\", \"-C\", cwd, threadId]\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeOpenCodeMcpEnv } from \"./mcp.js\";\n\n/**\n * OpenCode JSON output format (empirically observed)\n *\n * OpenCode can emit \"raw JSON events\" when running a prompt via:\n * - `opencode run \"<prompt>\" --format json ...`\n *\n * Key observations (OpenCode CLI v1.1.47):\n * - Output is **NDJSON / line-delimited JSON**: one JSON object per stdout line.\n * - Each line is an event object with a top-level `type` string (NOT ACP's `{ event: ... }`).\n * - Common top-level fields:\n * - `type`: `\"step_start\" | \"text\" | \"tool_use\" | \"step_finish\" | ...`\n * - `timestamp`: number (ms since epoch)\n * - `sessionID`: string (e.g. `\"ses_...\"`)\n * - `part`: object with event-specific payload\n *\n * `text` events:\n * ```ts\n * {\n * type: \"text\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"text\",\n * messageID: \"msg_...\",\n * text: \"Hello ...\",\n * time: { start: 1770000000000, end: 1770000000000 }\n * }\n * }\n * ```\n *\n * Tool calls (`tool_use`):\n * - Represented as a single event with `part.type: \"tool\"` and `state.status`.\n * - `state.input` includes tool arguments; `state.output` is the tool result string.\n * ```ts\n * {\n * type: \"tool_use\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"tool\",\n * callID: \"call_...\",\n * tool: \"bash\",\n * state: {\n * status: \"completed\",\n * input: { command: \"echo hello\", description: \"...\" },\n * output: \"hello\\n\"\n * }\n * }\n * }\n * ```\n *\n * Step boundaries:\n * - `step_start` and `step_finish` wrap a single model/tool turn.\n * - `step_finish.part.tokens` contains token accounting:\n * `{ input, output, reasoning, cache: { read, write } }`\n *\n * Negative cases / gotchas:\n * - Some failures (e.g. invalid `--model` / unknown provider) can print a non-JSON stack trace\n * before any JSON events are emitted, even with `--format json`.\n * - If `--format json` is ever removed upstream, OpenCode will need a text-mode fallback\n * (no streaming event adapter).\n */\nexport const openCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"opencode\",\n // ACP adapter support: yes (adapter: \"opencode\").\n // OpenCode's `--format json` emits NDJSON events with `{ type, sessionID, part }`\n // (no `{ event, ... }` field), so it needs the OpenCode adapter (not \"native\").\n adapter: \"opencode\",\n promptFlag: \"run\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n modelTransform: (model) => {\n return model.startsWith(\"poe/\") ? model : `poe/${model}`;\n },\n defaultArgs: [\"--format\", \"json\"],\n modes: {\n yolo: [],\n edit: [],\n read: [\"--agent\", \"plan\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"--prompt\"\n },\n resumeCommand: (threadId, cwd) => [cwd, \"--session\", threadId],\n mcpEnv: serializeOpenCodeMcpEnv\n};\n\nexport const openCodeAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"opencode\",\n acpArgs: [\"acp\"],\n skipAuth: true,\n mcpEnv: serializeOpenCodeMcpEnv,\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const kimiSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"kimi\",\n // ACP adapter support: yes (adapter: \"kimi\").\n // Kimi's `--output-format stream-json` emits OpenAI-style `{ role, content }` JSON\n // (no `{ event, ... }` field), so it needs the Kimi adapter (not \"native\").\n adapter: \"kimi\",\n promptFlag: \"-p\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--print\", \"--output-format\", \"stream-json\"],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--yolo\"],\n edit: [],\n read: []\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"stream-json\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"-p\"\n },\n resumeCommand: (threadId, cwd) => [\"--session\", threadId, \"--work-dir\", cwd]\n};\n\nexport const kimiAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"kimi\",\n acpArgs: [\"acp\"],\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeGooseMcpArgs } from \"./mcp.js\";\n\nconst gooseFileSecretsEnv = { GOOSE_DISABLE_KEYRING: \"1\" };\n\nexport const gooseSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"goose\",\n adapter: \"native\",\n promptFlag: \"--text\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n defaultArgs: [\"run\", \"--output-format\", \"stream-json\"],\n defaultArgsPosition: \"beforePrompt\",\n mcpArgs: serializeGooseMcpArgs,\n mcpArgsPosition: \"beforePrompt\",\n modes: {\n yolo: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"auto\" } },\n edit: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"smart_approve\" } },\n read: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"chat\" } }\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--instructions\", \"-\"]\n },\n interactive: {\n defaultArgs: [\"session\"],\n defaultArgsPosition: \"beforePrompt\"\n },\n resumeCommand: () => [\"run\", \"--resume\", \"--text\", \"continue\"]\n};\n\nexport const gooseAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"goose\",\n acpArgs: [\"acp\"],\n env: gooseFileSecretsEnv,\n skipAuth: true\n};\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { AcpSpawnConfig, SpawnConfig } from \"../types.js\";\nimport { claudeCodeSpawnConfig } from \"./claude-code.js\";\nimport { codexSpawnConfig } from \"./codex.js\";\nimport { openCodeSpawnConfig, openCodeAcpSpawnConfig } from \"./opencode.js\";\nimport { kimiSpawnConfig, kimiAcpSpawnConfig } from \"./kimi.js\";\nimport { gooseSpawnConfig, gooseAcpSpawnConfig } from \"./goose.js\";\n\n// ACP adapter support (spawn streaming):\n// - Supported (has `adapter`): claude-code, codex, opencode, kimi, goose\nexport const allSpawnConfigs: readonly SpawnConfig[] = [\n claudeCodeSpawnConfig,\n codexSpawnConfig,\n openCodeSpawnConfig,\n kimiSpawnConfig,\n gooseSpawnConfig\n];\n\nconst lookup = new Map<string, SpawnConfig>();\n\nfor (const config of allSpawnConfigs) {\n lookup.set(config.agentId, config);\n}\n\nconst acpLookup = new Map<string, AcpSpawnConfig>();\nacpLookup.set(openCodeAcpSpawnConfig.agentId, openCodeAcpSpawnConfig);\nacpLookup.set(kimiAcpSpawnConfig.agentId, kimiAcpSpawnConfig);\nacpLookup.set(gooseAcpSpawnConfig.agentId, gooseAcpSpawnConfig);\n\nexport function getSpawnConfig(input: string): SpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return lookup.get(resolvedId);\n}\n\nexport function getAcpSpawnConfig(input: string): AcpSpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return acpLookup.get(resolvedId);\n}\n\nexport function supportsMcpAtSpawn(input: string): boolean {\n const config = getSpawnConfig(input);\n return (\n !!config &&\n config.kind === \"cli\" &&\n (typeof config.mcpArgs === \"function\" || typeof config.mcpEnv === \"function\")\n );\n}\n\nexport function listMcpSupportedAgents(): string[] {\n const supported: string[] = [];\n\n for (const config of allSpawnConfigs) {\n if (\n config.kind !== \"cli\" ||\n (typeof config.mcpArgs !== \"function\" && typeof config.mcpEnv !== \"function\")\n ) {\n continue;\n }\n supported.push(config.agentId);\n }\n\n return supported;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { mkdirSync, openSync, writeSync, closeSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport {\n resolveModeConfig,\n type CliSpawnConfig,\n type McpSpawnConfig,\n type SpawnContext,\n type SpawnMode,\n type SpawnOptions,\n type SpawnResult,\n type StdinMode\n} from \"./types.js\";\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createActivityTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `Agent spawn timed out after ${timeoutMs / 1000}s of inactivity`\n );\n error.name = \"ActivityTimeoutError\";\n return error;\n}\n\nexport function isActivityTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"ActivityTimeoutError\";\n}\n\nexport interface BuildSpawnArgsOptions {\n prompt: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n useStdin?: boolean;\n}\n\nexport interface BuildSpawnArgsResult {\n binaryName: string;\n args: string[];\n env?: Record<string, string>;\n}\n\nfunction resolveCliConfig(agentId: string) {\n const resolved = resolveConfig(agentId);\n\n if (!resolved.spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (resolved.spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n return {\n agentId: resolved.agentId,\n binaryName: resolved.binaryName,\n spawnConfig: resolved.spawnConfig\n };\n}\n\nfunction getDefaultArgsPosition(config: CliSpawnConfig): \"beforePrompt\" | \"afterPrompt\" {\n return config.defaultArgsPosition ?? \"afterPrompt\";\n}\n\nfunction getMcpArgsPosition(\n config: CliSpawnConfig\n): \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\" {\n if (config.mcpArgsPosition) {\n return config.mcpArgsPosition;\n }\n return config.mcpArgsBeforeCommand ? \"beforeCommand\" : \"afterCommand\";\n}\n\nfunction buildCliArgs(\n config: CliSpawnConfig,\n options: BuildSpawnArgsOptions,\n stdinMode?: StdinMode\n): { args: string[]; env?: Record<string, string> } {\n const mcpArgs = getMcpArgs(config, options.mcpServers);\n const defaultArgsPosition = getDefaultArgsPosition(config);\n const mcpArgsPosition = getMcpArgsPosition(config);\n\n const args: string[] = [];\n\n if (mcpArgsPosition === \"beforeCommand\") {\n args.push(...mcpArgs);\n }\n\n if (defaultArgsPosition === \"beforePrompt\") {\n args.push(...config.defaultArgs);\n }\n\n if (mcpArgsPosition === \"beforePrompt\") {\n args.push(...mcpArgs);\n }\n\n if (stdinMode) {\n args.push(\n config.promptFlag,\n ...(stdinMode.omitPrompt ? [] : [options.prompt]),\n ...stdinMode.extraArgs\n );\n } else {\n args.push(config.promptFlag, options.prompt);\n }\n\n if (options.model && config.modelFlag) {\n let model = config.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (config.modelTransform) model = config.modelTransform(model);\n args.push(config.modelFlag, model);\n }\n\n if (defaultArgsPosition === \"afterPrompt\") {\n args.push(...config.defaultArgs);\n }\n\n if (mcpArgsPosition === \"afterCommand\") {\n args.push(...mcpArgs);\n }\n\n const mode = resolveModeConfig(config.modes[options.mode ?? \"yolo\"]);\n args.push(...mode.args);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n return { args, env: mode.env };\n}\n\nexport function buildSpawnArgs(\n agentId: string,\n options: BuildSpawnArgsOptions\n): BuildSpawnArgsResult {\n const { binaryName, spawnConfig } = resolveCliConfig(agentId);\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n const result = buildCliArgs(spawnConfig, options, stdinMode);\n return { binaryName, args: result.args, env: result.env };\n}\n\nexport async function spawn(\n agentId: string,\n options: SpawnOptions,\n context?: SpawnContext\n): Promise<SpawnResult> {\n if (options.signal?.aborted) {\n throw createAbortError();\n }\n\n const { agentId: resolvedId, binaryName, spawnConfig } = resolveCliConfig(agentId);\n\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n\n const { args: spawnArgs, env: modeEnv } = buildCliArgs(spawnConfig, options, stdinMode);\n\n if (context?.dryRun) {\n const rendered = [binaryName, ...spawnArgs].join(\" \");\n context.logger?.dryRun(rendered);\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n }\n\n const logFilePath = resolveSpawnLogPath(options);\n const logFd = logFilePath ? openSpawnLog(logFilePath) : undefined;\n\n const child = spawnChildProcess(binaryName, spawnArgs, {\n cwd: options.cwd,\n stdio: [stdinMode ? \"pipe\" : \"inherit\", \"pipe\", \"pipe\"],\n ...(modeEnv ? { env: { ...process.env, ...modeEnv } } : {})\n });\n\n if (!child.stdout || !child.stderr) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdio pipes.`);\n }\n\n const stdoutStream = child.stdout;\n const stderrStream = child.stderr;\n\n if (stdinMode) {\n if (!child.stdin) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdin pipe.`);\n }\n child.stdin.setDefaultEncoding(\"utf8\");\n child.stdin.write(options.prompt);\n child.stdin.end();\n }\n\n return new Promise<SpawnResult>((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n let aborted = false;\n let timedOut = false;\n\n const onAbort = () => {\n aborted = true;\n child.kill(\"SIGTERM\");\n };\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n let activityTimer: ReturnType<typeof setTimeout> | undefined;\n const resetActivityTimer = options.activityTimeoutMs\n ? () => {\n if (activityTimer) clearTimeout(activityTimer);\n activityTimer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, options.activityTimeoutMs);\n }\n : undefined;\n\n resetActivityTimer?.();\n\n const cleanup = () => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (activityTimer) clearTimeout(activityTimer);\n };\n\n stdoutStream.setEncoding(\"utf8\");\n stdoutStream.on(\"data\", (chunk) => {\n stdout += chunk;\n resetActivityTimer?.();\n if (options.tee?.stdout) options.tee.stdout.write(chunk);\n appendSpawnLog(logFd, chunk);\n });\n\n stderrStream.setEncoding(\"utf8\");\n stderrStream.on(\"data\", (chunk) => {\n stderr += chunk;\n resetActivityTimer?.();\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n appendSpawnLog(logFd, chunk);\n });\n\n child.on(\"error\", (error) => {\n cleanup();\n closeSpawnLog(logFd);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n cleanup();\n closeSpawnLog(logFd);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n if (timedOut) {\n reject(createActivityTimeoutError(options.activityTimeoutMs!));\n return;\n }\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1,\n ...(logFilePath ? { logFile: logFilePath } : {})\n });\n });\n });\n}\n\nfunction resolveSpawnLogPath(options: SpawnOptions): string | undefined {\n if (options.logPath) {\n return options.logPath;\n }\n if (!options.logDir || !options.logFileName) {\n return undefined;\n }\n return path.join(options.logDir, options.logFileName);\n}\n\nfunction openSpawnLog(filePath: string): number | undefined {\n try {\n mkdirSync(path.dirname(filePath), { recursive: true });\n return openSync(filePath, \"a\");\n } catch {\n return undefined;\n }\n}\n\nfunction appendSpawnLog(fd: number | undefined, chunk: string): void {\n if (fd === undefined) return;\n try {\n writeSync(fd, chunk);\n } catch {\n // ignore \u2014 logging is best-effort\n }\n}\n\nfunction closeSpawnLog(fd: number | undefined): void {\n if (fd === undefined) return;\n try {\n closeSync(fd);\n } catch {\n // ignore\n }\n}\n", "import { allAgents, resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { SpawnConfig } from \"../types.js\";\nimport { getSpawnConfig } from \"./index.js\";\n\nexport interface ResolvedSpawnConfig {\n agentId: string;\n binaryName?: string;\n spawnConfig?: SpawnConfig;\n}\n\nexport function resolveConfig(agentId: string): ResolvedSpawnConfig {\n const resolvedAgentId = resolveAgentId(agentId);\n if (!resolvedAgentId) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const agentDefinition = allAgents.find((agent) => agent.id === resolvedAgentId);\n if (!agentDefinition) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const spawnConfig = getSpawnConfig(resolvedAgentId);\n const binaryName = agentDefinition.binaryName;\n\n return { agentId: resolvedAgentId, binaryName, spawnConfig };\n}\n", "import { listMcpSupportedAgents } from \"./configs/index.js\";\nimport type { CliSpawnConfig, McpSpawnConfig } from \"./types.js\";\n\nexport function hasMcpServers(servers?: McpSpawnConfig): servers is McpSpawnConfig {\n if (!servers) {\n return false;\n }\n return Object.keys(servers).length > 0;\n}\n\nexport function getMcpArgs(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): string[] {\n if (!hasMcpServers(servers)) {\n return [];\n }\n if (!config.mcpArgs && !config.mcpEnv) {\n throw new Error(formatUnsupportedMcpSpawnMessage(config.agentId));\n }\n if (!config.mcpArgs) {\n return [];\n }\n return config.mcpArgs(servers);\n}\n\nexport function getMcpEnv(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): Record<string, string> {\n if (!hasMcpServers(servers) || !config.mcpEnv) {\n return {};\n }\n return config.mcpEnv(servers);\n}\n\nexport function formatUnsupportedMcpSpawnMessage(agentId: string): string {\n const supported = listMcpSupportedAgents();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"(none)\";\n return (\n `Agent \"${agentId}\" does not support MCP servers at spawn time.\\n` +\n `Agents with spawn-time MCP support: ${supportedText}`\n );\n}\n", "/**\n * Strips the provider namespace prefix from a model identifier.\n * e.g., \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\"\n *\n * CLI binaries (claude, codex, opencode, kimi) only accept bare model IDs.\n * Passing a namespaced model like \"anthropic/claude-opus-4.6\" causes the\n * binary to fail with \"model not found\". This function MUST be called\n * before passing any model to a CLI binary via spawn args.\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n return slashIndex === -1 ? model : model.slice(slashIndex + 1);\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport { resolveModeConfig, type SpawnOptions, type SpawnResult } from \"./types.js\";\n\nexport async function spawnInteractive(\n agentId: string,\n options: SpawnOptions\n): Promise<SpawnResult> {\n const resolved = resolveConfig(agentId);\n const spawnConfig = resolved.spawnConfig;\n\n if (!spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n if (!spawnConfig.interactive) {\n throw new Error(`Agent \"${resolved.agentId}\" does not support interactive mode.`);\n }\n\n const { interactive } = spawnConfig;\n\n const args: string[] = [];\n\n if (interactive.defaultArgsPosition === \"beforePrompt\") {\n args.push(...interactive.defaultArgs);\n }\n\n if (options.prompt) {\n if (interactive.promptFlag) {\n args.push(interactive.promptFlag, options.prompt);\n } else {\n args.push(options.prompt);\n }\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n if (interactive.defaultArgsPosition !== \"beforePrompt\") {\n args.push(...interactive.defaultArgs);\n }\n args.push(...getMcpArgs(spawnConfig, options.mcpServers));\n\n const modeResolved = resolveModeConfig(spawnConfig.modes[options.mode ?? \"yolo\"]);\n args.push(...modeResolved.args);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const child = spawnChildProcess(resolved.binaryName, args, {\n cwd: options.cwd,\n stdio: \"inherit\",\n ...(modeResolved.env ? { env: { ...process.env, ...modeResolved.env } } : {})\n });\n\n return new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout: \"\",\n stderr: \"\",\n exitCode: code ?? 1\n });\n });\n });\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return getTheme().intro(content);\n },\n heading(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `## ${content}`;\n return getTheme().header(content);\n },\n section(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `**${content}**`;\n return typography.bold(content);\n },\n command(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().accent(content);\n },\n argument(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `<${content}>`;\n return getTheme().muted(content);\n },\n option(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.yellow(content);\n },\n example(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return getTheme().muted(content);\n },\n usageCommand(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `\\`${content}\\``;\n return chalk.green(content);\n },\n link(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}](${content})`;\n return getTheme().accent(content);\n },\n muted(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `*${content}*`;\n return getTheme().muted(content);\n },\n badge(content: string): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return content;\n if (format === \"markdown\") return `[${content}]`;\n return getTheme().badge(content);\n },\n selectLabel(label: string, detail?: string): string {\n if (!detail) {\n return label;\n }\n const format = resolveOutputFormat();\n if (format !== \"terminal\") {\n return `${label} \u2014 ${detail}`;\n }\n return `${label} ${typography.dim(\"\u2014\")} ${typography.dim(detail)}`;\n }\n} as const;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = (env.POE_CODE_THEME ?? env.POE_THEME)?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "import chalk from \"chalk\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (level === \"success\") {\n log.success(message);\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.info(message);\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import chalk from \"chalk\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = chalk.gray(\"\u2502\"),\n secondarySymbol = chalk.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: chalk.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { renderMarkdown } from \"../terminal-markdown/index.js\";\nimport { getAcpWriter } from \"./writer.js\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n getAcpWriter()(line);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nfunction formatCost(costUsd: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(costUsd);\n}\n\nexport function renderAgentMessage(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **agent:** ${text}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"agent_message\", text }));\n return;\n }\n\n const rendered = renderMarkdown(text).trimEnd();\n writeLine(`${AGENT_PREFIX}${rendered}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2192 ${kind}: ${title}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_start\", kind, title }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *\u2713 ${kind}*`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"tool_complete\", kind }));\n return;\n }\n\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- *thinking:* ${truncate(text, 80)}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"reasoning\", text }));\n return;\n }\n\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const format = resolveOutputFormat();\n const cached =\n typeof tokens.cached === \"number\" && tokens.cached > 0 ? ` (${tokens.cached} cached)` : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n cost = ` (${formatCost(tokens.costUsd)})`;\n }\n\n if (format === \"markdown\") {\n writeLine(`- **tokens:** ${tokens.input} in \u2192 ${tokens.output} out${cost}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(\n JSON.stringify({\n event: \"usage\",\n inputTokens: tokens.input,\n outputTokens: tokens.output,\n cachedTokens: tokens.cached ?? 0,\n costUsd: tokens.costUsd ?? 0\n })\n );\n return;\n }\n\n writeLine(\"\");\n writeLine(chalk.green(`\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`));\n}\n\nexport function renderError(message: string): void {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n writeLine(`- **error:** ${message}`);\n return;\n }\n\n if (format === \"json\") {\n writeLine(JSON.stringify({ event: \"error\", message }));\n return;\n }\n\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import chalk from \"chalk\";\nimport type { Cell, CellStyle, Rect } from \"./types.js\";\n\nconst EMPTY_CELL: Cell = { ch: \" \", style: {} };\n\nexport class ScreenBuffer {\n private _width: number;\n private _height: number;\n private _cells: Cell[];\n\n constructor(width: number, height: number) {\n this._width = normalizeSize(width);\n this._height = normalizeSize(height);\n this._cells = createCells(this._width, this._height);\n }\n\n get width(): number {\n return this._width;\n }\n\n get height(): number {\n return this._height;\n }\n\n put(x: number, y: number, text: string, style?: CellStyle): void {\n if (!this.isInBoundsY(y) || text.length === 0) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n let offset = 0;\n\n for (const ch of text) {\n const targetX = x + offset;\n offset += 1;\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n get(x: number, y: number): Cell {\n if (!this.isInBounds(x, y)) {\n return cloneCell(EMPTY_CELL);\n }\n\n return cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n\n clear(style?: CellStyle): void {\n this._cells = createCells(this._width, this._height, style);\n }\n\n clearRect(rect: Rect, style?: CellStyle): void {\n const startX = Math.max(0, rect.x);\n const startY = Math.max(0, rect.y);\n const endX = Math.min(this._width, rect.x + Math.max(0, rect.width));\n const endY = Math.min(this._height, rect.y + Math.max(0, rect.height));\n const normalizedStyle = normalizeStyle(style);\n\n for (let y = startY; y < endY; y += 1) {\n for (let x = startX; x < endX; x += 1) {\n this._cells[this.index(x, y)] = { ch: \" \", style: normalizedStyle };\n }\n }\n }\n\n resize(width: number, height: number): void {\n const nextWidth = normalizeSize(width);\n const nextHeight = normalizeSize(height);\n const nextCells = createCells(nextWidth, nextHeight);\n const copyWidth = Math.min(this._width, nextWidth);\n const copyHeight = Math.min(this._height, nextHeight);\n\n for (let y = 0; y < copyHeight; y += 1) {\n for (let x = 0; x < copyWidth; x += 1) {\n nextCells[(y * nextWidth) + x] = cloneCell(this._cells[this.index(x, y)] ?? EMPTY_CELL);\n }\n }\n\n this._width = nextWidth;\n this._height = nextHeight;\n this._cells = nextCells;\n }\n\n putInRect(rect: Rect, row: number, text: string, style?: CellStyle): void {\n if (row < 0 || row >= rect.height || text.length === 0 || rect.width <= 0) {\n return;\n }\n\n const y = rect.y + row;\n if (!this.isInBoundsY(y)) {\n return;\n }\n\n const normalizedStyle = normalizeStyle(style);\n const rectEndX = rect.x + rect.width;\n let offset = 0;\n\n for (const ch of text) {\n const targetX = rect.x + offset;\n offset += 1;\n\n if (targetX >= rectEndX) {\n break;\n }\n\n if (!this.isInBoundsX(targetX)) {\n continue;\n }\n\n this._cells[this.index(targetX, y)] = { ch, style: normalizedStyle };\n }\n }\n\n private index(x: number, y: number): number {\n return (y * this._width) + x;\n }\n\n private isInBounds(x: number, y: number): boolean {\n return this.isInBoundsX(x) && this.isInBoundsY(y);\n }\n\n private isInBoundsX(x: number): boolean {\n return x >= 0 && x < this._width;\n }\n\n private isInBoundsY(y: number): boolean {\n return y >= 0 && y < this._height;\n }\n}\n\nexport function diff(\n prev: ScreenBuffer,\n next: ScreenBuffer\n): Array<{ x: number; y: number; cell: Cell }> {\n const changes: Array<{ x: number; y: number; cell: Cell }> = [];\n const width = Math.max(prev.width, next.width);\n const height = Math.max(prev.height, next.height);\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const previousCell = prev.get(x, y);\n const nextCell = next.get(x, y);\n\n if (!cellsEqual(previousCell, nextCell)) {\n changes.push({ x, y, cell: nextCell });\n }\n }\n }\n\n return changes;\n}\n\nexport function cellToAnsi(cell: Cell): string {\n const style = cell.style ?? {};\n let painter = chalk;\n\n if (style.bold) {\n painter = painter.bold;\n }\n\n if (style.dim) {\n painter = painter.dim;\n }\n\n if (style.fg) {\n painter = applyForegroundColor(painter, style.fg);\n }\n\n if (style.bg) {\n painter = applyBackgroundColor(painter, style.bg);\n }\n\n return painter(cell.ch);\n}\n\nfunction createCells(width: number, height: number, style?: CellStyle): Cell[] {\n const normalizedStyle = normalizeStyle(style);\n return Array.from({ length: width * height }, () => ({ ch: \" \", style: normalizedStyle }));\n}\n\nfunction cloneCell(cell: Cell): Cell {\n return {\n ch: cell.ch,\n style: normalizeStyle(cell.style)\n };\n}\n\nfunction normalizeStyle(style?: CellStyle): CellStyle {\n const next: CellStyle = {};\n\n if (style?.fg !== undefined) {\n next.fg = style.fg;\n }\n\n if (style?.bg !== undefined) {\n next.bg = style.bg;\n }\n\n if (style?.bold !== undefined) {\n next.bold = style.bold;\n }\n\n if (style?.dim !== undefined) {\n next.dim = style.dim;\n }\n\n return next;\n}\n\nfunction normalizeSize(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction cellsEqual(left: Cell, right: Cell): boolean {\n return left.ch === right.ch\n && left.style.fg === right.style.fg\n && left.style.bg === right.style.bg\n && left.style.bold === right.style.bold\n && left.style.dim === right.style.dim;\n}\n\nfunction applyForegroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.hex(color);\n }\n\n const painter = (instance as unknown as Record<string, unknown>)[color];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n\nfunction applyBackgroundColor(instance: typeof chalk, color: string): typeof chalk {\n if (color.startsWith(\"#\")) {\n return instance.bgHex(color);\n }\n\n const methodName = color.startsWith(\"bg\")\n ? color\n : `bg${color.charAt(0).toUpperCase()}${color.slice(1)}`;\n const painter = (instance as unknown as Record<string, unknown>)[methodName];\n return typeof painter === \"function\" ? (painter as typeof chalk) : instance;\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import chalk from \"chalk\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nexport { isCancel } from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2514\")} ${chalk.red(msg)}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { text } from \"../../components/text.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u250C\")} ${text.intro(title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nfunction getVisibleWidth(value: string): number {\n return stripAnsi(value).length;\n}\n\nfunction renderTerminalNote(message: string, title?: string): string {\n const contentLines = [\"\", ...message.split(\"\\n\"), \"\"];\n const visibleTitle = stripAnsi(title ?? \"\");\n const contentWidth = Math.max(\n visibleTitle.length,\n ...contentLines.map((line) => getVisibleWidth(line))\n ) + 2;\n const titleLine = `${chalk.green(\"\u25C7\")} ${chalk.reset(title ?? \"\")} ${chalk.gray(\n `${\"\u2500\".repeat(Math.max(contentWidth - visibleTitle.length - 1, 1))}\u256E`\n )}`;\n const content = contentLines.map((line) => {\n const padding = \" \".repeat(contentWidth - getVisibleWidth(line));\n return `${chalk.gray(\"\u2502\")} ${line}${padding}${chalk.gray(\"\u2502\")}`;\n });\n const bottom = chalk.gray(`\u251C${\"\u2500\".repeat(contentWidth + 2)}\u256F`);\n\n return [chalk.gray(\"\u2502\"), titleLine, ...content, bottom].join(\"\\n\");\n}\n\nexport function note(message: string, title?: string): void {\n const format = resolveOutputFormat();\n const strippedMessage = stripAnsi(message);\n const strippedTitle = stripAnsi(title ?? \"\");\n\n if (format === \"markdown\") {\n const lines = strippedMessage.split(\"\\n\");\n const heading = strippedTitle ? `> **${strippedTitle}**\\n` : \"\";\n const body = lines.map((line) => `> ${line}`).join(\"\\n\");\n process.stdout.write(`${heading}${body}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({\n type: \"note\",\n title: strippedTitle,\n message: strippedMessage\n })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${renderTerminalNote(message, title)}\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport function outro(message: string): void {\n const format = resolveOutputFormat();\n const stripped = stripAnsi(message);\n\n if (format === \"markdown\") {\n process.stdout.write(`---\\n${stripped}\\n`);\n return;\n }\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"outro\", message: stripped })}\\n`\n );\n return;\n }\n\n process.stdout.write(`${chalk.gray(\"\u2502\")}\\n${chalk.gray(\"\u2514\")} ${message}\\n\\n`);\n}\n", "import chalk from \"chalk\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\nimport { SPINNER_FRAMES } from \"../../static/spinner.js\";\n\nexport interface SpinnerOptions {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n}\n\nfunction writeTerminalFrame(frame: string, message: string): void {\n process.stdout.write(`\\r\\x1b[K${frame} ${message}`);\n}\n\nexport function spinner(): SpinnerOptions {\n let currentMessage = \"\";\n let frameIndex = 0;\n let timer: ReturnType<typeof setInterval> | undefined;\n let fallback = false;\n\n const format = resolveOutputFormat();\n\n const renderFrame = (): void => {\n writeTerminalFrame(SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length], currentMessage);\n };\n\n const clearTimer = (): void => {\n if (!timer) {\n return;\n }\n clearInterval(timer);\n timer = undefined;\n };\n\n return {\n start(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}...\\n`);\n return;\n }\n\n fallback = process.env.POE_NO_SPINNER === \"1\" || !process.stdout.isTTY;\n if (fallback) {\n process.stdout.write(`${currentMessage}\\n`);\n return;\n }\n\n frameIndex = 0;\n renderFrame();\n timer = setInterval(() => {\n frameIndex += 1;\n renderFrame();\n }, 16);\n },\n\n message(message = \"\"): void {\n currentMessage = stripAnsi(message);\n\n if (format !== \"terminal\" || fallback || !timer) {\n return;\n }\n\n renderFrame();\n },\n\n stop(message = currentMessage, code?: number): void {\n currentMessage = stripAnsi(message);\n\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ type: \"spinner\", state: \"stopped\", message: currentMessage })}\\n`\n );\n return;\n }\n\n if (format === \"markdown\") {\n process.stdout.write(`- ${currentMessage}\\n`);\n return;\n }\n\n clearTimer();\n\n const symbol = code === undefined || code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n\n if (fallback) {\n process.stdout.write(`${symbol} ${currentMessage}\\n`);\n return;\n }\n\n process.stdout.write(`\\r\\x1b[K${symbol} ${currentMessage}\\n`);\n }\n };\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}...\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"running\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const format = resolveOutputFormat();\n\n if (format === \"markdown\") {\n return `- ${options.message}${options.timer ? ` [${options.timer}]` : \"\"}\\n`;\n }\n\n if (format === \"json\") {\n return `${JSON.stringify({\n type: \"spinner\",\n state: \"stopped\",\n message: options.message,\n ...(options.timer ? { timer: options.timer } : {})\n })}\\n`;\n }\n\n const code = options.code ?? 0;\n const symbol = code === 0 ? chalk.green(\"\u25C6\") : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const format = resolveOutputFormat();\n const selectedIndex = opts.selectedIndex ?? 0;\n\n if (format === \"markdown\") {\n return [\n `**${opts.message}**`,\n ...opts.options.map(\n (option, index) => `- [${index === selectedIndex ? \"x\" : \" \"}] ${option.label}`\n )\n ].join(\"\\n\");\n }\n\n if (format === \"json\") {\n return JSON.stringify({\n type: \"menu\",\n message: opts.message,\n options: opts.options,\n selected: selectedIndex\n });\n }\n\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === selectedIndex;\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { renderAcpStream } from \"./acp/renderer.js\";\nimport type { AcpEvent } from \"./acp/types.js\";\nimport { isActivityTimeoutError } from \"./spawn.js\";\n\nconst DEFAULT_ACTIVITY_TIMEOUT_MS = 10 * 60 * 1000;\nconst DEFAULT_MAX_TIMEOUT_RETRIES = 3;\n\nexport interface StreamingSpawnReturn<TResult> {\n events: AsyncIterable<AcpEvent>;\n result: Promise<TResult>;\n}\n\nexport type StreamingSpawnFn<TOptions, TResult> = (\n service: string,\n options: TOptions\n) => StreamingSpawnReturn<TResult>;\n\nexport type AutonomousOptions<TOptions> = TOptions & {\n service: string;\n maxTimeoutRetries?: number;\n activityTimeoutMs?: number;\n};\n\n/**\n * Drive a streaming spawn end-to-end: pipe ACP events through `renderAcpStream`\n * (which routes through `withAcpWriter` if bound) and return the final result.\n * Retries on activity timeout up to `maxTimeoutRetries` attempts.\n *\n * Both the SDK `spawn.autonomous` and the superintendent loop consume this \u2014\n * callers supply a streaming spawn function whose `result` promise resolves\n * to their own result shape.\n */\nexport async function spawnAutonomous<\n TOptions extends { activityTimeoutMs?: number },\n TResult\n>(\n streamSpawn: StreamingSpawnFn<TOptions, TResult>,\n options: AutonomousOptions<TOptions>\n): Promise<TResult> {\n const {\n service,\n maxTimeoutRetries = DEFAULT_MAX_TIMEOUT_RETRIES,\n activityTimeoutMs = DEFAULT_ACTIVITY_TIMEOUT_MS,\n ...rest\n } = options;\n\n const spawnOptions = { ...rest, activityTimeoutMs } as unknown as TOptions;\n\n for (let attempt = 1; attempt <= maxTimeoutRetries; attempt += 1) {\n let result: Promise<TResult> | undefined;\n try {\n const stream = streamSpawn(service, spawnOptions);\n result = stream.result;\n // Attach to the final result immediately so a failed attempt can retry\n // without hanging behind ACP rendering that is still flushing.\n const [spawnResult] = await Promise.all([\n result,\n renderAcpStream(stream.events)\n ]);\n return spawnResult;\n } catch (error) {\n result?.catch(() => {});\n if (!isActivityTimeoutError(error) || attempt === maxTimeoutRetries) {\n throw error;\n }\n }\n }\n\n throw new Error(\"Unreachable\");\n}\n", "import path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Dirent } from \"node:fs\";\nimport { open, readdir } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline\";\nimport type { SessionUpdate } from \"@poe-code/poe-acp-client\";\nimport { mapLegacyEventToSessionUpdates } from \"@poe-code/poe-acp-client\";\nimport { renderSessionUpdateStream } from \"./renderer.js\";\nimport type { AcpEvent } from \"./types.js\";\n\nconst DEFAULT_LOG_LIMIT = 80;\nconst JSONL_EXTENSION = \".jsonl\";\n\nexport interface LogEntry {\n path: string;\n filename: string;\n agent?: string;\n timestamp?: Date;\n}\n\ninterface ListSpawnLogsOptions {\n agent?: string;\n limit?: number;\n}\n\nfunction isDigitString(value: string, length: number): boolean {\n if (value.length !== length) return false;\n for (const char of value) {\n if (char < \"0\" || char > \"9\") return false;\n }\n return true;\n}\n\nfunction parseTimestamp(day: string, time: string, milliseconds: string): Date | undefined {\n if (!isDigitString(day, 8) || !isDigitString(time, 6) || !isDigitString(milliseconds, 3)) {\n return undefined;\n }\n\n const year = Number(day.slice(0, 4));\n const month = Number(day.slice(4, 6));\n const date = Number(day.slice(6, 8));\n const hours = Number(time.slice(0, 2));\n const minutes = Number(time.slice(2, 4));\n const seconds = Number(time.slice(4, 6));\n const millis = Number(milliseconds);\n\n const timestamp = new Date(Date.UTC(year, month - 1, date, hours, minutes, seconds, millis));\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp.getUTCFullYear() !== year ||\n timestamp.getUTCMonth() !== month - 1 ||\n timestamp.getUTCDate() !== date ||\n timestamp.getUTCHours() !== hours ||\n timestamp.getUTCMinutes() !== minutes ||\n timestamp.getUTCSeconds() !== seconds ||\n timestamp.getUTCMilliseconds() !== millis\n ) {\n return undefined;\n }\n\n return timestamp;\n}\n\nfunction parseLogFilename(filename: string): { agent?: string; timestamp?: Date } {\n if (!filename.endsWith(JSONL_EXTENSION)) return {};\n\n const baseName = filename.slice(0, -JSONL_EXTENSION.length);\n const parts = baseName.split(\"-\");\n\n if (parts.length < 4) return {};\n\n const timestamp = parseTimestamp(parts[0], parts[1], parts[2]);\n const agent = parts.slice(3).join(\"-\");\n\n return {\n agent: agent.length > 0 ? agent : undefined,\n timestamp\n };\n}\n\nfunction normalizeLimit(limit: number | undefined): number {\n if (typeof limit !== \"number\" || !Number.isFinite(limit) || limit < 0) {\n return DEFAULT_LOG_LIMIT;\n }\n return Math.floor(limit);\n}\n\nfunction isSessionUpdate(parsed: unknown): parsed is SessionUpdate {\n return (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"sessionUpdate\" in parsed &&\n typeof (parsed as Record<string, unknown>).sessionUpdate === \"string\"\n );\n}\n\nfunction isLegacyEvent(parsed: unknown): parsed is AcpEvent {\n return (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"event\" in parsed &&\n typeof (parsed as Record<string, unknown>).event === \"string\"\n );\n}\n\nexport async function* readSpawnLog(filePath: string): AsyncIterable<SessionUpdate> {\n const fileHandle = await open(filePath, \"r\");\n const stream = fileHandle.createReadStream({ encoding: \"utf8\" });\n const reader = createInterface({\n input: stream,\n crlfDelay: Infinity\n });\n\n try {\n for await (const line of reader) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n\n const parsed: unknown = JSON.parse(trimmed);\n\n if (isSessionUpdate(parsed)) {\n yield parsed;\n continue;\n }\n\n if (isLegacyEvent(parsed)) {\n for (const update of mapLegacyEventToSessionUpdates(parsed as { event: string } & Record<string, unknown>)) {\n yield update;\n }\n }\n }\n } finally {\n reader.close();\n if (!stream.destroyed) {\n stream.destroy();\n }\n await fileHandle.close().catch(() => {});\n }\n}\n\nexport async function listSpawnLogs(options: ListSpawnLogsOptions = {}): Promise<LogEntry[]> {\n const logDir = path.join(homedir(), \".poe-code\", \"spawn-logs\");\n const limit = normalizeLimit(options.limit);\n\n let entries: Dirent[];\n try {\n entries = await readdir(logDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n }\n\n const logs: LogEntry[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(JSONL_EXTENSION)) continue;\n\n const logEntry: LogEntry = {\n path: path.join(logDir, entry.name),\n filename: entry.name,\n ...parseLogFilename(entry.name)\n };\n\n if (options.agent && logEntry.agent !== options.agent) continue;\n\n logs.push(logEntry);\n }\n\n logs.sort((a, b) => (a.filename < b.filename ? 1 : a.filename > b.filename ? -1 : 0));\n return logs.slice(0, limit);\n}\n\nexport async function findLatestLog(agent?: string): Promise<string | undefined> {\n const [entry] = await listSpawnLogs({ agent, limit: 1 });\n return entry?.path;\n}\n\nexport async function pickRandomLog(agent?: string): Promise<string | undefined> {\n const entries = await listSpawnLogs({ agent });\n if (entries.length === 0) return undefined;\n return entries[Math.floor(Math.random() * entries.length)]?.path;\n}\n\nexport async function replaySpawnLog(filePath: string): Promise<void> {\n await renderSessionUpdateStream(readSpawnLog(filePath));\n}\n", "import { isAbsolute } from \"node:path\";\nimport {\n AcpTransport,\n type AcpTransportClosedEvent,\n type AcpTransportOptions,\n} from \"./acp-transport.js\";\nimport type { JsonRpcRequestOptions } from \"./jsonrpc-message-layer.js\";\nimport {\n ACP_ERROR_CODE_INVALID_PARAMS,\n ACP_ERROR_CODE_RESOURCE_NOT_FOUND,\n AcpError,\n type AgentCapabilities,\n type AuthenticateResponse,\n type AuthMethod,\n type CancelNotification,\n type ClientCapabilities,\n type ContentBlock,\n type CreateTerminalRequest,\n type CreateTerminalResponse,\n type EnvVariable,\n type Implementation,\n type InitializeResponse,\n type KillTerminalCommandRequest,\n type KillTerminalCommandResponse,\n type LoadSessionResponse,\n type McpServer,\n type NewSessionResponse,\n type PermissionOption,\n type PromptResponse,\n type RequestId,\n type SessionConfigId,\n type SessionConfigOption,\n type SessionConfigValueId,\n type RequestPermissionOutcome,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n type ProtocolVersion,\n type SessionModeId,\n type SessionNotification,\n type SessionId,\n type SetSessionModeResponse,\n type SessionUpdateNotification,\n type ToolCallUpdate,\n type TerminalOutputRequest,\n type TerminalOutputResponse,\n type WaitForTerminalExitRequest,\n type WaitForTerminalExitResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n type ReleaseTerminalRequest,\n type ReleaseTerminalResponse,\n} from \"./types.js\";\n\nexport type AcpClientState = \"uninitialized\" | \"initialized\" | \"ready\";\ntype ExtensionMethod = `_${string}`;\n\nexport interface PromptTurn extends AsyncIterable<SessionUpdateNotification> {\n response: Promise<PromptResponse>;\n}\n\ninterface AsyncQueue<T> extends AsyncIterable<T>, AsyncIterator<T> {\n push(value: T): void;\n complete(): void;\n fail(error: Error): void;\n}\n\nexport interface AcpClientFsHandler {\n readTextFile?: (args: {\n sessionId: SessionId;\n path: string;\n line?: number | null;\n limit?: number | null;\n }) => string | Promise<string>;\n writeTextFile?: (args: {\n sessionId: SessionId;\n path: string;\n content: string;\n }) => void | Promise<void>;\n}\n\nexport interface AcpClientTerminalHandler {\n create: (args: {\n sessionId: SessionId;\n command: string;\n args?: string[];\n cwd?: string | null;\n env?: EnvVariable[];\n outputByteLimit?: number | null;\n }) => string | Promise<string>;\n output: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => TerminalOutputResponse | Promise<TerminalOutputResponse>;\n waitForExit: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => WaitForTerminalExitResponse | Promise<WaitForTerminalExitResponse>;\n kill: (args: { sessionId: SessionId; terminalId: string }) => void | Promise<void>;\n release: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => void | Promise<void>;\n}\n\ntype AcpClientPermissionHandler = (args: {\n toolCall: ToolCallUpdate;\n options: PermissionOption[];\n}) => RequestPermissionOutcome | Promise<RequestPermissionOutcome>;\n\nexport interface AcpClientHandlers {\n permission?: AcpClientPermissionHandler;\n fs?: AcpClientFsHandler;\n terminal?: AcpClientTerminalHandler;\n}\n\ntype AcpClientTransport = Pick<\n AcpTransport,\n \"sendRequest\" | \"sendNotification\" | \"onRequest\" | \"onNotification\"\n> &\n Partial<Pick<AcpTransport, \"dispose\" | \"closed\">>;\n\ninterface AcpClientSharedOptions {\n protocolVersion?: ProtocolVersion;\n clientCapabilities?: ClientCapabilities;\n clientInfo?: Implementation | null;\n handlers?: AcpClientHandlers;\n permissionHandler?: AcpClientPermissionHandler;\n fsHandler?: AcpClientFsHandler;\n terminalHandler?: AcpClientTerminalHandler;\n skipAuth?: boolean;\n /**\n * Automatically approve all permission requests (selects the first\n * \"allow_always\" or \"allow_once\" option). Ignored when a custom\n * `permissionHandler` is provided.\n */\n autoApprove?: boolean;\n}\n\nexport interface AcpClientProcessOptions extends AcpClientSharedOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n firstRequestId?: number;\n spawn?: AcpTransportOptions[\"spawn\"];\n}\n\nexport interface AcpClientInjectedTransportOptions extends AcpClientSharedOptions {\n transport: AcpClientTransport;\n}\n\nexport type AcpClientOptions = AcpClientProcessOptions | AcpClientInjectedTransportOptions;\n\nfunction toError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason));\n}\n\nfunction invalidParams(message: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_INVALID_PARAMS,\n `Invalid params: ${message}`\n );\n}\n\nfunction resourceNotFound(resource: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_RESOURCE_NOT_FOUND,\n `Resource not found: ${resource}`\n );\n}\n\nfunction assertAbsolutePath(path: string): void {\n if (!isAbsolute(path)) {\n throw invalidParams('\"path\" must be an absolute path');\n }\n}\n\nfunction assertOneBasedLineNumber(line: number | null | undefined): void {\n if (line === null || line === undefined) {\n return;\n }\n\n if (!Number.isInteger(line) || line < 1) {\n throw invalidParams('\"line\" must be a 1-based integer');\n }\n}\n\nfunction assertExtensionMethod(method: string): asserts method is ExtensionMethod {\n if (!method.startsWith(\"_\")) {\n throw new Error('Extension method must start with \"_\"');\n }\n}\n\nfunction isInjectedTransportOptions(\n options: AcpClientOptions\n): options is AcpClientInjectedTransportOptions {\n return \"transport\" in options;\n}\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: Error) => void;\n }> = [];\n let closed = false;\n let failure: Error | null = null;\n\n const resolveOne = (value: T): boolean => {\n const waiter = waiters.shift();\n if (!waiter) {\n return false;\n }\n\n waiter.resolve({ done: false, value });\n return true;\n };\n\n const iterator: AsyncQueue<T> = {\n push(value: T): void {\n if (closed || failure) {\n return;\n }\n\n if (!resolveOne(value)) {\n values.push(value);\n }\n },\n complete(): void {\n if (closed || failure) {\n return;\n }\n\n closed = true;\n while (waiters.length > 0) {\n waiters.shift()?.resolve({ done: true, value: undefined });\n }\n },\n fail(error: Error): void {\n if (closed || failure) {\n return;\n }\n\n failure = error;\n while (waiters.length > 0) {\n waiters.shift()?.reject(error);\n }\n },\n async next(): Promise<IteratorResult<T>> {\n if (values.length > 0) {\n const value = values.shift() as T;\n return { done: false, value };\n }\n\n if (failure) {\n throw failure;\n }\n\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n async return(): Promise<IteratorResult<T>> {\n iterator.complete();\n return { done: true, value: undefined };\n },\n async throw(error: unknown): Promise<IteratorResult<T>> {\n const normalizedError = toError(error);\n iterator.fail(normalizedError);\n throw normalizedError;\n },\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n\nexport class AcpClient {\n private readonly transport: AcpClientTransport;\n private readonly clientProtocolVersion: ProtocolVersion;\n private clientCapabilities?: ClientCapabilities;\n private readonly clientInfo?: Implementation | null;\n private readonly skipAuth: boolean;\n private readonly permissionHandler?: AcpClientPermissionHandler;\n private readonly fsHandler?: AcpClientFsHandler;\n private readonly terminalHandler?: AcpClientTerminalHandler;\n private readonly activePromptUpdates = new Map<\n SessionId,\n AsyncQueue<SessionUpdateNotification>\n >();\n private readonly trackedTerminalIds = new Map<SessionId, Set<string>>();\n private hasRegisteredFsReadHandler = false;\n private hasRegisteredFsWriteHandler = false;\n private hasRegisteredTerminalHandlers = false;\n private disposed = false;\n\n private lifecycleState: AcpClientState = \"uninitialized\";\n private negotiatedVersion: ProtocolVersion | null = null;\n private availableAuthMethods: AuthMethod[] = [];\n private negotiatedAgentCapabilities: AgentCapabilities | undefined;\n private negotiatedAgentInfo: Implementation | null | undefined;\n\n constructor(options: AcpClientOptions) {\n this.transport = isInjectedTransportOptions(options)\n ? options.transport\n : new AcpTransport({\n command: options.command,\n args: options.args,\n cwd: options.cwd,\n env: options.env,\n firstRequestId: options.firstRequestId,\n spawn: options.spawn,\n });\n this.clientProtocolVersion = options.protocolVersion ?? 1;\n this.clientCapabilities = options.clientCapabilities;\n this.clientInfo = options.clientInfo;\n this.skipAuth = options.skipAuth ?? false;\n this.permissionHandler = options.handlers?.permission ?? options.permissionHandler;\n this.fsHandler = options.handlers?.fs ?? options.fsHandler;\n this.terminalHandler = options.handlers?.terminal ?? options.terminalHandler;\n\n const autoApprove = options.autoApprove === true && !this.permissionHandler;\n\n this.transport.onRequest(\n \"session/request_permission\",\n async (params: RequestPermissionRequest): Promise<RequestPermissionResponse> => {\n if (this.permissionHandler) {\n const outcome = await this.permissionHandler({\n toolCall: params.toolCall,\n options: params.options,\n });\n return { outcome };\n }\n\n if (autoApprove) {\n const allow =\n params.options.find((o: PermissionOption) => o.kind === \"allow_always\") ??\n params.options.find((o: PermissionOption) => o.kind === \"allow_once\");\n if (allow) {\n return { outcome: { outcome: \"selected\", optionId: allow.optionId } };\n }\n }\n\n return { outcome: { outcome: \"cancelled\" } };\n }\n );\n\n this.registerCapabilityHandlers(this.clientCapabilities);\n\n this.transport.onNotification(\"session/update\", (params: SessionNotification) => {\n this.handleSessionUpdateNotification(params);\n });\n }\n\n get state(): AcpClientState {\n return this.lifecycleState;\n }\n\n get negotiatedProtocolVersion(): ProtocolVersion | null {\n return this.negotiatedVersion;\n }\n\n get authMethods(): AuthMethod[] {\n return [...this.availableAuthMethods];\n }\n\n get agentCapabilities(): AgentCapabilities | undefined {\n return this.negotiatedAgentCapabilities;\n }\n\n get agentInfo(): Implementation | null | undefined {\n return this.negotiatedAgentInfo;\n }\n\n get closed(): Promise<AcpTransportClosedEvent> | undefined {\n return this.transport.closed;\n }\n\n async initialize(clientCapabilities?: ClientCapabilities): Promise<InitializeResponse> {\n if (this.lifecycleState !== \"uninitialized\") {\n throw new Error(\"initialize() can only be called once.\");\n }\n\n if (clientCapabilities !== undefined) {\n this.clientCapabilities = clientCapabilities;\n this.registerCapabilityHandlers(clientCapabilities);\n }\n\n const response = await this.transport.sendRequest(\"initialize\", {\n protocolVersion: this.clientProtocolVersion,\n clientInfo: this.clientInfo,\n clientCapabilities: this.clientCapabilities,\n });\n\n const negotiatedProtocolVersion = Math.min(\n this.clientProtocolVersion,\n response.protocolVersion\n );\n\n this.negotiatedVersion = negotiatedProtocolVersion;\n this.negotiatedAgentCapabilities = response.agentCapabilities;\n this.negotiatedAgentInfo = response.agentInfo;\n this.availableAuthMethods = response.authMethods ? [...response.authMethods] : [];\n\n const requiresAuth = this.availableAuthMethods.length > 0 && !this.skipAuth;\n this.lifecycleState = requiresAuth ? \"initialized\" : \"ready\";\n\n return {\n protocolVersion: negotiatedProtocolVersion,\n ...(this.negotiatedAgentCapabilities !== undefined\n ? { agentCapabilities: this.negotiatedAgentCapabilities }\n : {}),\n ...(this.negotiatedAgentInfo !== undefined ? { agentInfo: this.negotiatedAgentInfo } : {}),\n ...(this.availableAuthMethods.length > 0 ? { authMethods: this.authMethods } : {}),\n };\n }\n\n async authenticate(methodId: string): Promise<AuthenticateResponse> {\n if (this.lifecycleState === \"uninitialized\") {\n throw new Error(\"Cannot authenticate before initialize().\");\n }\n\n if (this.lifecycleState === \"ready\") {\n throw new Error(\"Authentication is not required for this agent.\");\n }\n\n if (!this.availableAuthMethods.some((authMethod) => authMethod.id === methodId)) {\n throw new Error(`Unknown auth method \"${methodId}\".`);\n }\n\n const response = await this.transport.sendRequest(\"authenticate\", {\n methodId,\n });\n\n this.lifecycleState = \"ready\";\n return response;\n }\n\n async newSession(cwd: string, mcpServers: McpServer[]): Promise<NewSessionResponse> {\n this.assertReady(\"session/new\");\n this.assertMcpServerCapabilitySupport(mcpServers);\n\n return this.transport.sendRequest(\"session/new\", {\n cwd,\n mcpServers,\n });\n }\n\n async loadSession(\n sessionId: SessionId,\n cwd: string,\n mcpServers: McpServer[]\n ): Promise<LoadSessionResponse> {\n this.assertReady(\"session/load\");\n if (this.negotiatedAgentCapabilities?.loadSession !== true) {\n throw new Error(\n 'Cannot call \"session/load\" because the agent does not support session loading.'\n );\n }\n this.assertMcpServerCapabilitySupport(mcpServers);\n\n return this.transport.sendRequest(\"session/load\", {\n sessionId,\n cwd,\n mcpServers,\n });\n }\n\n async cancelSession(sessionId: SessionId): Promise<void> {\n this.assertReady(\"session/cancel\");\n const payload: CancelNotification = { sessionId };\n this.transport.sendNotification(\"session/cancel\", payload);\n }\n\n async setMode(\n sessionId: SessionId,\n modeId: SessionModeId\n ): Promise<SetSessionModeResponse> {\n this.assertReady(\"session/set_mode\");\n return this.transport.sendRequest(\"session/set_mode\", {\n sessionId,\n modeId,\n });\n }\n\n async setConfigOption(\n sessionId: SessionId,\n configId: SessionConfigId,\n value: SessionConfigValueId\n ): Promise<SessionConfigOption[]> {\n this.assertReady(\"session/set_config_option\");\n const response = await this.transport.sendRequest(\"session/set_config_option\", {\n sessionId,\n configId,\n value,\n });\n\n return response.configOptions;\n }\n\n prompt(sessionId: SessionId, content: ContentBlock[]): PromptTurn {\n this.assertReady(\"session/prompt\");\n this.assertPromptContentCapabilitySupport(content);\n\n if (this.activePromptUpdates.has(sessionId)) {\n throw new Error(\n `Cannot call \"session/prompt\" while another prompt is in progress for session \"${sessionId}\".`\n );\n }\n\n const updates = createAsyncQueue<SessionUpdateNotification>();\n this.activePromptUpdates.set(sessionId, updates);\n\n let requestPromise: Promise<PromptResponse>;\n try {\n requestPromise = this.transport.sendRequest(\"session/prompt\", {\n sessionId,\n prompt: content,\n });\n } catch (error) {\n const normalizedError = toError(error);\n this.activePromptUpdates.delete(sessionId);\n updates.fail(normalizedError);\n throw normalizedError;\n }\n\n const response = requestPromise\n .then((promptResponse) => {\n this.activePromptUpdates.delete(sessionId);\n updates.complete();\n return promptResponse;\n })\n .catch((error) => {\n const normalizedError = toError(error);\n this.activePromptUpdates.delete(sessionId);\n updates.fail(normalizedError);\n throw normalizedError;\n });\n\n return {\n response,\n [Symbol.asyncIterator](): AsyncIterator<SessionUpdateNotification> {\n return updates;\n },\n };\n }\n\n async sendExtRequest<TResult = unknown>(\n method: ExtensionMethod,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n async sendExtRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<TResult> {\n assertExtensionMethod(method);\n return this.transport.sendRequest(method, params, options) as Promise<TResult>;\n }\n\n async sendExtNotification(method: ExtensionMethod, params?: unknown): Promise<void>;\n async sendExtNotification(method: string, params?: unknown): Promise<void> {\n assertExtensionMethod(method);\n this.transport.sendNotification(method, params);\n }\n\n onExtRequest<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (\n params: unknown,\n context: { id: RequestId; method: TMethod }\n ) => unknown | Promise<unknown>\n ): void;\n onExtRequest(\n method: string,\n handler: (params: unknown, context: { id: RequestId; method: string }) => unknown\n ): void {\n assertExtensionMethod(method);\n this.transport.onRequest(method, handler);\n }\n\n onExtNotification<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (params: unknown, context: { method: TMethod }) => void | Promise<void>\n ): void;\n onExtNotification(\n method: string,\n handler: (params: unknown, context: { method: string }) => void | Promise<void>\n ): void {\n assertExtensionMethod(method);\n this.transport.onNotification(method, handler);\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) {\n if (this.transport.closed) {\n await this.transport.closed;\n }\n return;\n }\n\n this.disposed = true;\n const disposeReason = new Error(\"ACP client disposed\");\n for (const updates of this.activePromptUpdates.values()) {\n updates.fail(disposeReason);\n }\n this.activePromptUpdates.clear();\n\n if (typeof this.transport.dispose === \"function\") {\n this.transport.dispose(disposeReason);\n }\n\n if (this.transport.closed) {\n await this.transport.closed;\n }\n }\n\n assertReady(operation: string): void {\n if (this.lifecycleState === \"ready\") {\n return;\n }\n\n if (this.lifecycleState === \"uninitialized\") {\n throw new Error(`Cannot call \"${operation}\" before initialize().`);\n }\n\n throw new Error(`Cannot call \"${operation}\" before authentication completes.`);\n }\n\n private registerCapabilityHandlers(capabilities: ClientCapabilities | undefined): void {\n if (\n !this.hasRegisteredFsReadHandler &&\n capabilities?.fs?.readTextFile === true &&\n this.fsHandler?.readTextFile\n ) {\n const readTextFile = this.fsHandler.readTextFile;\n this.transport.onRequest(\n \"fs/read_text_file\",\n async (params: ReadTextFileRequest): Promise<ReadTextFileResponse> => {\n assertAbsolutePath(params.path);\n assertOneBasedLineNumber(params.line);\n\n const content = await readTextFile({\n sessionId: params.sessionId,\n path: params.path,\n line: params.line,\n limit: params.limit,\n });\n return { content };\n }\n );\n this.hasRegisteredFsReadHandler = true;\n }\n\n if (\n !this.hasRegisteredFsWriteHandler &&\n capabilities?.fs?.writeTextFile === true &&\n this.fsHandler?.writeTextFile\n ) {\n const writeTextFile = this.fsHandler.writeTextFile;\n this.transport.onRequest(\n \"fs/write_text_file\",\n async (params: WriteTextFileRequest): Promise<WriteTextFileResponse> => {\n assertAbsolutePath(params.path);\n\n await writeTextFile({\n sessionId: params.sessionId,\n path: params.path,\n content: params.content,\n });\n\n return {};\n }\n );\n this.hasRegisteredFsWriteHandler = true;\n }\n\n if (\n !this.hasRegisteredTerminalHandlers &&\n capabilities?.terminal === true &&\n this.terminalHandler\n ) {\n const terminalHandler = this.terminalHandler;\n this.transport.onRequest(\n \"terminal/create\",\n async (params: CreateTerminalRequest): Promise<CreateTerminalResponse> => {\n const terminalId = await terminalHandler.create({\n sessionId: params.sessionId,\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n outputByteLimit: params.outputByteLimit,\n });\n this.trackTerminal(params.sessionId, terminalId);\n\n return { terminalId };\n }\n );\n\n this.transport.onRequest(\n \"terminal/output\",\n async (params: TerminalOutputRequest): Promise<TerminalOutputResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n return terminalHandler.output({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n }\n );\n\n this.transport.onRequest(\n \"terminal/wait_for_exit\",\n async (params: WaitForTerminalExitRequest): Promise<WaitForTerminalExitResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n return terminalHandler.waitForExit({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n }\n );\n\n this.transport.onRequest(\n \"terminal/kill\",\n async (params: KillTerminalCommandRequest): Promise<KillTerminalCommandResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n await terminalHandler.kill({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n\n return {};\n }\n );\n\n this.transport.onRequest(\n \"terminal/release\",\n async (params: ReleaseTerminalRequest): Promise<ReleaseTerminalResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n await terminalHandler.release({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n this.untrackTerminal(params.sessionId, params.terminalId);\n\n return {};\n }\n );\n this.hasRegisteredTerminalHandlers = true;\n }\n }\n\n private assertMcpServerCapabilitySupport(mcpServers: McpServer[]): void {\n const mcpCapabilities = this.negotiatedAgentCapabilities?.mcpCapabilities;\n\n for (const mcpServer of mcpServers) {\n if (!(\"type\" in mcpServer)) {\n continue;\n }\n\n if (mcpServer.type === \"http\" && mcpCapabilities?.http !== true) {\n throw new Error('Agent does not support MCP server type \"http\".');\n }\n\n if (mcpServer.type === \"sse\" && mcpCapabilities?.sse !== true) {\n throw new Error('Agent does not support MCP server type \"sse\".');\n }\n }\n }\n\n private handleSessionUpdateNotification(notification: SessionNotification): void {\n const activePrompt = this.activePromptUpdates.get(notification.sessionId);\n if (!activePrompt) {\n return;\n }\n\n activePrompt.push({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n }\n\n private trackTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (sessionTerminals) {\n sessionTerminals.add(terminalId);\n return;\n }\n\n this.trackedTerminalIds.set(sessionId, new Set([terminalId]));\n }\n\n private assertKnownTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (sessionTerminals?.has(terminalId) === true) {\n return;\n }\n\n throw resourceNotFound(`terminal \"${terminalId}\"`);\n }\n\n private untrackTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (!sessionTerminals) {\n return;\n }\n\n sessionTerminals.delete(terminalId);\n if (sessionTerminals.size === 0) {\n this.trackedTerminalIds.delete(sessionId);\n }\n }\n\n private assertPromptContentCapabilitySupport(content: ContentBlock[]): void {\n const promptCapabilities = this.negotiatedAgentCapabilities?.promptCapabilities;\n\n for (const block of content) {\n if (block.type === \"image\" && promptCapabilities?.image !== true) {\n throw new Error('Agent does not support prompt content type \"image\".');\n }\n\n if (block.type === \"audio\" && promptCapabilities?.audio !== true) {\n throw new Error('Agent does not support prompt content type \"audio\".');\n }\n\n if (block.type === \"resource\" && promptCapabilities?.embeddedContext !== true) {\n throw new Error('Agent does not support prompt content type \"resource\".');\n }\n }\n }\n}\n", "import {\n spawn as spawnChildProcess,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"node:child_process\";\nimport {\n JsonRpcMessageLayer,\n type JsonRpcNotificationHandler,\n type JsonRpcRequestHandler,\n type JsonRpcRequestOptions,\n} from \"./jsonrpc-message-layer.js\";\nimport type {\n AuthenticateRequest,\n AuthenticateResponse,\n CancelNotification,\n CreateTerminalRequest,\n CreateTerminalResponse,\n InitializeRequest,\n InitializeResponse,\n KillTerminalCommandRequest,\n KillTerminalCommandResponse,\n LoadSessionRequest,\n LoadSessionResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n RequestId,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SetSessionConfigOptionRequest,\n SetSessionConfigOptionResponse,\n SetSessionModeRequest,\n SetSessionModeResponse,\n TerminalOutputRequest,\n TerminalOutputResponse,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"./types.js\";\n\ninterface AcpRequestShape<TParams, TResult> {\n params: TParams;\n result: TResult;\n}\n\nexport interface AcpAgentRequestMap {\n initialize: AcpRequestShape<InitializeRequest, InitializeResponse>;\n authenticate: AcpRequestShape<AuthenticateRequest, AuthenticateResponse>;\n \"session/new\": AcpRequestShape<NewSessionRequest, NewSessionResponse>;\n \"session/load\": AcpRequestShape<LoadSessionRequest, LoadSessionResponse>;\n \"session/prompt\": AcpRequestShape<PromptRequest, PromptResponse>;\n \"session/set_mode\": AcpRequestShape<SetSessionModeRequest, SetSessionModeResponse>;\n \"session/set_config_option\": AcpRequestShape<\n SetSessionConfigOptionRequest,\n SetSessionConfigOptionResponse\n >;\n}\n\nexport interface AcpAgentNotificationMap {\n \"session/cancel\": CancelNotification;\n}\n\nexport interface AcpClientRequestMap {\n \"session/request_permission\": AcpRequestShape<\n RequestPermissionRequest,\n RequestPermissionResponse\n >;\n \"fs/read_text_file\": AcpRequestShape<ReadTextFileRequest, ReadTextFileResponse>;\n \"fs/write_text_file\": AcpRequestShape<WriteTextFileRequest, WriteTextFileResponse>;\n \"terminal/create\": AcpRequestShape<CreateTerminalRequest, CreateTerminalResponse>;\n \"terminal/output\": AcpRequestShape<TerminalOutputRequest, TerminalOutputResponse>;\n \"terminal/wait_for_exit\": AcpRequestShape<\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse\n >;\n \"terminal/kill\": AcpRequestShape<\n KillTerminalCommandRequest,\n KillTerminalCommandResponse\n >;\n \"terminal/release\": AcpRequestShape<ReleaseTerminalRequest, ReleaseTerminalResponse>;\n}\n\nexport interface AcpClientNotificationMap {\n \"session/update\": SessionNotification;\n}\n\ntype ExtensionMethod = `_${string}`;\n\nfunction assertExtensionMethod(method: string): asserts method is ExtensionMethod {\n if (!method.startsWith(\"_\")) {\n throw new Error('Extension method must start with \"_\"');\n }\n}\n\ntype SpawnFunction = (\n command: string,\n args?: ReadonlyArray<string>,\n options?: SpawnOptionsWithoutStdio\n) => ChildProcessWithoutNullStreams;\n\nexport interface AcpTransportOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n firstRequestId?: number;\n spawn?: SpawnFunction;\n}\n\nexport interface AcpTransportClosedEvent {\n code: number | null;\n signal: NodeJS.Signals | null;\n reason: Error;\n stderr: string;\n}\n\nexport class AcpTransport {\n readonly closed: Promise<AcpTransportClosedEvent>;\n\n private readonly command: string;\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly layer: JsonRpcMessageLayer;\n private readonly stderrChunks: string[] = [];\n private resolveClosed: ((value: AcpTransportClosedEvent) => void) | null = null;\n private closeEvent: AcpTransportClosedEvent | null = null;\n private closeReason: Error | null = null;\n\n constructor(options: AcpTransportOptions) {\n const {\n command,\n args = [],\n cwd,\n env,\n firstRequestId,\n spawn = spawnChildProcess,\n } = options;\n\n this.command = command;\n this.closed = new Promise<AcpTransportClosedEvent>((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.child = spawn(command, [...args], {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n this.child.stderr.setEncoding(\"utf8\");\n this.child.stderr.on(\"data\", (chunk) => {\n this.stderrChunks.push(String(chunk));\n });\n\n this.child.stdin.on(\"error\", (error) => {\n const reason = error instanceof Error ? error : new Error(String(error));\n this.close(reason, this.child.exitCode ?? null, this.child.signalCode ?? null);\n });\n\n this.layer = new JsonRpcMessageLayer({\n input: this.child.stdout,\n output: this.child.stdin,\n firstRequestId,\n });\n\n this.child.once(\"error\", (error) => {\n const reason = error instanceof Error ? error : new Error(String(error));\n this.close(reason, this.child.exitCode ?? null, this.child.signalCode ?? null);\n });\n\n this.child.once(\"close\", (code, signal) => {\n const reason =\n this.closeReason ??\n new Error(\n `ACP transport closed (command \"${this.command}\", code: ${code ?? \"null\"}${\n signal ? `, signal: ${signal}` : \"\"\n })`\n );\n this.close(reason, code ?? null, signal ?? null);\n });\n }\n\n sendRequest<TMethod extends keyof AcpAgentRequestMap>(\n method: TMethod,\n params: AcpAgentRequestMap[TMethod][\"params\"],\n options?: JsonRpcRequestOptions\n ): Promise<AcpAgentRequestMap[TMethod][\"result\"]>;\n sendRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n return this.layer.sendRequest(method, params, options);\n }\n\n sendExtRequest<TResult = unknown>(\n method: ExtensionMethod,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n sendExtRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<TResult> {\n assertExtensionMethod(method);\n return this.layer.sendRequest(method, params, options) as Promise<TResult>;\n }\n\n sendNotification<TMethod extends keyof AcpAgentNotificationMap>(\n method: TMethod,\n params: AcpAgentNotificationMap[TMethod]\n ): void;\n sendNotification(method: string, params?: unknown): void;\n sendNotification(method: string, params?: unknown): void {\n this.layer.sendNotification(method, params);\n }\n\n sendExtNotification(method: ExtensionMethod, params?: unknown): void;\n sendExtNotification(method: string, params?: unknown): void;\n sendExtNotification(method: string, params?: unknown): void {\n assertExtensionMethod(method);\n this.layer.sendNotification(method, params);\n }\n\n onRequest<TMethod extends keyof AcpClientRequestMap>(\n method: TMethod,\n handler: (\n params: AcpClientRequestMap[TMethod][\"params\"],\n context: { id: RequestId; method: TMethod }\n ) =>\n | AcpClientRequestMap[TMethod][\"result\"]\n | Promise<AcpClientRequestMap[TMethod][\"result\"]>\n ): void;\n onRequest(method: string, handler: JsonRpcRequestHandler): void;\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.layer.onRequest(method, handler);\n }\n\n onExtRequest<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (\n params: unknown,\n context: { id: RequestId; method: TMethod }\n ) => unknown | Promise<unknown>\n ): void;\n onExtRequest(method: string, handler: JsonRpcRequestHandler): void;\n onExtRequest(method: string, handler: JsonRpcRequestHandler): void {\n assertExtensionMethod(method);\n this.layer.onRequest(method, handler);\n }\n\n onNotification<TMethod extends keyof AcpClientNotificationMap>(\n method: TMethod,\n handler: (\n params: AcpClientNotificationMap[TMethod],\n context: { method: TMethod }\n ) => void | Promise<void>\n ): void;\n onNotification(method: string, handler: JsonRpcNotificationHandler): void;\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.layer.onNotification(method, handler);\n }\n\n onExtNotification<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (params: unknown, context: { method: TMethod }) => void | Promise<void>\n ): void;\n onExtNotification(method: string, handler: JsonRpcNotificationHandler): void;\n onExtNotification(method: string, handler: JsonRpcNotificationHandler): void {\n assertExtensionMethod(method);\n this.layer.onNotification(method, handler);\n }\n\n getStderrOutput(): string {\n return this.stderrChunks.join(\"\");\n }\n\n pendingRequestCount(): number {\n return this.layer.pendingRequestCount();\n }\n\n dispose(reason: Error = new Error(\"ACP transport disposed\")): void {\n if (this.closeEvent !== null) {\n return;\n }\n\n this.closeReason = reason;\n this.layer.dispose(reason);\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode !== null || this.child.signalCode !== null) {\n this.close(reason, this.child.exitCode, this.child.signalCode);\n return;\n }\n\n const killed = this.child.kill();\n if (!killed) {\n this.close(reason, this.child.exitCode, this.child.signalCode);\n }\n }\n\n private close(reason: Error, code: number | null, signal: NodeJS.Signals | null): void {\n if (this.closeEvent !== null) {\n return;\n }\n\n this.layer.dispose(reason);\n this.closeEvent = {\n code,\n signal,\n reason,\n stderr: this.getStderrOutput(),\n };\n this.resolveClosed?.(this.closeEvent);\n this.resolveClosed = null;\n }\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n extractToolCallSummariesFromSessionUpdateStream,\n extractUsageFromSessionUpdateStream,\n type ToolCallSummary,\n} from \"./stream-helpers.js\";\nimport type { Cost, SessionUpdate, SessionUpdateNotification, UsageUpdate } from \"./types.js\";\n\ntype SessionUpdateStreamItem = SessionUpdateNotification | SessionUpdate;\n\nexport type RunExitStatus = \"success\" | \"failed\";\n\nexport interface RunReportUsage {\n used: number;\n size: number;\n updates: number;\n cost?: Cost | null;\n}\n\nexport interface RunReportError {\n message: string;\n toolCallId?: string;\n}\n\nexport interface RunReport {\n runId: string;\n startTime: string;\n endTime: string;\n exitStatus: RunExitStatus;\n toolCalls: ToolCallSummary[];\n usage: RunReportUsage;\n errors: RunReportError[];\n}\n\nexport interface GenerateRunReportOptions {\n runId?: string;\n startTime?: string | Date;\n endTime?: string | Date;\n exitStatus?: RunExitStatus;\n errors?: string[];\n now?: () => Date;\n}\n\nexport type RunReportFileSystem = {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n writeFile(\n path: string,\n data: string,\n options?: { encoding?: BufferEncoding },\n ): Promise<void>;\n};\n\nexport interface SaveRunReportOptions {\n fs?: RunReportFileSystem;\n homeDir?: string;\n now?: () => Date;\n}\n\nexport interface SavedRunReportPaths {\n reportsDir: string;\n jsonPath: string;\n summaryPath: string;\n}\n\nexport async function generateRunReportFromSessionUpdateStream(\n stream: AsyncIterable<SessionUpdateStreamItem> | Iterable<SessionUpdateStreamItem>,\n options: GenerateRunReportOptions = {},\n): Promise<RunReport> {\n const now = options.now ?? (() => new Date());\n\n const bufferedEntries: SessionUpdateStreamItem[] = [];\n let runIdFromStream: string | undefined;\n\n for await (const entry of stream) {\n bufferedEntries.push(entry);\n if (runIdFromStream) {\n continue;\n }\n\n if (isSessionUpdateNotification(entry)) {\n const sessionId = toNonEmptyString(entry.params.sessionId);\n if (sessionId) {\n runIdFromStream = sessionId;\n }\n }\n }\n\n const runId = toNonEmptyString(options.runId) ?? runIdFromStream;\n if (!runId) {\n throw new Error(\"Run id is required via options.runId or session/update stream items\");\n }\n\n const startTime = normalizeTime(options.startTime, now);\n const endTime = normalizeTime(options.endTime, now);\n\n const toolCalls = await extractToolCallSummariesFromSessionUpdateStream(bufferedEntries);\n const usageUpdates = await extractUsageFromSessionUpdateStream(bufferedEntries);\n\n const usage = summarizeUsage(usageUpdates);\n const errors = collectErrors(toolCalls, options.errors);\n const exitStatus = options.exitStatus ?? (errors.length > 0 ? \"failed\" : \"success\");\n\n return {\n runId,\n startTime,\n endTime,\n exitStatus,\n toolCalls,\n usage,\n errors,\n };\n}\n\nexport function formatRunReportSummary(report: RunReport): string {\n const lines = [\n `Run ID: ${report.runId}`,\n `Start time: ${report.startTime}`,\n `End time: ${report.endTime}`,\n `Duration: ${toDuration(report.startTime, report.endTime)}`,\n `Exit status: ${report.exitStatus}`,\n `Tool count: ${report.toolCalls.length}`,\n `Token usage: ${report.usage.used}/${report.usage.size}`,\n `Error count: ${report.errors.length}`,\n ];\n\n if (report.usage.cost) {\n lines.push(`Cost: ${report.usage.cost.amount} ${report.usage.cost.currency}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function saveRunReport(\n report: RunReport,\n options: SaveRunReportOptions = {},\n): Promise<SavedRunReportPaths> {\n const fs = options.fs ?? fsPromises;\n const now = options.now ?? (() => new Date());\n\n const reportsDir = join(options.homeDir ?? homedir(), \".poe-code\", \"reports\");\n await fs.mkdir(reportsDir, { recursive: true });\n\n const timestamp = toTimestampForFileName(now());\n const safeRunId = toSafeFileSegment(report.runId);\n const baseFileName = `${timestamp}-${safeRunId}`;\n\n const jsonPath = join(reportsDir, `${baseFileName}.json`);\n const summaryPath = join(reportsDir, `${baseFileName}.txt`);\n\n await fs.writeFile(jsonPath, JSON.stringify(report, null, 2), { encoding: \"utf8\" });\n await fs.writeFile(summaryPath, formatRunReportSummary(report), { encoding: \"utf8\" });\n\n return {\n reportsDir,\n jsonPath,\n summaryPath,\n };\n}\n\nfunction isSessionUpdateNotification(entry: SessionUpdateStreamItem): entry is SessionUpdateNotification {\n return (\n typeof (entry as SessionUpdateNotification).jsonrpc === \"string\" &&\n (entry as SessionUpdateNotification).method === \"session/update\"\n );\n}\n\nfunction normalizeTime(value: string | Date | undefined, now: () => Date): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"string\" && value.length > 0) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n }\n\n return now().toISOString();\n}\n\nfunction summarizeUsage(updates: readonly UsageUpdate[]): RunReportUsage {\n let used = 0;\n let size = 0;\n let cost: Cost | null | undefined;\n\n for (const update of updates) {\n used += update.used;\n size += update.size;\n\n if (update.cost !== undefined) {\n cost = update.cost;\n }\n }\n\n const usage: RunReportUsage = {\n used,\n size,\n updates: updates.length,\n };\n\n if (cost !== undefined) {\n usage.cost = cost;\n }\n\n return usage;\n}\n\nfunction collectErrors(\n toolCalls: readonly ToolCallSummary[],\n additionalErrors: readonly string[] | undefined,\n): RunReportError[] {\n const errors: RunReportError[] = [];\n\n for (const toolCall of toolCalls) {\n if (toolCall.status !== \"failed\") {\n continue;\n }\n\n errors.push({\n toolCallId: toolCall.toolCallId,\n message: toErrorMessage(toolCall),\n });\n }\n\n if (additionalErrors) {\n for (const message of additionalErrors) {\n const text = toNonEmptyString(message);\n if (text) {\n errors.push({ message: text });\n }\n }\n }\n\n return errors;\n}\n\nfunction toErrorMessage(toolCall: ToolCallSummary): string {\n if (typeof toolCall.rawOutput === \"string\" && toolCall.rawOutput.length > 0) {\n return toolCall.rawOutput;\n }\n\n if (toolCall.rawOutput instanceof Error && toolCall.rawOutput.message.length > 0) {\n return toolCall.rawOutput.message;\n }\n\n if (toolCall.rawOutput !== undefined && toolCall.rawOutput !== null) {\n const encoded = trySerialize(toolCall.rawOutput);\n if (encoded) {\n return encoded;\n }\n }\n\n return `${toolCall.title} failed`;\n}\n\nfunction trySerialize(value: unknown): string | undefined {\n try {\n const serialized = JSON.stringify(value);\n if (typeof serialized === \"string\" && serialized.length > 0) {\n return serialized;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nfunction toDuration(startTime: string, endTime: string): string {\n const startMs = Date.parse(startTime);\n const endMs = Date.parse(endTime);\n\n if (Number.isNaN(startMs) || Number.isNaN(endMs) || endMs < startMs) {\n return \"unknown\";\n }\n\n const seconds = (endMs - startMs) / 1000;\n return `${Number(seconds.toFixed(3))}s`;\n}\n\nfunction toSafeFileSegment(value: string): string {\n let output = \"\";\n\n for (const char of value) {\n if (isAsciiLetterOrDigit(char) || char === \"-\" || char === \"_\") {\n output += char;\n continue;\n }\n\n output += \"-\";\n }\n\n return output.length > 0 ? output : \"run\";\n}\n\nfunction isAsciiLetterOrDigit(value: string): boolean {\n const code = value.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122)\n );\n}\n\nfunction toTimestampForFileName(value: Date): string {\n return [\n String(value.getUTCFullYear()),\n pad(value.getUTCMonth() + 1, 2),\n pad(value.getUTCDate(), 2),\n ].join(\"\")\n + \"-\"\n + [\n pad(value.getUTCHours(), 2),\n pad(value.getUTCMinutes(), 2),\n pad(value.getUTCSeconds(), 2),\n ].join(\"\")\n + \"-\"\n + pad(value.getUTCMilliseconds(), 3);\n}\n\nfunction pad(value: number, size: number): string {\n const text = String(value);\n if (text.length >= size) {\n return text;\n }\n\n return `${\"0\".repeat(size - text.length)}${text}`;\n}\n\nfunction toNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n\n return value;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport type { AcpEvent } from \"./types.js\";\nimport { readLines } from \"./line-reader.js\";\nimport { resolveConfig } from \"../configs/resolve-config.js\";\nimport { getMcpArgs, getMcpEnv } from \"../mcp-args.js\";\nimport { stripModelNamespace } from \"../model-utils.js\";\nimport { resolveModeConfig, type CliSpawnConfig, type SpawnOptions, type SpawnResult } from \"../types.js\";\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createActivityTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `Agent spawn timed out after ${timeoutMs / 1000}s of inactivity`\n );\n error.name = \"ActivityTimeoutError\";\n return error;\n}\n\nexport interface SpawnStreamingOptions extends SpawnOptions {\n agentId: string;\n}\n\nexport interface SpawnStreamingResult {\n events: AsyncIterable<AcpEvent>;\n done: Promise<SpawnResult>;\n}\n\nfunction isAcpEvent(value: unknown): value is AcpEvent {\n return !!value && typeof value === \"object\" && \"event\" in value;\n}\n\nfunction getDefaultArgsPosition(config: CliSpawnConfig): \"beforePrompt\" | \"afterPrompt\" {\n return config.defaultArgsPosition ?? \"afterPrompt\";\n}\n\nfunction getMcpArgsPosition(\n config: CliSpawnConfig\n): \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\" {\n if (config.mcpArgsPosition) {\n return config.mcpArgsPosition;\n }\n return config.mcpArgsBeforeCommand ? \"beforeCommand\" : \"afterCommand\";\n}\n\nexport function spawnStreaming(options: SpawnStreamingOptions): SpawnStreamingResult {\n if (options.signal?.aborted) {\n throw createAbortError();\n }\n\n const { agentId, binaryName, spawnConfig } = resolveConfig(options.agentId);\n\n if (spawnConfig === undefined) {\n throw new Error(`Agent \"${agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${agentId}\" does not support CLI spawn.`);\n }\n\n if (!binaryName) {\n throw new Error(`Agent \"${agentId}\" has no binaryName.`);\n }\n\n const mcpArgs = getMcpArgs(spawnConfig, options.mcpServers);\n const mcpEnvVars = getMcpEnv(spawnConfig, options.mcpServers);\n const defaultArgsPosition = getDefaultArgsPosition(spawnConfig);\n const mcpArgsPosition = getMcpArgsPosition(spawnConfig);\n const args: string[] = [];\n\n if (mcpArgsPosition === \"beforeCommand\") {\n args.push(...mcpArgs);\n }\n\n if (defaultArgsPosition === \"beforePrompt\") {\n args.push(...spawnConfig.defaultArgs);\n }\n\n if (mcpArgsPosition === \"beforePrompt\") {\n args.push(...mcpArgs);\n }\n\n args.push(spawnConfig.promptFlag);\n\n const useStdin = !!options.useStdin && !!spawnConfig.stdinMode;\n if (!useStdin || !spawnConfig.stdinMode?.omitPrompt) {\n args.push(options.prompt);\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n if (defaultArgsPosition === \"afterPrompt\") {\n args.push(...spawnConfig.defaultArgs);\n }\n\n if (mcpArgsPosition === \"afterCommand\") {\n args.push(...mcpArgs);\n }\n\n const modeResolved = resolveModeConfig(spawnConfig.modes[options.mode ?? \"yolo\"]);\n args.push(...modeResolved.args);\n\n if (useStdin) {\n args.push(...spawnConfig.stdinMode!.extraArgs);\n }\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const envOverrides = { ...mcpEnvVars, ...modeResolved.env };\n const child = spawnChildProcess(binaryName, args, {\n cwd: options.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: Object.keys(envOverrides).length > 0\n ? { ...process.env, ...envOverrides }\n : undefined\n });\n let aborted = false;\n let timedOut = false;\n const onAbort = () => {\n aborted = true;\n child.kill(\"SIGTERM\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n let activityTimer: ReturnType<typeof setTimeout> | undefined;\n const resetActivityTimer = options.activityTimeoutMs\n ? () => {\n if (activityTimer) clearTimeout(activityTimer);\n activityTimer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, options.activityTimeoutMs);\n }\n : undefined;\n\n resetActivityTimer?.();\n\n const result: SpawnResult = { stdout: \"\", stderr: \"\", exitCode: 1 };\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk) => {\n result.stderr += chunk;\n resetActivityTimer?.();\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n });\n\n if (useStdin) {\n child.stdin.write(options.prompt);\n }\n child.stdin.end();\n\n const adapter = getAdapter(spawnConfig.adapter);\n\n const events: AsyncIterable<AcpEvent> = (async function* () {\n for await (const output of adapter(readLines(child.stdout))) {\n if (!isAcpEvent(output)) continue;\n resetActivityTimer?.();\n yield output;\n }\n })();\n\n const done = new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (activityTimer) clearTimeout(activityTimer);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (activityTimer) clearTimeout(activityTimer);\n if (aborted) {\n reject(createAbortError());\n return;\n }\n if (timedOut) {\n reject(createActivityTimeoutError(options.activityTimeoutMs!));\n return;\n }\n result.exitCode = code ?? 1;\n resolve(result);\n });\n });\n\n return { events, done };\n}\n", "import path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir, open, type FileHandle } from \"node:fs/promises\";\nimport type { AcpEvent } from \"../types.js\";\nimport type { AcpMiddleware, SpawnContext } from \"../middleware.js\";\n\nfunction pad(value: number, width: number): string {\n return String(value).padStart(width, \"0\");\n}\n\nfunction formatTimestamp(date: Date): { day: string; time: string; milliseconds: string } {\n const day = `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1, 2)}${pad(date.getUTCDate(), 2)}`;\n const time = `${pad(date.getUTCHours(), 2)}${pad(date.getUTCMinutes(), 2)}${pad(date.getUTCSeconds(), 2)}`;\n const milliseconds = pad(date.getUTCMilliseconds(), 3);\n return { day, time, milliseconds };\n}\n\nfunction normalizeAgent(agent: string): string {\n let normalized = \"\";\n for (const char of agent) {\n const code = char.charCodeAt(0);\n const isLower = code >= 97 && code <= 122;\n const isUpper = code >= 65 && code <= 90;\n const isDigit = code >= 48 && code <= 57;\n\n if (isLower || isUpper || isDigit || char === \"-\" || char === \"_\") {\n normalized += char;\n } else {\n normalized += \"-\";\n }\n }\n\n return normalized.length > 0 ? normalized : \"agent\";\n}\n\nfunction resolveStartedAt(value: Date | undefined): Date {\n if (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n return new Date();\n }\n\n return value;\n}\n\nfunction resolveLogFilePath(ctx: SpawnContext): string {\n if (ctx.logPath) {\n return ctx.logPath;\n }\n const baseDir = ctx.logDir ?? path.join(homedir(), \".poe-code\", \"spawn-logs\");\n if (ctx.logFileName) {\n return path.join(baseDir, ctx.logFileName);\n }\n const startedAt = resolveStartedAt(ctx.startedAt);\n const { day, time, milliseconds } = formatTimestamp(startedAt);\n const fileName = `${day}-${time}-${milliseconds}-${normalizeAgent(ctx.agent)}.jsonl`;\n return path.join(baseDir, fileName);\n}\n\nclass SpawnLogWriter {\n private fileHandle: FileHandle | undefined;\n\n private isDisabled = false;\n\n readonly filePath: string;\n\n private readonly logDirPath: string;\n\n constructor(ctx: SpawnContext) {\n this.filePath = resolveLogFilePath(ctx);\n this.logDirPath = path.dirname(this.filePath);\n }\n\n async writeEvent(event: AcpEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n try {\n await this.ensureOpen();\n if (!this.fileHandle) {\n return;\n }\n\n const meta = (event as { _meta?: Record<string, unknown> })._meta;\n const toLog = meta?.raw ?? event;\n await this.fileHandle.appendFile(`${JSON.stringify(toLog)}\\n`, \"utf8\");\n } catch {\n this.isDisabled = true;\n await this.close();\n }\n }\n\n async close(): Promise<void> {\n if (!this.fileHandle) {\n return;\n }\n\n try {\n await this.fileHandle.close();\n } catch {\n // Ignore close errors to avoid disrupting event processing.\n } finally {\n this.fileHandle = undefined;\n }\n }\n\n private async ensureOpen(): Promise<void> {\n if (this.fileHandle || this.isDisabled) {\n return;\n }\n\n try {\n await mkdir(this.logDirPath, { recursive: true });\n this.fileHandle = await open(this.filePath, \"a\");\n } catch {\n this.isDisabled = true;\n }\n }\n}\n\nasync function writePreloadedEvents(writer: SpawnLogWriter, events: AcpEvent[]): Promise<void> {\n for (const event of events) {\n await writer.writeEvent(event);\n }\n}\n\nexport const spawnLog: AcpMiddleware = async (ctx, next) => {\n await next();\n\n const source = ctx.eventStream;\n const writer = new SpawnLogWriter(ctx);\n ctx.logFile = writer.filePath;\n\n await writePreloadedEvents(writer, ctx.events);\n\n if (!source) {\n await writer.close();\n return;\n }\n\n ctx.eventStream = (async function* () {\n try {\n for await (const event of source) {\n await writer.writeEvent(event);\n yield event;\n }\n } finally {\n await writer.close();\n }\n })();\n};\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { countTokens } from \"../../tokenfill/dist/index.js\";\nimport { listPages } from \"./pages.js\";\nimport type { MemoryRoot, TokenStats } from \"./types.js\";\n\nexport async function computeTokenStats(root: MemoryRoot): Promise<TokenStats> {\n if (!(await pathExists(root))) {\n return {\n memoryTokens: 0,\n sourceTokens: 0,\n reductionRatio: 0,\n missingSources: []\n };\n }\n\n const pages = await listPages(root);\n\n let memoryTokens = 0;\n const sourcePaths = new Set<string>();\n\n for (const page of pages) {\n memoryTokens += countTokens(page.body);\n for (const source of page.frontmatter.sources ?? []) {\n const normalized = source.path.trim();\n if (normalized.length > 0) {\n sourcePaths.add(normalized);\n }\n }\n }\n\n const repoRoot = path.resolve(root, \"..\", \"..\");\n\n let sourceTokens = 0;\n const missingSources: string[] = [];\n\n for (const sourcePath of sourcePaths) {\n const absPath = path.isAbsolute(sourcePath)\n ? sourcePath\n : path.resolve(repoRoot, sourcePath);\n try {\n const content = await fs.readFile(absPath, \"utf8\");\n sourceTokens += countTokens(content);\n } catch (error) {\n if (isMissing(error)) {\n missingSources.push(sourcePath);\n continue;\n }\n throw error;\n }\n }\n\n missingSources.sort((left, right) => left.localeCompare(right));\n\n const reductionRatio =\n sourceTokens === 0 ? 0 : sourceTokens / Math.max(memoryTokens, 1);\n\n return {\n memoryTokens,\n sourceTokens,\n reductionRatio,\n missingSources\n };\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.stat(targetPath);\n return true;\n } catch (error) {\n if (isMissing(error)) {\n return false;\n }\n throw error;\n }\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n", "import { get_encoding } from \"tiktoken\";\nexport const DEFAULT_ENCODING = \"cl100k_base\";\nexport function createTokenizer(options = {}) {\n const encoding = options.encoding ?? DEFAULT_ENCODING;\n const tokenizer = get_encoding(encoding);\n const utf8Decoder = new TextDecoder();\n const encode = (text) => tokenizer.encode(text);\n const decode = (tokens) => {\n const tokenArray = tokens instanceof Uint32Array ? tokens : Uint32Array.from(tokens);\n return utf8Decoder.decode(tokenizer.decode(tokenArray));\n };\n const count = (text) => encode(text).length;\n const truncate = (text, tokenCount) => {\n if (tokenCount <= 0) {\n return \"\";\n }\n const tokens = encode(text);\n if (tokens.length <= tokenCount) {\n return text;\n }\n return decode(tokens.slice(0, tokenCount));\n };\n return {\n encoding,\n encode,\n decode,\n count,\n truncate,\n free: () => tokenizer.free()\n };\n}\nlet defaultTokenizer;\nexport function countTokens(text) {\n defaultTokenizer ??= createTokenizer();\n return defaultTokenizer.count(text);\n}\n", "import { readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nexport const CORPUS_ARTICLE_SEPARATOR = \"\\n\\n\";\nconst corpusDirectoryPath = join(dirname(fileURLToPath(import.meta.url)), \"corpus\");\nfunction getCorpusFileNames() {\n return readdirSync(corpusDirectoryPath, { withFileTypes: true })\n .filter(entry => entry.isFile() && entry.name.endsWith(\".md\"))\n .map(entry => entry.name)\n .sort((left, right) => left.localeCompare(right));\n}\nfunction loadBuiltInCorpusArticles() {\n const corpusFileNames = getCorpusFileNames();\n if (corpusFileNames.length === 0) {\n throw new Error(`No built-in corpus markdown files found in ${corpusDirectoryPath}`);\n }\n return corpusFileNames.map(fileName => readFileSync(join(corpusDirectoryPath, fileName), \"utf8\").trim());\n}\nexport const BUILT_IN_CORPUS_ARTICLES = loadBuiltInCorpusArticles();\n", "import { BUILT_IN_CORPUS_ARTICLES, CORPUS_ARTICLE_SEPARATOR } from \"./corpus.js\";\nimport { createTokenizer } from \"./tokenizer.js\";\nconst builtInCorpusText = BUILT_IN_CORPUS_ARTICLES.join(CORPUS_ARTICLE_SEPARATOR);\nconst builtInCorpusByteLength = Buffer.byteLength(builtInCorpusText, \"utf8\");\nconst prefixCacheByEncoding = new Map();\nfunction getEncodingCache(encoding) {\n const cached = prefixCacheByEncoding.get(encoding);\n if (cached) {\n return cached;\n }\n const initial = {\n prefixCharLength: 0,\n prefixTokens: new Uint32Array(0)\n };\n prefixCacheByEncoding.set(encoding, initial);\n return initial;\n}\nfunction nextPrefixLength(currentLength, targetTokenCount) {\n if (currentLength === 0) {\n return Math.max(256, targetTokenCount * 8);\n }\n return Math.max(currentLength * 2, currentLength + 4096);\n}\nfunction ensurePrefixTokens(args) {\n const { cache, tokenCount, encode } = args;\n if (cache.prefixTokens.length >= tokenCount) {\n return cache.prefixTokens;\n }\n const corpusLength = builtInCorpusText.length;\n while (cache.prefixTokens.length < tokenCount &&\n cache.prefixCharLength < corpusLength) {\n const nextLength = Math.min(corpusLength, nextPrefixLength(cache.prefixCharLength, tokenCount));\n cache.prefixCharLength = nextLength;\n cache.prefixTokens = encode(builtInCorpusText.slice(0, nextLength));\n }\n return cache.prefixTokens;\n}\nexport function tokenfill(tokenCount, options = {}) {\n if (!Number.isInteger(tokenCount) || tokenCount < 0) {\n throw new TypeError(`tokenCount must be a non-negative integer, received ${tokenCount}`);\n }\n if (tokenCount > builtInCorpusByteLength) {\n throw new Error(`Requested token count ${tokenCount} exceeds built-in corpus size ${builtInCorpusByteLength} for encoding ${options.encoding ?? \"default\"}`);\n }\n const tokenizer = createTokenizer({ encoding: options.encoding });\n try {\n const cache = getEncodingCache(tokenizer.encoding);\n const prefixTokens = ensurePrefixTokens({\n cache,\n tokenCount,\n encode: tokenizer.encode\n });\n if (prefixTokens.length < tokenCount) {\n throw new Error(`Requested token count ${tokenCount} exceeds built-in corpus size ${prefixTokens.length} for encoding ${tokenizer.encoding}`);\n }\n const text = tokenizer.decode(prefixTokens.slice(0, tokenCount));\n return {\n text,\n actualTokens: tokenCount\n };\n }\n finally {\n tokenizer.free();\n }\n}\n", "import * as readline from \"readline\";\nimport type {\n ServerOptions,\n ToolDefinition,\n ToolHandler,\n CallToolResult,\n HandleResult,\n InitializeResult,\n Tool,\n Transport,\n JSONSchema,\n SDKTransport,\n JSONRPCMessage,\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES, ToolError } from \"./types.js\";\nimport {\n parseMessage,\n formatSuccessResponse,\n formatErrorResponse,\n} from \"./jsonrpc.js\";\nimport type { TypedSchema } from \"./schema.js\";\nimport { toContentBlocks } from \"./content/convert.js\";\n\nconst PROTOCOL_VERSION = \"2025-11-25\";\n\nexport interface Server {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server;\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void;\n removeTool(name: string): boolean;\n notifyToolsChanged(): Promise<void>;\n handleMessage(\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult>;\n listen(): Promise<void>;\n connect(transport: Transport): Promise<void>;\n connectSDK(transport: SDKTransport): Promise<void>;\n}\n\nexport function createServer(options: ServerOptions): Server {\n const tools = new Map<string, ToolDefinition>();\n const notificationListeners = new Set<\n (notification: JSONRPCNotification) => void\n >();\n let initialized = false;\n\n const handleMessage = async (\n method: string,\n params?: Record<string, unknown>\n ): Promise<HandleResult> => {\n // Allow ping and initialize before initialization\n if (method === \"ping\") {\n return { result: {} };\n }\n\n if (method === \"initialize\") {\n initialized = true;\n const requestedProtocol =\n typeof params?.protocolVersion === \"string\"\n ? params.protocolVersion\n : null;\n const result: InitializeResult = {\n protocolVersion: requestedProtocol ?? PROTOCOL_VERSION,\n capabilities: {\n tools: {\n listChanged: true,\n },\n },\n serverInfo: {\n name: options.name,\n version: options.version,\n },\n };\n return { result };\n }\n\n if (method === \"notifications/initialized\") {\n return { result: undefined };\n }\n\n // All other methods require initialization\n if (!initialized) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Server not initialized\",\n },\n };\n }\n\n if (method === \"tools/list\") {\n const toolList: Tool[] = [];\n for (const tool of tools.values()) {\n toolList.push({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n });\n }\n return { result: { tools: toolList } };\n }\n\n if (method === \"tools/call\") {\n const toolName = params?.name as string | undefined;\n const toolArgs = (params?.arguments as Record<string, unknown>) || {};\n\n if (!toolName) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: \"Tool name required\",\n },\n };\n }\n\n const tool = tools.get(toolName);\n if (!tool) {\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n message: `Tool not found: ${toolName}`,\n },\n };\n }\n\n try {\n const handlerResult = await tool.handler(toolArgs);\n const result: CallToolResult = isCallToolResult(handlerResult)\n ? handlerResult\n : { content: toContentBlocks(handlerResult) };\n return { result };\n } catch (err) {\n if (err instanceof ToolError) {\n return {\n error: {\n code: err.code,\n message: err.message,\n },\n };\n }\n\n const errorMessage =\n err instanceof Error ? err.message : String(err);\n const result: CallToolResult = {\n content: [{ type: \"text\", text: `Error: ${errorMessage}` }],\n isError: true,\n };\n return { result };\n }\n }\n\n return {\n error: {\n code: JSON_RPC_ERROR_CODES.METHOD_NOT_FOUND,\n message: \"Method not found\",\n },\n };\n };\n\n const processLine = async (\n line: string,\n write: (data: string) => void\n ): Promise<void> => {\n const parsed = parseMessage(line);\n\n if (!parsed.success) {\n write(formatErrorResponse(parsed.id, parsed.error) + \"\\n\");\n return;\n }\n\n const { request, isNotification } = parsed;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (isNotification) {\n return;\n }\n\n const requestWithId = request as JSONRPCRequest;\n\n if (error) {\n write(formatErrorResponse(requestWithId.id, error) + \"\\n\");\n } else if (result !== undefined) {\n write(formatSuccessResponse(requestWithId.id, result) + \"\\n\");\n }\n };\n\n const broadcastNotification = (method: string): void => {\n const notification: JSONRPCNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n for (const listener of notificationListeners) {\n listener(notification);\n }\n };\n\n const server: Server = {\n tool<T>(\n name: string,\n description: string,\n inputSchema: TypedSchema<T>,\n handler: ToolHandler<T>\n ): Server {\n tools.set(name, {\n name,\n description,\n inputSchema: inputSchema as JSONSchema,\n handler: handler as ToolHandler,\n });\n return server;\n },\n\n onNotification(\n listener: (notification: JSONRPCNotification) => void\n ): () => void {\n notificationListeners.add(listener);\n return () => {\n notificationListeners.delete(listener);\n };\n },\n\n removeTool(name: string): boolean {\n return tools.delete(name);\n },\n\n async notifyToolsChanged(): Promise<void> {\n if (initialized) {\n broadcastNotification(\"notifications/tools/list_changed\");\n }\n },\n\n handleMessage,\n\n async listen(): Promise<void> {\n return server.connect({\n readable: process.stdin,\n writable: process.stdout,\n });\n },\n\n async connect(transport: Transport): Promise<void> {\n return new Promise((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n transport.writable.write(`${JSON.stringify(notification)}\\n`);\n });\n const rl = readline.createInterface({\n input: transport.readable,\n crlfDelay: Infinity,\n });\n\n rl.on(\"line\", (line) => {\n processLine(line, (data) => transport.writable.write(data));\n });\n\n rl.on(\"close\", () => {\n unsubscribe();\n resolve();\n });\n });\n },\n\n async connectSDK(transport: SDKTransport): Promise<void> {\n return new Promise<void>((resolve) => {\n const unsubscribe = server.onNotification((notification) => {\n void transport.send(notification);\n });\n\n transport.onmessage = async (message: JSONRPCMessage) => {\n // Ignore responses (we only handle requests/notifications)\n if (!(\"method\" in message)) {\n return;\n }\n\n // Handle notifications (no id) - don't respond\n if (!(\"id\" in message) || message.id === undefined) {\n await server.handleMessage(message.method, message.params);\n return;\n }\n\n const request = message as JSONRPCRequest;\n const { result, error } = await server.handleMessage(\n request.method,\n request.params\n );\n\n if (error) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n error,\n };\n await transport.send(response);\n } else if (result !== undefined) {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id: request.id,\n result,\n };\n await transport.send(response);\n }\n };\n\n transport.onclose = () => {\n unsubscribe();\n resolve();\n };\n\n transport.start();\n });\n },\n };\n\n return server;\n}\n\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (typeof value !== \"object\" || value === null || !(\"content\" in value)) {\n return false;\n }\n\n return Array.isArray((value as { content: unknown }).content);\n}\n", "// JSON-RPC 2.0 types\nexport interface JSONRPCRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JSONRPCResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n result?: unknown;\n error?: JSONRPCError;\n}\n\nexport interface JSONRPCError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n// JSON-RPC error codes\nexport const JSON_RPC_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603\n} as const;\n\nexport class ToolError extends Error {\n constructor(\n public readonly code: number,\n message: string\n ) {\n super(message);\n this.name = \"ToolError\";\n }\n}\n\n// MCP protocol types\nexport interface ToolsCapability {\n listChanged?: boolean;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: {\n tools?: ToolsCapability;\n };\n serverInfo: {\n name: string;\n version: string;\n };\n}\n\nexport interface Tool {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface HandleResult {\n result?: unknown;\n error?: { code: number; message: string };\n}\n\n// ContentItem is a union of all possible content block types\nexport type ContentItem =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; mimeType: string; text: string }\n | { uri: string; mimeType: string; blob: string };\n };\n\nexport interface JSONSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n}\n\nexport interface JSONSchemaProperty {\n type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n description?: string;\n}\n\n// Server types\nexport interface ServerOptions {\n name: string;\n version: string;\n}\n\nimport type { ToolReturn } from \"./content/index.js\";\n\nexport type ToolHandler<T = Record<string, unknown>> = (\n args: T\n) => Promise<ToolReturn | CallToolResult> | ToolReturn | CallToolResult;\n\nexport interface ToolDefinition<T = Record<string, unknown>> {\n name: string;\n description: string;\n inputSchema: JSONSchema;\n handler: ToolHandler<T>;\n}\n\n// Transport types\nexport interface Transport {\n readable: NodeJS.ReadableStream;\n writable: NodeJS.WritableStream;\n}\n\n// SDK-compatible transport interface\nexport interface SDKTransport {\n onmessage?: (message: JSONRPCMessage) => void;\n onclose?: () => void;\n onerror?: (error: Error) => void;\n start: () => Promise<void>;\n close: () => Promise<void>;\n send: (message: JSONRPCMessage) => Promise<void>;\n}\n\nexport type JSONRPCMessage = JSONRPCRequest | JSONRPCResponse | JSONRPCNotification;\n\nexport interface JSONRPCNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n}\n", "import type {\n JSONRPCRequest,\n JSONRPCResponse,\n JSONRPCError,\n JSONRPCNotification,\n} from \"./types.js\";\nimport { JSON_RPC_ERROR_CODES } from \"./types.js\";\n\nexport interface ParseResult {\n success: true;\n request: JSONRPCRequest | JSONRPCNotification;\n isNotification: boolean;\n}\n\nexport interface ParseError {\n success: false;\n error: JSONRPCError;\n id: string | number | null;\n}\n\nexport function parseMessage(line: string): ParseResult | ParseError {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.PARSE_ERROR,\n message: \"Parse error\",\n },\n id: null,\n };\n }\n\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n const obj = parsed as Record<string, unknown>;\n const hasId = \"id\" in obj;\n const id = typeof obj.id === \"string\" || typeof obj.id === \"number\" ? obj.id : null;\n\n if (obj.jsonrpc !== \"2.0\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (typeof obj.method !== \"string\") {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id,\n };\n }\n\n if (!hasId) {\n return {\n success: true,\n isNotification: true,\n request: {\n jsonrpc: \"2.0\",\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n }\n\n if (id === null) {\n return {\n success: false,\n error: {\n code: JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n message: \"Invalid Request\",\n },\n id: null,\n };\n }\n\n return {\n success: true,\n isNotification: false,\n request: {\n jsonrpc: \"2.0\",\n id,\n method: obj.method,\n params: obj.params as Record<string, unknown> | undefined,\n },\n };\n}\n\nexport function formatSuccessResponse(\n id: string | number | null,\n result: unknown\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n result,\n };\n return JSON.stringify(response);\n}\n\nexport function formatErrorResponse(\n id: string | number | null,\n error: JSONRPCError\n): string {\n const response: JSONRPCResponse = {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n return JSON.stringify(response);\n}\n", "/**\n * Minimal magic bytes detection for common media types.\n * This can be replaced with `file-type` package (https://npm.im/file-type)\n * if more comprehensive detection is needed. The API is designed to be\n * compatible: fileTypeFromBuffer(data) returns { mime: string, ext: string } | undefined\n */\n\nexport interface FileTypeResult {\n mime: string;\n ext: string;\n}\n\nexport function fileTypeFromBuffer(data: Uint8Array): FileTypeResult | undefined {\n if (data.length < 12) {\n return undefined;\n }\n\n // PNG: 89 50 4E 47 0D 0A 1A 0A\n if (\n data[0] === 0x89 &&\n data[1] === 0x50 &&\n data[2] === 0x4e &&\n data[3] === 0x47 &&\n data[4] === 0x0d &&\n data[5] === 0x0a &&\n data[6] === 0x1a &&\n data[7] === 0x0a\n ) {\n return { mime: \"image/png\", ext: \"png\" };\n }\n\n // JPEG: FF D8 FF\n if (data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff) {\n return { mime: \"image/jpeg\", ext: \"jpg\" };\n }\n\n // GIF: 47 49 46 38 (GIF8)\n if (\n data[0] === 0x47 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x38\n ) {\n return { mime: \"image/gif\", ext: \"gif\" };\n }\n\n // WEBP: 52 49 46 46 ... 57 45 42 50 (RIFF...WEBP)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x45 &&\n data[10] === 0x42 &&\n data[11] === 0x50\n ) {\n return { mime: \"image/webp\", ext: \"webp\" };\n }\n\n // MP3: FF FB or FF FA (MPEG audio) or 49 44 33 (ID3 tag)\n if (\n (data[0] === 0xff && (data[1] === 0xfb || data[1] === 0xfa)) ||\n (data[0] === 0x49 && data[1] === 0x44 && data[2] === 0x33)\n ) {\n return { mime: \"audio/mpeg\", ext: \"mp3\" };\n }\n\n // WAV: 52 49 46 46 ... 57 41 56 45 (RIFF...WAVE)\n if (\n data[0] === 0x52 &&\n data[1] === 0x49 &&\n data[2] === 0x46 &&\n data[3] === 0x46 &&\n data[8] === 0x57 &&\n data[9] === 0x41 &&\n data[10] === 0x56 &&\n data[11] === 0x45\n ) {\n return { mime: \"audio/wav\", ext: \"wav\" };\n }\n\n // OGG: 4F 67 67 53 (OggS)\n if (\n data[0] === 0x4f &&\n data[1] === 0x67 &&\n data[2] === 0x67 &&\n data[3] === 0x53\n ) {\n return { mime: \"audio/ogg\", ext: \"ogg\" };\n }\n\n // M4A: MP4 container with audio - check for M4A brand at offset 8\n // ftyp followed by M4A brand\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70 &&\n data[8] === 0x4d &&\n data[9] === 0x34 &&\n data[10] === 0x41\n ) {\n return { mime: \"audio/mp4\", ext: \"m4a\" };\n }\n\n // MP4: ... 66 74 79 70 (ftyp box, offset 4)\n if (\n data[4] === 0x66 &&\n data[5] === 0x74 &&\n data[6] === 0x79 &&\n data[7] === 0x70\n ) {\n return { mime: \"video/mp4\", ext: \"mp4\" };\n }\n\n // WEBM: 1A 45 DF A3 (EBML header)\n if (\n data[0] === 0x1a &&\n data[1] === 0x45 &&\n data[2] === 0xdf &&\n data[3] === 0xa3\n ) {\n return { mime: \"video/webm\", ext: \"webm\" };\n }\n\n return undefined;\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_IMAGE_MIMES = new Set([\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n]);\n\nexport class Image {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Image> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch image from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_IMAGE_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect image MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Image {\n let mimeType: string;\n\n if (format) {\n mimeType = format.includes(\"/\") ? format : `image/${format}`;\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_IMAGE_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect image MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Image(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Image {\n return new Image(base64, mimeType);\n }\n\n toContentBlock(): ImageContent {\n return {\n type: \"image\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nconst SUPPORTED_AUDIO_MIMES = new Set([\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/ogg\",\n \"audio/mp4\",\n]);\n\nconst AUDIO_FORMAT_MAP: Record<string, string> = {\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n ogg: \"audio/ogg\",\n m4a: \"audio/mp4\",\n mpeg: \"audio/mpeg\",\n};\n\nexport class Audio {\n private constructor(\n private readonly base64Data: string,\n private readonly mimeType: string\n ) {}\n\n static async fromUrl(url: string): Promise<Audio> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch audio from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected && SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType && SUPPORTED_AUDIO_MIMES.has(contentType)) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect audio MIME type from ${url}`);\n }\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBytes(data: Uint8Array, format?: string): Audio {\n let mimeType: string;\n\n if (format) {\n if (format.includes(\"/\")) {\n mimeType = format;\n } else {\n mimeType = AUDIO_FORMAT_MAP[format.toLowerCase()] || `audio/${format}`;\n }\n } else {\n const detected = fileTypeFromBuffer(data);\n if (!detected || !SUPPORTED_AUDIO_MIMES.has(detected.mime)) {\n throw new Error(\"Unable to detect audio MIME type from bytes\");\n }\n mimeType = detected.mime;\n }\n\n const base64 = Buffer.from(data).toString(\"base64\");\n return new Audio(base64, mimeType);\n }\n\n static fromBase64(base64: string, mimeType: string): Audio {\n return new Audio(base64, mimeType);\n }\n\n toContentBlock(): AudioContent {\n return {\n type: \"audio\",\n data: this.base64Data,\n mimeType: this.mimeType,\n };\n }\n}\n", "import { fileTypeFromBuffer } from \"./mime.js\";\n\nexport interface TextResourceContents {\n uri: string;\n mimeType: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType: string;\n blob: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: TextResourceContents | BlobResourceContents;\n}\n\nfunction isTextMimeType(mimeType: string): boolean {\n return (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\" ||\n mimeType === \"application/javascript\" ||\n mimeType === \"application/typescript\"\n );\n}\n\nexport class File {\n private constructor(\n private readonly data: Uint8Array | string,\n private readonly mimeType: string,\n private readonly isText: boolean,\n private readonly name?: string\n ) {}\n\n static async fromUrl(url: string): Promise<File> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file from ${url}: ${response.status} ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const data = new Uint8Array(arrayBuffer);\n\n const detected = fileTypeFromBuffer(data);\n let mimeType: string;\n\n if (detected) {\n mimeType = detected.mime;\n } else {\n const contentType = response.headers.get(\"content-type\")?.split(\";\")[0];\n if (contentType) {\n mimeType = contentType;\n } else {\n throw new Error(`Unable to detect MIME type from ${url}`);\n }\n }\n\n const isText = isTextMimeType(mimeType);\n const name = url.split(\"/\").pop() || \"file\";\n\n return new File(data, mimeType, isText, name);\n }\n\n static fromBytes(data: Uint8Array, mimeType: string): File {\n const isText = isTextMimeType(mimeType);\n return new File(data, mimeType, isText);\n }\n\n static fromText(text: string, mimeType = \"text/plain\"): File {\n return new File(text, mimeType, true);\n }\n\n static fromBase64(base64: string, mimeType: string): File {\n const data = Buffer.from(base64, \"base64\");\n const isText = isTextMimeType(mimeType);\n return new File(new Uint8Array(data), mimeType, isText);\n }\n\n toContentBlock(): EmbeddedResource {\n const uri = this.name ? `file:///${this.name}` : \"file:///data\";\n\n if (this.isText) {\n let text: string;\n if (typeof this.data === \"string\") {\n text = this.data;\n } else {\n text = new TextDecoder(\"utf-8\").decode(this.data);\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n text,\n } as TextResourceContents,\n };\n } else {\n let blob: string;\n if (typeof this.data === \"string\") {\n blob = Buffer.from(this.data).toString(\"base64\");\n } else {\n blob = Buffer.from(this.data).toString(\"base64\");\n }\n\n return {\n type: \"resource\",\n resource: {\n uri,\n mimeType: this.mimeType,\n blob,\n } as BlobResourceContents,\n };\n }\n }\n}\n", "import { Image, type ImageContent } from \"./image.js\";\nimport { Audio, type AudioContent } from \"./audio.js\";\nimport { File, type EmbeddedResource } from \"./file.js\";\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport type ContentBlock = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\ntype JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type ToolReturn =\n | undefined\n | JsonPrimitive\n | JsonObject\n | Image\n | Audio\n | File\n | ContentBlock\n | Array<undefined | JsonPrimitive | JsonObject | Image | Audio | File | ContentBlock>;\n\nfunction convertSingleValue(value: Exclude<ToolReturn, Array<unknown> | undefined>): ContentBlock {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return { type: \"text\", text: String(value) };\n }\n\n if (value === null) {\n return { type: \"text\", text: \"null\" };\n }\n\n if (value instanceof Image) {\n return value.toContentBlock();\n }\n\n if (value instanceof Audio) {\n return value.toContentBlock();\n }\n\n if (value instanceof File) {\n return value.toContentBlock();\n }\n\n if (isContentBlock(value)) {\n return value;\n }\n\n return { type: \"text\", text: JSON.stringify(value) };\n}\n\nexport function toContentBlocks(result: ToolReturn): ContentBlock[] {\n if (result === undefined) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.flatMap((item) => toContentBlocks(item));\n }\n\n return [convertSingleValue(result)];\n}\n\nfunction isContentBlock(value: object): value is ContentBlock {\n if (!(\"type\" in value) || typeof value.type !== \"string\") {\n return false;\n }\n\n return (\n value.type === \"text\" ||\n value.type === \"image\" ||\n value.type === \"audio\" ||\n value.type === \"resource\"\n );\n}\n", "import type { JSONSchema } from \"./types.js\";\n\ntype SchemaPropertyType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n\ninterface SchemaPropertyDef {\n type: SchemaPropertyType;\n description?: string;\n optional?: boolean;\n}\n\ntype SchemaDefinition = Record<string, SchemaPropertyDef>;\n\ntype InferType<T extends SchemaPropertyType> = T extends \"string\"\n ? string\n : T extends \"number\"\n ? number\n : T extends \"boolean\"\n ? boolean\n : T extends \"object\"\n ? Record<string, unknown>\n : T extends \"array\"\n ? unknown[]\n : never;\n\ntype InferSchema<T extends SchemaDefinition> = {\n [K in keyof T as T[K][\"optional\"] extends true ? never : K]: InferType<\n T[K][\"type\"]\n >;\n} & {\n [K in keyof T as T[K][\"optional\"] extends true ? K : never]?: InferType<\n T[K][\"type\"]\n >;\n};\n\nexport interface TypedSchema<T> extends JSONSchema {\n __type?: T;\n}\n\nexport function defineSchema<T extends SchemaDefinition>(\n definition: T\n): TypedSchema<InferSchema<T>> {\n const properties: JSONSchema[\"properties\"] = {};\n const required: string[] = [];\n\n for (const [key, prop] of Object.entries(definition)) {\n properties[key] = {\n type: prop.type,\n ...(prop.description !== undefined && { description: prop.description }),\n };\n if (!prop.optional) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n}\n", "import { createServer, defineSchema } from \"tiny-stdio-mcp-server\";\nimport type { Server } from \"tiny-stdio-mcp-server\";\nimport type { MemoryHandle } from \"./handle.js\";\n\nexport async function startMemoryMcpServer(\n handle: MemoryHandle,\n opts: { allowWrites: boolean }\n): Promise<{ stop: () => Promise<void>; server: Server }> {\n const server = createServer({\n name: \"poe-code-memory\",\n version: \"0.0.1\"\n });\n\n server.tool(\"list_pages\", \"List memory pages.\", defineSchema({}), async () => ({\n pages: (await handle.listPages()).map((page) => ({\n rel_path: page.relPath,\n description: page.frontmatter.description ?? \"\"\n }))\n }));\n\n server.tool(\n \"read_page\",\n \"Read a memory page.\",\n defineSchema({ rel_path: { type: \"string\" } }),\n async ({ rel_path }: { rel_path: string }) => {\n const page = await handle.readPage(rel_path);\n return {\n rel_path: page.relPath,\n frontmatter: page.frontmatter,\n body: page.body,\n bytes: page.bytes\n };\n }\n );\n\n server.tool(\n \"search_memory\",\n \"Search memory pages.\",\n defineSchema({\n query: { type: \"string\" },\n limit: { type: \"number\", optional: true }\n }),\n async ({ query, limit }: { query: string; limit?: number }) => {\n const hits = await handle.searchMemory(query);\n return { hits: typeof limit === \"number\" ? hits.slice(0, limit) : hits };\n }\n );\n\n server.tool(\"status\", \"Show memory status.\", defineSchema({}), async () => handle.statusOf());\n\n if (opts.allowWrites) {\n server.tool(\n \"append_to_page\",\n \"Append content to a memory page.\",\n defineSchema({\n rel_path: { type: \"string\" },\n content: { type: \"string\" },\n reason: { type: \"string\" }\n }),\n async ({ rel_path, content, reason }: { rel_path: string; content: string; reason: string }) => ({\n diff: await handle.appendToPage(rel_path, content, { reason })\n })\n );\n }\n\n return {\n server,\n stop: async () => {},\n };\n}\n\nexport function printMcpConfig(): string {\n return JSON.stringify(\n {\n mcpServers: {\n \"poe-code-memory\": {\n type: \"stdio\",\n command: \"poe-code\",\n args: [\"memory-mcp\"]\n }\n }\n },\n null,\n 2\n );\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return os.homedir();\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? os.homedir() : path.join(os.homedir(), remainder);\n}\n\nexport function resolveSkillDir(config: AgentSkillConfig, scope: SkillScope, cwd: string): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { TemplateLoader } from \"@poe-code/config-mutations\";\n\nconst TEMPLATE_IDS = [\"poe-generate.md\", \"terminal-pilot.md\"] as const;\ntype TemplateId = (typeof TEMPLATE_IDS)[number];\n\nconst cache = new Map<TemplateId, string>();\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await stat(target);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function findPackageRoot(entryFilePath: string): Promise<string> {\n let current = path.dirname(entryFilePath);\n while (true) {\n if (await pathExists(path.join(current, \"package.json\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(\"Unable to locate package root for agent-skill-config templates.\");\n }\n current = parent;\n }\n}\n\nasync function resolveTemplatePath(templateId: TemplateId): Promise<string> {\n const packageRoot = await findPackageRoot(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(packageRoot, \"src\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", \"skill\", templateId)\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Template not found: ${templateId}`);\n}\n\nfunction isKnownTemplate(templateId: string): templateId is TemplateId {\n return (TEMPLATE_IDS as readonly string[]).includes(templateId);\n}\n\nexport async function loadTemplate(templateId: string): Promise<string> {\n if (!isKnownTemplate(templateId)) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const cached = cache.get(templateId);\n if (cached !== undefined) {\n return cached;\n }\n\n const resolved = await resolveTemplatePath(templateId);\n const content = await readFile(resolved, \"utf8\");\n cache.set(templateId, content);\n return content;\n}\n\nexport function createTemplateLoader(): TemplateLoader {\n return loadTemplate;\n}\n", "import { fileMutation, runMutations, templateMutation } from \"@poe-code/config-mutations\";\nimport { resolveAgentSupport } from \"./configs.js\";\nimport { createTemplateLoader } from \"./templates.js\";\nimport type { ApplyOptions, SkillFile } from \"./types.js\";\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction toHomeRelative(localSkillDir: string): string {\n if (localSkillDir.startsWith(\"~/\") || localSkillDir === \"~\") {\n return localSkillDir;\n }\n\n const normalized = localSkillDir.startsWith(\"./\")\n ? localSkillDir.slice(2)\n : localSkillDir;\n\n return `~/${normalized}`;\n}\n\nconst bundledSkillTemplateIds = [\"poe-generate.md\"] as const;\n\nexport async function configure(agentId: string, options: ApplyOptions): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillDir,\n label: `Ensure directory ${skillDir}`\n }),\n ...bundledSkillTemplateIds.map((templateId) =>\n templateMutation.write({\n target: `${skillDir}/${templateId}`,\n templateId,\n label: `Write bundled skill ${templateId} to ${skillDir}`\n })\n )\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: createTemplateLoader()\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n options: ApplyOptions & { force?: boolean }\n): Promise<void> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"global\";\n const config = support.config!;\n\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const homeDir = scope === \"global\" ? options.homeDir : options.cwd;\n\n await runMutations(\n [\n fileMutation.removeDirectory({\n path: skillDir,\n force: options.force,\n label: `Remove skills directory ${skillDir}`\n })\n ],\n {\n fs: options.fs,\n homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport type InstallSkillOptions = {\n fs: ApplyOptions[\"fs\"];\n cwd: string;\n homeDir: string;\n scope: ApplyOptions[\"scope\"];\n dryRun?: boolean;\n observers?: ApplyOptions[\"observers\"];\n};\n\nexport type InstallSkillResult = {\n skillPath: string;\n displayPath: string;\n};\n\nconst SKILL_TEMPLATE_ID = \"__skill_content__\";\n\n/**\n * Install a skill for an agent.\n * Creates folder structure: skillDir/<skill.name>/SKILL.md\n */\nexport async function installSkill(\n agentId: string,\n skill: SkillFile,\n options: InstallSkillOptions\n): Promise<InstallSkillResult> {\n const support = resolveAgentSupport(agentId);\n if (support.status !== \"supported\") {\n throw new UnsupportedAgentError(agentId);\n }\n\n const scope = options.scope ?? \"local\";\n const config = support.config!;\n\n // Use home-relative paths for mutations (same pattern as configure/unconfigure)\n const skillDir =\n scope === \"global\" ? config.globalSkillDir : toHomeRelative(config.localSkillDir);\n const skillFolderPath = `${skillDir}/${skill.name}`;\n const skillFilePath = `${skillFolderPath}/SKILL.md`;\n const displayPath = `${scope === \"global\" ? config.globalSkillDir : config.localSkillDir}/${skill.name}/SKILL.md`;\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: skillFolderPath,\n label: `Ensure skill directory ${skill.name}`\n }),\n templateMutation.write({\n target: skillFilePath,\n templateId: SKILL_TEMPLATE_ID,\n label: `Write skill ${skill.name}`\n })\n ],\n {\n fs: options.fs,\n homeDir: scope === \"global\" ? options.homeDir : options.cwd,\n dryRun: options.dryRun,\n observers: options.observers,\n templates: async (templateId) => {\n if (templateId === SKILL_TEMPLATE_ID) {\n return skill.content;\n }\n throw new Error(`Unknown template: ${templateId}`);\n }\n }\n );\n\n return { skillPath: skillFilePath, displayPath };\n}\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { ShapeName } from \"./shapes.js\";\n\nexport type ConfigFormat = \"json\" | \"toml\" | \"yaml\";\nexport type Platform = \"darwin\" | \"linux\" | \"win32\";\n\nexport interface AgentMcpConfig {\n configFile: string | ((platform: Platform) => string);\n configKey: string;\n format: ConfigFormat;\n shape: ShapeName;\n mcpOutputFormat?: string;\n}\n\nconst agentMcpConfigs: Record<string, AgentMcpConfig> = {\n \"claude-code\": {\n configFile: \"~/.claude.json\",\n configKey: \"mcpServers\",\n format: \"json\",\n shape: \"standard\"\n },\n \"claude-desktop\": {\n configFile: (platform: Platform) => {\n switch (platform) {\n case \"darwin\":\n return \"~/Library/Application Support/Claude/claude_desktop_config.json\";\n case \"win32\":\n return \"~/AppData/Roaming/Claude/claude_desktop_config.json\";\n default:\n return \"~/.config/Claude/claude_desktop_config.json\";\n }\n },\n configKey: \"mcpServers\",\n format: \"json\",\n shape: \"standard\",\n mcpOutputFormat: \"markdown_instructions\"\n },\n codex: {\n configFile: \"~/.codex/config.toml\",\n configKey: \"mcp_servers\",\n format: \"toml\",\n shape: \"standard\"\n },\n opencode: {\n configFile: \"~/.config/opencode/opencode.json\",\n configKey: \"mcp\",\n format: \"json\",\n shape: \"opencode\"\n },\n kimi: {\n configFile: \"~/.kimi/mcp.json\",\n configKey: \"mcpServers\",\n format: \"json\",\n shape: \"standard\"\n },\n goose: {\n configFile: \"~/.config/goose/config.yaml\",\n configKey: \"extensions\",\n format: \"yaml\",\n shape: \"goose\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentMcpConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentMcpConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentMcpConfig> = agentMcpConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function isSupported(agentId: string): boolean {\n return resolveAgentSupport(agentId).status === \"supported\";\n}\n\nexport function getAgentConfig(agentId: string): AgentMcpConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nexport function resolveConfigPath(\n config: AgentMcpConfig,\n platform: Platform\n): string {\n if (typeof config.configFile === \"function\") {\n return config.configFile(platform);\n }\n return config.configFile;\n}\n", "import path from \"node:path\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport {\n runMutations,\n configMutation,\n fileMutation,\n readFileIfExists,\n type ConfigObject\n} from \"@poe-code/config-mutations\";\nimport type { McpServerEntry, ApplyOptions } from \"./types.js\";\nimport {\n getAgentConfig,\n resolveConfigPath,\n isSupported\n} from \"./configs.js\";\nimport { getShapeTransformer } from \"./shapes.js\";\n\nfunction getConfigDirectory(configPath: string): string {\n return path.dirname(configPath);\n}\n\nexport class UnsupportedAgentError extends Error {\n constructor(agentId: string) {\n super(`Unsupported agent: ${agentId}`);\n this.name = \"UnsupportedAgentError\";\n }\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction resolveServerMap(\n document: ConfigObject,\n configKey: string\n): ConfigObject {\n const value = document[configKey];\n return isConfigObject(value) ? value : {};\n}\n\nfunction mergeServerMap(\n document: ConfigObject,\n configKey: string,\n servers: ConfigObject\n): ConfigObject {\n return { ...document, [configKey]: servers };\n}\n\nfunction expandHomePath(configPath: string, homeDir: string): string {\n if (!configPath.startsWith(\"~\")) {\n return configPath;\n }\n\n if (configPath === \"~\") {\n return homeDir;\n }\n\n if (configPath.startsWith(\"~/\")) {\n return path.join(homeDir, configPath.slice(2));\n }\n\n return path.join(homeDir, configPath.slice(1));\n}\n\nfunction parseYamlDocument(content: string): ConfigObject {\n if (content.trim() === \"\") {\n return {};\n }\n\n const parsed = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML document to be an object.\");\n }\n\n return parsed;\n}\n\nfunction serializeYamlDocument(document: ConfigObject): string {\n const serialized = stringifyYaml(document);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nasync function readYamlConfig(\n configPath: string,\n options: ApplyOptions\n): Promise<ConfigObject> {\n const absolutePath = expandHomePath(configPath, options.homeDir);\n const existingContent = await readFileIfExists(options.fs, absolutePath);\n\n if (existingContent === null) {\n return {};\n }\n\n return parseYamlDocument(existingContent);\n}\n\nasync function writeYamlConfig(\n configPath: string,\n document: ConfigObject,\n options: ApplyOptions\n): Promise<void> {\n if (options.dryRun) {\n return;\n }\n\n const absolutePath = expandHomePath(configPath, options.homeDir);\n const configDir = path.dirname(absolutePath);\n\n await options.fs.mkdir(configDir, { recursive: true });\n await options.fs.writeFile(absolutePath, serializeYamlDocument(document), {\n encoding: \"utf8\"\n });\n}\n\nfunction removeServer(\n document: ConfigObject,\n configKey: string,\n serverName: string\n): { changed: boolean; content: ConfigObject } {\n const servers = resolveServerMap(document, configKey);\n if (!(serverName in servers)) {\n return { changed: false, content: document };\n }\n\n const nextServers = { ...servers };\n delete nextServers[serverName];\n\n if (Object.keys(nextServers).length === 0) {\n const nextDocument = { ...document };\n delete nextDocument[configKey];\n return { changed: true, content: nextDocument };\n }\n\n return {\n changed: true,\n content: mergeServerMap(document, configKey, nextServers)\n };\n}\n\nexport async function configure(\n agentId: string,\n server: McpServerEntry,\n options: ApplyOptions\n): Promise<void> {\n if (!isSupported(agentId)) {\n throw new UnsupportedAgentError(agentId);\n }\n\n const config = getAgentConfig(agentId)!;\n const configPath = resolveConfigPath(config, options.platform);\n const shapeTransformer = getShapeTransformer(config.shape);\n const shaped = shapeTransformer(server);\n\n if (shaped === undefined) {\n await unconfigure(agentId, server.name, options);\n return;\n }\n\n if (config.format === \"yaml\") {\n const document = await readYamlConfig(configPath, options);\n const servers = resolveServerMap(document, config.configKey);\n const nextDocument = mergeServerMap(document, config.configKey, {\n ...servers,\n [server.name]: shaped as unknown as ConfigObject\n });\n\n await writeYamlConfig(configPath, nextDocument, options);\n return;\n }\n\n const configDir = getConfigDirectory(configPath);\n\n await runMutations(\n [\n fileMutation.ensureDirectory({\n path: configDir,\n label: `Ensure directory ${configDir}`\n }),\n // Use transform to replace the server entry entirely (not deep-merge)\n // This ensures old fields like 'args' are removed when switching to array 'command'\n configMutation.transform({\n target: configPath,\n format: config.format,\n transform: (document) => {\n const servers = resolveServerMap(document, config.configKey);\n const newServers = {\n ...servers,\n [server.name]: shaped as unknown as ConfigObject\n };\n return {\n changed: true,\n content: mergeServerMap(document, config.configKey, newServers)\n };\n },\n label: `Add ${server.name} to ${configPath}`\n })\n ],\n {\n fs: options.fs,\n homeDir: options.homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n\nexport async function unconfigure(\n agentId: string,\n serverName: string,\n options: ApplyOptions\n): Promise<void> {\n if (!isSupported(agentId)) {\n throw new UnsupportedAgentError(agentId);\n }\n\n const config = getAgentConfig(agentId)!;\n const configPath = resolveConfigPath(config, options.platform);\n\n if (config.format === \"yaml\") {\n const document = await readYamlConfig(configPath, options);\n const { changed, content } = removeServer(\n document,\n config.configKey,\n serverName\n );\n\n if (!changed) {\n return;\n }\n\n await writeYamlConfig(configPath, content, options);\n return;\n }\n\n await runMutations(\n [\n configMutation.prune({\n target: configPath,\n format: config.format,\n shape: {\n [config.configKey]: {\n [serverName]: {}\n }\n },\n label: `Remove ${serverName} from ${configPath}`\n })\n ],\n {\n fs: options.fs,\n homeDir: options.homeDir,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n}\n", "import type { McpServerConfig, McpServerEntry } from \"./types.js\";\n\nexport type ShapeName = \"standard\" | \"opencode\" | \"goose\";\n\nexport interface StandardShapeOutput {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface OpencodeShapeOutput {\n type: \"local\";\n command: string[];\n env?: Record<string, string>;\n enabled: boolean;\n}\n\nexport interface GooseStdioShapeOutput {\n type: \"stdio\";\n cmd: string;\n args?: string[];\n envs?: Record<string, string>;\n}\n\nexport interface GooseHttpShapeOutput {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\nexport type GooseShapeOutput = GooseStdioShapeOutput | GooseHttpShapeOutput;\n\nexport type ShapeOutput =\n | StandardShapeOutput\n | OpencodeShapeOutput\n | GooseShapeOutput;\n\nexport type ShapeTransformer = (\n entry: McpServerEntry\n) => ShapeOutput | undefined;\n\nfunction transformStdioServer(\n config: Extract<McpServerConfig, { transport: \"stdio\" }>,\n enabled: boolean\n): StandardShapeOutput | undefined {\n if (!enabled) {\n return undefined;\n }\n const result: StandardShapeOutput = {\n command: config.command\n };\n if (config.args && config.args.length > 0) {\n result.args = config.args;\n }\n if (config.env && Object.keys(config.env).length > 0) {\n result.env = config.env;\n }\n return result;\n}\n\nexport function standardShape(entry: McpServerEntry): ShapeOutput | undefined {\n const enabled = entry.enabled !== false;\n\n if (entry.config.transport === \"stdio\") {\n return transformStdioServer(entry.config, enabled);\n }\n\n if (!enabled) {\n return undefined;\n }\n\n return {\n command: entry.config.url\n };\n}\n\nfunction transformStdioServerOpencode(\n config: Extract<McpServerConfig, { transport: \"stdio\" }>,\n enabled: boolean\n): OpencodeShapeOutput {\n const command = config.args && config.args.length > 0\n ? [config.command, ...config.args]\n : [config.command];\n\n const result: OpencodeShapeOutput = {\n type: \"local\",\n command,\n enabled\n };\n if (config.env && Object.keys(config.env).length > 0) {\n result.env = config.env;\n }\n return result;\n}\n\nexport function opencodeShape(entry: McpServerEntry): OpencodeShapeOutput {\n const enabled = entry.enabled !== false;\n\n if (entry.config.transport === \"stdio\") {\n return transformStdioServerOpencode(entry.config, enabled);\n }\n\n return {\n type: \"local\",\n command: [entry.config.url],\n enabled\n };\n}\n\nexport function gooseShape(entry: McpServerEntry): GooseShapeOutput | undefined {\n const enabled = entry.enabled !== false;\n\n if (!enabled) {\n return undefined;\n }\n\n if (entry.config.transport === \"stdio\") {\n const result: GooseStdioShapeOutput = {\n type: \"stdio\",\n cmd: entry.config.command\n };\n\n if (entry.config.args && entry.config.args.length > 0) {\n result.args = entry.config.args;\n }\n\n if (entry.config.env && Object.keys(entry.config.env).length > 0) {\n result.envs = entry.config.env;\n }\n\n return result;\n }\n\n const result: GooseHttpShapeOutput = {\n type: \"http\",\n url: entry.config.url\n };\n\n if (entry.config.headers && Object.keys(entry.config.headers).length > 0) {\n result.headers = entry.config.headers;\n }\n\n return result;\n}\n\nconst shapeTransformers: Record<ShapeName, ShapeTransformer> = {\n standard: standardShape,\n opencode: opencodeShape,\n goose: gooseShape\n};\n\nexport function getShapeTransformer(shape: ShapeName): ShapeTransformer {\n return shapeTransformers[shape];\n}\n", "import { installSkill } from \"@poe-code/agent-skill-config\";\nimport { configure } from \"@poe-code/agent-mcp-config\";\nimport type { ApplyOptions as McpApplyOptions } from \"@poe-code/agent-mcp-config\";\nimport type { FileSystem, MutationObservers } from \"@poe-code/config-mutations\";\nimport type { MemoryInstallResult } from \"./types.js\";\n\nexport type MemoryInstallOptions = {\n agent: string;\n skillContent: string;\n fs: FileSystem;\n cwd: string;\n homeDir: string;\n platform: McpApplyOptions[\"platform\"];\n scope?: \"local\" | \"global\";\n skillOnly?: boolean;\n mcpOnly?: boolean;\n allowWrites?: boolean;\n dryRun?: boolean;\n observers?: MutationObservers;\n};\n\nconst SKILL_NAME = \"poe-code-memory\";\n\nexport async function installMemory(\n options: MemoryInstallOptions\n): Promise<MemoryInstallResult> {\n if (options.skillOnly && options.mcpOnly) {\n throw new Error(\"--skill-only and --mcp-only cannot be combined.\");\n }\n\n const scope = options.scope ?? \"local\";\n let skillPath: string | undefined;\n\n if (!options.mcpOnly) {\n const installed = await installSkill(\n options.agent,\n {\n name: SKILL_NAME,\n content: options.skillContent\n },\n {\n fs: options.fs,\n cwd: options.cwd,\n homeDir: options.homeDir,\n scope,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n\n skillPath = installed.displayPath;\n }\n\n let mcpConfigPath: string | undefined;\n\n if (!options.skillOnly) {\n await configure(\n options.agent,\n {\n name: SKILL_NAME,\n config: {\n transport: \"stdio\",\n command: \"poe-code\",\n args: options.allowWrites ? [\"memory-mcp\", \"--allow-writes\"] : [\"memory-mcp\"]\n }\n },\n {\n fs: options.fs,\n homeDir: options.homeDir,\n platform: options.platform,\n dryRun: options.dryRun,\n observers: options.observers\n }\n );\n\n mcpConfigPath = options.agent === \"codex\"\n ? `${options.homeDir}/.config/codex/mcp-config.json`\n : `${options.homeDir}/.mcp.json`;\n }\n\n return {\n skillInstalled: !options.mcpOnly,\n mcpConfigured: !options.skillOnly,\n skillPath,\n mcpConfigPath\n };\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { countTokens } from \"../../tokenfill/dist/index.js\";\nimport { spawn } from \"@poe-code/agent-spawn\";\nimport { resolveAgent } from \"@poe-code/poe-code-config\";\nimport { listPages } from \"./pages.js\";\nimport { MEMORY_INDEX_RELPATH } from \"./paths.js\";\nimport type { MemoryConfigOptions } from \"@poe-code/poe-code-config\";\nimport type { MemoryPage, MemoryRoot, QueryOptions, QueryResult } from \"./types.js\";\n\nexport type QueryContext = {\n prompt: string;\n selectedPages: MemoryPage[];\n tokensUsed: number;\n truncated: boolean;\n};\n\nexport async function queryMemory(root: MemoryRoot, options: QueryOptions): Promise<QueryResult> {\n const pages = await listPages(root);\n if (pages.length === 0) {\n return {\n answer: \"\",\n citations: [],\n tokensUsed: 0,\n budget: options.budget,\n exitCode: 0\n };\n }\n\n const configOptions = {\n fs: fs as MemoryConfigOptions[\"fs\"],\n filePath: path.join(inferRepoRoot(root), \"poe-code.json\")\n } satisfies MemoryConfigOptions;\n const agentId =\n (await resolveAgent(configOptions, options.agent ?? null)) ?? options.agent ?? \"claude-code\";\n const context = await selectQueryContext(root, options.question, options.budget);\n const result = (await spawn(agentId, { prompt: context.prompt })) as unknown as QueryResult;\n\n return {\n answer: result.answer,\n citations: result.citations,\n tokensUsed: result.tokensUsed,\n budget: options.budget,\n exitCode: result.exitCode\n };\n}\n\nexport async function selectQueryContext(\n root: MemoryRoot,\n question: string,\n budget: number\n): Promise<QueryContext> {\n const [indexText, pages] = await Promise.all([\n fs.readFile(path.join(root, MEMORY_INDEX_RELPATH), \"utf8\"),\n listPages(root)\n ]);\n\n const indexTokens = countTokens(indexText);\n if (indexTokens > budget) {\n throw new Error(`budget too small; needs at least ${indexTokens} tokens`);\n }\n\n const rankedPages = rankPagesForQuery(pages, question);\n const selectedPages: MemoryPage[] = [];\n let tokensUsed = indexTokens;\n let truncated = false;\n\n for (const page of rankedPages) {\n const pageTokens = countTokens(renderPageContext(page));\n if (tokensUsed + pageTokens > budget) {\n truncated = true;\n continue;\n }\n\n selectedPages.push(page);\n tokensUsed += pageTokens;\n }\n\n return {\n prompt: buildQueryPrompt(question, indexText, selectedPages),\n selectedPages,\n tokensUsed,\n truncated\n };\n}\n\nexport function rankPagesForQuery(pages: MemoryPage[], question: string): MemoryPage[] {\n const terms = tokenize(question);\n const documents = pages.map((page) => {\n const text = [page.relPath, page.frontmatter.name ?? \"\", page.frontmatter.description ?? \"\", page.body]\n .join(\"\\n\")\n .toLowerCase();\n const tokens = tokenize(text);\n const counts = new Map<string, number>();\n for (const token of tokens) {\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n return { page, counts, size: tokens.length };\n });\n\n const docFrequency = new Map<string, number>();\n for (const term of terms) {\n let count = 0;\n for (const document of documents) {\n if ((document.counts.get(term) ?? 0) > 0) {\n count += 1;\n }\n }\n docFrequency.set(term, count);\n }\n\n return documents\n .map((document) => ({\n page: document.page,\n score: terms.reduce((total, term) => {\n const tf = (document.counts.get(term) ?? 0) / Math.max(document.size, 1);\n const idf = Math.log((documents.length + 1) / ((docFrequency.get(term) ?? 0) + 1)) + 1;\n return total + tf * idf;\n }, 0)\n }))\n .sort((left, right) => right.score - left.score || left.page.relPath.localeCompare(right.page.relPath))\n .map((entry) => entry.page);\n}\n\nfunction buildQueryPrompt(question: string, indexText: string, pages: MemoryPage[]): string {\n const renderedPages = pages.map((page) => renderPageContext(page)).join(\"\\n\\n\");\n return [\n \"Answer using only the provided memory pages.\",\n \"Cite pages and sections with [rel_path \u00A7section]. If memory does not answer the question, say so.\",\n \"No tools are available.\",\n \"\",\n `Question: ${question}`,\n \"\",\n \"INDEX.md\",\n indexText,\n \"\",\n renderedPages\n ].join(\"\\n\");\n}\n\nfunction renderPageContext(page: MemoryPage): string {\n return [`FILE: ${page.relPath}`, page.body].join(\"\\n\");\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\nfunction inferRepoRoot(root: string): string {\n return path.resolve(root, \"..\", \"..\");\n}\n", "import * as fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { countTokens } from \"../../tokenfill/dist/index.js\";\nimport { spawn } from \"@poe-code/agent-spawn\";\nimport { resolveAgent } from \"@poe-code/poe-code-config\";\nimport { readPage } from \"./pages.js\";\nimport { selectQueryContext } from \"./query.js\";\nimport type { MemoryConfigOptions } from \"@poe-code/poe-code-config\";\nimport type { ExplainResult, MemoryPage, MemoryRoot, QueryResult, SourceRef } from \"./types.js\";\n\nexport type ExplainOptions = {\n relPath: string;\n budget: number;\n agent?: string;\n};\n\nexport async function explainPage(\n root: MemoryRoot,\n options: ExplainOptions\n): Promise<ExplainResult> {\n const targetPage = await readPageIfPresent(root, options.relPath);\n if (targetPage === undefined) {\n return {\n answer: \"\",\n citations: [],\n tokensUsed: 0,\n budget: options.budget,\n exitCode: 0,\n inboundPages: [],\n outboundSources: []\n };\n }\n\n const allContext = await selectQueryContext(root, options.relPath, Number.MAX_SAFE_INTEGER);\n const relatedPages = collectRelatedPages(allContext.selectedPages, targetPage.relPath, targetPage.frontmatter.sources ?? []);\n const prompt = buildExplainPrompt(targetPage.relPath, relatedPages);\n const tokensUsed = countTokens(prompt);\n if (tokensUsed > options.budget) {\n throw new Error(`budget too small; needs at least ${tokensUsed} tokens`);\n }\n\n const configOptions = {\n fs: fs as MemoryConfigOptions[\"fs\"],\n filePath: path.join(inferRepoRoot(root), \"poe-code.json\")\n } satisfies MemoryConfigOptions;\n const agentId =\n (await resolveAgent(configOptions, options.agent ?? null)) ?? options.agent ?? \"claude-code\";\n const response = (await spawn(agentId, { prompt })) as unknown as QueryResult;\n\n return {\n answer: response.answer,\n citations: response.citations,\n tokensUsed: response.tokensUsed,\n budget: options.budget,\n exitCode: response.exitCode,\n inboundPages: relatedPages\n .filter((page) => page.relPath !== targetPage.relPath)\n .filter((page) => (page.frontmatter.sources ?? []).some((source) => source.path === targetPage.relPath))\n .map((page) => page.relPath),\n outboundSources: targetPage.frontmatter.sources ?? []\n };\n}\n\nfunction collectRelatedPages(\n pages: MemoryPage[],\n targetRelPath: string,\n outboundSources: SourceRef[]\n): MemoryPage[] {\n const memorySourcePaths = new Set(outboundSources.map((source) => source.path));\n return pages.filter((page) => {\n if (page.relPath === targetRelPath) {\n return true;\n }\n\n if (memorySourcePaths.has(page.relPath)) {\n return true;\n }\n\n return (page.frontmatter.sources ?? []).some((source) => source.path === targetRelPath);\n });\n}\n\nfunction buildExplainPrompt(targetRelPath: string, pages: MemoryPage[]): string {\n return [\n \"Summarize the target page using only the provided memory pages.\",\n \"Return a 1-2 paragraph explanation plus the important inbound/outbound links.\",\n \"Cite pages and sections with [rel_path \u00A7section]. If memory is insufficient, say so.\",\n \"No tools are available.\",\n \"\",\n `Target page: ${targetRelPath}`,\n \"\",\n ...pages.map((page) => [`FILE: ${page.relPath}`, page.body].join(\"\\n\"))\n ].join(\"\\n\\n\");\n}\n\nasync function readPageIfPresent(root: MemoryRoot, relPath: string): Promise<MemoryPage | undefined> {\n try {\n return await readPage(root, relPath);\n } catch (error) {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n}\n\nfunction inferRepoRoot(root: string): string {\n return path.resolve(root, \"..\", \"..\");\n}\n", "import { explainPage } from \"./explain.js\";\nimport type { ExplainResult } from \"./types.js\";\n\nexport async function runMemoryExplain(input: {\n root: string;\n relPath: string;\n budget: number;\n agent?: string;\n}): Promise<ExplainResult> {\n return explainPage(input.root, {\n relPath: input.relPath,\n budget: input.budget,\n agent: input.agent\n });\n}\n", "import path from \"node:path\";\nimport type { AuditClaimsOptions, PageAudit } from \"./audit.js\";\nimport { auditClaims as auditClaimsFree } from \"./audit.js\";\nimport type { ExplainOptions } from \"./explain.js\";\nimport { explainPage as explainPageFree } from \"./explain.js\";\nimport { ingest as ingestFree } from \"./ingest.js\";\nimport { listPages, readPage } from \"./pages.js\";\nimport { queryMemory } from \"./query.js\";\nimport { searchMemory } from \"./search.js\";\nimport { statusOf } from \"./status.js\";\nimport { computeTokenStats } from \"./tokens.js\";\nimport type {\n ExplainResult,\n IngestOptions,\n IngestResult,\n MemoryDiff,\n MemoryPage,\n MemoryRoot,\n PageFrontmatter,\n QueryOptions,\n QueryResult,\n SearchHit,\n TokenStats\n} from \"./types.js\";\nimport { appendToPage, clearMemory, writePage } from \"./write.js\";\n\nexport type OpenMemoryOptions = {\n root: MemoryRoot;\n agent?: string;\n};\n\nexport type StatusInfo = {\n pageCount: number;\n totalBytes: number;\n lastWriteAt: string | null;\n initialized: boolean;\n};\n\nexport type AuditCallOptions = AuditClaimsOptions & { repoRoot: string };\n\nexport interface MemoryHandle {\n readonly root: MemoryRoot;\n\n listPages(): Promise<MemoryPage[]>;\n readPage(relPath: string): Promise<MemoryPage>;\n searchMemory(query: string): Promise<SearchHit[]>;\n statusOf(): Promise<StatusInfo>;\n computeTokenStats(): Promise<TokenStats>;\n explainPage(opts: ExplainOptions): Promise<ExplainResult>;\n\n writePage(\n relPath: string,\n body: string,\n opts: { reason: string; frontmatter?: PageFrontmatter }\n ): Promise<MemoryDiff>;\n appendToPage(\n relPath: string,\n content: string,\n opts: { reason: string }\n ): Promise<MemoryDiff>;\n clearMemory(): Promise<void>;\n\n query(opts: QueryOptions): Promise<QueryResult>;\n ingest(opts: IngestOptions): Promise<IngestResult>;\n auditClaims(opts: AuditCallOptions): Promise<PageAudit[]>;\n}\n\nexport function openMemory(opts: OpenMemoryOptions): MemoryHandle {\n if (!path.isAbsolute(opts.root)) {\n throw new Error(`openMemory: root must be absolute, got ${opts.root}`);\n }\n\n const root = opts.root;\n const defaultAgent = opts.agent;\n\n return {\n root,\n listPages: async () => await listPages(root),\n readPage: async (relPath) => await readPage(root, relPath),\n searchMemory: async (query) => await searchMemory(root, query),\n statusOf: async () => await statusOf(root),\n computeTokenStats: async () => await computeTokenStats(root),\n explainPage: async (options) => await explainPageFree(root, withDefaultAgent(options, defaultAgent)),\n writePage: async (relPath, body, options) => await writePage(root, relPath, body, options),\n appendToPage: async (relPath, content, options) =>\n await appendToPage(root, relPath, content, options),\n clearMemory: async () => await clearMemory(root),\n query: async (options) => await queryMemory(root, withDefaultAgent(options, defaultAgent)),\n ingest: async (options) => await ingestFree(root, withDefaultAgent(options, defaultAgent)),\n auditClaims: async ({ repoRoot, ...options }) => await auditClaimsFree(root, repoRoot, options)\n };\n}\n\nfunction withDefaultAgent<T extends { agent?: string }>(options: T, agent: string | undefined): T {\n if (options.agent !== undefined || agent === undefined) {\n return options;\n }\n\n return {\n ...options,\n agent\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["message", "path", "path", "path", "fs", "error", "path", "path", "path", "error", "path", "parse", "merge", "prune", "parse", "merge", "prune", "isConfigObject", "parse", "serialize", "merge", "prune", "parseYaml", "isConfigObject", "parse", "serialize", "merge", "prune", "detectFormat", "path", "path", "error", "fs", "fs", "isConfigObject", "error", "stat", "detectFormat", "error", "Mustache", "fs", "path", "error", "fs", "path", "path", "EMPTY_DOCUMENT", "path", "path", "path", "error", "fs", "path", "parse", "error", "message", "isRecord", "path", "path", "stat", "error", "message", "fs", "path", "path", "fs", "path", "pathExists", "stat", "path", "error", "fs", "path", "fs", "path", "path", "resolve", "hasErrorCode", "error", "fs", "path", "fs", "path", "path", "diff", "error", "message", "path", "stat", "removeDirectory", "error", "path", "diff", "error", "fs", "path", "error", "path", "cached", "isMissing", "createHash", "fs", "path", "createHash", "path", "error", "isMissing", "message", "fs", "path", "lookup", "path", "error", "spawn", "resolve", "error", "path", "spawnChildProcess", "text", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "spacing", "message", "chalk", "chalk", "AsyncLocalStorage", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "path", "homedir", "readdir", "spawnChildProcess", "fsPromises", "spawnChildProcess", "path", "homedir", "mkdir", "open", "fs", "path", "text", "truncate", "join", "pathExists", "path", "error", "isMissing", "path", "fs", "spawn", "error", "diff", "resolve", "readline", "message", "error", "text", "write", "error", "resolve", "message", "path", "readFile", "stat", "path", "fileURLToPath", "supportedAgents", "resolveAgentSupport", "getAgentConfig", "resolveConfigPath", "path", "parseYaml", "stringifyYaml", "result", "path", "UnsupportedAgentError", "isConfigObject", "parseYaml", "stringifyYaml", "configure", "getAgentConfig", "resolveConfigPath", "unconfigure", "configure", "fs", "path", "fs", "path", "inferRepoRoot", "spawn", "text", "fs", "path", "fs", "path", "inferRepoRoot", "spawn", "error", "path", "path"]
|
|
7
7
|
}
|