@poe-platform/safe-js 0.1.129 → 0.1.131
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/safe-js/chunks/{chunk-OM5W7AYB.js → chunk-DZRTLKIV.js} +147 -44
- package/dist/safe-js/chunks/chunk-DZRTLKIV.js.map +7 -0
- package/dist/safe-js/chunks/{chunk-EH4VQYKL.js → chunk-RA54CNI6.js} +7 -3
- package/dist/safe-js/chunks/chunk-RA54CNI6.js.map +7 -0
- package/dist/safe-js/cli.js +2 -2
- package/dist/safe-js/core.js +1 -1
- package/dist/safe-js/index.js +2 -2
- package/dist/safe-js/interp/values.d.ts +3 -0
- package/dist/safe-js/parse/function-source.d.ts +7 -0
- package/dist/safe-js/snapshot/dump-format.d.ts +1 -1
- package/package.json +2 -2
- package/dist/safe-js/chunks/chunk-EH4VQYKL.js.map +0 -7
- package/dist/safe-js/chunks/chunk-OM5W7AYB.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/migrate.ts", "../../src/migration-file.ts", "../../src/error/format.ts", "../../src/loader/extract-block.ts", "../../../frontmatter/src/fences.ts", "../../../frontmatter/src/parse.ts", "../../../frontmatter/src/stringify.ts", "../../src/loader/frontmatter.ts", "../../src/lint/runtime-modules.ts", "../../src/modules/agent.ts", "../../../agent-defs/src/agents/claude-code.ts", "../../../agent-defs/src/agents/claude-desktop.ts", "../../../agent-defs/src/agents/codex.ts", "../../../agent-defs/src/agents/cursor.ts", "../../../agent-defs/src/agents/gemini-cli.ts", "../../../agent-defs/src/agents/opencode.ts", "../../../agent-defs/src/agents/kimi.ts", "../../../agent-defs/src/agents/goose.ts", "../../../agent-defs/src/agents/pi.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/types.ts", "../../../agent-spawn/src/configs/gemini-cli.ts", "../../../agent-spawn/src/configs/cursor.ts", "../../../agent-spawn/src/configs/pi.ts", "../../../agent-spawn/src/configs/index.ts", "../../../agent-spawn/src/parallel.ts", "../../src/modules/env.ts", "../../src/modules/fail.ts", "../../src/modules/fs.ts", "../../src/modules/canonical-path.ts", "../../src/modules/fs-config.ts", "../../src/modules/harness.ts", "../../src/output-stream.ts", "../../src/modules/log.ts", "../../src/modules/metric.ts", "../../src/modules/mcp-transport.ts", "../../../tiny-mcp-client/src/internal.ts", "../../../mcp-oauth/src/client/auth-store-session-store.ts", "../../../auth-store/src/encrypted-file-store.ts", "../../../auth-store/src/error-codes.ts", "../../../auth-store/src/keychain-store.ts", "../../../auth-store/src/create-secret-store.ts", "../../../mcp-oauth/src/resource-indicator.ts", "../../../mcp-oauth/src/client/default-oauth-client-provider.ts", "../../../mcp-oauth/src/client/loopback-authorization.ts", "../../../mcp-oauth/src/client/authorization-state.ts", "../../../mcp-oauth/src/client/pkce.ts", "../../../mcp-oauth/src/client/token-endpoint.ts", "../../../mcp-oauth/src/server/jwks-token-verifier.ts", "../../../tiny-mcp-client/src/oauth-discovery.ts", "../../src/modules/mcp.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from \"node:crypto\";\n\nimport { assertSnapshotInactive } from \"./interp/running-state.js\";\nimport { deepCopyToSandbox } from \"./interp/values.js\";\nimport { hashSource } from \"./parse/hash.js\";\nimport { parseModule } from \"./parse/parser.js\";\nimport type { SafeJSSnapshot } from \"./restore.js\";\nimport { DUMP_FORMAT_VERSION, EXECUTION_SEMANTICS } from \"./snapshot/dump-format.js\";\nimport {\n validateMigrationJournal,\n validateMigrationReconciliation,\n validateMigrationSemantics,\n validateSnapshotMigration,\n type SnapshotMigration,\n type SnapshotMigrationReconciliation\n} from \"./snapshot/migration.js\";\nimport { encodeReplayData } from \"./snapshot/replay-data.js\";\nimport { validateDumpEnvelope, validateSnapshotData } from \"./snapshot/validation.js\";\n\nexport type {\n SnapshotMigration,\n SnapshotMigrationReconciliation,\n SnapshotMigrationResolution\n} from \"./snapshot/migration.js\";\n\nexport type SnapshotMigrationOptions = {\n source: string;\n targetSource: string;\n state: unknown;\n reconciliation: SnapshotMigrationReconciliation;\n};\n\nexport function inspectSnapshotMigration(snapshot: SafeJSSnapshot, options: { source: string }) {\n assertSnapshotInactive(snapshot);\n validateSnapshotData(snapshot);\n validateDumpEnvelope(snapshot);\n validateMigrationSemantics(snapshot.executionSemantics);\n const sourceHash = hashSource(\n options.source,\n undefined,\n snapshot.executionSemantics === EXECUTION_SEMANTICS\n );\n if (snapshot.sourceHash !== sourceHash)\n throw new TypeError(\n `Migration requires the original executable source (checkpoint hash ${snapshot.sourceHash}, supplied ${sourceHash}). Preserve the checkpoint; do not replace its hash.`\n );\n validateSnapshotMigration(snapshot.migration, sourceHash);\n const replay = validateMigrationJournal(sourceHash, snapshot.replay, snapshot.hostCalls);\n return {\n checkpointDigest: createHash(\"sha256\").update(canonicalData(snapshot)).digest(\"hex\"),\n sourceHash,\n executionSemantics: snapshot.executionSemantics,\n calls: replay.calls,\n unresolvedCalls: replay.calls.filter(\n (call) => ![\"settled\", \"consumed\"].includes(call.lifecycle)\n )\n };\n}\n\nexport function migrateSnapshot(\n snapshot: SafeJSSnapshot,\n options: SnapshotMigrationOptions\n): SafeJSSnapshot & { migration: SnapshotMigration } {\n if (!Object.hasOwn(options, \"state\"))\n throw new TypeError(\"Migration requires explicit application state.\");\n const inspection = inspectSnapshotMigration(snapshot, { source: options.source });\n parseModule(options.targetSource);\n const targetSourceHash = hashSource(options.targetSource);\n validateMigrationReconciliation(\n options.reconciliation,\n inspection.checkpointDigest,\n inspection.calls\n );\n const state = encodeReplayData(deepCopyToSandbox(options.state));\n const previous = snapshot.migration as SnapshotMigration | undefined;\n const migration: SnapshotMigration = {\n version: 1,\n state,\n history: [\n ...structuredClone(previous?.history ?? []),\n {\n sourceHash: inspection.sourceHash,\n targetSourceHash,\n executionSemantics: inspection.executionSemantics,\n replay: { version: 1, calls: inspection.calls },\n reconciliation: structuredClone(options.reconciliation)\n }\n ]\n };\n validateSnapshotMigration(migration, targetSourceHash);\n return {\n version: DUMP_FORMAT_VERSION,\n executionSemantics: EXECUTION_SEMANTICS,\n sourceHash: targetSourceHash,\n bindings: {},\n replay: { version: 1, calls: [] },\n migration\n };\n}\n\nfunction canonicalData(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonicalData).join(\",\")}]`;\n if (value !== null && typeof value === \"object\")\n return `{${Object.keys(value)\n .sort()\n .map(\n (key) => `${JSON.stringify(key)}:${canonicalData((value as Record<string, unknown>)[key])}`\n )\n .join(\",\")}}`;\n return JSON.stringify(value);\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { link, open, readFile, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\n\nimport {\n inspectSnapshotMigration,\n migrateSnapshot,\n type SnapshotMigrationOptions\n} from \"./migrate.js\";\nimport type { SafeJSSnapshot } from \"./restore.js\";\nimport { serializeSafeJSSnapshot } from \"./snapshot/dump-format.js\";\n\nexport type SnapshotMigrationFileOptions = {\n snapshotPath: string;\n sourcePath: string;\n targetSourcePath?: string;\n planPath?: string;\n outputPath?: string;\n inspect?: boolean;\n dryRun?: boolean;\n cwd?: string;\n};\n\nexport async function migrateSnapshotFile(options: SnapshotMigrationFileOptions) {\n const cwd = options.cwd ?? process.cwd();\n const resolvePath = (value: string | undefined, label: string) => {\n if (typeof value !== \"string\" || value.trim().length === 0)\n throw new TypeError(`Migration requires ${label}.`);\n return path.resolve(cwd, value);\n };\n const snapshotPath = resolvePath(options.snapshotPath, \"a snapshot path\");\n const sourcePath = resolvePath(options.sourcePath, \"--from <original.ajs>\");\n if (\n options.inspect &&\n [options.targetSourcePath, options.planPath, options.outputPath].some(\n (value) => value !== undefined\n )\n )\n throw new TypeError(\"Migration --inspect cannot be combined with --to, --plan, or --output.\");\n const outputPath = options.inspect\n ? undefined\n : resolvePath(options.outputPath, \"--output <new-checkpoint.json>\");\n const targetSourcePath = options.inspect\n ? undefined\n : resolvePath(options.targetSourcePath, \"--to <continuation.ajs>\");\n const planPath = options.inspect\n ? undefined\n : resolvePath(options.planPath, \"--plan <migration.json>\");\n for (const filepath of [sourcePath, targetSourcePath]) {\n if (filepath !== undefined && ![\".ajs\", \".safejs\"].includes(path.extname(filepath)))\n throw new TypeError(\n \"Migration source paths must name executable .ajs or .safejs files, not harness Markdown.\"\n );\n }\n const snapshot: SafeJSSnapshot = JSON.parse(await readFile(snapshotPath, \"utf8\"));\n const source = await readFile(sourcePath, \"utf8\");\n const inspection = inspectSnapshotMigration(snapshot, { source });\n if (options.inspect) return { inspection };\n const plan: unknown = JSON.parse(await readFile(planPath!, \"utf8\"));\n if (\n plan === null ||\n typeof plan !== \"object\" ||\n !Object.hasOwn(plan, \"state\") ||\n !Object.hasOwn(plan, \"reconciliation\")\n )\n throw new TypeError(\"Migration plan requires explicit state and reconciliation fields.\");\n const targetSource = await readFile(targetSourcePath!, \"utf8\");\n const migrated = migrateSnapshot(snapshot, {\n source,\n targetSource,\n state: (plan as SnapshotMigrationOptions).state,\n reconciliation: (plan as SnapshotMigrationOptions).reconciliation\n });\n const contents = serializeSafeJSSnapshot(migrated);\n if (!options.dryRun) {\n const temporaryPath = path.join(\n path.dirname(outputPath!),\n `.safejs-migration-${randomUUID()}.tmp`\n );\n let created = false;\n try {\n const handle = await open(temporaryPath, \"wx\", 0o600);\n created = true;\n try {\n await handle.writeFile(contents, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n try {\n await link(temporaryPath, outputPath!);\n } catch (error) {\n if (hasOwnErrorCode(error, \"EEXIST\"))\n throw Object.assign(\n new Error(\n `Migration output already exists: ${JSON.stringify(outputPath)}. Choose a new output path; existing files are never overwritten.`,\n { cause: error }\n ),\n { code: \"EEXIST\" }\n );\n throw error;\n }\n } finally {\n if (created) await unlink(temporaryPath);\n }\n }\n return { inspection, outputPath, dryRun: options.dryRun === true };\n}\n", "import { SandboxError } from \"../interp/budget.js\";\n\nexport type InterpreterDiagnostic = {\n kind: string;\n filename: string;\n line: number;\n column: number;\n message: string;\n};\n\nexport type FormatErrorOptions = {\n filename?: string;\n hostCallName?: string;\n maxMessageLength?: number;\n source?: string;\n};\n\ntype ParseDiagnostic = InterpreterDiagnostic & {\n kind: \"ParseError\";\n excerpt: string;\n caret: string;\n};\n\ntype SpanDiagnostic = {\n message: string;\n span: {\n start: {\n line: number;\n column: number;\n };\n };\n};\n\nconst DEFAULT_MAX_MESSAGE_LENGTH = 10_000;\nconst MAX_CAUSE_DEPTH = 20;\n\nexport function formatInterpreterError(source: string, error: InterpreterDiagnostic): string;\nexport function formatInterpreterError(error: unknown, options?: FormatErrorOptions): string;\nexport function formatInterpreterError(\n first: string | unknown,\n second?: InterpreterDiagnostic | FormatErrorOptions\n): string {\n if (typeof first === \"string\" && isInterpreterDiagnostic(second)) {\n return formatSourceDiagnostic(first, second, {\n maxMessageLength: DEFAULT_MAX_MESSAGE_LENGTH\n });\n }\n\n const options = second as FormatErrorOptions | undefined;\n const formatted = formatTopLevelError(first, normalizeOptions(options));\n\n if (options?.hostCallName === undefined) {\n return formatted;\n }\n\n return wrapHostCall(formatted, options.hostCallName);\n}\n\nfunction normalizeOptions(options: FormatErrorOptions | undefined): Required<FormatErrorOptions> {\n return {\n filename: options?.filename ?? \"<input>\",\n hostCallName: options?.hostCallName ?? \"\",\n maxMessageLength: options?.maxMessageLength ?? DEFAULT_MAX_MESSAGE_LENGTH,\n source: options?.source ?? \"\"\n };\n}\n\nfunction formatTopLevelError(error: unknown, options: Required<FormatErrorOptions>): string {\n if (isParseDiagnostic(error)) {\n return formatParseDiagnostic(error, options.maxMessageLength);\n }\n\n if (error instanceof SandboxError) {\n return formatSandboxError(error, options.maxMessageLength);\n }\n\n if (isSpanDiagnostic(error)) {\n if (options.source === \"\") {\n return truncate(error.message, options.maxMessageLength);\n }\n\n return formatSourceDiagnostic(options.source, {\n kind: \"InterpreterError\",\n filename: options.filename,\n line: error.span.start.line,\n column: error.span.start.column,\n message: error.message\n });\n }\n\n if (isErrorLike(error)) {\n return formatErrorLike(error, options.maxMessageLength);\n }\n\n return `Thrown value: ${truncate(describeThrownValue(error), options.maxMessageLength)}`;\n}\n\nfunction formatParseDiagnostic(error: ParseDiagnostic, maxMessageLength: number): string {\n return [\n `${error.kind}: ${error.filename}:${error.line}:${error.column}`,\n \"\",\n error.excerpt,\n error.caret,\n \"\",\n truncate(error.message, maxMessageLength)\n ].join(\"\\n\");\n}\n\nfunction formatSandboxError(error: SandboxError, maxMessageLength: number): string {\n const lines = [formatErrorSummary(error, maxMessageLength)];\n\n if (error.code === \"budgetExceeded\" && error.budget !== undefined) {\n lines.push(\"\", `Budget exceeded: ${error.budget} (${error.current} > ${error.limit})`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatErrorLike(error: ErrorLike, maxMessageLength: number): string {\n const stack = formatSandboxStack(error, maxMessageLength);\n const causes = formatCauses(error, maxMessageLength);\n\n if (causes.length === 0) {\n return stack;\n }\n\n return [stack, \"\", ...causes].join(\"\\n\");\n}\n\nfunction formatSandboxStack(error: ErrorLike, maxMessageLength: number): string {\n if (typeof error.stack !== \"string\") {\n return formatErrorSummary(error, maxMessageLength);\n }\n\n const stackLines = splitLines(error.stack);\n const header = stackLines[0] === undefined || stackLines[0] === \"\" ? undefined : stackLines[0];\n const sandboxFrames = stackLines.slice(1).filter(isSandboxStackFrame);\n\n if (sandboxFrames.length === 0) {\n return formatErrorSummary(error, maxMessageLength);\n }\n\n return [\n truncate(header ?? formatErrorSummary(error, maxMessageLength), maxMessageLength),\n ...sandboxFrames\n ].join(\"\\n\");\n}\n\nfunction isSandboxStackFrame(line: string): boolean {\n const trimmed = line.trimStart();\n\n return (\n trimmed.startsWith(\"at \") &&\n trimmed.includes(\"(line \") &&\n trimmed.includes(\", column \") &&\n trimmed.endsWith(\")\")\n );\n}\n\nfunction formatCauses(error: ErrorLike, maxMessageLength: number): string[] {\n const causes: string[] = [];\n const seen = new Set<unknown>();\n let current: unknown = readCause(error);\n\n for (let depth = 0; depth < MAX_CAUSE_DEPTH && current !== undefined; depth += 1) {\n if (seen.has(current)) {\n causes.push(\"Caused by: [Circular cause]\");\n break;\n }\n\n seen.add(current);\n causes.push(`Caused by: ${formatCause(current, maxMessageLength)}`);\n current = isObject(current) ? readCause(current) : undefined;\n }\n\n return causes;\n}\n\nfunction formatCause(cause: unknown, maxMessageLength: number): string {\n if (cause instanceof SandboxError) {\n return formatErrorSummary(cause, maxMessageLength);\n }\n\n if (isErrorLike(cause)) {\n return formatErrorSummary(cause, maxMessageLength);\n }\n\n return truncate(describeThrownValue(cause), maxMessageLength);\n}\n\nfunction readCause(value: object): unknown {\n return Object.prototype.hasOwnProperty.call(value, \"cause\")\n ? (value as { cause?: unknown }).cause\n : undefined;\n}\n\nfunction wrapHostCall(formatted: string, hostCallName: string): string {\n const lines = splitLines(formatted);\n const [firstLine = \"\", ...rest] = lines;\n\n return [`Host call ${hostCallName} failed: ${firstLine}`, ...rest].join(\"\\n\");\n}\n\nfunction formatSourceDiagnostic(\n source: string,\n error: InterpreterDiagnostic,\n options: { maxMessageLength?: number } = {}\n): string {\n const lines = splitLines(source);\n const excerpt = createExcerpt(lines, error.line);\n const lineNumberWidth = String(\n excerpt[excerpt.length - 1]?.number ?? Math.max(error.line, 1)\n ).length;\n const reportedLine =\n excerpt.find((line) => line.number === Math.max(error.line, 1)) ?? excerpt[excerpt.length - 1];\n const caretPadding = createCaretPadding(\n reportedLine?.content ?? \"\",\n error.column,\n reportedLine?.hasSource === true\n );\n\n return [\n `${error.kind}: ${error.filename}:${error.line}:${error.column}`,\n \"\",\n ...excerpt.map((line) => `${String(line.number).padStart(lineNumberWidth)} | ${line.content}`),\n `${\" \".repeat(lineNumberWidth)} | ${caretPadding}^`,\n \"\",\n truncate(error.message, options.maxMessageLength ?? DEFAULT_MAX_MESSAGE_LENGTH)\n ].join(\"\\n\");\n}\n\nfunction formatErrorSummary(error: ErrorLike, maxMessageLength: number): string {\n const name = typeof error.name === \"string\" && error.name !== \"\" ? error.name : \"Error\";\n const message = typeof error.message === \"string\" ? error.message : \"\";\n\n if (message === \"\") {\n return name;\n }\n\n return `${name}: ${truncate(message, maxMessageLength)}`;\n}\n\nfunction truncate(message: string, maxLength: number): string {\n if (message.length <= maxLength) {\n return message;\n }\n\n return `${message.slice(0, maxLength)}... [truncated ${message.length - maxLength} chars]`;\n}\n\nfunction describeThrownValue(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n if (\n value === undefined ||\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n\n if (typeof value === \"symbol\" || typeof value === \"function\") {\n return safeString(value, \"[Unserializable thrown value]\");\n }\n\n return stringifyJsonish(value);\n}\n\nfunction stringifyJsonish(value: object): string {\n const seen = new WeakSet<object>();\n\n try {\n return JSON.stringify(value, (_key, nested) => {\n if (typeof nested === \"bigint\") {\n return String(nested);\n }\n\n if (!isObject(nested)) {\n return nested;\n }\n\n if (seen.has(nested)) {\n return \"[Circular]\";\n }\n\n seen.add(nested);\n return nested;\n });\n } catch {\n return safeString(value, \"[Unserializable thrown value]\");\n }\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\nfunction isInterpreterDiagnostic(value: unknown): value is InterpreterDiagnostic {\n return (\n isObject(value) &&\n typeof value.kind === \"string\" &&\n typeof value.filename === \"string\" &&\n typeof value.line === \"number\" &&\n typeof value.column === \"number\" &&\n typeof value.message === \"string\"\n );\n}\n\nfunction isParseDiagnostic(value: unknown): value is ParseDiagnostic {\n return (\n isInterpreterDiagnostic(value) &&\n value.kind === \"ParseError\" &&\n typeof (value as { excerpt?: unknown }).excerpt === \"string\" &&\n typeof (value as { caret?: unknown }).caret === \"string\"\n );\n}\n\nfunction isSpanDiagnostic(value: unknown): value is SpanDiagnostic {\n return (\n isObject(value) &&\n typeof value.message === \"string\" &&\n isObject(value.span) &&\n isObject(value.span.start) &&\n typeof value.span.start.line === \"number\" &&\n typeof value.span.start.column === \"number\"\n );\n}\n\ntype ErrorLike = {\n cause?: unknown;\n message?: unknown;\n name?: unknown;\n stack?: unknown;\n};\n\nfunction isErrorLike(value: unknown): value is ErrorLike {\n if (!isObject(value)) {\n return false;\n }\n\n return (\n value instanceof Error ||\n typeof value.name === \"string\" ||\n typeof value.message === \"string\" ||\n typeof value.stack === \"string\"\n );\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction createExcerpt(\n sourceLines: readonly string[],\n reportedLine: number\n): Array<{ number: number; content: string; hasSource: boolean }> {\n const safeLineNumber = Math.max(reportedLine, 1);\n\n if (safeLineNumber > sourceLines.length) {\n return [\n {\n number: safeLineNumber,\n content: \"\",\n hasSource: false\n }\n ];\n }\n\n const excerpt: Array<{ number: number; content: string; hasSource: boolean }> = [];\n const startLine = Math.max(1, safeLineNumber - 2);\n const endLine = Math.min(sourceLines.length, safeLineNumber + 1);\n\n for (let line = startLine; line <= endLine; line += 1) {\n excerpt.push({\n number: line,\n content: sourceLines[line - 1] ?? \"\",\n hasSource: true\n });\n }\n\n return excerpt;\n}\n\nfunction splitLines(source: string): string[] {\n return source.split(/\\r\\n|\\n|\\r/);\n}\n\nfunction createCaretPadding(line: string, column: number, hasSource: boolean): string {\n let padding = \"\";\n const maxColumn = hasSource\n ? Math.max(Math.min(column - 1, line.length), 0)\n : Math.max(column - 1, 0);\n\n for (const character of line.slice(0, maxColumn)) {\n padding += character === \"\\t\" ? \"\\t\" : \" \";\n }\n\n if (maxColumn > line.length) {\n padding += \" \".repeat(maxColumn - line.length);\n }\n\n return padding;\n}\n", "export interface ExtractBlockResult {\n endOffset: number;\n source: string;\n lineOffset: number;\n startOffset: number;\n ranges: readonly (readonly [number, number])[];\n}\n\nexport function extractBlock(markdown: string, startLine = 1): ExtractBlockResult {\n let index = 0;\n let line = startLine;\n const blocks: { start: number; end: number; line: number }[] = [];\n\n while (index < markdown.length) {\n const lineStart = index;\n const lineEnd = findLineEnd(markdown, index);\n const lineContent = markdown.slice(lineStart, lineEnd.index);\n const fence = readOpeningFence(lineContent);\n\n if (fence !== undefined) {\n const blockStart = lineEnd.index + lineEnd.lineBreakLength;\n const closingFence = findClosingFence(markdown, blockStart, fence);\n\n if (matchesScriptInfo(fence.info)) {\n if (!closingFence.found) {\n throw new Error(\n `Unclosed ${readInfoWord(fence.info)} fenced block opened at line ${line}.`\n );\n }\n\n blocks.push({ start: blockStart, end: closingFence.start, line });\n }\n\n const resumeIndex = findBlockResumeIndex(markdown, closingFence);\n line += countLineBreaks(markdown, index, resumeIndex);\n index = resumeIndex;\n continue;\n }\n\n if (lineEnd.lineBreakLength === 0) {\n break;\n }\n\n index = lineEnd.index + lineEnd.lineBreakLength;\n line += 1;\n }\n\n if (blocks.length === 0)\n return {\n endOffset: markdown.length,\n lineOffset: 1,\n source: markdown,\n startOffset: 0,\n ranges: [[0, markdown.length]]\n };\n\n const first = blocks[0];\n const parts: string[] = [];\n let cursor = first.start;\n for (const block of blocks) {\n parts.push(\n maskSource(markdown.slice(cursor, block.start)),\n markdown.slice(block.start, block.end)\n );\n cursor = block.end;\n }\n return {\n endOffset: cursor,\n lineOffset: first.line,\n source: parts.join(\"\"),\n startOffset: first.start,\n ranges: blocks.map((block) => [block.start, block.end])\n };\n}\n\nexport function maskSource(source: string): string {\n let masked = \"\";\n for (let offset = 0; offset < source.length; offset++) {\n const character = source[offset];\n masked += character === \"\\n\" || character === \"\\r\" ? character : \" \";\n }\n return masked;\n}\n\ninterface Fence {\n indent: string;\n marker: string;\n markerCharacter: \"`\" | \"~\";\n info: string;\n}\n\nfunction readOpeningFence(line: string): Fence | undefined {\n const fenceStart = readFenceStart(line);\n if (fenceStart === undefined) {\n return undefined;\n }\n\n let markerEnd = fenceStart.indentLength;\n while (line[markerEnd] === fenceStart.markerCharacter) {\n markerEnd += 1;\n }\n\n const marker = line.slice(fenceStart.indentLength, markerEnd);\n if (marker.length < 3) {\n return undefined;\n }\n\n const info = line.slice(markerEnd).trimStart();\n\n return {\n indent: line.slice(0, fenceStart.indentLength),\n marker,\n markerCharacter: fenceStart.markerCharacter,\n info\n };\n}\n\nfunction readFenceStart(\n line: string\n): { indentLength: number; markerCharacter: \"`\" | \"~\" } | undefined {\n let index = 0;\n\n while (index < line.length && line[index] === \" \") {\n index += 1;\n }\n\n const markerCharacter = line[index];\n return markerCharacter === \"`\" || markerCharacter === \"~\"\n ? {\n indentLength: index,\n markerCharacter\n }\n : undefined;\n}\n\nfunction matchesScriptInfo(info: string): boolean {\n const infoWord = readInfoWord(info);\n return infoWord === \"js\" || infoWord === \"javascript\" || infoWord === \"ajs\";\n}\n\nfunction readInfoWord(info: string): string {\n let index = 0;\n\n while (index < info.length && !isWhitespace(info[index])) {\n index += 1;\n }\n\n return info.slice(0, index);\n}\n\nfunction isWhitespace(character: string): boolean {\n return character === \" \" || character === \"\\t\";\n}\n\ninterface ClosingFence {\n found: boolean;\n start: number;\n}\n\nfunction findBlockResumeIndex(markdown: string, closingFence: ClosingFence): number {\n if (!closingFence.found || closingFence.start >= markdown.length) {\n return markdown.length;\n }\n\n const closingLineEnd = findLineEnd(markdown, closingFence.start);\n return closingLineEnd.index + closingLineEnd.lineBreakLength;\n}\n\nexport function countLineBreaks(markdown: string, start = 0, end = markdown.length): number {\n let count = 0;\n let index = start;\n\n while (index < end) {\n const character = markdown[index];\n if (character === \"\\n\") {\n count += 1;\n index += 1;\n continue;\n }\n\n if (character === \"\\r\") {\n count += 1;\n index += markdown[index + 1] === \"\\n\" ? 2 : 1;\n continue;\n }\n\n index += 1;\n }\n\n return count;\n}\n\nfunction findClosingFence(markdown: string, searchStart: number, fence: Fence): ClosingFence {\n let lineStart = searchStart;\n\n while (lineStart <= markdown.length) {\n const lineEnd = findLineEnd(markdown, lineStart);\n const lineContent = markdown.slice(lineStart, lineEnd.index);\n if (isClosingFence(lineContent, fence)) {\n return {\n found: true,\n start: lineStart\n };\n }\n\n if (lineEnd.lineBreakLength === 0) {\n return {\n found: false,\n start: markdown.length\n };\n }\n\n lineStart = lineEnd.index + lineEnd.lineBreakLength;\n }\n\n return {\n found: false,\n start: markdown.length\n };\n}\n\nfunction isClosingFence(line: string, fence: Fence): boolean {\n const fenceStart = readFenceStart(line);\n if (fenceStart === undefined || fenceStart.markerCharacter !== fence.markerCharacter) {\n return false;\n }\n\n const { indentLength } = fenceStart;\n if (line.slice(0, indentLength) !== fence.indent) {\n return false;\n }\n\n let markerEnd = indentLength;\n while (line[markerEnd] === fence.markerCharacter) {\n markerEnd += 1;\n }\n\n const closingMarker = line.slice(indentLength, markerEnd);\n if (closingMarker.length < fence.marker.length) {\n return false;\n }\n\n for (let index = markerEnd; index < line.length; index += 1) {\n if (line[index] !== \" \") {\n return false;\n }\n }\n\n return true;\n}\n\ninterface LineEnd {\n index: number;\n lineBreakLength: 0 | 1 | 2;\n}\n\nfunction findLineEnd(markdown: string, start: number): LineEnd {\n let index = start;\n\n while (index < markdown.length) {\n const character = markdown[index];\n if (character === \"\\n\") {\n return {\n index,\n lineBreakLength: 1\n };\n }\n\n if (character === \"\\r\") {\n if (markdown[index + 1] === \"\\n\") {\n return {\n index,\n lineBreakLength: 2\n };\n }\n\n return {\n index,\n lineBreakLength: 1\n };\n }\n\n index += 1;\n }\n\n return {\n index: markdown.length,\n lineBreakLength: 0\n };\n}\n", "export type FrontmatterBlock = {\n raw: string;\n body: string;\n rawStart: number;\n rawEnd: number;\n};\n\nexport type SplitFrontmatterResult = FrontmatterBlock | { body: string };\n\nexport type InspectFrontmatterResult =\n | (FrontmatterBlock & { kind: \"frontmatter\" })\n | {\n kind: \"missing-closing-fence\";\n raw: string;\n rawStart: number;\n rawEnd: number;\n body: \"\";\n message: string;\n position: number;\n }\n | { kind: \"body\"; body: string };\n\nconst MISSING_END_DELIMITER_MESSAGE = \"Missing YAML frontmatter end delimiter (---).\";\n\ntype LineEnd = {\n index: number;\n lineBreakLength: 0 | 1 | 2;\n};\n\nexport function splitFrontmatterBlock(source: string): SplitFrontmatterResult {\n const inspected = inspectFrontmatterBlock(source);\n\n if (inspected.kind === \"body\") {\n return { body: inspected.body };\n }\n\n if (inspected.kind === \"missing-closing-fence\") {\n throw new Error(inspected.message);\n }\n\n return {\n raw: inspected.raw,\n rawStart: inspected.rawStart,\n rawEnd: inspected.rawEnd,\n body: inspected.body\n };\n}\n\nexport function inspectFrontmatterBlock(source: string): InspectFrontmatterResult {\n const content = source.startsWith(\"\\uFEFF\") ? source.slice(1) : source;\n const sourceOffset = source.length - content.length;\n const opening = readOpeningFence(content);\n\n if (opening === undefined) {\n return { kind: \"body\", body: source };\n }\n\n const closing = findClosingFence(content, opening.next);\n\n if (closing === undefined) {\n return {\n kind: \"missing-closing-fence\",\n raw: content.slice(opening.next),\n rawStart: sourceOffset + opening.next,\n rawEnd: source.length,\n body: \"\",\n message: MISSING_END_DELIMITER_MESSAGE,\n position: source.length\n };\n }\n\n return {\n kind: \"frontmatter\",\n raw: content.slice(opening.next, closing.index),\n rawStart: sourceOffset + opening.next,\n rawEnd: sourceOffset + closing.index,\n body: content.slice(closing.end + closing.lineBreakLength)\n };\n}\n\nfunction readOpeningFence(source: string): { next: number } | undefined {\n if (!source.startsWith(\"---\")) {\n return undefined;\n }\n\n const lineEnd = findLineEnd(source, 0);\n\n if (lineEnd.lineBreakLength === 0 || !isFenceLine(source.slice(0, lineEnd.index))) {\n return undefined;\n }\n\n return { next: lineEnd.index + lineEnd.lineBreakLength };\n}\n\nfunction findClosingFence(\n source: string,\n start: number\n): { index: number; end: number; lineBreakLength: 0 | 1 | 2 } | undefined {\n let lineStart = start;\n\n while (lineStart <= source.length) {\n const lineEnd = findLineEnd(source, lineStart);\n\n if (isFenceLine(source.slice(lineStart, lineEnd.index))) {\n return {\n index: lineStart,\n end: lineEnd.index,\n lineBreakLength: lineEnd.lineBreakLength\n };\n }\n\n if (lineEnd.lineBreakLength === 0) {\n break;\n }\n\n lineStart = lineEnd.index + lineEnd.lineBreakLength;\n }\n\n return undefined;\n}\n\nfunction isFenceLine(line: string): boolean {\n if (!line.startsWith(\"---\")) {\n return false;\n }\n\n for (let index = 3; index < line.length; index += 1) {\n const character = line[index];\n\n if (character !== \" \" && character !== \"\\t\") {\n return false;\n }\n }\n\n return true;\n}\n\nfunction findLineEnd(source: string, start: number): LineEnd {\n let index = start;\n\n while (index < source.length) {\n const character = source[index];\n\n if (character === \"\\n\") {\n return { index, lineBreakLength: 1 };\n }\n\n if (character === \"\\r\") {\n return {\n index,\n lineBreakLength: source[index + 1] === \"\\n\" ? 2 : 1\n };\n }\n\n index += 1;\n }\n\n return { index: source.length, lineBreakLength: 0 };\n}\n", "import { LineCounter, parse, parseDocument } from \"yaml\";\nimport { inspectFrontmatterBlock, splitFrontmatterBlock } from \"./fences.js\";\n\nexport interface ParsedFrontmatter {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport interface ParsedFrontmatterDocument extends ParsedFrontmatter {\n errors: readonly { message: string; pos?: [number, number] }[];\n lineCounter: LineCounter;\n}\n\nexport interface ParseFrontmatterOptions {\n uniqueKeys?: boolean;\n}\n\nexport class FrontmatterParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FrontmatterParseError\";\n }\n}\n\nexport class FrontmatterKindError extends FrontmatterParseError {\n readonly expectedKind: string;\n readonly foundKind: string;\n\n constructor(message: string, kinds: { expected: string; found: string }) {\n super(message);\n this.name = \"FrontmatterKindError\";\n this.expectedKind = kinds.expected;\n this.foundKind = kinds.found;\n }\n}\n\nexport function isFrontmatterKindError(error: unknown): error is FrontmatterKindError {\n return (\n error instanceof Error &&\n error.name === \"FrontmatterKindError\" &&\n typeof (error as { expectedKind?: unknown }).expectedKind === \"string\" &&\n typeof (error as { foundKind?: unknown }).foundKind === \"string\"\n );\n}\n\nexport function parseFrontmatter(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatter {\n const split = splitFrontmatter(source);\n\n if (split.raw === undefined) {\n return {\n frontmatter: {},\n body: split.body\n };\n }\n\n return {\n frontmatter: parseYamlFrontmatter(split.raw, options),\n body: split.body\n };\n}\n\nexport function parseFrontmatterDocument(\n source: string,\n options: ParseFrontmatterOptions = {}\n): ParsedFrontmatterDocument {\n const split = inspectFrontmatterBlock(source);\n const lineCounter = createSourceLineCounter(source);\n\n if (split.kind === \"body\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [],\n lineCounter\n };\n }\n\n if (split.kind === \"missing-closing-fence\") {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: split.message, pos: [split.position, split.position] }],\n lineCounter\n };\n }\n\n const yamlLineCounter = new LineCounter();\n const normalizedYaml = normalizeYamlLineEndings(split.raw);\n const document = parseDocument(normalizedYaml, {\n lineCounter: yamlLineCounter,\n prettyErrors: false,\n uniqueKeys: options.uniqueKeys ?? false\n });\n const errors = document.errors.map((error) => ({\n message: error.message,\n ...(error.pos === undefined\n ? {}\n : { pos: translateYamlErrorPosition(error.pos as [number, number], split) })\n }));\n\n if (errors.length > 0) {\n return {\n frontmatter: {},\n body: split.body,\n errors,\n lineCounter\n };\n }\n\n try {\n return {\n frontmatter: normalizeYamlFrontmatter(document.toJSON()),\n body: split.body,\n errors,\n lineCounter\n };\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n return {\n frontmatter: {},\n body: split.body,\n errors: [{ message: error.message }],\n lineCounter\n };\n }\n\n throw error;\n }\n}\n\nfunction createSourceLineCounter(source: string): LineCounter {\n const lineCounter = new LineCounter();\n lineCounter.addNewLine(0);\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n\n if (character === \"\\n\") {\n lineCounter.addNewLine(index + 1);\n continue;\n }\n\n if (character === \"\\r\") {\n lineCounter.addNewLine(index + (source[index + 1] === \"\\n\" ? 2 : 1));\n if (source[index + 1] === \"\\n\") {\n index += 1;\n }\n }\n }\n\n return lineCounter;\n}\n\nfunction translateYamlErrorPosition(\n pos: [number, number],\n split: { raw: string; rawStart: number }\n): [number, number] {\n return pos.map((offset) => split.rawStart + normalizeYamlErrorOffset(split.raw, offset)) as [\n number,\n number\n ];\n}\n\nfunction normalizeYamlErrorOffset(raw: string, offset: number): number {\n if (offset >= raw.length && endsWithLineBreak(raw)) {\n return findPreviousLineStart(raw, raw.length);\n }\n\n return offset;\n}\n\nfunction endsWithLineBreak(value: string): boolean {\n return value.endsWith(\"\\n\") || value.endsWith(\"\\r\");\n}\n\nfunction findPreviousLineStart(value: string, end: number): number {\n let index = end - 1;\n\n if (value[index] === \"\\n\") {\n index -= 1;\n }\n\n if (value[index] === \"\\r\") {\n index -= 1;\n }\n\n while (index >= 0) {\n const character = value[index];\n\n if (character === \"\\n\" || character === \"\\r\") {\n return index + 1;\n }\n\n index -= 1;\n }\n\n return 0;\n}\n\nfunction splitFrontmatter(source: string): { raw?: string; body: string } {\n try {\n return splitFrontmatterBlock(source);\n } catch (error) {\n if (error instanceof Error) {\n throw new FrontmatterParseError(error.message);\n }\n\n throw error;\n }\n}\n\nfunction parseYamlFrontmatter(\n yamlBlock: string,\n options: ParseFrontmatterOptions\n): Record<string, unknown> {\n let parsed: unknown;\n\n try {\n parsed = parse(normalizeYamlLineEndings(yamlBlock), {\n uniqueKeys: options.uniqueKeys ?? false\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown YAML parse error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n\n return normalizeYamlFrontmatter(parsed);\n}\n\nfunction normalizeYamlLineEndings(value: string): string {\n if (!value.includes(\"\\r\")) {\n return value;\n }\n\n let normalized = \"\";\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n\n if (character !== \"\\r\") {\n normalized += character;\n continue;\n }\n\n if (value[index + 1] === \"\\n\") {\n normalized += \"\\r\\n\";\n index += 1;\n continue;\n }\n\n normalized += \"\\n\";\n }\n\n return normalized;\n}\n\nfunction normalizeYamlFrontmatter(value: unknown): Record<string, unknown> {\n if (value === null || value === undefined) {\n return {};\n }\n\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n\n return normalizeYamlValue(value) as Record<string, unknown>;\n}\n\nfunction normalizeYamlValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => normalizeYamlValue(item));\n }\n\n if (!isPlainRecord(value)) {\n return value;\n }\n\n const normalized: Record<string, unknown> = {};\n\n for (const [key, entryValue] of Object.entries(value)) {\n Object.defineProperty(normalized, key, {\n configurable: true,\n enumerable: true,\n value: normalizeYamlValue(entryValue),\n writable: true\n });\n }\n\n return normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import { stringify } from \"yaml\";\nimport { FrontmatterParseError } from \"./parse.js\";\n\nexport function stringifyFrontmatter(frontmatter: Record<string, unknown>, body: string): string {\n try {\n assertFrontmatterRoot(frontmatter);\n assertAcyclic(frontmatter);\n return `---\\n${stringify(frontmatter, { aliasDuplicateObjects: false }).trimEnd()}\\n---\\n${body}`;\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : \"Unknown YAML stringify error\";\n throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);\n }\n}\n\nfunction assertFrontmatterRoot(value: unknown): asserts value is Record<string, unknown> {\n if (!isPlainRecord(value)) {\n throw new FrontmatterParseError(\"YAML frontmatter must parse to an object.\");\n }\n}\n\nfunction assertAcyclic(value: unknown, seen: WeakSet<object> = new WeakSet()): void {\n if (typeof value !== \"object\" || value === null) {\n return;\n }\n\n if (seen.has(value)) {\n throw new FrontmatterParseError(\"Cannot stringify cyclic frontmatter.\");\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n for (const item of value) {\n assertAcyclic(item, seen);\n }\n } else {\n for (const item of Object.values(value)) {\n assertAcyclic(item, seen);\n }\n }\n\n seen.delete(value);\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "import { FrontmatterParseError, parseFrontmatterDocument } from \"@poe-code/frontmatter\";\n\nexport interface SplitFrontmatterResult {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\nexport function splitFrontmatter(markdown: string): SplitFrontmatterResult {\n try {\n const parsed = parseFrontmatterDocument(markdown);\n\n if (parsed.errors.length > 0) {\n const firstError = parsed.errors[0];\n const line =\n firstError?.pos === undefined ? 2 : parsed.lineCounter.linePos(firstError.pos[0]).line;\n const message = firstError?.message ?? \"unknown YAML parse error\";\n throw toSafeJSDiagnosticError(line, message);\n }\n\n return {\n frontmatter: parsed.frontmatter,\n body: parsed.body\n };\n } catch (error) {\n if (error instanceof FrontmatterParseError) {\n throw toSafeJSFrontmatterError(markdown, error);\n }\n\n throw error;\n }\n}\n\nfunction toSafeJSDiagnosticError(line: number, message: string): Error {\n if (message === \"Missing YAML frontmatter end delimiter (---).\") {\n return new Error(`Invalid frontmatter at line ${line}: missing closing delimiter (---).`);\n }\n\n if (message === \"YAML frontmatter must parse to an object.\") {\n return new Error(`Invalid frontmatter at line ${line}: expected a YAML mapping.`);\n }\n\n return new Error(`Invalid YAML frontmatter at line ${line}: ${message}`);\n}\n\nfunction toSafeJSFrontmatterError(markdown: string, error: FrontmatterParseError): Error {\n if (error.message === \"Missing YAML frontmatter end delimiter (---).\") {\n return new Error(\n `Invalid frontmatter at line ${countLines(stripByteOrderMark(markdown))}: missing closing delimiter (---).`\n );\n }\n\n if (error.message === \"YAML frontmatter must parse to an object.\") {\n return new Error(\"Invalid frontmatter at line 2: expected a YAML mapping.\");\n }\n\n if (error.message.startsWith(\"Invalid YAML frontmatter: \")) {\n return new Error(`Invalid YAML frontmatter at line 2: ${error.message.slice(26)}`);\n }\n\n return error;\n}\n\nfunction stripByteOrderMark(value: string): string {\n return value.startsWith(\"\\uFEFF\") ? value.slice(1) : value;\n}\n\nfunction countLines(value: string): number {\n let count = 1;\n\n for (const character of value) {\n if (character === \"\\n\") {\n count += 1;\n }\n }\n\n return count;\n}\n", "import type { CallerInjectedBinding } from \"../interp/host-bridge.js\";\nimport { isSandboxClosure } from \"../interp/values.js\";\nimport type { ModuleExports, ModuleRegistry } from \"../modules/registry.js\";\nimport type { LintModuleExport, LintModuleExports, Modules } from \"./rules/module-registry.js\";\n\nconst AsyncFunction = (async () => undefined).constructor;\n\nexport function createLintModulesFromRuntimeRegistry(modules: ModuleRegistry): Modules {\n const entries = modules instanceof Map ? [...modules.entries()] : Object.entries(modules);\n\n return new Map(\n entries.map(([moduleName, moduleExports]) => [\n moduleName,\n {\n exports: createLintModuleExports(moduleExports)\n }\n ])\n );\n}\n\nfunction createLintModuleExports(moduleExports: ModuleExports): LintModuleExports {\n const entries =\n moduleExports instanceof Map ? [...moduleExports.entries()] : Object.entries(moduleExports);\n\n return new Map(\n entries\n .filter(([exportName]) => exportName.length > 0)\n .map(([exportName, value]) => [exportName, createLintModuleExport(value)] as const)\n .sort(([left], [right]) => left.localeCompare(right))\n );\n}\n\nfunction createLintModuleExport(value: CallerInjectedBinding): LintModuleExport {\n return isAsyncRuntimeExport(value) ? { async: true } : {};\n}\n\nfunction isAsyncRuntimeExport(value: CallerInjectedBinding): boolean {\n if (isSandboxClosure(value)) {\n return value.async === true;\n }\n\n return typeof value === \"function\" && value.constructor === AsyncFunction;\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport { supportsSpawnMode } from \"@poe-code/agent-spawn/configs\";\nimport {\n createSpawnParallel,\n SpawnParallelError,\n type SpawnParallelOptions\n} from \"@poe-code/agent-spawn/parallel\";\nimport { DEFAULT_SPAWN_MODE, type SpawnUsage } from \"@poe-code/agent-spawn/types\";\nimport { hostErrorData } from \"../error/shape.js\";\nimport {\n bindOtelSpan,\n activateOtelSpan,\n getActiveOtelSink,\n safeAddEvent,\n safeEndSpan,\n safeRecordException,\n safeStartSpan,\n type OtelSink\n} from \"../observability/otel.js\";\n\nexport type AgentSpawnMode = \"read\" | \"edit\" | \"auto\" | \"yolo\";\n\nexport type AgentModuleMcpServer = {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n timeout?: number;\n};\n\nexport type AgentModuleMcpConfig = Record<string, AgentModuleMcpServer>;\n\nexport type AgentModuleDefinition =\n | string\n | {\n agent: string;\n prompt?: string;\n model?: string;\n mode?: AgentSpawnMode;\n cwd?: string;\n mcp?: AgentModuleMcpConfig;\n };\n\nexport type AgentModuleSpawnOptions = {\n prompt: string;\n check?: boolean;\n label?: string;\n mcp?: AgentModuleMcpConfig;\n model?: string;\n mode?: AgentSpawnMode;\n cwd?: string;\n otelSink?: OtelSink;\n timeoutMs?: number;\n signal?: AbortSignal;\n};\n\nexport type SpawnAgentInput = Omit<AgentModuleSpawnOptions, \"label\" | \"check\"> & {\n agent: string;\n};\n\ntype ResolvedSpawnAgentInput = SpawnAgentInput & { label?: string; check: boolean };\n\nexport type SpawnAgentResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n summary: string;\n durationMs: number;\n usage?: SpawnUsage;\n};\n\nexport type SpawnAgent = (input: SpawnAgentInput) => Promise<SpawnAgentResult>;\n\nexport class AgentSpawnError extends Error {\n readonly result: SpawnAgentResult;\n\n constructor(result: SpawnAgentResult) {\n super(createSpawnFailureMessage(result));\n this.name = \"AgentSpawnError\";\n this.result = result;\n hostErrorData.set(this, { result });\n }\n}\n\nexport type AgentModuleOptions = {\n defaultRetry?: AgentModuleRetryOptions;\n onEvent?: (event: AgentSpawnEvent) => void | Promise<void>;\n otelSink?: OtelSink;\n};\n\nexport type AgentSpawnEvent =\n | {\n type: \"spawn.started\";\n spawnId: number;\n agent: string;\n task: string;\n attempt: number;\n maxAttempts: number;\n }\n | {\n type: \"spawn.retry\";\n spawnId: number;\n agent: string;\n task: string;\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n error: string;\n }\n | {\n type: \"spawn.succeeded\";\n spawnId: number;\n agent: string;\n task: string;\n attempt: number;\n maxAttempts: number;\n durationMs: number;\n }\n | {\n type: \"spawn.failed\";\n checked: boolean;\n spawnId: number;\n agent: string;\n task: string;\n attempt: number;\n maxAttempts: number;\n durationMs: number;\n error: string;\n }\n | {\n type: \"spawn.cancelled\";\n spawnId: number;\n agent: string;\n task: string;\n attempt: number;\n maxAttempts: number;\n durationMs: number;\n reason: string;\n };\n\nexport type SpawnUsageTotal = {\n inputTokens: number;\n outputTokens: number;\n cachedTokens: number;\n costUsd?: number;\n spawnCount: number;\n attemptCount?: number;\n};\n\nexport type SpawnUsageAccumulator = {\n beginAttempt?(): void;\n beginSpawn?(): void;\n record(usage: SpawnUsage | undefined): void;\n reset(): void;\n snapshot(): SpawnUsageTotal;\n};\n\nconst activeUsageAccumulator = new AsyncLocalStorage<SpawnUsageAccumulator>();\n\nexport function createSpawnUsageAccumulator(): SpawnUsageAccumulator {\n let inputTokens = 0;\n let outputTokens = 0;\n let cachedTokens = 0;\n let costUsd: number | undefined;\n let spawnCount = 0;\n let attemptCount = 0;\n\n return {\n beginAttempt() {\n attemptCount += 1;\n },\n beginSpawn() {\n spawnCount += 1;\n },\n record(usage) {\n if (usage === undefined) {\n return;\n }\n\n inputTokens += usage.inputTokens;\n outputTokens += usage.outputTokens;\n cachedTokens += usage.cachedTokens ?? 0;\n\n if (usage.costUsd !== undefined) {\n costUsd = (costUsd ?? 0) + usage.costUsd;\n }\n },\n reset() {\n inputTokens = 0;\n outputTokens = 0;\n cachedTokens = 0;\n costUsd = undefined;\n spawnCount = 0;\n attemptCount = 0;\n },\n snapshot() {\n return {\n inputTokens,\n outputTokens,\n cachedTokens,\n ...(costUsd === undefined ? {} : { costUsd }),\n spawnCount,\n ...(attemptCount === spawnCount ? {} : { attemptCount })\n };\n }\n };\n}\n\nexport async function runWithSpawnUsageAccumulator<TResult>(\n accumulator: SpawnUsageAccumulator,\n operation: () => Promise<TResult>\n): Promise<TResult> {\n accumulator.reset();\n return await activeUsageAccumulator.run(accumulator, operation);\n}\n\nexport type AgentModuleRetryOptions = {\n maxAttempts: number;\n backoffMs: number;\n isErrorRetryable?: (error: unknown) => boolean;\n isRetryable?: (result: SpawnAgentResult) => boolean;\n};\n\nexport type AgentModuleParallelCall =\n | readonly [agentDef: AgentModuleDefinition, options: AgentModuleSpawnOptions]\n | ((signal?: AbortSignal) => {\n events: AsyncIterable<never>;\n result: Promise<SpawnAgentResult>;\n });\n\ntype AgentModuleSpawn = {\n (agentDef: AgentModuleDefinition, options: AgentModuleSpawnOptions): Promise<SpawnAgentResult>;\n retry(\n agentDef: AgentModuleDefinition,\n options: AgentModuleSpawnOptions,\n retryOptions: AgentModuleRetryOptions\n ): Promise<SpawnAgentResult>;\n parallel(\n calls: AgentModuleParallelCall[],\n options?: SpawnParallelOptions\n ): Promise<SpawnAgentResult[]>;\n};\n\nexport function makeAgentModule(\n spawnAgent: SpawnAgent,\n moduleOptions: AgentModuleOptions = {}\n): {\n spawn: AgentModuleSpawn;\n} {\n const defaultRetry =\n moduleOptions.defaultRetry === undefined\n ? undefined\n : normalizeRetryOptions(moduleOptions.defaultRetry);\n let nextSpawnId = 1;\n\n const spawnOnce = async (\n agentDef: AgentModuleDefinition,\n options: AgentModuleSpawnOptions\n ): Promise<SpawnAgentResult> => {\n const input = resolveSpawnInput(agentDef, options);\n const spawnId = nextSpawnId;\n nextSpawnId += 1;\n recordActiveSpawnStart();\n return runObservedSpawn(moduleOptions.otelSink, input, async () => {\n return defaultRetry === undefined\n ? runSpawnAttempt(spawnAgent, input, moduleOptions.onEvent, spawnId)\n : runSpawnRetry(spawnAgent, input, defaultRetry, moduleOptions.onEvent, spawnId);\n });\n };\n\n return {\n spawn: Object.assign(spawnOnce, {\n async retry(\n agentDef: AgentModuleDefinition,\n options: AgentModuleSpawnOptions,\n retryOptions: AgentModuleRetryOptions\n ) {\n const input = resolveSpawnInput(agentDef, options);\n const normalizedRetry = normalizeRetryOptions(retryOptions);\n const spawnId = nextSpawnId;\n nextSpawnId += 1;\n recordActiveSpawnStart();\n return await runObservedSpawn(moduleOptions.otelSink, input, () =>\n runSpawnRetry(\n spawnAgent,\n input,\n normalizedRetry,\n moduleOptions.onEvent,\n spawnId\n )\n );\n },\n async parallel(calls: AgentModuleParallelCall[], options: SpawnParallelOptions = {}) {\n const check =\n readOptionalBoolean(getOwnProperty(options, \"check\"), \"Agent parallel options check\") ??\n false;\n const parallel = createSpawnParallel<\n AgentModuleDefinition,\n AgentModuleSpawnOptions,\n SpawnAgentResult\n >((agentDef, spawnOptions) => ({\n events: (async function* () {})(),\n result: (() => {\n const input = resolveSpawnInput(agentDef, spawnOptions);\n const spawnId = nextSpawnId;\n nextSpawnId += 1;\n recordActiveSpawnStart();\n return runObservedSpawn(moduleOptions.otelSink, input, () =>\n runSpawnRetry(\n spawnAgent,\n input,\n defaultRetry ?? oneAttemptRetryOptions,\n (event) =>\n moduleOptions.onEvent?.(\n event.type === \"spawn.failed\"\n ? { ...event, checked: event.checked || check }\n : event\n ),\n spawnId\n )\n );\n })()\n }));\n try {\n return await parallel(calls, { ...options, check });\n } catch (error) {\n if (error instanceof SpawnParallelError) {\n hostErrorData.set(error, {\n index: error.index,\n result: error.result,\n results: error.results\n });\n }\n throw error;\n }\n }\n })\n };\n}\n\nasync function runSpawnAttempt(\n spawnAgent: SpawnAgent,\n input: ResolvedSpawnAgentInput,\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n spawnId: number\n): Promise<SpawnAgentResult> {\n const task = resolveTaskLabel(input);\n const startedAt = Date.now();\n try {\n throwIfAborted(input.signal);\n } catch (error) {\n emitSpawnCancelled(onEvent, spawnId, input.agent, task, 1, 1, Date.now() - startedAt, error);\n throw error;\n }\n emitSpawnEvent(onEvent, {\n type: \"spawn.started\",\n spawnId,\n agent: input.agent,\n task,\n attempt: 1,\n maxAttempts: 1\n });\n\n try {\n recordActiveSpawnAttempt();\n const result = validateSpawnResult(await spawnAgent(toProviderSpawnInput(input)));\n throwIfAborted(input.signal);\n recordActiveSpawnUsage(result.usage);\n\n if (result.exitCode !== 0) {\n const error = new AgentSpawnError(result);\n if (input.check) {\n throw error;\n }\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n 1,\n 1,\n result.durationMs,\n error,\n false\n );\n return result;\n }\n\n emitSpawnEvent(onEvent, {\n type: \"spawn.succeeded\",\n spawnId,\n agent: input.agent,\n task,\n attempt: 1,\n maxAttempts: 1,\n durationMs: result.durationMs\n });\n return result;\n } catch (error) {\n if (isAbortError(error, input.signal)) {\n const reason = input.signal?.aborted ? readAbortReason(input.signal) : error;\n emitSpawnCancelled(onEvent, spawnId, input.agent, task, 1, 1, Date.now() - startedAt, reason);\n throw reason;\n }\n emitSpawnEvent(onEvent, {\n type: \"spawn.failed\",\n checked: true,\n spawnId,\n agent: input.agent,\n task,\n attempt: 1,\n maxAttempts: 1,\n durationMs: Date.now() - startedAt,\n error: formatSpawnError(error)\n });\n throw error;\n }\n}\n\nfunction runObservedSpawn(\n moduleSink: OtelSink | undefined,\n input: ResolvedSpawnAgentInput,\n operation: () => Promise<SpawnAgentResult>\n): Promise<SpawnAgentResult> {\n const otelSink = input.otelSink ?? moduleSink ?? getActiveOtelSink();\n const cwd = input.cwd ?? readCurrentWorkingDirectory();\n const span = safeStartSpan(otelSink, \"agent.spawn\", {\n agent: input.agent,\n mode: input.mode ?? DEFAULT_SPAWN_MODE,\n cwd\n });\n const deactivateSpan = activateOtelSpan(span);\n safeAddEvent(span, \"prompt\", { prompt: input.prompt });\n\n const promise = (async () => {\n try {\n const result = await operation();\n safeAddEvent(span, \"summary\", { summary: result.summary });\n safeAddEvent(span, \"exit\", {\n exitCode: result.exitCode,\n durationMs: result.durationMs\n });\n return result;\n } catch (error) {\n safeRecordException(otelSink, span, error);\n throw error;\n } finally {\n deactivateSpan();\n safeEndSpan(span);\n }\n })();\n\n bindOtelSpan(promise, span);\n return promise;\n}\n\nfunction readCurrentWorkingDirectory(): string {\n try {\n return process.cwd();\n } catch (error) {\n throw new Error(`Unable to resolve current working directory: ${formatSpawnError(error)}`);\n }\n}\n\nasync function runSpawnRetry(\n spawnAgent: SpawnAgent,\n input: ResolvedSpawnAgentInput,\n retryOptions: Required<AgentModuleRetryOptions>,\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n spawnId: number\n): Promise<SpawnAgentResult> {\n const task = resolveTaskLabel(input);\n const startedAt = Date.now();\n for (let attempt = 1; attempt <= retryOptions.maxAttempts; attempt += 1) {\n try {\n throwIfAborted(input.signal);\n } catch (error) {\n emitSpawnCancelled(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n error\n );\n throw error;\n }\n emitSpawnEvent(onEvent, {\n type: \"spawn.started\",\n spawnId,\n agent: input.agent,\n task,\n attempt,\n maxAttempts: retryOptions.maxAttempts\n });\n\n let result: SpawnAgentResult;\n try {\n recordActiveSpawnAttempt();\n result = validateSpawnResult(await spawnAgent(toProviderSpawnInput(input)));\n throwIfAborted(input.signal);\n } catch (error) {\n if (isAbortError(error, input.signal)) {\n const reason = input.signal?.aborted ? readAbortReason(input.signal) : error;\n emitSpawnCancelled(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n reason\n );\n throw reason;\n }\n\n if (attempt >= retryOptions.maxAttempts) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n error\n );\n throw error;\n }\n\n let retryable: boolean;\n try {\n retryable = retryOptions.isErrorRetryable(error);\n } catch (classifierError) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n classifierError\n );\n throw classifierError;\n }\n\n if (!retryable) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n error\n );\n throw error;\n }\n\n try {\n await retryOrThrow(\n error,\n input,\n retryOptions,\n onEvent,\n spawnId,\n task,\n attempt,\n Date.now() - startedAt\n );\n } catch (retryError) {\n if (isAbortError(retryError, input.signal)) {\n emitSpawnCancelled(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n retryError\n );\n }\n throw retryError;\n }\n continue;\n }\n\n recordActiveSpawnUsage(result.usage);\n if (result.exitCode === 0) {\n emitSpawnEvent(onEvent, {\n type: \"spawn.succeeded\",\n spawnId,\n agent: input.agent,\n task,\n attempt,\n maxAttempts: retryOptions.maxAttempts,\n durationMs: Date.now() - startedAt\n });\n return result;\n }\n\n const error = new AgentSpawnError(result);\n if (attempt >= retryOptions.maxAttempts) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n error,\n input.check\n );\n if (input.check) {\n throw error;\n }\n return result;\n }\n\n let retryable: boolean;\n try {\n retryable = retryOptions.isRetryable(result);\n } catch (classifierError) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n classifierError\n );\n throw classifierError;\n }\n\n if (!retryable) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n error,\n input.check\n );\n if (input.check) {\n throw error;\n }\n return result;\n }\n\n try {\n await scheduleRetry(error, input, retryOptions, onEvent, spawnId, task, attempt);\n } catch (retryError) {\n if (isAbortError(retryError, input.signal)) {\n emitSpawnCancelled(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n Date.now() - startedAt,\n retryError\n );\n }\n throw retryError;\n }\n }\n\n throw new Error(\"agent.spawn.retry reached an unreachable retry state.\");\n}\n\nfunction emitSpawnCancelled(\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n spawnId: number,\n agent: string,\n task: string,\n attempt: number,\n maxAttempts: number,\n durationMs: number,\n error: unknown\n): void {\n emitSpawnEvent(onEvent, {\n type: \"spawn.cancelled\",\n spawnId,\n agent,\n task,\n attempt,\n maxAttempts,\n durationMs,\n reason: formatSpawnError(error)\n });\n}\n\nasync function retryOrThrow(\n error: unknown,\n input: ResolvedSpawnAgentInput,\n retryOptions: Required<AgentModuleRetryOptions>,\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n spawnId: number,\n task: string,\n attempt: number,\n durationMs: number\n): Promise<void> {\n if (attempt >= retryOptions.maxAttempts) {\n emitFinalSpawnFailure(\n onEvent,\n spawnId,\n input.agent,\n task,\n attempt,\n retryOptions.maxAttempts,\n durationMs,\n error\n );\n throw error;\n }\n\n await scheduleRetry(error, input, retryOptions, onEvent, spawnId, task, attempt);\n}\n\nasync function scheduleRetry(\n error: unknown,\n input: ResolvedSpawnAgentInput,\n retryOptions: Required<AgentModuleRetryOptions>,\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n spawnId: number,\n task: string,\n attempt: number\n): Promise<void> {\n const delayMs = calculateBackoffMs(retryOptions.backoffMs, attempt);\n emitSpawnEvent(onEvent, {\n type: \"spawn.retry\",\n spawnId,\n agent: input.agent,\n task,\n attempt,\n maxAttempts: retryOptions.maxAttempts,\n delayMs,\n error: formatSpawnError(error)\n });\n await sleep(delayMs, input.signal);\n}\n\nfunction emitFinalSpawnFailure(\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n spawnId: number,\n agent: string,\n task: string,\n attempt: number,\n maxAttempts: number,\n durationMs: number,\n error: unknown,\n checked = true\n): void {\n emitSpawnEvent(onEvent, {\n type: \"spawn.failed\",\n checked,\n spawnId,\n agent,\n task,\n attempt,\n maxAttempts,\n durationMs,\n error: formatSpawnError(error)\n });\n}\n\nfunction emitSpawnEvent(\n onEvent: ((event: AgentSpawnEvent) => void | Promise<void>) | undefined,\n event: AgentSpawnEvent\n): void {\n try {\n const agent = sanitizeLifecycleText(event.agent, 48) || \"agent\";\n const result = onEvent?.({ ...event, agent });\n if (isPromiseLike(result)) {\n void result.catch((error) => warnSpawnEventObserverFailure(error));\n }\n } catch (error) {\n warnSpawnEventObserverFailure(error);\n }\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<void> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"catch\" in value &&\n typeof value.catch === \"function\"\n );\n}\n\nfunction warnSpawnEventObserverFailure(error: unknown): void {\n console.warn(`Agent spawn event observer failed: ${formatSpawnError(error)}`);\n}\n\nfunction createTaskLabel(prompt: string): string {\n const lines = prompt.split(\"\\n\").map((line) => line.trim());\n const taskHeadingIndex = lines.indexOf(\"# Task\");\n const relevantLines = taskHeadingIndex < 0 ? lines : lines.slice(taskHeadingIndex + 1);\n const firstLine = sanitizeLifecycleText(\n relevantLines.find((line) => line.length > 0) ?? \"agent task\",\n 72\n );\n if (firstLine.length === 0) {\n return \"agent task\";\n }\n return firstLine.length > 72 ? `${firstLine.slice(0, 71)}\u2026` : firstLine;\n}\n\nfunction resolveTaskLabel(input: ResolvedSpawnAgentInput): string {\n return input.label ?? createTaskLabel(input.prompt);\n}\n\nfunction isAbortError(error: unknown, signal?: AbortSignal): boolean {\n return signal?.aborted === true || readErrorField(error, \"name\") === \"AbortError\";\n}\n\nfunction formatSpawnError(error: unknown): string {\n return sanitizeLifecycleText(readErrorField(error, \"message\") ?? String(error), 400);\n}\n\nfunction sanitizeLifecycleText(value: string, maxLength: number): string {\n let sanitized = \"\";\n for (const character of value) {\n const code = character.charCodeAt(0);\n if (\n character === \"\\n\" ||\n character === \"\\r\" ||\n character === \"\\t\" ||\n code < 32 ||\n code === 127\n ) {\n sanitized += \" \";\n } else {\n sanitized += character;\n }\n }\n const compact = sanitized\n .split(\" \")\n .filter((part) => part.length > 0)\n .join(\" \");\n return compact.length > maxLength ? `${compact.slice(0, maxLength - 1)}\u2026` : compact;\n}\n\nfunction readErrorField(error: unknown, field: \"message\" | \"name\"): string | undefined {\n if (typeof error !== \"object\" || error === null || !(field in error)) {\n return undefined;\n }\n const value = (error as Record<string, unknown>)[field];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction normalizeRetryOptions(\n retryOptions: AgentModuleRetryOptions | unknown\n): Required<AgentModuleRetryOptions> {\n if (!isRecord(retryOptions)) {\n throw new Error(\"Agent spawn retry options must be an object.\");\n }\n\n const maxAttempts = readFiniteNumber(\n getOwnProperty(retryOptions, \"maxAttempts\"),\n \"Agent spawn retry maxAttempts\"\n );\n if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new Error(\"Agent spawn retry maxAttempts must be an integer greater than or equal to 1.\");\n }\n if (maxAttempts > 5) {\n throw new Error(\"Agent spawn retry maxAttempts must not exceed 5.\");\n }\n\n const backoffMs = readNonNegativeFiniteNumber(\n getOwnProperty(retryOptions, \"backoffMs\"),\n \"Agent spawn retry backoffMs\"\n );\n\n const isRetryableValue = getOwnProperty(retryOptions, \"isRetryable\");\n if (isRetryableValue !== undefined && typeof isRetryableValue !== \"function\") {\n throw new Error(\"Agent spawn retry isRetryable must be a function.\");\n }\n const isRetryable =\n isRetryableValue === undefined\n ? defaultIsRetryable\n : (isRetryableValue as (result: SpawnAgentResult) => boolean);\n\n const isErrorRetryableValue = getOwnProperty(retryOptions, \"isErrorRetryable\");\n if (isErrorRetryableValue !== undefined && typeof isErrorRetryableValue !== \"function\") {\n throw new Error(\"Agent spawn retry isErrorRetryable must be a function.\");\n }\n\n return createNullRecord({\n maxAttempts,\n backoffMs,\n isErrorRetryable:\n isErrorRetryableValue === undefined\n ? () => true\n : (isErrorRetryableValue as (error: unknown) => boolean),\n isRetryable\n });\n}\n\nfunction defaultIsRetryable(result: SpawnAgentResult): boolean {\n return (\n result.exitCode === 1 ||\n result.exitCode === 124 ||\n result.exitCode === 125 ||\n result.exitCode === 137\n );\n}\n\nconst oneAttemptRetryOptions: Required<AgentModuleRetryOptions> = {\n maxAttempts: 1,\n backoffMs: 0,\n isErrorRetryable: () => false,\n isRetryable: () => false\n};\n\nfunction calculateBackoffMs(baseBackoffMs: number, completedAttempt: number): number {\n return Math.min(baseBackoffMs * 2 ** (completedAttempt - 1), 30_000);\n}\n\nfunction sleep(delayMs: number, signal: AbortSignal | undefined): Promise<void> {\n throwIfAborted(signal);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n const onAbort = () => {\n clearTimeout(timeout);\n reject(readAbortReason(signal));\n };\n\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw readAbortReason(signal);\n }\n}\n\nfunction readAbortReason(signal: AbortSignal | undefined): unknown {\n if (signal?.reason !== undefined) return signal.reason;\n const error = new Error(\"Agent spawn retry aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction resolveSpawnInput(\n agentDef: AgentModuleDefinition,\n options: AgentModuleSpawnOptions\n): ResolvedSpawnAgentInput {\n const definition = normalizeAgentDefinition(agentDef);\n const normalizedOptions = normalizeSpawnOptions(options);\n const mode = normalizedOptions.mode ?? definition.mode;\n\n if (mode !== undefined && !supportsSpawnMode(definition.agent, mode)) {\n throw new Error(`Agent \"${definition.agent}\" does not support mode \"${mode}\".`);\n }\n\n return createNullRecord({\n agent: definition.agent,\n prompt: prependSystemPrompt(definition.prompt, normalizedOptions.prompt),\n check: normalizedOptions.check ?? false,\n ...(normalizedOptions.label !== undefined ? { label: normalizedOptions.label } : {}),\n ...((normalizedOptions.model ?? definition.model)\n ? { model: normalizedOptions.model ?? definition.model }\n : {}),\n ...((normalizedOptions.mode ?? definition.mode)\n ? { mode: normalizedOptions.mode ?? definition.mode }\n : {}),\n ...((normalizedOptions.cwd ?? definition.cwd)\n ? { cwd: normalizedOptions.cwd ?? definition.cwd }\n : {}),\n ...(normalizedOptions.otelSink !== undefined ? { otelSink: normalizedOptions.otelSink } : {}),\n ...((normalizedOptions.mcp ?? definition.mcp)\n ? { mcp: normalizedOptions.mcp ?? definition.mcp }\n : {}),\n ...(normalizedOptions.timeoutMs !== undefined\n ? { timeoutMs: normalizedOptions.timeoutMs }\n : {}),\n ...(normalizedOptions.signal !== undefined ? { signal: normalizedOptions.signal } : {})\n });\n}\n\nfunction normalizeAgentDefinition(\n agentDef: AgentModuleDefinition | unknown\n): Exclude<AgentModuleDefinition, string> {\n if (typeof agentDef === \"string\") {\n return createNullRecord({\n agent: readRequiredAgent(agentDef)\n });\n }\n\n if (!isRecord(agentDef)) {\n throw new Error(\"Agent definition must be a string or object.\");\n }\n\n const prompt = getOwnProperty(agentDef, \"prompt\");\n const model = getOwnProperty(agentDef, \"model\");\n const mode = getOwnProperty(agentDef, \"mode\");\n const cwd = getOwnProperty(agentDef, \"cwd\");\n const mcp = getOwnProperty(agentDef, \"mcp\");\n\n return createNullRecord({\n agent: readRequiredAgent(getOwnProperty(agentDef, \"agent\")),\n ...(prompt === undefined\n ? {}\n : { prompt: readOptionalString(prompt, \"Agent definition prompt\") }),\n ...(model === undefined ? {} : { model: readOptionalString(model, \"Agent definition model\") }),\n ...(mode === undefined ? {} : { mode: readSpawnMode(mode, \"Agent definition mode\") }),\n ...(cwd === undefined ? {} : { cwd: readOptionalString(cwd, \"Agent definition cwd\") }),\n ...(mcp === undefined ? {} : { mcp: readMcpConfig(mcp, \"Agent definition mcp\") })\n });\n}\n\nfunction normalizeSpawnOptions(\n options: AgentModuleSpawnOptions | unknown\n): AgentModuleSpawnOptions {\n if (!isRecord(options)) {\n throw new Error(\"Agent spawn options must be an object.\");\n }\n\n const label = getOwnProperty(options, \"label\");\n const model = getOwnProperty(options, \"model\");\n const mode = getOwnProperty(options, \"mode\");\n const cwd = getOwnProperty(options, \"cwd\");\n const otelSink = getOwnProperty(options, \"otelSink\");\n const mcp = getOwnProperty(options, \"mcp\");\n const timeoutMs = getOwnProperty(options, \"timeoutMs\");\n const signal = getOwnProperty(options, \"signal\");\n\n return createNullRecord({\n prompt: readRequiredPrompt(getOwnProperty(options, \"prompt\")),\n check: readOptionalBoolean(getOwnProperty(options, \"check\"), \"Agent spawn options check\"),\n ...(label === undefined\n ? {}\n : { label: readRequiredString(label, \"Agent spawn options label\") }),\n ...(model === undefined\n ? {}\n : { model: readOptionalString(model, \"Agent spawn options model\") }),\n ...(mode === undefined ? {} : { mode: readSpawnMode(mode, \"Agent spawn options mode\") }),\n ...(cwd === undefined ? {} : { cwd: readOptionalString(cwd, \"Agent spawn options cwd\") }),\n ...(otelSink === undefined ? {} : { otelSink: readOtelSink(otelSink) }),\n ...(mcp === undefined ? {} : { mcp: readMcpConfig(mcp, \"Agent spawn options mcp\") }),\n ...(timeoutMs === undefined\n ? {}\n : {\n timeoutMs: readNonNegativeFiniteNumber(timeoutMs, \"Agent spawn options timeoutMs\")\n }),\n ...(signal === undefined\n ? {}\n : { signal: readAbortSignal(signal, \"Agent spawn options signal\") })\n });\n}\n\nfunction toProviderSpawnInput(input: ResolvedSpawnAgentInput): SpawnAgentInput {\n const { label: ignoredLabel, check: ignoredCheck, ...providerInput } = input;\n void ignoredLabel;\n void ignoredCheck;\n return providerInput;\n}\n\nfunction readOptionalBoolean(value: unknown, label: string): boolean | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"boolean\") throw new Error(`${label} must be a boolean.`);\n return value;\n}\n\nfunction validateSpawnResult(result: unknown): SpawnAgentResult {\n if (!isRecord(result)) {\n throw new Error(\"spawnAgent must resolve to an object result.\");\n }\n\n const usage = getOwnProperty(result, \"usage\");\n\n return createNullRecord({\n exitCode: readFiniteNumber(getOwnProperty(result, \"exitCode\"), \"spawnAgent result exitCode\"),\n stdout: readOptionalString(getOwnProperty(result, \"stdout\"), \"spawnAgent result stdout\") ?? \"\",\n stderr: readOptionalString(getOwnProperty(result, \"stderr\"), \"spawnAgent result stderr\") ?? \"\",\n summary:\n readOptionalString(getOwnProperty(result, \"summary\"), \"spawnAgent result summary\") ?? \"\",\n durationMs: readNonNegativeFiniteNumber(\n getOwnProperty(result, \"durationMs\"),\n \"spawnAgent result durationMs\"\n ),\n ...(usage === undefined ? {} : { usage: readSpawnUsage(usage) })\n });\n}\n\nfunction recordActiveSpawnUsage(usage: SpawnUsage | undefined): void {\n activeUsageAccumulator.getStore()?.record(usage);\n}\n\nfunction recordActiveSpawnAttempt(): void {\n activeUsageAccumulator.getStore()?.beginAttempt?.();\n}\n\nfunction recordActiveSpawnStart(): void {\n activeUsageAccumulator.getStore()?.beginSpawn?.();\n}\n\nfunction readSpawnUsage(value: unknown): SpawnUsage {\n if (!isRecord(value)) {\n throw new Error(\"spawnAgent result usage must be an object.\");\n }\n\n const cachedTokens = getOwnProperty(value, \"cachedTokens\");\n const costUsd = getOwnProperty(value, \"costUsd\");\n\n return createNullRecord({\n inputTokens: readNonNegativeFiniteNumber(\n getOwnProperty(value, \"inputTokens\"),\n \"spawnAgent result usage inputTokens\"\n ),\n outputTokens: readNonNegativeFiniteNumber(\n getOwnProperty(value, \"outputTokens\"),\n \"spawnAgent result usage outputTokens\"\n ),\n ...(cachedTokens === undefined\n ? {}\n : {\n cachedTokens: readNonNegativeFiniteNumber(\n cachedTokens,\n \"spawnAgent result usage cachedTokens\"\n )\n }),\n ...(costUsd === undefined\n ? {}\n : {\n costUsd: readNonNegativeFiniteNumber(costUsd, \"spawnAgent result usage costUsd\")\n })\n });\n}\n\nfunction prependSystemPrompt(systemPrompt: string | undefined, userPrompt: string): string {\n if (systemPrompt === undefined || systemPrompt.trim().length === 0) {\n return userPrompt;\n }\n\n return `${systemPrompt}\\n\\n# Task\\n\\n${userPrompt}`;\n}\n\nfunction createSpawnFailureMessage(result: SpawnAgentResult): string {\n const stderr = result.stderr.trim();\n const summary = result.summary.trim();\n return stderr.length > 0\n ? `Agent spawn failed with exit code ${result.exitCode}: ${stderr}`\n : summary.length > 0\n ? `Agent spawn failed with exit code ${result.exitCode}: ${summary}`\n : `Agent spawn failed with exit code ${result.exitCode}.`;\n}\n\nfunction readRequiredAgent(value: unknown): string {\n const agent = readOptionalString(value, \"Agent definition agent\")?.trim();\n\n if (agent === undefined || agent.length === 0) {\n throw new Error(\"Agent definition must define a non-empty agent.\");\n }\n\n return agent;\n}\n\nfunction readRequiredString(value: unknown, label: string): string {\n const text = readOptionalString(value, label)?.trim();\n if (text === undefined || text.length === 0) {\n throw new Error(`${label} must be a non-empty string.`);\n }\n return text;\n}\n\nfunction readRequiredPrompt(value: unknown): string {\n const prompt = readOptionalString(value, \"Agent spawn options prompt\");\n\n if (prompt === undefined || prompt.trim().length === 0) {\n throw new Error(\"Agent spawn options must define a non-empty prompt.\");\n }\n\n return prompt;\n}\n\nfunction readSpawnMode(value: unknown, label: string): AgentSpawnMode {\n if (value === \"read\" || value === \"edit\" || value === \"auto\" || value === \"yolo\") {\n return value;\n }\n\n throw new Error(`${label} must be one of: read, edit, auto, yolo.`);\n}\n\nfunction readMcpConfig(value: unknown, label: string): AgentModuleMcpConfig {\n if (!isRecord(value)) {\n throw new Error(`${label} must be an object.`);\n }\n\n const entries = Object.entries(value).map(\n ([name, server]) => [name, readMcpServer(server, `${label}.${name}`)] as const\n );\n return createNullRecord(Object.fromEntries(entries) as AgentModuleMcpConfig);\n}\n\nfunction readMcpServer(value: unknown, label: string): AgentModuleMcpServer {\n if (!isRecord(value)) {\n throw new Error(`${label} must be an object.`);\n }\n\n const args = getOwnProperty(value, \"args\");\n const env = getOwnProperty(value, \"env\");\n const timeout = getOwnProperty(value, \"timeout\");\n\n return createNullRecord({\n command: readNonEmptyString(getOwnProperty(value, \"command\"), `${label}.command`),\n ...(args === undefined ? {} : { args: readStringArray(args, `${label}.args`) }),\n ...(env === undefined ? {} : { env: readStringRecord(env, `${label}.env`) }),\n ...(timeout === undefined\n ? {}\n : { timeout: readPositiveFiniteNumber(timeout, `${label}.timeout`) })\n });\n}\n\nfunction readStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\")) {\n throw new Error(`${label} must be an array of strings.`);\n }\n\n return [...value];\n}\n\nfunction readStringRecord(value: unknown, label: string): Record<string, string> {\n if (!isRecord(value)) {\n throw new Error(`${label} must be an object.`);\n }\n\n const entries = Object.entries(value);\n\n if (entries.some(([, entry]) => typeof entry !== \"string\")) {\n throw new Error(`${label} must be a string record.`);\n }\n\n return Object.fromEntries(entries) as Record<string, string>;\n}\n\nfunction readOptionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`${label} must be a string.`);\n }\n\n return value;\n}\n\nfunction readNonEmptyString(value: unknown, label: string): string {\n const text = readOptionalString(value, label);\n\n if (text === undefined || text.trim().length === 0) {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n return text;\n}\n\nfunction readFiniteNumber(value: unknown, label: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${label} must be a finite number.`);\n }\n\n return value;\n}\n\nfunction readNonNegativeFiniteNumber(value: unknown, label: string): number {\n const number = readFiniteNumber(value, label);\n\n if (number < 0) {\n throw new Error(`${label} must be a non-negative finite number.`);\n }\n\n return number;\n}\n\nfunction readPositiveFiniteNumber(value: unknown, label: string): number {\n const number = readFiniteNumber(value, label);\n\n if (number <= 0) {\n throw new Error(`${label} must be a positive finite number.`);\n }\n\n return number;\n}\n\nfunction readAbortSignal(value: unknown, label: string): AbortSignal {\n if (\n typeof value !== \"object\" ||\n value === null ||\n typeof (value as { aborted?: unknown }).aborted !== \"boolean\" ||\n typeof (value as { addEventListener?: unknown }).addEventListener !== \"function\" ||\n typeof (value as { removeEventListener?: unknown }).removeEventListener !== \"function\"\n ) {\n throw new Error(`${label} must be an AbortSignal.`);\n }\n\n return value as AbortSignal;\n}\n\nfunction readOtelSink(value: unknown): OtelSink {\n if (\n !isRecord(value) ||\n typeof value.startSpan !== \"function\" ||\n typeof value.recordException !== \"function\"\n ) {\n throw new Error(\"Agent spawn options otelSink must be an OtelSink.\");\n }\n\n return value as unknown as OtelSink;\n}\n\nfunction getOwnProperty<Name extends PropertyKey>(value: object, name: Name): unknown {\n return hasOwnProperty(value, name) ? value[name] : undefined;\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n\nfunction createNullRecord<T extends object>(value: T): T {\n return Object.assign(Object.create(null) as T, value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Anthropic's agentic coding tool for the terminal.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n apiShapes: [\"anthropic-messages\"],\n otelCapture: {\n env: {\n CLAUDE_CODE_ENABLE_TELEMETRY: \"1\"\n }\n },\n configPath: \"~/.claude.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.config/Claude/claude_desktop_config.json\",\n configPaths: {\n darwin: \"~/Library/Application Support/Claude/claude_desktop_config.json\",\n linux: \"~/.config/Claude/claude_desktop_config.json\",\n win32: \"~/AppData/Roaming/Claude/claude_desktop_config.json\"\n },\n capabilities: [\"mcp\"],\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"OpenAI's coding agent for the terminal.\",\n binaryName: \"codex\",\n apiShapes: [\"openai-responses\"],\n otelCapture: {\n args: (endpoint, content) => [\n \"-c\",\n `otel.trace_exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/traces`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.exporter={\"otlp-http\"={endpoint=${JSON.stringify(`${endpoint}/v1/logs`)},protocol=\"json\"}}`,\n \"-c\",\n `otel.log_user_prompt=${content}`\n ]\n },\n configPath: \"~/.codex/config.toml\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const cursorAgent: AgentDefinition = {\n id: \"cursor\",\n name: \"cursor\",\n aliases: [\"cursor-agent\"],\n label: \"Cursor\",\n summary: \"Cursor's CLI coding agent.\",\n binaryName: \"cursor-agent\",\n configPath: \"~/.cursor/mcp.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#FFFFFF\",\n light: \"#000000\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const geminiCliAgent: AgentDefinition = {\n id: \"gemini-cli\",\n name: \"gemini-cli\",\n aliases: [\"gemini\"],\n label: \"Gemini CLI\",\n summary: \"Google's open-source AI agent for the terminal.\",\n binaryName: \"gemini\",\n configPath: \"~/.gemini/settings.json\",\n apiShapes: [\"google-generations\"],\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\"],\n branding: {\n colors: {\n dark: \"#8AB4F8\",\n light: \"#1A73E8\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Open-source AI coding agent for the terminal.\",\n binaryName: \"opencode\",\n apiShapes: [\"openai-chat-completions\"],\n otelCapture: {\n env: {\n OPENCODE_CONFIG_CONTENT: '{\"experimental\":{\"openTelemetry\":true}}'\n }\n },\n configPath: \"~/.config/opencode/opencode.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Moonshot AI's coding agent for the terminal.\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n apiShapes: [\"openai-chat-completions\"],\n configPath: \"~/.kimi/mcp.json\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n apiShapes: [\"openai-chat-completions\"],\n otelCapture: {},\n configPath: \"~/.config/goose/config.yaml\",\n capabilities: [\"spawn\", \"configure\", \"install\", \"test\", \"skill\", \"mcp\"],\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const piAgent: AgentDefinition = {\n id: \"pi\",\n name: \"pi\",\n aliases: [\"pi-agent\"],\n label: \"Pi\",\n summary: \"Minimal AI coding agent for the terminal.\",\n binaryName: \"pi\",\n capabilities: [\"spawn\"],\n branding: {\n colors: {\n dark: \"#F2F2F2\",\n light: \"#242424\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n apiShapes: [\"openai-responses\", \"openai-chat-completions\"],\n configPath: \"~/.poe-code/config.json\",\n capabilities: [\"configure\"],\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n cursorAgent,\n geminiCliAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n piAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nfunction freezeAgent(agent: AgentDefinition): AgentDefinition {\n if (agent.aliases !== undefined) {\n Object.freeze(agent.aliases);\n }\n if (agent.apiShapes !== undefined) {\n Object.freeze(agent.apiShapes);\n }\n if (agent.capabilities !== undefined) {\n Object.freeze(agent.capabilities);\n }\n if (agent.otelCapture?.env !== undefined) {\n Object.freeze(agent.otelCapture.env);\n }\n if (agent.otelCapture !== undefined) {\n Object.freeze(agent.otelCapture);\n }\n Object.freeze(agent.branding.colors);\n Object.freeze(agent.branding);\n return Object.freeze(agent);\n}\n\nexport const allAgents: readonly AgentDefinition[] = Object.freeze([\n freezeAgent(claudeCodeAgent),\n freezeAgent(claudeDesktopAgent),\n freezeAgent(codexAgent),\n freezeAgent(cursorAgent),\n freezeAgent(geminiCliAgent),\n freezeAgent(openCodeAgent),\n freezeAgent(kimiAgent),\n freezeAgent(gooseAgent),\n freezeAgent(piAgent),\n freezeAgent(poeAgentAgent)\n]);\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.trim().toLowerCase());\n}\n", "import type { McpSpawnConfig } from \"../types.js\";\n\ninterface JsonMcpServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n timeout?: number;\n}\n\nexport function toJsonMcpServers(servers: McpSpawnConfig): Record<string, JsonMcpServer> {\n validateMcpSpawnConfig(servers);\n const out: Record<string, JsonMcpServer> = Object.create(null);\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\nfunction isTomlBareKeySegment(value: string): boolean {\n if (value.length === 0) {\n return false;\n }\n for (const char of value) {\n const code = char.charCodeAt(0);\n const isDigit = code >= 48 && code <= 57;\n const isUpperAlpha = code >= 65 && code <= 90;\n const isLowerAlpha = code >= 97 && code <= 122;\n if (!isDigit && !isUpperAlpha && !isLowerAlpha && char !== \"_\" && char !== \"-\") {\n return false;\n }\n }\n return true;\n}\n\nfunction toTomlKeySegment(value: string): string {\n return isTomlBareKeySegment(value) ? value : JSON.stringify(value);\n}\n\nexport function validateMcpSpawnConfig(servers: McpSpawnConfig): void {\n for (const [name, server] of Object.entries(servers)) {\n if (name.trim().length === 0) {\n throw new Error(\"MCP server name must be a non-empty string.\");\n }\n if (typeof server.command !== \"string\" || server.command.trim().length === 0) {\n throw new Error(`MCP server \"${name}\" command must be a non-empty string.`);\n }\n }\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 validateMcpSpawnConfig(servers);\n const mcp: Record<\n string,\n { type: \"local\"; command: string[]; environment?: Record<string, string> }\n > = Object.create(null);\n for (const [name, server] of Object.entries(servers)) {\n if (server.timeout !== undefined) {\n throw new Error(`OpenCode MCP server \"${name}\" does not support timeout.`);\n }\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 validateMcpSpawnConfig(servers);\n const args: string[] = [];\n\n for (const [name, server] of Object.entries(servers)) {\n const prefix = `mcp_servers.${toTomlKeySegment(name)}`;\n args.push(\"-c\", `${prefix}.command=${toTomlString(server.command)}`);\n if (server.autoApprove !== false) {\n args.push(\"-c\", `${prefix}.default_tools_approval_mode=${toTomlString(\"approve\")}`);\n }\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 validateMcpSpawnConfig(servers);\n return Object.entries(servers).flatMap(([name, server]) => {\n if (server.env && Object.keys(server.env).length > 0) {\n throw new Error(`Goose MCP server \"${name}\" does not support env through --with-extension.`);\n }\n if (server.timeout !== undefined) {\n throw new Error(\n `Goose MCP server \"${name}\" does not support timeout through --with-extension.`\n );\n }\n return [\"--with-extension\", [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 auto: [\"--permission-mode\", \"auto\"],\n edit: [\"--permission-mode\", \"acceptEdits\", \"--allowedTools\", \"Bash,Read,Write,Edit,Glob,Grep,NotebookEdit\"],\n // Plan mode alone still permits writes, so read mode pins a read-only\n // allowlist and hard-denies every mutating tool.\n read: [\n \"--permission-mode\",\n \"plan\",\n \"--allowedTools\",\n \"Read,Glob,Grep\",\n \"--disallowedTools\",\n \"Bash,Write,Edit,MultiEdit,NotebookEdit\"\n ]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"text\"]\n },\n interactive: {\n defaultArgs: []\n },\n resume: {\n args: (threadId) => [\"--resume\", threadId]\n }\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: [\"--dangerously-bypass-approvals-and-sandbox\"],\n auto: [\n \"-s\",\n \"danger-full-access\",\n \"-c\",\n 'approval_policy=\"on-request\"',\n \"-c\",\n 'approvals_reviewer=\"auto_review\"'\n ],\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 resume: {\n args: (threadId) => [\"resume\", threadId],\n position: \"beforePrompt\",\n commandOptionsPosition: \"beforeResume\",\n hintArgs: (threadId, cwd) => [\"resume\", \"-C\", cwd, threadId]\n }\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 // No auto: `opencode run` never asks; permissions come from opencode.json.\n yolo: [],\n edit: [],\n read: [\"--agent\", \"plan\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"--prompt\"\n },\n resume: {\n args: (threadId) => [\"--session\", threadId],\n hintArgs: (threadId, cwd) => [cwd, \"--session\", threadId]\n },\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 // No auto: kimi --print mode has no approval channel.\n yolo: [\"--yolo\"],\n edit: [],\n read: []\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"stream-json\"],\n automaticFallback: false\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"-p\"\n },\n resume: {\n args: (threadId, cwd) => [\"--session\", threadId, \"--work-dir\", cwd]\n }\n};\n\nexport const kimiAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"kimi\",\n acpArgs: [\"acp\"],\n supportsMcpServers: false,\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 // No auto: GOOSE_MODE=approve prompts on the TTY and would hang a headless run.\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 automaticFallback: false\n },\n interactive: {\n defaultArgs: [\"session\"],\n defaultArgsPosition: \"beforePrompt\"\n },\n resume: {\n args: (threadId) => [\"--resume\", \"--session-id\", threadId],\n hintArgs: (threadId) => [\"run\", \"--resume\", \"--session-id\", threadId, \"--text\", \"continue\"]\n }\n};\n\nexport const gooseAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"goose\",\n acpArgs: [\"acp\"],\n env: gooseFileSecretsEnv,\n skipAuth: true\n};\n", "import type { AdapterType } from \"./adapters/index.js\";\nimport type { RuntimeOverrideOptions } from \"@poe-code/agent-harness-tools\";\nimport type { StateManager } from \"@poe-code/poe-code-config/core\";\nimport type { AcpMiddleware } from \"./acp/middleware.js\";\nimport type { SpawnEnvironment } from \"./environment.js\";\n\nexport const SPAWN_MODES = [\"yolo\", \"auto\", \"edit\", \"read\"] as const;\n\nexport type SpawnMode = (typeof SPAWN_MODES)[number];\n\n/**\n * The single source of truth for the permission mode used when a caller does not\n * ask for one. `auto` uses the provider's unattended safe-action policy.\n * Providers without an auto mode reject the spawn instead of silently selecting\n * a more permissive mode. `yolo` must always be requested explicitly.\n */\nexport const DEFAULT_SPAWN_MODE: SpawnMode = \"auto\";\n\nexport type SpawnModeConfig = string[] | { args?: string[]; env?: Record<string, string> };\n\n/**\n * `auto` is optional: it maps to the agent's native ask-style approval mode and\n * must be omitted when the agent has no approval channel in headless runs.\n */\nexport type SpawnModesConfig = Record<Exclude<SpawnMode, \"auto\">, SpawnModeConfig> & {\n auto?: SpawnModeConfig;\n};\n\nexport function resolveModeConfig(modeConfig: SpawnModeConfig): {\n args: string[];\n env?: Record<string, string>;\n} {\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 function resolveAgentModeConfig(\n config: Pick<CliSpawnConfig, \"agentId\" | \"modes\">,\n mode: SpawnMode | undefined\n): {\n args: string[];\n env?: Record<string, string>;\n} {\n const selected = mode ?? DEFAULT_SPAWN_MODE;\n const modeConfig = config.modes[selected];\n if (modeConfig === undefined) {\n const supported = SPAWN_MODES.filter((name) => config.modes[name] !== undefined);\n throw new Error(\n `Agent \"${config.agentId}\" does not support mode \"${selected}\". Supported modes: ${supported.join(\", \")}.`\n );\n }\n return resolveModeConfig(modeConfig);\n}\n\nexport interface McpSpawnServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n /**\n * Whether Codex should automatically approve tools exposed by this explicitly configured server.\n * Defaults to true so headless read/edit spawns can use caller-trusted MCP tools.\n */\n autoApprove?: boolean;\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 McpFileSpec {\n relativePath: string;\n content: (servers: McpSpawnConfig) => Record<string, unknown>;\n}\n\nexport type OtelSpan = {\n setAttribute(key: string, value: unknown): void;\n addEvent(name: string, attrs: Record<string, unknown>): void;\n end(): void;\n};\n\nexport interface OtelSink {\n startSpan(name: string, attrs: Record<string, unknown>): OtelSpan;\n recordException(span: ReturnType<OtelSink[\"startSpan\"]>, error: unknown): void;\n}\n\nexport interface HookBridgeOptions {\n from: string;\n strategy?: \"auto\" | \"symlink\" | \"transform\";\n scope?: \"project\" | \"user\" | \"merged\";\n}\n\nexport interface SpawnOptions {\n prompt: string;\n cwd?: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n /** Skill references to bridge into the spawned agent for this run. */\n skills?: string[];\n /** Hooks to bridge from another agent configuration for this run. */\n hooks?: HookBridgeOptions;\n /** Resume a prior provider thread/session before sending the prompt. */\n resumeThreadId?: string;\n useStdin?: boolean;\n interactive?: boolean;\n signal?: AbortSignal;\n otelSink?: OtelSink;\n /** Capture native OTLP telemetry emitted by the spawned agent. */\n captureOtel?: boolean;\n /** Include prompt and tool content in native OTLP telemetry. */\n captureOtelContent?: boolean;\n /** Additional environment passed to the spawned agent. */\n env?: SpawnEnvironment;\n middlewares?: AcpMiddleware[];\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 /** Per-invocation runtime/runner config overrides. */\n runtime?: RuntimeOverrideOptions[\"runtime\"];\n /** Docker image override for docker runtime. */\n runtimeImage?: string;\n /** Directory used to load runtime config/templates when different from cwd. */\n runtimeConfigCwd?: string;\n /** Run through a detached runtime job when the backend supports it. */\n detach?: boolean;\n /** Mount the local poe-code checkout into the runtime for development. */\n mountPoeCode?: boolean;\n /** Override runner workspace sync behavior. */\n runnerSync?: RuntimeOverrideOptions[\"runnerSync\"];\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 detached?: { jobId: string; envId: 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 state?: StateManager;\n}\n\nexport interface StdinMode {\n omitPrompt: boolean;\n extraArgs: string[];\n automaticFallback?: boolean;\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: SpawnModesConfig;\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 mcpFile?: McpFileSpec;\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 resume?: ResumeSpec;\n}\n\nexport interface ResumeSpec {\n /** Args injected into the live spawn for non-interactive resume. */\n args: (threadId: string, cwd: string) => string[];\n /** Position of `args` relative to the prompt token. Default `afterPrompt`. */\n position?: \"beforePrompt\" | \"afterPrompt\";\n /**\n * Some CLIs implement resume as a subcommand under the normal prompt command\n * and require command options before the resume token.\n */\n commandOptionsPosition?: \"beforeResume\";\n /**\n * Optional override for the printed copy-paste resume hint (e.g. an interactive\n * shell command). When omitted, the hint composes binaryName + `args`.\n */\n hintArgs?: (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:\n | string[]\n | ((options: { model?: string; mode?: SpawnMode; mcpServers?: McpSpawnConfig }) => 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 /** Whether MCP servers may be forwarded through ACP sessions. Defaults to true. */\n supportsMcpServers?: 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 { DEFAULT_SPAWN_MODE, type AcpSpawnConfig, type SpawnMode } from \"../types.js\";\n\nconst geminiApprovalModes: Record<SpawnMode, string> = {\n yolo: \"yolo\",\n auto: \"default\",\n edit: \"auto_edit\",\n read: \"plan\"\n};\n\nexport const geminiCliAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"gemini-cli\",\n acpArgs: ({ model, mode, mcpServers }) => [\n \"--acp\",\n ...(model ? [\"--model\", model] : []),\n ...(mcpServers ? [\"--allowed-mcp-server-names\", Object.keys(mcpServers).join(\",\")] : []),\n ...(mcpServers ? [\"--skip-trust\"] : []),\n \"--approval-mode\",\n geminiApprovalModes[mode ?? DEFAULT_SPAWN_MODE]\n ],\n env: {\n GEMINI_SANDBOX: \"false\"\n },\n skipAuth: true\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { toJsonMcpServers } from \"./mcp.js\";\n\nexport const cursorSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"cursor\",\n adapter: \"cursor\",\n promptFlag: \"-p\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n modelTransform: (model) =>\n model.startsWith(\"claude-opus-\") ||\n model.startsWith(\"claude-sonnet-\") ||\n model.startsWith(\"claude-haiku-\")\n ? model.replaceAll(\".\", \"-\")\n : model,\n defaultArgs: [\"--output-format\", \"stream-json\", \"--trust\", \"--approve-mcps\"],\n defaultArgsPosition: \"beforePrompt\",\n modes: {\n // No auto: cursor-agent print mode has no approval channel.\n yolo: [\"--force\", \"--sandbox\", \"disabled\"],\n edit: [\"--force\"],\n read: [\"--mode\", \"plan\"]\n },\n stdinMode: { omitPrompt: true, extraArgs: [] },\n mcpFile: {\n relativePath: \".cursor/mcp.json\",\n content: (servers) => ({ mcpServers: toJsonMcpServers(servers) })\n },\n interactive: { defaultArgs: [] },\n resume: {\n args: (threadId) => [\"--resume\", threadId],\n position: \"beforePrompt\"\n }\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\n\nconst ALL_BUILTIN_TOOLS = \"read,bash,edit,write,grep,find,ls\";\nconst EDIT_TOOLS = \"read,edit,write,grep,find,ls\";\nconst READ_ONLY_TOOLS = \"read,grep,find,ls\";\n\nexport const piSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"pi\",\n adapter: \"pi\",\n defaultArgs: [\"--mode\", \"json\", \"--print\"],\n defaultArgsPosition: \"beforePrompt\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n modes: {\n yolo: [\"--tools\", ALL_BUILTIN_TOOLS, \"--approve\"],\n edit: [\"--tools\", EDIT_TOOLS, \"--no-approve\"],\n read: [\"--tools\", READ_ONLY_TOOLS, \"--no-approve\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: []\n },\n interactive: {\n defaultArgs: []\n },\n resume: {\n args: (threadId) => [\"--session\", threadId],\n position: \"beforePrompt\"\n }\n};\n", "import { allAgents, resolveAgentId, type AgentDefinition } from \"@poe-code/agent-defs\";\nimport type { AcpSpawnConfig, SpawnConfig, SpawnMode } 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\";\nimport { geminiCliAcpSpawnConfig } from \"./gemini-cli.js\";\nimport { cursorSpawnConfig } from \"./cursor.js\";\nimport { piSpawnConfig } from \"./pi.js\";\n\nexport interface SpawnableAgent {\n id: string;\n name: string;\n label: string;\n summary: string;\n aliases: string[];\n binaryName?: string;\n supportsStdinPrompt: boolean;\n supportsMcpSpawn: boolean;\n config?: SpawnConfig;\n acpConfig?: AcpSpawnConfig;\n}\n\nfunction freezeConfig<T extends SpawnConfig | AcpSpawnConfig>(config: T): T {\n freezeValue(config);\n return config;\n}\n\nfunction freezeValue(value: unknown): void {\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) {\n return;\n }\n\n for (const nested of Object.values(value)) {\n freezeValue(nested);\n }\n Object.freeze(value);\n}\n\n// ACP adapter support (spawn streaming):\n// - Supported (has `adapter`): claude-code, codex, opencode, kimi, goose\nexport const allSpawnConfigs: readonly SpawnConfig[] = Object.freeze([\n freezeConfig(claudeCodeSpawnConfig),\n freezeConfig(codexSpawnConfig),\n freezeConfig(cursorSpawnConfig),\n freezeConfig(piSpawnConfig),\n freezeConfig(openCodeSpawnConfig),\n freezeConfig(kimiSpawnConfig),\n freezeConfig(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, freezeConfig(openCodeAcpSpawnConfig));\nacpLookup.set(kimiAcpSpawnConfig.agentId, freezeConfig(kimiAcpSpawnConfig));\nacpLookup.set(gooseAcpSpawnConfig.agentId, freezeConfig(gooseAcpSpawnConfig));\nacpLookup.set(geminiCliAcpSpawnConfig.agentId, freezeConfig(geminiCliAcpSpawnConfig));\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\n/**\n * CLI agents support a mode when their spawn config defines it. ACP and custom\n * spawn paths have a live permission channel, so every mode is accepted there.\n */\nexport function supportsSpawnMode(input: string, mode: SpawnMode): boolean {\n const config = getSpawnConfig(input);\n if (config && config.kind === \"cli\") {\n return config.modes[mode] !== undefined;\n }\n return true;\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\" ||\n typeof config.mcpEnv === \"function\" ||\n config.mcpFile !== undefined)\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\" &&\n typeof config.mcpEnv !== \"function\" &&\n config.mcpFile === undefined)\n ) {\n continue;\n }\n supported.push(config.agentId);\n }\n\n return supported;\n}\n\nfunction agentSupportsStdinPrompt(config: SpawnConfig | undefined): boolean {\n return config?.kind === \"cli\" && config.stdinMode !== undefined;\n}\n\nfunction toSpawnableAgent(agent: AgentDefinition): SpawnableAgent | undefined {\n const config = lookup.get(agent.id);\n const acpConfig = acpLookup.get(agent.id);\n if (!config && !acpConfig) {\n return undefined;\n }\n\n return {\n id: agent.id,\n name: agent.name,\n label: agent.label,\n summary: agent.summary,\n aliases: [...(agent.aliases ?? [])],\n ...(agent.binaryName !== undefined ? { binaryName: agent.binaryName } : {}),\n supportsStdinPrompt: agentSupportsStdinPrompt(config),\n supportsMcpSpawn: supportsMcpAtSpawn(agent.id),\n ...(config ? { config } : {}),\n ...(acpConfig ? { acpConfig } : {})\n };\n}\n\nexport function listSpawnableAgents(): readonly SpawnableAgent[] {\n const agents: SpawnableAgent[] = [];\n for (const agent of allAgents) {\n const spawnable = toSpawnableAgent(agent);\n if (spawnable) agents.push(spawnable);\n }\n return Object.freeze(agents);\n}\n\nexport function resolveSpawnableAgent(input: string): SpawnableAgent | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) return undefined;\n const agent = allAgents.find((candidate) => candidate.id === resolvedId);\n return agent ? toSpawnableAgent(agent) : undefined;\n}\n", "import type { AcpEvent } from \"./acp/types.js\";\nimport type { SpawnHandle } from \"./retry.js\";\n\nexport type SpawnParallelTuple<TService, TOptions> = readonly [\n service: TService,\n options: TOptions\n];\n\nexport type SpawnParallelThunk<TResult extends { exitCode: number }> = (\n signal?: AbortSignal\n) => SpawnHandle<TResult>;\n\nexport type SpawnParallelCall<TService, TOptions, TResult extends { exitCode: number }> =\n | SpawnParallelTuple<TService, TOptions>\n | SpawnParallelThunk<TResult>;\n\nexport type SpawnParallelOptions = {\n check?: boolean;\n maxConcurrent?: number;\n failFast?: boolean;\n signal?: AbortSignal;\n};\n\nexport class SpawnParallelError<TResult extends { exitCode: number }> extends Error {\n readonly index: number;\n readonly result: TResult;\n readonly results: Array<TResult | undefined>;\n\n constructor(index: number, result: TResult, results: Array<TResult | undefined>) {\n super(`spawn.parallel call ${index} failed with exit code ${result.exitCode}.`);\n this.name = \"SpawnParallelError\";\n this.index = index;\n this.result = result;\n this.results = results;\n }\n}\n\nexport function createSpawnParallel<\n TService,\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n>(\n spawnOnce: (service: TService, options: TOptions) => SpawnHandle<TResult>\n): (\n calls: Array<SpawnParallelCall<TService, TOptions, TResult>>,\n options?: SpawnParallelOptions\n) => Promise<TResult[]> {\n return async function parallel(calls, options = {}) {\n const maxConcurrent = normalizeMaxConcurrent(options.maxConcurrent);\n const failFast = options.failFast ?? true;\n const requestedCheck = Object.hasOwn(options, \"check\") ? options.check : undefined;\n const check = requestedCheck === undefined ? failFast : requestedCheck;\n if (typeof check !== \"boolean\") {\n throw new Error(\"spawn.parallel check must be a boolean.\");\n }\n if (calls.length === 0) {\n return [];\n }\n const group = new AbortController();\n const results: Array<TResult | undefined> = new Array(calls.length);\n const errors: unknown[] = [];\n let nextIndex = 0;\n let primaryFailure: { reason: unknown } | undefined;\n\n const removeParentAbort = linkParentAbort(options.signal, group, (error) => {\n primaryFailure ??= { reason: error };\n });\n\n const worker = async () => {\n while (primaryFailure === undefined) {\n const index = nextIndex;\n nextIndex += 1;\n\n if (index >= calls.length) {\n return;\n }\n\n try {\n const result = await runParallelCall(calls[index], spawnOnce, group.signal);\n results[index] = result;\n\n if (check && failFast && result.exitCode !== 0) {\n const error = new SpawnParallelError(index, result, results);\n primaryFailure ??= { reason: error };\n group.abort(error);\n return;\n }\n } catch (error) {\n if (failFast || group.signal.aborted) {\n primaryFailure ??= { reason: error };\n group.abort(error);\n return;\n }\n\n errors.push(error);\n }\n }\n };\n\n try {\n await Promise.allSettled(\n Array.from({ length: Math.min(maxConcurrent, calls.length) }, () => worker())\n );\n } finally {\n removeParentAbort();\n }\n\n if (primaryFailure !== undefined) {\n throw primaryFailure.reason;\n }\n\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n \"spawn.parallel failed before every call returned a result.\"\n );\n }\n\n if (check) {\n const failedIndex = results.findIndex(\n (result) => result !== undefined && result.exitCode !== 0\n );\n if (failedIndex >= 0) {\n throw new SpawnParallelError(failedIndex, results[failedIndex]!, results);\n }\n }\n\n return results as TResult[];\n };\n}\n\nasync function runParallelCall<\n TService,\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n>(\n call: SpawnParallelCall<TService, TOptions, TResult>,\n spawnOnce: (service: TService, options: TOptions) => SpawnHandle<TResult>,\n signal: AbortSignal\n): Promise<TResult> {\n throwIfAborted(signal);\n\n if (typeof call === \"function\") {\n const handle = call(signal);\n const [result] = await Promise.all([handle.result, drainEvents(handle.events)]);\n return result;\n }\n\n if (!isSpawnTuple(call)) {\n throw new Error(\"spawn.parallel calls must be [service, options] tuples or spawn thunks.\");\n }\n\n const { options, cleanup } = withAbortSignal(call[1], signal);\n try {\n const handle = spawnOnce(call[0], options);\n const [result] = await Promise.all([handle.result, drainEvents(handle.events)]);\n return result;\n } finally {\n cleanup();\n }\n}\n\nasync function drainEvents(events: AsyncIterable<AcpEvent>): Promise<void> {\n for await (const ignoredEvent of events) {\n void ignoredEvent;\n // Drain the stream so streaming providers can complete while parallel returns results only.\n }\n}\n\nfunction normalizeMaxConcurrent(maxConcurrent: number | undefined): number {\n const value = maxConcurrent ?? 4;\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(\"spawn.parallel maxConcurrent must be an integer greater than or equal to 1.\");\n }\n return value;\n}\n\nfunction isSpawnTuple<TService, TOptions>(\n call: SpawnParallelCall<TService, TOptions, { exitCode: number }>\n): call is SpawnParallelTuple<TService, TOptions> {\n return Array.isArray(call) && call.length === 2;\n}\n\nfunction withAbortSignal<TOptions extends { signal?: AbortSignal }>(\n options: TOptions,\n signal: AbortSignal\n): { options: TOptions; cleanup(): void } {\n if (!options.signal) {\n return {\n options: { ...options, signal },\n cleanup() {}\n };\n }\n\n const controller = new AbortController();\n const callSignal = options.signal;\n const abortGroup = () => controller.abort(signal.reason);\n const abortCall = () => controller.abort(callSignal.reason);\n\n if (signal.aborted) {\n abortGroup();\n } else if (callSignal.aborted) {\n abortCall();\n } else {\n signal.addEventListener(\"abort\", abortGroup, { once: true });\n callSignal.addEventListener(\"abort\", abortCall, { once: true });\n }\n\n return {\n options: { ...options, signal: controller.signal },\n cleanup() {\n signal.removeEventListener(\"abort\", abortGroup);\n callSignal.removeEventListener(\"abort\", abortCall);\n }\n };\n}\n\nfunction linkParentAbort(\n parentSignal: AbortSignal | undefined,\n group: AbortController,\n setFailure: (error: unknown) => void\n): () => void {\n if (!parentSignal) {\n return () => {};\n }\n\n const abort = () => {\n const error = parentSignal.reason;\n setFailure(error);\n group.abort(error);\n };\n\n if (parentSignal.aborted) {\n abort();\n return () => {};\n }\n\n parentSignal.addEventListener(\"abort\", abort, { once: true });\n return () => parentSignal.removeEventListener(\"abort\", abort);\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw signal.reason;\n }\n}\n", "import { hostErrorData } from \"../error/shape.js\";\n\nexport type EnvModuleOptions = {\n allow: readonly string[];\n values?: Readonly<Record<string, string | undefined>>;\n};\n\nexport type EnvModule = {\n get(name: string): string | undefined;\n};\n\nexport class EnvAccessError extends Error {\n readonly code = \"ENV_ACCESS_DENIED\";\n readonly variable: string;\n\n constructor(variable: string) {\n super(`Environment access denied for ${JSON.stringify(variable)}.`);\n this.name = \"EnvAccessError\";\n this.variable = variable;\n hostErrorData.set(this, { code: this.code, variable });\n }\n}\n\nexport function makeEnvModule(input: readonly string[] | EnvModuleOptions): EnvModule {\n const options = normalizeEnvOptions(Array.isArray(input) ? { allow: input } : input);\n const allowedNames = new Set(options.allow);\n const values = options.values;\n\n return {\n get(name) {\n const variable = readEnvName(name, \"Environment variable name\");\n if (!allowedNames.has(variable)) throw new EnvAccessError(variable);\n return readEnvValue(values ?? process.env, variable);\n }\n };\n}\n\nexport function parseEnvConfig(json: string): EnvModuleOptions {\n return normalizeEnvOptions(JSON.parse(json));\n}\n\nfunction normalizeEnvOptions(input: unknown): EnvModuleOptions {\n if (input === null || typeof input !== \"object\" || Array.isArray(input)) {\n throw new TypeError(\"Environment options must be an object.\");\n }\n const fields = Object.getOwnPropertyDescriptors(input);\n for (const key of Reflect.ownKeys(fields)) {\n if (key !== \"allow\" && key !== \"values\") {\n throw new TypeError(\"Unknown environment option.\");\n }\n if (!(\"value\" in fields[key]!)) {\n throw new TypeError(\"Environment options must not contain accessors.\");\n }\n }\n const inputAllow: unknown = Object.getOwnPropertyDescriptor(input, \"allow\")?.value;\n if (!Array.isArray(inputAllow)) {\n throw new TypeError(\"Environment allow list must be an array of non-empty strings.\");\n }\n const allow: string[] = [];\n for (let index = 0; index < inputAllow.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(inputAllow, index);\n if (descriptor === undefined || !(\"value\" in descriptor)) {\n throw new TypeError(\"Environment allow list must contain only own data entries.\");\n }\n allow.push(readEnvName(descriptor.value, `Environment allow list[${index}]`));\n }\n const inputValues: unknown = Object.getOwnPropertyDescriptor(input, \"values\")?.value;\n if (inputValues === undefined) return { allow };\n if (inputValues === null || typeof inputValues !== \"object\" || Array.isArray(inputValues)) {\n throw new TypeError(\"Environment values must be an object.\");\n }\n return {\n allow,\n values: Object.fromEntries(allow.map((name) => [name, readEnvValue(inputValues, name)]))\n };\n}\n\nfunction readEnvValue(values: object, name: string): string | undefined {\n const descriptor = Object.getOwnPropertyDescriptor(values, name);\n if (descriptor === undefined) return undefined;\n if (!(\"value\" in descriptor)) {\n throw new TypeError(`Environment value for ${JSON.stringify(name)} must not be an accessor.`);\n }\n if (descriptor.value !== undefined && typeof descriptor.value !== \"string\") {\n throw new TypeError(\n `Environment value for ${JSON.stringify(name)} must be a string or undefined.`\n );\n }\n return descriptor.value as string | undefined;\n}\n\nfunction readEnvName(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${label} must be a non-empty string.`);\n }\n if (value.includes(\"\\0\") || value.includes(\"=\")) {\n throw new TypeError(`${label} must not contain NUL or equals signs.`);\n }\n return value;\n}\n", "export class HarnessFailure extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"HarnessFailure\";\n }\n}\n\nexport function makeFailModule(): {\n default: (message: string) => never;\n} {\n function fail(message: string): never {\n throw new HarnessFailure(readNonEmptyString(message, \"Harness failure message\"));\n }\n\n return {\n default: fail\n };\n}\n\nfunction readNonEmptyString(value: unknown, label: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n if (value.trim().length === 0) {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n return value;\n}\n", "import { constants as nodeFsConstants, type Dirent, type PathLike, type Stats } from \"node:fs\";\nimport * as nodeFsPromises from \"node:fs/promises\";\nimport { dirname, isAbsolute, resolve, sep } from \"node:path\";\nimport { inspect } from \"node:util\";\nimport * as nodeUtil from \"node:util\";\nimport {\n createNodeFsBridge,\n type EntryComparison,\n type FileSystem,\n FsError,\n isPathWithin\n} from \"@poe-code/safe-fs\";\n\nimport { getOwnErrorCode } from \"../error-codes.js\";\nimport { declareHostOperation } from \"../interp/host-bridge.js\";\nimport {\n type CanonicalPathFs,\n containsPath,\n resolveCanonicalPath,\n type Stat\n} from \"./canonical-path.js\";\nimport type { PendingHostCallPolicyMode } from \"../snapshot/policy.js\";\n\ntype FsOperationName =\n | \"access\"\n | \"appendFile\"\n | \"chmod\"\n | \"copyFile\"\n | \"cp\"\n | \"link\"\n | \"lstat\"\n | \"mkdir\"\n | \"mkdtemp\"\n | \"readFile\"\n | \"readdir\"\n | \"readlink\"\n | \"realpath\"\n | \"rename\"\n | \"rm\"\n | \"rmdir\"\n | \"stat\"\n | \"symlink\"\n | \"truncate\"\n | \"utimes\"\n | \"writeFile\";\n\n// Operations whose node result already crosses into the sandbox unchanged.\ntype FsPassthroughName = Exclude<\n FsOperationName,\n \"lstat\" | \"mkdtemp\" | \"readFile\" | \"readdir\" | \"readlink\" | \"realpath\" | \"stat\"\n>;\n\n// Whether node answers with a Buffer when an encoding is not given: readFile\n// defaults to a Buffer, while readdir, readlink, realpath, and mkdtemp default to\n// utf8 yet still answer with one for a buffer encoding.\nconst BUFFER_BY_DEFAULT = {\n readFile: true,\n readdir: false,\n readlink: false,\n realpath: false,\n mkdtemp: false\n} as const;\n\n// Why each option node declares cannot be honoured here, written once for every\n// operation that declares it.\nconst REFUSED_OPTION_REASONS = {\n signal:\n \"the sandbox has no AbortController, and cancelling a run is the host's to request rather than the script's\",\n // @types/node declares this on fs/promises stat and lstat and types\n // `throwIfNoEntry: false` as answering `Stats | undefined`, but the typings are\n // ahead of node: only the synchronous API reads the option. Forwarding it would\n // leave a script holding the ENOENT rejection the typings told it to expect\n // undefined for, so it is refused rather than dropped.\n throwIfNoEntry:\n \"only node's synchronous stat reads it and fs/promises rejects a missing path whatever it says, so catch the ENOENT rejection instead\",\n // cp's filter is a callback the host would invoke, which a sandbox closure can cross the\n // bridge to serve. It is refused for what happens around the call rather than during it:\n // the digest that identifies a host call across a snapshot is built by stringifying the\n // arguments, and a function does not survive that, so cp(filter: keep) and\n // cp(filter: drop) are one call to the resume machinery.\n filter:\n \"a closure is dropped from the digest that identifies a host call across a snapshot, so a resumed run could reconcile against a copy that took a different set of files, and under a root it would read the rewritten host paths rather than the ones the script wrote \u2014 walk the tree with readdir and copy the entries you want instead\"\n} as const;\n\nconst UNKNOWN_OPTION_REASON =\n \"node declares no such option for it, and an unrecognised option is refused rather than silently ignored\";\n\n// Refused by the root rather than by the module, so it is kept apart from the refusals\n// above: with no root there is no boundary to cross and node's own option is honoured.\n//\n// cp is the one operation that reads a whole tree in a single call, which makes it the one\n// whose src and dest are not the only paths it touches. Those two are canonicalized and\n// proven inside root; a symlink nested inside the tree is never seen. With dereference node\n// copies what such a link points at rather than the link, landing content from outside root\n// inside it under a name every later check reads as contained \u2014 so the option would hand a\n// script the reads the root exists to refuse. Without dereference the link is copied as a\n// link, which stays unreadable, so only this option is refused.\nconst ROOT_REFUSED_DEREFERENCE_REASON =\n \"a root canonicalizes cp's src and dest but never the paths nested inside the tree, so node would copy an escaping link's target inside root where the script could read it \u2014 copy without dereference and a nested link stays a link the root still refuses to read through\";\n\ntype FsOptionSurface = {\n // Which argument node reads the options bag from.\n readonly argument: number;\n readonly honoured: readonly string[];\n readonly refused: readonly (keyof typeof REFUSED_OPTION_REASONS)[];\n};\n\n// Every operation node gives an options bag, the argument it reads the bag from,\n// and each option split into the ones forwarded to node untouched and the ones\n// refused by name. An option node honours and this table omits is refused as\n// unknown, so a silently ignored option is not reachable; the audit in\n// fs.option-surface.test.ts proves the split covers node's own typings, which is\n// what keeps a handle, stream, or watcher option node adds later from passing\n// through unclassified.\n//\n// The operations absent here are the ones node gives no options bag: access,\n// chmod, copyFile, truncate, and utimes read a trailing mode, length, or time\n// that node validates itself, and link, rename, and symlink take paths alone.\n//\n// rmdir carries maxRetries and retryDelay because node validates both (its\n// recursive option is deprecated but still honoured), even though @types/node has\n// already dropped rmdir's options argument for a future node that removes them.\nexport const FS_OPTION_SURFACE: Record<\n | \"appendFile\"\n | \"cp\"\n | \"lstat\"\n | \"mkdir\"\n | \"mkdtemp\"\n | \"readFile\"\n | \"readdir\"\n | \"readlink\"\n | \"realpath\"\n | \"rm\"\n | \"rmdir\"\n | \"stat\"\n | \"writeFile\",\n FsOptionSurface\n> = {\n appendFile: {\n argument: 2,\n honoured: [\"encoding\", \"mode\", \"flag\", \"flush\"],\n // node's appendFile forwards to writeFile, so it honours a signal even though\n // @types/node does not declare one for it.\n refused: [\"signal\"]\n },\n // node reads cp's bag from a parameter it names opts rather than options, and validates\n // every key it knows \u2014 while still ignoring one it does not, which is what the unknown\n // refusal covers. mode is copyFile's flag set rather than a permission.\n cp: {\n argument: 2,\n honoured: [\n \"dereference\",\n \"errorOnExist\",\n \"force\",\n \"mode\",\n \"preserveTimestamps\",\n \"recursive\",\n \"verbatimSymlinks\"\n ],\n refused: [\"filter\"]\n },\n lstat: { argument: 1, honoured: [\"bigint\"], refused: [\"throwIfNoEntry\"] },\n mkdir: { argument: 1, honoured: [\"recursive\", \"mode\"], refused: [] },\n mkdtemp: { argument: 1, honoured: [\"encoding\"], refused: [] },\n readFile: { argument: 1, honoured: [\"encoding\", \"flag\"], refused: [\"signal\"] },\n readdir: { argument: 1, honoured: [\"encoding\", \"withFileTypes\", \"recursive\"], refused: [] },\n readlink: { argument: 1, honoured: [\"encoding\"], refused: [] },\n realpath: { argument: 1, honoured: [\"encoding\"], refused: [] },\n rm: { argument: 1, honoured: [\"force\", \"recursive\", \"maxRetries\", \"retryDelay\"], refused: [] },\n rmdir: { argument: 1, honoured: [\"recursive\", \"maxRetries\", \"retryDelay\"], refused: [] },\n stat: { argument: 1, honoured: [\"bigint\"], refused: [\"throwIfNoEntry\"] },\n writeFile: { argument: 2, honoured: [\"encoding\", \"mode\", \"flag\", \"flush\"], refused: [\"signal\"] }\n};\n\nconst STAT_NUMBER_FIELDS = [\n \"dev\",\n \"mode\",\n \"nlink\",\n \"uid\",\n \"gid\",\n \"rdev\",\n \"blksize\",\n \"ino\",\n \"size\",\n \"blocks\",\n \"atimeMs\",\n \"mtimeMs\",\n \"ctimeMs\",\n \"birthtimeMs\"\n] as const;\n\nconst FILE_TYPE_PREDICATES = [\n \"isFile\",\n \"isDirectory\",\n \"isSymbolicLink\",\n \"isBlockDevice\",\n \"isCharacterDevice\",\n \"isFIFO\",\n \"isSocket\"\n] as const;\n\n// node compares this encoding name case-sensitively; any other casing is an\n// invalid encoding node rejects on its own.\nconst BUFFER_ENCODING = \"buffer\";\n\n// The syscall node blames when each operation fails, read back from node itself:\n// several do not match the fs function name, so they cannot be derived from it.\nconst FS_SYSCALLS = {\n access: \"access\",\n appendFile: \"open\",\n chmod: \"chmod\",\n copyFile: \"copyfile\",\n // node's cp is its own JavaScript layer rather than a syscall wrapper, so it blames the\n // fs function by name: its ERR_FS_CP_* errors carry syscall 'cp'.\n cp: \"cp\",\n link: \"link\",\n lstat: \"lstat\",\n mkdir: \"mkdir\",\n mkdtemp: \"mkdtemp\",\n readFile: \"open\",\n readdir: \"scandir\",\n readlink: \"readlink\",\n realpath: \"realpath\",\n rename: \"rename\",\n rm: \"lstat\",\n rmdir: \"rmdir\",\n stat: \"stat\",\n symlink: \"symlink\",\n truncate: \"open\",\n utimes: \"utime\",\n writeFile: \"open\"\n} as const satisfies Record<FsOperationName, string>;\n\n// The name node blames when an operation's path argument is invalid, read back\n// from node itself: several do not match the fs function name \u2014 readlink blames\n// oldPath and mkdtemp blames prefix. Listed in node's own argument order, so the\n// length also says how many leading arguments are paths, and every one of them is\n// resolved against root and proven inside it.\n//\n// The two-path operations are the ones node reports with a dest field beside path,\n// cp excepted: it raises its own ERR_FS_CP_* errors, which carry a path alone. A\n// root denial for cp still names both paths, which is SafeJS's own shape rather\n// than an imitation of node's \u2014 the denial reports the call that was refused, and\n// node's cp has no error to copy here because it never refuses one for a root.\nconst FS_PATH_ARGUMENTS = {\n access: [\"path\"],\n appendFile: [\"path\"],\n chmod: [\"path\"],\n copyFile: [\"src\", \"dest\"],\n // node blames these by the same names it uses for copyFile's two paths.\n cp: [\"src\", \"dest\"],\n link: [\"existingPath\", \"newPath\"],\n lstat: [\"path\"],\n mkdir: [\"path\"],\n mkdtemp: [\"prefix\"],\n readFile: [\"path\"],\n readdir: [\"path\"],\n readlink: [\"oldPath\"],\n realpath: [\"path\"],\n rename: [\"oldPath\", \"newPath\"],\n rm: [\"path\"],\n rmdir: [\"path\"],\n stat: [\"path\"],\n symlink: [\"target\", \"path\"],\n truncate: [\"path\"],\n utimes: [\"path\"],\n writeFile: [\"path\"]\n} as const satisfies Record<FsOperationName, readonly string[]>;\n\nconst ACCESS_DENIED_CODE = \"EACCES\";\n\nconst INVALID_ARGUMENT_CODE = \"ERR_INVALID_ARG_VALUE\";\n\nconst INVALID_ARGUMENT_TYPE_CODE = \"ERR_INVALID_ARG_TYPE\";\n\nconst NULL_BYTE = \"\\u0000\";\n\n// libuv numbers errno differently per platform, so the errno and message paired\n// with EACCES come from node's own table rather than a hardcoded -13.\nconst [ACCESS_DENIED_ERRNO, ACCESS_DENIED_MESSAGE] = readSystemError(ACCESS_DENIED_CODE);\n\nexport type FsImplementation = Pick<typeof nodeFsPromises, FsOperationName>;\n\ntype FsHostOperation = (...args: readonly unknown[]) => unknown;\n\ntype FileTypePredicates = {\n readonly [Name in (typeof FILE_TYPE_PREDICATES)[number]]: () => boolean;\n};\n\nexport type SandboxStats = {\n readonly [Name in (typeof STAT_NUMBER_FIELDS)[number]]: number;\n} & FileTypePredicates;\n\nexport type SandboxDirent = {\n readonly name: string;\n readonly parentPath: string;\n} & FileTypePredicates;\n\ntype StringEncoding = NodeJS.BufferEncoding;\n\ntype EncodingOptions = StringEncoding | { encoding: StringEncoding };\n\ntype ReadFileOptions = StringEncoding | { encoding: StringEncoding; flag?: string };\n\ntype ReaddirOptions = {\n encoding?: StringEncoding;\n recursive?: boolean;\n};\n\ntype StatOptions = {\n bigint?: false;\n};\n\nexport type FsModuleOptions =\n | {\n root?: string;\n fs?: FsImplementation;\n adapter?: never;\n cwd?: never;\n signal?: never;\n }\n | {\n adapter: FileSystem;\n root?: string;\n cwd?: string;\n signal?: AbortSignal;\n fs?: never;\n };\n\nexport type FsModule = Pick<FsImplementation, FsPassthroughName> & {\n readFile(path: PathLike, options: ReadFileOptions): Promise<string>;\n readlink(path: PathLike, options?: EncodingOptions): Promise<string>;\n realpath(path: PathLike, options?: EncodingOptions): Promise<string>;\n mkdtemp(prefix: string, options?: EncodingOptions): Promise<string>;\n readdir: {\n (path: PathLike, options: ReaddirOptions & { withFileTypes: true }): Promise<SandboxDirent[]>;\n (\n path: PathLike,\n options?: StringEncoding | (ReaddirOptions & { withFileTypes?: false })\n ): Promise<string[]>;\n };\n stat(path: PathLike, options?: StatOptions): Promise<SandboxStats>;\n lstat(path: PathLike, options?: StatOptions): Promise<SandboxStats>;\n constants: {\n F_OK: number;\n R_OK: number;\n W_OK: number;\n X_OK: number;\n COPYFILE_EXCL: number;\n };\n};\n\nexport function makeFsModule(options: FsModuleOptions = {}): FsModule {\n assertSupportedPlatform();\n\n if (options.adapter !== undefined && options.fs !== undefined) {\n throw new TypeError(\"fs module accepts either adapter or fs, not both.\");\n }\n\n if (\n options.adapter === undefined &&\n (options.cwd !== undefined || options.signal !== undefined)\n ) {\n throw new TypeError(\"fs module cwd and signal require an adapter.\");\n }\n\n if (\n options.cwd !== undefined &&\n (typeof options.cwd !== \"string\" || !options.cwd.startsWith(\"/\") || options.cwd.includes(\"\\0\"))\n ) {\n throw new TypeError(\"fs module cwd must be an absolute virtual path without null bytes.\");\n }\n\n const implementation =\n options.adapter === undefined\n ? (options.fs ?? nodeFsPromises)\n : createNodeFsBridge(options.adapter, {\n cwd: options.root === undefined ? options.cwd : undefined,\n signal: options.signal\n });\n const fs =\n options.root === undefined\n ? implementation\n : makeRootedFs(implementation, options.root, options.adapter, options.cwd, options.signal);\n\n return {\n access: bind(fs, \"access\", \"re-issue\"),\n appendFile: bind(fs, \"appendFile\", \"read-side-effect\"),\n chmod: bind(fs, \"chmod\", \"read-side-effect\"),\n copyFile: bind(fs, \"copyFile\", \"read-side-effect\"),\n cp: bind(fs, \"cp\", \"read-side-effect\"),\n link: bind(fs, \"link\", \"read-side-effect\"),\n lstat: bindStat(fs, \"lstat\"),\n mkdir: bind(fs, \"mkdir\", \"read-side-effect\"),\n // Creates a directory, so it cannot be re-issued on resume like the other\n // string-result operations, but its name still crosses as a Buffer for a buffer\n // encoding and so goes through the same guard.\n mkdtemp: bindStringResult(fs, \"mkdtemp\", \"read-side-effect\"),\n readFile: bindStringResult(fs, \"readFile\"),\n readdir: bindReaddir(fs),\n readlink: bindStringResult(fs, \"readlink\"),\n realpath: bindStringResult(fs, \"realpath\"),\n rename: bind(fs, \"rename\", \"read-side-effect\"),\n rm: bind(fs, \"rm\", \"read-side-effect\"),\n rmdir: bind(fs, \"rmdir\", \"read-side-effect\"),\n stat: bindStat(fs, \"stat\"),\n symlink: bind(fs, \"symlink\", \"read-side-effect\"),\n truncate: bind(fs, \"truncate\", \"read-side-effect\"),\n utimes: bind(fs, \"utimes\", \"read-side-effect\"),\n writeFile: bind(fs, \"writeFile\", \"read-side-effect\"),\n constants: {\n F_OK: nodeFsConstants.F_OK,\n R_OK: nodeFsConstants.R_OK,\n W_OK: nodeFsConstants.W_OK,\n X_OK: nodeFsConstants.X_OK,\n COPYFILE_EXCL: nodeFsConstants.COPYFILE_EXCL\n }\n };\n}\n\n// The module forwards node's error rather than translating it, which makes node's answer the\n// module's answer and node's answer the platform's. That holds across darwin and linux \u2014 the\n// errno differs, the code and the message do not \u2014 and stops holding on win32: node answers a\n// different code there, a path carries a drive letter root confinement has no rule for, and a\n// symlink needs a privilege a script cannot hold. Rather than half-support it, the module\n// refuses to build there, and refuses it here so an embedder is told before a script runs.\n//\n// Only win32 is named. Every other platform node runs on is POSIX and fails the way the\n// recorded two do, and a platform whose truth nobody has recorded is reported by the\n// conformance suite rather than guessed at by a guard here.\nfunction assertSupportedPlatform(): void {\n if (process.platform !== \"win32\") {\n return;\n }\n\n throw new Error(\n \"SafeJS's fs module does not support win32: node's fs answers a different code there (EPERM or UNKNOWN where darwin and linux answer EISDIR or ENOTEMPTY), a path carries a drive letter that root confinement has no rule for, and a symlink needs a privilege a script cannot hold. Run on darwin or linux, or build a host module for the surface you need.\"\n );\n}\n\nfunction bind<Name extends FsOperationName>(\n fs: FsImplementation,\n name: Name,\n policy: PendingHostCallPolicyMode\n): FsImplementation[Name] {\n return declare(name, policy, (...args: readonly unknown[]) =>\n invoke(fs, name, args)\n ) as FsImplementation[Name];\n}\n\nfunction bindStringResult<Name extends \"readFile\" | \"readlink\" | \"realpath\" | \"mkdtemp\">(\n fs: FsImplementation,\n name: Name,\n policy: PendingHostCallPolicyMode = \"re-issue\"\n): FsModule[Name] {\n return declare(name, policy, async (...args: readonly unknown[]) => {\n assertNoBufferResult(name, args[1]);\n return (await invoke(fs, name, args)) as string;\n }) as FsModule[Name];\n}\n\nfunction bindReaddir(fs: FsImplementation): FsModule[\"readdir\"] {\n return declare(\"readdir\", \"re-issue\", async (...args: readonly unknown[]) => {\n assertNoBufferResult(\"readdir\", args[1]);\n const entries = (await invoke(fs, \"readdir\", args)) as ReadonlyArray<string | Dirent>;\n return entries.map((entry) => (typeof entry === \"string\" ? entry : toSandboxDirent(entry)));\n }) as FsModule[\"readdir\"];\n}\n\nfunction bindStat<Name extends \"stat\" | \"lstat\">(fs: FsImplementation, name: Name): FsModule[Name] {\n return declare(name, \"re-issue\", async (...args: readonly unknown[]) => {\n assertNoBigIntResult(name, args[1]);\n return toSandboxStats((await invoke(fs, name, args)) as Stats);\n }) as FsModule[Name];\n}\n\n// Every exported operation is declared here, which makes this the one place that\n// can promise node's argument validation runs first: before an unsupported result\n// is refused, and before a root rewrites the path node would have blamed.\nfunction declare<TOperation extends FsHostOperation>(\n name: FsOperationName,\n policy: PendingHostCallPolicyMode,\n operation: TOperation\n): TOperation {\n // async so a refused argument rejects rather than throwing at the call site:\n // every node:fs/promises function answers with a promise either way.\n const validated = async (...args: readonly unknown[]): Promise<unknown> => {\n FS_PATH_ARGUMENTS[name].forEach((argument, index) =>\n assertSupportedPath(name, argument, args[index])\n );\n assertSupportedOptions(name, args);\n\n return await operation(...args);\n };\n\n Object.defineProperty(validated, \"name\", { value: name });\n declareHostOperation(validated, policy);\n return validated as TOperation;\n}\n\nfunction invoke(fs: FsImplementation, name: FsOperationName, args: readonly unknown[]): unknown {\n return Reflect.apply(fs[name] as (...operationArgs: readonly unknown[]) => unknown, fs, args);\n}\n\n// Wraps every operation so its path arguments resolve against root and are proven\n// to stay inside it. The wrapped operations keep node's own signatures and\n// results, so the bindings above are unaware a root is in play.\nfunction makeRootedFs(\n fs: FsImplementation,\n root: string,\n adapter?: FileSystem,\n cwd?: string,\n signal?: AbortSignal\n): FsImplementation {\n if (root.trim().length === 0) {\n throw new Error(\"fs module root must be a non-empty string.\");\n }\n\n const resolvedRoot = adapter === undefined ? root : resolve(\"/\", root);\n const rooted: Record<string, FsHostOperation> = {};\n\n for (const name of Object.keys(FS_SYSCALLS) as FsOperationName[]) {\n rooted[name] = async (...args: readonly unknown[]) => {\n assertRootCanConfineOptions(name, args);\n\n return invoke(\n fs,\n name,\n await resolvePathArguments(fs, resolvedRoot, name, args, adapter, cwd, signal)\n );\n };\n }\n\n return rooted as unknown as FsImplementation;\n}\n\n// Refuses the one option a root cannot confine, before any path is resolved so a refused\n// call writes nothing. node reads dereference off its own defaults with a spread and\n// validates it as a boolean, so only `true` asks for the copy that escapes.\nfunction assertRootCanConfineOptions(name: FsOperationName, args: readonly unknown[]): void {\n if (name !== \"cp\") {\n return;\n }\n\n const options = args[FS_OPTION_SURFACE.cp.argument];\n\n if (isObjectLike(options) && (options as { dereference?: unknown }).dereference === true) {\n throw createUnsupportedOptionError(\"cp\", \"dereference\", ROOT_REFUSED_DEREFERENCE_REASON);\n }\n}\n\nasync function resolvePathArguments(\n fs: FsImplementation,\n root: string,\n name: FsOperationName,\n args: readonly unknown[],\n adapter?: FileSystem,\n cwd?: string,\n signal?: AbortSignal\n): Promise<readonly unknown[]> {\n const canonicalRoot = await resolveCanonicalPath(readCanonicalPathFs(fs), resolve(root));\n const base = cwd ?? canonicalRoot;\n const resolved = [...args];\n\n if (name === \"symlink\") {\n // node stores a symlink's target verbatim and resolves a relative target\n // against the link's own directory, so only the link path is rewritten while\n // the target is checked as the link's directory would see it.\n const linkPath = readPath(base, args[1]);\n const targetPath = readPath(dirname(linkPath), args[0]);\n resolved[1] = linkPath;\n if (adapter !== undefined && typeof args[0] === \"string\" && isAbsolute(args[0])) {\n signal?.throwIfAborted();\n if (!isPathWithin(canonicalRoot, targetPath) || !isPathWithin(canonicalRoot, linkPath)) {\n throw createAccessDeniedError(name, targetPath, linkPath);\n }\n throw new FsError(\"ENOTSUP\", {\n syscall: FS_SYSCALLS[name],\n path: targetPath,\n dest: linkPath,\n message:\n \"absolute symlink targets cannot be confined before creation; use a relative target\"\n });\n }\n const parent = await invoke(fs, \"realpath\", [dirname(linkPath)]);\n const checkedTarget = isAbsolute(args[0] as string)\n ? (args[0] as string)\n : `${parent as string}${sep}${args[0] as string}`;\n await assertInsideRoot(fs, canonicalRoot, name, [checkedTarget, linkPath], adapter, signal, [\n targetPath,\n linkPath\n ]);\n return resolved;\n }\n\n const paths = FS_PATH_ARGUMENTS[name].map((_, index) => {\n const path = readPath(base, args[index]);\n resolved[index] = path;\n return path;\n });\n\n await assertInsideRoot(fs, canonicalRoot, name, paths, adapter, signal);\n if (name === \"mkdtemp\") {\n const prefix = args[0] as string;\n const absolutePrefix = isAbsolute(prefix) ? prefix : `${base}${sep}${prefix}`;\n const parent = absolutePrefix.endsWith(sep) ? absolutePrefix : dirname(absolutePrefix);\n await assertInsideRoot(fs, canonicalRoot, name, [parent], adapter, signal, paths);\n resolved[0] = absolutePrefix;\n }\n if (adapter !== undefined && name === \"mkdir\") {\n const options = args[1];\n if (isObjectLike(options) && (options as { recursive?: unknown }).recursive === true) {\n signal?.throwIfAborted();\n try {\n await invoke(fs, \"realpath\", [dirname(canonicalRoot)]);\n } catch (error) {\n signal?.throwIfAborted();\n if (getOwnErrorCode(error) !== \"ENOENT\") throw error;\n throw createAccessDeniedError(name, paths[0]!);\n }\n }\n }\n return resolved;\n}\n\n// paths carries the operation's path arguments in node's order, so a denial names\n// the whole attempted call even when only one of them escapes.\nasync function assertInsideRoot(\n fs: FsImplementation,\n canonicalRoot: string,\n name: FsOperationName,\n paths: readonly string[],\n adapter?: FileSystem,\n signal?: AbortSignal,\n reportedPaths: readonly string[] = paths\n): Promise<void> {\n for (const path of paths) {\n if (await escapesRoot(fs, canonicalRoot, path, adapter, signal)) {\n throw createAccessDeniedError(name, reportedPaths[0]!, reportedPaths[1]);\n }\n }\n}\n\nasync function escapesRoot(\n fs: FsImplementation,\n canonicalRoot: string,\n path: string,\n adapter?: FileSystem,\n signal?: AbortSignal\n): Promise<boolean> {\n const canonicalPath = await resolveCanonicalPath(readCanonicalPathFs(fs), path);\n\n return !(await (adapter === undefined\n ? containsPath(readStat(fs), canonicalRoot, canonicalPath)\n : containsAdapterPath(adapter, canonicalRoot, canonicalPath, signal)));\n}\n\nasync function containsAdapterPath(\n adapter: FileSystem,\n canonicalRoot: string,\n canonicalPath: string,\n signal?: AbortSignal\n): Promise<boolean> {\n signal?.throwIfAborted();\n\n if (isPathWithin(canonicalRoot, canonicalPath)) {\n return true;\n }\n\n const compareEntry = adapter.compareEntry;\n if (compareEntry === undefined) {\n return false;\n }\n\n let current = canonicalPath;\n\n while (true) {\n try {\n const comparison = await awaitEntryComparison(\n () =>\n compareEntry.call(\n adapter,\n canonicalRoot,\n adapter,\n current,\n signal === undefined ? undefined : { signal }\n ),\n signal\n );\n if (comparison === \"same\") {\n return true;\n }\n if (comparison !== \"distinct\" && comparison !== \"unknown\") {\n throw new FsError(\"EIO\", { path: current, message: \"invalid filesystem entry comparison\" });\n }\n } catch (error) {\n signal?.throwIfAborted();\n const code = getOwnErrorCode(error);\n if (code !== \"ENOENT\" && code !== \"ENOTDIR\") {\n throw error;\n }\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return false;\n }\n current = parent;\n }\n}\n\nasync function awaitEntryComparison(\n compare: () => Promise<EntryComparison>,\n signal?: AbortSignal\n): Promise<EntryComparison> {\n signal?.throwIfAborted();\n if (signal === undefined) {\n return compare();\n }\n\n let onAbort!: () => void;\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n try {\n const comparison = await Promise.race([\n aborted,\n Promise.resolve().then(() => {\n signal.throwIfAborted();\n return compare();\n })\n ]);\n signal.throwIfAborted();\n return comparison;\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\n// realpath and readlink are handed over as bound calls: the injected implementation\n// may keep them as methods that need their own receiver, and node's overloads widen\n// both results to Buffer, which only the no-encoding calls used here can never\n// return.\nfunction readCanonicalPathFs(fs: FsImplementation): CanonicalPathFs {\n return {\n realpath: async (path) => (await invoke(fs, \"realpath\", [path])) as string,\n readlink: async (path) => (await invoke(fs, \"readlink\", [path])) as string\n };\n}\n\n// Bound for the same reason as realpath above. Only dev and ino are read: they are\n// the filesystem's own answer for which file a path names.\nfunction readStat(fs: FsImplementation): Stat {\n return async (path) => (await invoke(fs, \"stat\", [path])) as Stats;\n}\n\n// node accepts a string, a Buffer, or a URL, and rejects everything else before it\n// touches the filesystem. The module has to raise these itself rather than leave\n// them to the injected implementation: a root rewrites the path first, and an\n// injected implementation is free to validate differently \u2014 memfs reads a\n// NUL-bearing path as a missing file and takes an integer as a descriptor.\nfunction assertSupportedPath(name: FsOperationName, argument: string, value: unknown): void {\n if (typeof value === \"string\") {\n if (value.includes(NULL_BYTE)) {\n throw createNullByteError(argument, value);\n }\n\n return;\n }\n\n const form = readUnsupportedPathForm(value);\n\n throw form === undefined\n ? createInvalidPathTypeError(argument, value)\n : createUnsupportedPathError(name, argument, form);\n}\n\n// The path forms node accepts and the sandbox cannot spell. An integer is not one\n// of them: fs/promises has no descriptor path form, so node blames an integer's\n// type like any other non-string and so does the module.\nfunction readUnsupportedPathForm(value: unknown): string | undefined {\n if (value instanceof Uint8Array) {\n return \"a Buffer or Uint8Array\";\n }\n\n return value instanceof URL ? \"a URL\" : undefined;\n}\n\n// Shaped exactly like node's own ERR_INVALID_ARG_VALUE for a NUL-bearing path,\n// down to inspecting the offending value the way node does.\nfunction createNullByteError(argument: string, value: string): TypeError {\n const error: NodeJS.ErrnoException = new TypeError(\n `The argument '${argument}' must be a string, Uint8Array, or URL without null bytes. Received ${inspect(value)}`\n );\n\n error.code = INVALID_ARGUMENT_CODE;\n return error;\n}\n\n// Shaped exactly like node's own ERR_INVALID_ARG_TYPE for a path it cannot read.\nfunction createInvalidPathTypeError(argument: string, value: unknown): TypeError {\n const error: NodeJS.ErrnoException = new TypeError(\n `The \"${argument}\" argument must be of type string or an instance of Buffer or URL. Received ${describeReceivedValue(value)}`\n );\n\n error.code = INVALID_ARGUMENT_TYPE_CODE;\n return error;\n}\n\nfunction createUnsupportedPathError(\n name: FsOperationName,\n argument: string,\n form: string\n): TypeError {\n return new TypeError(\n `fs.${name} cannot accept ${form} as the '${argument}' argument inside SafeJS; pass the path as a string.`\n );\n}\n\n// Ports node's own determineSpecificType (lib/internal/errors.js), which shapes the\n// \"Received ...\" tail of every ERR_INVALID_ARG_TYPE message. node spells out each\n// primitive case by hand; inspect already answers with the same text for all of\n// them, down to -0, NaN, and a bigint's n suffix.\nfunction describeReceivedValue(value: unknown): string {\n if (value === null || value === undefined) {\n return String(value);\n }\n\n if (typeof value === \"function\") {\n return `function ${value.name}`;\n }\n\n if (typeof value === \"object\") {\n const constructorName = value.constructor?.name;\n\n return constructorName === undefined\n ? inspect(value, { depth: -1 })\n : `an instance of ${constructorName}`;\n }\n\n return `type ${typeof value} (${inspect(value)})`;\n}\n\n// Every path argument reaches this already proven to be a NUL-free string: each\n// operation is validated as it is declared, before a root gets to rewrite it.\nfunction readPath(base: string, value: unknown): string {\n const path = value as string;\n\n return isAbsolute(path) ? resolve(path) : resolve(base, path);\n}\n\n// Shaped exactly like the system error node raises for a refused path, so a\n// script's `error.code` branch reads the same against SafeJS and against node.\nfunction createAccessDeniedError(\n name: FsOperationName,\n path: string,\n dest?: string\n): NodeJS.ErrnoException {\n const syscall = FS_SYSCALLS[name];\n const target = dest === undefined ? `'${path}'` : `'${path}' -> '${dest}'`;\n const error: NodeJS.ErrnoException & { dest?: string } = new Error(\n `${ACCESS_DENIED_CODE}: ${ACCESS_DENIED_MESSAGE}, ${syscall} ${target}`\n );\n\n error.code = ACCESS_DENIED_CODE;\n error.errno = ACCESS_DENIED_ERRNO;\n error.syscall = syscall;\n error.path = path;\n\n if (dest !== undefined) {\n error.dest = dest;\n }\n\n return error;\n}\n\nfunction readSystemError(code: string): [number, string] {\n const fallback = new Map<number, [string, string]>([\n [process.platform === \"win32\" ? -4092 : -13, [\"EACCES\", \"permission denied\"]]\n ]);\n const systemErrors = nodeUtil.getSystemErrorMap?.() ?? fallback;\n for (const [errno, [name, message]] of systemErrors) {\n if (name === code) {\n return [errno, message];\n }\n }\n\n throw new Error(`node does not define the ${code} system error.`);\n}\n\n// node ignores an option key it does not know, which leaves a script unable to tell\n// an option it honoured from one it dropped. Every key is answered for here: refused\n// by name with the reason, or proven to be one node forwards.\nfunction assertSupportedOptions(name: FsOperationName, args: readonly unknown[]): void {\n // Widened to every operation for the lookup: the table only holds the ones node\n // gives an options bag.\n const surface: FsOptionSurface | undefined = (\n FS_OPTION_SURFACE as Partial<Record<FsOperationName, FsOptionSurface>>\n )[name];\n\n // An operation with no options bag, or an options argument node reads as an\n // encoding or a mode rather than a bag: node validates the value itself.\n if (surface === undefined || !isObjectLike(args[surface.argument])) {\n return;\n }\n\n const options = args[surface.argument] as object;\n\n // `in` rather than an enumeration: node reads an option by name, so a refused one\n // counts however it is spelled \u2014 own or inherited, enumerable or not. An\n // enumeration would answer for the keys a script wrote and miss the ones node\n // would still honour, which is the one way a refusal here could be bypassed.\n for (const option of surface.refused) {\n if (option in options) {\n throw createUnsupportedOptionError(name, option, REFUSED_OPTION_REASONS[option]);\n }\n }\n\n // Unknown keys are the ones node cannot be asked about, so they are enumerated\n // instead: for...in reads the own and inherited enumerable keys a script can\n // plausibly have written, which is where a typo for an option node does declare\n // shows up. Walking every own key of the whole chain would reach Object.prototype\n // and refuse `toString` on every options bag.\n for (const option in options) {\n if (!surface.honoured.includes(option)) {\n throw createUnsupportedOptionError(name, option, UNKNOWN_OPTION_REASON);\n }\n }\n}\n\nfunction assertNoBufferResult(operation: keyof typeof BUFFER_BY_DEFAULT, options: unknown): void {\n if (readsBuffer(options, BUFFER_BY_DEFAULT[operation])) {\n throw createUnsupportedCapabilityError(\n operation,\n \"return a Buffer\",\n 'pass a string encoding such as \"utf8\"'\n );\n }\n}\n\nfunction assertNoBigIntResult(operation: FsOperationName, options: unknown): void {\n if (isObjectLike(options) && (options as { bigint?: unknown }).bigint === true) {\n throw createUnsupportedCapabilityError(\n operation,\n \"return BigInt fields\",\n \"omit bigint and read the *Ms timestamps instead\"\n );\n }\n}\n\nfunction createUnsupportedOptionError(\n operation: FsOperationName,\n option: string,\n reason: string\n): TypeError {\n return createUnsupportedCapabilityError(operation, `honour the '${option}' option`, reason);\n}\n\n// The one shape every capability SafeJS cannot offer is refused with, so a script\n// reads the same sentence whichever option, encoding, or field it reached for.\nfunction createUnsupportedCapabilityError(\n operation: FsOperationName,\n capability: string,\n remedy: string\n): TypeError {\n return new TypeError(`fs.${operation} cannot ${capability} inside SafeJS; ${remedy}.`);\n}\n\n// Only reports the shapes node answers with a Buffer. Anything else \u2014 including\n// an unknown encoding or a malformed options argument \u2014 passes through so node's\n// own error surfaces instead of a SafeJS one.\nfunction readsBuffer(options: unknown, bufferByDefault: boolean): boolean {\n if (typeof options === \"string\") {\n return options === BUFFER_ENCODING;\n }\n\n if (options === undefined || options === null) {\n return bufferByDefault;\n }\n\n // node reads the encoding off anything it can hold a property on, so an array or\n // a function is an options object answering with a Buffer rather than a shape\n // node rejects. Everything else is left to node's own ERR_INVALID_ARG_TYPE.\n if (!isObjectLike(options)) {\n return false;\n }\n\n const { encoding } = options as { encoding?: unknown };\n\n if (encoding === BUFFER_ENCODING) {\n return true;\n }\n\n return (encoding === undefined || encoding === null) && bufferByDefault;\n}\n\nfunction toSandboxStats(stats: Stats): SandboxStats {\n const numbers: Record<string, number> = {};\n\n for (const field of STAT_NUMBER_FIELDS) {\n numbers[field] = stats[field];\n }\n\n return { ...numbers, ...toFileTypePredicates(stats) } as SandboxStats;\n}\n\nfunction toSandboxDirent(dirent: Dirent): SandboxDirent {\n return {\n name: dirent.name,\n parentPath: dirent.parentPath,\n ...toFileTypePredicates(dirent)\n };\n}\n\n// node's predicates read a mode the host object already resolved, so the answers\n// are captured here rather than keeping the host object alive behind a closure.\nfunction toFileTypePredicates(source: Stats | Dirent): FileTypePredicates {\n const predicates: Record<string, () => boolean> = {};\n\n for (const predicate of FILE_TYPE_PREDICATES) {\n const result = source[predicate]();\n predicates[predicate] = () => result;\n }\n\n return predicates as FileTypePredicates;\n}\n\nfunction isObjectLike(value: unknown): boolean {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n", "import { basename, dirname, isAbsolute, relative, resolve, sep } from \"node:path\";\n\nimport { getOwnErrorCode } from \"../error-codes.js\";\n\n// realpath answers ENOENT for a missing segment and ENOTDIR when a parent is a\n// file. Both mean the segment is not an existing directory, so both walk up.\nconst MISSING_PATH_CODES: readonly string[] = [\"ENOENT\", \"ENOTDIR\"];\n\n// What the filesystem answers for a path that has no link target to follow: EINVAL\n// for a path that exists and is not a link, and the missing-path codes for one that\n// is not there at all. Any other failure is the filesystem's own and is left to\n// surface rather than read as \"not a link\", which would canonicalize a link the\n// filesystem merely refused to read as though it named itself.\nconst NOT_A_SYMLINK_CODES: readonly string[] = [...MISSING_PATH_CODES, \"EINVAL\"];\n\n// A conforming realpath raises ELOOP for a cycle before the walk below can follow\n// one, so this cap is only reached by a filesystem that reports a cycle as a\n// missing path. Following one of those forever would hang the sandbox, so the walk\n// gives up the way the platform does \u2014 at SYMLOOP_MAX, which is 32 on darwin and\n// Linux alike.\nconst MAX_SYMLINK_FOLLOWS = 32;\n\ntype Realpath = (path: string) => Promise<string>;\n\n// A symlink's target exactly as stored, which is how node keeps it: relative\n// targets stay relative and resolve against the link's own directory.\ntype Readlink = (path: string) => Promise<string>;\n\n// The filesystem operations canonicalization needs: what a path resolves to, and\n// what a link it could not resolve names. Named as a whole because both are read\n// together, off the same filesystem, to canonicalize one path.\nexport type CanonicalPathFs = { realpath: Realpath; readlink: Readlink };\n\n// Which file a path names, as the filesystem itself answers it.\ntype PathIdentity = { dev: number; ino: number };\n\nexport type Stat = (path: string) => Promise<PathIdentity>;\n\n// Canonicalizes as much of the path as exists and re-appends the segments that do\n// not, so a path is checked after symlinks are followed rather than as written.\n// The missing segments go back through resolve(), which collapses any `..` among\n// them, so they cannot re-escape what realpath already pinned down.\n//\n// A dangling symlink is the case this cannot read off realpath alone: realpath\n// refuses one with the same ENOENT it gives a path that was never there, yet the two\n// are not the same place. node follows a dangling link and acts on its target \u2014 a\n// write through one creates the target \u2014 so a dangling link canonicalizes to what it\n// names, not to itself. Reading that ENOENT as \"nothing here\" would answer with the\n// link's own path and call a link out of a caller's root contained.\nexport async function resolveCanonicalPath(\n { realpath, readlink }: CanonicalPathFs,\n path: string\n): Promise<string> {\n const missingSegments: string[] = [];\n let current = path;\n let follows = 0;\n\n while (true) {\n try {\n const canonicalCurrent = await realpath(current);\n return resolve(canonicalCurrent, ...missingSegments.reverse());\n } catch (error) {\n if (!MISSING_PATH_CODES.includes(getOwnErrorCode(error) ?? \"\")) {\n throw error;\n }\n\n const target = await readSymlinkTarget(readlink, current);\n\n if (target !== undefined) {\n if (++follows > MAX_SYMLINK_FOLLOWS) {\n throw createLoopError(path);\n }\n\n // node resolves a relative target against the link's own directory. Any\n // segments already collected still hang off whatever the target resolves to,\n // so they stay on the list.\n current = isAbsolute(target) ? target : `${dirname(current)}${sep}${target}`;\n continue;\n }\n\n const parent = dirname(current);\n\n if (parent === current) {\n return resolve(path);\n }\n\n missingSegments.push(basename(current));\n current = parent;\n }\n }\n}\n\n// The target of a link realpath could not resolve, or undefined when the path is not\n// a link at all and the walk should climb past it instead.\nasync function readSymlinkTarget(readlink: Readlink, path: string): Promise<string | undefined> {\n try {\n return await readlink(path);\n } catch (error) {\n if (NOT_A_SYMLINK_CODES.includes(getOwnErrorCode(error) ?? \"\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n\n// Shaped like the ELOOP a filesystem raises for a cycle it walked itself, so a\n// caller that branches on the code reads the cap and the filesystem's own answer the\n// same way.\nfunction createLoopError(path: string): NodeJS.ErrnoException {\n const error: NodeJS.ErrnoException = new Error(\n `ELOOP: too many symbolic links encountered, realpath '${path}'`\n );\n\n error.code = \"ELOOP\";\n return error;\n}\n\n// Whether root contains path, root itself included. Both arguments must already be\n// canonical: a `..` or a symlink left in either one would make the comparison lie.\n//\n// The rule: the filesystem has the deciding vote on containment, and comparing\n// the canonical spellings is only a fast path that is trusted when it answers\n// \"contained\". Two canonical paths can differ in spelling and still be the same\n// place \u2014 on a case-insensitive filesystem (darwin's default) `/repo` and `/REPO`\n// are one directory, and darwin's realpath echoes the spelling it was handed\n// rather than the on-disk one, so canonicalization does not fold the case away.\n// Comparing spellings can therefore only ever be wrong in one direction: it may\n// answer \"outside\" for a path that resolves inside root, never the reverse. So\n// \"outside\" is re-decided by walking the path's ancestors and asking the\n// filesystem for each one's identity, which no spelling can lie about. Folding\n// case here instead would be a hole: on a case-sensitive filesystem `/REPO/x` is\n// genuinely a different file from `/repo/x`.\nexport async function containsPath(\n stat: Stat,\n canonicalRoot: string,\n canonicalPath: string\n): Promise<boolean> {\n if (containsCanonicalSpelling(canonicalRoot, canonicalPath)) {\n return true;\n }\n\n return descendsFromRoot(stat, canonicalRoot, canonicalPath);\n}\n\n// Whether two canonical paths name the same place. Two spellings can name one\n// place on a case-insensitive filesystem, so identity decides here for the same\n// reason it decides containment above.\nexport async function isSamePath(\n stat: Stat,\n canonicalLeft: string,\n canonicalRight: string\n): Promise<boolean> {\n if (canonicalLeft === canonicalRight) {\n return true;\n }\n\n const [left, right] = await Promise.all([\n readIdentity(stat, canonicalLeft),\n readIdentity(stat, canonicalRight)\n ]);\n\n return (\n left !== undefined && right !== undefined && left.dev === right.dev && left.ino === right.ino\n );\n}\n\nfunction containsCanonicalSpelling(canonicalRoot: string, canonicalPath: string): boolean {\n const relativePath = relative(canonicalRoot, canonicalPath);\n\n // An empty relative path is root itself, which the root contains.\n return !(\n relativePath === \"..\" ||\n relativePath.startsWith(`..${sep}`) ||\n isAbsolute(relativePath)\n );\n}\n\n// Climbs the path's ancestors looking for root's own identity. A canonical path\n// carries no symlinks and no `..`, so every ancestor it names is a real ancestor:\n// finding root among them means the path descends from root whatever either one\n// is spelled like.\nasync function descendsFromRoot(\n stat: Stat,\n canonicalRoot: string,\n canonicalPath: string\n): Promise<boolean> {\n const root = await readIdentity(stat, canonicalRoot);\n\n if (root === undefined) {\n return false;\n }\n\n let current = canonicalPath;\n\n while (true) {\n const identity = await readIdentity(stat, current);\n\n if (identity !== undefined && identity.dev === root.dev && identity.ino === root.ino) {\n return true;\n }\n\n const parent = dirname(current);\n\n if (parent === current) {\n return false;\n }\n\n current = parent;\n }\n}\n\n// A path that is not there has no identity to match, so the walk climbs past it\n// rather than treating it as an answer. Any other failure is the filesystem's own\n// and is left to surface: swallowing it would report a refusal for what node\n// blames on something else.\nasync function readIdentity(stat: Stat, path: string): Promise<PathIdentity | undefined> {\n try {\n const { dev, ino } = await stat(path);\n return { dev, ino };\n } catch (error) {\n if (MISSING_PATH_CODES.includes(getOwnErrorCode(error) ?? \"\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n", "import {\n createFileSystem,\n createNodeFileSystemAdapterRegistry,\n readConfigRecord,\n validateFileSystemConfig,\n type FileSystemAdapterRegistry,\n type FileSystemConfig\n} from \"@poe-code/safe-fs\";\nimport type { FsModuleOptions } from \"./fs.js\";\n\nexport type FsConfig = {\n readonly adapter: FileSystemConfig;\n readonly root?: string;\n readonly cwd?: string;\n};\nexport type ResolveFsConfigOptions = { readonly registry?: FileSystemAdapterRegistry };\n\nfunction validateFsConfig(value: unknown): FsConfig {\n const config = readConfigRecord(value, \"fs config\", [\"adapter\", \"root\", \"cwd\"]);\n const paths: { root?: string; cwd?: string } = {};\n for (const key of [\"root\", \"cwd\"] as const) {\n const path = config[key];\n if (path === undefined) continue;\n if (typeof path !== \"string\" || !path.startsWith(\"/\") || path.includes(\"\\0\")) {\n throw new TypeError(`${key} must be an absolute virtual path`);\n }\n paths[key] = path;\n }\n return {\n adapter: validateFileSystemConfig(config.adapter),\n ...paths\n };\n}\n\nexport function parseFsConfig(json: string): FsConfig {\n return validateFsConfig(JSON.parse(json));\n}\n\nexport async function resolveFsConfig(\n config: FsConfig,\n options: ResolveFsConfigOptions = {}\n): Promise<Required<Pick<FsModuleOptions, \"adapter\">> & Pick<FsModuleOptions, \"root\" | \"cwd\">> {\n const { adapter: adapterConfig, ...paths } = validateFsConfig(config);\n const resolution = readConfigRecord(options, \"fs resolution option\", [\"registry\"]);\n const registry = createNodeFileSystemAdapterRegistry(\n resolution.registry as FileSystemAdapterRegistry | undefined\n );\n const adapter = await createFileSystem(adapterConfig, { registry });\n return { adapter, ...paths };\n}\n", "import { deepCopyToSandbox, type SandboxValue } from \"../interp/values.js\";\n\nexport type HarnessFrontmatter = Record<string, SandboxValue>;\n\nexport type HarnessModuleMeta = {\n kind: SandboxValue;\n version: SandboxValue;\n filepath: string;\n frontmatter: HarnessFrontmatter;\n};\n\nexport type HarnessModule = {\n tasks: SandboxValue;\n agents: SandboxValue;\n meta: HarnessModuleMeta;\n applyConstraints: (prompt: string) => string;\n};\n\nexport function makeHarnessModule(\n frontmatter: Record<string, unknown>,\n meta: {\n kind: unknown;\n version: unknown;\n filepath: string;\n }\n): HarnessModule {\n const copiedFrontmatter = copyHarnessValue(frontmatter) as HarnessFrontmatter;\n const constraints = readConstraints(copiedFrontmatter);\n\n return {\n tasks: copyHarnessValue(copiedFrontmatter.tasks),\n agents: copyHarnessValue(copiedFrontmatter.agents),\n meta: {\n kind: copyHarnessValue(meta.kind),\n version: copyHarnessValue(meta.version),\n filepath: meta.filepath,\n frontmatter: copiedFrontmatter\n },\n applyConstraints: (prompt: string) => applyConstraints(prompt, constraints)\n };\n}\n\nfunction copyHarnessValue(value: unknown): SandboxValue {\n return deepCopyToSandbox(value);\n}\n\nfunction readConstraints(frontmatter: HarnessFrontmatter): string[] {\n const constraints = new Set<string>();\n\n appendConstraintValues(constraints, frontmatter.principles);\n appendConstraintValues(constraints, frontmatter.constraints);\n\n return [...constraints];\n}\n\nfunction appendConstraintValues(constraints: Set<string>, value: SandboxValue): void {\n if (!Array.isArray(value)) {\n return;\n }\n\n for (const item of value) {\n if (typeof item !== \"string\") {\n throw new Error(\"constraints/principles must be strings\");\n }\n\n constraints.add(item);\n }\n}\n\nfunction applyConstraints(prompt: string, constraints: readonly string[]): string {\n if (constraints.length === 0) {\n return prompt;\n }\n\n const preamble = `CONSTRAINTS (hard rules, honor all):\\n${constraints\n .map((constraint) => `- ${constraint}`)\n .join(\"\\n\")}`;\n\n return prompt.length === 0 ? preamble : `${preamble}\\n\\n${prompt}`;\n}\n", "import { hasOwnErrorCode } from \"./error-codes.js\";\n\nexport type OutputStream = {\n off?(event: \"error\", listener: (error: unknown) => void): void;\n on?(event: \"error\", listener: (error: unknown) => void): void;\n write(chunk: string): void;\n};\n\nexport type BrokenPipeState = {\n closed: boolean;\n};\n\nexport function createBrokenPipeState(): BrokenPipeState {\n return { closed: false };\n}\n\nexport function createSafeOutputStream(\n stream: OutputStream,\n brokenPipe: BrokenPipeState\n): OutputStream {\n return {\n write(chunk) {\n if (brokenPipe.closed) {\n return;\n }\n\n try {\n stream.write(chunk);\n } catch (error) {\n if (isBrokenPipeError(error)) {\n brokenPipe.closed = true;\n return;\n }\n\n throw error;\n }\n }\n };\n}\n\nexport async function withBrokenPipeGuard<TResult>(\n streams: readonly OutputStream[],\n brokenPipe: BrokenPipeState,\n callback: () => Promise<TResult>\n): Promise<TResult> {\n const removeListeners = streams.map((stream) => addBrokenPipeListener(stream, brokenPipe));\n\n try {\n return await callback();\n } finally {\n for (const removeListener of removeListeners) {\n removeListener();\n }\n }\n}\n\nexport function addBrokenPipeListener(\n stream: OutputStream,\n brokenPipe: BrokenPipeState\n): () => void {\n const onError = (error: unknown) => {\n if (isBrokenPipeError(error)) {\n brokenPipe.closed = true;\n return;\n }\n\n throw error;\n };\n\n stream.on?.(\"error\", onError);\n return () => {\n stream.off?.(\"error\", onError);\n };\n}\n\nfunction isBrokenPipeError(error: unknown): boolean {\n return hasOwnErrorCode(error, \"EPIPE\");\n}\n", "import {\n addBrokenPipeListener,\n createBrokenPipeState,\n createSafeOutputStream\n} from \"../output-stream.js\";\n\nexport type LogModuleEntry =\n | {\n ts: string;\n type: \"info\" | \"error\";\n args: unknown[];\n }\n | {\n ts: string;\n type: \"event\";\n name: string;\n payload: unknown;\n };\n\nexport type LogModuleSink = (entry: LogModuleEntry) => void;\n\nconst stdoutSinks = new WeakMap<NodeJS.WriteStream, LogModuleSink>();\n\nexport function makeLogModule(sink: LogModuleSink = createJsonlStdoutSink()): {\n info: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n event: (name: string, payload: unknown) => void;\n} {\n const normalizedSink = readSink(sink);\n\n return {\n info(...args) {\n normalizedSink({\n ts: new Date().toISOString(),\n type: \"info\",\n args\n });\n },\n\n error(...args) {\n normalizedSink({\n ts: new Date().toISOString(),\n type: \"error\",\n args\n });\n },\n\n event(name, payload) {\n normalizedSink({\n ts: new Date().toISOString(),\n type: \"event\",\n name: readNonEmptyString(name, \"Event name\"),\n payload\n });\n }\n };\n}\n\nfunction createJsonlStdoutSink(): LogModuleSink {\n const stream = process.stdout;\n const existing = stdoutSinks.get(stream);\n if (existing) return existing;\n\n const brokenPipe = createBrokenPipeState();\n const stdout = createSafeOutputStream(stream, brokenPipe);\n addBrokenPipeListener(stream, brokenPipe);\n\n const sink: LogModuleSink = (entry) => {\n stdout.write(`${JSON.stringify(toJsonValue(entry, new WeakSet()))}\\n`);\n };\n stdoutSinks.set(stream, sink);\n return sink;\n}\n\nfunction readNonEmptyString(value: unknown, label: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n const normalizedValue = value.trim();\n\n if (normalizedValue.length === 0) {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n return normalizedValue;\n}\n\nfunction readSink(value: unknown): LogModuleSink {\n if (typeof value !== \"function\") {\n throw new Error(\"Log sink must be a function.\");\n }\n\n return value as LogModuleSink;\n}\n\nfunction toJsonValue(value: unknown, seen: WeakSet<object>): unknown {\n if (value === undefined) {\n return null;\n }\n\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : String(value);\n }\n\n if (typeof value === \"bigint\" || typeof value === \"symbol\") {\n return String(value);\n }\n\n if (typeof value === \"function\") {\n return `[Function ${value.name || \"anonymous\"}]`;\n }\n\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? \"Invalid Date\" : value.toISOString();\n }\n\n if (value instanceof Error) {\n const serializedError: Record<string, unknown> = {\n name: value.name,\n message: value.message\n };\n\n if (typeof value.stack === \"string\" && value.stack.length > 0) {\n serializedError.stack = value.stack;\n }\n\n if (Object.prototype.hasOwnProperty.call(value, \"cause\")) {\n serializedError.cause = toJsonValue(value.cause, seen);\n }\n\n return serializedError;\n }\n\n if (Array.isArray(value)) {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n const normalized = value.map((entry) => toJsonValue(entry, seen));\n seen.delete(value);\n return normalized;\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n const normalized = Object.create(null) as Record<string, unknown>;\n\n for (const [key, entry] of Object.entries(value)) {\n normalized[key] = toJsonValue(entry, seen);\n }\n\n seen.delete(value);\n return normalized;\n }\n\n return String(value);\n}\n", "export type NpmRunner = (scriptName: string) => Promise<string>;\n\nexport function makeMetricModule(npmRunner: NpmRunner): {\n run(name: string): Promise<number>;\n} {\n return {\n async run(name) {\n const metricName = readNonEmptyString(name, \"Metric name\");\n const scriptName = `metric:${metricName}`;\n const stdout = await npmRunner(scriptName);\n const score = parseMetricScore(stdout, scriptName);\n\n return score;\n }\n };\n}\n\nfunction parseMetricScore(stdout: unknown, scriptName: string): number {\n if (typeof stdout !== \"string\") {\n throw new Error(`Metric runner for \"${scriptName}\" must resolve to a stdout string.`);\n }\n\n const scoreLine = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .at(-1);\n\n if (scoreLine === undefined) {\n throw new Error(`Metric script \"${scriptName}\" must print a numeric score.`);\n }\n\n const score = Number(scoreLine);\n\n if (!Number.isFinite(score)) {\n throw new Error(`Metric script \"${scriptName}\" must print a numeric score.`);\n }\n\n return score;\n}\n\nfunction readNonEmptyString(value: unknown, label: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n const normalizedValue = value.trim();\n\n if (normalizedValue.length === 0) {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n return normalizedValue;\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n HttpTransport,\n McpClient,\n StdioTransport,\n type HttpTransportFetch,\n type McpTransport,\n type StdioSpawn\n} from \"tiny-mcp-client\";\n\nexport type McpServerConfig =\n | { command: string; args?: string[]; cwd?: string; env?: Record<string, string> }\n | { url: string; headers?: Record<string, string> };\n\nexport type McpModuleOptions = {\n servers: Record<string, McpServerConfig>;\n requestTimeoutMs?: number;\n closeTimeoutMs?: number;\n maxToolPages?: number;\n signal?: AbortSignal;\n fetch?: HttpTransportFetch;\n spawn?: StdioSpawn;\n};\n\nexport type ManagedMcpConnection = {\n ready: Promise<McpClient>;\n close(): Promise<void>;\n};\n\nexport function parseMcpConfig(source: string, directory: string): McpModuleOptions {\n const parsed = JSON.parse(source) as unknown;\n const options = normalizeMcpOptions(parsed, [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\"\n ]);\n for (const server of Object.values(options.servers)) {\n if (\"command\" in server) {\n server.cwd = path.resolve(directory, server.cwd ?? \".\");\n if (server.command.includes(\"/\") || server.command.includes(\"\\\\\")) {\n server.command = path.resolve(directory, server.command);\n }\n }\n }\n return options;\n}\n\nexport function normalizeMcpOptions(\n value: unknown,\n keys = [\n \"servers\",\n \"requestTimeoutMs\",\n \"closeTimeoutMs\",\n \"maxToolPages\",\n \"signal\",\n \"fetch\",\n \"spawn\"\n ]\n): McpModuleOptions {\n const options = readRecord(value, \"MCP options\", keys);\n const servers = readRecord(options.servers, \"MCP servers\");\n const normalized = Object.create(null) as Record<string, McpServerConfig>;\n for (const [name, input] of Object.entries(servers)) {\n if (name.length === 0 || name.trim() !== name)\n throw new TypeError(\"MCP server names must be non-empty without surrounding whitespace.\");\n const server = readRecord(input, `MCP server ${name}`);\n if (Object.hasOwn(server, \"command\")) {\n readRecord(server, `MCP server ${name}`, [\"command\", \"args\", \"cwd\", \"env\"]);\n const command = readText(server.command, \"MCP command\");\n if (\n server.args !== undefined &&\n (!Array.isArray(server.args) ||\n server.args.some((argument) => typeof argument !== \"string\"))\n )\n throw new TypeError(\"MCP args must be an array of strings.\");\n normalized[name] = {\n command,\n ...(server.args === undefined ? {} : { args: [...(server.args as string[])] }),\n ...(server.cwd === undefined ? {} : { cwd: readText(server.cwd, \"MCP cwd\") }),\n env: readStrings(server.env ?? {}, \"MCP environment\")\n };\n } else {\n readRecord(server, `MCP server ${name}`, [\"url\", \"headers\"]);\n const url = new URL(readText(server.url, \"MCP URL\"));\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password || url.hash)\n throw new TypeError(\"MCP URL must use HTTP or HTTPS without credentials or a fragment.\");\n const headers = readStrings(server.headers ?? {}, \"MCP headers\");\n new Headers(headers);\n normalized[name] = { url: url.href, headers };\n }\n }\n for (const name of [\"fetch\", \"spawn\"])\n if (options[name] !== undefined && typeof options[name] !== \"function\")\n throw new TypeError(`MCP ${name} must be a function.`);\n if (options.signal !== undefined && !(options.signal instanceof AbortSignal))\n throw new TypeError(\"MCP signal must be an AbortSignal.\");\n return {\n servers: normalized,\n requestTimeoutMs: readTimeout(options.requestTimeoutMs, 30_000),\n closeTimeoutMs: readTimeout(options.closeTimeoutMs, 1_000),\n maxToolPages: readTimeout(options.maxToolPages, 100),\n ...(options.signal === undefined ? {} : { signal: options.signal as AbortSignal }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch as HttpTransportFetch }),\n ...(options.spawn === undefined ? {} : { spawn: options.spawn as StdioSpawn })\n };\n}\n\nfunction readRecord(value: unknown, label: string, keys?: string[]): Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n ![Object.prototype, null].includes(Object.getPrototypeOf(value))\n )\n throw new TypeError(`${label} must be a plain object.`);\n const result = Object.create(null) as Record<string, unknown>;\n for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(value))) {\n if (!(\"value\" in descriptor) || (keys !== undefined && !keys.includes(key)))\n throw new TypeError(`${label} contains unsupported field ${key}.`);\n result[key] = descriptor.value;\n }\n return result;\n}\n\nfunction readText(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0 || value.includes(\"\\0\"))\n throw new TypeError(`${label} must be a non-empty string without NUL characters.`);\n return value;\n}\n\nfunction readStrings(value: unknown, label: string): Record<string, string> {\n const entries = readRecord(value, label);\n for (const [name, entry] of Object.entries(entries))\n if (typeof entry !== \"string\" || name.includes(\"\\0\") || entry.includes(\"\\0\"))\n throw new TypeError(`${label} must contain strings without NUL characters.`);\n return entries as Record<string, string>;\n}\n\nfunction readTimeout(value: unknown, fallback: number): number {\n if (value === undefined) return fallback;\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value <= 0 ||\n value > 2_147_483_647\n )\n throw new TypeError(\"MCP timeouts must be positive 32-bit integers.\");\n return value;\n}\n\nexport function connectMcpTransport(\n server: McpServerConfig,\n options: McpModuleOptions,\n signal?: AbortSignal\n): ManagedMcpConnection {\n signal?.throwIfAborted();\n options.signal?.throwIfAborted();\n const client = new McpClient({\n clientInfo: { name: \"safejs\", version: \"1\" },\n requestTimeoutMs: options.requestTimeoutMs\n });\n let child: ChildProcessWithoutNullStreams | undefined;\n const activeRequests = new Set<AbortController>();\n const transport: McpTransport =\n \"command\" in server\n ? new StdioTransport({\n ...server,\n spawn(command, args, spawnOptions) {\n child =\n options.spawn === undefined\n ? (spawn(command, args, spawnOptions) as ChildProcessWithoutNullStreams)\n : options.spawn(command, args, spawnOptions);\n return child;\n }\n })\n : new HttpTransport({\n ...server,\n async fetch(input, init) {\n const controller = new AbortController();\n activeRequests.add(controller);\n const cancel = () => controller.abort(init?.signal?.reason);\n init?.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (init?.signal?.aborted) cancel();\n const timeout = setTimeout(\n () => controller.abort(new Error(\"MCP HTTP request timed out.\")),\n init?.method === \"DELETE\" ? options.closeTimeoutMs : options.requestTimeoutMs\n );\n const finish = () => {\n clearTimeout(timeout);\n activeRequests.delete(controller);\n init?.signal?.removeEventListener(\"abort\", cancel);\n };\n try {\n const response = await (options.fetch ?? fetch)(input, {\n ...init,\n signal: controller.signal,\n redirect: \"error\"\n });\n if (response.body === null) {\n finish();\n return response;\n }\n const reader = response.body.getReader();\n let stopReading: (() => void) | undefined;\n const release = () => {\n finish();\n if (stopReading !== undefined)\n controller.signal.removeEventListener(\"abort\", stopReading);\n };\n const body = new ReadableStream<Uint8Array>({\n start(stream) {\n stopReading = () => {\n void reader.cancel(controller.signal.reason).catch(() => undefined);\n stream.error(controller.signal.reason);\n release();\n };\n controller.signal.addEventListener(\"abort\", stopReading, { once: true });\n if (controller.signal.aborted) stopReading();\n },\n async pull(stream) {\n try {\n const result = await reader.read();\n if (controller.signal.aborted) return;\n if (result.done) {\n release();\n stream.close();\n } else stream.enqueue(result.value);\n } catch (error) {\n release();\n stream.error(error);\n }\n },\n async cancel(reason) {\n release();\n await reader.cancel(reason);\n }\n });\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers\n });\n } catch (error) {\n finish();\n throw error;\n }\n }\n });\n let closing: Promise<void> | undefined;\n const cancel = () => {\n void close().catch(() => undefined);\n };\n function close(): Promise<void> {\n closing ??= (async () => {\n signal?.removeEventListener(\"abort\", cancel);\n options.signal?.removeEventListener(\"abort\", cancel);\n for (const request of activeRequests) request.abort(new Error(\"MCP connection closed.\"));\n await client.close();\n transport.dispose();\n await new Promise<void>((resolve, reject) => {\n let forced: ReturnType<typeof setTimeout> | undefined;\n const timeout = setTimeout(() => {\n if (child !== undefined && child.exitCode === null && child.signalCode === null)\n child.kill(\"SIGKILL\");\n forced = setTimeout(\n () => reject(new Error(\"MCP transport did not close.\")),\n options.closeTimeoutMs\n );\n }, options.closeTimeoutMs);\n void transport.closed.then(\n () => {\n clearTimeout(timeout);\n clearTimeout(forced);\n resolve();\n },\n (error) => {\n clearTimeout(timeout);\n clearTimeout(forced);\n reject(error);\n }\n );\n });\n })();\n return closing;\n }\n signal?.addEventListener(\"abort\", cancel, { once: true });\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n const aborted = signal?.aborted || options.signal?.aborted;\n if (aborted) cancel();\n const connecting = aborted\n ? Promise.reject(signal?.aborted ? signal.reason : options.signal?.reason)\n : client.connect(transport);\n const ready = connecting.then(\n () => client,\n async (error) => {\n await close().catch(() => undefined);\n throw signal?.aborted\n ? signal.reason\n : options.signal?.aborted\n ? options.signal.reason\n : error;\n }\n );\n return { ready, close };\n}\n", "import { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n} from \"mcp-oauth\";\nimport type { Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"mcp-oauth\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"mcp-oauth\";\n\nexport type RequestId = number | string;\n\nexport interface Implementation {\n name: string;\n version: string;\n}\n\nexport interface ClientCapabilities {\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n requestTimeoutMs?: number;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: () => Root[] | Promise<Root[]>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentClientCapabilities: ClientCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly subscribedResourceUris = new Set<string>();\n private readonly activeProgressTokens = new Map<ProgressToken, number>();\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities === null\n ? null\n : structuredClone(this.currentServerCapabilities);\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo;\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport): Promise<InitializeResult> {\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n\n const transportClosedReason = transport.closed\n .then((closedEvent) => closedEvent.reason)\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n this.options.requestTimeoutMs,\n transportClosedReason\n );\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params) =>\n onSamplingRequest(params as CreateMessageParams)\n );\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async () => {\n if (onToolsChanged === undefined || this.currentServerCapabilities?.tools?.listChanged !== true) {\n return;\n }\n\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async () => {\n if (\n onResourcesChanged === undefined\n || this.currentServerCapabilities?.resources?.listChanged !== true\n ) {\n return;\n }\n\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\" || !this.subscribedResourceUris.has(uri)) {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async () => {\n if (\n onPromptsChanged === undefined\n || this.currentServerCapabilities?.prompts?.listChanged !== true\n ) {\n return;\n }\n\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (\n !isRequestId(progressToken) ||\n typeof progress !== \"number\" ||\n !this.activeProgressTokens.has(progressToken)\n ) {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n this.currentClientCapabilities = structuredClone(capabilities);\n\n try {\n const initializeResultValue = await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n });\n\n if (!isInitializeResult(initializeResultValue)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid initialize result\");\n }\n\n const initializeResult = initializeResultValue;\n\n if (initializeResult.protocolVersion !== MCP_PROTOCOL_VERSION) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n\n this.currentServerCapabilities = structuredClone(initializeResult.capabilities);\n this.currentServerInfo = { ...initializeResult.serverInfo };\n this.currentInstructions = initializeResult.instructions;\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async () => ({\n roots: await onRootsList(),\n }));\n }\n messageLayer.sendNotification(\"notifications/initialized\");\n this.currentState = \"ready\";\n\n return initializeResult;\n } catch (error) {\n if (this.transport === transport) {\n const reason = error instanceof Error ? error : new Error(String(error));\n messageLayer.dispose(reason);\n transport.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"disconnected\";\n }\n\n throw error;\n }\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}): Promise<{ tools: Tool[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"tools/list\", requestParams);\n if (!isToolsListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tools/list result\");\n }\n\n return result;\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n if (options.signal?.aborted) {\n throw options.signal.reason;\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n if (options.progressToken !== undefined) {\n this.activeProgressTokens.set(\n options.progressToken,\n (this.activeProgressTokens.get(options.progressToken) ?? 0) + 1\n );\n }\n\n try {\n let requestId: RequestId | undefined;\n let cancellationSent = false;\n const sendCancellationNotification = () => {\n if (requestId === undefined || cancellationSent) {\n return;\n }\n cancellationSent = true;\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n };\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n onTimeout: sendCancellationNotification,\n }).then((result) => {\n if (!isCallToolResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid tool result\");\n }\n\n return result;\n });\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n sendCancellationNotification();\n if (requestId !== undefined) {\n messageLayer.cancelRequest(requestId, signal.reason);\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n } finally {\n if (options.progressToken !== undefined) {\n const activeCount = this.activeProgressTokens.get(options.progressToken);\n if (activeCount === 1) {\n this.activeProgressTokens.delete(options.progressToken);\n } else if (activeCount !== undefined) {\n this.activeProgressTokens.set(options.progressToken, activeCount - 1);\n }\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}\n ): Promise<{ resources: Resource[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/list\", requestParams);\n if (!isResourcesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/list result\");\n }\n\n return result;\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}\n ): Promise<{ resourceTemplates: ResourceTemplate[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n const result = await messageLayer.sendRequest(\"resources/templates/list\", requestParams);\n if (!isResourceTemplatesListResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/templates/list result\");\n }\n\n return result;\n }\n\n async readResource(params: ReadResourceParams): Promise<{ contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const result = await messageLayer.sendRequest(\"resources/read\", params);\n if (!isReadResourceResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid resources/read result\");\n }\n\n return result;\n }\n\n async subscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri });\n this.subscribedResourceUris.add(uri);\n }\n\n async unsubscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri });\n this.subscribedResourceUris.delete(uri);\n }\n\n async listPrompts(params: PaginatedParams = {}): Promise<{ prompts: Prompt[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const result = await messageLayer.sendRequest(\"prompts/get\", params);\n if (!isGetPromptResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid prompts/get result\");\n }\n\n return result;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n const result = await messageLayer.sendRequest(\"completion/complete\", params);\n if (!isCompleteResult(result)) {\n throw new McpError(ERROR_INVALID_REQUEST, \"Invalid completion/complete result\");\n }\n\n return result;\n }\n\n async setLogLevel(level: LogLevel): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level });\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n if (this.currentClientCapabilities?.roots?.listChanged !== true) {\n throw new Error(\"Client did not advertise roots list changes\");\n }\n\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(\"ping\");\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentServerCapabilities = null;\n this.currentClientCapabilities = null;\n this.currentServerInfo = null;\n this.currentInstructions = undefined;\n this.subscribedResourceUris.clear();\n this.activeProgressTokens.clear();\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool {\n name: string;\n title?: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n annotations?: ToolAnnotations;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface PaginatedResult {\n nextCursor?: string;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string;\n blob: string;\n}\n\nexport type ResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: ResourceContents;\n}\n\nexport type ContentItem = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\nexport interface Prompt {\n name: string;\n description?: string;\n arguments?: PromptArgument[];\n}\n\nexport interface PromptArgument {\n name: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n structuredContent?: Record<string, unknown>;\n isError?: boolean;\n}\n\nexport interface Root {\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem | ContentItem[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n model: string;\n content: ContentItem | ContentItem[];\n role: \"user\" | \"assistant\";\n stopReason: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n dispose(reason?: Error): void;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n url: string;\n headers?: RequestInit[\"headers\"];\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n const stderrDecoder = new TextDecoder();\n child.stderr.on(\"data\", (chunk: unknown) => {\n const decoded =\n chunk instanceof Uint8Array\n ? stderrDecoder.decode(chunk, { stream: true })\n : `${stderrDecoder.decode()}${String(chunk)}`;\n this.appendStderrOutput(decoded);\n });\n child.stderr.once(\"end\", () => {\n this.appendStderrOutput(stderrDecoder.decode());\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n private appendStderrOutput(chunk: string): void {\n if (chunk.length === 0) {\n return;\n }\n\n this.stderrOutput += chunk;\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly url: string;\n private readonly headers: HeadersInit;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly openSseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n\n constructor({\n url,\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n }: HttpTransportOptions) {\n this.url = url;\n this.headers = headers;\n this.fetchImpl = fetchImpl;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.abortInFlightFetches();\n this.cancelOpenSseReaders();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n void this.closeWithSessionTermination(reason);\n }\n\n private async closeWithSessionTermination(reason: Error): Promise<void> {\n let closeReason = reason;\n if (this.sessionId !== undefined) {\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n try {\n await this.sendSessionTerminationRequest(sessionId);\n } catch (error) {\n closeReason = error instanceof Error ? error : new Error(String(error));\n }\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason: closeReason });\n }\n\n private abortInFlightFetches(): void {\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort();\n }\n\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenSseReaders(): void {\n for (const reader of this.openSseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openSseReaders.clear();\n }\n\n private async fetchWithAbort(input: string | URL, init: RequestInit): Promise<Response> {\n if (this.disposed) {\n throw new Error(\"HTTP transport disposed\");\n }\n\n const abortController = new AbortController();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await this.fetchImpl(input, {\n ...init,\n signal: abortController.signal,\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const parsed = parseJsonRpcMessage(line);\n const post = this.sendPost(line);\n if (\n (parsed.type === \"request\" && parsed.message.method === \"initialize\") ||\n (parsed.type === \"notification\" && parsed.message.method === \"notifications/initialized\")\n ) {\n await post;\n } else {\n void post.catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n }\n }\n\n private async sendPost(line: string): Promise<void> {\n const hasSessionId = this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n method: \"POST\",\n createHeaders: () => this.createPostHeaders(),\n body: line,\n });\n\n if (this.disposed) {\n await response.body?.cancel();\n return;\n }\n\n if (hasSessionId && response.status === 404) {\n this.sessionId = undefined;\n this.dispose(new Error(\"HTTP transport session expired (404 response)\"));\n return;\n }\n\n await this.throwForPostHttpError(response);\n if (this.disposed) {\n await response.body?.cancel();\n return;\n }\n this.captureSessionId(response);\n this.maybeOpenGetSseStream();\n void this.forwardResponseMessages(response).catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private async createPostHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createGetHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n }\n if (this.lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", this.lastEventId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createDeleteHeaders(sessionId: string): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n headers.set(\"MCP-Protocol-Version\", MCP_PROTOCOL_VERSION);\n return this.authorizeRequestHeaders(headers);\n }\n\n private async authorizeRequestHeaders(headers: Headers): Promise<Headers> {\n await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers,\n fetch: this.fetchImpl,\n });\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n if (this.sessionId !== undefined && this.sessionId !== sessionId) {\n throw new Error(\"HTTP transport response changed active session ID\");\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private async sendSessionTerminationRequest(sessionId: string): Promise<void> {\n const response = await this.fetchImpl(this.url, {\n method: \"DELETE\",\n headers: await this.createDeleteHeaders(sessionId),\n });\n\n if (response.status === 405 || response.ok) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport DELETE failed (${statusDescriptor})`\n : `HTTP transport DELETE failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: () => this.createGetHeaders(),\n });\n\n if (response.status === 405) {\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n if (response.status === 404) {\n this.sessionId = undefined;\n throw new Error(\"HTTP transport session expired (GET 404 response)\");\n }\n\n if (!response.ok) {\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport GET failed (${statusDescriptor})`\n : `HTTP transport GET failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n if (contentType.toLowerCase().includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n return;\n }\n\n return;\n }\n\n private async throwForPostHttpError(response: Response): Promise<void> {\n if (response.status < 400) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, {\n resourceMetadataUrl,\n });\n const result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url),\n response: response.clone(),\n challenge,\n discovery,\n fetch: this.fetchImpl,\n });\n\n if (result.action === \"retry\") {\n return true;\n }\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n return false;\n }\n\n private async forwardResponseMessages(response: Response): Promise<void> {\n if (response.status === 202) {\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n const normalizedContentType = contentType.toLowerCase();\n if (normalizedContentType.includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n return;\n }\n\n if (normalizedContentType.includes(\"application/json\")) {\n await this.forwardJsonResponseMessage(response);\n return;\n }\n\n throw new Error(\"HTTP transport POST returned an unsupported response content type\");\n }\n\n private async forwardSseResponseMessages(response: Response): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser();\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n this.openSseReaders.add(reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages);\n this.lastEventId = parser.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk));\n this.lastEventId = parser.lastEventId;\n }\n\n this.writeSseMessages(parser.flush());\n this.lastEventId = parser.lastEventId;\n } finally {\n this.openSseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(response: Response): Promise<void> {\n const payload = await response.text();\n if (payload.length === 0) {\n return;\n }\n\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[]): void {\n for (const message of messages) {\n this.writeReadableLine(message.data);\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n method: \"GET\" | \"POST\";\n createHeaders: () => Promise<Headers>;\n body?: BodyInit;\n }): Promise<Response> {\n const request = async (): Promise<Response> =>\n this.fetchWithAbort(this.url, {\n method: input.method,\n headers: await input.createHeaders(),\n body: input.body,\n });\n\n let response = await request();\n if (await this.maybeHandleUnauthorizedResponse(response)) {\n response = await request();\n }\n\n const oauthError = this.oauthProvider === undefined\n ? null\n : this.readOAuthChallengeError(response);\n if (oauthError !== null) {\n throw oauthError;\n }\n\n return response;\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n const decoder = new TextDecoder();\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer +=\n chunk instanceof Uint8Array\n ? decoder.decode(chunk, { stream: true })\n : decoder.decode() + String(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n buffer += decoder.decode();\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n}\n\nexport class SseParser {\n private buffer = \"\";\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n\n while (true) {\n const newlineIndex = this.buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = normalizeLine(this.buffer.slice(0, newlineIndex));\n this.buffer = this.buffer.slice(newlineIndex + 1);\n this.consumeLine(line, messages);\n }\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n const messages: ParsedSseMessage[] = [];\n\n if (this.buffer.length > 0) {\n this.consumeLine(normalizeLine(this.buffer), messages);\n this.buffer = \"\";\n }\n\n this.emitEvent(messages);\n return messages;\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || eventType !== \"message\") {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n }\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\ninterface ActiveIncomingRequest {\n cancelled: boolean;\n}\n\nexport interface JsonRpcRequestOptions {\n timeoutMs?: number;\n onRequestId?: (requestId: RequestId) => void;\n onTimeout?: (requestId: RequestId) => void;\n}\n\ninterface JsonRpcRequestContext {\n id: RequestId;\n method: string;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: JsonRpcRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>\n ) {\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\n }\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n options.onTimeout?.(id);\n reject(new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n cancelRequest(requestId: RequestId, reason: unknown): boolean {\n const pending = this.pendingRequests.get(requestId);\n if (pending === undefined) {\n return false;\n }\n\n this.pendingRequests.delete(requestId);\n clearTimeout(pending.timeout);\n pending.reject(reason);\n return true;\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(): Promise<Error> {\n const streamClosedError = new Error(\"JSON-RPC input stream closed\");\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n clearTimeout(pending.timeout);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n const activeRequest: ActiveIncomingRequest = {\n cancelled: false,\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.cancelled = true;\n this.activeIncomingRequests.delete(requestId);\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isInitializeResult(value: unknown): value is InitializeResult {\n if (!isObjectRecord(value) || typeof value.protocolVersion !== \"string\") {\n return false;\n }\n\n if (!isServerCapabilities(value.capabilities)) {\n return false;\n }\n\n if (\n !isObjectRecord(value.serverInfo)\n || typeof value.serverInfo.name !== \"string\"\n || value.serverInfo.name.length === 0\n || typeof value.serverInfo.version !== \"string\"\n || value.serverInfo.version.length === 0\n ) {\n return false;\n }\n\n return value.instructions === undefined || typeof value.instructions === \"string\";\n}\n\nfunction isServerCapabilities(value: unknown): value is ServerCapabilities {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n for (const capability of [\"prompts\", \"resources\", \"tools\", \"logging\", \"completions\", \"experimental\"] as const) {\n if (value[capability] !== undefined && !isObjectRecord(value[capability])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isCallToolResult(value: unknown): value is CallToolResult {\n if (!isObjectRecord(value) || !Array.isArray(value.content)) {\n return false;\n }\n\n if (value.structuredContent !== undefined && !isObjectRecord(value.structuredContent)) {\n return false;\n }\n\n if (value.isError !== undefined && typeof value.isError !== \"boolean\") {\n return false;\n }\n\n return value.content.every(isContentItem);\n}\n\nfunction isToolsListResult(value: unknown): value is { tools: Tool[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.tools)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourcesListResult(value: unknown): value is { resources: Resource[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resources)\n && value.resources.every(isResource)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isResourceTemplatesListResult(\n value: unknown\n): value is { resourceTemplates: ResourceTemplate[]; nextCursor?: string } {\n return isObjectRecord(value)\n && Array.isArray(value.resourceTemplates)\n && value.resourceTemplates.every(isResourceTemplate)\n && (value.nextCursor === undefined || typeof value.nextCursor === \"string\");\n}\n\nfunction isReadResourceResult(value: unknown): value is { contents: ResourceContents[] } {\n return isObjectRecord(value)\n && Array.isArray(value.contents)\n && value.contents.every(isResourceContents);\n}\n\nfunction isGetPromptResult(value: unknown): value is GetPromptResult {\n return isObjectRecord(value)\n && (value.description === undefined || typeof value.description === \"string\")\n && Array.isArray(value.messages)\n && value.messages.every(isPromptMessage);\n}\n\nfunction isCompleteResult(value: unknown): value is CompleteResult {\n return isObjectRecord(value)\n && isObjectRecord(value.completion)\n && Array.isArray(value.completion.values)\n && value.completion.values.every((candidate) => typeof candidate === \"string\")\n && (value.completion.hasMore === undefined || typeof value.completion.hasMore === \"boolean\")\n && (value.completion.total === undefined || typeof value.completion.total === \"number\");\n}\n\nfunction isResource(value: unknown): value is Resource {\n return isObjectRecord(value)\n && typeof value.uri === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\")\n && (value.size === undefined || typeof value.size === \"number\");\n}\n\nfunction isResourceTemplate(value: unknown): value is ResourceTemplate {\n return isObjectRecord(value)\n && typeof value.uriTemplate === \"string\"\n && typeof value.name === \"string\"\n && (value.description === undefined || typeof value.description === \"string\")\n && (value.mimeType === undefined || typeof value.mimeType === \"string\");\n}\n\nfunction isResourceContents(value: unknown): value is ResourceContents {\n if (!isObjectRecord(value) || typeof value.uri !== \"string\") {\n return false;\n }\n\n if (value.mimeType !== undefined && typeof value.mimeType !== \"string\") {\n return false;\n }\n\n const hasText = value.text !== undefined;\n const hasBlob = value.blob !== undefined;\n\n if (!hasText && !hasBlob) {\n return false;\n }\n\n return (!hasText || typeof value.text === \"string\")\n && (!hasBlob || typeof value.blob === \"string\");\n}\n\nfunction isPromptMessage(value: unknown): value is PromptMessage {\n return isObjectRecord(value)\n && (value.role === \"user\" || value.role === \"assistant\")\n && isContentItem(value.content);\n}\n\nfunction isContentItem(value: unknown): value is ContentItem {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\" || value.type === \"audio\") {\n return typeof value.data === \"string\" && typeof value.mimeType === \"string\";\n }\n\n if (value.type !== \"resource\" || !isObjectRecord(value.resource)) {\n return false;\n }\n\n return isResourceContents(value.resource);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (typeof value.code !== \"number\" || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { createSecretStore, type CreateSecretStoreInput, type SecretStore } from \"auth-store\";\nimport type { OAuthSessionStore, StoredOAuthSession } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\ninterface StoredOAuthClient {\n clientId: string;\n clientSecret?: string;\n}\n\nexport interface OAuthClientStore {\n load(issuer: string): Promise<StoredOAuthClient | null>;\n save(issuer: string, client: StoredOAuthClient): Promise<void>;\n clear(issuer: string): Promise<void>;\n}\n\nexport function createAuthStoreSessionStore(\n options: CreateSecretStoreInput = {}\n): OAuthSessionStore {\n return {\n async load(resource: string): Promise<StoredOAuthSession | null> {\n const store = createResourceSecretStore(resource, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n if (isStoredOAuthSession(parsed)) {\n return parsed;\n }\n\n throw new Error(\"Stored OAuth session must match the expected shape\");\n },\n async save(resource: string, session: StoredOAuthSession): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.set(JSON.stringify(session));\n },\n async clear(resource: string): Promise<void> {\n const store = createResourceSecretStore(resource, options);\n await store.delete();\n }\n };\n}\n\nexport function createAuthStoreClientStore(options: CreateSecretStoreInput): OAuthClientStore {\n return {\n async load(issuer: string): Promise<StoredOAuthClient | null> {\n const store = createIssuerSecretStore(issuer, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n\n const parsed = JSON.parse(value);\n const clientId = isObjectRecord(parsed) ? getOwnString(parsed, \"clientId\") : undefined;\n if (clientId !== undefined) {\n const client: Record<string, unknown> = { clientId };\n if (\n isObjectRecord(parsed) &&\n Object.prototype.hasOwnProperty.call(parsed, \"clientSecret\")\n ) {\n client.clientSecret = getOwnEntry(parsed, \"clientSecret\");\n }\n\n return client as unknown as StoredOAuthClient;\n }\n\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer: string, client: StoredOAuthClient): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer: string): Promise<void> {\n const store = createIssuerSecretStore(issuer, options);\n await store.delete();\n }\n };\n}\n\nfunction createNamedSecretStore(\n key: string,\n options: CreateSecretStoreInput,\n defaults: { salt: string; directory: string; service: string; accountPrefix: string }\n): SecretStore {\n const hash = crypto.createHash(\"sha256\").update(key).digest(\"hex\");\n const configuredFilePath = options.fileStore?.filePath;\n const parsedFilePath = configuredFilePath === undefined ? null : path.parse(configuredFilePath);\n\n const fileStore = {\n ...options.fileStore,\n filePath:\n parsedFilePath === null\n ? undefined\n : path.join(\n parsedFilePath.dir,\n `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n ),\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory: options.fileStore?.defaultDirectory || defaults.directory,\n defaultFileName:\n parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`\n };\n\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\n\nfunction createResourceSecretStore(resource: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(canonicalizeResourceIndicator(resource), options, {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\"\n });\n}\n\nfunction createIssuerSecretStore(issuer: string, options: CreateSecretStoreInput): SecretStore {\n return createNamedSecretStore(issuer, options, {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\"\n });\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction getOwnString(record: Record<string, unknown>, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isStoredOAuthSession(value: unknown): value is StoredOAuthSession {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resource\") &&\n isNonBlankOwnString(value, \"authorizationServer\") &&\n isStoredOAuthClient(getOwnEntry(value, \"client\")) &&\n isStoredOAuthDiscovery(getOwnEntry(value, \"discovery\")) &&\n isStoredOAuthTokensOrMissing(getOwnEntry(value, \"tokens\"))\n );\n}\n\nfunction isStoredOAuthClient(value: unknown): value is StoredOAuthClient {\n if (!isObjectRecord(value) || !isNonBlankOwnString(value, \"clientId\")) {\n return false;\n }\n\n const clientSecret = getOwnEntry(value, \"clientSecret\");\n return (\n clientSecret === undefined ||\n (typeof clientSecret === \"string\" && clientSecret.trim().length > 0)\n );\n}\n\nfunction isStoredOAuthDiscovery(value: unknown): value is StoredOAuthSession[\"discovery\"] {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n return (\n isNonBlankOwnString(value, \"resourceMetadataUrl\") &&\n isObjectRecord(getOwnEntry(value, \"resourceMetadata\")) &&\n isObjectRecord(getOwnEntry(value, \"authorizationServerMetadata\"))\n );\n}\n\nfunction isStoredOAuthTokensOrMissing(value: unknown): value is StoredOAuthSession[\"tokens\"] {\n if (value === undefined) {\n return true;\n }\n\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!isNonBlankOwnString(value, \"accessToken\") || getOwnString(value, \"tokenType\") !== \"Bearer\") {\n return false;\n }\n\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n if (\n expiresAt !== null &&\n (typeof expiresAt !== \"number\" ||\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime()))\n ) {\n return false;\n }\n\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n if (\n refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" || refreshToken.trim().length === 0)\n ) {\n return false;\n }\n\n const scope = getOwnEntry(value, \"scope\");\n return scope === undefined || (typeof scope === \"string\" && scope.trim().length > 0);\n}\n\nfunction isNonBlankOwnString(record: Record<string, unknown>, key: string): boolean {\n const value = getOwnString(record, key);\n return value !== undefined && value.trim().length > 0;\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, randomUUID, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { hasOwnErrorCode } from \"./error-codes.js\";\nimport type { SecretStore } from \"./types.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding; flag?: string; mode?: number }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n lstat(path: string): Promise<{ isSymbolicLink(): boolean }>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly symbolicLinkCheckStartPath: string | null;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n if (input.filePath === undefined) {\n const homeDirectory = (input.getHomeDirectory ?? homedir)();\n const defaultDirectory = input.defaultDirectory ?? \".auth-store\";\n const defaultFileName = input.defaultFileName ?? \"credentials.enc\";\n assertSafeDefaultDirectory(defaultDirectory);\n assertSafeDefaultFileName(defaultFileName);\n this.filePath = path.join(\n homeDirectory,\n defaultDirectory,\n defaultFileName\n );\n this.symbolicLinkCheckStartPath = resolveDefaultDirectoryCheckStart(\n homeDirectory,\n defaultDirectory\n );\n } else {\n this.filePath = input.filePath;\n this.symbolicLinkCheckStartPath = null;\n }\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async get(): Promise<string | null> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n return null;\n }\n }\n\n async set(value: string): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n const temporaryPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;\n let temporaryCreated = false;\n\n try {\n await this.assertCredentialPathHasNoSymbolicLinks(temporaryPath);\n await this.fs.writeFile(temporaryPath, JSON.stringify(document), {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: ENCRYPTION_FILE_MODE\n });\n temporaryCreated = true;\n await this.fs.chmod(temporaryPath, ENCRYPTION_FILE_MODE);\n await this.fs.rename(temporaryPath, this.filePath);\n } catch (error) {\n if (temporaryCreated || !isAlreadyExistsError(error)) {\n await removeIfPresent(this.fs, temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async delete(): Promise<void> {\n await this.assertCredentialPathHasNoSymbolicLinks(this.filePath);\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private async assertCredentialPathHasNoSymbolicLinks(targetPath: string): Promise<void> {\n const resolvedPath = path.resolve(targetPath);\n const protectedPaths = getProtectedCredentialPaths(\n resolvedPath,\n this.symbolicLinkCheckStartPath\n );\n\n for (const currentPath of protectedPaths) {\n try {\n const stats = await this.fs.lstat(currentPath);\n if (stats.isSymbolicLink()) {\n throw new Error(`Refusing to use encrypted credential path through symbolic link: ${currentPath}`);\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n const retryableKeyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt).catch((error) => {\n if (this.keyPromise === retryableKeyPromise) {\n this.keyPromise = null;\n }\n throw error;\n });\n this.keyPromise = retryableKeyPromise;\n }\n return this.keyPromise;\n }\n}\n\nfunction resolveDefaultDirectoryCheckStart(\n homeDirectory: string,\n defaultDirectory: string\n): string {\n const [firstSegment] = defaultDirectory.split(/[\\\\/]+/).filter(Boolean);\n return path.resolve(homeDirectory, firstSegment ?? \".\");\n}\n\nfunction getProtectedCredentialPaths(\n resolvedPath: string,\n symbolicLinkCheckStartPath: string | null\n): string[] {\n if (symbolicLinkCheckStartPath === null) {\n return getExplicitProtectedCredentialPaths(resolvedPath);\n }\n\n const resolvedStartPath = path.resolve(symbolicLinkCheckStartPath);\n if (!isPathInsideOrEqual(resolvedPath, resolvedStartPath)) {\n return [path.dirname(resolvedPath), resolvedPath];\n }\n\n const protectedPaths = [resolvedStartPath];\n let currentPath = resolvedStartPath;\n for (const segment of path.relative(resolvedStartPath, resolvedPath).split(path.sep).filter(Boolean)) {\n currentPath = path.join(currentPath, segment);\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction assertSafeDefaultDirectory(defaultDirectory: string): void {\n if (path.isAbsolute(defaultDirectory) || path.win32.isAbsolute(defaultDirectory)) {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n\n for (const segment of splitPathSegments(defaultDirectory)) {\n if (segment === \"..\") {\n throw new Error(\"defaultDirectory must be a relative path inside the home directory\");\n }\n }\n}\n\nfunction assertSafeDefaultFileName(defaultFileName: string): void {\n if (\n defaultFileName.trim().length === 0 ||\n defaultFileName === \".\" ||\n defaultFileName === \"..\" ||\n splitPathSegments(defaultFileName).length !== 1\n ) {\n throw new Error(\"defaultFileName must be a file name without path separators\");\n }\n}\n\nfunction splitPathSegments(value: string): string[] {\n return value\n .split(\"/\")\n .flatMap((segment) => segment.split(\"\\\\\"))\n .filter((segment) => segment.length > 0);\n}\n\nfunction getExplicitProtectedCredentialPaths(resolvedPath: string): string[] {\n const parsed = path.parse(resolvedPath);\n const segments = resolvedPath\n .slice(parsed.root.length)\n .split(path.sep)\n .filter((segment) => segment.length > 0);\n if (segments.length <= 1) {\n return [resolvedPath];\n }\n\n const protectedPaths: string[] = [];\n let currentPath = parsed.root;\n for (const [index, segment] of segments.entries()) {\n currentPath = path.join(currentPath, segment);\n if (index === 0) {\n continue;\n }\n protectedPaths.push(currentPath);\n }\n return protectedPaths;\n}\n\nfunction isPathInsideOrEqual(childPath: string, parentPath: string): boolean {\n const relativePath = path.relative(parentPath, childPath);\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nasync function removeIfPresent(fileSystem: EncryptedFileStoreFileSystem, filePath: string): Promise<void> {\n try {\n await fileSystem.unlink(filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = JSON.stringify([machineIdentity.hostname, machineIdentity.username, salt]);\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise.catch((error) => {\n if (derivedKeyCache.get(cacheKey) === keyPromise) {\n derivedKeyCache.delete(cacheKey);\n }\n throw error;\n });\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n const version = getOwnEntry(parsed, \"version\");\n const iv = getOwnEntry(parsed, \"iv\");\n const authTag = getOwnEntry(parsed, \"authTag\");\n const ciphertext = getOwnEntry(parsed, \"ciphertext\");\n if (version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof iv !== \"string\" ||\n typeof authTag !== \"string\" ||\n typeof ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version,\n iv,\n authTag,\n ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"ENOENT\");\n}\n\nfunction isAlreadyExistsError(error: unknown): error is NodeJS.ErrnoException {\n return hasOwnErrorCode(error, \"EEXIST\");\n}\n", "export function hasOwnErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n Object.prototype.hasOwnProperty.call(error, \"code\") &&\n (error as { code?: unknown }).code === code\n );\n}\n", "import { spawn } from \"node:child_process\";\nimport type { SecretStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface KeychainCommandOptions {\n stdin?: string;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service.trim();\n this.account = input.account.trim();\n if (this.service.length === 0) {\n throw new Error(\"Keychain service must not be empty\");\n }\n if (this.account.length === 0) {\n throw new Error(\"Keychain account must not be empty\");\n }\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0) {\n return stripTrailingLineBreak(getCommandOutput(result, \"stdout\"));\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async set(value: string): Promise<void> {\n if (value.includes(\"\\n\") || value.includes(\"\\r\")) {\n throw new Error(\"Keychain secrets cannot contain line breaks\");\n }\n\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-U\",\n \"-w\",\n value\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (getCommandExitCode(result) !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (getCommandExitCode(result) === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string,\n options?: KeychainCommandOptions\n ): Promise<KeychainCommandResult> {\n try {\n if (options === undefined) {\n return await this.runCommand(SECURITY_CLI, args);\n }\n return await this.runCommand(SECURITY_CLI, args, options);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[],\n options?: KeychainCommandOptions\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [options?.stdin === undefined ? \"ignore\" : \"pipe\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let stdinErrorMessage: string | undefined;\n const appendStderr = (message: string): void => {\n stderr = stderr.length === 0\n ? message\n : `${stderr}${stderr.endsWith(\"\\n\") ? \"\" : \"\\n\"}${message}`;\n };\n const appendStdinError = (): void => {\n if (stdinErrorMessage === undefined) {\n return;\n }\n\n appendStderr(stdinErrorMessage);\n stdinErrorMessage = undefined;\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 if (options?.stdin !== undefined) {\n child.stdin?.once(\"error\", (error) => {\n stdinErrorMessage = error instanceof Error ? error.message : String(error);\n });\n child.stdin?.end(options.stdin);\n }\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n appendStdinError();\n appendStderr(message);\n resolve({\n stdout,\n stderr,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n appendStdinError();\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n return getCommandExitCode(result) === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE;\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const exitCode = getCommandExitCode(result);\n const details =\n getCommandOutput(result, \"stderr\").trim()\n || getCommandOutput(result, \"stdout\").trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${exitCode}`);\n}\n\nfunction getCommandExitCode(result: KeychainCommandResult): number {\n const value = getOwnEntry(result, \"exitCode\");\n return typeof value === \"number\" && Number.isInteger(value) ? value : 1;\n}\n\nfunction getCommandOutput(\n result: KeychainCommandResult,\n key: \"stdout\" | \"stderr\"\n): string {\n const value = getOwnEntry(result, key);\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\nfunction resolveBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? getOwnEnvValue(input.env, envVar) ?? getOwnEnvValue(process.env, envVar);\n const backend = configuredBackend?.trim();\n\n if (backend === \"keychain\") {\n return \"keychain\";\n }\n\n if (backend === undefined || backend === \"file\") {\n return \"file\";\n }\n\n throw new Error(`Unsupported auth store backend: ${backend}`);\n}\n\nfunction getOwnEnvValue(\n env: NodeJS.ProcessEnv | undefined,\n key: string\n): string | undefined {\n return env !== undefined && Object.prototype.hasOwnProperty.call(env, key)\n ? env[key]\n : undefined;\n}\n", "export function canonicalizeResourceIndicator(value: string | URL): string {\n let url: URL;\n try {\n url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n } catch {\n throw new Error(\"Resource indicator must be an absolute URL\");\n }\n url.hash = \"\";\n return url.toString();\n}\n", "import { URL } from \"node:url\";\nimport type {\n DefaultOAuthClientProviderOptions,\n OAuthAuthorizationServerMetadata,\n OAuthClientMetadata,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n StoredOAuthSession,\n StoredOAuthTokens\n} from \"./types.js\";\nimport {\n createAuthStoreClientStore,\n createAuthStoreSessionStore\n} from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport {\n exchangeAuthorizationCode,\n OAuthError,\n refreshAccessToken,\n isRetryableOAuthError,\n readOAuthJsonObjectResponse\n} from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\nexport function createOAuthClientProvider(\n options: OAuthClientProviderOptions\n): OAuthClientProvider {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n\n return createDefaultOAuthClientProvider(options);\n}\n\nexport function createDefaultOAuthClientProvider(\n options: DefaultOAuthClientProviderOptions\n): OAuthClientProvider {\n const sessionStore = options.sessionStore ?? createAuthStoreSessionStore(options.authStore);\n const clientStore =\n options.authStore === undefined ? null : createAuthStoreClientStore(options.authStore);\n const now = options.now ?? Date.now;\n const registeredClients = new Map<string, StoredOAuthSession[\"client\"] | null>();\n const refreshPromises = new Map<string, Promise<StoredOAuthSession | null>>();\n const authorizationPromises = new Map<string, Promise<StoredOAuthSession>>();\n\n return {\n async authorizeRequest(input): Promise<void> {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false);\n const accessToken = session?.tokens?.accessToken;\n if (\n session === null ||\n accessToken === undefined ||\n session.tokens === undefined ||\n isExpired(session.tokens, now)\n ) {\n return;\n }\n\n assertRequestMatchesResource(requestUrl, session.resource);\n\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n },\n\n async handleUnauthorized(input) {\n try {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const forceRefresh =\n hasCachedAccessToken(await loadSession(resource)) &&\n input.challenge?.params.error === \"invalid_token\";\n const session = await ensureAuthorizedSession(\n resource,\n {\n ...input.discovery,\n resource\n },\n input.fetch,\n true,\n forceRefresh\n );\n\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" } as const;\n }\n\n return { action: \"retry\" } as const;\n } catch (error) {\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error))\n } as const;\n }\n }\n };\n\n async function ensureAuthorizedSession(\n resource: string,\n discovery: OAuthDiscoveryResult | undefined,\n fetch: OAuthMetadataFetch,\n allowInteractive: boolean,\n forceRefresh = false\n ): Promise<StoredOAuthSession | null> {\n const canonicalResource = canonicalizeResourceIndicator(resource);\n let session = await loadSession(canonicalResource);\n const sessionDiscovery = resolveDiscovery(discovery, session);\n\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n\n if (\n session?.tokens?.refreshToken !== undefined &&\n sessionDiscovery !== undefined &&\n (forceRefresh || isExpired(session.tokens, now))\n ) {\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n\n if (forceRefresh && session?.tokens !== undefined) {\n session = clearSessionTokens(session);\n await saveSession(canonicalResource, session);\n }\n\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch);\n }\n\n async function refreshSession(\n resource: string,\n session: StoredOAuthSession,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession | null> {\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n\n const inFlight = refreshPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n try {\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n\n let refreshAttempted = false;\n let refreshedTokens: StoredOAuthTokens;\n\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch,\n now\n });\n break;\n } catch (error) {\n if (error instanceof OAuthError && error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n\n if (\n shouldReRegisterStoredDynamicClient(\n error,\n await loadRegisteredClient(discovery.authorizationServer),\n false\n )\n ) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n\n throw error;\n }\n }\n\n const updatedSession: StoredOAuthSession = {\n ...session,\n tokens: {\n ...refreshedTokens,\n refreshToken: refreshedTokens.refreshToken ?? session.tokens.refreshToken\n },\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, updatedSession);\n return updatedSession;\n } finally {\n refreshPromises.delete(resource);\n }\n })();\n\n refreshPromises.set(resource, promise);\n return promise;\n }\n\n async function authorizeSession(\n resource: string,\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n fetch: OAuthMetadataFetch\n ): Promise<StoredOAuthSession> {\n const inFlight = authorizationPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n\n const promise = (async () => {\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n openBrowser: options.browser.openBrowser,\n readLine: options.browser.readLine,\n createServer: options.browser.createServer,\n landingPage: options.browser.landingPage\n });\n let resolvedClient: ResolvedOAuthClient | null = null;\n\n try {\n resolvedClient = await resolveClient(\n currentSession,\n discovery,\n loopback.redirectUri,\n fetch\n );\n const sessionWithoutTokens: StoredOAuthSession = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n discovery: toStoredDiscovery(discovery)\n };\n await saveSession(resource, sessionWithoutTokens);\n\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata: getClientMetadata(options.client)\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: requireOwnString(\n discovery.authorizationServerMetadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n ),\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch,\n now\n });\n\n const session: StoredOAuthSession = {\n ...sessionWithoutTokens,\n tokens\n };\n\n await saveSession(resource, session);\n return session;\n } catch (error) {\n if (shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n\n throw error;\n } finally {\n loopback.close();\n }\n }\n })();\n\n const finalPromise = promise.finally(() => {\n authorizationPromises.delete(resource);\n });\n authorizationPromises.set(resource, finalPromise);\n return finalPromise;\n }\n\n async function resolveClient(\n existingSession: StoredOAuthSession | null,\n discovery: OAuthDiscoveryResult,\n redirectUri: string,\n fetch: OAuthMetadataFetch\n ): Promise<ResolvedOAuthClient> {\n const configuredClient = normalizeConfiguredClient(options.client);\n\n if (options.client.mode === \"static\") {\n if (configuredClient === null) {\n throw new Error(\"OAuth client_id must not be blank\");\n }\n\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const registrationEndpoint = getOwnString(\n discovery.authorizationServerMetadata,\n \"registration_endpoint\"\n );\n if (registrationEndpoint === undefined && configuredClient !== null) {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: configuredClient\n };\n }\n\n const storedClient = await loadRegisteredClient(discovery.authorizationServer);\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient\n };\n }\n\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n const isConfiguredStaticFallback =\n configuredClient !== null &&\n existingSession.client.clientId === configuredClient.clientId &&\n existingSession.client.clientSecret === configuredClient.clientSecret;\n\n if (!isConfiguredStaticFallback) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client\n };\n }\n }\n\n const registrationBody = buildClientRegistrationBody(\n getClientMetadata(options.client),\n redirectUri\n );\n const response = await fetch(registrationEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(registrationBody)\n });\n const payload = await readOAuthJsonObjectResponse(response);\n const clientId = getOwnString(payload, \"client_id\");\n\n if (clientId === undefined || clientId.trim().length === 0) {\n throw new Error(\"OAuth client registration response missing client_id\");\n }\n\n const clientSecret = getOwnString(payload, \"client_secret\");\n const registeredClient = {\n clientId: clientId.trim(),\n clientSecret:\n clientSecret !== undefined && clientSecret.trim().length > 0\n ? clientSecret.trim()\n : undefined\n };\n await saveRegisteredClient(discovery.authorizationServer, registeredClient);\n\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: registeredClient\n };\n }\n\n async function loadSession(resource: string): Promise<StoredOAuthSession | null> {\n return normalizeLoadedSession(await sessionStore.load(resource));\n }\n\n async function saveSession(resource: string, session: StoredOAuthSession): Promise<void> {\n await sessionStore.save(resource, session);\n }\n\n async function clearSession(resource: string): Promise<void> {\n await sessionStore.clear(resource);\n }\n\n async function loadRegisteredClient(\n issuer: string\n ): Promise<StoredOAuthSession[\"client\"] | null> {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n\n if (clientStore === null) {\n return null;\n }\n\n const client = await clientStore.load(issuer);\n const normalizedClient = client === null ? null : normalizeStoredClient(client);\n if (client !== null && normalizedClient === null) {\n await clientStore.clear(issuer);\n return null;\n }\n\n registeredClients.set(issuer, normalizedClient);\n return normalizedClient;\n }\n\n async function saveRegisteredClient(\n issuer: string,\n client: StoredOAuthSession[\"client\"]\n ): Promise<void> {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n\n async function clearRegisteredClient(issuer: string): Promise<void> {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\n\nfunction isProviderOptions(\n options: OAuthClientProviderOptions\n): options is { provider: OAuthClientProvider } {\n return Object.prototype.hasOwnProperty.call(options, \"provider\");\n}\n\nfunction isExpired(tokens: StoredOAuthTokens, now: () => number): boolean {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\n\nfunction resolveDiscovery(\n discovery: OAuthDiscoveryResult | undefined,\n session: StoredOAuthSession | null\n): OAuthDiscoveryResult | undefined {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource)\n };\n }\n\n if (session === null) {\n return undefined;\n }\n\n const metadata = session.discovery.authorizationServerMetadata;\n const issuer = getOwnString(metadata, \"issuer\");\n const authorizationEndpoint = getOwnString(metadata, \"authorization_endpoint\");\n const tokenEndpoint = getOwnString(metadata, \"token_endpoint\");\n const codeChallengeMethodsSupported = getOwnStringArray(\n metadata,\n \"code_challenge_methods_supported\"\n );\n if (\n issuer === undefined ||\n authorizationEndpoint === undefined ||\n tokenEndpoint === undefined ||\n codeChallengeMethodsSupported === undefined ||\n !codeChallengeMethodsSupported.includes(\"S256\")\n ) {\n return undefined;\n }\n\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery\n .resourceMetadata as OAuthDiscoveryResult[\"resourceMetadata\"],\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata as OAuthAuthorizationServerMetadata\n };\n}\n\nfunction clearSessionTokens(session: StoredOAuthSession): StoredOAuthSession {\n const nextSession = { ...session };\n delete nextSession.tokens;\n return nextSession;\n}\n\nfunction hasCachedAccessToken(\n session: StoredOAuthSession | null\n): session is StoredOAuthSession & { tokens: StoredOAuthTokens } {\n return session?.tokens?.accessToken !== undefined;\n}\n\nfunction normalizeLoadedSession(session: StoredOAuthSession | null): StoredOAuthSession | null {\n if (session === null) {\n return null;\n }\n\n const client = normalizeStoredClient(getOwnEntry(session, \"client\"));\n if (client === null) {\n return { ...session, client: { clientId: \"\" }, tokens: undefined };\n }\n\n return {\n ...session,\n client,\n tokens: normalizeStoredTokens(getOwnEntry(session, \"tokens\"))\n };\n}\n\nfunction normalizeStoredClient(value: unknown): StoredOAuthSession[\"client\"] | null {\n if (!isObjectRecord(value)) {\n return null;\n }\n\n const clientId = getOwnString(value, \"clientId\");\n if (clientId === undefined || clientId.trim().length === 0) {\n return null;\n }\n const normalizedClientId = clientId.trim();\n\n const clientSecret = getOwnEntry(value, \"clientSecret\");\n if (clientSecret === undefined) {\n return { clientId: normalizedClientId };\n }\n\n if (typeof clientSecret !== \"string\" || clientSecret.trim().length === 0) {\n return null;\n }\n const normalizedClientSecret = clientSecret.trim();\n\n return { clientId: normalizedClientId, clientSecret: normalizedClientSecret };\n}\n\nfunction normalizeStoredTokens(value: unknown): StoredOAuthTokens | undefined {\n if (value === undefined || !isObjectRecord(value)) {\n return undefined;\n }\n\n const accessToken = getOwnString(value, \"accessToken\");\n const tokenType = getOwnString(value, \"tokenType\");\n const expiresAt = getOwnEntry(value, \"expiresAt\");\n const refreshToken = getOwnEntry(value, \"refreshToken\");\n const scope = getOwnString(value, \"scope\");\n const normalizedAccessToken = accessToken?.trim();\n const normalizedRefreshToken = typeof refreshToken === \"string\" ? refreshToken.trim() : undefined;\n const normalizedScope = scope?.trim();\n\n if (\n accessToken === undefined ||\n normalizedAccessToken === undefined ||\n normalizedAccessToken.length === 0 ||\n tokenType !== \"Bearer\" ||\n !(\n expiresAt === null ||\n (typeof expiresAt === \"number\" &&\n Number.isSafeInteger(expiresAt) &&\n expiresAt <= MAX_JS_DATE_MS &&\n Number.isFinite(new Date(expiresAt).getTime()))\n ) ||\n (refreshToken !== undefined &&\n (typeof refreshToken !== \"string\" ||\n normalizedRefreshToken === undefined ||\n normalizedRefreshToken.length === 0))\n ) {\n return undefined;\n }\n\n return {\n accessToken: normalizedAccessToken,\n tokenType,\n expiresAt,\n ...(normalizedRefreshToken === undefined ? {} : { refreshToken: normalizedRefreshToken }),\n ...(normalizedScope === undefined || normalizedScope.length === 0\n ? {}\n : { scope: normalizedScope })\n };\n}\n\nfunction getClientMetadata(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): OAuthClientMetadata | undefined {\n if (client.metadata === undefined) {\n return undefined;\n }\n\n return {\n clientName: normalizeOptionalOAuthString(client.metadata.clientName),\n scope: normalizeOptionalOAuthString(client.metadata.scope),\n softwareId: normalizeOptionalOAuthString(client.metadata.softwareId),\n softwareVersion: normalizeOptionalOAuthString(client.metadata.softwareVersion)\n };\n}\n\nfunction normalizeConfiguredClient(\n client: DefaultOAuthClientProviderOptions[\"client\"]\n): StoredOAuthSession[\"client\"] | null {\n const clientId = normalizeOptionalOAuthString(client.clientId);\n if (clientId === undefined) {\n return null;\n }\n\n const clientSecret = normalizeOptionalOAuthString(client.clientSecret);\n return clientSecret === undefined ? { clientId } : { clientId, clientSecret };\n}\n\nfunction normalizeOptionalOAuthString(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction requireOwnString(record: object, key: string, label: string): string {\n const value = getOwnString(record, key);\n if (value === undefined) {\n throw new Error(`${label} is missing ${key}`);\n }\n\n return value;\n}\n\nfunction getOwnStringArray(record: object, key: string): string[] | undefined {\n const value = getOwnEntry(record, key);\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\")\n ? value\n : undefined;\n}\n\nfunction buildAuthorizationUrl(input: {\n metadata: OAuthAuthorizationServerMetadata;\n resource: string;\n clientId: string;\n redirectUri: string;\n codeChallenge: string;\n clientMetadata: OAuthClientMetadata | undefined;\n}): string {\n const authorizationEndpoint = requireOwnString(\n input.metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const issuer = requireOwnString(input.metadata, \"issuer\", \"Authorization server metadata\");\n const url = new URL(authorizationEndpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer,\n requireIssuer:\n getOwnEntry(input.metadata, \"authorization_response_iss_parameter_supported\") === true\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n\n return url.toString();\n}\n\nfunction assertS256PkceSupport(metadata: OAuthAuthorizationServerMetadata): void {\n if (!getOwnStringArray(metadata, \"code_challenge_methods_supported\")?.includes(\"S256\")) {\n throw new Error(\n \"Authorization server metadata must advertise code_challenge_methods_supported including S256\"\n );\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n return (\n normalizedHostname === \"localhost\" ||\n normalizedHostname === \"::1\" ||\n normalizedHostname.startsWith(\"127.\")\n );\n}\n\nfunction assertSecureUrl(value: string, label: string): void {\n const url = new URL(value);\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction assertSecureOAuthFlowEndpoints(metadata: OAuthAuthorizationServerMetadata): void {\n const authorizationEndpoint = requireOwnString(\n metadata,\n \"authorization_endpoint\",\n \"Authorization server metadata\"\n );\n const tokenEndpoint = requireOwnString(\n metadata,\n \"token_endpoint\",\n \"Authorization server metadata\"\n );\n const registrationEndpoint = getOwnString(metadata, \"registration_endpoint\");\n\n assertNoAccessTokenInUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(tokenEndpoint, \"Token endpoint\");\n assertSecureUrl(authorizationEndpoint, \"Authorization endpoint\");\n assertSecureUrl(tokenEndpoint, \"Token endpoint\");\n\n if (registrationEndpoint !== undefined) {\n assertNoAccessTokenInUrl(registrationEndpoint, \"Registration endpoint\");\n assertSecureUrl(registrationEndpoint, \"Registration endpoint\");\n }\n}\n\nfunction assertNoAccessTokenInUrl(value: string | URL, label: string): void {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\n\nfunction assertRequestMatchesResource(requestUrl: string, resource: string): void {\n if (requestUrl !== resource) {\n throw new Error(\n `OAuth request URL ${requestUrl} does not match discovered resource ${resource}`\n );\n }\n}\n\nfunction buildClientRegistrationBody(\n metadata: OAuthClientMetadata | undefined,\n redirectUri: string\n): Record<string, unknown> {\n const body: Record<string, unknown> = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\"\n };\n const clientName = metadata === undefined ? undefined : getOwnString(metadata, \"clientName\");\n const scope = metadata === undefined ? undefined : getOwnString(metadata, \"scope\");\n const softwareId = metadata === undefined ? undefined : getOwnString(metadata, \"softwareId\");\n const softwareVersion =\n metadata === undefined ? undefined : getOwnString(metadata, \"softwareVersion\");\n\n if (clientName !== undefined && clientName.length > 0) {\n body.client_name = clientName;\n }\n\n if (scope !== undefined && scope.length > 0) {\n body.scope = scope;\n }\n\n if (softwareId !== undefined && softwareId.length > 0) {\n body.software_id = softwareId;\n }\n\n if (softwareVersion !== undefined && softwareVersion.length > 0) {\n body.software_version = softwareVersion;\n }\n\n return body;\n}\n\nfunction toStoredDiscovery(discovery: OAuthDiscoveryResult): StoredOAuthSession[\"discovery\"] {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata\n };\n}\n\ninterface ResolvedOAuthClient {\n kind: \"dynamic\" | \"static\";\n fromStoredRegistration: boolean;\n client: StoredOAuthSession[\"client\"];\n}\n\nfunction shouldReRegisterStoredDynamicClient(\n error: unknown,\n client: ResolvedOAuthClient | StoredOAuthSession[\"client\"] | null,\n alreadyAttempted: boolean\n): boolean {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n\n if (client === null) {\n return false;\n }\n\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n\n return true;\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\n\nexport interface OAuthLandingPage {\n title: string;\n body: string;\n}\n\nexport interface LoopbackAuthorizationOptions {\n openBrowser?: (url: string) => Promise<void>;\n readLine?: () => Promise<string>;\n createServer?: () => http.Server;\n landingPage?: OAuthLandingPage;\n callbackPath?: string;\n}\n\nexport interface LoopbackAuthorizationSession {\n redirectUri: string;\n waitForCode(authorizationUrl: string): Promise<string>;\n close(): void;\n}\n\nexport async function createLoopbackAuthorizationSession(\n options: LoopbackAuthorizationOptions = {}\n): Promise<LoopbackAuthorizationSession> {\n const callbackPath = options.callbackPath ?? \"/callback\";\n const server = options.createServer ? options.createServer() : http.createServer();\n const port = await startServer(server);\n const redirectUri = `http://127.0.0.1:${port}${callbackPath}`;\n\n return {\n redirectUri,\n async waitForCode(authorizationUrl: string): Promise<string> {\n return waitForAuthorizationCode(server, authorizationUrl, options, callbackPath);\n },\n close(): void {\n server.closeAllConnections?.();\n server.close();\n }\n };\n}\n\nasync function startServer(server: http.Server): Promise<number> {\n return new Promise<number>((resolve, reject) => {\n const handleError = (error: Error) => {\n server.off(\"error\", handleError);\n reject(error);\n };\n\n server.once(\"error\", handleError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", handleError);\n const address = server.address() as { port: number };\n resolve(address.port);\n });\n });\n}\n\nfunction waitForAuthorizationCode(\n server: http.Server,\n authorizationUrl: string,\n options: LoopbackAuthorizationOptions,\n callbackPath: string\n): Promise<string> {\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n\n return new Promise<string>((resolve, reject) => {\n let settled = false;\n const settle = (fn: () => void) => {\n if (!settled) {\n settled = true;\n fn();\n }\n };\n\n server.on(\"request\", (req: http.IncomingMessage, res: http.ServerResponse) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname !== callbackPath) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const callbackParameters = {\n code: url.searchParams.get(\"code\"),\n error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\")\n };\n\n try {\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n return;\n }\n\n const authorizationError = callbackParameters.error;\n if (authorizationError !== null) {\n const description = callbackParameters.errorDescription ?? authorizationError;\n res.writeHead(400);\n res.end(`Authorization failed: ${description}`);\n settle(() => reject(createAuthorizationError(authorizationError, description)));\n return;\n }\n\n try {\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n } catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n });\n\n if (options.readLine !== undefined) {\n options\n .readLine()\n .then((input) => {\n const callbackParameters = extractCallbackParametersFromInput(input);\n if (callbackParameters === null) {\n settle(() => reject(new Error(\"OAuth callback missing authorization code\")));\n return;\n }\n\n try {\n validateAuthorizationCallbackBinding(callbackParameters, expectedAuthorization);\n if (callbackParameters.error !== null) {\n const description = callbackParameters.errorDescription ?? callbackParameters.error;\n throw createAuthorizationError(callbackParameters.error, description);\n }\n\n const code = validateAuthorizationCallbackParameters(\n callbackParameters,\n expectedAuthorization\n );\n settle(() => resolve(code));\n } catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n })\n .catch((error) => {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n });\n }\n\n if (options.openBrowser !== undefined) {\n options.openBrowser(authorizationUrl).catch((error) => {\n settle(() => reject(error));\n });\n }\n });\n}\n\nexport function extractCodeFromInput(input: string): string | null {\n return extractCallbackParametersFromInput(input)?.code ?? null;\n}\n\nfunction extractCallbackParametersFromInput(input: string): AuthorizationCallbackParameters | null {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get(\"code\"),\n error: url.searchParams.get(\"error\"),\n errorDescription: url.searchParams.get(\"error_description\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\")\n };\n } catch {\n return {\n code: trimmed,\n error: null,\n errorDescription: null,\n state: null,\n iss: null\n };\n }\n}\n\ninterface AuthorizationCallbackParameters {\n code: string | null;\n error: string | null;\n errorDescription: string | null;\n state: string | null;\n iss: string | null;\n}\n\nfunction readExpectedAuthorizationCallback(authorizationUrl: string): {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n} {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false\n };\n}\n\nfunction validateAuthorizationCallbackParameters(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): string {\n validateAuthorizationCallbackBinding(callback, expected);\n\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n\n return callback.code;\n}\n\nfunction validateAuthorizationCallbackBinding(\n callback: AuthorizationCallbackParameters,\n expected: {\n state: string | null;\n issuer: string | null;\n requireIssuer: boolean;\n }\n): void {\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n\n if (\n callback.iss !== null &&\n callback.iss.length > 0 &&\n expected.issuer !== null &&\n callback.iss !== expected.issuer\n ) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n}\n\nfunction createAuthorizationError(error: string, description: string): Error {\n return new Error(`OAuth authorization failed: ${error} \u2014 ${description}`);\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n}\n\nexport function buildSuccessPage(landingPage?: OAuthLandingPage): string {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n '<body style=\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\">',\n '<div style=\"text-align:center\">',\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\"\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\n\ninterface AuthorizationStatePayload {\n v: 1;\n n: string;\n i: string;\n r: boolean;\n}\n\nexport function createAuthorizationState(input: {\n issuer: string;\n requireIssuer: boolean;\n}): string {\n const payload: AuthorizationStatePayload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\n\nexport function parseAuthorizationState(\n value: string | null\n): { issuer: string; requireIssuer: boolean } | null {\n if (value === null || value.length === 0) {\n return null;\n }\n\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded) as unknown;\n if (!isObjectRecord(parsed)) {\n return null;\n }\n\n const version = getOwnEntry(parsed, \"v\");\n const nonce = getOwnEntry(parsed, \"n\");\n const issuer = getOwnEntry(parsed, \"i\");\n const requireIssuer = getOwnEntry(parsed, \"r\");\n if (\n version !== 1\n || typeof nonce !== \"string\"\n || nonce.length === 0\n || typeof issuer !== \"string\"\n || issuer.length === 0\n || typeof requireIssuer !== \"boolean\"\n ) {\n return null;\n }\n\n return {\n issuer,\n requireIssuer,\n };\n } catch {\n return null;\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n", "import crypto from \"node:crypto\";\n\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "import type { OAuthMetadataFetch, StoredOAuthTokens } from \"./types.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst MAX_JS_DATE_MS = 8_640_000_000_000_000;\n\ninterface OAuthErrorShape {\n error: string;\n error_description?: string;\n error_uri?: string;\n}\n\nexport class OAuthError extends Error {\n readonly error: string;\n readonly errorDescription: string | undefined;\n readonly errorUri: string | undefined;\n readonly error_description: string | undefined;\n readonly error_uri: string | undefined;\n readonly status: number;\n readonly retryable: boolean;\n readonly terminal: boolean;\n\n constructor(shape: OAuthErrorShape, status: number) {\n super(shape.error_description ?? shape.error);\n this.name = \"OAuthError\";\n this.error = shape.error;\n this.errorDescription = shape.error_description;\n this.errorUri = shape.error_uri;\n this.error_description = shape.error_description;\n this.error_uri = shape.error_uri;\n this.status = status;\n this.retryable = isRetryableOAuthError(this);\n this.terminal = !this.retryable;\n }\n}\n\nexport function isRetryableOAuthError(error: unknown): error is OAuthError {\n return (\n error instanceof OAuthError &&\n (error.status >= 500 ||\n error.error === \"server_error\" ||\n error.error === \"temporarily_unavailable\")\n );\n}\n\nexport async function exchangeAuthorizationCode(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n code: string;\n codeVerifier: string;\n redirectUri: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"authorization_code\",\n code: input.code,\n code_verifier: input.codeVerifier,\n redirect_uri: input.redirectUri,\n resource\n },\n fetch: input.fetch,\n now: input.now\n });\n}\n\nexport async function refreshAccessToken(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n refreshToken: string;\n resource: string;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const resource = canonicalizeResourceIndicator(input.resource);\n\n return requestTokens({\n tokenEndpoint: input.tokenEndpoint,\n clientId: input.clientId,\n clientSecret: input.clientSecret,\n params: {\n grant_type: \"refresh_token\",\n refresh_token: input.refreshToken,\n resource\n },\n fetch: input.fetch,\n now: input.now\n });\n}\n\nasync function requestTokens(input: {\n tokenEndpoint: string;\n clientId: string;\n clientSecret?: string;\n params: Record<string, string>;\n fetch: OAuthMetadataFetch;\n now: () => number;\n}): Promise<StoredOAuthTokens> {\n const body = new URLSearchParams({\n client_id: input.clientId,\n ...input.params\n });\n\n if (input.clientSecret !== undefined) {\n body.set(\"client_secret\", input.clientSecret);\n }\n\n const response = await input.fetch(input.tokenEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n },\n body: body.toString()\n });\n const payload = await readOAuthJsonObjectResponse(response);\n const accessToken = getOwnEntry(payload, \"access_token\");\n\n if (typeof accessToken !== \"string\" || accessToken.trim().length === 0) {\n throw new Error(\"OAuth token response missing access_token\");\n }\n const normalizedAccessToken = accessToken.trim();\n\n const tokenType = normalizeBearerTokenType(getOwnEntry(payload, \"token_type\"));\n if (tokenType === null) {\n throw new Error(\"OAuth token response missing token_type=Bearer\");\n }\n\n const expiresIn = getOwnEntry(payload, \"expires_in\");\n let expiresAt: number | null = null;\n if (expiresIn !== undefined) {\n if (\n typeof expiresIn !== \"number\" ||\n !Number.isFinite(expiresIn) ||\n !Number.isInteger(expiresIn) ||\n expiresIn < 0\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n\n expiresAt = input.now() + expiresIn * 1000;\n if (\n !Number.isSafeInteger(expiresAt) ||\n expiresAt > MAX_JS_DATE_MS ||\n !Number.isFinite(new Date(expiresAt).getTime())\n ) {\n throw new Error(\"OAuth token response has invalid expires_in\");\n }\n }\n\n const refreshToken = getOwnEntry(payload, \"refresh_token\");\n const scope = getOwnEntry(payload, \"scope\");\n const normalizedRefreshToken =\n typeof refreshToken === \"string\" && refreshToken.trim().length > 0\n ? refreshToken.trim()\n : undefined;\n const normalizedScope =\n typeof scope === \"string\" && scope.trim().length > 0 ? scope.trim() : undefined;\n return {\n accessToken: normalizedAccessToken,\n refreshToken: normalizedRefreshToken === undefined ? undefined : normalizedRefreshToken,\n tokenType,\n expiresAt,\n scope: normalizedScope === undefined ? undefined : normalizedScope\n };\n}\n\nexport async function readOAuthJsonObjectResponse(\n response: Response\n): Promise<Record<string, unknown>> {\n const fallbackError = createFallbackOAuthError(response.status);\n let payload: unknown;\n\n try {\n payload = await response.json();\n } catch {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n if (!response.ok) {\n throw fallbackError;\n }\n throw new Error(\"OAuth response must be a JSON object\");\n }\n\n const record = payload as Record<string, unknown>;\n if (!response.ok) {\n throw new OAuthError(readOAuthError(record, fallbackError.error), response.status);\n }\n\n return record;\n}\n\nfunction readOAuthError(\n payload: Record<string, unknown>,\n fallbackError = \"server_error\"\n): OAuthErrorShape {\n const error = getOwnEntry(payload, \"error\");\n const errorDescription = getOwnEntry(payload, \"error_description\");\n const errorUri = getOwnEntry(payload, \"error_uri\");\n return {\n error: typeof error === \"string\" ? error : fallbackError,\n error_description: typeof errorDescription === \"string\" ? errorDescription : undefined,\n error_uri: typeof errorUri === \"string\" ? errorUri : undefined\n };\n}\n\nfunction getOwnEntry(record: Record<string, unknown>, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key) ? record[key] : undefined;\n}\n\nfunction createFallbackOAuthError(status: number): OAuthError {\n const error = status === 503 ? \"temporarily_unavailable\" : \"server_error\";\n return new OAuthError({ error }, status);\n}\n\nfunction normalizeBearerTokenType(value: unknown): \"Bearer\" | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n return value.toLowerCase() === \"bearer\" ? \"Bearer\" : null;\n}\n", "import {\n decodeProtectedHeader,\n errors,\n importJWK,\n jwtVerify,\n type JSONWebKeySet,\n type JWK,\n type JWTPayload\n} from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\n\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\"\n] as const;\n\ntype FetchLike = typeof fetch;\ntype TokenVerificationErrorCode =\n | \"invalid_token\"\n | \"insufficient_scope\"\n | \"temporarily_unavailable\";\n\nexport interface JwksTokenVerifierOptions {\n jwksUrl: string | URL;\n clockSkewSeconds?: number;\n allowedAlgorithms?: readonly string[];\n jwksCacheTtlMs?: number;\n jwksFetchTimeoutMs?: number;\n jwksRefreshCooldownMs?: number;\n allowInsecureJwks?: boolean;\n requireAccessTokenType?: boolean;\n fetch?: FetchLike;\n}\n\nexport interface JwksVerifiedAccessToken {\n token: string;\n issuer: string;\n audience: string[];\n scopes: string[];\n expiresAt: number;\n claims: Record<string, unknown>;\n subject?: string;\n clientId?: string;\n}\n\nexport interface JwksTokenVerifier {\n verify(input: {\n token: string;\n resource: string;\n authorizationServers: readonly string[];\n requiredScopes: readonly string[];\n }): Promise<JwksVerifiedAccessToken>;\n}\n\ntype TokenVerificationErrorShape = Error & {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n};\n\nfunction isTokenVerificationErrorShape(error: unknown): error is TokenVerificationErrorShape {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const challengeError = error as { error?: unknown };\n return (\n challengeError.error === \"invalid_token\" ||\n challengeError.error === \"insufficient_scope\" ||\n challengeError.error === \"temporarily_unavailable\"\n );\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction getOwnEntry(record: object, key: string): unknown {\n return Object.prototype.hasOwnProperty.call(record, key)\n ? (record as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getOwnString(record: object, key: string): string | undefined {\n const value = getOwnEntry(record, key);\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction toUrl(value: string | URL, label: string): URL {\n try {\n return new URL(String(value));\n } catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\n\nfunction normalizeAudience(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n return isStringArray(value) ? [...value] : [];\n}\n\nfunction normalizeVerifiedAudience(value: unknown, expectedResource: string): string[] {\n const audiences = normalizeAudience(value);\n for (const audience of audiences) {\n try {\n const normalizedAudience = canonicalizeResourceIndicator(audience);\n if (normalizedAudience === expectedResource) {\n return [normalizedAudience];\n }\n } catch {\n continue;\n }\n }\n\n throw createInvalidTokenError(\"audience mismatch\");\n}\n\nfunction parseScopes(payload: JWTPayload): string[] {\n const scope = getOwnString(payload, \"scope\");\n const scopes = getOwnEntry(payload, \"scopes\");\n const raw = scope !== undefined ? scope : typeof scopes === \"string\" ? scopes : null;\n\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n\n return isStringArray(scopes) ? [...scopes] : [];\n}\n\nfunction toVerifiedAccessToken(\n token: string,\n payload: JWTPayload,\n audience = normalizeAudience(getOwnEntry(payload, \"aud\"))\n): JwksVerifiedAccessToken {\n const issuer = getOwnString(payload, \"iss\");\n const expiresAt = getOwnEntry(payload, \"exp\");\n const subject = getOwnString(payload, \"sub\");\n const clientId = getOwnString(payload, \"client_id\");\n\n return {\n token,\n issuer: issuer ?? \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: expiresAt as number,\n claims: { ...payload },\n ...(subject !== undefined\n ? {\n subject\n }\n : {}),\n ...(clientId !== undefined\n ? {\n clientId\n }\n : {})\n };\n}\n\nfunction createTokenVerificationError(input: {\n error: TokenVerificationErrorCode;\n errorDescription?: string;\n scope?: readonly string[];\n}): TokenVerificationErrorShape {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\n\nfunction createTemporarilyUnavailableError(): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"temporarily_unavailable\",\n errorDescription: \"token verification temporarily unavailable\"\n });\n}\n\nfunction createInvalidTokenError(errorDescription: string): TokenVerificationErrorShape {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription\n });\n}\n\nfunction normalizeVerificationError(error: unknown): TokenVerificationErrorShape {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n\n if (error.claim === \"exp\") {\n if (error.reason === \"missing\") {\n return createInvalidTokenError(\"token missing expiry\");\n }\n\n return createInvalidTokenError(\"token expired\");\n }\n\n if (error.claim === \"typ\") {\n return createInvalidTokenError(\"invalid access token type\");\n }\n }\n\n if (error instanceof errors.JOSEAlgNotAllowed || error instanceof errors.JOSENotSupported) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n if (\n error instanceof errors.JWKSNoMatchingKey ||\n error instanceof errors.JWKSMultipleMatchingKeys ||\n error instanceof errors.JWSSignatureVerificationFailed\n ) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n\n if (error instanceof errors.JWKSInvalid || error instanceof errors.JWKSTimeout) {\n return createTemporarilyUnavailableError();\n }\n\n return createInvalidTokenError(\"token verification failed\");\n}\n\nasync function loadJwks(\n jwksUrl: URL,\n fetchImplementation: FetchLike,\n timeoutMs: number\n): Promise<JSONWebKeySet> {\n try {\n const response = await fetchImplementation(jwksUrl, {\n headers: {\n Accept: \"application/json\"\n },\n signal: AbortSignal.timeout(timeoutMs)\n });\n\n if (!response.ok) {\n throw createTemporarilyUnavailableError();\n }\n\n const payload = (await response.json()) as unknown;\n const keys = isObjectRecord(payload) ? getOwnEntry(payload, \"keys\") : undefined;\n if (!isObjectRecord(payload) || !Array.isArray(keys) || !keys.every(isObjectRecord)) {\n throw createTemporarilyUnavailableError();\n }\n\n return { keys } as JSONWebKeySet;\n } catch (error) {\n if (isTokenVerificationErrorShape(error)) {\n throw error;\n }\n\n throw createTemporarilyUnavailableError();\n }\n}\n\nfunction resolveAlgorithm(token: string, allowedAlgorithms: readonly string[]): string {\n const header = decodeProtectedHeader(token);\n const alg = getOwnString(header, \"alg\");\n\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n\n if (\n typeof alg !== \"string\" ||\n alg === \"none\" ||\n alg.startsWith(\"HS\") ||\n !allowedAlgorithms.includes(alg)\n ) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n\n return alg;\n}\n\nfunction hasCriticalHeaderClaims(header: ReturnType<typeof decodeProtectedHeader>): boolean {\n const criticalClaims = getOwnEntry(header, \"crit\");\n return Array.isArray(criticalClaims) && criticalClaims.length > 0;\n}\n\nfunction isVerificationCandidate(key: JWK, alg: string, kid: string | undefined): boolean {\n const keyId = getOwnString(key, \"kid\");\n const keyAlgorithm = getOwnString(key, \"alg\");\n const keyUse = getOwnString(key, \"use\");\n const keyOps = getOwnEntry(key, \"key_ops\");\n\n if (kid !== undefined && keyId !== kid) {\n return false;\n }\n\n if (keyAlgorithm !== undefined && keyAlgorithm !== alg) {\n return false;\n }\n\n if (keyUse !== undefined && keyUse !== \"sig\") {\n return false;\n }\n\n if (Array.isArray(keyOps) && !keyOps.includes(\"verify\")) {\n return false;\n }\n\n return true;\n}\n\nfunction shouldContinueWithNextKey(error: unknown): boolean {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\n\nasync function verifyJwtAgainstJwks(input: {\n token: string;\n jwks: JSONWebKeySet;\n alg: string;\n authorizationServers: readonly string[];\n clockSkewSeconds: number;\n requireAccessTokenType: boolean;\n}) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = getOwnString(protectedHeader, \"kid\");\n const candidateKeys = input.jwks.keys.filter((key) =>\n isVerificationCandidate(key, input.alg, kid)\n );\n\n if (candidateKeys.length === 0) {\n throw new NoMatchingKeyError();\n }\n\n let lastSignatureError: unknown;\n let hasMalformedKey = false;\n\n for (const candidate of candidateKeys) {\n let key;\n try {\n key = await importJWK(candidate, input.alg);\n } catch {\n hasMalformedKey = true;\n continue;\n }\n\n try {\n return await jwtVerify(input.token, key as never, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n requiredClaims: [\"exp\"],\n ...(input.requireAccessTokenType ? { typ: \"at+jwt\" } : {})\n });\n } catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n\n throw error;\n }\n }\n\n if (hasMalformedKey) {\n throw createTemporarilyUnavailableError();\n }\n\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\n\nclass NoMatchingKeyError extends Error {}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n if (hostname === \"localhost\" || hostname.endsWith(\".localhost\")) {\n return true;\n }\n\n if (hostname === \"[::1]\" || hostname === \"::1\") {\n return true;\n }\n\n const parts = hostname.split(\".\");\n return (\n parts.length === 4 &&\n parts[0] === \"127\" &&\n parts.slice(1).every((part) => {\n const value = Number(part);\n return Number.isInteger(value) && value >= 0 && value <= 255;\n })\n );\n}\n\nexport function createJwksTokenVerifier(options: JwksTokenVerifierOptions): JwksTokenVerifier {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const jwksCacheTtlMs = options.jwksCacheTtlMs ?? 300_000;\n const jwksFetchTimeoutMs = options.jwksFetchTimeoutMs ?? 5_000;\n const jwksRefreshCooldownMs = options.jwksRefreshCooldownMs ?? 30_000;\n const requireAccessTokenType = options.requireAccessTokenType ?? false;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n let cachedJwks: { value: JSONWebKeySet; expiresAt: number } | undefined;\n let pendingJwks: Promise<JSONWebKeySet> | undefined;\n let pendingForcedRefresh: Promise<JSONWebKeySet> | undefined;\n let lastForcedRefreshAt = Number.NEGATIVE_INFINITY;\n\n if (\n jwksUrl.protocol !== \"https:\" &&\n !isLoopbackHostname(jwksUrl.hostname) &&\n options.allowInsecureJwks !== true\n ) {\n throw new Error(\"jwksUrl must use HTTPS for non-loopback hosts\");\n }\n\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n\n async function getJwks(forceRefresh = false): Promise<JSONWebKeySet> {\n const now = Date.now();\n if (!forceRefresh && cachedJwks !== undefined && cachedJwks.expiresAt > now) {\n return cachedJwks.value;\n }\n\n if (pendingJwks !== undefined) {\n return pendingJwks;\n }\n\n pendingJwks = loadJwks(jwksUrl, fetchImplementation, jwksFetchTimeoutMs)\n .then((jwks) => {\n cachedJwks = {\n value: jwks,\n expiresAt: Date.now() + jwksCacheTtlMs\n };\n return jwks;\n })\n .finally(() => {\n pendingJwks = undefined;\n });\n\n return pendingJwks;\n }\n\n function refreshJwksAfterUnknownKey(): Promise<JSONWebKeySet> {\n if (pendingForcedRefresh !== undefined) {\n return pendingForcedRefresh;\n }\n\n const now = Date.now();\n if (now - lastForcedRefreshAt < jwksRefreshCooldownMs) {\n throw new NoMatchingKeyError();\n }\n\n lastForcedRefreshAt = now;\n pendingForcedRefresh = getJwks(true).finally(() => {\n pendingForcedRefresh = undefined;\n });\n return pendingForcedRefresh;\n }\n\n return {\n async verify(input): Promise<JwksVerifiedAccessToken> {\n try {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n let jwks = await getJwks();\n let verified;\n\n try {\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n } catch (error) {\n if (!(error instanceof NoMatchingKeyError)) {\n throw error;\n }\n\n jwks = await refreshJwksAfterUnknownKey();\n verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n requireAccessTokenType\n });\n }\n const audience = normalizeVerifiedAudience(\n getOwnEntry(verified.payload, \"aud\"),\n expectedResource\n );\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n\n if (\n input.requiredScopes.length > 0 &&\n !input.requiredScopes.every((scope) => accessToken.scopes.includes(scope))\n ) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes]\n });\n }\n\n return accessToken;\n } catch (error) {\n if (error instanceof NoMatchingKeyError) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n\n throw normalizeVerificationError(error);\n }\n }\n };\n}\n", "import type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n} from \"mcp-oauth\";\nimport { canonicalizeResourceIndicator } from \"mcp-oauth\";\n\nexport type {\n OAuthAuthorizationServerMetadata,\n OAuthDiscoveryResult,\n OAuthMetadataFetch,\n OAuthProtectedResourceMetadata,\n OAuthUnauthorizedChallenge,\n};\n\nexport interface OAuthDiscoveryCache {\n get(\n resourceUrl: string\n ): OAuthDiscoveryResult | null | undefined | Promise<OAuthDiscoveryResult | null | undefined>;\n set(resourceUrl: string, value: OAuthDiscoveryResult): void | Promise<void>;\n}\n\nexport interface OAuthMetadataDiscoveryOptions {\n fetch?: OAuthMetadataFetch;\n cache?: OAuthDiscoveryCache;\n}\n\nexport interface OAuthMetadataLookupOptions {\n resourceMetadataUrl?: string | URL;\n}\n\nfunction defaultOAuthMetadataFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = normalizeHostname(hostname);\n\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\n\nfunction assertSecureUrl(url: URL, label: string): void {\n if (url.protocol === \"https:\") {\n return;\n }\n\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\n\nfunction validateProtectedResourceMetadata(\n value: unknown,\n resourceUrl: string\n): OAuthProtectedResourceMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Protected resource metadata must be a JSON object\");\n }\n\n if (typeof value.resource !== \"string\" || value.resource.length === 0) {\n throw new Error(\"Protected resource metadata must include a resource string\");\n }\n\n const normalizedResource = canonicalizeResourceIndicator(value.resource);\n\n if (normalizedResource !== resourceUrl) {\n throw new Error(\n `Protected resource metadata resource mismatch: expected ${resourceUrl}, received ${value.resource}`\n );\n }\n\n if (!isStringArray(value.authorization_servers) || value.authorization_servers.length === 0) {\n throw new Error(\n \"Protected resource metadata must include a non-empty authorization_servers array\"\n );\n }\n\n return {\n ...value,\n resource: normalizedResource,\n } as OAuthProtectedResourceMetadata;\n}\n\nfunction validateAuthorizationServerMetadata(\n value: unknown,\n issuer: string\n): OAuthAuthorizationServerMetadata {\n if (!isObjectRecord(value)) {\n throw new Error(\"Authorization server metadata must be a JSON object\");\n }\n\n if (typeof value.issuer !== \"string\" || value.issuer.length === 0) {\n throw new Error(\"Authorization server metadata must include issuer\");\n }\n\n if (value.issuer !== issuer) {\n throw new Error(\n `Authorization server metadata issuer mismatch: expected ${issuer}, received ${value.issuer}`\n );\n }\n\n if (\n typeof value.authorization_endpoint !== \"string\" ||\n value.authorization_endpoint.length === 0\n ) {\n throw new Error(\"Authorization server metadata must include authorization_endpoint\");\n }\n\n if (typeof value.token_endpoint !== \"string\" || value.token_endpoint.length === 0) {\n throw new Error(\"Authorization server metadata must include token_endpoint\");\n }\n\n if (\n !isStringArray(value.response_types_supported) ||\n !value.response_types_supported.includes(\"code\")\n ) {\n throw new Error(\n \"Authorization server metadata must include response_types_supported containing code\"\n );\n }\n\n if (\n !isStringArray(value.code_challenge_methods_supported) ||\n !value.code_challenge_methods_supported.includes(\"S256\")\n ) {\n throw new Error(\n \"Authorization server metadata must include code_challenge_methods_supported containing S256\"\n );\n }\n\n return value as OAuthAuthorizationServerMetadata;\n}\n\nasync function readJsonResponse(response: Response, label: string): Promise<unknown> {\n if (!response.ok) {\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n throw new Error(`${label} request failed (${statusDescriptor})`);\n }\n\n try {\n return await response.json();\n } catch {\n throw new Error(`${label} response must be valid JSON`);\n }\n}\n\nfunction resolveWellKnownMetadataUrl(inputUrl: string | URL, suffix: string): string {\n const url = new URL(typeof inputUrl === \"string\" ? inputUrl : inputUrl.toString());\n\n const resourcePath = url.pathname === \"/\" ? \"\" : url.pathname;\n url.pathname = `/.well-known/${suffix}${resourcePath}`;\n\n return url.toString();\n}\n\nexport function resolveProtectedResourceMetadataUrl(\n resourceUrl: string | URL,\n resourceMetadataUrl?: string | URL\n): string {\n const resource = new URL(canonicalizeResourceIndicator(resourceUrl));\n assertSecureUrl(resource, \"Protected resource URL\");\n\n if (resourceMetadataUrl !== undefined) {\n const resolvedResourceMetadataUrl = new URL(\n typeof resourceMetadataUrl === \"string\" ? resourceMetadataUrl : resourceMetadataUrl.toString(),\n resource\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n }\n\n const resolvedResourceMetadataUrl = new URL(\n resolveWellKnownMetadataUrl(resource, \"oauth-protected-resource\")\n );\n assertSecureUrl(resolvedResourceMetadataUrl, \"Protected resource metadata URL\");\n return resolvedResourceMetadataUrl.toString();\n}\n\nfunction normalizeAuthorizationServerIssuer(issuer: string | URL): string {\n const input = typeof issuer === \"string\" ? issuer : issuer.toString();\n const url = new URL(input);\n if (url.search.length > 0 || url.hash.length > 0) {\n throw new Error(\"Authorization server issuer must not include query or fragment\");\n }\n\n assertSecureUrl(url, \"Authorization server issuer\");\n\n if (url.pathname.length > 1 && url.pathname.endsWith(\"/\")) {\n url.pathname = url.pathname.slice(0, -1);\n }\n\n return url.pathname === \"/\" ? url.origin : url.toString();\n}\n\nexport function resolveAuthorizationServerMetadataUrl(issuer: string | URL): string {\n return resolveWellKnownMetadataUrl(\n normalizeAuthorizationServerIssuer(issuer),\n \"oauth-authorization-server\"\n );\n}\n\nexport class OAuthMetadataDiscovery {\n private readonly fetchImpl: OAuthMetadataFetch;\n private readonly cache: OAuthDiscoveryCache | undefined;\n private readonly memoryCache = new Map<string, OAuthDiscoveryResult>();\n\n constructor({ fetch = defaultOAuthMetadataFetch, cache }: OAuthMetadataDiscoveryOptions = {}) {\n this.fetchImpl = fetch;\n this.cache = cache;\n }\n\n async discover(\n resourceUrl: string | URL,\n { resourceMetadataUrl }: OAuthMetadataLookupOptions = {}\n ): Promise<OAuthDiscoveryResult> {\n const cacheKey = canonicalizeResourceIndicator(resourceUrl);\n const resourceMetadataLocation = resolveProtectedResourceMetadataUrl(\n cacheKey,\n resourceMetadataUrl\n );\n const memoryCachedResult = this.memoryCache.get(cacheKey);\n if (memoryCachedResult !== undefined && resourceMetadataUrl === undefined) {\n return memoryCachedResult;\n }\n\n const sharedCachedResult = await this.cache?.get(cacheKey);\n if (\n sharedCachedResult !== null &&\n sharedCachedResult !== undefined &&\n resourceMetadataUrl === undefined\n ) {\n this.memoryCache.set(cacheKey, sharedCachedResult);\n return sharedCachedResult;\n }\n\n const resourceMetadataResponse = await this.fetchImpl(resourceMetadataLocation, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const resourceMetadata = validateProtectedResourceMetadata(\n await readJsonResponse(resourceMetadataResponse, \"Protected resource metadata\"),\n cacheKey\n );\n\n const authorizationServerErrors: string[] = [];\n\n for (const authorizationServer of resourceMetadata.authorization_servers) {\n const normalizedAuthorizationServer = normalizeAuthorizationServerIssuer(\n authorizationServer\n );\n const authorizationServerMetadataUrl =\n resolveAuthorizationServerMetadataUrl(normalizedAuthorizationServer);\n\n try {\n const authorizationServerResponse = await this.fetchImpl(authorizationServerMetadataUrl, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n },\n });\n const authorizationServerMetadata = validateAuthorizationServerMetadata(\n await readJsonResponse(\n authorizationServerResponse,\n \"Authorization server metadata\"\n ),\n normalizedAuthorizationServer\n );\n\n const result: OAuthDiscoveryResult = {\n resource: resourceMetadata.resource,\n resourceMetadataUrl: resourceMetadataLocation,\n resourceMetadata,\n authorizationServer: normalizedAuthorizationServer,\n authorizationServerMetadataUrl,\n authorizationServerMetadata,\n };\n\n this.memoryCache.set(cacheKey, result);\n await this.cache?.set(cacheKey, result);\n return result;\n } catch (error) {\n authorizationServerErrors.push(\n `${authorizationServerMetadataUrl}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n throw new Error(\n `Unable to load authorization server metadata for ${cacheKey}: ${authorizationServerErrors.join(\n \"; \"\n )}`\n );\n }\n}\n\nexport async function discoverOAuthMetadata(\n resourceUrl: string | URL,\n options: OAuthMetadataDiscoveryOptions & OAuthMetadataLookupOptions = {}\n): Promise<OAuthDiscoveryResult> {\n const discovery = new OAuthMetadataDiscovery(options);\n return discovery.discover(resourceUrl, options);\n}\n\nfunction skipOptionalWhitespace(value: string, start: number): number {\n let index = start;\n while (index < value.length && (value[index] === \" \" || value[index] === \"\\t\")) {\n index += 1;\n }\n return index;\n}\n\nfunction readToken(value: string, start: number): { token: string; nextIndex: number } | null {\n let index = start;\n while (index < value.length) {\n const character = value[index];\n if (\n character === \" \"\n || character === \"\\t\"\n || character === \",\"\n || character === \"=\"\n || character === \"\\\"\"\n ) {\n break;\n }\n index += 1;\n }\n\n if (index === start) {\n return null;\n }\n\n return {\n token: value.slice(start, index),\n nextIndex: index,\n };\n}\n\nfunction looksLikeAuthParam(value: string, start: number): boolean {\n const token = readToken(value, start);\n if (token === null) {\n return false;\n }\n\n return value[skipOptionalWhitespace(value, token.nextIndex)] === \"=\";\n}\n\nfunction isToken68Character(character: string): boolean {\n return (\n (character >= \"a\" && character <= \"z\")\n || (character >= \"A\" && character <= \"Z\")\n || (character >= \"0\" && character <= \"9\")\n || character === \"-\"\n || character === \".\"\n || character === \"_\"\n || character === \"~\"\n || character === \"+\"\n || character === \"/\"\n );\n}\n\nfunction readToken68(\n value: string,\n start: number\n): { token68: string; nextIndex: number } | null {\n let nextIndex = start;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n const token68 = value.slice(start, nextIndex);\n if (token68.length === 0) {\n return null;\n }\n\n let index = 0;\n while (index < token68.length && isToken68Character(token68[index]!)) {\n index += 1;\n }\n\n if (index === 0) {\n return null;\n }\n\n while (index < token68.length && token68[index] === \"=\") {\n index += 1;\n }\n\n if (index !== token68.length) {\n return null;\n }\n\n return { token68, nextIndex };\n}\n\nfunction readQuotedString(\n value: string,\n start: number\n): { parsedValue: string; nextIndex: number } | null {\n if (value[start] !== \"\\\"\") {\n return null;\n }\n\n let parsedValue = \"\";\n let index = start + 1;\n let escaping = false;\n\n while (index < value.length) {\n const character = value[index];\n if (escaping) {\n parsedValue += character;\n escaping = false;\n index += 1;\n continue;\n }\n\n if (character === \"\\\\\") {\n escaping = true;\n index += 1;\n continue;\n }\n\n if (character === \"\\\"\") {\n return {\n parsedValue,\n nextIndex: index + 1,\n };\n }\n\n parsedValue += character;\n index += 1;\n }\n\n return null;\n}\n\nfunction parseAuthParam(\n value: string,\n start: number\n): { name: string; value: string; nextIndex: number } | null {\n const token = readToken(value, start);\n if (token === null) {\n return null;\n }\n\n let index = skipOptionalWhitespace(value, token.nextIndex);\n if (value[index] !== \"=\") {\n return null;\n }\n\n index = skipOptionalWhitespace(value, index + 1);\n if (index >= value.length) {\n return null;\n }\n\n const quotedValue = readQuotedString(value, index);\n if (quotedValue !== null) {\n return {\n name: token.token,\n value: quotedValue.parsedValue,\n nextIndex: quotedValue.nextIndex,\n };\n }\n\n let nextIndex = index;\n while (nextIndex < value.length) {\n const character = value[nextIndex];\n if (character === \",\" || character === \" \" || character === \"\\t\") {\n break;\n }\n nextIndex += 1;\n }\n\n return {\n name: token.token,\n value: value.slice(index, nextIndex),\n nextIndex,\n };\n}\n\nexport function parseBearerWwwAuthenticateHeader(\n headerValue: string | null\n): OAuthUnauthorizedChallenge | null {\n if (headerValue === null) {\n return null;\n }\n\n let index = 0;\n let firstBearerChallenge: OAuthUnauthorizedChallenge | null = null;\n\n while (index < headerValue.length) {\n index = skipOptionalWhitespace(headerValue, index);\n while (headerValue[index] === \",\") {\n index = skipOptionalWhitespace(headerValue, index + 1);\n }\n\n const scheme = readToken(headerValue, index);\n if (scheme === null) {\n break;\n }\n\n index = skipOptionalWhitespace(headerValue, scheme.nextIndex);\n const params: Record<string, string> = Object.create(null) as Record<string, string>;\n\n if (index < headerValue.length && headerValue[index] !== \",\") {\n const token68 = readToken68(headerValue, index);\n if (token68 !== null) {\n index = token68.nextIndex;\n } else if (looksLikeAuthParam(headerValue, index)) {\n while (index < headerValue.length) {\n const parsedParam = parseAuthParam(headerValue, index);\n if (parsedParam === null) {\n break;\n }\n\n params[parsedParam.name] = parsedParam.value;\n index = skipOptionalWhitespace(headerValue, parsedParam.nextIndex);\n\n if (headerValue[index] !== \",\") {\n break;\n }\n\n const nextIndex = skipOptionalWhitespace(headerValue, index + 1);\n if (!looksLikeAuthParam(headerValue, nextIndex)) {\n index = nextIndex;\n break;\n }\n\n index = nextIndex;\n }\n }\n }\n\n if (scheme.token.toLowerCase() === \"bearer\") {\n const challenge: OAuthUnauthorizedChallenge = {\n scheme: \"Bearer\",\n params,\n raw: headerValue,\n };\n if (Object.keys(params).length > 0) {\n return challenge;\n }\n\n firstBearerChallenge ??= challenge;\n }\n\n if (headerValue[index] === \",\") {\n index += 1;\n }\n }\n\n return firstBearerChallenge;\n}\n", "import { McpError } from \"tiny-mcp-client\";\nimport { hostErrorData } from \"../error/shape.js\";\nimport { declareHostOperation } from \"../interp/host-bridge.js\";\nimport { runResources } from \"../interp/resources.js\";\nimport {\n connectMcpTransport,\n normalizeMcpOptions,\n type ManagedMcpConnection,\n type McpModuleOptions\n} from \"./mcp-transport.js\";\n\nexport type McpModuleServerHandle = {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n};\n\nexport type McpModuleTool = {\n name: string;\n description?: string;\n schema?: unknown;\n};\n\nexport type McpModuleToolCall = {\n name: string;\n args?: unknown;\n};\n\nexport type McpModuleToolBatchError = {\n name: string;\n message: string;\n};\n\nexport type McpModuleToolBatchResult =\n | {\n ok: true;\n value: unknown;\n }\n | {\n ok: false;\n error: McpModuleToolBatchError;\n };\n\nexport type McpModuleClient = {\n tools(): Promise<McpModuleTool[]>;\n tool(name: string, args?: unknown): Promise<unknown>;\n toolBatch(calls: McpModuleToolCall[]): Promise<McpModuleToolBatchResult[]>;\n};\n\ntype McpConnection = {\n listTools(): Promise<{\n tools: unknown[];\n }>;\n callTool(params: { name: string; arguments?: unknown }): Promise<unknown>;\n callToolBatch?(\n params: Array<{\n name: string;\n arguments?: unknown;\n }>\n ): Promise<McpModuleToolBatchResult[]>;\n};\n\ntype McpToolRequest = Parameters<McpConnection[\"callTool\"]>[0];\n\ntype NormalizedToolBatchCall =\n | {\n ok: true;\n request: McpToolRequest;\n }\n | {\n ok: false;\n error: McpModuleToolBatchError;\n };\n\nconst DEFAULT_TOOL_BATCH_CONCURRENCY = 4;\n\nexport type ConnectMcp = (server: McpModuleServerHandle) => Promise<McpConnection> | McpConnection;\n\nexport type McpNamedServerHandle = { name: string };\nexport type ManagedMcpClient = McpModuleClient & { close(): Promise<void> };\nexport type ManagedMcpModule = {\n servers: Record<string, ManagedMcpClient>;\n server(name: string): McpNamedServerHandle;\n client(handle: McpNamedServerHandle | string): Promise<ManagedMcpClient>;\n};\n\ntype CustomMcpModule = {\n server(server: McpModuleServerHandle): McpModuleServerHandle;\n client(handle: McpModuleServerHandle): Promise<McpModuleClient>;\n};\n\nexport function makeMcpModule(options: McpModuleOptions): ManagedMcpModule;\nexport function makeMcpModule(connectMcp: ConnectMcp): CustomMcpModule;\nexport function makeMcpModule(\n connectMcp: ConnectMcp | McpModuleOptions\n): CustomMcpModule | ManagedMcpModule {\n if (typeof connectMcp !== \"function\") {\n const options = normalizeMcpOptions(connectMcp);\n const servers = Object.create(null) as Record<string, ManagedMcpClient>;\n for (const [name, config] of Object.entries(options.servers)) {\n const connections = new WeakMap<object, ManagedMcpConnection>();\n const directScope = {};\n const connection = () => {\n const scope = runResources.getStore();\n scope?.signal.throwIfAborted();\n options.signal?.throwIfAborted();\n const owner = scope ?? directScope;\n let current = connections.get(owner);\n if (current === undefined) {\n current = connectMcpTransport(config, options, scope?.signal);\n connections.set(owner, current);\n scope?.add(current.close);\n }\n return current.ready;\n };\n const invoke = async <Result>(\n operation: (client: Awaited<ReturnType<typeof connection>>) => Promise<Result>\n ): Promise<Result> => {\n try {\n const result = await operation(await connection());\n runResources.getStore()?.signal.throwIfAborted();\n options.signal?.throwIfAborted();\n return result;\n } catch (error) {\n runResources.getStore()?.signal.throwIfAborted();\n options.signal?.throwIfAborted();\n if (error instanceof McpError) {\n hostErrorData.set(error, {\n code: error.code,\n ...(error.data === undefined ? {} : { data: error.data })\n });\n }\n throw error;\n }\n };\n servers[name] = {\n tools: declareHostOperation(\n async () =>\n invoke(async (client) => {\n const tools: McpModuleTool[] = [];\n const cursors = new Set<string>();\n let pages = 0;\n let cursor: string | undefined;\n do {\n const result = await client.listTools(\n cursor === undefined ? undefined : { cursor }\n );\n pages += 1;\n tools.push(...normalizeToolsResult(result));\n cursor = result.nextCursor;\n if (cursor !== undefined) {\n if (typeof cursor !== \"string\" || cursors.has(cursor))\n throw new Error(\"MCP tools pagination did not advance.\");\n cursors.add(cursor);\n if (pages >= options.maxToolPages!)\n throw new Error(\"MCP tools page limit exceeded.\");\n }\n } while (cursor !== undefined);\n return tools;\n }),\n \"re-issue\"\n ),\n tool: declareHostOperation(async (toolName: string, args?: unknown) => {\n const request = createNullRecord({\n name: readNonEmptyTrimmedString(toolName, \"MCP tool name\"),\n ...(args === undefined ? {} : { arguments: readToolArguments(args) })\n });\n return invoke((client) => client.callTool(request));\n }, \"read-side-effect\"),\n toolBatch: declareHostOperation(async (calls: McpModuleToolCall[]) => {\n const normalized = readToolBatchCalls(calls);\n if (normalized.length === 0) return [];\n return invoke((client) => executeToolBatch(client, normalized));\n }, \"read-side-effect\"),\n close: declareHostOperation(async () => {\n const owner = runResources.getStore() ?? directScope;\n const current = connections.get(owner);\n if (current !== undefined) {\n await current.close();\n connections.delete(owner);\n }\n }, \"re-issue\")\n };\n }\n const readName = (value: unknown): string => {\n const name = readNonEmptyString(value, \"MCP server name\");\n if (!Object.hasOwn(servers, name)) throw new Error(`MCP server '${name}' is not configured.`);\n return name;\n };\n return {\n servers,\n server(name: string) {\n return createNullRecord({ name: readName(name) });\n },\n async client(handle: McpNamedServerHandle | string) {\n if (typeof handle === \"string\") return servers[readName(handle)];\n if (!isRecord(handle) || Object.keys(handle).length !== 1 || !Object.hasOwn(handle, \"name\"))\n throw new TypeError(\"MCP client requires a named server handle.\");\n return servers[readName(getOwnProperty(handle, \"name\"))];\n }\n };\n }\n return {\n server(server: McpModuleServerHandle) {\n return normalizeServerHandle(server);\n },\n\n async client(handle: McpModuleServerHandle) {\n const connection = validateConnection(await connectMcp(normalizeServerHandle(handle)));\n\n return {\n async tools() {\n return normalizeToolsResult(await connection.listTools());\n },\n\n async tool(name: string, args?: unknown) {\n return connection.callTool(\n createNullRecord({\n name: readNonEmptyTrimmedString(name, \"MCP tool name\"),\n ...(args === undefined ? {} : { arguments: readToolArguments(args) })\n })\n );\n },\n\n async toolBatch(calls: McpModuleToolCall[]) {\n return executeToolBatch(connection, readToolBatchCalls(calls));\n }\n };\n }\n };\n}\n\nasync function executeToolBatch(\n connection: McpConnection,\n calls: NormalizedToolBatchCall[]\n): Promise<McpModuleToolBatchResult[]> {\n if (calls.length === 0) {\n return [];\n }\n\n if (connection.callToolBatch !== undefined && calls.every((call) => call.ok)) {\n try {\n return normalizeProtocolBatchResults(\n await connection.callToolBatch(calls.map((call) => call.request)),\n calls.length\n );\n } catch (error) {\n const batchError = normalizeToolBatchError(error);\n return calls.map(() =>\n createNullRecord({\n ok: false,\n error: batchError\n })\n );\n }\n }\n\n return executeToolBatchWithConcurrency(connection, calls, DEFAULT_TOOL_BATCH_CONCURRENCY);\n}\n\nasync function executeToolBatchWithConcurrency(\n connection: McpConnection,\n calls: NormalizedToolBatchCall[],\n concurrency: number\n): Promise<McpModuleToolBatchResult[]> {\n const results = new Array<McpModuleToolBatchResult>(calls.length);\n let nextIndex = 0;\n let disconnectError: McpModuleToolBatchError | undefined;\n\n const workerCount = Math.min(concurrency, calls.length);\n const workers = Array.from({ length: workerCount }, async () => {\n while (nextIndex < calls.length) {\n const index = nextIndex;\n nextIndex += 1;\n\n const call = calls[index];\n if (call === undefined) {\n continue;\n }\n\n if (!call.ok) {\n results[index] = createNullRecord({\n ok: false,\n error: call.error\n });\n continue;\n }\n\n if (disconnectError !== undefined) {\n results[index] = createNullRecord({\n ok: false,\n error: disconnectError\n });\n continue;\n }\n\n try {\n results[index] = createNullRecord({\n ok: true,\n value: await connection.callTool(call.request)\n });\n } catch (error) {\n const toolError = normalizeToolBatchError(error);\n results[index] = createNullRecord({\n ok: false,\n error: toolError\n });\n\n if (isMcpDisconnectError(toolError)) {\n disconnectError = toolError;\n }\n }\n }\n });\n\n await Promise.all(workers);\n\n return results;\n}\n\nfunction normalizeProtocolBatchResults(\n value: unknown,\n expectedLength: number\n): McpModuleToolBatchResult[] {\n if (!Array.isArray(value) || value.length !== expectedLength) {\n throw new Error(\n \"MCP callToolBatch() must resolve to a result array matching the input length.\"\n );\n }\n\n return value.map((entry, index) => normalizeProtocolBatchResult(entry, index));\n}\n\nfunction normalizeProtocolBatchResult(value: unknown, index: number): McpModuleToolBatchResult {\n if (!isRecord(value)) {\n throw new Error(`MCP callToolBatch()[${index}] must be a result envelope.`);\n }\n\n const ok = getOwnProperty(value, \"ok\");\n if (typeof ok !== \"boolean\") {\n throw new Error(`MCP callToolBatch()[${index}] must be a result envelope.`);\n }\n\n if (ok === true) {\n return createNullRecord({\n ok: true,\n value: getOwnProperty(value, \"value\")\n });\n }\n\n return createNullRecord({\n ok: false,\n error: normalizeToolBatchError(getOwnProperty(value, \"error\"))\n });\n}\n\nfunction normalizeServerHandle(value: unknown): McpModuleServerHandle {\n if (!isRecord(value)) {\n throw new Error(\"MCP server must be an object.\");\n }\n\n const command = getOwnProperty(value, \"command\");\n const args = getOwnProperty(value, \"args\");\n const env = getOwnProperty(value, \"env\");\n\n return createNullRecord({\n command: readNonEmptyTrimmedString(command, \"MCP server command\"),\n ...(args === undefined ? {} : { args: readStringArray(args, \"MCP server args\") }),\n ...(env === undefined ? {} : { env: readStringRecord(env, \"MCP server env\") })\n });\n}\n\nfunction validateConnection(value: unknown): McpConnection {\n if (\n !isRecord(value) ||\n typeof value.listTools !== \"function\" ||\n typeof value.callTool !== \"function\"\n ) {\n throw new Error(\"connectMcp must resolve to an object with listTools() and callTool().\");\n }\n\n const callToolBatch = getOwnProperty(value, \"callToolBatch\");\n\n return createNullRecord({\n listTools: () => (value.listTools as McpConnection[\"listTools\"])(),\n callTool: (params) => (value.callTool as McpConnection[\"callTool\"])(params),\n ...(typeof callToolBatch === \"function\"\n ? {\n callToolBatch: (params: McpToolRequest[]) =>\n (callToolBatch as NonNullable<McpConnection[\"callToolBatch\"]>)(params)\n }\n : {})\n });\n}\n\nfunction normalizeToolsResult(value: unknown): McpModuleTool[] {\n const tools = isRecord(value) ? getOwnProperty(value, \"tools\") : undefined;\n if (!Array.isArray(tools)) {\n throw new Error(\"MCP listTools() must resolve to an object with a tools array.\");\n }\n\n return tools.map((tool, index) => normalizeTool(tool, index));\n}\n\nfunction normalizeTool(value: unknown, index: number): McpModuleTool {\n if (!isRecord(value)) {\n throw new Error(`MCP tool[${index}] must be an object.`);\n }\n\n const description = getOwnProperty(value, \"description\");\n const inputSchema = getOwnProperty(value, \"inputSchema\");\n\n return createNullRecord({\n name: readNonEmptyString(getOwnProperty(value, \"name\"), `MCP tool[${index}] name`),\n ...(description === undefined\n ? {}\n : { description: readOptionalString(description, `MCP tool[${index}] description`) }),\n ...(inputSchema === undefined ? {} : { schema: inputSchema })\n });\n}\n\nfunction readStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\")) {\n throw new Error(`${label} must be an array of strings.`);\n }\n\n return [...value];\n}\n\nfunction readStringRecord(value: unknown, label: string): Record<string, string> {\n if (!isRecord(value)) {\n throw new Error(`${label} must be an object.`);\n }\n\n const entries = Object.entries(value);\n\n if (entries.some(([, entry]) => typeof entry !== \"string\")) {\n throw new Error(`${label} must be a string record.`);\n }\n\n return createNullRecord(Object.fromEntries(entries) as Record<string, string>);\n}\n\nfunction readOptionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`${label} must be a string.`);\n }\n\n return value;\n}\n\nfunction readNonEmptyString(value: unknown, label: string): string {\n const text = readOptionalString(value, label);\n\n if (text === undefined || text.trim().length === 0) {\n throw new Error(`${label} must be a non-empty string.`);\n }\n\n return text;\n}\n\nfunction readNonEmptyTrimmedString(value: unknown, label: string): string {\n return readNonEmptyString(value, label).trim();\n}\n\nfunction readToolArguments(value: unknown): Record<string, unknown> {\n if (!isPlainObjectRecord(value)) {\n throw new Error(\"MCP tool arguments must be an object.\");\n }\n\n return createNullRecord(Object.fromEntries(Object.entries(value)) as Record<string, unknown>);\n}\n\nfunction readToolBatchCalls(value: unknown): NormalizedToolBatchCall[] {\n if (!Array.isArray(value)) {\n throw new Error(\"MCP toolBatch calls must be an array.\");\n }\n\n return value.map((entry, index) => normalizeToolBatchCall(entry, index));\n}\n\nfunction normalizeToolBatchCall(value: unknown, index: number): NormalizedToolBatchCall {\n try {\n if (!isRecord(value)) {\n throw new Error(`MCP toolBatch call[${index}] must be an object.`);\n }\n\n const args = getOwnProperty(value, \"args\");\n\n return createNullRecord({\n ok: true,\n request: createNullRecord({\n name: readNonEmptyTrimmedString(\n getOwnProperty(value, \"name\"),\n `MCP toolBatch call[${index}] name`\n ),\n ...(args === undefined ? {} : { arguments: readToolArguments(args) })\n })\n });\n } catch (error) {\n return createNullRecord({\n ok: false,\n error: normalizeToolBatchError(error)\n });\n }\n}\n\nfunction normalizeToolBatchError(error: unknown): McpModuleToolBatchError {\n if (error instanceof Error) {\n return createNullRecord({\n name: error.name.length === 0 ? \"Error\" : error.name,\n message: error.message\n });\n }\n\n if (isRecord(error)) {\n const nameValue = getOwnProperty(error, \"name\");\n const messageValue = getOwnProperty(error, \"message\");\n const name = typeof nameValue === \"string\" && nameValue.trim().length > 0 ? nameValue : \"Error\";\n const message = typeof messageValue === \"string\" ? messageValue : String(error);\n\n return createNullRecord({\n name,\n message\n });\n }\n\n return createNullRecord({\n name: \"Error\",\n message: error === undefined ? \"\" : String(error)\n });\n}\n\nfunction isMcpDisconnectError(error: McpModuleToolBatchError): boolean {\n const message = error.message.toLowerCase();\n\n return (\n message.includes(\"disconnected\") ||\n message.includes(\"connection closed\") ||\n message.includes(\"transport closed\") ||\n message.includes(\"disposed\") ||\n message.includes(\"eof\")\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction getOwnProperty<Name extends PropertyKey>(value: object, name: Name): unknown {\n return hasOwnProperty(value, name) ? value[name] : undefined;\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n\nfunction createNullRecord<T extends object>(value: T): T {\n return Object.assign(Object.create(null) as T, value);\n}\n\nfunction isPlainObjectRecord(value: unknown): value is Record<string, unknown> {\n if (!isRecord(value) || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["key", "readOpeningFence", "findClosingFence", "findLineEnd", "errors", "key", "key", "lookup", "errors", "throwIfAborted", "error", "retryable", "isRecord", "resolve", "key", "readNonEmptyString", "dirname", "isAbsolute", "resolve", "sep", "path", "path", "fs", "resolve", "dirname", "isAbsolute", "sep", "path", "key", "path", "readNonEmptyString", "key", "readNonEmptyString", "spawn", "path", "spawn", "path", "randomUUID", "path", "hasOwnErrorCode", "path", "key", "randomUUID", "resolve", "isRecord", "hasOwnErrorCode", "resolve", "getOwnEntry", "key", "key", "getOwnEntry", "key", "path", "URL", "crypto", "isObjectRecord", "getOwnEntry", "key", "resolve", "crypto", "MAX_JS_DATE_MS", "getOwnEntry", "key", "MAX_JS_DATE_MS", "fetch", "getOwnString", "getOwnEntry", "isObjectRecord", "key", "URL", "hostname", "isObjectRecord", "normalizeHostname", "hostname", "isLoopbackHostname", "assertSecureUrl", "resolvedResourceMetadataUrl", "fetch", "isObjectRecord", "spawn", "resolve", "isObjectRecord", "path", "key", "spawn", "cancel", "resolve", "invoke", "createNullRecord", "readNonEmptyString", "isRecord", "getOwnProperty", "readStringArray", "readStringRecord", "readOptionalString", "hasOwnProperty"]
|
|
7
|
+
}
|