@full-self-browsing/lattice 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/dist/agent-run-C6miAzwI.d.ts +45 -0
  2. package/dist/agent-run-C6miAzwI.d.ts.map +1 -0
  3. package/dist/agent-run-CgPVFl0Z.js +47 -0
  4. package/dist/agent-run-CgPVFl0Z.js.map +1 -0
  5. package/dist/agents.d.ts +5 -0
  6. package/dist/agents.js +6 -0
  7. package/dist/artifact-Bg6mJGnm.d.ts +125 -0
  8. package/dist/artifact-Bg6mJGnm.d.ts.map +1 -0
  9. package/dist/artifact-DOfpeXLb.js +140 -0
  10. package/dist/artifact-DOfpeXLb.js.map +1 -0
  11. package/dist/artifacts.d.ts +2 -0
  12. package/dist/artifacts.js +2 -0
  13. package/dist/audit.d.ts +3 -0
  14. package/dist/audit.js +4 -0
  15. package/dist/catalog-CAfYwB_-.js +91 -0
  16. package/dist/catalog-CAfYwB_-.js.map +1 -0
  17. package/dist/context-pack-Bz3GXmjv.js +99 -0
  18. package/dist/context-pack-Bz3GXmjv.js.map +1 -0
  19. package/dist/context.d.ts +2 -0
  20. package/dist/context.js +2 -0
  21. package/dist/contract-S3oJGlc9.d.ts +74 -0
  22. package/dist/contract-S3oJGlc9.d.ts.map +1 -0
  23. package/dist/core.d.ts +48 -0
  24. package/dist/core.d.ts.map +1 -0
  25. package/dist/core.js +95 -0
  26. package/dist/core.js.map +1 -0
  27. package/dist/errors-eEuEIx6X.js +407 -0
  28. package/dist/errors-eEuEIx6X.js.map +1 -0
  29. package/dist/eval.d.ts +2 -0
  30. package/dist/eval.js +2 -0
  31. package/dist/fingerprint-DodDbQKN.js +34 -0
  32. package/dist/fingerprint-DodDbQKN.js.map +1 -0
  33. package/dist/index-DpnHGHVL.d.ts +53 -0
  34. package/dist/index-DpnHGHVL.d.ts.map +1 -0
  35. package/dist/index.d.ts +90 -3533
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +26 -15968
  38. package/dist/index.js.map +1 -1
  39. package/dist/infer-DLqp5QIM.d.ts +96 -0
  40. package/dist/infer-DLqp5QIM.d.ts.map +1 -0
  41. package/dist/lineage-DBgoPWAZ.js +137 -0
  42. package/dist/lineage-DBgoPWAZ.js.map +1 -0
  43. package/dist/local-CXOGPJ1f.js +139 -0
  44. package/dist/local-CXOGPJ1f.js.map +1 -0
  45. package/dist/local-Dy--7peL.d.ts +10 -0
  46. package/dist/local-Dy--7peL.d.ts.map +1 -0
  47. package/dist/memory-CkQEW6m5.js +62 -0
  48. package/dist/memory-CkQEW6m5.js.map +1 -0
  49. package/dist/memory-DRig5EHV.d.ts +10 -0
  50. package/dist/memory-DRig5EHV.d.ts.map +1 -0
  51. package/dist/negotiate-ClD88hkc.js +10967 -0
  52. package/dist/negotiate-ClD88hkc.js.map +1 -0
  53. package/dist/otel-BgM4e55_.d.ts +421 -0
  54. package/dist/otel-BgM4e55_.d.ts.map +1 -0
  55. package/dist/permission-context-CUKMo79F.js +134 -0
  56. package/dist/permission-context-CUKMo79F.js.map +1 -0
  57. package/dist/plan-DFm8Llep.js +125 -0
  58. package/dist/plan-DFm8Llep.js.map +1 -0
  59. package/dist/preflight-DNHWuJ46.d.ts +64 -0
  60. package/dist/preflight-DNHWuJ46.d.ts.map +1 -0
  61. package/dist/provider-C2IfKsvz.d.ts +1178 -0
  62. package/dist/provider-C2IfKsvz.d.ts.map +1 -0
  63. package/dist/providers.d.ts +4 -0
  64. package/dist/providers.js +4 -0
  65. package/dist/rate-limit-group-nDsBJqSu.d.ts +235 -0
  66. package/dist/rate-limit-group-nDsBJqSu.d.ts.map +1 -0
  67. package/dist/receipt-FYouoPHv.js +205 -0
  68. package/dist/receipt-FYouoPHv.js.map +1 -0
  69. package/dist/replay-CtIhpLek.js +964 -0
  70. package/dist/replay-CtIhpLek.js.map +1 -0
  71. package/dist/result-DLEx2WvU.d.ts +38 -0
  72. package/dist/result-DLEx2WvU.d.ts.map +1 -0
  73. package/dist/router-DU4Z3pTd.js +314 -0
  74. package/dist/router-DU4Z3pTd.js.map +1 -0
  75. package/dist/router-Yo1-aDOv.d.ts +42 -0
  76. package/dist/router-Yo1-aDOv.d.ts.map +1 -0
  77. package/dist/routing.d.ts +6 -0
  78. package/dist/routing.js +4 -0
  79. package/dist/{run-crew-CKdBjh5P.js → run-crew-B2fQLmgB.js} +7 -136
  80. package/dist/run-crew-B2fQLmgB.js.map +1 -0
  81. package/dist/run-crew-Bnve5dyI.d.ts +721 -0
  82. package/dist/run-crew-Bnve5dyI.d.ts.map +1 -0
  83. package/dist/{runtime-D25ehzCj.js → runtime-Dxiet5YS.js} +98 -641
  84. package/dist/runtime-Dxiet5YS.js.map +1 -0
  85. package/dist/scaffolds-DKQrCRqh.d.ts +535 -0
  86. package/dist/scaffolds-DKQrCRqh.d.ts.map +1 -0
  87. package/dist/scaffolds-ekPIlBeU.js +3139 -0
  88. package/dist/scaffolds-ekPIlBeU.js.map +1 -0
  89. package/dist/schema-CNfa_VEy.d.ts +15 -0
  90. package/dist/schema-CNfa_VEy.d.ts.map +1 -0
  91. package/dist/storage-DJKmsaEI.d.ts +26 -0
  92. package/dist/storage-DJKmsaEI.d.ts.map +1 -0
  93. package/dist/storage.d.ts +10 -0
  94. package/dist/storage.d.ts.map +1 -0
  95. package/dist/storage.js +4 -0
  96. package/dist/tool-call-validation-BFoXkwbf.js +107 -0
  97. package/dist/tool-call-validation-BFoXkwbf.js.map +1 -0
  98. package/dist/tools-C4wHgGKQ.js +49 -0
  99. package/dist/tools-C4wHgGKQ.js.map +1 -0
  100. package/dist/tools.d.ts +46 -0
  101. package/dist/tools.d.ts.map +1 -0
  102. package/dist/tools.js +106 -0
  103. package/dist/tools.js.map +1 -0
  104. package/dist/validate-c7EL5uuH.js +224 -0
  105. package/dist/validate-c7EL5uuH.js.map +1 -0
  106. package/package.json +99 -2
  107. package/dist/run-crew-CKdBjh5P.js.map +0 -1
  108. package/dist/runtime-D25ehzCj.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolds-ekPIlBeU.js","names":["parseJsonObject","isRecord","rawOutputsForRequest","parseJsonObject","parseJsonValue","finishMetadata","numberField","emitFallbackEvent","stringifyErr","_mapProfileToNegotiatedCapabilities","DEFAULT_BASE_URL","rawOutputsForRequest","finishMetadata","parseJsonObject","isRecord","numberField","stringifyErr","isRecord","stringifyErr","_mapProfileToNegotiatedCapabilities"],"sources":["../src/providers/multimodal.ts","../src/providers/no-public-url.ts","../src/tracing/tracing.ts","../src/sanitizers/sanitizers.ts","../src/providers/sse.ts","../src/providers/adapters.ts","../src/providers/anthropic.ts","../src/providers/fake.ts","../src/providers/gemini.ts","../src/providers/litellm.ts","../src/providers/lm-studio.ts","../src/providers/openrouter.ts","../src/providers/xai.ts","../src/providers/streaming.ts","../src/prompts/scaffolds.ts"],"sourcesContent":["import type { ArtifactInput } from \"../artifacts/artifact.js\";\nimport type { ProviderPackagedArtifactPlan } from \"../plan/plan.js\";\nimport type { ProviderRunRequest } from \"./provider.js\";\n\nexport function packagedPlanForArtifact(\n request: ProviderRunRequest,\n artifactId: string,\n): ProviderPackagedArtifactPlan | undefined {\n return request.providerPackaging?.artifacts.find((item) => item.artifactId === artifactId) ??\n request.plan?.providerPackaging?.artifacts.find((item) => item.artifactId === artifactId);\n}\n\nexport function metadataString(\n artifact: ArtifactInput,\n keys: readonly string[],\n): string | undefined {\n const metadata = artifact.metadata;\n if (metadata === undefined) {\n return undefined;\n }\n\n for (const key of keys) {\n const value = metadata[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nexport function artifactHttpUrl(artifact: ArtifactInput): string | undefined {\n if (isHttpUrl(artifact.value)) {\n return artifact.value;\n }\n\n const url = metadataString(artifact, [\"url\"]);\n return isHttpUrl(url) ? url : undefined;\n}\n\nexport function anthropicFileId(artifact: ArtifactInput): string | undefined {\n return metadataString(artifact, [\"anthropicFileId\", \"providerFileId\", \"fileId\"]);\n}\n\nexport function geminiFileUri(artifact: ArtifactInput): string | undefined {\n return metadataString(artifact, [\"geminiFileUri\", \"providerFileUri\", \"fileUri\"]);\n}\n\nexport function mediaTypeForArtifact(\n artifact: ArtifactInput,\n fallback: string,\n): string {\n if (artifact.mediaType !== undefined) {\n return artifact.mediaType;\n }\n\n if (typeof artifact.value === \"string\") {\n const dataUrl = parseDataUrl(artifact.value);\n if (dataUrl?.mediaType !== undefined) {\n return dataUrl.mediaType;\n }\n }\n\n return fallback;\n}\n\nexport async function artifactBase64Data(\n artifact: ArtifactInput,\n): Promise<string | undefined> {\n const metadataData = metadataString(artifact, [\"base64Data\"]);\n if (metadataData !== undefined) {\n return metadataData;\n }\n\n const value = artifact.value;\n if (typeof value === \"string\") {\n const dataUrl = parseDataUrl(value);\n if (dataUrl !== undefined) {\n return dataUrl.data;\n }\n\n if (artifact.metadata?.encoding === \"base64\") {\n return value;\n }\n }\n\n if (isBlobLike(value)) {\n return bufferToBase64(await value.arrayBuffer());\n }\n\n if (value instanceof ArrayBuffer) {\n return bufferToBase64(value);\n }\n\n if (ArrayBuffer.isView(value)) {\n return Buffer.from(value.buffer, value.byteOffset, value.byteLength).toString(\"base64\");\n }\n\n return undefined;\n}\n\nexport function parseDataUrl(value: string): {\n readonly mediaType?: string;\n readonly data: string;\n} | undefined {\n const match = /^data:([^;,]+)?;base64,(.*)$/su.exec(value);\n if (match === null) {\n return undefined;\n }\n\n const mediaType = match[1];\n const data = match[2] ?? \"\";\n\n return {\n ...(mediaType !== undefined && mediaType.length > 0 ? { mediaType } : {}),\n data,\n };\n}\n\nfunction bufferToBase64(value: ArrayBuffer): string {\n return Buffer.from(value).toString(\"base64\");\n}\n\nexport function isHttpUrl(value: unknown): value is string {\n if (typeof value !== \"string\") {\n return false;\n }\n\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction isBlobLike(value: unknown): value is Blob {\n return typeof Blob !== \"undefined\" && value instanceof Blob;\n}\n","import type { PolicySpec } from \"../policy/policy.js\";\nimport type { ProviderRunRequest } from \"./provider.js\";\nimport { isHttpUrl } from \"./multimodal.js\";\n\n/**\n * Thrown when a run with `policy.noPublicUrl: true` is about to dispatch a\n * request whose serialized body still contains a public http(s) URL derived\n * from `request.artifacts` (value or string metadata entry).\n *\n * This is the single shared egress error class for all three adapter families\n * (OpenAI-compatible, Anthropic, Gemini). Callers may `instanceof`-check it.\n */\nexport class NoPublicUrlEgressError extends Error {\n constructor(\n readonly providerId: string,\n readonly artifactId: string,\n readonly offendingUrl: string,\n ) {\n super(\n `noPublicUrl policy violated: provider '${providerId}' artifact '${artifactId}' would leak public URL '${offendingUrl}'`,\n );\n this.name = \"NoPublicUrlEgressError\";\n // Maintain correct prototype chain in environments that transpile classes.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Shared egress assertion called immediately before every run-request `fetch`.\n *\n * When `policy.noPublicUrl` is not `true` this function is a zero-cost no-op.\n *\n * When the policy IS active it builds a forbidden-URL set from ARTIFACT-DERIVED\n * sources only:\n * - `artifact.value` (if it is a string and `isHttpUrl(value)` is true)\n * - Every `string` value inside `artifact.metadata` (if `isHttpUrl(v)` is true)\n *\n * URLs in `policy.gateway.metadata` are NOT artifact-derived and are therefore\n * NOT in scope. They are naturally excluded because they never appear in\n * `request.artifacts`.\n *\n * A URL is considered \"leaked\" only if the string is present in `serializedBody`.\n * If packaging already replaced the URL with a `data:` URL, `serializedBody`\n * will not contain the original http(s) URL and this function will not throw.\n * `data:` URLs are never forbidden because `isHttpUrl` rejects the `data:` scheme.\n *\n * @throws {NoPublicUrlEgressError} if any forbidden URL appears in `serializedBody`\n */\nexport function assertNoPublicUrlEgress(\n request: ProviderRunRequest,\n providerId: string,\n serializedBody: string,\n): void {\n const policy = request.policy as PolicySpec | undefined;\n if (policy?.noPublicUrl !== true) {\n return;\n }\n\n const forbidden: Array<{ url: string; id: string }> = [];\n\n for (const artifact of request.artifacts) {\n const artifactId = (artifact.id as string | undefined) ?? \"\";\n\n // Check artifact.value\n if (typeof artifact.value === \"string\" && isHttpUrl(artifact.value)) {\n forbidden.push({ url: artifact.value, id: artifactId });\n }\n\n // Check all string metadata values\n const metadata = artifact.metadata ?? {};\n for (const v of Object.values(metadata)) {\n if (typeof v === \"string\" && isHttpUrl(v)) {\n forbidden.push({ url: v, id: artifactId });\n }\n }\n }\n\n for (const entry of forbidden) {\n if (serializedBody.includes(entry.url)) {\n throw new NoPublicUrlEgressError(providerId, entry.id, entry.url);\n }\n }\n}\n","export interface TracerLike {\n readonly kind: \"tracer\";\n readonly span?: <T>(\n name: string,\n fn: () => T | Promise<T>,\n attributes?: Record<string, unknown>,\n ) => T | Promise<T>;\n readonly event?: (name: string, attributes?: Record<string, unknown>) => void;\n}\n\nexport type RunEventKind =\n | \"run.start\"\n | \"artifact.ingested\"\n | \"context.packed\"\n | \"router.candidates\"\n | \"stage.start\"\n | \"stage.complete\"\n | \"provider.attempt\"\n | \"stream.start\"\n | \"stream.complete\"\n | \"stream.failed\"\n | \"fallback.activated\"\n | \"validation.complete\"\n | \"validation.failed\"\n | \"artifact.created\"\n | \"run.complete\"\n | \"run.failed\"\n | \"tool.call\"\n | \"replay.offline\"\n | \"replay.live\"\n | \"step.transition\"\n // Phase 20 (v1.2): recovery / eviction-resume markers paired with the\n // AgentHost storage seam + SurvivabilityAdapter. Closes TRACE-EXT-01.\n | \"recovery.start\"\n | \"recovery.complete\"\n | \"recovery.failed\"\n // Phase 34 (v1.3): capability-negotiation fallback marker. Fires when\n // adapter.negotiateCapabilities() falls back from /models to the static\n // Phase 33 registry due to transient (5xx, network, timeout) failure.\n // Auth errors (401, 403) do NOT fire this event -- they throw\n // NegotiationAuthError instead.\n | \"capabilities.negotiation.fallback\";\n\nexport interface RunEvent {\n readonly kind: RunEventKind;\n readonly timestamp: string;\n readonly runId: string;\n readonly planId?: string;\n readonly stageId?: string;\n readonly providerId?: string;\n readonly modelId?: string;\n readonly artifactId?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\nexport type RunEventSink = (event: RunEvent) => void | Promise<void>;\n\nexport function createRunEvent(\n kind: RunEventKind,\n input: Omit<RunEvent, \"kind\" | \"timestamp\">,\n): RunEvent {\n return {\n kind,\n timestamp: new Date().toISOString(),\n ...input,\n };\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\nexport interface SanitizerContext {\n readonly providerId: string;\n readonly modelId?: string;\n readonly outputName: string;\n}\n\nexport type SanitizerFn = (\n text: string,\n context: SanitizerContext,\n) => string | Promise<string>;\n\nexport type SanitizeOutputOption = SanitizerFn | readonly SanitizerFn[];\n\nexport interface InternalEnvelopeOptions {\n readonly field?: string;\n readonly path?: string;\n readonly schema?: StandardSchemaV1;\n}\n\ntype ParsedEnvelopeOptions =\n | { readonly kind: \"path\"; readonly path: readonly string[]; readonly schema?: StandardSchemaV1 }\n | { readonly kind: \"schema\"; readonly schema: StandardSchemaV1 };\n\nexport async function applyOutputSanitizers(\n rawOutputs: Record<string, unknown>,\n sanitizeOutput: SanitizeOutputOption | undefined,\n context: Omit<SanitizerContext, \"outputName\">,\n): Promise<Record<string, unknown>> {\n if (sanitizeOutput === undefined) return rawOutputs;\n\n const sanitizers = Array.isArray(sanitizeOutput) ? sanitizeOutput : [sanitizeOutput];\n const sanitizedEntries = await Promise.all(\n Object.entries(rawOutputs).map(async ([outputName, value]) => {\n if (typeof value !== \"string\") {\n return [outputName, value] as const;\n }\n\n let sanitized = value;\n const sanitizerContext: SanitizerContext = {\n ...context,\n outputName,\n };\n for (const sanitizer of sanitizers) {\n sanitized = await sanitizer(sanitized, sanitizerContext);\n }\n return [outputName, sanitized] as const;\n }),\n );\n\n return Object.fromEntries(sanitizedEntries);\n}\n\nexport function stripReasoningTags(): SanitizerFn {\n return (text) => {\n let next = text;\n\n next = next.replace(\n /^\\s*(?:reasoning|analysis|scratchpad)\\s*:\\s*(?:.|\\n)*?(?:\\n\\s*(?:final|answer)\\s*:\\s*)/iu,\n \"\",\n );\n next = stripDelimitedBlock(next, \"think\");\n next = stripDelimitedBlock(next, \"reasoning\");\n next = stripDelimitedBlock(next, \"scratchpad\");\n\n return next === text ? text : next.trim();\n };\n}\n\nexport function stripChatTemplateArtifacts(): SanitizerFn {\n return (text) => {\n let next = text;\n\n next = next.replace(/<\\|im_start\\|>\\s*(?:system|user|assistant)?\\s*/giu, \"\");\n next = next.replace(/\\s*<\\|im_end\\|>/giu, \"\");\n next = next.replace(/\\[\\/?INST\\]/giu, \"\");\n next = next.replace(/<<SYS>>|<<\\/SYS>>/giu, \"\");\n next = next.replace(/^\\s*(?:system|user|assistant)\\s*:\\s*/iu, \"\");\n\n return next === text ? text : next.trim();\n };\n}\n\nexport function unwrapInternalEnvelope(\n schemaOrPath: string | InternalEnvelopeOptions | StandardSchemaV1,\n): SanitizerFn {\n const options = parseEnvelopeOptions(schemaOrPath);\n\n return async (text) => {\n const parsed = parseJsonObject(text);\n if (parsed === undefined) return text;\n\n if (options.schema !== undefined) {\n const validation = await validateSchema(options.schema, parsed);\n if (!validation.ok) return text;\n }\n\n const value = options.kind === \"path\"\n ? getPathValue(parsed, options.path)\n : findOnlyStringField(parsed);\n\n return typeof value === \"string\" ? value : text;\n };\n}\n\nfunction stripDelimitedBlock(text: string, tag: string): string {\n const pattern = new RegExp(`<${tag}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/${tag}>`, \"giu\");\n return text.replace(pattern, \"\");\n}\n\nfunction parseEnvelopeOptions(\n schemaOrPath: string | InternalEnvelopeOptions | StandardSchemaV1,\n): ParsedEnvelopeOptions {\n if (typeof schemaOrPath === \"string\") {\n return { kind: \"path\", path: splitPath(schemaOrPath) };\n }\n\n if (isStandardSchema(schemaOrPath)) {\n return { kind: \"schema\", schema: schemaOrPath };\n }\n\n const path = schemaOrPath.path ?? schemaOrPath.field;\n if (path !== undefined) {\n return {\n kind: \"path\",\n path: splitPath(path),\n ...(schemaOrPath.schema !== undefined ? { schema: schemaOrPath.schema } : {}),\n };\n }\n\n if (schemaOrPath.schema !== undefined) {\n return { kind: \"schema\", schema: schemaOrPath.schema };\n }\n\n return { kind: \"path\", path: [] };\n}\n\nfunction splitPath(path: string): readonly string[] {\n return path.split(\".\").map((part) => part.trim()).filter(Boolean);\n}\n\nfunction parseJsonObject(text: string): Record<string, unknown> | undefined {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return undefined;\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return undefined;\n }\n\n return parsed as Record<string, unknown>;\n}\n\nfunction getPathValue(\n value: Record<string, unknown>,\n path: readonly string[],\n): unknown {\n if (path.length === 0) return undefined;\n\n let current: unknown = value;\n for (const segment of path) {\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) {\n return undefined;\n }\n\n if (!Object.prototype.hasOwnProperty.call(current, segment)) {\n return undefined;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n\nfunction findOnlyStringField(value: Record<string, unknown>): string | undefined {\n const stringValues = Object.values(value).filter((field): field is string => typeof field === \"string\");\n return stringValues.length === 1 ? stringValues[0] : undefined;\n}\n\nasync function validateSchema(\n schema: StandardSchemaV1,\n value: unknown,\n): Promise<{ readonly ok: true } | { readonly ok: false }> {\n const result = schema[\"~standard\"].validate(value);\n const resolved = result instanceof Promise ? await result : result;\n return \"issues\" in resolved ? { ok: false } : { ok: true };\n}\n\nfunction isStandardSchema(value: unknown): value is StandardSchemaV1 {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"~standard\" in value &&\n typeof (value as { readonly \"~standard\"?: { readonly validate?: unknown } })[\"~standard\"]\n ?.validate === \"function\"\n );\n}\n","export interface SseEvent {\n readonly event?: string;\n readonly data: string;\n}\n\nexport async function* readSseEvents(response: Response): AsyncIterable<SseEvent> {\n if (response.body === null) {\n yield* parseFrames(await response.text(), true).events;\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseFrames(buffer, false);\n buffer = parsed.remaining;\n yield* parsed.events;\n }\n } finally {\n reader.releaseLock();\n }\n\n buffer += decoder.decode();\n const parsed = parseFrames(buffer, true);\n yield* parsed.events;\n}\n\nfunction parseFrames(\n input: string,\n flush: boolean,\n): { readonly events: readonly SseEvent[]; readonly remaining: string } {\n const events: SseEvent[] = [];\n let remaining = input;\n\n while (true) {\n const match = /\\r?\\n\\r?\\n/u.exec(remaining);\n if (match?.index === undefined) {\n break;\n }\n const frame = remaining.slice(0, match.index);\n remaining = remaining.slice(match.index + match[0].length);\n const event = parseFrame(frame);\n if (event !== undefined) {\n events.push(event);\n }\n }\n\n if (flush && remaining.trim().length > 0) {\n const event = parseFrame(remaining);\n if (event !== undefined) {\n events.push(event);\n }\n remaining = \"\";\n }\n\n return { events, remaining };\n}\n\nfunction parseFrame(frame: string): SseEvent | undefined {\n const data: string[] = [];\n let event: string | undefined;\n\n for (const line of frame.split(/\\r?\\n/u)) {\n if (line.length === 0 || line.startsWith(\":\")) {\n continue;\n }\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n const rawValue = separator === -1 ? \"\" : line.slice(separator + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n event = value;\n } else if (field === \"data\") {\n data.push(value);\n }\n }\n\n if (data.length === 0) {\n return undefined;\n }\n\n return {\n ...(event !== undefined ? { event } : {}),\n data: data.join(\"\\n\"),\n };\n}\n","import type { UsageRecord } from \"../plan/plan.js\";\nimport type { GatewayMetadataValue, GatewayPolicy } from \"../policy/policy.js\";\nimport type {\n ProviderAdapter,\n ProviderFinishMetadata,\n ProviderRunRequest,\n ProviderRunResponse,\n ProviderStream,\n ProviderStructuredOutputRequest,\n ProviderToolChoice,\n ProviderToolDefinition,\n Usage,\n} from \"./provider.js\";\nimport { defaultCapabilityForProvider } from \"../routing/catalog.js\";\nimport type { OpenAIQuirks, OpenAICompatQuirks } from \"./quirks.js\";\nimport type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport {\n NegotiationAuthError,\n synthesizeNegotiatedCapabilitiesFromRegistry,\n _mapProfileToNegotiatedCapabilities,\n} from \"../capabilities/negotiate.js\";\nimport { getCapabilityProfile } from \"../capabilities/lookup.js\";\nimport type { CapabilityAdapter } from \"../capabilities/profile.js\";\nimport type { RunEventSink } from \"../tracing/tracing.js\";\nimport { createRunEvent } from \"../tracing/tracing.js\";\nimport { parseToolUseEnvelope, type ToolUseRequest } from \"../tools/tool-use.js\";\nimport { standardSchemaToJsonSchema } from \"../tools/schema.js\";\nimport {\n validateToolCallRequests,\n type ValidateToolCallsOption,\n} from \"../tools/tool-call-validation.js\";\nimport {\n applyOutputSanitizers,\n type SanitizeOutputOption,\n} from \"../sanitizers/index.js\";\nimport { readSseEvents } from \"./sse.js\";\nimport { isHttpUrl } from \"./multimodal.js\";\nimport { assertNoPublicUrlEgress } from \"./no-public-url.js\";\n\nexport interface OpenAICompatibleProviderOptions {\n readonly id?: string;\n readonly model: string;\n readonly baseUrl: string;\n readonly apiKey?: string;\n readonly gateway?: GatewayPolicy;\n readonly fetch?: typeof fetch;\n /**\n * Phase 7 addition: caller-supplied per-1k pricing. When provided, the\n * adapter computes `normalizedUsage.costUsd` from the API-reported token\n * counts. When omitted, `normalizedUsage.costUsd` is `null` so downstream\n * consumers can distinguish \"unmeasured\" from \"free\" (per 07-CONTEXT.md).\n */\n readonly pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n };\n /**\n * Phase 34 — D-05/D-06/D-08 — TTL for the per-instance models cache.\n * Default 300_000ms (5 minutes). Set to 0 to disable caching.\n * Set to Infinity for process-lifetime caching.\n *\n * NOTE: for createOpenAICompatibleProvider, this option is accepted for\n * option-bag uniformity but is NOT USED — openai-compat has no /models\n * endpoint (D-04). Document in JSDoc for consumers pointing at known servers.\n */\n readonly modelsCacheTtlMs?: number;\n /**\n * Phase 34 — D-11 — Number of retry attempts on transient /models errors\n * (5xx, network, timeout). Default 2. Set to 0 to disable retries.\n *\n * NOTE: for createOpenAICompatibleProvider, this option is accepted for\n * option-bag uniformity but is NOT USED — openai-compat has no /models\n * endpoint (D-04).\n */\n readonly modelsRetryCount?: number;\n /**\n * Phase 34 — D-12 — Optional RunEventSink for capability negotiation events.\n * When provided, emits the \"capabilities.negotiation.fallback\" event on\n * transient /models errors (5xx, network, timeout).\n *\n * NOTE: for createOpenAICompatibleProvider, this option is accepted for\n * option-bag uniformity but the event is NOT FIRED for source: \"registry\"\n * (the documented happy path for openai-compat). Emitting events for the\n * intentional no-endpoint path would produce noisy false-positives.\n */\n readonly runEventSink?: RunEventSink;\n /**\n * Phase 36 — Optional output sanitizer pipeline. When provided, string\n * rawOutputs are transformed in order after provider text extraction and\n * before the adapter returns.\n */\n readonly sanitizeOutput?: SanitizeOutputOption;\n /**\n * Phase 37 — Optional returned tool-call validator. When provided, the\n * adapter parses prompt-reencoded tool_calls envelopes and returns\n * normalized validated calls without mutating rawOutputs or rawResponse.\n */\n readonly validateToolCalls?: ValidateToolCallsOption;\n}\n\nexport interface SdkLikeProviderOptions {\n readonly id?: string;\n readonly model: string;\n readonly generate: (input: {\n readonly task: string;\n readonly outputNames: readonly string[];\n }) => Promise<ProviderRunResponse> | ProviderRunResponse;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isGatewayMetadataValue(value: unknown): value is GatewayMetadataValue {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isGatewayMetadataValue);\n }\n if (isRecord(value)) {\n return Object.values(value).every(isGatewayMetadataValue);\n }\n\n return false;\n}\n\nfunction isSecretMetadataKey(key: string): boolean {\n return /api[-_]?key|authorization|headers?|secret|token|password/iu.test(key);\n}\n\nfunction isSecretMetadataValue(value: GatewayMetadataValue): boolean {\n if (typeof value === \"string\") {\n return /^sk-[\\w-]+/u.test(value);\n }\n if (Array.isArray(value)) {\n return value.some(isSecretMetadataValue);\n }\n if (typeof value === \"object\" && value !== null) {\n return Object.entries(value).some(([key, nested]) => (\n isSecretMetadataKey(key) || isSecretMetadataValue(nested)\n ));\n }\n\n return false;\n}\n\nfunction sanitizeGatewayMetadata(\n metadata: Record<string, GatewayMetadataValue> | undefined,\n): Record<string, GatewayMetadataValue> | undefined {\n if (metadata === undefined) {\n return undefined;\n }\n\n const sanitized = Object.fromEntries(\n Object.entries(metadata).filter(([key, value]) => (\n !isSecretMetadataKey(key) && !isSecretMetadataValue(value)\n )),\n );\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nfunction normalizeGatewayPolicy(value: unknown): GatewayPolicy {\n if (!isRecord(value)) {\n return {};\n }\n\n const routeTags = Array.isArray(value.routeTags)\n ? value.routeTags.filter((tag): tag is string => typeof tag === \"string\")\n : undefined;\n const providerPreferences = Array.isArray(value.providerPreferences)\n ? value.providerPreferences.filter((provider): provider is string => typeof provider === \"string\")\n : undefined;\n const gatewayMetadata: Record<string, GatewayMetadataValue> = {};\n if (isRecord(value.metadata)) {\n for (const [key, metadataValue] of Object.entries(value.metadata)) {\n if (isGatewayMetadataValue(metadataValue)) {\n gatewayMetadata[key] = metadataValue;\n }\n }\n }\n const metadata = Object.keys(gatewayMetadata).length > 0\n ? sanitizeGatewayMetadata(gatewayMetadata)\n : undefined;\n const allowFallbacks = typeof value.allowFallbacks === \"boolean\"\n ? value.allowFallbacks\n : undefined;\n\n return {\n ...(routeTags !== undefined ? { routeTags } : {}),\n ...(providerPreferences !== undefined ? { providerPreferences } : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n ...(allowFallbacks !== undefined ? { allowFallbacks } : {}),\n };\n}\n\nfunction readGatewayPolicy(policy: unknown): GatewayPolicy | undefined {\n if (!isRecord(policy) || !isRecord(policy.gateway)) {\n return undefined;\n }\n\n return normalizeGatewayPolicy(policy.gateway);\n}\n\nfunction mergeGatewayPolicy(\n providerGateway: GatewayPolicy | undefined,\n requestGateway: GatewayPolicy | undefined,\n): GatewayPolicy | undefined {\n if (providerGateway === undefined && requestGateway === undefined) {\n return undefined;\n }\n\n const providerMetadata = sanitizeGatewayMetadata(providerGateway?.metadata);\n const requestMetadata = sanitizeGatewayMetadata(requestGateway?.metadata);\n const metadata = {\n ...(providerMetadata ?? {}),\n ...(requestMetadata ?? {}),\n };\n\n return {\n routeTags: [\n ...(providerGateway?.routeTags ?? []),\n ...(requestGateway?.routeTags ?? []),\n ],\n providerPreferences: [\n ...(providerGateway?.providerPreferences ?? []),\n ...(requestGateway?.providerPreferences ?? []),\n ],\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n ...(requestGateway?.allowFallbacks !== undefined\n ? { allowFallbacks: requestGateway.allowFallbacks }\n : providerGateway?.allowFallbacks !== undefined\n ? { allowFallbacks: providerGateway.allowFallbacks }\n : {}),\n };\n}\n\nfunction gatewayPolicyToMetadata(\n policy: GatewayPolicy | undefined,\n): Record<string, unknown> | undefined {\n if (policy === undefined) {\n return undefined;\n }\n\n const metadata: Record<string, unknown> = {\n ...(sanitizeGatewayMetadata(policy.metadata) ?? {}),\n };\n const latticeGateway: Record<string, unknown> = {};\n\n if (policy.routeTags !== undefined && policy.routeTags.length > 0) {\n latticeGateway.route_tags = [...policy.routeTags];\n }\n if (policy.providerPreferences !== undefined && policy.providerPreferences.length > 0) {\n latticeGateway.provider_preferences = [...policy.providerPreferences];\n }\n if (policy.allowFallbacks !== undefined) {\n latticeGateway.allow_fallbacks = policy.allowFallbacks;\n }\n if (Object.keys(latticeGateway).length > 0) {\n metadata.lattice_gateway = latticeGateway;\n }\n\n return Object.keys(metadata).length > 0 ? metadata : undefined;\n}\n\nfunction sanitizedGatewayPolicyForPlan(\n policy: GatewayPolicy | undefined,\n): Record<string, unknown> | undefined {\n if (policy === undefined) {\n return undefined;\n }\n\n const metadata = sanitizeGatewayMetadata(policy.metadata);\n\n return {\n ...(policy.routeTags !== undefined && policy.routeTags.length > 0\n ? { routeTags: [...policy.routeTags] }\n : {}),\n ...(policy.providerPreferences !== undefined && policy.providerPreferences.length > 0\n ? { providerPreferences: [...policy.providerPreferences] }\n : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n ...(policy.allowFallbacks !== undefined ? { allowFallbacks: policy.allowFallbacks } : {}),\n };\n}\n\nfunction observedModelFromResponse(body: unknown): string | undefined {\n if (!isRecord(body)) {\n return undefined;\n }\n const model = body.model;\n\n return typeof model === \"string\" ? model : undefined;\n}\n\nfunction createOpenAICompatibleRequestBody(input: {\n readonly model: string;\n readonly request: ProviderRunRequest;\n readonly metadata?: Record<string, unknown>;\n readonly stream?: boolean;\n}): Record<string, unknown> {\n const nativeTools = openAIToolDefinitions(input.request.nativeTools);\n const nativeToolChoice = openAIToolChoice(input.request.nativeToolChoice);\n const responseFormat = openAIResponseFormat(input.request.nativeStructuredOutput);\n\n return {\n model: input.model,\n ...(input.metadata !== undefined ? { metadata: input.metadata } : {}),\n messages: [\n {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: input.request.task,\n },\n {\n type: \"text\",\n text: JSON.stringify({\n contextPack: input.request.contextPack === undefined\n ? undefined\n : {\n id: input.request.contextPack.id,\n tokenBudget: input.request.contextPack.tokenBudget,\n estimatedTokens: input.request.contextPack.estimatedTokens,\n included: input.request.contextPack.included,\n summarized: input.request.contextPack.summarized,\n archived: input.request.contextPack.archived,\n omitted: input.request.contextPack.omitted,\n warnings: input.request.contextPack.warnings,\n },\n }),\n },\n ...input.request.artifacts.map((inputArtifact) => {\n const resolvedTransport =\n input.request.providerPackaging?.artifacts.find(\n (item) => item.artifactId === inputArtifact.id,\n )?.transport ??\n input.request.plan?.providerPackaging?.artifacts.find(\n (item) => item.artifactId === inputArtifact.id,\n )?.transport;\n\n return {\n type: \"text\",\n text: JSON.stringify({\n artifactId: inputArtifact.id,\n kind: inputArtifact.kind,\n mediaType: inputArtifact.mediaType,\n privacy: inputArtifact.privacy,\n transport: resolvedTransport,\n value:\n typeof inputArtifact.value === \"string\" &&\n inputArtifact.kind !== \"url\" &&\n !(isHttpUrl(inputArtifact.value) && resolvedTransport !== \"url\")\n ? inputArtifact.value\n : undefined,\n url:\n inputArtifact.kind === \"url\" &&\n typeof inputArtifact.value === \"string\" &&\n resolvedTransport === \"url\"\n ? inputArtifact.value\n : undefined,\n }),\n };\n }),\n ],\n },\n ],\n ...(input.stream === true ? { stream: true, stream_options: { include_usage: true } } : {}),\n ...(nativeTools.length > 0 ? { tools: nativeTools } : {}),\n ...(nativeToolChoice !== undefined ? { tool_choice: nativeToolChoice } : {}),\n ...(responseFormat !== undefined ? { response_format: responseFormat } : {}),\n };\n}\n\nfunction openAIToolDefinitions(\n tools: readonly ProviderToolDefinition[] | undefined,\n): readonly Record<string, unknown>[] {\n return (tools ?? []).map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n ...(tool.description !== undefined ? { description: tool.description } : {}),\n parameters: standardSchemaToJsonSchema(tool.inputSchema),\n },\n }));\n}\n\nfunction openAIToolChoice(choice: ProviderToolChoice | undefined): unknown {\n if (choice === undefined) {\n return undefined;\n }\n if (choice === \"auto\" || choice === \"none\" || choice === \"required\") {\n return choice;\n }\n\n return {\n type: \"function\",\n function: { name: choice.name },\n };\n}\n\nfunction openAIResponseFormat(\n request: ProviderStructuredOutputRequest | undefined,\n): Record<string, unknown> | undefined {\n if (request === undefined) {\n return undefined;\n }\n\n return {\n type: \"json_schema\",\n json_schema: {\n name: request.name ?? request.output,\n schema: standardSchemaToJsonSchema(request.schema),\n strict: request.strict ?? true,\n },\n };\n}\n\n/**\n * Phase 34 — D-04 / QUIRK-02 — OpenAI-compatible provider factory.\n *\n * This factory is the prototypical \"intentional no remote /models endpoint\"\n * adapter per D-04. The consumer points this adapter at any OpenAI-shaped\n * endpoint (vLLM, TGI, Ollama, custom), and the factory returns conservative\n * defaults for the quirks block because the server could be anything.\n *\n * The `negotiateCapabilities` method performs NO fetch; it returns\n * synthesizeNegotiatedCapabilitiesFromRegistry with source: \"registry\"\n * (the intentional-no-endpoint signal, as distinct from \"registry-fallback\"\n * which signals a transient failure). Plan 34-05 (LM Studio) reuses this\n * same pattern.\n *\n * D-04 citation: \"consumer adapters without a /models endpoint skip the\n * fetch layer entirely and delegate to synthesizeNegotiatedCapabilitiesFromRegistry.\"\n */\nexport function createOpenAICompatibleProvider(\n options: OpenAICompatibleProviderOptions,\n): ProviderAdapter & {\n readonly quirks: OpenAICompatQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const id = options.id ?? \"openai-compatible\";\n const fetchImpl = options.fetch ?? fetch;\n const baseUrl = options.baseUrl.replace(/\\/$/u, \"\");\n\n // Phase 34 — D-04 — OpenAI-compat negotiate() is registry-only (no fetch,\n // no cache, no inflight). Source: \"registry\" signals intentional no-endpoint.\n const negotiate = async (modelId: string): Promise<NegotiatedCapabilities> => {\n const adapterId = (id) as CapabilityAdapter;\n // No fetch; no cache; no inflight coalescing. Direct synthesis from registry per D-04.\n // Source: \"registry\" signals intentional no-endpoint (vs \"registry-fallback\"\n // which signals a transient failure we couldn't recover from).\n return synthesizeNegotiatedCapabilitiesFromRegistry(adapterId, modelId, \"registry\");\n };\n\n return {\n id,\n kind: \"provider-adapter\",\n // Phase 34 — QUIRK-02 / OpenAICompatQuirks — conservative defaults.\n // openai-compat servers (vLLM, TGI, Ollama, custom) vary widely in which\n // response_format and tool_choice features they implement. Defaults are\n // conservatively false except streamingDiverges which is true because\n // self-hosted servers often have subtle streaming differences.\n quirks: {\n supportsToolChoice: false,\n parallelToolCalls: false,\n structuredOutputs: false,\n responseFormatHonored: false,\n streamingDiverges: true,\n } satisfies OpenAICompatQuirks,\n negotiateCapabilities: negotiate,\n capabilities: [\n {\n ...defaultCapabilityForProvider(id),\n modelId: options.model,\n fileTransport: [\"inline\", \"json\", \"url\", \"base64\", \"extracted-text\", \"transcript\"],\n streaming: true,\n },\n ],\n async execute(request) {\n const mergedGatewayPolicy = mergeGatewayPolicy(\n options.gateway,\n readGatewayPolicy(request.policy),\n );\n const metadata = gatewayPolicyToMetadata(mergedGatewayPolicy);\n const bodyStr = JSON.stringify(createOpenAICompatibleRequestBody({\n model: options.model,\n request,\n ...(metadata !== undefined ? { metadata } : {}),\n }));\n assertNoPublicUrlEgress(request, id, bodyStr);\n const init: RequestInit = {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(options.apiKey !== undefined ? { authorization: `Bearer ${options.apiKey}` } : {}),\n },\n body: bodyStr,\n ...(request.signal !== undefined ? { signal: request.signal } : {}),\n };\n const response = await fetchImpl(`${baseUrl}/chat/completions`, init);\n\n if (!response.ok) {\n throw new Error(`OpenAI-compatible provider failed with ${response.status}.`);\n }\n\n const body = await response.json() as {\n choices?: readonly Record<string, unknown>[];\n model?: unknown;\n usage?: unknown;\n };\n const observedModel = observedModelFromResponse(body);\n const choice = firstOpenAIChoice(body);\n const message = openAIMessageFromChoice(choice);\n const text = openAIMessageText(message);\n const structuredOutput = openAIStructuredOutputValue(\n request.nativeStructuredOutput,\n message,\n text,\n );\n const rawOutputs = rawOutputsForRequest({\n outputs: request.outputs,\n text,\n structuredOutputRequest: request.nativeStructuredOutput,\n structuredOutput,\n });\n const sanitizedOutputs = await applyOutputSanitizers(rawOutputs, options.sanitizeOutput, {\n providerId: id,\n modelId: options.model,\n });\n const parsedToolCalls = parseToolUseEnvelope(text);\n const promptToolCalls = parsedToolCalls === null\n ? undefined\n : await validateToolCallRequests(parsedToolCalls, options.validateToolCalls);\n const nativeToolRequests = openAIToolUseRequestsFromMessage(message);\n const nativeToolCalls = nativeToolRequests.length === 0\n ? undefined\n : await validateToolCallRequests(nativeToolRequests, options.validateToolCalls);\n const hasToolCallResult = promptToolCalls !== undefined || nativeToolCalls !== undefined;\n const toolCalls = [\n ...(promptToolCalls ?? []),\n ...(nativeToolCalls ?? []),\n ];\n const usage = normalizeUsage(body.usage);\n const normalizedUsage = normalizeUsageToRunUsage(body.usage, options.pricing);\n const sanitizedGatewayPolicy = sanitizedGatewayPolicyForPlan(mergedGatewayPolicy);\n const gateway = id === \"litellm\" || mergedGatewayPolicy !== undefined\n ? {\n used: true,\n requestedModel: options.model,\n ...(observedModel !== undefined ? { observedModel } : {}),\n ...(sanitizedGatewayPolicy !== undefined ? { policy: sanitizedGatewayPolicy } : {}),\n }\n : undefined;\n\n const finish = openAIFinishMetadata(choice, toolCalls);\n\n return {\n rawOutputs: sanitizedOutputs,\n ...(usage !== undefined ? { usage } : {}),\n normalizedUsage,\n ...(hasToolCallResult ? { toolCalls } : {}),\n ...(gateway !== undefined ? { gateway } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: body,\n };\n },\n executeStream(request) {\n return streamOpenAICompatibleResponse({\n id,\n model: options.model,\n baseUrl,\n fetchImpl,\n request,\n ...(options.apiKey !== undefined ? { apiKey: options.apiKey } : {}),\n ...(options.gateway !== undefined ? { providerGateway: options.gateway } : {}),\n ...(options.pricing !== undefined ? { pricing: options.pricing } : {}),\n ...(options.sanitizeOutput !== undefined ? { sanitizeOutput: options.sanitizeOutput } : {}),\n ...(options.validateToolCalls !== undefined\n ? { validateToolCalls: options.validateToolCalls }\n : {}),\n });\n },\n };\n}\n\nasync function* streamOpenAICompatibleResponse(input: {\n readonly id: string;\n readonly model: string;\n readonly baseUrl: string;\n readonly apiKey?: string;\n readonly fetchImpl: typeof fetch;\n readonly request: ProviderRunRequest;\n readonly providerGateway?: GatewayPolicy;\n readonly pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n };\n readonly sanitizeOutput?: SanitizeOutputOption;\n readonly validateToolCalls?: ValidateToolCallsOption;\n}): ProviderStream {\n const mergedGatewayPolicy = mergeGatewayPolicy(\n input.providerGateway,\n readGatewayPolicy(input.request.policy),\n );\n const metadata = gatewayPolicyToMetadata(mergedGatewayPolicy);\n const streamBodyStr = JSON.stringify(createOpenAICompatibleRequestBody({\n model: input.model,\n request: input.request,\n ...(metadata !== undefined ? { metadata } : {}),\n stream: true,\n }));\n assertNoPublicUrlEgress(input.request, input.id, streamBodyStr);\n const response = await input.fetchImpl(`${input.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(input.apiKey !== undefined ? { authorization: `Bearer ${input.apiKey}` } : {}),\n },\n body: streamBodyStr,\n ...(input.request.signal !== undefined ? { signal: input.request.signal } : {}),\n });\n\n if (!response.ok) {\n throw new Error(`OpenAI-compatible provider failed with ${response.status}.`);\n }\n\n const textParts: string[] = [];\n const rawChunks: unknown[] = [];\n const nativeToolCalls = new Map<number, AccumulatedOpenAIToolCall>();\n let usagePayload: unknown;\n let observedModel: string | undefined;\n let finishReason: string | undefined;\n\n for await (const event of readSseEvents(response)) {\n const data = event.data.trim();\n if (data.length === 0) {\n continue;\n }\n if (data === \"[DONE]\") {\n break;\n }\n\n const chunk = parseJsonObject(data);\n rawChunks.push(chunk);\n const chunkObservedModel = observedModelFromResponse(chunk);\n if (chunkObservedModel !== undefined) {\n observedModel = chunkObservedModel;\n }\n if (isRecord(chunk) && chunk.usage !== undefined) {\n usagePayload = chunk.usage;\n }\n\n for (const choice of streamChoices(chunk)) {\n const choiceFinishReason = stringField(choice, \"finish_reason\");\n if (choiceFinishReason !== undefined) {\n finishReason = choiceFinishReason;\n }\n const delta = isRecord(choice.delta) ? choice.delta : {};\n const content = typeof delta.content === \"string\" ? delta.content : undefined;\n if (content !== undefined && content.length > 0) {\n textParts.push(content);\n for (const output of input.request.outputs) {\n yield { kind: \"text-delta\", output, text: content };\n }\n }\n accumulateOpenAIToolCalls(nativeToolCalls, delta.tool_calls);\n }\n }\n\n const text = textParts.join(\"\");\n const structuredOutput = input.request.nativeStructuredOutput === undefined\n ? undefined\n : parseJsonValue(text);\n const rawOutputs = rawOutputsForRequest({\n outputs: input.request.outputs,\n text,\n structuredOutputRequest: input.request.nativeStructuredOutput,\n structuredOutput,\n });\n const sanitizedOutputs = await applyOutputSanitizers(rawOutputs, input.sanitizeOutput, {\n providerId: input.id,\n modelId: input.model,\n });\n const parsedToolCalls = parseToolUseEnvelope(text);\n const promptToolCalls = parsedToolCalls === null\n ? undefined\n : await validateToolCallRequests(parsedToolCalls, input.validateToolCalls);\n const nativeToolRequests = openAIToolUseRequests(nativeToolCalls);\n const nativeValidatedToolCalls = nativeToolRequests.length === 0\n ? undefined\n : await validateToolCallRequests(nativeToolRequests, input.validateToolCalls);\n const toolCalls = [\n ...(promptToolCalls ?? []),\n ...(nativeValidatedToolCalls ?? []),\n ];\n const usage = normalizeUsage(usagePayload);\n const normalizedUsage = normalizeUsageToRunUsage(usagePayload, input.pricing);\n const sanitizedGatewayPolicy = sanitizedGatewayPolicyForPlan(mergedGatewayPolicy);\n const gateway = input.id === \"litellm\" ||\n input.id === \"openrouter\" ||\n mergedGatewayPolicy !== undefined\n ? {\n used: true,\n requestedModel: input.model,\n ...(observedModel !== undefined ? { observedModel } : {}),\n ...(sanitizedGatewayPolicy !== undefined ? { policy: sanitizedGatewayPolicy } : {}),\n }\n : undefined;\n\n const finish = finishMetadata({\n reason: finishReason,\n toolCallIds: toolCalls.map((toolCall) => toolCall.id),\n });\n\n yield {\n kind: \"complete\",\n rawOutputs: sanitizedOutputs,\n ...(usage !== undefined ? { usage } : {}),\n normalizedUsage,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(gateway !== undefined ? { gateway } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: {\n kind: \"openai-compatible-stream\",\n chunks: rawChunks,\n },\n };\n}\n\ninterface AccumulatedOpenAIToolCall {\n id?: string;\n name?: string;\n arguments: string;\n}\n\nfunction firstOpenAIChoice(body: unknown): Record<string, unknown> | undefined {\n if (!isRecord(body) || !Array.isArray(body.choices)) {\n return undefined;\n }\n\n return body.choices.find(isRecord);\n}\n\nfunction openAIMessageFromChoice(choice: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n return choice !== undefined && isRecord(choice.message) ? choice.message : undefined;\n}\n\nfunction openAIMessageText(message: Record<string, unknown> | undefined): string {\n if (message === undefined) {\n return \"\";\n }\n if (typeof message.content === \"string\") {\n return message.content;\n }\n if (Array.isArray(message.content)) {\n return message.content\n .flatMap((part) => isRecord(part) && typeof part.text === \"string\" ? [part.text] : [])\n .join(\"\");\n }\n\n return \"\";\n}\n\nfunction openAIToolUseRequestsFromMessage(\n message: Record<string, unknown> | undefined,\n): readonly ToolUseRequest[] {\n if (message === undefined || !Array.isArray(message.tool_calls)) {\n return [];\n }\n\n const calls = new Map<number, AccumulatedOpenAIToolCall>();\n for (const [index, item] of message.tool_calls.entries()) {\n if (!isRecord(item)) {\n continue;\n }\n const current: AccumulatedOpenAIToolCall = { arguments: \"\" };\n if (typeof item.id === \"string\") {\n current.id = item.id;\n }\n if (isRecord(item.function)) {\n if (typeof item.function.name === \"string\") {\n current.name = item.function.name;\n }\n if (typeof item.function.arguments === \"string\") {\n current.arguments = item.function.arguments;\n }\n }\n calls.set(index, current);\n }\n\n return openAIToolUseRequests(calls);\n}\n\nfunction openAIStructuredOutputValue(\n request: ProviderStructuredOutputRequest | undefined,\n message: Record<string, unknown> | undefined,\n text: string,\n): unknown {\n if (request === undefined) {\n return undefined;\n }\n if (message !== undefined && \"parsed\" in message) {\n return message.parsed;\n }\n\n return parseJsonValue(text);\n}\n\nfunction rawOutputsForRequest(input: {\n readonly outputs: readonly string[];\n readonly text: string;\n readonly structuredOutputRequest: ProviderStructuredOutputRequest | undefined;\n readonly structuredOutput: unknown;\n}): Record<string, unknown> {\n const rawOutputs: Record<string, unknown> = Object.fromEntries(\n input.outputs.map((name) => [name, input.text]),\n );\n if (\n input.structuredOutputRequest !== undefined &&\n input.structuredOutput !== undefined\n ) {\n rawOutputs[input.structuredOutputRequest.output] = input.structuredOutput;\n }\n\n return rawOutputs;\n}\n\nfunction parseJsonValue(text: string): unknown {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction openAIFinishMetadata(\n choice: Record<string, unknown> | undefined,\n toolCalls: readonly { readonly id: string }[],\n): ProviderFinishMetadata | undefined {\n return finishMetadata({\n reason: stringField(choice, \"finish_reason\"),\n toolCallIds: toolCalls.map((toolCall) => toolCall.id),\n });\n}\n\nfunction finishMetadata(input: {\n readonly reason: string | undefined;\n readonly toolCallIds: readonly string[];\n}): ProviderFinishMetadata | undefined {\n const toolCallIds = input.toolCallIds.filter((id) => id.length > 0);\n if (input.reason === undefined && toolCallIds.length === 0) {\n return undefined;\n }\n\n return {\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(toolCallIds.length > 0 ? { toolCallIds } : {}),\n };\n}\n\nfunction stringField(record: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = record?.[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseJsonObject(data: string): unknown {\n try {\n return JSON.parse(data) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\n throw new Error(`OpenAI-compatible stream returned invalid JSON: ${message}`);\n }\n}\n\nfunction streamChoices(chunk: unknown): readonly Record<string, unknown>[] {\n if (!isRecord(chunk) || !Array.isArray(chunk.choices)) {\n return [];\n }\n\n return chunk.choices.filter(isRecord);\n}\n\nfunction accumulateOpenAIToolCalls(\n calls: Map<number, AccumulatedOpenAIToolCall>,\n deltas: unknown,\n): void {\n if (!Array.isArray(deltas)) {\n return;\n }\n\n for (const delta of deltas) {\n if (!isRecord(delta) || typeof delta.index !== \"number\") {\n continue;\n }\n const current = calls.get(delta.index) ?? { arguments: \"\" };\n if (typeof delta.id === \"string\") {\n current.id = delta.id;\n }\n if (isRecord(delta.function)) {\n if (typeof delta.function.name === \"string\") {\n current.name = `${current.name ?? \"\"}${delta.function.name}`;\n }\n if (typeof delta.function.arguments === \"string\") {\n current.arguments += delta.function.arguments;\n }\n }\n calls.set(delta.index, current);\n }\n}\n\nfunction openAIToolUseRequests(\n calls: ReadonlyMap<number, AccumulatedOpenAIToolCall>,\n): readonly ToolUseRequest[] {\n return [...calls.entries()]\n .sort(([left], [right]) => left - right)\n .flatMap(([index, call]) => {\n if (call.name === undefined) {\n return [];\n }\n return [{\n id: call.id ?? `tool-call-${index}`,\n name: call.name,\n args: parseToolArguments(call.arguments),\n }];\n });\n}\n\nfunction parseToolArguments(value: string): unknown {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return {};\n }\n try {\n return JSON.parse(trimmed) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\n throw new Error(`OpenAI-compatible stream returned invalid tool arguments: ${message}`);\n }\n}\n\n/**\n * Phase 7 normalization: maps raw provider usage payloads (OpenAI's\n * `prompt_tokens`/`completion_tokens`, the Responses API's\n * `input_tokens`/`output_tokens`, or camelCase variants) to the shared\n * `Usage` shape. When `pricing` is supplied, `costUsd` is computed from\n * the normalized token counts. Otherwise `costUsd` is `null` so consumers\n * can distinguish \"unmeasured\" from \"zero\".\n */\nfunction normalizeUsageToRunUsage(\n rawUsage: unknown,\n pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n },\n): Usage {\n let promptTokens = 0;\n let completionTokens = 0;\n if (typeof rawUsage === \"object\" && rawUsage !== null) {\n const record = rawUsage as Record<string, unknown>;\n promptTokens =\n numberField(record, \"prompt_tokens\") ??\n numberField(record, \"input_tokens\") ??\n numberField(record, \"inputTokens\") ??\n 0;\n completionTokens =\n numberField(record, \"completion_tokens\") ??\n numberField(record, \"output_tokens\") ??\n numberField(record, \"outputTokens\") ??\n 0;\n }\n let costUsd: number | null = null;\n if (\n pricing !== undefined &&\n (pricing.inputPer1kTokens !== undefined || pricing.outputPer1kTokens !== undefined)\n ) {\n const inputCost = ((pricing.inputPer1kTokens ?? 0) * promptTokens) / 1000;\n const outputCost = ((pricing.outputPer1kTokens ?? 0) * completionTokens) / 1000;\n costUsd = inputCost + outputCost;\n }\n return { promptTokens, completionTokens, costUsd };\n}\n\nfunction normalizeUsage(usage: unknown): UsageRecord | undefined {\n if (typeof usage !== \"object\" || usage === null) {\n return undefined;\n }\n\n const record = usage as Record<string, unknown>;\n const inputTokens = numberField(record, \"prompt_tokens\") ?? numberField(record, \"input_tokens\");\n const outputTokens =\n numberField(record, \"completion_tokens\") ?? numberField(record, \"output_tokens\");\n const totalTokens = numberField(record, \"total_tokens\");\n\n return {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n };\n}\n\nfunction numberField(record: Record<string, unknown>, key: string): number | undefined {\n const value = record[key];\n\n return typeof value === \"number\" ? value : undefined;\n}\n\n/**\n * Phase 34 — D-12 — Emits a \"capabilities.negotiation.fallback\" RunEvent if\n * a sink is provided. The runId uses a synthetic value since negotiation\n * happens outside a run context.\n *\n * T-34-03-01: errorReason is produced by stringifyErr (message only, NOT\n * stack) to prevent apiKey leaking in error strings that include request headers.\n */\nfunction emitFallbackEvent(\n sink: RunEventSink | undefined,\n payload: {\n readonly adapter: string;\n readonly modelId: string;\n readonly errorReason: string;\n readonly fallbackSource: \"registry-fallback\";\n },\n): void {\n if (sink === undefined) return;\n const event = createRunEvent(\"capabilities.negotiation.fallback\", {\n // Synthetic runId: negotiation happens outside a run context (no run.id available).\n // Pattern documented in Plan 34-02 (Anthropic reference impl).\n runId: `negotiate-${payload.adapter}-${payload.modelId}`,\n providerId: payload.adapter,\n modelId: payload.modelId,\n metadata: {\n adapter: payload.adapter,\n modelId: payload.modelId,\n errorReason: payload.errorReason,\n fallbackSource: payload.fallbackSource,\n },\n });\n void sink(event);\n}\n\n/**\n * Stringify an error for event metadata. Returns only the message (NOT the\n * stack) to prevent apiKey or sensitive header values from leaking into\n * event payloads via fetch errors that may embed the request init.\n * T-34-03-01 mitigation.\n */\nfunction stringifyErr(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Phase 34 — QUIRK-02 / NEG-01 / NEG-02 — Merge an OpenAI /v1/models\n * sparse response with the Phase 33 registry.\n *\n * OpenAI's /models response is famously SPARSE per RESEARCH §Q2:\n * `{ id, object, created, owned_by }` only. No capabilities block.\n * The /models call confirms the model EXISTS in the user's org, but\n * tells us nothing about its capabilities. We source supports.* from\n * the Phase 33 registry instead.\n *\n * Source semantics per D-09:\n * - \"live\" when the model id is found in the /models response\n * (the id was verified to exist — useful signal for org membership)\n * - \"registry-fallback\" when the model is NOT in the /models response\n * (model not in org, or stale; emit fallback event)\n *\n * Anti-pattern warning (RESEARCH §Anti-patterns): DO NOT assume OpenAI\n * /v1/models returns capability flags. It doesn't. Only id/object/created/\n * owned_by are returned. Source supports.* ONLY from the registry.\n */\nfunction mergeOpenAIModelsWithRegistry(\n modelId: string,\n body: unknown,\n emitFallback: () => void,\n): NegotiatedCapabilities {\n // LENIENT-PARSE: body may be malformed; defensive chaining throughout (Pitfall 1).\n const data = (body as { data?: unknown })?.data;\n const found = Array.isArray(data)\n ? (data as Array<unknown>).find(\n (m): m is { id: string } =>\n typeof m === \"object\" && m !== null && (m as { id?: unknown }).id === modelId,\n )\n : undefined;\n\n if (found === undefined) {\n // Model not in /models response — emit fallback event and fall back to registry.\n emitFallback();\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"openai\", modelId, \"registry-fallback\");\n }\n\n // Model found in /models response — source supports.* from registry profile.\n // The /models call confirmed the model EXISTS in the org (useful signal), but\n // sparse /models tells us nothing about capabilities. Per RESEARCH §Q2 planning\n // note 2: use source: \"live\" since the model id was verified to exist.\n const registryProfile = getCapabilityProfile(`openai:${modelId}`);\n if (registryProfile !== undefined) {\n return _mapProfileToNegotiatedCapabilities(registryProfile, \"live\");\n }\n\n // Model exists in org (/models confirmed) but Phase 33 registry doesn't have it.\n // Use source: \"live\" per planning_context note 2 (the model id was verified).\n // Supports.* are unknown — return empty-stub shape with source: \"live\".\n //\n // We construct the empty stub inline because synthesizeNegotiatedCapabilitiesFromRegistry\n // only accepts \"registry\" | \"registry-fallback\" as source values. The shape below mirrors\n // the not-found branch of that helper (negotiate.ts:149-162) but with source: \"live\"\n // since the model id was verified via /v1/models.\n return {\n modelId,\n contextWindow: 0,\n supports: {\n nativeToolCalling: false,\n structuredOutputs: false,\n parallelToolCalls: false,\n extendedThinking: false,\n streaming: true,\n },\n knownFailureModes: [],\n recommendedSanitizers: [],\n source: \"live\",\n };\n}\n\n/**\n * Phase 34 — QUIRK-02 / NEG-01 / NEG-02 — OpenAI provider factory.\n *\n * Extends the base OpenAI-compat factory with:\n * 1. `quirks: OpenAIQuirks` — verified per RESEARCH §Q6 OpenAI vocabulary.\n * 2. `negotiateCapabilities(modelId)` — queries OpenAI /v1/models GET with\n * Authorization: Bearer header; SPARSE response; intersects with Phase 33\n * registry for supports.* (per RESEARCH §Anti-patterns — don't assume\n * OpenAI /v1/models returns capability flags, it doesn't).\n *\n * The negotiate() pattern mirrors Plan 34-02 (Anthropic thick reference):\n * - Per-instance TTL cache (modelsCacheTtlMs, default 300_000ms)\n * - Single-flight inflight coalescing with .finally cleanup (Pitfall 4)\n * - Retry with [0, 200, 1000]ms backoff (modelsRetryCount, default 2)\n * - 401/403 throws NegotiationAuthError (D-10: no retry, no fallback, no event)\n * - 5xx/network/timeout falls back to registry with source: \"registry-fallback\"\n * - emitFallbackEvent fires the \"capabilities.negotiation.fallback\" RunEvent\n *\n * SECURITY (T-34-03-07): inflight Map MUST use .finally cleanup to prevent\n * leak on rejection. Verifiable: grep `.finally` in this file.\n */\nexport function createOpenAIProvider(\n options: OpenAICompatibleProviderOptions,\n): ProviderAdapter & {\n readonly quirks: OpenAIQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const id = options.id ?? \"openai\";\n const fetchImpl = options.fetch ?? fetch;\n const baseUrl = (options.baseUrl ?? \"https://api.openai.com\").replace(/\\/$/u, \"\");\n const ttlMs = options.modelsCacheTtlMs ?? 300_000;\n const retryCount = options.modelsRetryCount ?? 2;\n\n // Per-instance TTL cache (D-05/D-06/D-07/D-08). One Map per factory call.\n const cache = new Map<string, { result: NegotiatedCapabilities; expiresAt: number }>();\n // Per-instance inflight coalescing Map (Q7). .finally cleanup is mandatory (Pitfall 4).\n const inflight = new Map<string, Promise<NegotiatedCapabilities>>();\n\n async function fetchAndNegotiate(modelId: string): Promise<NegotiatedCapabilities> {\n const url = `${baseUrl}/v1/models`;\n // IN-02: omit Authorization entirely when apiKey is undefined; sending\n // \"Bearer \" literal would trigger noisy 401s and intrusion-detection flags.\n // Mirrors the OpenAI-compat execute path (line 137).\n const headers: Record<string, string> = {\n \"accept\": \"application/json\",\n ...(options.apiKey !== undefined ? { authorization: `Bearer ${options.apiKey}` } : {}),\n };\n const attempts = retryCount + 1;\n const backoffMs = [0, 200, 1000];\n let lastErr: unknown;\n for (let i = 0; i < attempts; i += 1) {\n if (i > 0) {\n const delay = backoffMs[Math.min(i, backoffMs.length - 1)] ?? 1000;\n await new Promise<void>((r) => setTimeout(r, delay));\n }\n try {\n const resp = await fetchImpl(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n if (resp.status === 401 || resp.status === 403) {\n throw new NegotiationAuthError(\n \"openai\",\n modelId,\n resp.status as 401 | 403,\n `OpenAI /v1/models returned ${resp.status}: check apiKey config.`,\n );\n }\n if (!resp.ok) {\n throw new Error(`HTTP ${resp.status}`);\n }\n const body = await resp.json() as unknown;\n return mergeOpenAIModelsWithRegistry(modelId, body, () => {\n emitFallbackEvent(options.runEventSink, {\n adapter: \"openai\",\n modelId,\n errorReason: \"model not found in /v1/models response\",\n fallbackSource: \"registry-fallback\",\n });\n });\n } catch (err) {\n if (err instanceof NegotiationAuthError) throw err; // D-10: auth never retries\n lastErr = err;\n }\n }\n // All retries exhausted — transient fallback + event.\n emitFallbackEvent(options.runEventSink, {\n adapter: \"openai\",\n modelId,\n errorReason: stringifyErr(lastErr),\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"openai\", modelId, \"registry-fallback\");\n }\n\n async function negotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // 1. Cache check (D-07 lazy expiry).\n const cached = cache.get(modelId);\n if (cached !== undefined && cached.expiresAt > Date.now()) return cached.result;\n\n // 2. Inflight coalesce (Q7).\n const existing = inflight.get(modelId);\n if (existing !== undefined) return existing;\n\n // 3. New fetch promise; clear inflight in .finally (Pitfall 4).\n const fetchPromise = (async () => {\n try {\n const result = await fetchAndNegotiate(modelId);\n if (ttlMs > 0) {\n cache.set(modelId, { result, expiresAt: Date.now() + ttlMs });\n }\n return result;\n } finally {\n inflight.delete(modelId);\n }\n })();\n inflight.set(modelId, fetchPromise);\n return fetchPromise;\n }\n\n const innerCompat = createOpenAICompatibleProvider({\n ...options,\n id,\n baseUrl,\n });\n\n return {\n ...innerCompat,\n // Phase 34 — QUIRK-02 / OpenAIQuirks — verified per RESEARCH §Q6 OpenAI vocabulary.\n // CITED: https://platform.openai.com/docs/guides/structured-outputs\n // - strictModeSupported: function-calling strict:true available on gpt-4o-2024-08-06+, o1+\n // - structuredOutputsTier2: json_schema response_format on gpt-4o and gpt-4o-mini series\n // CITED: RESEARCH §Q6 — supportsToolChoice, parallelToolCalls, structuredOutputs,\n // responseFormatHonored all true for OpenAI. streamingDiverges false (OpenAI streaming\n // output matches buffered per RESEARCH §A7 caveat: parallel_tool_calls is supported but\n // disabled by default; the quirk flag reflects that the feature exists).\n quirks: {\n supportsToolChoice: true,\n parallelToolCalls: true,\n structuredOutputs: true,\n responseFormatHonored: true,\n streamingDiverges: false,\n strictModeSupported: true,\n structuredOutputsTier2: true,\n } satisfies OpenAIQuirks,\n negotiateCapabilities: negotiate,\n };\n}\n\nexport function createAISdkProvider(options: SdkLikeProviderOptions): ProviderAdapter {\n const id = options.id ?? \"ai-sdk\";\n\n return {\n id,\n kind: \"provider-adapter\",\n capabilities: [\n {\n ...defaultCapabilityForProvider(id),\n modelId: options.model,\n toolUse: true,\n streaming: true,\n },\n ],\n execute: async (request) => {\n const response = await options.generate({\n task: request.task,\n outputNames: request.outputs,\n });\n const normalizedUsage: Usage = {\n promptTokens: response.usage?.inputTokens ?? 0,\n completionTokens: response.usage?.outputTokens ?? 0,\n costUsd: null,\n };\n return { ...response, normalizedUsage };\n },\n };\n}\n","import type { UsageRecord } from \"../plan/plan.js\";\nimport type {\n ProviderAdapter,\n ProviderFinishMetadata,\n ProviderRunRequest,\n ProviderRunResponse,\n ProviderStream,\n ProviderStructuredOutputRequest,\n ProviderToolChoice,\n ProviderToolDefinition,\n Usage,\n} from \"./provider.js\";\nimport type { AnthropicQuirks } from \"./quirks.js\";\nimport type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport type { RunEventSink } from \"../tracing/tracing.js\";\nimport { defaultCapabilityForProvider } from \"../routing/catalog.js\";\nimport { NegotiationAuthError, synthesizeNegotiatedCapabilitiesFromRegistry } from \"../capabilities/negotiate.js\";\nimport { getCapabilityProfile } from \"../capabilities/lookup.js\";\nimport { getRecommendedSanitizers } from \"../capabilities/sanitizer-recommendations.js\";\nimport { createRunEvent } from \"../tracing/tracing.js\";\nimport { parseToolUseEnvelope, type ToolUseRequest } from \"../tools/tool-use.js\";\nimport { standardSchemaToJsonSchema } from \"../tools/schema.js\";\nimport {\n validateToolCallRequests,\n type ValidateToolCallsOption,\n} from \"../tools/tool-call-validation.js\";\nimport {\n applyOutputSanitizers,\n type SanitizeOutputOption,\n} from \"../sanitizers/index.js\";\nimport {\n anthropicFileId,\n artifactBase64Data,\n artifactHttpUrl,\n mediaTypeForArtifact,\n packagedPlanForArtifact,\n} from \"./multimodal.js\";\nimport { readSseEvents } from \"./sse.js\";\nimport { assertNoPublicUrlEgress } from \"./no-public-url.js\";\n\n/**\n * Options for {@link createAnthropicProvider}.\n *\n * Mirrors `OpenAICompatibleProviderOptions` ergonomics (Phase 7 pattern) but\n * for the Anthropic Messages API at `/v1/messages` -- which uses a top-level\n * `system` field and a `content[0].text` response shape that diverges from\n * the OpenAI Chat Completions schema (see FSB v0.9.x `extension/ai/universal-provider.js`\n * lines 280-297 + 566-573 for the production reference).\n *\n * SECURITY: `apiKey` is a runtime parameter -- do NOT hardcode or log it.\n *\n * STREAMING (Phase 44): supported through native Anthropic Messages SSE events.\n *\n * DEFERRED (Phase 4 carryforward notes):\n * - prompt caching (Phase 39: opt-in via `ProviderRunRequest.cacheSystemPrefix` —\n * emitted as a cache_control-marked system block when present)\n * - resume-from-eviction -- see Phase 5 (MV3-survivability adapter contract)\n *\n * Ref: FSB v0.10.0-attempt-2 Phase 4 (D-02 + D-07: full custom adapter; preserve top-level `system`).\n */\nexport interface AnthropicProviderOptions {\n readonly id?: string;\n readonly model: string;\n readonly apiKey: string;\n /** Defaults to `https://api.anthropic.com`. Override for proxies. */\n readonly baseUrl?: string;\n /** Defaults to `2023-06-01`. Override only if the consumer has tested a newer pinned version. */\n readonly anthropicVersion?: string;\n readonly fetch?: typeof fetch;\n readonly pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n };\n /**\n * D-08: Per-instance TTL for the /v1/models response cache (milliseconds).\n * Default 300_000 (5 minutes). `0` disables caching (always re-fetch -- for testing).\n * `Infinity` disables expiry (process-lifetime for the instance).\n */\n readonly modelsCacheTtlMs?: number;\n /**\n * D-11: Number of retries for transient /v1/models fetch failures (5xx, network,\n * timeout). Default 2 (3 total attempts). `0` disables retries.\n * Backoff schedule: [0ms, 200ms, 1000ms].\n */\n readonly modelsRetryCount?: number;\n /**\n * D-12: Optional RunEventSink for emitting `capabilities.negotiation.fallback`\n * events when the /v1/models fetch falls back to the Phase 33 static registry.\n * If absent, fallback emits no event (no-op). Auth errors (401/403) never emit\n * the fallback event -- they throw `NegotiationAuthError` instead.\n */\n readonly runEventSink?: RunEventSink;\n readonly sanitizeOutput?: SanitizeOutputOption;\n readonly validateToolCalls?: ValidateToolCallsOption;\n}\n\n/** Internal TTL cache entry shape (D-07 lazy-expiry). */\ninterface CacheEntry {\n readonly result: NegotiatedCapabilities;\n /** Date.now() + ttlMs; Infinity when ttlMs === Infinity */\n readonly expiresAt: number;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.anthropic.com\";\nconst DEFAULT_ANTHROPIC_VERSION = \"2023-06-01\";\nconst DEFAULT_MAX_TOKENS = 2000;\nconst DEFAULT_MODELS_CACHE_TTL_MS = 300_000;\nconst DEFAULT_MODELS_RETRY_COUNT = 2;\n/** D-11: Backoff schedule for transient /v1/models failures -- immediate, 200ms, 1s. */\nconst MODELS_BACKOFF_MS = [0, 200, 1000] as const;\n\ninterface AnthropicMessagesBodyResult {\n readonly body: Record<string, unknown>;\n readonly usesFilesApi: boolean;\n}\n\nasync function createAnthropicMessagesBody(input: {\n readonly model: string;\n readonly request: ProviderRunRequest;\n readonly stream?: boolean;\n}): Promise<AnthropicMessagesBodyResult> {\n // Phase 39 (DELEG-04): opt-in prompt-cache prefix. When present, hoist\n // it to a `cache_control`-marked system content block. Conditional VALUE,\n // not conditional spread: the `system` key is always present per the\n // Messages API contract and prior golden-body tests.\n const system =\n input.request.cacheSystemPrefix !== undefined\n ? [\n {\n type: \"text\",\n text: input.request.cacheSystemPrefix,\n cache_control: { type: \"ephemeral\" },\n },\n ]\n : \"\";\n\n const content = await createAnthropicUserContent(input.request);\n const nativeTools = anthropicToolDefinitions(input.request.nativeTools);\n const structuredTool = anthropicStructuredOutputTool(input.request.nativeStructuredOutput);\n const tools = [\n ...nativeTools,\n ...(structuredTool !== undefined ? [structuredTool] : []),\n ];\n const toolChoice = structuredTool !== undefined\n ? { type: \"tool\", name: structuredTool.name }\n : anthropicToolChoice(input.request.nativeToolChoice);\n\n return {\n body: {\n model: input.model,\n system,\n messages: [\n {\n role: \"user\",\n content: content.blocks.length === 0\n ? input.request.task\n : [...content.blocks, { type: \"text\", text: input.request.task }],\n },\n ],\n max_tokens: DEFAULT_MAX_TOKENS,\n ...(input.stream === true ? { stream: true } : {}),\n ...(tools.length > 0 ? { tools } : {}),\n ...(toolChoice !== undefined ? { tool_choice: toolChoice } : {}),\n },\n usesFilesApi: content.usesFilesApi,\n };\n}\n\nfunction anthropicToolDefinitions(\n tools: readonly ProviderToolDefinition[] | undefined,\n): readonly Record<string, unknown>[] {\n return (tools ?? []).map((tool) => ({\n name: tool.name,\n ...(tool.description !== undefined ? { description: tool.description } : {}),\n input_schema: standardSchemaToJsonSchema(tool.inputSchema),\n }));\n}\n\nfunction anthropicToolChoice(choice: ProviderToolChoice | undefined): Record<string, unknown> | undefined {\n if (choice === undefined) {\n return undefined;\n }\n if (choice === \"required\") {\n return { type: \"any\" };\n }\n if (choice === \"auto\" || choice === \"none\") {\n return { type: choice };\n }\n\n return { type: \"tool\", name: choice.name };\n}\n\nfunction anthropicStructuredOutputTool(\n request: ProviderStructuredOutputRequest | undefined,\n): Record<string, unknown> | undefined {\n if (request === undefined) {\n return undefined;\n }\n\n return {\n name: anthropicStructuredOutputToolName(request),\n description: `Return structured output for ${request.output}.`,\n input_schema: standardSchemaToJsonSchema(request.schema),\n };\n}\n\nasync function createAnthropicUserContent(request: ProviderRunRequest): Promise<{\n readonly blocks: readonly Record<string, unknown>[];\n readonly usesFilesApi: boolean;\n}> {\n const blocks: Record<string, unknown>[] = [];\n let usesFilesApi = false;\n\n for (const inputArtifact of request.artifacts) {\n if (inputArtifact.kind !== \"image\") {\n continue;\n }\n\n const packaged = packagedPlanForArtifact(request, inputArtifact.id);\n if (packaged === undefined) {\n continue;\n }\n\n if (packaged.transport === \"file-id\") {\n const fileId = anthropicFileId(inputArtifact);\n if (fileId === undefined) {\n continue;\n }\n blocks.push({\n type: \"image\",\n source: {\n type: \"file\",\n file_id: fileId,\n },\n });\n usesFilesApi = true;\n continue;\n }\n\n if (packaged.transport === \"url\") {\n const url = artifactHttpUrl(inputArtifact);\n if (url === undefined) {\n continue;\n }\n blocks.push({\n type: \"image\",\n source: {\n type: \"url\",\n url,\n },\n });\n continue;\n }\n\n if (packaged.transport === \"base64\" || packaged.transport === \"inline\") {\n const data = await artifactBase64Data(inputArtifact);\n if (data === undefined) {\n continue;\n }\n blocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: mediaTypeForArtifact(inputArtifact, \"image/jpeg\"),\n data,\n },\n });\n }\n }\n\n return { blocks, usesFilesApi };\n}\n\nexport function createAnthropicProvider(options: AnthropicProviderOptions): ProviderAdapter & {\n readonly quirks: AnthropicQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const id = options.id ?? \"anthropic\";\n const fetchImpl = options.fetch ?? fetch;\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/u, \"\");\n const anthropicVersion = options.anthropicVersion ?? DEFAULT_ANTHROPIC_VERSION;\n\n // D-08: TTL cache configuration\n const ttlMs = options.modelsCacheTtlMs ?? DEFAULT_MODELS_CACHE_TTL_MS;\n // D-11: Retry count (0 = no retries, so attempts = 1)\n const retryCount = options.modelsRetryCount ?? DEFAULT_MODELS_RETRY_COUNT;\n\n // D-05 / D-06: Per-instance Maps; each createAnthropicProvider() call gets its own.\n const cache = new Map<string, CacheEntry>();\n const inflight = new Map<string, Promise<NegotiatedCapabilities>>();\n\n /**\n * D-12: Emits the `capabilities.negotiation.fallback` RunEvent via the\n * consumer-supplied sink. If no sink is provided, this is a no-op.\n *\n * SECURITY (T-34-02-01): errorReason is derived from `err.message` ONLY --\n * not `err.stack`, `err.toString()`, or any serialization that could include\n * request headers (which carry the apiKey). `stringifyErr` enforces this.\n *\n * JSDoc synthetic runId: negotiate() runs outside of a Lattice run context\n * (no ai.run() in scope). The runId `\"negotiate-${id}-${modelId}\"` is a\n * synthetic value that scopes the event to this adapter instance + modelId.\n * Consumers filtering on runId should treat \"negotiate-\" prefix as a signal\n * that this event originated from capability negotiation, not a user-facing run.\n */\n function emitFallbackEvent(payload: {\n adapter: string;\n modelId: string;\n errorReason: string;\n fallbackSource: \"registry-fallback\";\n }): void {\n if (options.runEventSink === undefined) return;\n const event = createRunEvent(\"capabilities.negotiation.fallback\", {\n runId: `negotiate-${id}-${payload.modelId}`,\n providerId: id,\n modelId: payload.modelId,\n metadata: {\n adapter: payload.adapter,\n modelId: payload.modelId,\n errorReason: payload.errorReason,\n fallbackSource: payload.fallbackSource,\n },\n });\n void options.runEventSink(event);\n }\n\n /**\n * Pure error message extractor. Returns `err.message` for Error instances,\n * `String(err)` for everything else. Deliberately does NOT include stack,\n * headers, or other fields (T-34-02-01 mitigation).\n */\n function stringifyErr(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n }\n\n /**\n * Merges a live /v1/models response body with the Phase 33 static registry\n * profile for the given modelId. Called on HTTP 200 responses only.\n *\n * LENIENT PARSING (Pitfall 1): every field access uses optional chaining.\n * Missing `capabilities.thinking` or other sub-fields default to false rather\n * than throwing. This ensures forward-compatibility with future API shape changes.\n *\n * contextWindow policy: Anthropic's max_input_tokens is set to 0 in the fixture\n * for models where it is unreliable. When 0, falls through to the registry profile's\n * contextWindow (if present) or 0 as a final default (RESEARCH §Q1).\n */\n function mergeAnthropicModelsWithRegistry(\n modelId: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n body: any,\n ): NegotiatedCapabilities {\n // Pitfall 1: lenient parse -- never crash on unexpected shapes\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n const found = body?.data?.find?.((m: unknown) => {\n if (typeof m !== \"object\" || m === null) return false;\n return (m as Record<string, unknown>)[\"id\"] === modelId;\n }) as Record<string, unknown> | undefined;\n\n if (found === undefined) {\n // Model not found in live response -- treat as registry-fallback\n // (200 received but this modelId isn't listed; signal to consumer that\n // something is off, per planner advisory in task spec).\n //\n // WR-04 (Phase 34 review): emit the fallback event here so consumers\n // observing the event stream can detect that an Anthropic model was\n // missing from a successful /v1/models response. Matches the OpenAI\n // (adapters.ts:362-366), Gemini, and OpenRouter behavior.\n emitFallbackEvent({\n adapter: \"anthropic\",\n modelId,\n errorReason: \"model not found in /v1/models response\",\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"anthropic\", modelId, \"registry-fallback\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const caps = (found[\"capabilities\"] as Record<string, unknown> | undefined) ?? {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const structuredOutputsSupported = (caps[\"structured_outputs\"] as Record<string, unknown> | undefined)?.[\"supported\"] === true;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const thinkingSupported = (caps[\"thinking\"] as Record<string, unknown> | undefined)?.[\"supported\"] === true;\n\n // contextWindow: use max_input_tokens when > 0; fall through to registry profile\n const maxInputTokensRaw = found[\"max_input_tokens\"];\n const maxInputTokens = typeof maxInputTokensRaw === \"number\" && maxInputTokensRaw > 0\n ? maxInputTokensRaw\n : undefined;\n\n // Registry profile for contextWindow fallback + knownFailureModes\n const registryProfile = getCapabilityProfile(`anthropic:${modelId}`);\n const contextWindow = maxInputTokens ?? registryProfile?.contextWindow ?? 0;\n\n const knownFailureModes = registryProfile?.knownFailureModes ?? ([] as const);\n\n return {\n modelId,\n contextWindow,\n supports: {\n nativeToolCalling: true, // Anthropic tool_use is the reference implementation\n structuredOutputs: structuredOutputsSupported,\n parallelToolCalls: true, // Anthropic supports parallel tool calls per registry\n extendedThinking: thinkingSupported,\n streaming: true, // Anthropic native streaming\n },\n knownFailureModes,\n recommendedSanitizers: getRecommendedSanitizers(knownFailureModes),\n source: \"live\",\n };\n }\n\n /**\n * D-09 / D-10 / D-11: Core /v1/models fetch with retry-backoff, auth-error-throw,\n * and transient-fallback. Called only once per modelId (inflight coalescing prevents\n * concurrent duplicate fetches).\n *\n * URL shape: `${baseUrl}/v1/models?limit=1000` to page all models in one request.\n * Headers per RESEARCH §Q1: x-api-key, anthropic-version, accept.\n */\n async function fetchAndNegotiate(modelId: string): Promise<NegotiatedCapabilities> {\n const url = `${baseUrl}/v1/models?limit=1000`;\n const headers = {\n \"x-api-key\": options.apiKey,\n \"anthropic-version\": anthropicVersion,\n \"accept\": \"application/json\",\n };\n\n const attempts = retryCount + 1;\n let lastErr: unknown;\n\n for (let i = 0; i < attempts; i += 1) {\n const delayMs = MODELS_BACKOFF_MS[i] ?? MODELS_BACKOFF_MS[MODELS_BACKOFF_MS.length - 1]!;\n if (delayMs > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n\n try {\n const resp = await fetchImpl(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n\n // D-10: auth errors throw immediately, never fall back, never retry\n // T-34-02-04: message does NOT include the actual apiKey value\n if (resp.status === 401 || resp.status === 403) {\n throw new NegotiationAuthError(\n \"anthropic\",\n modelId,\n resp.status as 401 | 403,\n `Anthropic /v1/models returned ${resp.status}: check apiKey config.`,\n );\n }\n\n if (!resp.ok) {\n throw new Error(`HTTP ${resp.status}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const body = await resp.json();\n return mergeAnthropicModelsWithRegistry(modelId, body);\n } catch (err) {\n // D-10: auth errors always propagate -- never retry, never fall back\n if (err instanceof NegotiationAuthError) throw err;\n lastErr = err;\n // Continue loop for transient errors (5xx, network, timeout)\n }\n }\n\n // D-09 + D-12: all retries exhausted -- fall back to Phase 33 registry + emit event\n emitFallbackEvent({\n adapter: \"anthropic\",\n modelId,\n errorReason: stringifyErr(lastErr),\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"anthropic\", modelId, \"registry-fallback\");\n }\n\n /**\n * D-07: Lazy expiry cache check + D-Q7: inflight coalescing.\n *\n * Cache check: stale entries are evicted lazily on read (no background setInterval\n * -- library must not pin the Node event loop).\n *\n * Inflight coalescing: concurrent calls for the same modelId share one fetch\n * Promise. Pitfall 4 mitigation: `.finally` block ALWAYS clears the inflight\n * Map entry, even on rejection. This ensures that a rejected Promise doesn't\n * \"poison\" the Map -- the next caller after all concurrent calls settle will\n * trigger a fresh fetch attempt.\n */\n async function negotiateCapabilities(modelId: string): Promise<NegotiatedCapabilities> {\n // 1. D-07: lazy TTL expiry check\n const cached = cache.get(modelId);\n if (cached !== undefined && cached.expiresAt > Date.now()) {\n return cached.result;\n }\n\n // 2. Q7: inflight coalescing -- return existing Promise if one is in-flight\n const existing = inflight.get(modelId);\n if (existing !== undefined) return existing;\n\n // 3. Start a new fetch Promise; .finally cleanup guarantees Map clearing (Pitfall 4)\n const fetchPromise = (async () => {\n try {\n const result = await fetchAndNegotiate(modelId);\n // D-08: cache result when TTL > 0; Infinity disables expiry\n if (ttlMs > 0) {\n cache.set(modelId, {\n result,\n expiresAt: ttlMs === Infinity ? Infinity : Date.now() + ttlMs,\n });\n }\n return result;\n } finally {\n // Pitfall 4: ALWAYS remove from inflight Map -- even on rejection.\n // This prevents a failed fetch from permanently blocking future calls.\n inflight.delete(modelId);\n }\n })();\n\n inflight.set(modelId, fetchPromise);\n return fetchPromise;\n }\n\n return {\n id,\n kind: \"provider-adapter\",\n capabilities: [\n {\n ...defaultCapabilityForProvider(id),\n modelId: options.model,\n fileTransport: [\"inline\", \"json\", \"url\", \"base64\", \"file-id\", \"extracted-text\", \"transcript\"],\n streaming: true,\n },\n ],\n /**\n * QUIRK-02: Anthropic adapter quirks block -- values verified against\n * Anthropic documentation and /v1/models capabilities field (RESEARCH §Q6/§Q1).\n *\n * Universal 5-boolean base (AdapterQuirks):\n * - supportsToolChoice: true -- tool_choice is supported per Anthropic tool use docs\n * - parallelToolCalls: true -- parallel tool calls verified in Anthropic tool_use spec\n * - structuredOutputs: true -- structured_outputs.supported in /v1/models capabilities block\n * - responseFormatHonored: true -- Anthropic honors response_format JSON schema strictly\n * - streamingDiverges: false -- Anthropic streaming output matches buffered output\n *\n * Anthropic-narrowed 3 fields (AnthropicQuirks):\n * - promptCachingSupported: true\n * CITED: https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching\n * Cache_control on system and user turns GA on all active Claude models.\n * - extendedThinkingSupported: true\n * CITED: https://docs.anthropic.com/en/docs/build-with-claude/extended-thinking\n * Thinking blocks available via the \"thinking\" request parameter (claude-3-7-sonnet+,\n * claude-*-4 families). Verified via /v1/models capabilities.thinking.supported.\n * - toolUseInputSchemaStrict: true\n * CITED: https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n * Anthropic tool_use blocks require strict JSON Schema in the input_schema field.\n */\n quirks: {\n supportsToolChoice: true,\n parallelToolCalls: true,\n structuredOutputs: true,\n responseFormatHonored: true,\n streamingDiverges: false,\n promptCachingSupported: true,\n extendedThinkingSupported: true,\n toolUseInputSchemaStrict: true,\n } satisfies AnthropicQuirks,\n negotiateCapabilities,\n async execute(request) {\n const messagesBody = await createAnthropicMessagesBody({\n model: options.model,\n request,\n });\n const bodyStr = JSON.stringify(messagesBody.body);\n assertNoPublicUrlEgress(request, id, bodyStr);\n const init: RequestInit = {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": options.apiKey,\n \"anthropic-version\": anthropicVersion,\n ...(messagesBody.usesFilesApi\n ? { \"anthropic-beta\": \"files-api-2025-04-14\" }\n : {}),\n },\n body: bodyStr,\n ...(request.signal !== undefined ? { signal: request.signal } : {}),\n };\n\n const response = await fetchImpl(`${baseUrl}/v1/messages`, init);\n\n if (!response.ok) {\n throw new Error(`Anthropic provider failed with ${response.status}.`);\n }\n\n const body = (await response.json()) as {\n content?: readonly unknown[];\n usage?: unknown;\n stop_reason?: unknown;\n };\n\n const text = anthropicTextFromContent(body.content);\n const structuredOutput = anthropicStructuredOutputFromContent(\n body.content,\n request.nativeStructuredOutput,\n );\n const rawOutputs = rawOutputsForRequest({\n outputs: request.outputs,\n text,\n structuredOutputRequest: request.nativeStructuredOutput,\n structuredOutput,\n });\n const sanitizedOutputs = await applyOutputSanitizers(rawOutputs, options.sanitizeOutput, {\n providerId: id,\n modelId: options.model,\n });\n const parsedToolCalls = parseToolUseEnvelope(text);\n const promptToolCalls = parsedToolCalls === null\n ? undefined\n : await validateToolCallRequests(parsedToolCalls, options.validateToolCalls);\n const nativeToolRequests = anthropicToolUseRequestsFromContent(\n body.content,\n request.nativeStructuredOutput,\n );\n const nativeToolCalls = nativeToolRequests.length === 0\n ? undefined\n : await validateToolCallRequests(nativeToolRequests, options.validateToolCalls);\n const hasToolCallResult = promptToolCalls !== undefined || nativeToolCalls !== undefined;\n const toolCalls = [\n ...(promptToolCalls ?? []),\n ...(nativeToolCalls ?? []),\n ];\n const usage = normalizeAnthropicUsage(body.usage);\n const normalizedUsage = normalizeAnthropicUsageToRunUsage(body.usage, options.pricing);\n const finish = finishMetadata({\n reason: typeof body.stop_reason === \"string\" ? body.stop_reason : undefined,\n toolCallIds: toolCalls.map((toolCall) => toolCall.id),\n });\n\n return {\n rawOutputs: sanitizedOutputs,\n ...(usage !== undefined ? { usage } : {}),\n normalizedUsage,\n ...(hasToolCallResult ? { toolCalls } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: body,\n };\n },\n executeStream(request) {\n return streamAnthropicResponse({\n id,\n model: options.model,\n baseUrl,\n apiKey: options.apiKey,\n anthropicVersion,\n fetchImpl,\n request,\n ...(options.pricing !== undefined ? { pricing: options.pricing } : {}),\n ...(options.sanitizeOutput !== undefined ? { sanitizeOutput: options.sanitizeOutput } : {}),\n ...(options.validateToolCalls !== undefined\n ? { validateToolCalls: options.validateToolCalls }\n : {}),\n });\n },\n };\n}\n\nasync function* streamAnthropicResponse(input: {\n readonly id: string;\n readonly model: string;\n readonly baseUrl: string;\n readonly apiKey: string;\n readonly anthropicVersion: string;\n readonly fetchImpl: typeof fetch;\n readonly request: ProviderRunRequest;\n readonly pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n };\n readonly sanitizeOutput?: SanitizeOutputOption;\n readonly validateToolCalls?: ValidateToolCallsOption;\n}): ProviderStream {\n const messagesBody = await createAnthropicMessagesBody({\n model: input.model,\n request: input.request,\n stream: true,\n });\n const streamBodyStr = JSON.stringify(messagesBody.body);\n assertNoPublicUrlEgress(input.request, input.id, streamBodyStr);\n const response = await input.fetchImpl(`${input.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": input.apiKey,\n \"anthropic-version\": input.anthropicVersion,\n ...(messagesBody.usesFilesApi\n ? { \"anthropic-beta\": \"files-api-2025-04-14\" }\n : {}),\n },\n body: streamBodyStr,\n ...(input.request.signal !== undefined ? { signal: input.request.signal } : {}),\n });\n\n if (!response.ok) {\n throw new Error(`Anthropic provider failed with ${response.status}.`);\n }\n\n const textParts: string[] = [];\n const rawChunks: unknown[] = [];\n const toolBlocks = new Map<number, AnthropicToolBlock>();\n const nativeToolRequests: ToolUseRequest[] = [];\n let usagePayload: Record<string, unknown> | undefined;\n let finishReason: string | undefined;\n\n for await (const event of readSseEvents(response)) {\n const data = event.data.trim();\n if (data.length === 0) {\n continue;\n }\n if (data === \"[DONE]\") {\n break;\n }\n\n const chunk = parseJsonObject(data, \"Anthropic\");\n rawChunks.push(event.event === undefined ? chunk : { event: event.event, data: chunk });\n usagePayload = mergeAnthropicUsage(usagePayload, usageFromAnthropicChunk(chunk));\n finishReason = anthropicStopReason(chunk) ?? finishReason;\n\n const eventType = eventTypeFromAnthropicChunk(chunk) ?? event.event;\n if (eventType === \"content_block_start\") {\n startAnthropicToolBlock(toolBlocks, chunk);\n continue;\n }\n if (eventType === \"content_block_delta\") {\n const text = anthropicTextDelta(chunk);\n if (text !== undefined && text.length > 0) {\n textParts.push(text);\n for (const output of input.request.outputs) {\n yield { kind: \"text-delta\", output, text };\n }\n }\n appendAnthropicToolInput(toolBlocks, chunk);\n continue;\n }\n if (eventType === \"content_block_stop\") {\n const request = completeAnthropicToolBlock(toolBlocks, chunk);\n if (request !== undefined) {\n nativeToolRequests.push(request);\n }\n }\n }\n\n const text = textParts.join(\"\");\n const structuredToolName = anthropicStructuredOutputToolName(\n input.request.nativeStructuredOutput,\n );\n const providerToolRequests = structuredToolName === undefined\n ? nativeToolRequests\n : nativeToolRequests.filter((request) => request.name !== structuredToolName);\n const structuredOutput = structuredToolName === undefined\n ? undefined\n : nativeToolRequests.find((request) => request.name === structuredToolName)?.args;\n const rawOutputs = rawOutputsForRequest({\n outputs: input.request.outputs,\n text,\n structuredOutputRequest: input.request.nativeStructuredOutput,\n structuredOutput,\n });\n const sanitizedOutputs = await applyOutputSanitizers(rawOutputs, input.sanitizeOutput, {\n providerId: input.id,\n modelId: input.model,\n });\n const parsedToolCalls = parseToolUseEnvelope(text);\n const promptToolCalls = parsedToolCalls === null\n ? undefined\n : await validateToolCallRequests(parsedToolCalls, input.validateToolCalls);\n const nativeToolCalls = providerToolRequests.length === 0\n ? undefined\n : await validateToolCallRequests(providerToolRequests, input.validateToolCalls);\n const toolCalls = [\n ...(promptToolCalls ?? []),\n ...(nativeToolCalls ?? []),\n ];\n const usage = normalizeAnthropicUsage(usagePayload);\n const normalizedUsage = normalizeAnthropicUsageToRunUsage(usagePayload, input.pricing);\n const finish = finishMetadata({\n reason: finishReason,\n toolCallIds: toolCalls.map((toolCall) => toolCall.id),\n });\n\n yield {\n kind: \"complete\",\n rawOutputs: sanitizedOutputs,\n ...(usage !== undefined ? { usage } : {}),\n normalizedUsage,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: {\n kind: \"anthropic-stream\",\n chunks: rawChunks,\n },\n };\n}\n\ninterface AnthropicToolBlock {\n readonly id: string;\n readonly name: string;\n readonly jsonParts: string[];\n}\n\nfunction parseJsonObject(data: string, providerName: string): unknown {\n try {\n return JSON.parse(data) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\n throw new Error(`${providerName} stream returned invalid JSON: ${message}`);\n }\n}\n\nfunction eventTypeFromAnthropicChunk(chunk: unknown): string | undefined {\n return isRecord(chunk) && typeof chunk.type === \"string\" ? chunk.type : undefined;\n}\n\nfunction anthropicStopReason(chunk: unknown): string | undefined {\n if (!isRecord(chunk)) {\n return undefined;\n }\n if (typeof chunk.stop_reason === \"string\") {\n return chunk.stop_reason;\n }\n if (isRecord(chunk.delta) && typeof chunk.delta.stop_reason === \"string\") {\n return chunk.delta.stop_reason;\n }\n\n return undefined;\n}\n\nfunction usageFromAnthropicChunk(chunk: unknown): unknown {\n if (!isRecord(chunk)) {\n return undefined;\n }\n if (isRecord(chunk.usage)) {\n return chunk.usage;\n }\n if (isRecord(chunk.message) && isRecord(chunk.message.usage)) {\n return chunk.message.usage;\n }\n return undefined;\n}\n\nfunction mergeAnthropicUsage(\n current: Record<string, unknown> | undefined,\n next: unknown,\n): Record<string, unknown> | undefined {\n if (!isRecord(next)) {\n return current;\n }\n\n return {\n ...(current ?? {}),\n ...next,\n };\n}\n\nfunction anthropicIndex(chunk: unknown): number | undefined {\n return isRecord(chunk) && typeof chunk.index === \"number\" ? chunk.index : undefined;\n}\n\nfunction startAnthropicToolBlock(\n blocks: Map<number, AnthropicToolBlock>,\n chunk: unknown,\n): void {\n const index = anthropicIndex(chunk);\n const contentBlock = isRecord(chunk) && isRecord(chunk.content_block)\n ? chunk.content_block\n : undefined;\n if (\n index === undefined ||\n contentBlock === undefined ||\n contentBlock.type !== \"tool_use\" ||\n typeof contentBlock.id !== \"string\" ||\n typeof contentBlock.name !== \"string\"\n ) {\n return;\n }\n\n blocks.set(index, {\n id: contentBlock.id,\n name: contentBlock.name,\n jsonParts: [],\n });\n}\n\nfunction anthropicTextDelta(chunk: unknown): string | undefined {\n if (!isRecord(chunk) || !isRecord(chunk.delta)) {\n return undefined;\n }\n\n return chunk.delta.type === \"text_delta\" && typeof chunk.delta.text === \"string\"\n ? chunk.delta.text\n : undefined;\n}\n\nfunction appendAnthropicToolInput(\n blocks: Map<number, AnthropicToolBlock>,\n chunk: unknown,\n): void {\n const index = anthropicIndex(chunk);\n if (index === undefined || !isRecord(chunk) || !isRecord(chunk.delta)) {\n return;\n }\n if (\n chunk.delta.type !== \"input_json_delta\" ||\n typeof chunk.delta.partial_json !== \"string\"\n ) {\n return;\n }\n\n blocks.get(index)?.jsonParts.push(chunk.delta.partial_json);\n}\n\nfunction completeAnthropicToolBlock(\n blocks: Map<number, AnthropicToolBlock>,\n chunk: unknown,\n): ToolUseRequest | undefined {\n const index = anthropicIndex(chunk);\n if (index === undefined) {\n return undefined;\n }\n\n const block = blocks.get(index);\n if (block === undefined) {\n return undefined;\n }\n blocks.delete(index);\n\n return {\n id: block.id,\n name: block.name,\n args: parseAnthropicToolInput(block),\n };\n}\n\nfunction parseAnthropicToolInput(block: AnthropicToolBlock): unknown {\n const value = block.jsonParts.join(\"\").trim();\n if (value.length === 0) {\n return {};\n }\n\n try {\n return JSON.parse(value) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\n throw new Error(`Anthropic stream returned invalid tool input JSON: ${message}`);\n }\n}\n\nfunction anthropicTextFromContent(content: readonly unknown[] | undefined): string {\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .flatMap((block) => isRecord(block) && block.type === \"text\" && typeof block.text === \"string\"\n ? [block.text]\n : [])\n .join(\"\");\n}\n\nfunction anthropicToolUseRequestsFromContent(\n content: readonly unknown[] | undefined,\n structuredOutput: ProviderStructuredOutputRequest | undefined,\n): readonly ToolUseRequest[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n const structuredToolName = anthropicStructuredOutputToolName(structuredOutput);\n return content.flatMap((block, index) => {\n if (\n !isRecord(block) ||\n block.type !== \"tool_use\" ||\n typeof block.name !== \"string\" ||\n block.name === structuredToolName\n ) {\n return [];\n }\n\n return [{\n id: typeof block.id === \"string\" ? block.id : `anthropic-tool-use-${index}`,\n name: block.name,\n args: block.input ?? {},\n }];\n });\n}\n\nfunction anthropicStructuredOutputFromContent(\n content: readonly unknown[] | undefined,\n request: ProviderStructuredOutputRequest | undefined,\n): unknown {\n const toolName = anthropicStructuredOutputToolName(request);\n if (toolName === undefined || !Array.isArray(content)) {\n return undefined;\n }\n\n const block = content.find((item) =>\n isRecord(item) &&\n item.type === \"tool_use\" &&\n item.name === toolName &&\n \"input\" in item,\n );\n\n return isRecord(block) ? block.input : undefined;\n}\n\nfunction anthropicStructuredOutputToolName(\n request: ProviderStructuredOutputRequest | undefined,\n): string | undefined {\n if (request === undefined) {\n return undefined;\n }\n\n return sanitizeToolName(request.name ?? `lattice_${request.output}`);\n}\n\nfunction sanitizeToolName(name: string): string {\n const sanitized = name.replace(/[^A-Za-z0-9_-]/gu, \"_\").slice(0, 64);\n return sanitized.length > 0 ? sanitized : \"lattice_output\";\n}\n\nfunction rawOutputsForRequest(input: {\n readonly outputs: readonly string[];\n readonly text: string;\n readonly structuredOutputRequest: ProviderStructuredOutputRequest | undefined;\n readonly structuredOutput: unknown;\n}): Record<string, unknown> {\n const rawOutputs: Record<string, unknown> = Object.fromEntries(\n input.outputs.map((name) => [name, input.text]),\n );\n if (\n input.structuredOutputRequest !== undefined &&\n input.structuredOutput !== undefined\n ) {\n rawOutputs[input.structuredOutputRequest.output] = input.structuredOutput;\n }\n\n return rawOutputs;\n}\n\nfunction finishMetadata(input: {\n readonly reason: string | undefined;\n readonly toolCallIds: readonly string[];\n}): ProviderFinishMetadata | undefined {\n const toolCallIds = input.toolCallIds.filter((id) => id.length > 0);\n if (input.reason === undefined && toolCallIds.length === 0) {\n return undefined;\n }\n\n return {\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(toolCallIds.length > 0 ? { toolCallIds } : {}),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Anthropic uses `input_tokens` / `output_tokens` (not OpenAI's\n * `prompt_tokens` / `completion_tokens`). This helper maps to Lattice's\n * `Usage` shape and applies pricing when supplied (Phase 7 pattern).\n */\nfunction normalizeAnthropicUsageToRunUsage(\n rawUsage: unknown,\n pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n },\n): Usage {\n let promptTokens = 0;\n let completionTokens = 0;\n if (typeof rawUsage === \"object\" && rawUsage !== null) {\n const record = rawUsage as Record<string, unknown>;\n promptTokens = numberField(record, \"input_tokens\") ?? numberField(record, \"inputTokens\") ?? 0;\n completionTokens =\n numberField(record, \"output_tokens\") ?? numberField(record, \"outputTokens\") ?? 0;\n }\n let costUsd: number | null = null;\n if (\n pricing !== undefined &&\n (pricing.inputPer1kTokens !== undefined || pricing.outputPer1kTokens !== undefined)\n ) {\n const inputCost = ((pricing.inputPer1kTokens ?? 0) * promptTokens) / 1000;\n const outputCost = ((pricing.outputPer1kTokens ?? 0) * completionTokens) / 1000;\n costUsd = inputCost + outputCost;\n }\n return { promptTokens, completionTokens, costUsd };\n}\n\nfunction normalizeAnthropicUsage(usage: unknown): UsageRecord | undefined {\n if (typeof usage !== \"object\" || usage === null) {\n return undefined;\n }\n const record = usage as Record<string, unknown>;\n const inputTokens = numberField(record, \"input_tokens\");\n const outputTokens = numberField(record, \"output_tokens\");\n const totalTokens =\n inputTokens !== undefined && outputTokens !== undefined\n ? inputTokens + outputTokens\n : undefined;\n return {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n };\n}\n\nfunction numberField(record: Record<string, unknown>, key: string): number | undefined {\n const value = record[key];\n return typeof value === \"number\" ? value : undefined;\n}\n","import type { ArtifactInput } from \"../artifacts/artifact.js\";\nimport type {\n ModelCapability,\n ProviderAdapter,\n ProviderRunRequest,\n ProviderRunResponse,\n Usage,\n} from \"./provider.js\";\nimport { defaultCapabilityForProvider } from \"../routing/catalog.js\";\n\nexport interface FakeProviderOptions {\n readonly id?: string;\n readonly modelId?: string;\n readonly response?:\n | ProviderRunResponse\n | ((request: ProviderRunRequest) => ProviderRunResponse | Promise<ProviderRunResponse>);\n readonly artifacts?: readonly ArtifactInput[];\n /**\n * Phase 7 addition: when provided, REPLACES the default single-capability\n * array so callers (notably Plan 07-04's modality/privacy reject tests)\n * can construct a fake adapter with arbitrary\n * `inputModalities` / `outputModalities` / `dataPolicy` / `pricing`\n * without mutating the returned adapter's readonly `capabilities` array.\n * When omitted, the existing default capability is used.\n */\n readonly capabilities?: readonly ModelCapability[];\n}\n\nconst DEFAULT_FAKE_USAGE: Usage = {\n promptTokens: 0,\n completionTokens: 0,\n costUsd: null,\n};\n\nexport function createFakeProvider(options: FakeProviderOptions = {}): ProviderAdapter {\n const id = options.id ?? \"fake\";\n const modelId = options.modelId ?? `${id}:deterministic`;\n const defaultCapability: ModelCapability = {\n ...defaultCapabilityForProvider(id),\n modelId,\n inputModalities: [\"text\", \"json\", \"image\", \"audio\", \"document\", \"file\", \"url\", \"tool\"],\n outputModalities: [\"text\", \"json\"],\n toolUse: true,\n };\n const capabilities = options.capabilities ?? [defaultCapability];\n\n return {\n id,\n kind: \"provider-adapter\",\n capabilities,\n async execute(request) {\n const baseResponse =\n typeof options.response === \"function\"\n ? await options.response(request)\n : options.response;\n\n if (baseResponse !== undefined) {\n return baseResponse.normalizedUsage !== undefined\n ? baseResponse\n : { ...baseResponse, normalizedUsage: { ...DEFAULT_FAKE_USAGE } };\n }\n\n return {\n rawOutputs: Object.fromEntries(\n request.outputs.map((name) => [name, defaultOutputForName(name)]),\n ),\n ...(options.artifacts !== undefined ? { artifactRefs: options.artifacts } : {}),\n normalizedUsage: { ...DEFAULT_FAKE_USAGE },\n };\n },\n };\n}\n\nfunction defaultOutputForName(name: string): unknown {\n if (/action|json|data|decision/u.test(name)) {\n return {\n kind: \"clarify\",\n reason: \"fake provider default structured response\",\n };\n }\n\n if (/citations|evidence/u.test(name)) {\n return [];\n }\n\n if (/generated|artifacts/u.test(name)) {\n return [];\n }\n\n return `Fake response for ${name}.`;\n}\n","import type { UsageRecord } from \"../plan/plan.js\";\nimport type {\n ProviderAdapter,\n ProviderFinishMetadata,\n ProviderRunRequest,\n ProviderRunResponse,\n ProviderStream,\n ProviderStructuredOutputRequest,\n ProviderToolChoice,\n ProviderToolDefinition,\n Usage,\n} from \"./provider.js\";\nimport { defaultCapabilityForProvider } from \"../routing/catalog.js\";\nimport type { GeminiQuirks } from \"./quirks.js\";\nimport type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport {\n NegotiationAuthError,\n synthesizeNegotiatedCapabilitiesFromRegistry,\n} from \"../capabilities/negotiate.js\";\nimport { getCapabilityProfile } from \"../capabilities/lookup.js\";\nimport { getRecommendedSanitizers } from \"../capabilities/sanitizer-recommendations.js\";\nimport type { RunEventSink } from \"../tracing/tracing.js\";\nimport { createRunEvent } from \"../tracing/tracing.js\";\nimport { parseToolUseEnvelope, type ToolUseRequest } from \"../tools/tool-use.js\";\nimport { standardSchemaToJsonSchema } from \"../tools/schema.js\";\nimport {\n validateToolCallRequests,\n type ValidateToolCallsOption,\n} from \"../tools/tool-call-validation.js\";\nimport {\n applyOutputSanitizers,\n type SanitizeOutputOption,\n} from \"../sanitizers/index.js\";\nimport {\n artifactBase64Data,\n artifactHttpUrl,\n geminiFileUri,\n mediaTypeForArtifact,\n packagedPlanForArtifact,\n} from \"./multimodal.js\";\nimport { readSseEvents } from \"./sse.js\";\nimport { assertNoPublicUrlEgress } from \"./no-public-url.js\";\n\n/**\n * Options for {@link createGeminiProvider}.\n *\n * Mirrors `OpenAICompatibleProviderOptions` ergonomics (Phase 7 pattern) but\n * for Google's Generative Language API at\n * `/v1beta/models/{model}:generateContent` -- which uses `contents[].parts[].text`\n * (NOT OpenAI's `messages[]`), `role: \"model\"` for assistant turns (NOT\n * `\"assistant\"`), authenticates via `?key=` query string for execute(), and applies a\n * 4-category `safetySettings` block at `BLOCK_NONE` thresholds (FSB convention\n * mirrored from `extension/ai/universal-provider.js:255-272`).\n *\n * SECURITY: `apiKey` is a runtime parameter -- do NOT hardcode or log it.\n *\n * STREAMING (Phase 44): supported through native `streamGenerateContent` SSE events.\n *\n * DEFERRED (Phase 4 carryforward notes):\n * - multimodal (vision) -- deferred\n * - resume-from-eviction -- see Phase 5 (MV3-survivability adapter contract)\n *\n * NOTE (Phase 34): negotiate() uses x-goog-api-key HEADER (preferred per RESEARCH §Q3).\n * The existing execute() path uses ?key= query string -- execute() migration is out-of-scope\n * for Phase 34 (additive only; T-34-04-01).\n *\n * Ref: FSB v0.10.0-attempt-2 Phase 4 (D-02 + D-07: full custom adapter; preserve role:\"model\").\n */\nexport interface GeminiProviderOptions {\n readonly id?: string;\n readonly model: string;\n readonly apiKey: string;\n /** Defaults to `https://generativelanguage.googleapis.com`. */\n readonly baseUrl?: string;\n readonly fetch?: typeof fetch;\n readonly pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n };\n /**\n * D-08: TTL for per-instance /models response cache, in milliseconds.\n * Default: 300_000ms (5 minutes). 0 = always refetch (tests). Infinity = process-lifetime.\n */\n readonly modelsCacheTtlMs?: number;\n /**\n * D-11: Number of retries on transient /models fetch errors. Default: 2.\n * Retry schedule: immediate + 200ms + 1000ms (3 total attempts at retryCount=2).\n * 0 = no retries (1 attempt total).\n */\n readonly modelsRetryCount?: number;\n /**\n * D-12: Optional event sink for observability. When provided, the adapter\n * emits a \"capabilities.negotiation.fallback\" RunEvent on transient /models failure.\n * If absent, no event is emitted (silent fallback).\n */\n readonly runEventSink?: RunEventSink;\n readonly sanitizeOutput?: SanitizeOutputOption;\n readonly validateToolCalls?: ValidateToolCallsOption;\n}\n\nconst DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com\";\nconst DEFAULT_MAX_OUTPUT_TOKENS = 2000;\nconst DEFAULT_TEMPERATURE = 0.7;\nconst DEFAULT_TOP_P = 0.9;\n\n/**\n * 4 HARM_CATEGORY entries at BLOCK_NONE (FSB convention mirrored from\n * `extension/ai/universal-provider.js:255-272`). If Google restricts\n * BLOCK_NONE in the future, that is a re-spec concern, not a Phase 4\n * design defect (CONTEXT.md Specific Ideas note).\n */\nconst SAFETY_SETTINGS = [\n { category: \"HARM_CATEGORY_HARASSMENT\", threshold: \"BLOCK_NONE\" },\n { category: \"HARM_CATEGORY_HATE_SPEECH\", threshold: \"BLOCK_NONE\" },\n { category: \"HARM_CATEGORY_SEXUALLY_EXPLICIT\", threshold: \"BLOCK_NONE\" },\n { category: \"HARM_CATEGORY_DANGEROUS_CONTENT\", threshold: \"BLOCK_NONE\" },\n] as const;\n\n/**\n * Phase 34 — D-03 — Gemini quirks block. Values verified against\n * Gemini API documentation and gemini.ts:50-55 (safety settings) behavior.\n *\n * CITED: https://ai.google.dev/api/generate-content#v1beta.GenerationConfig\n * - responseSchemaSupported: gemini-1.5-pro+ and gemini-2.x\n * - safetySettingsConfigurable: verified in gemini.ts:50-55\n * - systemInstructionSupported: gemini-1.5+ systemInstruction field\n */\nconst GEMINI_QUIRKS: GeminiQuirks = {\n supportsToolChoice: true,\n parallelToolCalls: true,\n structuredOutputs: true,\n responseFormatHonored: true,\n streamingDiverges: false,\n responseSchemaSupported: true, // CITED: Gemini API responseSchema/responseJsonSchema\n safetySettingsConfigurable: true, // VERIFIED: gemini.ts:50-55 4-category BLOCK_NONE\n systemInstructionSupported: true, // CITED: gemini-1.5+ supports system_instruction\n};\n\nasync function createGeminiGenerateContentBody(\n request: ProviderRunRequest,\n): Promise<Record<string, unknown>> {\n const parts = await createGeminiUserParts(request);\n const functionDeclarations = geminiFunctionDeclarations(request.nativeTools);\n const toolConfig = geminiToolConfig(request.nativeToolChoice);\n const structuredOutputConfig = geminiStructuredOutputConfig(request.nativeStructuredOutput);\n\n return {\n contents: [\n {\n role: \"user\",\n parts,\n },\n ],\n generationConfig: {\n temperature: DEFAULT_TEMPERATURE,\n topP: DEFAULT_TOP_P,\n maxOutputTokens: DEFAULT_MAX_OUTPUT_TOKENS,\n ...(structuredOutputConfig !== undefined ? structuredOutputConfig : {}),\n },\n safetySettings: SAFETY_SETTINGS,\n ...(functionDeclarations.length > 0\n ? { tools: [{ functionDeclarations }] }\n : {}),\n ...(toolConfig !== undefined ? { toolConfig } : {}),\n };\n}\n\nfunction geminiFunctionDeclarations(\n tools: readonly ProviderToolDefinition[] | undefined,\n): readonly Record<string, unknown>[] {\n return (tools ?? []).map((tool) => ({\n name: tool.name,\n ...(tool.description !== undefined ? { description: tool.description } : {}),\n parameters: standardSchemaToJsonSchema(tool.inputSchema),\n }));\n}\n\nfunction geminiToolConfig(choice: ProviderToolChoice | undefined): Record<string, unknown> | undefined {\n if (choice === undefined) {\n return undefined;\n }\n if (choice === \"auto\") {\n return { functionCallingConfig: { mode: \"AUTO\" } };\n }\n if (choice === \"none\") {\n return { functionCallingConfig: { mode: \"NONE\" } };\n }\n if (choice === \"required\") {\n return { functionCallingConfig: { mode: \"ANY\" } };\n }\n\n return {\n functionCallingConfig: {\n mode: \"ANY\",\n allowedFunctionNames: [choice.name],\n },\n };\n}\n\nfunction geminiStructuredOutputConfig(\n request: ProviderStructuredOutputRequest | undefined,\n): Record<string, unknown> | undefined {\n if (request === undefined) {\n return undefined;\n }\n\n return {\n responseMimeType: \"application/json\",\n responseSchema: standardSchemaToJsonSchema(request.schema),\n };\n}\n\nasync function createGeminiUserParts(\n request: ProviderRunRequest,\n): Promise<readonly Record<string, unknown>[]> {\n const parts: Record<string, unknown>[] = [{ text: request.task }];\n\n for (const inputArtifact of request.artifacts) {\n if (!isGeminiMediaArtifact(inputArtifact.kind)) {\n continue;\n }\n\n const packaged = packagedPlanForArtifact(request, inputArtifact.id);\n if (packaged === undefined) {\n continue;\n }\n\n if (packaged.transport === \"file-id\") {\n const fileUri = geminiFileUri(inputArtifact);\n if (fileUri === undefined) {\n continue;\n }\n parts.push({\n fileData: {\n mimeType: mediaTypeForArtifact(inputArtifact, fallbackGeminiMimeType(inputArtifact.kind)),\n fileUri,\n },\n });\n continue;\n }\n\n if (packaged.transport === \"url\") {\n const fileUri = artifactHttpUrl(inputArtifact);\n if (fileUri === undefined) {\n continue;\n }\n parts.push({\n fileData: {\n mimeType: mediaTypeForArtifact(inputArtifact, fallbackGeminiMimeType(inputArtifact.kind)),\n fileUri,\n },\n });\n continue;\n }\n\n if (packaged.transport === \"base64\" || packaged.transport === \"inline\") {\n const data = await artifactBase64Data(inputArtifact);\n if (data === undefined) {\n continue;\n }\n parts.push({\n inlineData: {\n mimeType: mediaTypeForArtifact(inputArtifact, fallbackGeminiMimeType(inputArtifact.kind)),\n data,\n },\n });\n }\n }\n\n return parts;\n}\n\nfunction isGeminiMediaArtifact(kind: string): kind is \"image\" | \"audio\" | \"video\" {\n return kind === \"image\" || kind === \"audio\" || kind === \"video\";\n}\n\nfunction fallbackGeminiMimeType(kind: \"image\" | \"audio\" | \"video\"): string {\n switch (kind) {\n case \"image\":\n return \"image/jpeg\";\n case \"audio\":\n return \"audio/mpeg\";\n case \"video\":\n return \"video/mp4\";\n }\n}\n\nfunction geminiGenerateContentUrl(input: {\n readonly baseUrl: string;\n readonly model: string;\n readonly apiKey: string;\n readonly stream?: boolean;\n}): string {\n const method = input.stream === true ? \"streamGenerateContent\" : \"generateContent\";\n const params = new URLSearchParams({ key: input.apiKey });\n if (input.stream === true) {\n params.set(\"alt\", \"sse\");\n }\n\n const encodedModel = encodeURIComponent(input.model);\n return `${input.baseUrl}/v1beta/models/${encodedModel}:${method}?${params.toString()}`;\n}\n\n/**\n * Phase 34 — D-03 / D-05..D-12 — Extended Gemini provider factory.\n *\n * Returns a `ProviderAdapter` narrowed to expose:\n * - `quirks: GeminiQuirks` — static adapter capability flags\n * - `negotiateCapabilities(modelId)` — live /v1beta/models fetch with medium-thick\n * derivation (inputTokenLimit + thinking + supportedGenerationMethods from upstream)\n * intersected with Phase 33 registry; TTL cache + inflight coalescing + retry +\n * auth-throw + transient-fallback + event.\n *\n * NOTE on auth strategy (T-34-04-01): negotiate() uses x-goog-api-key HEADER\n * (preferred per RESEARCH §Q3 -- avoids leaking the key in server-side logs that\n * capture URL query strings). The existing execute() path uses ?key= query string\n * and is NOT changed by Phase 34 (out-of-scope migration).\n */\nexport function createGeminiProvider(\n options: GeminiProviderOptions,\n): ProviderAdapter & {\n readonly quirks: GeminiQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const id = options.id ?? \"gemini\";\n const fetchImpl = options.fetch ?? fetch;\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/u, \"\");\n\n // D-05/D-06: per-instance cache and inflight Maps. Live inside the closure so\n // each createGeminiProvider({}) call gets its own Map (no cross-contamination).\n const ttlMs = options.modelsCacheTtlMs ?? 300_000;\n const retryCount = options.modelsRetryCount ?? 2;\n const cache = new Map<string, { result: NegotiatedCapabilities; expiresAt: number }>();\n const inflight = new Map<string, Promise<NegotiatedCapabilities>>();\n\n /**\n * D-07 lazy expiry + Q7 inflight coalescing + Pitfall 4 .finally cleanup.\n * Public surface: `adapter.negotiateCapabilities(modelId)`.\n */\n async function negotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // 1. Cache check (D-07 lazy expiry)\n const cached = cache.get(modelId);\n if (cached !== undefined && cached.expiresAt > Date.now()) return cached.result;\n\n // 2. Inflight coalesce (Q7)\n const existing = inflight.get(modelId);\n if (existing !== undefined) return existing;\n\n // 3. New fetch promise; clear inflight in .finally (Pitfall 4)\n const fetchPromise = (async () => {\n try {\n const result = await fetchAndNegotiate(modelId);\n if (ttlMs > 0) {\n cache.set(modelId, { result, expiresAt: Date.now() + ttlMs });\n }\n return result;\n } finally {\n inflight.delete(modelId);\n }\n })();\n\n inflight.set(modelId, fetchPromise);\n return fetchPromise;\n }\n\n /**\n * Phase 34 — D-09..D-11 — Fetches /v1beta/models and merges with registry.\n *\n * URL: ${baseUrl}/v1beta/models (NOT /v1/models -- Gemini uses /v1beta/ prefix)\n * Auth: x-goog-api-key HEADER (preferred per RESEARCH §Q3 -- NOT ?key= query-string;\n * avoids leaking the key in server-side log captures of request URLs).\n * Retry: [0ms, 200ms, 1000ms] backoff on transient errors (D-11).\n * Auth error (401/403): throws NegotiationAuthError (D-10, no fallback).\n * Transient error (5xx/network): falls back to registry with \"registry-fallback\" (D-09).\n */\n async function fetchAndNegotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // NOTE: URL is /v1beta/models (not /v1/models -- Gemini API prefix differs from OpenAI)\n const url = `${baseUrl}/v1beta/models`;\n const headers: Record<string, string> = {\n // SECURITY: key sent as HEADER (x-goog-api-key), NOT as ?key= query-string.\n // RESEARCH §Q3: header form is preferred to avoid leaking the key in upstream logs.\n \"x-goog-api-key\": options.apiKey,\n \"accept\": \"application/json\",\n };\n\n const attempts = retryCount + 1;\n const backoffSchedule = [0, 200, 1000];\n let lastErr: unknown;\n\n for (let i = 0; i < attempts; i += 1) {\n const delay = backoffSchedule[i] ?? 1000;\n if (delay > 0) {\n await new Promise<void>((r) => setTimeout(r, delay));\n }\n try {\n const resp = await fetchImpl(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n\n if (resp.status === 401 || resp.status === 403) {\n throw new NegotiationAuthError(\n \"gemini\",\n modelId,\n resp.status as 401 | 403,\n `Gemini /v1beta/models returned ${resp.status}: check apiKey config.`,\n );\n }\n\n if (!resp.ok) {\n throw new Error(`HTTP ${resp.status}`);\n }\n\n const body: unknown = await resp.json();\n return mergeGeminiModelsWithRegistry(modelId, body);\n } catch (err) {\n if (err instanceof NegotiationAuthError) throw err; // D-10: auth never falls back\n lastErr = err;\n }\n }\n\n // All retries exhausted -- fallback + event (D-09/D-12)\n emitFallbackEvent({\n adapter: \"gemini\",\n modelId,\n errorReason: stringifyErr(lastErr),\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"gemini\", modelId, \"registry-fallback\");\n }\n\n /**\n * MEDIUM-THICK derivation: consumes upstream truth from Gemini /v1beta/models\n * where available (inputTokenLimit -> contextWindow, thinking -> extendedThinking,\n * supportedGenerationMethods -> streaming + nativeToolCalling) and falls back\n * to registry for the rest (knownFailureModes, recommendedSanitizers).\n *\n * Lenient parsing per Pitfall 1: all field accesses use optional chaining.\n * Missing `thinking` field does not crash -- defaults to false.\n */\n function mergeGeminiModelsWithRegistry(\n modelId: string,\n body: unknown,\n ): NegotiatedCapabilities {\n const models = (body as Record<string, unknown>)?.models;\n\n // Lenient model search: Gemini names are \"models/${id}\", base id, or exact name\n const found = Array.isArray(models)\n ? (models as unknown[]).find((m: unknown) => {\n const rec = m as Record<string, unknown>;\n return (\n rec?.name === `models/${modelId}` ||\n rec?.baseModelId === modelId ||\n rec?.name === modelId\n );\n })\n : undefined;\n\n if (found === undefined) {\n // Model not found in /models response -- treat as registry-fallback\n emitFallbackEvent({\n adapter: \"gemini\",\n modelId,\n errorReason: \"model not found in /v1beta/models response\",\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"gemini\", modelId, \"registry-fallback\");\n }\n\n const foundRec = found as Record<string, unknown>;\n const registryProfile = getCapabilityProfile(`gemini:${modelId}`);\n\n // THICK derivation from upstream\n const contextWindow =\n typeof foundRec.inputTokenLimit === \"number\" && foundRec.inputTokenLimit > 0\n ? foundRec.inputTokenLimit\n : (registryProfile?.contextWindow ?? 0);\n\n // thinking field: THICK from upstream; missing field -> false (lenient parse)\n const extendedThinking =\n foundRec.thinking === true;\n\n // supportedGenerationMethods: THICK from upstream\n const methods = Array.isArray(foundRec.supportedGenerationMethods)\n ? (foundRec.supportedGenerationMethods as unknown[]).map(String)\n : [];\n const streaming = methods.includes(\"streamGenerateContent\");\n // nativeToolCalling: generateContent method indicates tools surface\n const nativeToolCalling = methods.includes(\"generateContent\") || methods.length > 0;\n\n // structuredOutputs and parallelToolCalls: from quirks-block-style adapter posture\n // (Gemini 1.5+ supports responseSchema; per-model truth lives in registry)\n const structuredOutputs = true; // quirks.responseSchemaSupported (adapter posture)\n const parallelToolCalls = true; // Gemini supports parallel tool calls\n\n const knownFailureModes = registryProfile?.knownFailureModes ?? [];\n const recommendedSanitizers = getRecommendedSanitizers(knownFailureModes);\n\n return {\n modelId,\n contextWindow,\n supports: {\n nativeToolCalling,\n structuredOutputs,\n parallelToolCalls,\n extendedThinking,\n streaming,\n },\n knownFailureModes,\n recommendedSanitizers,\n source: \"live\",\n };\n }\n\n /**\n * D-12: Emit capabilities.negotiation.fallback RunEvent via the optional sink.\n * SECURITY (T-34-04-02): stringifyErr extracts err.message only -- NOT err.stack\n * or JSON.stringify(headers), so the apiKey cannot leak into the event payload.\n * Synthetic runId pattern: negotiate happens outside a run; documented here.\n */\n function emitFallbackEvent(payload: {\n adapter: string;\n modelId: string;\n errorReason: string;\n fallbackSource: string;\n }): void {\n if (options.runEventSink === undefined) return;\n const event = createRunEvent(\"capabilities.negotiation.fallback\", {\n runId: `negotiate-gemini-${payload.modelId}`,\n providerId: id,\n modelId: payload.modelId,\n metadata: {\n adapter: payload.adapter,\n modelId: payload.modelId,\n errorReason: payload.errorReason,\n fallbackSource: payload.fallbackSource,\n },\n });\n void options.runEventSink(event);\n }\n\n return {\n id,\n kind: \"provider-adapter\",\n capabilities: [\n {\n ...defaultCapabilityForProvider(id),\n modelId: options.model,\n fileTransport: [\"inline\", \"json\", \"url\", \"base64\", \"file-id\", \"extracted-text\", \"transcript\"],\n streaming: true,\n },\n ],\n quirks: GEMINI_QUIRKS,\n negotiateCapabilities: negotiate,\n async execute(request) {\n const requestBody = await createGeminiGenerateContentBody(request);\n const bodyStr = JSON.stringify(requestBody);\n assertNoPublicUrlEgress(request, id, bodyStr);\n const init: RequestInit = {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: bodyStr,\n ...(request.signal !== undefined ? { signal: request.signal } : {}),\n };\n\n const url = geminiGenerateContentUrl({\n baseUrl,\n model: options.model,\n apiKey: options.apiKey,\n });\n const response = await fetchImpl(url, init);\n\n if (!response.ok) {\n throw new Error(`Gemini provider failed with ${response.status}.`);\n }\n\n const body = (await response.json()) as {\n candidates?: readonly {\n content?: { parts?: readonly { text?: unknown }[] };\n finishReason?: unknown;\n }[];\n usageMetadata?: unknown;\n };\n\n if (!Array.isArray(body.candidates) || body.candidates.length === 0) {\n throw new Error(\"Gemini provider returned no candidates.\");\n }\n\n const text = geminiTextFromBody(body);\n const structuredOutput = request.nativeStructuredOutput === undefined\n ? undefined\n : parseJsonValue(text);\n const rawOutputs = rawOutputsForRequest({\n outputs: request.outputs,\n text,\n structuredOutputRequest: request.nativeStructuredOutput,\n structuredOutput,\n });\n const sanitizedOutputs = await applyOutputSanitizers(rawOutputs, options.sanitizeOutput, {\n providerId: id,\n modelId: options.model,\n });\n const parsedToolCalls = parseToolUseEnvelope(text);\n const promptToolCalls = parsedToolCalls === null\n ? undefined\n : await validateToolCallRequests(parsedToolCalls, options.validateToolCalls);\n const nativeToolRequests = geminiParts(body)\n .flatMap(({ part, candidateIndex, partIndex }) => {\n const request = geminiFunctionCallRequest(part, candidateIndex, partIndex);\n return request === undefined ? [] : [request];\n });\n const nativeToolCalls = nativeToolRequests.length === 0\n ? undefined\n : await validateToolCallRequests(nativeToolRequests, options.validateToolCalls);\n const hasToolCallResult = promptToolCalls !== undefined || nativeToolCalls !== undefined;\n const toolCalls = [\n ...(promptToolCalls ?? []),\n ...(nativeToolCalls ?? []),\n ];\n const usage = normalizeGeminiUsage(body.usageMetadata);\n const normalizedUsage = normalizeGeminiUsageToRunUsage(body.usageMetadata, options.pricing);\n const finish = finishMetadata({\n reason: geminiFinishReason(body),\n toolCallIds: toolCalls.map((toolCall) => toolCall.id),\n });\n\n return {\n rawOutputs: sanitizedOutputs,\n ...(usage !== undefined ? { usage } : {}),\n normalizedUsage,\n ...(hasToolCallResult ? { toolCalls } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: body,\n };\n },\n executeStream(request) {\n return streamGeminiResponse({\n id,\n model: options.model,\n baseUrl,\n apiKey: options.apiKey,\n fetchImpl,\n request,\n ...(options.pricing !== undefined ? { pricing: options.pricing } : {}),\n ...(options.sanitizeOutput !== undefined ? { sanitizeOutput: options.sanitizeOutput } : {}),\n ...(options.validateToolCalls !== undefined\n ? { validateToolCalls: options.validateToolCalls }\n : {}),\n });\n },\n };\n}\n\nasync function* streamGeminiResponse(input: {\n readonly id: string;\n readonly model: string;\n readonly baseUrl: string;\n readonly apiKey: string;\n readonly fetchImpl: typeof fetch;\n readonly request: ProviderRunRequest;\n readonly pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n };\n readonly sanitizeOutput?: SanitizeOutputOption;\n readonly validateToolCalls?: ValidateToolCallsOption;\n}): ProviderStream {\n const requestBody = await createGeminiGenerateContentBody(input.request);\n const streamBodyStr = JSON.stringify(requestBody);\n assertNoPublicUrlEgress(input.request, input.id, streamBodyStr);\n const response = await input.fetchImpl(\n geminiGenerateContentUrl({\n baseUrl: input.baseUrl,\n model: input.model,\n apiKey: input.apiKey,\n stream: true,\n }),\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: streamBodyStr,\n ...(input.request.signal !== undefined ? { signal: input.request.signal } : {}),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Gemini provider failed with ${response.status}.`);\n }\n\n const textParts: string[] = [];\n const rawChunks: unknown[] = [];\n const nativeToolRequests: ToolUseRequest[] = [];\n let usagePayload: unknown;\n let finishReason: string | undefined;\n\n for await (const event of readSseEvents(response)) {\n const data = event.data.trim();\n if (data.length === 0) {\n continue;\n }\n if (data === \"[DONE]\") {\n break;\n }\n\n const chunk = parseJsonObject(data, \"Gemini\");\n rawChunks.push(chunk);\n const usage = geminiUsageMetadata(chunk);\n if (usage !== undefined) {\n usagePayload = usage;\n }\n finishReason = geminiFinishReason(chunk) ?? finishReason;\n\n for (const { part, candidateIndex, partIndex } of geminiParts(chunk)) {\n if (typeof part.text === \"string\" && part.text.length > 0) {\n textParts.push(part.text);\n for (const output of input.request.outputs) {\n yield { kind: \"text-delta\", output, text: part.text };\n }\n }\n\n const toolRequest = geminiFunctionCallRequest(part, candidateIndex, partIndex);\n if (toolRequest !== undefined) {\n nativeToolRequests.push(toolRequest);\n }\n }\n }\n\n const text = textParts.join(\"\");\n const structuredOutput = input.request.nativeStructuredOutput === undefined\n ? undefined\n : parseJsonValue(text);\n const rawOutputs = rawOutputsForRequest({\n outputs: input.request.outputs,\n text,\n structuredOutputRequest: input.request.nativeStructuredOutput,\n structuredOutput,\n });\n const sanitizedOutputs = await applyOutputSanitizers(rawOutputs, input.sanitizeOutput, {\n providerId: input.id,\n modelId: input.model,\n });\n const parsedToolCalls = parseToolUseEnvelope(text);\n const promptToolCalls = parsedToolCalls === null\n ? undefined\n : await validateToolCallRequests(parsedToolCalls, input.validateToolCalls);\n const nativeToolCalls = nativeToolRequests.length === 0\n ? undefined\n : await validateToolCallRequests(nativeToolRequests, input.validateToolCalls);\n const toolCalls = [\n ...(promptToolCalls ?? []),\n ...(nativeToolCalls ?? []),\n ];\n const usage = normalizeGeminiUsage(usagePayload);\n const normalizedUsage = normalizeGeminiUsageToRunUsage(usagePayload, input.pricing);\n const finish = finishMetadata({\n reason: finishReason,\n toolCallIds: toolCalls.map((toolCall) => toolCall.id),\n });\n\n yield {\n kind: \"complete\",\n rawOutputs: sanitizedOutputs,\n ...(usage !== undefined ? { usage } : {}),\n normalizedUsage,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: {\n kind: \"gemini-stream\",\n chunks: rawChunks,\n },\n };\n}\n\nfunction parseJsonObject(data: string, providerName: string): unknown {\n try {\n return JSON.parse(data) as unknown;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON.\";\n throw new Error(`${providerName} stream returned invalid JSON: ${message}`);\n }\n}\n\nfunction geminiUsageMetadata(chunk: unknown): unknown {\n return isRecord(chunk) ? chunk.usageMetadata : undefined;\n}\n\nfunction geminiFinishReason(chunk: unknown): string | undefined {\n if (!isRecord(chunk) || !Array.isArray(chunk.candidates)) {\n return undefined;\n }\n\n for (const candidate of chunk.candidates) {\n if (isRecord(candidate) && typeof candidate.finishReason === \"string\") {\n return candidate.finishReason;\n }\n }\n\n return undefined;\n}\n\nfunction geminiTextFromBody(body: unknown): string {\n return geminiParts(body)\n .flatMap(({ part }) => typeof part.text === \"string\" ? [part.text] : [])\n .join(\"\");\n}\n\nfunction geminiParts(chunk: unknown): Array<{\n readonly part: Record<string, unknown>;\n readonly candidateIndex: number;\n readonly partIndex: number;\n}> {\n if (!isRecord(chunk) || !Array.isArray(chunk.candidates)) {\n return [];\n }\n\n return chunk.candidates.flatMap((candidate, candidateIndex) => {\n if (!isRecord(candidate) || !isRecord(candidate.content)) {\n return [];\n }\n const parts = candidate.content.parts;\n if (!Array.isArray(parts)) {\n return [];\n }\n\n return parts.flatMap((part, partIndex) =>\n isRecord(part) ? [{ part, candidateIndex, partIndex }] : [],\n );\n });\n}\n\nfunction geminiFunctionCallRequest(\n part: Record<string, unknown>,\n candidateIndex: number,\n partIndex: number,\n): ToolUseRequest | undefined {\n if (!isRecord(part.functionCall)) {\n return undefined;\n }\n\n const name = part.functionCall.name;\n if (typeof name !== \"string\") {\n return undefined;\n }\n\n return {\n id: `gemini-function-call-${candidateIndex}-${partIndex}`,\n name,\n args: part.functionCall.args ?? {},\n };\n}\n\nfunction parseJsonValue(text: string): unknown {\n const trimmed = text.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction rawOutputsForRequest(input: {\n readonly outputs: readonly string[];\n readonly text: string;\n readonly structuredOutputRequest: ProviderStructuredOutputRequest | undefined;\n readonly structuredOutput: unknown;\n}): Record<string, unknown> {\n const rawOutputs: Record<string, unknown> = Object.fromEntries(\n input.outputs.map((name) => [name, input.text]),\n );\n if (\n input.structuredOutputRequest !== undefined &&\n input.structuredOutput !== undefined\n ) {\n rawOutputs[input.structuredOutputRequest.output] = input.structuredOutput;\n }\n\n return rawOutputs;\n}\n\nfunction finishMetadata(input: {\n readonly reason: string | undefined;\n readonly toolCallIds: readonly string[];\n}): ProviderFinishMetadata | undefined {\n const toolCallIds = input.toolCallIds.filter((id) => id.length > 0);\n if (input.reason === undefined && toolCallIds.length === 0) {\n return undefined;\n }\n\n return {\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(toolCallIds.length > 0 ? { toolCallIds } : {}),\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Gemini uses `usageMetadata.promptTokenCount` / `candidatesTokenCount` /\n * `totalTokenCount` (NOT OpenAI's `prompt_tokens` / `completion_tokens`).\n * This helper maps to Lattice's `Usage` shape and applies pricing when supplied.\n */\nfunction normalizeGeminiUsageToRunUsage(\n rawUsage: unknown,\n pricing?: {\n readonly inputPer1kTokens?: number;\n readonly outputPer1kTokens?: number;\n },\n): Usage {\n let promptTokens = 0;\n let completionTokens = 0;\n if (typeof rawUsage === \"object\" && rawUsage !== null) {\n const record = rawUsage as Record<string, unknown>;\n promptTokens = numberField(record, \"promptTokenCount\") ?? 0;\n completionTokens = numberField(record, \"candidatesTokenCount\") ?? 0;\n }\n let costUsd: number | null = null;\n if (\n pricing !== undefined &&\n (pricing.inputPer1kTokens !== undefined || pricing.outputPer1kTokens !== undefined)\n ) {\n const inputCost = ((pricing.inputPer1kTokens ?? 0) * promptTokens) / 1000;\n const outputCost = ((pricing.outputPer1kTokens ?? 0) * completionTokens) / 1000;\n costUsd = inputCost + outputCost;\n }\n return { promptTokens, completionTokens, costUsd };\n}\n\nfunction normalizeGeminiUsage(usage: unknown): UsageRecord | undefined {\n if (typeof usage !== \"object\" || usage === null) {\n return undefined;\n }\n const record = usage as Record<string, unknown>;\n const inputTokens = numberField(record, \"promptTokenCount\");\n const outputTokens = numberField(record, \"candidatesTokenCount\");\n const totalTokens = numberField(record, \"totalTokenCount\");\n return {\n ...(inputTokens !== undefined ? { inputTokens } : {}),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n ...(totalTokens !== undefined ? { totalTokens } : {}),\n };\n}\n\nfunction numberField(record: Record<string, unknown>, key: string): number | undefined {\n const value = record[key];\n return typeof value === \"number\" ? value : undefined;\n}\n\n/**\n * T-34-04-02: Returns err.message only -- NOT err.stack (which could include\n * headers or the apiKey via a fetch rejection), NOT JSON.stringify(err).\n */\nfunction stringifyErr(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","import type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport { synthesizeNegotiatedCapabilitiesFromRegistry } from \"../capabilities/negotiate.js\";\nimport type { GatewayPolicy } from \"../policy/policy.js\";\nimport { createOpenAICompatibleProvider, type OpenAICompatibleProviderOptions } from \"./adapters.js\";\nimport type { ProviderAdapter } from \"./provider.js\";\nimport type { LiteLLMQuirks } from \"./quirks.js\";\n\n/**\n * Options for {@link createLiteLLMProvider}.\n *\n * Thin wrapper around {@link createOpenAICompatibleProvider} pinned to the\n * documented local LiteLLM proxy URL. LiteLLM is treated as an\n * OpenAI-compatible gateway over HTTP; this helper does not start, embed, or\n * depend on a LiteLLM gateway process.\n */\nexport interface LiteLLMProviderOptions\n extends Omit<OpenAICompatibleProviderOptions, \"id\" | \"baseUrl\" | \"gateway\"> {\n readonly id?: string;\n /** Defaults to `http://localhost:4000`. Override for hosted proxies or `/v1` deployments. */\n readonly baseUrl?: string;\n readonly gateway?: GatewayPolicy;\n}\n\nconst DEFAULT_LITELLM_BASE_URL = \"http://localhost:4000\";\n\nexport function createLiteLLMProvider(\n options: LiteLLMProviderOptions,\n): ProviderAdapter & {\n readonly quirks: LiteLLMQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const resolvedId = options.id ?? \"litellm\";\n const resolvedBaseUrl = options.baseUrl ?? DEFAULT_LITELLM_BASE_URL;\n const gateway: GatewayPolicy = {\n allowFallbacks: false,\n ...options.gateway,\n };\n\n const inner = createOpenAICompatibleProvider({\n ...options,\n id: resolvedId,\n baseUrl: resolvedBaseUrl,\n gateway,\n });\n\n const negotiate = async (modelId: string): Promise<NegotiatedCapabilities> => {\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"litellm\", modelId, \"registry\");\n };\n\n return {\n ...inner,\n quirks: {\n supportsToolChoice: false,\n parallelToolCalls: false,\n structuredOutputs: false,\n responseFormatHonored: false,\n streamingDiverges: true,\n gatewayMetadataSupported: true,\n gatewayFallbacksSupported: true,\n openAIErrorMapping: true,\n } satisfies LiteLLMQuirks,\n negotiateCapabilities: negotiate,\n };\n}\n","import type { ProviderAdapter } from \"./provider.js\";\nimport type { LmStudioQuirks } from \"./quirks.js\";\nimport type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport { synthesizeNegotiatedCapabilitiesFromRegistry } from \"../capabilities/negotiate.js\";\nimport { createOpenAICompatibleProvider, type OpenAICompatibleProviderOptions } from \"./adapters.js\";\n\n/**\n * Options for {@link createLmStudioProvider}.\n *\n * Thin wrapper around {@link createOpenAICompatibleProvider} pinned to\n * LM Studio's default local server URL `http://localhost:1234/v1`. Wire\n * shape is OpenAI Chat Completions. LM Studio is no-auth by convention\n * (CD-03): `apiKey` is OPTIONAL; when omitted, the underlying factory\n * sends no `Authorization` header (see\n * `lattice/packages/lattice/src/providers/adapters.ts:53` for the\n * conditional auth-header wiring).\n *\n * Phase 34 additions:\n * - `modelsCacheTtlMs` -- Reserved for future /models discovery; LM Studio\n * currently has no remote /models endpoint. Accepted for option-bag\n * uniformity but NOT USED (D-04 intentional no-endpoint pattern).\n * - `runEventSink` -- Accepted for option-bag uniformity but NEVER fired\n * because source: \"registry\" is the documented happy path for LM Studio\n * (no event for intentional no-endpoint per RESEARCH Open Question 5).\n *\n * STREAMING (Phase 44): supported through the OpenAI-compatible stream path.\n *\n * DEFERRED (D-16 carryforward):\n * - latency-tail diagnostics -- observability concern; LM Studio is\n * the canary for latency tails (INV-03);\n * diagnostics module deferred to a\n * follow-on observability phase.\n * - resume-from-eviction -- see Phase 5 (MV3-survivability adapter).\n *\n * Ref: FSB v0.10.0-attempt-2 Phase 4 (D-03: thin wrapper; D-16: latency-tail deferred; CD-03 no-opt-out).\n */\nexport interface LmStudioProviderOptions\n extends Omit<OpenAICompatibleProviderOptions, \"id\" | \"baseUrl\" | \"apiKey\"> {\n readonly id?: string;\n /** Defaults to `http://localhost:1234/v1`. Override for non-localhost deployments. */\n readonly baseUrl?: string;\n /**\n * Optional. LM Studio is no-auth by convention (CD-03 default).\n * When provided, sent as `Authorization: Bearer <apiKey>` (matches the\n * underlying OpenAI-compat factory). Use only for proxied LM Studio\n * deployments that have a token gate in front.\n */\n readonly apiKey?: string;\n}\n\nconst DEFAULT_LM_STUDIO_BASE_URL = \"http://localhost:1234/v1\";\n\n/**\n * Phase 34 — D-04 / QUIRK-02 — LM Studio provider factory.\n *\n * LM Studio is the prototypical \"intentional no remote /models endpoint\"\n * adapter per D-04 (alongside OpenAI-compat). The factory returns conservative\n * defaults for the quirks block because LM Studio runs LOCAL quantized models\n * whose capabilities vary wildly by chat template + model file.\n *\n * The `negotiateCapabilities` method performs NO fetch; it returns\n * `synthesizeNegotiatedCapabilitiesFromRegistry` with source: \"registry\"\n * (the intentional-no-endpoint signal, distinct from \"registry-fallback\"\n * which signals a transient failure). Mirrors Plan 34-03 Task 2 (OpenAI-compat\n * registry-only pattern) verbatim.\n *\n * D-04 citation: \"consumer adapters without a /models endpoint skip the\n * fetch layer entirely and delegate to synthesizeNegotiatedCapabilitiesFromRegistry.\"\n *\n * Open Question 5 (RESEARCH §): no event emitted for source: \"registry\" because\n * this is the intentional happy path for LM Studio -- emitting a \"fallback\" event\n * would produce false-positive noise for consumers monitoring the event stream.\n */\nexport function createLmStudioProvider(\n options: LmStudioProviderOptions,\n): ProviderAdapter & {\n readonly quirks: LmStudioQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const resolvedId = options.id ?? \"lm-studio\";\n const resolvedBaseUrl = options.baseUrl ?? DEFAULT_LM_STUDIO_BASE_URL;\n\n // Phase 34 — D-04 — LM Studio negotiate() is registry-only.\n // No fetch, no cache, no inflight coalescing, no event emission.\n // Source: \"registry\" signals intentional no-endpoint (per D-04).\n // Open Question 5: no event emitted for source: \"registry\" (intentional no-endpoint).\n const negotiate = async (modelId: string): Promise<NegotiatedCapabilities> => {\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"lm-studio\", modelId, \"registry\");\n };\n\n // Delegate execute() and capabilities to the OpenAI-compat factory.\n const inner = createOpenAICompatibleProvider({\n ...options,\n id: resolvedId,\n baseUrl: resolvedBaseUrl,\n });\n\n return {\n ...inner,\n // Phase 34 — QUIRK-02 / LmStudioQuirks — conservative defaults.\n // LM Studio runs LOCAL quantized models whose capabilities vary wildly\n // by chat template + model file. Conservative false values for all 5\n // universal booleans. streamingDiverges: true because some LM Studio\n // chat templates produce different output streaming vs buffered.\n //\n // CITED: lmstudio-bug-tracker issue 1342 -- Jinja template mismatches\n // between model training and LM Studio server defaults cause output\n // format corruption -> customChatTemplateRiskFlag: true\n // VERIFIED: lm-studio.ts apiKey is optional (CD-03) ->\n // noAuthRequired: true (no auth needed for local localhost:1234 server)\n quirks: {\n supportsToolChoice: false,\n parallelToolCalls: false,\n structuredOutputs: false,\n responseFormatHonored: false,\n streamingDiverges: true,\n customChatTemplateRiskFlag: true,\n noAuthRequired: true,\n } satisfies LmStudioQuirks,\n negotiateCapabilities: negotiate,\n };\n}\n","import type { ProviderAdapter, ProviderStream } from \"./provider.js\";\nimport { createOpenAICompatibleProvider, type OpenAICompatibleProviderOptions } from \"./adapters.js\";\nimport type { OpenRouterQuirks } from \"./quirks.js\";\nimport type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport {\n NegotiationAuthError,\n synthesizeNegotiatedCapabilitiesFromRegistry,\n} from \"../capabilities/negotiate.js\";\nimport { getCapabilityProfile, stripOpenRouterVariant } from \"../capabilities/lookup.js\";\nimport { getRecommendedSanitizers } from \"../capabilities/sanitizer-recommendations.js\";\nimport type { RunEventSink } from \"../tracing/tracing.js\";\nimport { createRunEvent } from \"../tracing/tracing.js\";\n\n/**\n * Options for {@link createOpenRouterProvider}.\n *\n * Thin wrapper around {@link createOpenAICompatibleProvider} pinned to\n * OpenRouter's base URL `https://openrouter.ai/api/v1`. Wire shape is\n * OpenAI Chat Completions; no provider-specific quirks at the\n * single-shot Promise contract level.\n *\n * SECURITY: `apiKey` is a runtime parameter -- do NOT hardcode or log it.\n *\n * STREAMING (Phase 44): supported through the OpenAI-compatible stream path.\n *\n * DEFERRED (D-17 carryforward; Phase 4 ships the named adapter as a\n * first-class OpenAI-compat wrapper):\n * - per-message routing -- deferred.\n * - resume-from-eviction -- see Phase 5 (MV3-survivability adapter).\n *\n * Ref: FSB v0.10.0-attempt-2 Phase 4 (D-03: thin wrapper; D-17: model-routing deferred).\n */\nexport interface OpenRouterProviderOptions\n extends Omit<OpenAICompatibleProviderOptions, \"id\" | \"baseUrl\"> {\n readonly id?: string;\n /** Defaults to `https://openrouter.ai/api/v1`. Override for proxies. */\n readonly baseUrl?: string;\n /**\n * D-08: TTL for per-instance /models response cache, in milliseconds.\n * Default: 300_000ms (5 minutes). 0 = always refetch (tests). Infinity = process-lifetime.\n */\n readonly modelsCacheTtlMs?: number;\n /**\n * D-11: Number of retries on transient /models fetch errors. Default: 2.\n * Retry schedule: immediate + 200ms + 1000ms (3 total attempts at retryCount=2).\n * 0 = no retries (1 attempt total).\n */\n readonly modelsRetryCount?: number;\n /**\n * D-12: Optional event sink for observability. When provided, the adapter\n * emits a \"capabilities.negotiation.fallback\" RunEvent on transient /models failure.\n * If absent, no event is emitted (silent fallback).\n */\n readonly runEventSink?: RunEventSink;\n /**\n * Ordered OpenRouter model fallback candidates. The primary `model` remains\n * the Lattice-selected route; these candidates serialize as OpenRouter's\n * top-level `models` request field when non-empty.\n */\n readonly fallbackModels?: readonly string[];\n}\n\nconst DEFAULT_OPENROUTER_BASE_URL = \"https://openrouter.ai/api/v1\";\n\nfunction normalizeFallbackModels(models: readonly string[] | undefined): readonly string[] | undefined {\n if (models === undefined) return undefined;\n const normalized = models.map((model) => model.trim()).filter((model) => model.length > 0);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction observedModelFromRawResponse(rawResponse: unknown): string | undefined {\n if (typeof rawResponse !== \"object\" || rawResponse === null || Array.isArray(rawResponse)) {\n return undefined;\n }\n const model = (rawResponse as Record<string, unknown>).model;\n return typeof model === \"string\" ? model : undefined;\n}\n\n/**\n * Phase 34 — D-03 — OpenRouter quirks block. Values verified against\n * OpenRouter API documentation and observed behavior.\n *\n * CITED: https://openrouter.ai/docs/provider-routing\n * - providerRoutingArraySupported: provider.order/only/ignore arrays for explicit routing\n * CITED: https://openrouter.ai/docs pricing / sort options\n * - floorPricingHints: max_price, sort: \"throughput\" | \"price\" hints for cost-aware routing\n * CITED: https://openrouter.ai/docs allow_fallbacks\n * - allowFallbacks: provider.allow_fallbacks boolean controls upstream-provider fallback behavior\n */\nconst OPENROUTER_QUIRKS: OpenRouterQuirks = {\n supportsToolChoice: true,\n parallelToolCalls: true,\n structuredOutputs: true,\n responseFormatHonored: true,\n streamingDiverges: false,\n providerRoutingArraySupported: true, // CITED: openrouter.ai/docs provider routing order/only/ignore\n floorPricingHints: true, // CITED: openrouter.ai/docs max_price / sort: \"throughput\" | \"price\"\n allowFallbacks: true, // CITED: openrouter.ai/docs allow_fallbacks boolean\n};\n\n/**\n * Phase 34 — D-03 / D-05..D-12 — Extended OpenRouter provider factory.\n *\n * Returns a `ProviderAdapter` narrowed to expose:\n * - `quirks: OpenRouterQuirks` — static adapter capability flags (8 booleans)\n * - `negotiateCapabilities(modelId)` — live /api/v1/models fetch with rich /models\n * intersection (supported_parameters -> nativeToolCalling + structuredOutputs,\n * top_provider.context_length -> contextWindow) intersected with Phase 33 registry\n * for knownFailureModes + recommendedSanitizers.\n *\n * CRITICAL for ANCHOR CASE STUDY (session_1780792387779):\n * negotiate(\"openai/gpt-oss-120b:free\") MUST resolve to:\n * - result.knownFailureModes.includes(\"internal_envelope_leak\") -> TRUE\n * - result.recommendedSanitizers.includes(\"unwrapInternalEnvelope\") -> TRUE\n * - result.source === \"live\" -> TRUE\n * This proves: live-fetch -> id suffix-strip via stripOpenRouterVariant\n * -> registry intersection -> getRecommendedSanitizers derivation.\n *\n * Anti-pattern (RESEARCH §Anti-pattern, lines 534-535):\n * The /api/v1/models endpoint is UNAUTHENTICATED (public discovery surface verified\n * Phase 33). Do NOT send Authorization Bearer to this endpoint -- it is NOT required\n * and would add unnecessary API key exposure surface in transit logs.\n */\nexport function createOpenRouterProvider(\n options: OpenRouterProviderOptions,\n): ProviderAdapter & {\n readonly quirks: OpenRouterQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const baseUrl = (options.baseUrl ?? DEFAULT_OPENROUTER_BASE_URL).replace(/\\/$/u, \"\");\n const fetchImpl = options.fetch ?? fetch;\n const fallbackModels = normalizeFallbackModels(options.fallbackModels);\n\n // D-05/D-06: per-instance cache and inflight Maps. Live inside the closure so\n // each createOpenRouterProvider({}) call gets its own Map (no cross-contamination).\n const ttlMs = options.modelsCacheTtlMs ?? 300_000;\n const retryCount = options.modelsRetryCount ?? 2;\n const cache = new Map<string, { result: NegotiatedCapabilities; expiresAt: number }>();\n const inflight = new Map<string, Promise<NegotiatedCapabilities>>();\n\n /**\n * D-07 lazy expiry + Q7 inflight coalescing + Pitfall 4 .finally cleanup.\n * Public surface: `adapter.negotiateCapabilities(modelId)`.\n */\n async function negotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // 1. Cache check (D-07 lazy expiry)\n const cached = cache.get(modelId);\n if (cached !== undefined && cached.expiresAt > Date.now()) return cached.result;\n\n // 2. Inflight coalesce (Q7)\n const existing = inflight.get(modelId);\n if (existing !== undefined) return existing;\n\n // 3. New fetch promise; clear inflight in .finally (Pitfall 4)\n const fetchPromise = (async () => {\n try {\n const result = await fetchAndNegotiate(modelId);\n if (ttlMs > 0) {\n cache.set(modelId, { result, expiresAt: Date.now() + ttlMs });\n }\n return result;\n } finally {\n inflight.delete(modelId);\n }\n })();\n\n inflight.set(modelId, fetchPromise);\n return fetchPromise;\n }\n\n /**\n * Phase 34 — D-09..D-11 — Fetches /api/v1/models and merges with registry.\n *\n * URL: ${baseUrl}/api/v1/models (NOTE: /api/v1/models -- different prefix from\n * OpenAI's /v1/models; OpenRouter's discovery endpoint is under /api/v1/)\n * Auth: NONE -- OpenRouter /api/v1/models is a public unauthenticated endpoint.\n * Per RESEARCH §Anti-pattern (lines 534-535): do NOT send Authorization Bearer\n * to this endpoint. This is a known anti-pattern; do not \"fix\" it.\n * Retry: [0ms, 200ms, 1000ms] backoff on transient errors (D-11).\n * Auth error (401/403): throws NegotiationAuthError (D-10, no fallback) -- defensive,\n * even though the endpoint is unauthenticated today, OpenRouter may add auth later.\n * Transient error (5xx/network): falls back to registry with \"registry-fallback\" (D-09).\n */\n async function fetchAndNegotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // NOTE: URL is /api/v1/models (NOT /v1/models -- OpenRouter uses /api/v1/ prefix)\n const url = `${baseUrl}/api/v1/models`;\n // Anti-pattern guard: NO Authorization header on this call.\n // RESEARCH §Anti-pattern (lines 534-535): OpenRouter /api/v1/models is unauthenticated.\n // Sending Bearer here would expose the API key unnecessarily.\n const headers: Record<string, string> = {\n \"accept\": \"application/json\",\n };\n\n const attempts = retryCount + 1;\n const backoffSchedule = [0, 200, 1000];\n let lastErr: unknown;\n\n for (let i = 0; i < attempts; i += 1) {\n const delay = backoffSchedule[i] ?? 1000;\n if (delay > 0) {\n await new Promise<void>((r) => setTimeout(r, delay));\n }\n try {\n const resp = await fetchImpl(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n\n if (resp.status === 401 || resp.status === 403) {\n // Defensive: even though the endpoint is unauthenticated today, treat\n // auth errors as fatal per D-10 (same as other adapters)\n throw new NegotiationAuthError(\n \"openrouter\",\n modelId,\n resp.status as 401 | 403,\n `OpenRouter /api/v1/models returned ${resp.status}.`,\n );\n }\n\n if (!resp.ok) {\n throw new Error(`HTTP ${resp.status}`);\n }\n\n const body: unknown = await resp.json();\n return mergeOpenRouterModelsWithRegistry(modelId, body);\n } catch (err) {\n if (err instanceof NegotiationAuthError) throw err; // D-10: auth never falls back\n lastErr = err;\n }\n }\n\n // All retries exhausted -- fallback + event (D-09/D-12)\n emitFallbackEvent({\n adapter: \"openrouter\",\n modelId,\n errorReason: stringifyErr(lastErr),\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"openrouter\", modelId, \"registry-fallback\");\n }\n\n /**\n * RICH /models intersection: consumes OpenRouter's /api/v1/models structured data\n * to populate NegotiatedCapabilities.supports.* from upstream (THICK derivation where\n * available), then intersects with Phase 33 registry for knownFailureModes +\n * recommendedSanitizers.\n *\n * ANCHOR CASE STUDY (session_1780792387779) flow:\n * 1. Find \"openai/gpt-oss-120b:free\" (or strip suffix -> \"openai/gpt-oss-120b\")\n * 2. Build canonical key: \"openrouter:openai/gpt-oss-120b\" (via stripOpenRouterVariant)\n * 3. getCapabilityProfile(\"openrouter:openai/gpt-oss-120b\") -> Phase 33 profile with\n * knownFailureModes: [\"internal_envelope_leak\", \"system_prompt_echo\", \"malformed_tool_arguments\"]\n * 4. getRecommendedSanitizers(knownFailureModes) -> [\"unwrapInternalEnvelope\"]\n * 5. result.recommendedSanitizers.includes(\"unwrapInternalEnvelope\") -> TRUE\n *\n * Pitfall 3 / A1 precedence chain (RESEARCH §Q5):\n * contextWindow = top_provider.context_length ?? context_length ?? registryProfile.contextWindow\n *\n * Lenient parsing per Pitfall 1: all field accesses use optional chaining.\n */\n function mergeOpenRouterModelsWithRegistry(\n modelId: string,\n body: unknown,\n ): NegotiatedCapabilities {\n const rows = (body as Record<string, unknown>)?.data;\n\n // Lenient model search: match by exact id OR by suffix-stripped id.\n // Also matches entries in /models whose id, when stripped, matches the canonical id.\n // Examples:\n // \"openai/gpt-oss-120b:free\" -> matches row with id \"openai/gpt-oss-120b:free\" (exact)\n // \"openai/gpt-oss-120b\" -> matches row with id \"openai/gpt-oss-120b\" (exact) OR\n // \"openai/gpt-oss-120b:free\" (strip then compare)\n const found = Array.isArray(rows)\n ? (rows as unknown[]).find((m: unknown) => {\n const rec = m as Record<string, unknown>;\n if (typeof rec?.id !== \"string\") return false;\n const rowId = rec.id;\n // Direct match or suffix-stripped modelId matches row id\n if (rowId === modelId || rowId === stripOpenRouterVariant(modelId)) return true;\n // Row's suffix-stripped id matches the stripped query id (handles base-form queries\n // against :free/:thinking variant rows in the /models response)\n const strippedModelId = stripOpenRouterVariant(modelId);\n const strippedRowId = stripOpenRouterVariant(rowId);\n return strippedRowId === strippedModelId;\n })\n : undefined;\n\n // Build canonical registry key using suffix-strip (D-11 via stripOpenRouterVariant from Phase 33)\n // \"openai/gpt-oss-120b:free\" -> \"openai/gpt-oss-120b\" -> \"openrouter:openai/gpt-oss-120b\"\n const stripped = stripOpenRouterVariant(modelId);\n const canonicalKey = `openrouter:${stripped}`;\n const registryProfile = getCapabilityProfile(canonicalKey);\n\n if (found === undefined) {\n // Model not found in /api/v1/models response -- treat as registry-fallback\n emitFallbackEvent({\n adapter: \"openrouter\",\n modelId,\n errorReason: \"model not found in /api/v1/models response\",\n fallbackSource: \"registry-fallback\",\n });\n // Still use registry intersection -- the registry may have the profile even\n // when /models didn't return it (Test 6 fallback case)\n return {\n ...synthesizeNegotiatedCapabilitiesFromRegistry(\"openrouter\", stripped, \"registry-fallback\"),\n // Preserve the input modelId verbatim (per Test 4 acceptance criterion)\n modelId,\n };\n }\n\n const foundRec = found as Record<string, unknown>;\n const topProvider = foundRec.top_provider as Record<string, unknown> | undefined;\n\n // Pitfall 3 / A1 precedence chain: prefer top_provider.context_length, then context_length,\n // then registry (RESEARCH §Q5 verified against live OpenRouter data)\n const contextWindow =\n typeof topProvider?.context_length === \"number\" && topProvider.context_length > 0\n ? topProvider.context_length\n : typeof foundRec.context_length === \"number\" && foundRec.context_length > 0\n ? foundRec.context_length\n : (registryProfile?.contextWindow ?? 0);\n\n // THICK derivation from supported_parameters (RESEARCH §Q5)\n const supportedParams = Array.isArray(foundRec.supported_parameters)\n ? (foundRec.supported_parameters as unknown[]).map(String)\n : [];\n\n const nativeToolCalling = supportedParams.includes(\"tools\");\n const structuredOutputs = supportedParams.includes(\"response_format\");\n // parallelToolCalls: heuristic -- tool_choice implies parallel tool support\n const parallelToolCalls = supportedParams.includes(\"tool_choice\");\n // extendedThinking: some OpenRouter rows expose reasoning or thinking parameter\n const extendedThinking =\n supportedParams.includes(\"reasoning\") || supportedParams.includes(\"thinking\");\n // streaming: OpenRouter supports streaming on virtually all models\n const streaming = true;\n\n // Registry intersection for failure modes + sanitizers (the ANCHOR CASE STUDY path)\n const knownFailureModes = registryProfile?.knownFailureModes ?? [];\n // getRecommendedSanitizers is the ONLY derivation path for recommendedSanitizers\n const recommendedSanitizers = getRecommendedSanitizers(knownFailureModes);\n\n return {\n // PRESERVE the input modelId verbatim (per Test 4 / anchor case study acceptance criteria)\n modelId,\n contextWindow,\n supports: {\n nativeToolCalling,\n structuredOutputs,\n parallelToolCalls,\n extendedThinking,\n streaming,\n },\n knownFailureModes,\n recommendedSanitizers,\n source: \"live\",\n };\n }\n\n /**\n * D-12: Emit capabilities.negotiation.fallback RunEvent via the optional sink.\n * SECURITY (T-34-04-02): stringifyErr extracts err.message only -- NOT err.stack\n * or JSON.stringify(headers), so the apiKey cannot leak into the event payload.\n * Synthetic runId pattern: negotiate happens outside a run; documented here.\n */\n function emitFallbackEvent(payload: {\n adapter: string;\n modelId: string;\n errorReason: string;\n fallbackSource: string;\n }): void {\n if (options.runEventSink === undefined) return;\n const event = createRunEvent(\"capabilities.negotiation.fallback\", {\n runId: `negotiate-openrouter-${payload.modelId}`,\n providerId: options.id ?? \"openrouter\",\n modelId: payload.modelId,\n metadata: {\n adapter: payload.adapter,\n modelId: payload.modelId,\n errorReason: payload.errorReason,\n fallbackSource: payload.fallbackSource,\n },\n });\n void options.runEventSink(event);\n }\n\n const executeFetch: typeof fetch = fallbackModels === undefined\n ? fetchImpl\n : (async (url, init) => {\n if (typeof init?.body !== \"string\") {\n return fetchImpl(url, init);\n }\n const body = JSON.parse(init.body) as Record<string, unknown>;\n return fetchImpl(url, {\n ...init,\n body: JSON.stringify({\n ...body,\n models: [...fallbackModels],\n }),\n });\n }) as typeof fetch;\n\n // Create the underlying OpenAI-compat execute() adapter for chat completions\n const baseAdapter = createOpenAICompatibleProvider({\n ...options,\n id: options.id ?? \"openrouter\",\n baseUrl,\n fetch: executeFetch,\n });\n const baseExecuteStream = baseAdapter.executeStream;\n\n return {\n ...baseAdapter,\n async execute(request) {\n const response = await baseAdapter.execute!(request);\n const observedModel =\n response.gateway?.observedModel ?? observedModelFromRawResponse(response.rawResponse);\n return {\n ...response,\n gateway: {\n ...(response.gateway ?? { used: true }),\n used: true,\n requestedModel: options.model,\n ...(fallbackModels !== undefined ? { fallbackModels } : {}),\n ...(observedModel !== undefined ? { observedModel } : {}),\n },\n };\n },\n ...(baseExecuteStream !== undefined\n ? {\n executeStream: async (request: Parameters<typeof baseExecuteStream>[0]) => {\n const stream = await baseExecuteStream(request);\n return withOpenRouterStreamGateway(stream);\n },\n }\n : {}),\n quirks: OPENROUTER_QUIRKS,\n negotiateCapabilities: negotiate,\n };\n\n async function* withOpenRouterStreamGateway(stream: ProviderStream): ProviderStream {\n for await (const chunk of stream) {\n if (chunk.kind !== \"complete\") {\n yield chunk;\n continue;\n }\n\n const observedModel =\n chunk.gateway?.observedModel ?? observedModelFromRawResponse(chunk.rawResponse);\n yield {\n ...chunk,\n gateway: {\n ...(chunk.gateway ?? { used: true }),\n used: true,\n requestedModel: options.model,\n ...(fallbackModels !== undefined ? { fallbackModels } : {}),\n ...(observedModel !== undefined ? { observedModel } : {}),\n },\n };\n }\n }\n}\n\n/**\n * T-34-04-02: Returns err.message only -- NOT err.stack (which could include\n * headers or the apiKey via a fetch rejection), NOT JSON.stringify(err).\n */\nfunction stringifyErr(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","import type { ProviderAdapter, ProviderStream } from \"./provider.js\";\nimport { createOpenAICompatibleProvider, type OpenAICompatibleProviderOptions } from \"./adapters.js\";\nimport type { XaiQuirks } from \"./quirks.js\";\nimport type { NegotiatedCapabilities } from \"../capabilities/negotiate.js\";\nimport {\n NegotiationAuthError,\n synthesizeNegotiatedCapabilitiesFromRegistry,\n _mapProfileToNegotiatedCapabilities,\n} from \"../capabilities/negotiate.js\";\nimport { getCapabilityProfile } from \"../capabilities/lookup.js\";\nimport type { RunEventSink } from \"../tracing/tracing.js\";\nimport { createRunEvent } from \"../tracing/tracing.js\";\n\n/**\n * Options for {@link createXaiProvider}.\n *\n * Thin wrapper around {@link createOpenAICompatibleProvider} pinned to\n * xAI's base URL `https://api.x.ai/v1`. The wire shape is identical to\n * OpenAI Chat Completions, with one provider-specific quirk preserved:\n * `response.usage.completion_tokens_details.reasoning_tokens` (xAI's\n * separate reasoning-token accounting; see FSB\n * `extension/ai/universal-provider.js:585-594` for the production reference).\n *\n * SECURITY: `apiKey` is a runtime parameter -- do NOT hardcode or log it.\n *\n * STREAMING (Phase 44): supported through the OpenAI-compatible stream path.\n *\n * DEFERRED (Phase 4 carryforward notes):\n * - tool-streaming -- deferred\n * - resume-from-eviction -- see Phase 5 (MV3-survivability adapter contract)\n *\n * Ref: FSB v0.10.0-attempt-2 Phase 4 (D-03 + D-07: thin wrapper; reasoning_tokens quirk preserved).\n *\n * Phase 34 additions:\n * - `modelsCacheTtlMs?` — D-05/D-06/D-08; default 300_000ms; 0 disables; Infinity = process-lifetime\n * - `modelsRetryCount?` — D-11; default 2; 0 disables retry\n * - `runEventSink?` — D-12; fires \"capabilities.negotiation.fallback\" on transient errors\n */\nexport interface XaiProviderOptions extends Omit<OpenAICompatibleProviderOptions, \"id\" | \"baseUrl\"> {\n readonly id?: string;\n /** Defaults to `https://api.x.ai/v1`. Override for proxies. */\n readonly baseUrl?: string;\n}\n\nconst DEFAULT_XAI_BASE_URL = \"https://api.x.ai/v1\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers (mirroring Plan 34-02 Anthropic reference implementation)\n// ---------------------------------------------------------------------------\n\n/**\n * Phase 34 — D-12 — Emit a \"capabilities.negotiation.fallback\" RunEvent if\n * a sink is provided. Uses a synthetic runId (negotiation is outside a run).\n *\n * T-34-03-01: errorReason uses stringifyErr (message only, not stack) to\n * prevent apiKey leaking via fetch error strings that may embed request headers.\n */\nfunction emitFallbackEvent(\n sink: RunEventSink | undefined,\n payload: {\n readonly adapter: string;\n readonly modelId: string;\n readonly errorReason: string;\n readonly fallbackSource: \"registry-fallback\";\n },\n): void {\n if (sink === undefined) return;\n const event = createRunEvent(\"capabilities.negotiation.fallback\", {\n // Synthetic runId: negotiation happens outside a run context.\n // Pattern documented in Plan 34-02 (Anthropic reference impl).\n runId: `negotiate-${payload.adapter}-${payload.modelId}`,\n providerId: payload.adapter,\n modelId: payload.modelId,\n metadata: {\n adapter: payload.adapter,\n modelId: payload.modelId,\n errorReason: payload.errorReason,\n fallbackSource: payload.fallbackSource,\n },\n });\n void sink(event);\n}\n\n/**\n * Stringify an error for event metadata. Returns only the message (NOT the\n * stack) to prevent apiKey or sensitive header values from leaking into event\n * payloads via fetch errors that may embed the request init.\n * T-34-03-01 mitigation.\n */\nfunction stringifyErr(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Phase 34 — QUIRK-02 / NEG-01 / NEG-02 — Merge an xAI /v1/models sparse\n * OpenAI-shaped response with the Phase 33 registry.\n *\n * RESEARCH §A1 (INFERRED): xAI's /v1/models shape is undocumented; the\n * endpoint is assumed to return an OpenAI-compatible sparse list based on\n * the shared OpenAI-compat wire format used for chat completions.\n * LENIENT-PARSE is mandatory per Pitfall 1 (RESEARCH §Q4): if xAI changes\n * their response shape, the adapter must not crash.\n *\n * CITED: Pitfall 1 — \"When integrating with less-documented endpoints like\n * xAI's /v1/models, lenient parsing prevents runtime crashes when the\n * endpoint returns an unexpected shape.\"\n *\n * Source semantics per D-09:\n * - \"live\" when the model id is found in the response AND body.data is an array\n * - \"registry-fallback\" when body.data is not an array (unexpected shape)\n * OR when the model id is not in the response\n */\nfunction mergeXaiModelsWithRegistry(\n modelId: string,\n body: unknown,\n emitFallback: () => void,\n): NegotiatedCapabilities {\n // LENIENT-PARSE: body may be malformed or have an unexpected shape (Pitfall 1 + RESEARCH §A1).\n // If body.data is not an array, fall back to registry immediately without crashing.\n const rawData = (body as { data?: unknown } | null | undefined)?.data;\n if (!Array.isArray(rawData)) {\n // xAI body shape unexpected — emit fallback and use registry\n emitFallback();\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"xai\", modelId, \"registry-fallback\");\n }\n\n const found = (rawData as Array<unknown>).find(\n (m): m is { id: string } =>\n typeof m === \"object\" && m !== null && (m as { id?: unknown }).id === modelId,\n );\n\n if (found === undefined) {\n // Model not in /models response — emit fallback and use registry.\n emitFallback();\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"xai\", modelId, \"registry-fallback\");\n }\n\n // Model found in /models response — source supports.* from registry profile.\n // xAI /models is sparse (OpenAI-shaped: id, object, created, owned_by only);\n // no capabilities block. Source supports.* from the Phase 33 registry instead.\n const registryProfile = getCapabilityProfile(`xai:${modelId}`);\n if (registryProfile !== undefined) {\n return _mapProfileToNegotiatedCapabilities(registryProfile, \"live\");\n }\n\n // Model exists in org per /models but Phase 33 registry doesn't have it.\n // Preserve the live model id instead of collapsing to a registry fallback.\n // This keeps new xAI/GitFly ids like grok-4-1-fast-* inspectable while\n // remaining conservative about capabilities we cannot prove from /models.\n return {\n modelId,\n contextWindow: 0,\n supports: {\n nativeToolCalling: true,\n structuredOutputs: true,\n parallelToolCalls: true,\n extendedThinking: false,\n streaming: true,\n },\n knownFailureModes: [],\n recommendedSanitizers: [],\n source: \"live\",\n };\n}\n\n/**\n * Phase 34 — QUIRK-02 / NEG-01 / NEG-02 — xAI provider factory.\n *\n * Extends the base OpenAI-compat execution wrapper with:\n * 1. `quirks: XaiQuirks` — verified per RESEARCH §Q6 xAI vocabulary.\n * 2. `negotiateCapabilities(modelId)` — queries xAI /v1/models GET with\n * Authorization: Bearer header; LENIENT-PARSE sparse OpenAI-shaped\n * response; intersects with Phase 33 registry for supports.*.\n *\n * CITED: RESEARCH §Q4 (INFERRED) — xAI /v1/models shape is undocumented;\n * assumed OpenAI-compatible based on the chat completions wire format.\n *\n * CITED: RESEARCH §A1 — Pitfall 1 lenient parse: if xAI publishes a\n * different /models shape, only the parsing logic updates; the contract\n * (source values, NegotiatedCapabilities shape) holds.\n *\n * The negotiate() pattern mirrors Plan 34-02 (Anthropic thick reference):\n * - Per-instance TTL cache (modelsCacheTtlMs, default 300_000ms)\n * - Single-flight inflight coalescing with .finally cleanup (Pitfall 4)\n * - Retry with [0, 200, 1000]ms backoff (modelsRetryCount, default 2)\n * - 401/403 throws NegotiationAuthError with adapter: \"xai\" (D-10)\n * - 5xx/network/timeout falls back to registry + emits fallback event\n *\n * SECURITY (T-34-03-07): inflight Map MUST use .finally cleanup to prevent\n * leak on rejection. Verifiable: grep `.finally` in this file.\n */\nexport function createXaiProvider(\n options: XaiProviderOptions,\n): ProviderAdapter & {\n readonly quirks: XaiQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n} {\n const resolvedBaseUrl = (options.baseUrl ?? DEFAULT_XAI_BASE_URL).replace(/\\/$/u, \"\");\n const ttlMs = options.modelsCacheTtlMs ?? 300_000;\n const retryCount = options.modelsRetryCount ?? 2;\n const fetchImpl = options.fetch ?? fetch;\n\n // Per-instance TTL cache (D-05/D-06/D-07/D-08). One Map per factory call.\n const cache = new Map<string, { result: NegotiatedCapabilities; expiresAt: number }>();\n // Per-instance inflight coalescing Map (Q7). .finally cleanup is mandatory (Pitfall 4).\n const inflight = new Map<string, Promise<NegotiatedCapabilities>>();\n\n async function fetchAndNegotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // For xAI, the baseUrl already includes \"/v1\" (default: https://api.x.ai/v1),\n // so we append \"/models\" not \"/v1/models\". This produces: https://api.x.ai/v1/models.\n const url = `${resolvedBaseUrl}/models`;\n // IN-02: omit Authorization entirely when apiKey is undefined; sending\n // \"Bearer \" literal would trigger noisy 401s and intrusion-detection flags.\n // Mirrors the OpenAI-compat execute path (adapters.ts:137).\n const headers: Record<string, string> = {\n \"accept\": \"application/json\",\n ...(options.apiKey !== undefined ? { authorization: `Bearer ${options.apiKey}` } : {}),\n };\n const attempts = retryCount + 1;\n const backoffMs = [0, 200, 1000];\n let lastErr: unknown;\n for (let i = 0; i < attempts; i += 1) {\n if (i > 0) {\n const delay = backoffMs[Math.min(i, backoffMs.length - 1)] ?? 1000;\n await new Promise<void>((r) => setTimeout(r, delay));\n }\n try {\n const resp = await fetchImpl(url, {\n method: \"GET\",\n headers,\n signal: AbortSignal.timeout(30_000),\n });\n if (resp.status === 401 || resp.status === 403) {\n throw new NegotiationAuthError(\n \"xai\",\n modelId,\n resp.status as 401 | 403,\n `xAI /v1/models returned ${resp.status}: check apiKey config.`,\n );\n }\n if (!resp.ok) {\n throw new Error(`HTTP ${resp.status}`);\n }\n const body = await resp.json() as unknown;\n return mergeXaiModelsWithRegistry(modelId, body, () => {\n emitFallbackEvent(options.runEventSink, {\n adapter: \"xai\",\n modelId,\n errorReason: \"model not found in /v1/models response or unexpected body shape\",\n fallbackSource: \"registry-fallback\",\n });\n });\n } catch (err) {\n if (err instanceof NegotiationAuthError) throw err; // D-10: auth never retries\n lastErr = err;\n }\n }\n // All retries exhausted — transient fallback + event.\n emitFallbackEvent(options.runEventSink, {\n adapter: \"xai\",\n modelId,\n errorReason: stringifyErr(lastErr),\n fallbackSource: \"registry-fallback\",\n });\n return synthesizeNegotiatedCapabilitiesFromRegistry(\"xai\", modelId, \"registry-fallback\");\n }\n\n async function negotiate(modelId: string): Promise<NegotiatedCapabilities> {\n // 1. Cache check (D-07 lazy expiry).\n const cached = cache.get(modelId);\n if (cached !== undefined && cached.expiresAt > Date.now()) return cached.result;\n\n // 2. Inflight coalesce (Q7).\n const existing = inflight.get(modelId);\n if (existing !== undefined) return existing;\n\n // 3. New fetch promise; clear inflight in .finally (Pitfall 4).\n const fetchPromise = (async () => {\n try {\n const result = await fetchAndNegotiate(modelId);\n if (ttlMs > 0) {\n cache.set(modelId, { result, expiresAt: Date.now() + ttlMs });\n }\n return result;\n } finally {\n inflight.delete(modelId);\n }\n })();\n inflight.set(modelId, fetchPromise);\n return fetchPromise;\n }\n\n const inner = createOpenAICompatibleProvider({\n ...options,\n id: options.id ?? \"xai\",\n baseUrl: resolvedBaseUrl,\n });\n const innerExecute = inner.execute;\n const innerExecuteStream = inner.executeStream;\n\n // Wrap the execute function to add xAI reasoning_tokens quirk preservation (D-07).\n const wrappedExecute =\n innerExecute === undefined\n ? undefined\n : async (request: Parameters<typeof innerExecute>[0]) => {\n const response = await innerExecute(request);\n // D-07: PRESERVE xAI's `completion_tokens_details.reasoning_tokens`\n // quirk. The default OpenAI-compat usage extractor does not surface\n // reasoning_tokens; we inspect rawResponse and augment the legacy\n // UsageRecord when the field is present. The Phase 7 normalized\n // `Usage` (promptTokens/completionTokens/costUsd) is unchanged by\n // design -- normalized usage represents billable tokens; reasoning_tokens\n // is xAI-extra-counts that consumers access via rawResponse for now.\n const reasoningTokens = reasoningTokensFromRawResponse(response.rawResponse);\n if (typeof reasoningTokens === \"number\" && response.usage !== undefined) {\n const inputTokens = response.usage.inputTokens ?? 0;\n const outputTokens = response.usage.outputTokens ?? 0;\n return {\n ...response,\n usage: {\n ...response.usage,\n // Recompute totalTokens INCLUDING reasoning tokens (matches\n // FSB universal-provider.js:593 production behavior).\n totalTokens: inputTokens + outputTokens + reasoningTokens,\n },\n };\n }\n return response;\n };\n\n const wrappedExecuteStream =\n innerExecuteStream === undefined\n ? undefined\n : async function* (request: Parameters<typeof innerExecuteStream>[0]): ProviderStream {\n const stream = await innerExecuteStream(request);\n for await (const chunk of stream) {\n if (chunk.kind !== \"complete\") {\n yield chunk;\n continue;\n }\n\n const reasoningTokens = reasoningTokensFromRawResponse(chunk.rawResponse);\n if (typeof reasoningTokens === \"number\" && chunk.usage !== undefined) {\n const inputTokens = chunk.usage.inputTokens ?? 0;\n const outputTokens = chunk.usage.outputTokens ?? 0;\n yield {\n ...chunk,\n usage: {\n ...chunk.usage,\n totalTokens: inputTokens + outputTokens + reasoningTokens,\n },\n };\n continue;\n }\n\n yield chunk;\n }\n };\n\n // Build the returned object without spreading the inner compat adapter (which has\n // execute?: optional and could introduce exactOptionalPropertyTypes issues). Instead\n // we compose the fields explicitly.\n const result: ProviderAdapter & {\n readonly quirks: XaiQuirks;\n readonly negotiateCapabilities: (modelId: string) => Promise<NegotiatedCapabilities>;\n } = {\n id: inner.id,\n kind: inner.kind,\n // Phase 34 — QUIRK-02 / XaiQuirks — verified per RESEARCH §Q6 xAI vocabulary.\n // CITED: xAI API docs — https://docs.x.ai/api/endpoints\n // - reasoningTokensReported: completion_tokens_details.reasoning_tokens reported\n // in xAI API responses — verified in xai.ts (D-07 carryforward from Phase 4)\n // - logprobsSupported: grok-4.20 silently ignores logprobs param per observed behavior\n // (docs.x.ai citation); flag set to false since logprobs fields are not populated\n // for current grok-4 models despite the parameter being accepted\n quirks: {\n supportsToolChoice: true,\n parallelToolCalls: true,\n structuredOutputs: true,\n responseFormatHonored: true,\n streamingDiverges: false,\n reasoningTokensReported: true,\n logprobsSupported: false,\n } satisfies XaiQuirks,\n negotiateCapabilities: negotiate,\n ...(inner.capabilities !== undefined ? { capabilities: inner.capabilities } : {}),\n ...(wrappedExecute !== undefined ? { execute: wrappedExecute } : {}),\n ...(wrappedExecuteStream !== undefined ? { executeStream: wrappedExecuteStream } : {}),\n };\n return result;\n}\n\nfunction reasoningTokensFromRawResponse(rawResponse: unknown): number | undefined {\n const direct = reasoningTokensFromUsage((rawResponse as { usage?: unknown } | undefined)?.usage);\n if (direct !== undefined) {\n return direct;\n }\n\n if (!isRecord(rawResponse) || !Array.isArray(rawResponse.chunks)) {\n return undefined;\n }\n\n for (let index = rawResponse.chunks.length - 1; index >= 0; index -= 1) {\n const chunk = rawResponse.chunks[index];\n const fromChunk = reasoningTokensFromUsage((chunk as { usage?: unknown } | undefined)?.usage);\n if (fromChunk !== undefined) {\n return fromChunk;\n }\n }\n\n return undefined;\n}\n\nfunction reasoningTokensFromUsage(usage: unknown): number | undefined {\n if (!isRecord(usage) || !isRecord(usage.completion_tokens_details)) {\n return undefined;\n }\n\n const value = usage.completion_tokens_details.reasoning_tokens;\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { ArtifactInput, ArtifactRef } from \"../artifacts/artifact.js\";\nimport type { UsageRecord } from \"../plan/plan.js\";\nimport type { ValidatedToolCall } from \"../tools/tool-call-validation.js\";\nimport type {\n ProviderGatewayMetadata,\n ProviderFinishMetadata,\n ProviderRunResponse,\n ProviderStream,\n Usage,\n} from \"./provider.js\";\n\nexport interface CollectStreamOptions {\n readonly defaultOutput?: string;\n}\n\nexport async function collectStream(\n stream: ProviderStream,\n options: CollectStreamOptions = {},\n): Promise<ProviderRunResponse> {\n const rawOutputs: Record<string, unknown> = {};\n const textParts = new Map<string, string[]>();\n const toolCalls: ValidatedToolCall[] = [];\n let artifactRefs: readonly (ArtifactInput | ArtifactRef)[] | undefined;\n let usage: UsageRecord | undefined;\n let normalizedUsage: Usage | undefined;\n let gateway: ProviderGatewayMetadata | undefined;\n let finish: ProviderFinishMetadata | undefined;\n let rawResponse: unknown;\n let rawResponseProvided = false;\n let chunkCount = 0;\n\n for await (const chunk of stream) {\n chunkCount += 1;\n\n switch (chunk.kind) {\n case \"text-delta\": {\n const output = chunk.output ?? options.defaultOutput ?? \"text\";\n const parts = textParts.get(output);\n if (parts === undefined) {\n textParts.set(output, [chunk.text]);\n } else {\n parts.push(chunk.text);\n }\n break;\n }\n case \"output\": {\n rawOutputs[chunk.output] = chunk.value;\n break;\n }\n case \"usage\": {\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.normalizedUsage !== undefined) {\n normalizedUsage = chunk.normalizedUsage;\n }\n break;\n }\n case \"gateway\": {\n gateway = chunk.gateway;\n break;\n }\n case \"tool-call\": {\n toolCalls.push(chunk.toolCall);\n break;\n }\n case \"complete\": {\n if (chunk.rawOutputs !== undefined) {\n Object.assign(rawOutputs, chunk.rawOutputs);\n }\n if (chunk.artifactRefs !== undefined) {\n artifactRefs = chunk.artifactRefs;\n }\n if (chunk.usage !== undefined) {\n usage = chunk.usage;\n }\n if (chunk.normalizedUsage !== undefined) {\n normalizedUsage = chunk.normalizedUsage;\n }\n if (chunk.gateway !== undefined) {\n gateway = chunk.gateway;\n }\n if (chunk.toolCalls !== undefined) {\n toolCalls.push(...chunk.toolCalls);\n }\n if (chunk.finish !== undefined) {\n finish = chunk.finish;\n }\n if (\"rawResponse\" in chunk) {\n rawResponse = chunk.rawResponse;\n rawResponseProvided = true;\n }\n break;\n }\n }\n }\n\n for (const [output, parts] of textParts) {\n if (!(output in rawOutputs)) {\n rawOutputs[output] = parts.join(\"\");\n }\n }\n\n return {\n rawOutputs,\n ...(artifactRefs !== undefined ? { artifactRefs } : {}),\n ...(usage !== undefined ? { usage } : {}),\n ...(normalizedUsage !== undefined ? { normalizedUsage } : {}),\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(gateway !== undefined ? { gateway } : {}),\n ...(finish !== undefined ? { finish } : {}),\n rawResponse: rawResponseProvided\n ? rawResponse\n : {\n kind: \"lattice-stream-summary\",\n chunkCount,\n outputNames: Object.keys(rawOutputs),\n },\n };\n}\n","import canonicalize from \"canonicalize\";\n\nimport type { RecommendedPromptStrategy } from \"../capabilities/profile.js\";\n\nexport const PROMPT_SCAFFOLD_VERSION = \"lattice.prompt-scaffold/v1\" as const;\n\nexport const PROMPT_STRATEGIES = [\n \"frontier\",\n \"mid_tier\",\n \"open_weight\",\n \"reasoning\",\n \"local\",\n] as const satisfies readonly RecommendedPromptStrategy[];\n\ntype PromptScaffoldPurpose = \"structured-output\" | \"tool-use\";\ntype PromptScaffoldPayload = \"schema\" | \"tools\";\n\ninterface PromptStrategyInstructions {\n readonly structuredOutput: readonly string[];\n readonly toolUse: readonly string[];\n}\n\nconst JSON_SERIALIZATION_ERRORS: Record<PromptScaffoldPayload, string> = {\n schema:\n \"getStructuredOutputContract: schema must be JSON-serializable for deterministic prompt scaffolds.\",\n tools:\n \"getToolUseContract: tools must be JSON-serializable for deterministic prompt scaffolds.\",\n};\n\nconst STRATEGY_INSTRUCTIONS: Record<\n RecommendedPromptStrategy,\n PromptStrategyInstructions\n> = {\n frontier: {\n structuredOutput: [\n \"Return only content that satisfies the contract.\",\n \"Do not include prose before or after the structured output.\",\n ],\n toolUse: [\n \"Use a tool only when the task requires an external action or lookup.\",\n \"Return a normal answer when the user request can be completed without a tool.\",\n ],\n },\n mid_tier: {\n structuredOutput: [\n \"Treat the contract as instructions, not as prose to repeat.\",\n \"Return the requested answer in the shape required by the contract.\",\n ],\n toolUse: [\n \"The tool definitions are available actions, not answer text.\",\n \"Call only a listed tool, and only with arguments that match its definition.\",\n ],\n },\n open_weight: {\n structuredOutput: [\n \"The contract below is an instruction, not text to output.\",\n \"Do not answer with the schema, envelope, or any field name unless that field belongs in the final user-visible JSON.\",\n 'Bad: {\"summary\":\"Greeted the user.\"} when the user asked for a natural-language reply.',\n \"Good: Greeted the user.\",\n ],\n toolUse: [\n \"The tool list below is action metadata, not text to output.\",\n \"Do not copy the tool descriptor into the final answer.\",\n \"If no listed tool is needed, answer normally without fabricating a tool call.\",\n ],\n },\n reasoning: {\n structuredOutput: [\n \"Do not expose hidden reasoning, scratchpad text, or analysis in the final answer.\",\n \"Return only the final content that satisfies the contract.\",\n ],\n toolUse: [\n \"Keep tool selection separate from hidden reasoning.\",\n \"Do not include scratchpad text when explaining whether a tool was used.\",\n ],\n },\n local: {\n structuredOutput: [\n \"Do not copy the contract, chat template, or wrapper text into the answer.\",\n \"Return the requested answer directly in the required shape.\",\n ],\n toolUse: [\n \"Do not invent tool names or arguments.\",\n \"If the task does not require a listed tool, answer directly.\",\n ],\n },\n};\n\nfunction canonicalPromptJson(\n value: unknown,\n payload: PromptScaffoldPayload,\n): string {\n const errorMessage = JSON_SERIALIZATION_ERRORS[payload];\n let json: string | undefined;\n\n try {\n json = canonicalize(value);\n if (json === undefined) {\n throw new Error(errorMessage);\n }\n\n JSON.parse(json);\n } catch {\n throw new Error(errorMessage);\n }\n\n return json;\n}\n\nfunction renderPromptScaffold(\n strategy: RecommendedPromptStrategy,\n purpose: PromptScaffoldPurpose,\n instructions: readonly string[],\n payloadHeading: \"Contract\" | \"Tools\",\n payload: string,\n): string {\n return [\n `Lattice Prompt Scaffold: ${PROMPT_SCAFFOLD_VERSION}`,\n `Strategy: ${strategy}`,\n `Purpose: ${purpose}`,\n \"\",\n ...instructions,\n \"\",\n `${payloadHeading}:`,\n payload,\n ].join(\"\\n\");\n}\n\nexport function getStructuredOutputContract(\n strategy: RecommendedPromptStrategy,\n schema: unknown,\n): string {\n return renderPromptScaffold(\n strategy,\n \"structured-output\",\n STRATEGY_INSTRUCTIONS[strategy].structuredOutput,\n \"Contract\",\n canonicalPromptJson(schema, \"schema\"),\n );\n}\n\nexport function getToolUseContract(\n strategy: RecommendedPromptStrategy,\n tools: unknown,\n): string {\n return renderPromptScaffold(\n strategy,\n \"tool-use\",\n STRATEGY_INSTRUCTIONS[strategy].toolUse,\n \"Tools\",\n canonicalPromptJson(tools, \"tools\"),\n );\n}\n"],"mappings":"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"}