@agent-native/core 0.92.2 → 0.92.3

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 (170) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +26 -0
  3. package/corpus/core/docs/content/locales/ar-SA/server.mdx +35 -0
  4. package/corpus/core/docs/content/locales/de-DE/server.mdx +35 -0
  5. package/corpus/core/docs/content/locales/es-ES/server.mdx +35 -0
  6. package/corpus/core/docs/content/locales/fr-FR/server.mdx +35 -0
  7. package/corpus/core/docs/content/locales/hi-IN/server.mdx +35 -0
  8. package/corpus/core/docs/content/locales/ja-JP/server.mdx +35 -0
  9. package/corpus/core/docs/content/locales/ko-KR/server.mdx +35 -0
  10. package/corpus/core/docs/content/locales/pt-BR/server.mdx +35 -0
  11. package/corpus/core/docs/content/locales/zh-CN/server.mdx +35 -0
  12. package/corpus/core/docs/content/locales/zh-TW/server.mdx +35 -0
  13. package/corpus/core/docs/content/server.mdx +35 -0
  14. package/corpus/core/package.json +1 -1
  15. package/corpus/core/src/agent/engine/ai-sdk-engine.ts +14 -4
  16. package/corpus/core/src/agent/engine/anthropic-engine.ts +15 -3
  17. package/corpus/core/src/agent/engine/builder-engine.ts +30 -4
  18. package/corpus/core/src/agent/engine/registry.ts +63 -2
  19. package/corpus/core/src/agent/model-config.ts +0 -2
  20. package/corpus/core/src/agent/production-agent.ts +12 -1
  21. package/corpus/core/src/agent/run-manager.ts +57 -36
  22. package/corpus/core/src/agent/run-store.ts +81 -2
  23. package/corpus/core/src/agent/thread-data-builder.ts +33 -2
  24. package/corpus/core/src/client/AssistantChat.tsx +314 -96
  25. package/corpus/core/src/client/agent-chat-adapter.ts +17 -1
  26. package/corpus/core/src/client/chat/repo-helpers.ts +45 -0
  27. package/corpus/core/src/client/chat/tool-call-display.tsx +36 -27
  28. package/corpus/core/src/client/chat-model-groups.ts +1 -5
  29. package/corpus/core/src/client/composer/TiptapComposer.tsx +0 -2
  30. package/corpus/core/src/client/embed-auth.ts +20 -0
  31. package/corpus/core/src/client/settings/SettingsSection.tsx +66 -5
  32. package/corpus/core/src/client/sse-event-processor.ts +49 -17
  33. package/corpus/core/src/client/use-db-sync.ts +31 -9
  34. package/corpus/core/src/collab/agent-presence.ts +6 -1
  35. package/corpus/core/src/collab/awareness-store.ts +185 -0
  36. package/corpus/core/src/collab/awareness.ts +58 -2
  37. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +7 -8
  38. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +7 -18
  39. package/corpus/core/src/server/core-routes-plugin.ts +21 -2
  40. package/corpus/core/src/server/embed-session.ts +20 -4
  41. package/corpus/core/src/styles/agent-native.css +51 -0
  42. package/corpus/core/src/tracking/providers.ts +33 -2
  43. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +8 -1
  44. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +9 -1
  45. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorDetail.tsx +41 -11
  46. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +44 -0
  47. package/corpus/templates/analytics/changelog/2026-07-09-dashboard-action-menus-now-close-cleanly-before-opening-hist.md +6 -0
  48. package/corpus/templates/analytics/changelog/2026-07-09-dashboard-email-reports-still-send-when-the-screenshot-captu.md +6 -0
  49. package/corpus/templates/analytics/changelog/2026-07-09-uptime-alerts-now-suppress-recovery-noise-during-flapping-an.md +6 -0
  50. package/corpus/templates/analytics/changelog/2026-07-09-uptime-check-history-now-shows-timing-diagnostics-so-slow-or.md +6 -0
  51. package/corpus/templates/analytics/changelog/2026-07-09-uptime-recovery-alerts-now-send-when-the-original-outage-not.md +6 -0
  52. package/corpus/templates/analytics/docs/uptime-monitoring.md +29 -16
  53. package/corpus/templates/analytics/netlify.toml +3 -0
  54. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +126 -0
  55. package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -0
  56. package/corpus/templates/analytics/server/jobs/uptime-monitors.ts +5 -1
  57. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +305 -31
  58. package/corpus/templates/analytics/server/plugins/db.ts +15 -0
  59. package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -1
  60. package/corpus/templates/analytics/server/routes/api/uptime-monitors/run.post.ts +57 -0
  61. package/corpus/templates/clips/actions/list-meetings.ts +12 -0
  62. package/corpus/templates/clips/changelog/2026-07-09-meeting-reminders-now-ignore-obvious-solo-personal-calendar-.md +6 -0
  63. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  64. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +79 -0
  65. package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
  66. package/dist/agent/engine/ai-sdk-engine.js +13 -4
  67. package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
  68. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  69. package/dist/agent/engine/anthropic-engine.js +14 -3
  70. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  71. package/dist/agent/engine/builder-engine.d.ts +1 -1
  72. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  73. package/dist/agent/engine/builder-engine.js +26 -4
  74. package/dist/agent/engine/builder-engine.js.map +1 -1
  75. package/dist/agent/engine/registry.d.ts.map +1 -1
  76. package/dist/agent/engine/registry.js +47 -2
  77. package/dist/agent/engine/registry.js.map +1 -1
  78. package/dist/agent/model-config.d.ts +2 -2
  79. package/dist/agent/model-config.d.ts.map +1 -1
  80. package/dist/agent/model-config.js +0 -2
  81. package/dist/agent/model-config.js.map +1 -1
  82. package/dist/agent/production-agent.d.ts.map +1 -1
  83. package/dist/agent/production-agent.js +12 -1
  84. package/dist/agent/production-agent.js.map +1 -1
  85. package/dist/agent/run-manager.d.ts.map +1 -1
  86. package/dist/agent/run-manager.js +52 -33
  87. package/dist/agent/run-manager.js.map +1 -1
  88. package/dist/agent/run-store.d.ts +24 -0
  89. package/dist/agent/run-store.d.ts.map +1 -1
  90. package/dist/agent/run-store.js +64 -2
  91. package/dist/agent/run-store.js.map +1 -1
  92. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  93. package/dist/agent/thread-data-builder.js +28 -2
  94. package/dist/agent/thread-data-builder.js.map +1 -1
  95. package/dist/client/AssistantChat.d.ts +6 -0
  96. package/dist/client/AssistantChat.d.ts.map +1 -1
  97. package/dist/client/AssistantChat.js +243 -36
  98. package/dist/client/AssistantChat.js.map +1 -1
  99. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  100. package/dist/client/agent-chat-adapter.js +15 -1
  101. package/dist/client/agent-chat-adapter.js.map +1 -1
  102. package/dist/client/chat/repo-helpers.d.ts.map +1 -1
  103. package/dist/client/chat/repo-helpers.js +43 -0
  104. package/dist/client/chat/repo-helpers.js.map +1 -1
  105. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  106. package/dist/client/chat/tool-call-display.js +4 -4
  107. package/dist/client/chat/tool-call-display.js.map +1 -1
  108. package/dist/client/chat-model-groups.d.ts.map +1 -1
  109. package/dist/client/chat-model-groups.js +1 -3
  110. package/dist/client/chat-model-groups.js.map +1 -1
  111. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  112. package/dist/client/composer/TiptapComposer.js +0 -2
  113. package/dist/client/composer/TiptapComposer.js.map +1 -1
  114. package/dist/client/embed-auth.d.ts.map +1 -1
  115. package/dist/client/embed-auth.js +14 -0
  116. package/dist/client/embed-auth.js.map +1 -1
  117. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  118. package/dist/client/settings/SettingsSection.js +32 -3
  119. package/dist/client/settings/SettingsSection.js.map +1 -1
  120. package/dist/client/sse-event-processor.d.ts.map +1 -1
  121. package/dist/client/sse-event-processor.js +44 -17
  122. package/dist/client/sse-event-processor.js.map +1 -1
  123. package/dist/client/use-db-sync.d.ts.map +1 -1
  124. package/dist/client/use-db-sync.js +29 -9
  125. package/dist/client/use-db-sync.js.map +1 -1
  126. package/dist/collab/agent-presence.d.ts.map +1 -1
  127. package/dist/collab/agent-presence.js +5 -2
  128. package/dist/collab/agent-presence.js.map +1 -1
  129. package/dist/collab/awareness-store.d.ts +1 -1
  130. package/dist/collab/awareness-store.d.ts.map +1 -1
  131. package/dist/collab/awareness-store.js +0 -0
  132. package/dist/collab/awareness-store.js.map +1 -1
  133. package/dist/collab/awareness.d.ts +2 -0
  134. package/dist/collab/awareness.d.ts.map +1 -1
  135. package/dist/collab/awareness.js +46 -2
  136. package/dist/collab/awareness.js.map +1 -1
  137. package/dist/collab/routes.d.ts +1 -1
  138. package/dist/notifications/routes.d.ts +1 -1
  139. package/dist/observability/routes.d.ts +5 -5
  140. package/dist/progress/routes.d.ts +1 -1
  141. package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
  142. package/dist/scripts/agent-engines/manage-agent-engine.js +6 -6
  143. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  144. package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
  145. package/dist/scripts/agent-engines/set-agent-engine.js +5 -13
  146. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  147. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  148. package/dist/server/core-routes-plugin.d.ts +5 -0
  149. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  150. package/dist/server/core-routes-plugin.js +10 -3
  151. package/dist/server/core-routes-plugin.js.map +1 -1
  152. package/dist/server/embed-session.d.ts.map +1 -1
  153. package/dist/server/embed-session.js +17 -4
  154. package/dist/server/embed-session.js.map +1 -1
  155. package/dist/styles/agent-native.css +51 -0
  156. package/dist/tracking/providers.d.ts.map +1 -1
  157. package/dist/tracking/providers.js +23 -5
  158. package/dist/tracking/providers.js.map +1 -1
  159. package/docs/content/locales/ar-SA/server.mdx +35 -0
  160. package/docs/content/locales/de-DE/server.mdx +35 -0
  161. package/docs/content/locales/es-ES/server.mdx +35 -0
  162. package/docs/content/locales/fr-FR/server.mdx +35 -0
  163. package/docs/content/locales/hi-IN/server.mdx +35 -0
  164. package/docs/content/locales/ja-JP/server.mdx +35 -0
  165. package/docs/content/locales/ko-KR/server.mdx +35 -0
  166. package/docs/content/locales/pt-BR/server.mdx +35 -0
  167. package/docs/content/locales/zh-CN/server.mdx +35 -0
  168. package/docs/content/locales/zh-TW/server.mdx +35 -0
  169. package/docs/content/server.mdx +35 -0
  170. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"builder-engine.js","sourceRoot":"","sources":["../../../src/agent/engine/builder-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BuilderEngine — HTTP client for the Builder.io managed LLM gateway.\n *\n * The gateway accepts an Anthropic-shaped request body and streams events as\n * JSONL. This engine translates the framework's EngineStreamOptions into the\n * gateway request, parses the streamed events into EngineEvent items, and\n * maps gateway error responses (402 quota, 403 disabled, 401 auth, 429\n * concurrency) into structured stop events that carry an upgrade URL when\n * the chat UI needs to prompt the user to upgrade.\n *\n * Credentials come from BUILDER_PRIVATE_KEY + BUILDER_PUBLIC_KEY (set via the\n * Builder CLI-auth onboarding flow). Base URL is overridable via\n * BUILDER_GATEWAY_BASE_URL.\n */\n\nimport { captureError } from \"../../server/capture-error.js\";\nimport {\n clearBuilderCredentialAuthFailure,\n resolveBuilderCredentials,\n getBuilderGatewayBaseUrl,\n recordBuilderCredentialAuthFailure,\n} from \"../../server/credential-provider.js\";\nimport {\n normalizeReasoningEffortForModel,\n type ReasoningEffort,\n} from \"../../shared/reasoning-effort.js\";\nimport { isInBackgroundFunctionRuntime } from \"../durable-background.js\";\nimport { BUILDER_MODEL_CONFIG } from \"../model-config.js\";\nimport { getBuilderGatewayRequestHeaders } from \"./builder-gateway-headers.js\";\nimport {\n LLM_MISSING_CREDENTIALS_ERROR_CODE,\n LLM_MISSING_CREDENTIALS_MESSAGE,\n} from \"./credential-errors.js\";\nimport { resolveMaxOutputTokensForEngine } from \"./output-tokens.js\";\nimport {\n engineMessagesToBuilderGatewayAnthropic,\n engineToolsToAnthropic,\n} from \"./translate-anthropic.js\";\nimport type {\n AgentEngine,\n EngineCapabilities,\n EngineContentPart,\n EngineEvent,\n EngineStreamOptions,\n} from \"./types.js\";\n\nexport const BUILDER_CAPABILITIES: EngineCapabilities = {\n thinking: true,\n promptCaching: true,\n vision: true,\n computerUse: false,\n parallelToolCalls: true,\n};\n\nexport const BUILDER_SUPPORTED_MODELS = BUILDER_MODEL_CONFIG.supportedModels;\n\n// Keep the foreground hosted gateway timeout below the synchronous serverless\n// wall so the agent loop can append a continuation and persist terminal state\n// before the host hard-kills the invocation.\nconst DEFAULT_BUILDER_GATEWAY_TIMEOUT_MS = 45_000;\nconst MAX_HOSTED_FOREGROUND_BUILDER_GATEWAY_TIMEOUT_MS = 45_000;\n/**\n * Netlify background functions have a 15-minute wall. Keep the Builder gateway\n * ceiling below that, but above the run-manager's 13-minute soft-timeout so\n * durable background runs checkpoint before this timer wins.\n */\nconst MAX_BACKGROUND_BUILDER_GATEWAY_TIMEOUT_MS = 14 * 60_000;\n/** Local and non-hosted runtimes have no synchronous serverless wall. */\nconst MAX_LOCAL_BUILDER_GATEWAY_TIMEOUT_MS =\n MAX_BACKGROUND_BUILDER_GATEWAY_TIMEOUT_MS;\nconst BUILDER_GATEWAY_NETWORK_ERROR_CODE = \"builder_gateway_network_error\";\n\nexport const BUILDER_DEFAULT_MODEL = BUILDER_MODEL_CONFIG.defaultModel;\n\n/**\n * Bucket an Anthropic `thinking.budgetTokens` value into the gateway's\n * legacy three-level `reasoning_effort` enum.\n *\n * The thresholds are chosen to align with typical Anthropic extended-thinking\n * budgets we see in the wild:\n * • < 2000 → short one-step reasoning (\"low\")\n * • 2000–8000 → multi-step thinking (\"medium\")\n * • ≥ 8000 → deep planning / long chains (\"high\")\n *\n * 8000 is Anthropic's documented default in our framework (see\n * engine/types.ts:195), so callers that don't explicitly set\n * `budgetTokens` map to \"high\" via the default. If the gateway later\n * exposes more granular knobs or different thresholds, revisit this map.\n */\nfunction mapReasoningEffort(budgetTokens: number): ReasoningEffort {\n if (budgetTokens < 2000) return \"low\";\n if (budgetTokens < 8000) return \"medium\";\n return \"high\";\n}\n\n/**\n * Build the URL the chat UI should link to when a user hits a quota error.\n *\n * We can't deep-link to a per-org billing page from `BUILDER_ORG_NAME` because\n * that field is the org's display name (e.g. \"Nicholas kipchumba Space\"), not\n * a URL-safe slug or id. URL-encoding the display name produces segments like\n * `/app/organizations/Nicholas%20kipchumba%20Space/billing` which Builder's\n * router treats as unknown and silently bounces to `/app/projects`. The\n * Builder CLI-auth callback doesn't expose the org slug/id today, so we route\n * to the org-agnostic subscription page. Agent Native attribution lets Builder\n * skip generic onboarding for new users who land there from an upgrade CTA.\n */\nasync function buildUpgradeUrl(): Promise<string> {\n const url = new URL(\"https://builder.io/account/subscription\");\n url.searchParams.set(\"signupSource\", \"agent-native\");\n url.searchParams.set(\"agentNativeConnectSource\", \"gateway_quota_upgrade\");\n url.searchParams.set(\"agentNativeFlow\", \"connect_llm\");\n url.searchParams.set(\"framework\", \"agent-native\");\n return url.toString();\n}\n\ninterface GatewayErrorBody {\n code?: string;\n message?: string;\n usageInfo?: {\n plan?: string;\n limitExceeded?: string;\n isEnterprise?: boolean;\n };\n}\n\nclass BuilderEngine implements AgentEngine {\n readonly name = \"builder\";\n readonly label = \"Builder.io Gateway\";\n readonly defaultModel = BUILDER_DEFAULT_MODEL;\n readonly supportedModels = BUILDER_SUPPORTED_MODELS;\n readonly capabilities = BUILDER_CAPABILITIES;\n\n async *stream(opts: EngineStreamOptions): AsyncIterable<EngineEvent> {\n const creds = await resolveBuilderCredentials();\n const authHeader = creds.privateKey ? `Bearer ${creds.privateKey}` : null;\n const spaceId = creds.publicKey;\n const builderUserId = creds.userId;\n if (!authHeader || !spaceId) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: LLM_MISSING_CREDENTIALS_MESSAGE,\n errorCode: LLM_MISSING_CREDENTIALS_ERROR_CODE,\n };\n return;\n }\n\n const messages = engineMessagesToBuilderGatewayAnthropic(opts.messages);\n const tools = engineToolsToAnthropic(opts.tools);\n const thinkingBudget =\n opts.providerOptions?.anthropic?.thinking?.budgetTokens;\n const explicitReasoningEffort = normalizeReasoningEffortForModel(\n opts.model,\n opts.reasoningEffort,\n );\n const reasoningEffort =\n explicitReasoningEffort ??\n (typeof thinkingBudget === \"number\"\n ? mapReasoningEffort(thinkingBudget)\n : undefined);\n\n // Apply prompt caching to system + tools (stable prefix) and to the last\n // user message (moving cache breakpoint so growing history gets cached\n // across tool-loop iterations at ~90% off input cost).\n // Templates can opt out by setting providerOptions.anthropic.cacheControl=false.\n const cacheEnabled =\n opts.providerOptions?.anthropic?.cacheControl !== false;\n\n // System: wrap in array with cache_control when caching is on.\n const systemValue: unknown = opts.systemPrompt\n ? cacheEnabled\n ? [\n {\n type: \"text\",\n text: opts.systemPrompt,\n cache_control: { type: \"ephemeral\" },\n },\n ]\n : opts.systemPrompt\n : undefined;\n\n // Tools: add cache_control to the last tool definition.\n let cachedTools = tools;\n if (cacheEnabled && tools.length > 0) {\n cachedTools = [...tools];\n const last = { ...cachedTools[cachedTools.length - 1] } as any;\n last.cache_control = { type: \"ephemeral\" };\n cachedTools[cachedTools.length - 1] = last;\n }\n\n // Messages: add a moving cache breakpoint on the last user message's last\n // content block so the entire conversation prefix is cached.\n let cachedMessages = messages;\n if (cacheEnabled && messages.length > 0) {\n let lastUserIdx = -1;\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if ((messages[i] as any).role === \"user\") {\n lastUserIdx = i;\n break;\n }\n }\n if (lastUserIdx >= 0) {\n cachedMessages = [...messages];\n const lastMsg = { ...cachedMessages[lastUserIdx] } as any;\n if (Array.isArray(lastMsg.content) && lastMsg.content.length > 0) {\n const content = [...lastMsg.content];\n const lastBlock = { ...content[content.length - 1] } as any;\n lastBlock.cache_control = { type: \"ephemeral\" };\n content[content.length - 1] = lastBlock;\n lastMsg.content = content;\n cachedMessages[lastUserIdx] = lastMsg;\n }\n }\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: cachedMessages,\n ...(systemValue !== undefined ? { system: systemValue } : {}),\n ...(cachedTools.length > 0 ? { tools: cachedTools } : {}),\n max_tokens: resolveMaxOutputTokensForEngine(\n this.name,\n opts.maxOutputTokens,\n opts.model,\n ),\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n };\n\n const gatewayBaseUrl = getBuilderGatewayBaseUrl();\n const gatewayUrl = new URL(\n \"messages\",\n gatewayBaseUrl.endsWith(\"/\") ? gatewayBaseUrl : `${gatewayBaseUrl}/`,\n );\n gatewayUrl.searchParams.set(\"apiKey\", spaceId);\n const orgLabel = creds.orgName || \"unknown-org\";\n const tStart = Date.now();\n console.log(\n `[builder-engine] → POST ${gatewayUrl.origin}${gatewayUrl.pathname} model=${opts.model} tools=${tools.length} org=${orgLabel}`,\n );\n\n const gatewayTimeoutMs = getBuilderGatewayTimeoutMs();\n const gatewayAbort = createGatewayAbortSignal(\n opts.abortSignal,\n gatewayTimeoutMs,\n );\n try {\n let response: Response;\n try {\n response = await fetch(gatewayUrl.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n \"x-builder-api-key\": spaceId,\n ...getBuilderGatewayRequestHeaders(),\n ...(builderUserId ? { \"x-builder-user-id\": builderUserId } : {}),\n },\n body: JSON.stringify(body),\n signal: gatewayAbort.signal,\n });\n } catch (err) {\n const timedOut = gatewayAbort.didTimeout();\n if (gatewayAbort.didTimeout()) {\n console.warn(\n `[builder-engine] gateway timed out after ${Date.now() - tStart}ms`,\n );\n }\n if (timedOut || isBuilderGatewayNetworkError(err)) {\n captureBuilderGatewayTransportError(err, {\n phase: \"request\",\n model: opts.model,\n gatewayUrl,\n timeoutMs: gatewayTimeoutMs,\n timedOut,\n elapsedMs: Date.now() - tStart,\n });\n }\n yield createBuilderGatewayTimeoutStop(err, timedOut, gatewayTimeoutMs);\n return;\n }\n\n console.log(\n `[builder-engine] ← ${response.status} ${response.statusText} in ${Date.now() - tStart}ms`,\n );\n\n if (!response.ok) {\n yield* emitHttpError(response);\n return;\n }\n\n // A successful gateway call proves the connected credentials are valid\n // again. Clear any prior auth-failure marker so status / chat-card\n // surfaces stop flagging the connection as broken. This is the only\n // self-healing path for workspace/env-managed credentials, which never\n // flow through writeBuilderCredentials.\n try {\n const creds = await resolveBuilderCredentials();\n await clearBuilderCredentialAuthFailure({\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n });\n } catch {\n // Marker clearing is best-effort; a stale marker just means the user\n // sees \"reconnect Builder\" until the next successful call clears it.\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"text/html\")) {\n const rawText = await response.text().catch(() => \"\");\n yield {\n type: \"stop\",\n reason: \"error\",\n error: normalizeGatewayErrorText(rawText, response.status || 502),\n errorCode: `http_${response.status || 502}`,\n };\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder gateway response has no body\",\n };\n return;\n }\n\n yield* parseJsonlStream(reader, opts.model, {\n abortSignal: gatewayAbort.signal,\n didGatewayTimeout: gatewayAbort.didTimeout,\n gatewayTimeoutMs,\n gatewayUrl,\n requestStartedAt: tStart,\n });\n } finally {\n gatewayAbort.cleanup();\n }\n }\n}\n\nasync function* emitHttpError(response: Response): AsyncIterable<EngineEvent> {\n const status = response.status;\n // Read the body once as text and then try to parse — calling `.json()`\n // and then `.text()` as a fallback fails because the body stream is\n // already consumed (TypeError: Body has already been read), so we'd\n // silently lose non-JSON error payloads like HTML proxy 502s.\n let errBody: GatewayErrorBody = {};\n const rawText = await response.text().catch(() => \"\");\n if (rawText) {\n try {\n errBody = JSON.parse(rawText) as GatewayErrorBody;\n } catch {\n errBody.message = normalizeGatewayErrorText(rawText, status);\n }\n }\n const code = errBody.code ?? `http_${status}`;\n const message = errBody.message ?? `Builder gateway returned ${status}`;\n\n // Belt-and-suspenders: 402 without a structured `credits-limit` code\n // (e.g. bare proxy response) still means quota → show upgrade CTA.\n if (code.startsWith(\"credits-limit\") || status === 402) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n upgradeUrl: await buildUpgradeUrl(),\n };\n return;\n }\n if (code === \"gateway_not_enabled\") {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n return;\n }\n if (status === 401 || code === \"unauthorized\") {\n await recordBuilderCredentialAuthFailure({ status, code, message });\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder authentication failed. Reconnect Builder via Settings.\",\n errorCode: \"builder_auth_error\",\n };\n return;\n }\n if (status === 403 && isBuilderCredentialAuthError(message)) {\n await recordBuilderCredentialAuthFailure({ status, code, message });\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder authentication failed. Reconnect Builder via Settings.\",\n errorCode: \"builder_auth_error\",\n };\n return;\n }\n if (status === 403) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n return;\n }\n if (code === \"rate_limit_exceeded\") {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n return;\n }\n if (status === 429 || code === \"too_many_concurrent_requests\") {\n // Include \"too many requests\" in the message so production-agent's\n // isRetryableError picks up transient concurrency throttles and retries\n // the turn. Daily gateway caps use `rate_limit_exceeded` above and must\n // not loop.\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `${message} (too many requests)`,\n errorCode: code,\n };\n return;\n }\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n}\n\n// Yields one non-empty JSONL line at a time. Flushes any trailing content\n// after the stream ends so a final event without a newline terminator\n// isn't silently dropped — some gateway proxies close the connection on\n// a complete line and the client must still process it.\nasync function* readJsonlLines(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n abortSignal?: AbortSignal,\n): AsyncIterable<string> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await readStreamChunk(reader, abortSignal);\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let newlineIdx = buffer.indexOf(\"\\n\");\n while (newlineIdx !== -1) {\n const line = buffer.slice(0, newlineIdx).trim();\n buffer = buffer.slice(newlineIdx + 1);\n newlineIdx = buffer.indexOf(\"\\n\");\n if (line) yield line;\n }\n }\n // Flush any bytes the streaming decoder buffered for an incomplete multibyte\n // sequence at the end of the stream; otherwise a trailing multibyte char in\n // the final chunk is silently dropped from the last line.\n buffer += decoder.decode();\n const tail = buffer.trim();\n if (tail) yield tail;\n}\n\nasync function* parseJsonlStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n model: string,\n captureContext: {\n abortSignal?: AbortSignal;\n didGatewayTimeout?: () => boolean;\n gatewayTimeoutMs?: number;\n gatewayUrl?: URL;\n requestStartedAt?: number;\n } = {},\n): AsyncIterable<EngineEvent> {\n const gatewayTimeoutMs =\n captureContext.gatewayTimeoutMs ?? DEFAULT_BUILDER_GATEWAY_TIMEOUT_MS;\n const parts: EngineContentPart[] = [];\n let pendingText = \"\";\n let pendingThinking: { text: string; signature?: string } | null = null;\n\n const flushPending = () => {\n if (pendingText) {\n parts.push({ type: \"text\", text: pendingText });\n pendingText = \"\";\n }\n if (pendingThinking) {\n parts.push({\n type: \"thinking\",\n text: pendingThinking.text,\n ...(pendingThinking.signature !== undefined\n ? { signature: pendingThinking.signature }\n : {}),\n });\n pendingThinking = null;\n }\n };\n\n try {\n for await (const line of readJsonlLines(\n reader,\n captureContext.abortSignal,\n )) {\n let event: any;\n try {\n event = JSON.parse(line);\n } catch {\n const normalized = normalizeGatewayErrorText(line, 502);\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `Builder gateway returned invalid JSONL: ${normalized.slice(\n 0,\n 240,\n )}`,\n errorCode: \"http_502\",\n };\n return;\n }\n\n switch (event.type) {\n case \"text-delta\": {\n const text = event.text ?? \"\";\n pendingText += text;\n yield { type: \"text-delta\", text };\n break;\n }\n\n case \"thinking-delta\": {\n const text = event.text ?? \"\";\n if (!pendingThinking) pendingThinking = { text: \"\" };\n pendingThinking.text += text;\n if (event.signature) pendingThinking.signature = event.signature;\n yield {\n type: \"thinking-delta\",\n text,\n ...(event.signature ? { signature: event.signature } : {}),\n };\n break;\n }\n\n case \"tool-call-delta\":\n yield {\n type: \"tool-input-delta\",\n id: event.id,\n name: event.name,\n text:\n typeof event.argsTextDelta === \"string\"\n ? event.argsTextDelta\n : typeof event.delta === \"string\"\n ? event.delta\n : \"\",\n };\n break;\n\n case \"heartbeat\":\n yield { type: \"gateway-heartbeat\" };\n break;\n\n case \"tool-call\": {\n flushPending();\n parts.push({\n type: \"tool-call\",\n id: event.id,\n name: event.name,\n input: event.input,\n });\n yield {\n type: \"tool-call\",\n id: event.id,\n name: event.name,\n input: event.input,\n };\n break;\n }\n\n case \"usage\": {\n const cacheWrite =\n (event.cacheCreatedTokens ?? 0) + (event.cacheCreated1hTokens ?? 0);\n yield {\n type: \"usage\",\n inputTokens: event.inputTokens ?? 0,\n outputTokens: event.outputTokens ?? 0,\n ...(event.cacheInputTokens !== undefined\n ? { cacheReadTokens: event.cacheInputTokens }\n : {}),\n ...(cacheWrite > 0 ? { cacheWriteTokens: cacheWrite } : {}),\n };\n break;\n }\n\n case \"stop\": {\n flushPending();\n yield { type: \"assistant-content\", parts };\n\n const reason = event.reason ?? \"end_turn\";\n if (reason === \"rate_limited\") {\n // Include \"rate_limit\" in the message so production-agent's\n // isRetryableError picks it up and retries.\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `rate_limit exceeded: ${event.error ?? \"upstream provider rate limited\"}`,\n errorCode: \"rate_limited\",\n };\n } else if (reason === \"invalid_request\") {\n // errorCode has no retry-trigger keywords, so isRetryableError\n // won't loop on broken history.\n const errMsg =\n event.error ||\n event.message ||\n \"Builder gateway rejected the request as malformed.\";\n const errCode =\n typeof event.errorCode === \"string\"\n ? event.errorCode\n : typeof event.code === \"string\"\n ? event.code\n : \"invalid_request\";\n console.warn(\n `[builder-engine] stop reason=invalid_request model=${model} code=${errCode} error=${errMsg}`,\n );\n yield {\n type: \"stop\",\n reason: \"error\",\n error: errMsg,\n errorCode: errCode,\n };\n } else if (reason === \"error\") {\n // Surface every diagnostic the gateway gave us so the user (and\n // our logs) get more than a bare \"Gateway error\". The gateway\n // sometimes emits an error stop event with no message — most\n // commonly when the upstream provider rejects the model for\n // this account (Opus quotas have hit this in practice).\n const explicitErrMsg = event.error || event.message || event.detail;\n const errMsg =\n explicitErrMsg ??\n `Gateway error (no detail; raw event: ${JSON.stringify(event)})`;\n const gatewayErrCode = event.errorCode ?? event.code;\n const isCredentialAuthError =\n Boolean(explicitErrMsg) &&\n isBuilderCredentialAuthError(String(errMsg));\n const errCode = isCredentialAuthError\n ? \"builder_auth_error\"\n : (gatewayErrCode ??\n (!explicitErrMsg ? \"builder_gateway_error\" : undefined));\n console.error(\n `[builder-engine] stop reason=error model=${model} code=${errCode ?? \"(none)\"} error=${errMsg}`,\n );\n if (isCredentialAuthError) {\n await recordBuilderCredentialAuthFailure({\n code:\n typeof gatewayErrCode === \"string\" ? gatewayErrCode : errCode,\n message: String(errMsg),\n });\n }\n // No-detail gateway errors are opaque to the chat client — the\n // only way to debug them is from the gateway side. Capture rich\n // tags here (model, gatewayOrigin, requestId) so the gateway\n // team can search Sentry by requestId or filter by model. The\n // downstream run-manager will also capture the EngineError once\n // it's thrown, but without these tags.\n if (!explicitErrMsg) {\n captureBuilderGatewayNoDetailError({\n requestId:\n typeof event.requestId === \"string\"\n ? event.requestId\n : undefined,\n model,\n gatewayUrl: captureContext.gatewayUrl,\n rawEvent: event,\n });\n }\n yield {\n type: \"stop\",\n reason: \"error\",\n error: errMsg,\n ...(errCode ? { errorCode: errCode } : {}),\n };\n } else if (\n reason === \"end_turn\" ||\n reason === \"tool_use\" ||\n reason === \"max_tokens\" ||\n reason === \"stop_sequence\"\n ) {\n yield { type: \"stop\", reason };\n } else {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `Unknown stop reason: ${reason}`,\n };\n }\n return;\n }\n\n default:\n // Unknown event type — ignore for forward compat.\n break;\n }\n }\n\n // Stream ended without a stop event — synthesize one so callers don't hang.\n flushPending();\n yield { type: \"assistant-content\", parts };\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder gateway stream ended without a stop event\",\n };\n } catch (err) {\n const timedOut = captureContext.didGatewayTimeout?.() ?? false;\n if (timedOut || isBuilderGatewayNetworkError(err)) {\n captureBuilderGatewayTransportError(err, {\n phase: \"stream\",\n model,\n gatewayUrl: captureContext.gatewayUrl,\n timeoutMs: gatewayTimeoutMs,\n timedOut,\n elapsedMs:\n typeof captureContext.requestStartedAt === \"number\"\n ? Date.now() - captureContext.requestStartedAt\n : undefined,\n });\n }\n yield createBuilderGatewayTimeoutStop(err, timedOut, gatewayTimeoutMs);\n } finally {\n // Release the reader on every exit path — early returns (invalid JSONL,\n // stop event) and generator abandonment both leave the underlying\n // Response body locked otherwise. cancel() also closes the socket.\n try {\n await reader.cancel();\n } catch {\n // Already cancelled or closed\n }\n }\n}\n\nfunction readStreamChunk(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n abortSignal?: AbortSignal,\n): Promise<ReadableStreamReadResult<Uint8Array>> {\n if (!abortSignal) return reader.read();\n if (abortSignal.aborted) {\n return Promise.reject(abortSignal.reason ?? new Error(\"Stream aborted\"));\n }\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(abortSignal.reason ?? new Error(\"Stream aborted\"));\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n reader.read().then(\n (value) => {\n abortSignal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (err) => {\n abortSignal.removeEventListener(\"abort\", onAbort);\n reject(err);\n },\n );\n });\n}\n\nfunction normalizeGatewayErrorText(raw: string, status: number): string {\n const text = raw.trim();\n const looksHtml = /<html[\\s>]|<body[\\s>]|<head[\\s>]/i.test(text);\n const readable = looksHtml ? htmlToText(text) : text;\n if (/inactivity timeout/i.test(readable)) {\n return `Builder gateway returned ${status}: Inactivity Timeout. The upstream connection was idle too long before sending data.`;\n }\n if (looksHtml) {\n return `Builder gateway returned ${status}: ${readable.slice(0, 240)}`;\n }\n return readable;\n}\n\nfunction htmlToText(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(p|div|h1|h2|h3|li|tr)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/&nbsp;/gi, \" \")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\")\n .replace(/&amp;/gi, \"&\")\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n\\s+/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nexport function createBuilderEngine(\n _config: Record<string, unknown> = {},\n): AgentEngine {\n return new BuilderEngine();\n}\n\nfunction resolveMaxBuilderGatewayTimeoutMs(): number {\n if (isInBackgroundFunctionRuntime()) {\n return MAX_BACKGROUND_BUILDER_GATEWAY_TIMEOUT_MS;\n }\n\n if (!isHostedBuilderRuntime()) {\n return MAX_LOCAL_BUILDER_GATEWAY_TIMEOUT_MS;\n }\n\n try {\n const base = getBuilderGatewayBaseUrl();\n if (/^https?:\\/\\/(localhost|127\\.0\\.0\\.1)([:/]|$)/i.test(base)) {\n return MAX_LOCAL_BUILDER_GATEWAY_TIMEOUT_MS;\n }\n } catch {\n // ignore malformed override\n }\n return MAX_HOSTED_FOREGROUND_BUILDER_GATEWAY_TIMEOUT_MS;\n}\n\nfunction isHostedBuilderRuntime(): boolean {\n if (\n process.env.NETLIFY &&\n process.env.NETLIFY !== \"false\" &&\n process.env.NETLIFY_LOCAL !== \"true\"\n ) {\n return true;\n }\n if (\n process.env.AWS_LAMBDA_FUNCTION_NAME &&\n process.env.NETLIFY_LOCAL !== \"true\"\n ) {\n return true;\n }\n return Boolean(\n process.env.CF_PAGES ||\n process.env.VERCEL ||\n process.env.VERCEL_ENV ||\n process.env.RENDER ||\n process.env.FLY_APP_NAME ||\n process.env.K_SERVICE,\n );\n}\n\nfunction getBuilderGatewayTimeoutMs(): number {\n const raw = process.env.AGENT_NATIVE_BUILDER_GATEWAY_TIMEOUT_MS;\n const maxMs = resolveMaxBuilderGatewayTimeoutMs();\n if (!raw) return maxMs;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return maxMs;\n }\n return Math.min(parsed, maxMs);\n}\n\nfunction createGatewayAbortSignal(\n parentSignal: AbortSignal,\n timeoutMs: number,\n): {\n signal: AbortSignal;\n didTimeout: () => boolean;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n let timedOut = false;\n\n const abortFromParent = () => {\n if (!controller.signal.aborted) {\n controller.abort(parentSignal.reason);\n }\n };\n\n const timeout = setTimeout(() => {\n timedOut = true;\n if (!controller.signal.aborted) {\n controller.abort(new Error(\"Builder gateway request timed out\"));\n }\n }, timeoutMs);\n\n if (parentSignal.aborted) abortFromParent();\n parentSignal.addEventListener(\"abort\", abortFromParent, { once: true });\n\n return {\n signal: controller.signal,\n didTimeout: () => timedOut,\n cleanup: () => {\n clearTimeout(timeout);\n parentSignal.removeEventListener(\"abort\", abortFromParent);\n },\n };\n}\n\nfunction isBuilderCredentialAuthError(message: string): boolean {\n const lowerMessage = message.toLowerCase();\n const referencesAccessToken =\n lowerMessage.includes(\"personal access token\") ||\n lowerMessage.includes(\"access token\");\n const rejectedToken =\n lowerMessage.includes(\"invalid\") ||\n lowerMessage.includes(\"inactive\") ||\n lowerMessage.includes(\"expired\") ||\n lowerMessage.includes(\"revoked\");\n return (\n lowerMessage.includes(\"unauthorized\") ||\n lowerMessage.includes(\"private key\") ||\n lowerMessage.includes(\"invalid token\") ||\n lowerMessage.includes(\"invalid_token\") ||\n lowerMessage.includes(\"token invalid\") ||\n (referencesAccessToken && rejectedToken)\n );\n}\n\nfunction normalizeBuilderGatewayFetchError(\n err: unknown,\n timedOut: boolean,\n timeoutMs: number,\n): string {\n if (timedOut) {\n return `Builder gateway timed out after ${formatTimeoutMs(\n timeoutMs,\n )} before the hosting function limit. Please retry; if this keeps happening, reduce the prompt size or try again when the gateway is less busy.`;\n }\n const message = errorMessage(err);\n if (isBuilderGatewayNetworkError(err)) {\n return `Builder gateway network error: ${message}`;\n }\n return message;\n}\n\nfunction createBuilderGatewayTimeoutStop(\n err: unknown,\n timedOut: boolean,\n timeoutMs: number,\n): EngineEvent {\n const networkError = !timedOut && isBuilderGatewayNetworkError(err);\n return {\n type: \"stop\",\n reason: \"error\",\n error: normalizeBuilderGatewayFetchError(err, timedOut, timeoutMs),\n ...(timedOut\n ? { errorCode: \"builder_gateway_timeout\" }\n : networkError\n ? { errorCode: BUILDER_GATEWAY_NETWORK_ERROR_CODE }\n : {}),\n };\n}\n\nfunction formatTimeoutMs(timeoutMs: number): string {\n if (timeoutMs < 1000) return `${timeoutMs}ms`;\n return `${Math.round(timeoutMs / 1000)}s`;\n}\n\nfunction errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction errorSearchText(err: unknown): string {\n const parts: string[] = [];\n if (err instanceof Error) {\n parts.push(err.name, err.message);\n const maybe = err as Error & {\n code?: unknown;\n cause?: unknown;\n };\n if (typeof maybe.code === \"string\") parts.push(maybe.code);\n if (maybe.cause) parts.push(errorSearchText(maybe.cause));\n } else {\n parts.push(String(err));\n }\n return parts.join(\" \").toLowerCase();\n}\n\nfunction isBuilderGatewayNetworkError(err: unknown): boolean {\n const text = errorSearchText(err);\n return (\n text.includes(\"socket hang up\") ||\n text.includes(\"econnreset\") ||\n text.includes(\"enetreset\") ||\n text.includes(\"econnaborted\") ||\n text.includes(\"fetch failed\") ||\n text.includes(\"network error\") ||\n text.includes(\"connection reset\") ||\n text.includes(\"connection closed\") ||\n text.includes(\"stream closed\") ||\n text.includes(\"terminated\")\n );\n}\n\nfunction captureBuilderGatewayTransportError(\n err: unknown,\n context: {\n phase: \"request\" | \"stream\";\n model: string;\n gatewayUrl?: URL;\n timeoutMs: number;\n timedOut: boolean;\n elapsedMs?: number;\n },\n): void {\n captureError(err, {\n route: \"/_agent-native/agent-chat\",\n tags: {\n source: \"builder-engine\",\n phase: context.phase,\n model: context.model,\n timedOut: context.timedOut ? \"true\" : \"false\",\n errorCode: context.timedOut\n ? \"builder_gateway_timeout\"\n : BUILDER_GATEWAY_NETWORK_ERROR_CODE,\n },\n extra: {\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n timeoutMs: context.timeoutMs,\n elapsedMs: context.elapsedMs,\n },\n contexts: {\n builderGateway: {\n phase: context.phase,\n model: context.model,\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n timeoutMs: context.timeoutMs,\n timedOut: context.timedOut,\n elapsedMs: context.elapsedMs,\n },\n },\n });\n}\n\n/**\n * Capture a Builder-gateway no-detail stop event to Sentry with the request\n * context the run-manager doesn't have. The gateway emits\n * `{type:\"stop\",reason:\"error\",requestId:\"...\"}` with no diagnostic — the\n * only way to debug it is from the gateway side, so we surface model,\n * gatewayOrigin, and requestId as searchable tags.\n */\nfunction captureBuilderGatewayNoDetailError(context: {\n requestId?: string;\n model: string;\n gatewayUrl?: URL;\n rawEvent: unknown;\n}): void {\n const err = new Error(\n context.requestId\n ? `Builder gateway stop reason=error with no detail (requestId=${context.requestId})`\n : \"Builder gateway stop reason=error with no detail\",\n );\n err.name = \"BuilderGatewayNoDetailError\";\n captureError(err, {\n route: \"/_agent-native/agent-chat\",\n tags: {\n source: \"builder-engine\",\n phase: \"stream\",\n model: context.model,\n errorCode: \"builder_gateway_error\",\n ...(context.requestId ? { gatewayRequestId: context.requestId } : {}),\n },\n extra: {\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n rawEvent: context.rawEvent,\n },\n contexts: {\n builderGateway: {\n phase: \"stream\",\n model: context.model,\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n requestId: context.requestId,\n errorCode: \"builder_gateway_error\",\n },\n },\n });\n}\n"]}
1
+ {"version":3,"file":"builder-engine.js","sourceRoot":"","sources":["../../../src/agent/engine/builder-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * BuilderEngine — HTTP client for the Builder.io managed LLM gateway.\n *\n * The gateway accepts an Anthropic-shaped request body and streams events as\n * JSONL. This engine translates the framework's EngineStreamOptions into the\n * gateway request, parses the streamed events into EngineEvent items, and\n * maps gateway error responses (402 quota, 403 disabled, 401 auth, 429\n * concurrency) into structured stop events that carry an upgrade URL when\n * the chat UI needs to prompt the user to upgrade.\n *\n * Credentials come from BUILDER_PRIVATE_KEY + BUILDER_PUBLIC_KEY (set via the\n * Builder CLI-auth onboarding flow). Base URL is overridable via\n * BUILDER_GATEWAY_BASE_URL.\n */\n\nimport { captureError } from \"../../server/capture-error.js\";\nimport {\n clearBuilderCredentialAuthFailure,\n resolveBuilderCredentials,\n getBuilderGatewayBaseUrl,\n recordBuilderCredentialAuthFailure,\n} from \"../../server/credential-provider.js\";\nimport {\n normalizeReasoningEffortForModel,\n type ReasoningEffort,\n} from \"../../shared/reasoning-effort.js\";\nimport { isInBackgroundFunctionRuntime } from \"../durable-background.js\";\nimport { BUILDER_MODEL_CONFIG } from \"../model-config.js\";\nimport { getBuilderGatewayRequestHeaders } from \"./builder-gateway-headers.js\";\nimport {\n LLM_MISSING_CREDENTIALS_ERROR_CODE,\n LLM_MISSING_CREDENTIALS_MESSAGE,\n} from \"./credential-errors.js\";\nimport { resolveMaxOutputTokensForEngine } from \"./output-tokens.js\";\nimport {\n engineMessagesToBuilderGatewayAnthropic,\n engineToolsToAnthropic,\n} from \"./translate-anthropic.js\";\nimport type {\n AgentEngine,\n EngineCapabilities,\n EngineContentPart,\n EngineEvent,\n EngineStreamOptions,\n} from \"./types.js\";\n\nexport const BUILDER_CAPABILITIES: EngineCapabilities = {\n thinking: true,\n promptCaching: true,\n vision: true,\n computerUse: false,\n parallelToolCalls: true,\n};\n\nexport const BUILDER_SUPPORTED_MODELS = BUILDER_MODEL_CONFIG.supportedModels;\n\n// Keep the foreground hosted gateway timeout below the synchronous serverless\n// wall so the agent loop can append a continuation and persist terminal state\n// before the host hard-kills the invocation.\nconst DEFAULT_BUILDER_GATEWAY_TIMEOUT_MS = 45_000;\nconst MAX_HOSTED_FOREGROUND_BUILDER_GATEWAY_TIMEOUT_MS = 45_000;\n/**\n * Netlify background functions have a 15-minute wall. Keep the Builder gateway\n * ceiling below that, but above the run-manager's 13-minute soft-timeout so\n * durable background runs checkpoint before this timer wins.\n */\nconst MAX_BACKGROUND_BUILDER_GATEWAY_TIMEOUT_MS = 14 * 60_000;\n/** Local and non-hosted runtimes have no synchronous serverless wall. */\nconst MAX_LOCAL_BUILDER_GATEWAY_TIMEOUT_MS =\n MAX_BACKGROUND_BUILDER_GATEWAY_TIMEOUT_MS;\nconst BUILDER_GATEWAY_NETWORK_ERROR_CODE = \"builder_gateway_network_error\";\n\nexport const BUILDER_DEFAULT_MODEL = BUILDER_MODEL_CONFIG.defaultModel;\n\n/**\n * Bucket an Anthropic `thinking.budgetTokens` value into the gateway's\n * legacy three-level `reasoning_effort` enum.\n *\n * The thresholds are chosen to align with typical Anthropic extended-thinking\n * budgets we see in the wild:\n * • < 2000 → short one-step reasoning (\"low\")\n * • 2000–8000 → multi-step thinking (\"medium\")\n * • ≥ 8000 → deep planning / long chains (\"high\")\n *\n * 8000 is Anthropic's documented default in our framework (see\n * engine/types.ts:195), so callers that don't explicitly set\n * `budgetTokens` map to \"high\" via the default. If the gateway later\n * exposes more granular knobs or different thresholds, revisit this map.\n */\nfunction mapReasoningEffort(budgetTokens: number): ReasoningEffort {\n if (budgetTokens < 2000) return \"low\";\n if (budgetTokens < 8000) return \"medium\";\n return \"high\";\n}\n\n/**\n * Build the URL the chat UI should link to when a user hits a quota error.\n *\n * We can't deep-link to a per-org billing page from `BUILDER_ORG_NAME` because\n * that field is the org's display name (e.g. \"Nicholas kipchumba Space\"), not\n * a URL-safe slug or id. URL-encoding the display name produces segments like\n * `/app/organizations/Nicholas%20kipchumba%20Space/billing` which Builder's\n * router treats as unknown and silently bounces to `/app/projects`. The\n * Builder CLI-auth callback doesn't expose the org slug/id today, so we route\n * to the org-agnostic subscription page. Agent Native attribution lets Builder\n * skip generic onboarding for new users who land there from an upgrade CTA.\n */\nasync function buildUpgradeUrl(): Promise<string> {\n const url = new URL(\"https://builder.io/account/subscription\");\n url.searchParams.set(\"signupSource\", \"agent-native\");\n url.searchParams.set(\"agentNativeConnectSource\", \"gateway_quota_upgrade\");\n url.searchParams.set(\"agentNativeFlow\", \"connect_llm\");\n url.searchParams.set(\"framework\", \"agent-native\");\n return url.toString();\n}\n\ninterface GatewayErrorBody {\n code?: string;\n message?: string;\n usageInfo?: {\n plan?: string;\n limitExceeded?: string;\n isEnterprise?: boolean;\n };\n}\n\nclass BuilderEngine implements AgentEngine {\n readonly name = \"builder\";\n readonly label = \"Builder.io Gateway\";\n readonly defaultModel = BUILDER_DEFAULT_MODEL;\n readonly supportedModels = BUILDER_SUPPORTED_MODELS;\n readonly capabilities = BUILDER_CAPABILITIES;\n\n async *stream(opts: EngineStreamOptions): AsyncIterable<EngineEvent> {\n const creds = await resolveBuilderCredentials();\n const authHeader = creds.privateKey ? `Bearer ${creds.privateKey}` : null;\n const spaceId = creds.publicKey;\n const builderUserId = creds.userId;\n if (!authHeader || !spaceId) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: LLM_MISSING_CREDENTIALS_MESSAGE,\n errorCode: LLM_MISSING_CREDENTIALS_ERROR_CODE,\n };\n return;\n }\n\n const messages = engineMessagesToBuilderGatewayAnthropic(opts.messages);\n const tools = engineToolsToAnthropic(opts.tools);\n const thinkingBudget =\n opts.providerOptions?.anthropic?.thinking?.budgetTokens;\n const explicitReasoningEffort = normalizeReasoningEffortForModel(\n opts.model,\n opts.reasoningEffort,\n );\n const reasoningEffort =\n explicitReasoningEffort ??\n (typeof thinkingBudget === \"number\"\n ? mapReasoningEffort(thinkingBudget)\n : undefined);\n\n // Apply prompt caching to system + tools (stable prefix) and to the last\n // user message (moving cache breakpoint so growing history gets cached\n // across tool-loop iterations at ~90% off input cost).\n // Templates can opt out by setting providerOptions.anthropic.cacheControl=false.\n const cacheEnabled =\n opts.providerOptions?.anthropic?.cacheControl !== false;\n\n // System: wrap in array with cache_control when caching is on.\n const systemValue: unknown = opts.systemPrompt\n ? cacheEnabled\n ? [\n {\n type: \"text\",\n text: opts.systemPrompt,\n cache_control: { type: \"ephemeral\" },\n },\n ]\n : opts.systemPrompt\n : undefined;\n\n // Tools: add cache_control to the last tool definition.\n let cachedTools = tools;\n if (cacheEnabled && tools.length > 0) {\n cachedTools = [...tools];\n const last = { ...cachedTools[cachedTools.length - 1] } as any;\n last.cache_control = { type: \"ephemeral\" };\n cachedTools[cachedTools.length - 1] = last;\n }\n\n // Messages: add a moving cache breakpoint on the last user message's last\n // content block so the entire conversation prefix is cached.\n let cachedMessages = messages;\n if (cacheEnabled && messages.length > 0) {\n let lastUserIdx = -1;\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if ((messages[i] as any).role === \"user\") {\n lastUserIdx = i;\n break;\n }\n }\n if (lastUserIdx >= 0) {\n cachedMessages = [...messages];\n const lastMsg = { ...cachedMessages[lastUserIdx] } as any;\n if (Array.isArray(lastMsg.content) && lastMsg.content.length > 0) {\n const content = [...lastMsg.content];\n const lastBlock = { ...content[content.length - 1] } as any;\n lastBlock.cache_control = { type: \"ephemeral\" };\n content[content.length - 1] = lastBlock;\n lastMsg.content = content;\n cachedMessages[lastUserIdx] = lastMsg;\n }\n }\n }\n\n const body: Record<string, unknown> = {\n model: opts.model,\n messages: cachedMessages,\n ...(systemValue !== undefined ? { system: systemValue } : {}),\n ...(cachedTools.length > 0 ? { tools: cachedTools } : {}),\n max_tokens: resolveMaxOutputTokensForEngine(\n this.name,\n opts.maxOutputTokens,\n opts.model,\n ),\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n };\n\n const gatewayBaseUrl = getBuilderGatewayBaseUrl();\n const gatewayUrl = new URL(\n \"messages\",\n gatewayBaseUrl.endsWith(\"/\") ? gatewayBaseUrl : `${gatewayBaseUrl}/`,\n );\n gatewayUrl.searchParams.set(\"apiKey\", spaceId);\n const orgLabel = creds.orgName || \"unknown-org\";\n const tStart = Date.now();\n console.log(\n `[builder-engine] → POST ${gatewayUrl.origin}${gatewayUrl.pathname} model=${opts.model} tools=${tools.length} org=${orgLabel}`,\n );\n\n const gatewayTimeoutMs = getBuilderGatewayTimeoutMs();\n const gatewayAbort = createGatewayAbortSignal(\n opts.abortSignal,\n gatewayTimeoutMs,\n );\n try {\n let response: Response;\n try {\n response = await fetch(gatewayUrl.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: authHeader,\n \"x-builder-api-key\": spaceId,\n ...getBuilderGatewayRequestHeaders(),\n ...(builderUserId ? { \"x-builder-user-id\": builderUserId } : {}),\n },\n body: JSON.stringify(body),\n signal: gatewayAbort.signal,\n });\n } catch (err) {\n const timedOut = gatewayAbort.didTimeout();\n if (gatewayAbort.didTimeout()) {\n console.warn(\n `[builder-engine] gateway timed out after ${Date.now() - tStart}ms`,\n );\n }\n if (timedOut || isBuilderGatewayNetworkError(err)) {\n captureBuilderGatewayTransportError(err, {\n phase: \"request\",\n model: opts.model,\n gatewayUrl,\n timeoutMs: gatewayTimeoutMs,\n timedOut,\n elapsedMs: Date.now() - tStart,\n });\n }\n yield createBuilderGatewayTimeoutStop(err, timedOut, gatewayTimeoutMs);\n return;\n }\n\n console.log(\n `[builder-engine] ← ${response.status} ${response.statusText} in ${Date.now() - tStart}ms`,\n );\n\n if (!response.ok) {\n yield* emitHttpError(response);\n return;\n }\n\n // A successful gateway call proves the connected credentials are valid\n // again. Clear any prior auth-failure marker so status / chat-card\n // surfaces stop flagging the connection as broken. This is the only\n // self-healing path for workspace/env-managed credentials, which never\n // flow through writeBuilderCredentials.\n try {\n const creds = await resolveBuilderCredentials();\n await clearBuilderCredentialAuthFailure({\n privateKey: creds.privateKey,\n publicKey: creds.publicKey,\n });\n } catch {\n // Marker clearing is best-effort; a stale marker just means the user\n // sees \"reconnect Builder\" until the next successful call clears it.\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"text/html\")) {\n const rawText = await response.text().catch(() => \"\");\n yield {\n type: \"stop\",\n reason: \"error\",\n error: normalizeGatewayErrorText(rawText, response.status || 502),\n errorCode: `http_${response.status || 502}`,\n };\n return;\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder gateway response has no body\",\n };\n return;\n }\n\n yield* parseJsonlStream(reader, opts.model, {\n abortSignal: gatewayAbort.signal,\n didGatewayTimeout: gatewayAbort.didTimeout,\n gatewayTimeoutMs,\n gatewayUrl,\n requestStartedAt: tStart,\n });\n } finally {\n gatewayAbort.cleanup();\n }\n }\n}\n\nasync function* emitHttpError(response: Response): AsyncIterable<EngineEvent> {\n const status = response.status;\n // Read the body once as text and then try to parse — calling `.json()`\n // and then `.text()` as a fallback fails because the body stream is\n // already consumed (TypeError: Body has already been read), so we'd\n // silently lose non-JSON error payloads like HTML proxy 502s.\n let errBody: GatewayErrorBody = {};\n const rawText = await response.text().catch(() => \"\");\n if (rawText) {\n try {\n errBody = JSON.parse(rawText) as GatewayErrorBody;\n } catch {\n errBody.message = normalizeGatewayErrorText(rawText, status);\n }\n }\n const code = errBody.code ?? `http_${status}`;\n const message = errBody.message ?? `Builder gateway returned ${status}`;\n\n // Belt-and-suspenders: 402 without a structured `credits-limit` code\n // (e.g. bare proxy response) still means quota → show upgrade CTA.\n if (code.startsWith(\"credits-limit\") || status === 402) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n upgradeUrl: await buildUpgradeUrl(),\n };\n return;\n }\n if (code === \"gateway_not_enabled\") {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n return;\n }\n if (status === 401 || code === \"unauthorized\") {\n await recordBuilderCredentialAuthFailure({ status, code, message });\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder authentication failed. Reconnect Builder via Settings.\",\n errorCode: \"builder_auth_error\",\n };\n return;\n }\n if (status === 403 && isBuilderCredentialAuthError(message)) {\n await recordBuilderCredentialAuthFailure({ status, code, message });\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder authentication failed. Reconnect Builder via Settings.\",\n errorCode: \"builder_auth_error\",\n };\n return;\n }\n if (status === 403) {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n return;\n }\n if (code === \"rate_limit_exceeded\") {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n return;\n }\n if (status === 429 || code === \"too_many_concurrent_requests\") {\n // Include \"too many requests\" in the message so production-agent's\n // isRetryableError picks up transient concurrency throttles and retries\n // the turn. Daily gateway caps use `rate_limit_exceeded` above and must\n // not loop.\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `${message} (too many requests)`,\n errorCode: code,\n };\n return;\n }\n yield {\n type: \"stop\",\n reason: \"error\",\n error: message,\n errorCode: code,\n };\n}\n\n// Yields one non-empty JSONL line at a time. Flushes any trailing content\n// after the stream ends so a final event without a newline terminator\n// isn't silently dropped — some gateway proxies close the connection on\n// a complete line and the client must still process it.\nasync function* readJsonlLines(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n abortSignal?: AbortSignal,\n): AsyncIterable<string> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await readStreamChunk(reader, abortSignal);\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let newlineIdx = buffer.indexOf(\"\\n\");\n while (newlineIdx !== -1) {\n const line = buffer.slice(0, newlineIdx).trim();\n buffer = buffer.slice(newlineIdx + 1);\n newlineIdx = buffer.indexOf(\"\\n\");\n if (line) yield line;\n }\n }\n // Flush any bytes the streaming decoder buffered for an incomplete multibyte\n // sequence at the end of the stream; otherwise a trailing multibyte char in\n // the final chunk is silently dropped from the last line.\n buffer += decoder.decode();\n const tail = buffer.trim();\n if (tail) yield tail;\n}\n\nasync function* parseJsonlStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n model: string,\n captureContext: {\n abortSignal?: AbortSignal;\n didGatewayTimeout?: () => boolean;\n gatewayTimeoutMs?: number;\n gatewayUrl?: URL;\n requestStartedAt?: number;\n } = {},\n): AsyncIterable<EngineEvent> {\n const gatewayTimeoutMs =\n captureContext.gatewayTimeoutMs ?? DEFAULT_BUILDER_GATEWAY_TIMEOUT_MS;\n const parts: EngineContentPart[] = [];\n let pendingText = \"\";\n let pendingThinking: { text: string; signature?: string } | null = null;\n\n const flushPendingText = () => {\n if (pendingText) {\n parts.push({ type: \"text\", text: pendingText });\n pendingText = \"\";\n }\n };\n\n const flushPendingThinking = () => {\n if (pendingThinking) {\n parts.push({\n type: \"thinking\",\n text: pendingThinking.text,\n ...(pendingThinking.signature !== undefined\n ? { signature: pendingThinking.signature }\n : {}),\n });\n pendingThinking = null;\n }\n };\n\n const flushPending = () => {\n flushPendingText();\n flushPendingThinking();\n };\n\n try {\n for await (const line of readJsonlLines(\n reader,\n captureContext.abortSignal,\n )) {\n let event: any;\n try {\n event = JSON.parse(line);\n } catch {\n const normalized = normalizeGatewayErrorText(line, 502);\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `Builder gateway returned invalid JSONL: ${normalized.slice(\n 0,\n 240,\n )}`,\n errorCode: \"http_502\",\n };\n return;\n }\n\n switch (event.type) {\n case \"text-delta\": {\n const text = event.text ?? \"\";\n flushPendingThinking();\n pendingText += text;\n yield { type: \"text-delta\", text };\n break;\n }\n\n case \"thinking-delta\":\n case \"reasoning-delta\": {\n const text = event.text ?? \"\";\n flushPendingText();\n if (!pendingThinking) pendingThinking = { text: \"\" };\n pendingThinking.text += text;\n if (event.signature) pendingThinking.signature = event.signature;\n yield {\n type: \"thinking-delta\",\n text,\n ...(event.signature ? { signature: event.signature } : {}),\n };\n break;\n }\n\n case \"tool-call-delta\":\n yield {\n type: \"tool-input-delta\",\n id: event.id,\n name: event.name,\n text:\n typeof event.argsTextDelta === \"string\"\n ? event.argsTextDelta\n : typeof event.delta === \"string\"\n ? event.delta\n : \"\",\n };\n break;\n\n case \"heartbeat\":\n yield { type: \"gateway-heartbeat\" };\n break;\n\n case \"tool-call\": {\n flushPending();\n parts.push({\n type: \"tool-call\",\n id: event.id,\n name: event.name,\n input: event.input,\n });\n yield {\n type: \"tool-call\",\n id: event.id,\n name: event.name,\n input: event.input,\n };\n break;\n }\n\n case \"usage\": {\n const cacheWrite =\n (event.cacheCreatedTokens ?? 0) + (event.cacheCreated1hTokens ?? 0);\n yield {\n type: \"usage\",\n inputTokens: event.inputTokens ?? 0,\n outputTokens: event.outputTokens ?? 0,\n ...(event.cacheInputTokens !== undefined\n ? { cacheReadTokens: event.cacheInputTokens }\n : {}),\n ...(cacheWrite > 0 ? { cacheWriteTokens: cacheWrite } : {}),\n };\n break;\n }\n\n case \"stop\": {\n flushPending();\n yield { type: \"assistant-content\", parts };\n\n const reason = event.reason ?? \"end_turn\";\n if (reason === \"rate_limited\") {\n // Include \"rate_limit\" in the message so production-agent's\n // isRetryableError picks it up and retries.\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `rate_limit exceeded: ${event.error ?? \"upstream provider rate limited\"}`,\n errorCode: \"rate_limited\",\n };\n } else if (reason === \"invalid_request\") {\n // errorCode has no retry-trigger keywords, so isRetryableError\n // won't loop on broken history.\n const errMsg =\n event.error ||\n event.message ||\n \"Builder gateway rejected the request as malformed.\";\n const errCode =\n typeof event.errorCode === \"string\"\n ? event.errorCode\n : typeof event.code === \"string\"\n ? event.code\n : \"invalid_request\";\n console.warn(\n `[builder-engine] stop reason=invalid_request model=${model} code=${errCode} error=${errMsg}`,\n );\n yield {\n type: \"stop\",\n reason: \"error\",\n error: errMsg,\n errorCode: errCode,\n };\n } else if (reason === \"error\") {\n // Surface every diagnostic the gateway gave us so the user (and\n // our logs) get more than a bare \"Gateway error\". The gateway\n // sometimes emits an error stop event with no message — most\n // commonly when the upstream provider rejects the model for\n // this account (Opus quotas have hit this in practice).\n const explicitErrMsg = event.error || event.message || event.detail;\n const errMsg =\n explicitErrMsg ??\n `Gateway error (no detail; raw event: ${JSON.stringify(event)})`;\n const gatewayErrCode = event.errorCode ?? event.code;\n const isCredentialAuthError =\n Boolean(explicitErrMsg) &&\n isBuilderCredentialAuthError(String(errMsg));\n // Anthropic's bare \"Connection error.\" often arrives here with no\n // gateway code. Tag it as a network error so in-run retries and\n // run-level resume treat it as transient instead of terminal.\n const isProviderConnectionError =\n typeof explicitErrMsg === \"string\" &&\n isProviderConnectionErrorMessage(String(explicitErrMsg));\n const errCode = isCredentialAuthError\n ? \"builder_auth_error\"\n : isProviderConnectionError\n ? BUILDER_GATEWAY_NETWORK_ERROR_CODE\n : (gatewayErrCode ??\n (!explicitErrMsg ? \"builder_gateway_error\" : undefined));\n console.error(\n `[builder-engine] stop reason=error model=${model} code=${errCode ?? \"(none)\"} error=${errMsg}`,\n );\n if (isCredentialAuthError) {\n await recordBuilderCredentialAuthFailure({\n code:\n typeof gatewayErrCode === \"string\" ? gatewayErrCode : errCode,\n message: String(errMsg),\n });\n }\n // No-detail gateway errors are opaque to the chat client — the\n // only way to debug them is from the gateway side. Capture rich\n // tags here (model, gatewayOrigin, requestId) so the gateway\n // team can search Sentry by requestId or filter by model. The\n // downstream run-manager will also capture the EngineError once\n // it's thrown, but without these tags.\n if (!explicitErrMsg) {\n captureBuilderGatewayNoDetailError({\n requestId:\n typeof event.requestId === \"string\"\n ? event.requestId\n : undefined,\n model,\n gatewayUrl: captureContext.gatewayUrl,\n rawEvent: event,\n });\n }\n yield {\n type: \"stop\",\n reason: \"error\",\n error: errMsg,\n ...(errCode ? { errorCode: errCode } : {}),\n };\n } else if (\n reason === \"end_turn\" ||\n reason === \"tool_use\" ||\n reason === \"max_tokens\" ||\n reason === \"stop_sequence\"\n ) {\n yield { type: \"stop\", reason };\n } else {\n yield {\n type: \"stop\",\n reason: \"error\",\n error: `Unknown stop reason: ${reason}`,\n };\n }\n return;\n }\n\n default:\n // Unknown event type — ignore for forward compat.\n break;\n }\n }\n\n // Stream ended without a stop event — synthesize one so callers don't hang.\n flushPending();\n yield { type: \"assistant-content\", parts };\n yield {\n type: \"stop\",\n reason: \"error\",\n error: \"Builder gateway stream ended without a stop event\",\n };\n } catch (err) {\n const timedOut = captureContext.didGatewayTimeout?.() ?? false;\n if (timedOut || isBuilderGatewayNetworkError(err)) {\n captureBuilderGatewayTransportError(err, {\n phase: \"stream\",\n model,\n gatewayUrl: captureContext.gatewayUrl,\n timeoutMs: gatewayTimeoutMs,\n timedOut,\n elapsedMs:\n typeof captureContext.requestStartedAt === \"number\"\n ? Date.now() - captureContext.requestStartedAt\n : undefined,\n });\n }\n yield createBuilderGatewayTimeoutStop(err, timedOut, gatewayTimeoutMs);\n } finally {\n // Release the reader on every exit path — early returns (invalid JSONL,\n // stop event) and generator abandonment both leave the underlying\n // Response body locked otherwise. cancel() also closes the socket.\n try {\n await reader.cancel();\n } catch {\n // Already cancelled or closed\n }\n }\n}\n\nfunction readStreamChunk(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n abortSignal?: AbortSignal,\n): Promise<ReadableStreamReadResult<Uint8Array>> {\n if (!abortSignal) return reader.read();\n if (abortSignal.aborted) {\n return Promise.reject(abortSignal.reason ?? new Error(\"Stream aborted\"));\n }\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(abortSignal.reason ?? new Error(\"Stream aborted\"));\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n reader.read().then(\n (value) => {\n abortSignal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (err) => {\n abortSignal.removeEventListener(\"abort\", onAbort);\n reject(err);\n },\n );\n });\n}\n\nfunction normalizeGatewayErrorText(raw: string, status: number): string {\n const text = raw.trim();\n const looksHtml = /<html[\\s>]|<body[\\s>]|<head[\\s>]/i.test(text);\n const readable = looksHtml ? htmlToText(text) : text;\n if (/inactivity timeout/i.test(readable)) {\n return `Builder gateway returned ${status}: Inactivity Timeout. The upstream connection was idle too long before sending data.`;\n }\n if (looksHtml) {\n return `Builder gateway returned ${status}: ${readable.slice(0, 240)}`;\n }\n return readable;\n}\n\nfunction htmlToText(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(p|div|h1|h2|h3|li|tr)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/&nbsp;/gi, \" \")\n .replace(/&lt;/gi, \"<\")\n .replace(/&gt;/gi, \">\")\n .replace(/&amp;/gi, \"&\")\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n\\s+/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nexport function createBuilderEngine(\n _config: Record<string, unknown> = {},\n): AgentEngine {\n return new BuilderEngine();\n}\n\nfunction resolveMaxBuilderGatewayTimeoutMs(): number {\n if (isInBackgroundFunctionRuntime()) {\n return MAX_BACKGROUND_BUILDER_GATEWAY_TIMEOUT_MS;\n }\n\n if (!isHostedBuilderRuntime()) {\n return MAX_LOCAL_BUILDER_GATEWAY_TIMEOUT_MS;\n }\n\n try {\n const base = getBuilderGatewayBaseUrl();\n if (/^https?:\\/\\/(localhost|127\\.0\\.0\\.1)([:/]|$)/i.test(base)) {\n return MAX_LOCAL_BUILDER_GATEWAY_TIMEOUT_MS;\n }\n } catch {\n // ignore malformed override\n }\n return MAX_HOSTED_FOREGROUND_BUILDER_GATEWAY_TIMEOUT_MS;\n}\n\nfunction isHostedBuilderRuntime(): boolean {\n if (\n process.env.NETLIFY &&\n process.env.NETLIFY !== \"false\" &&\n process.env.NETLIFY_LOCAL !== \"true\"\n ) {\n return true;\n }\n if (\n process.env.AWS_LAMBDA_FUNCTION_NAME &&\n process.env.NETLIFY_LOCAL !== \"true\"\n ) {\n return true;\n }\n return Boolean(\n process.env.CF_PAGES ||\n process.env.VERCEL ||\n process.env.VERCEL_ENV ||\n process.env.RENDER ||\n process.env.FLY_APP_NAME ||\n process.env.K_SERVICE,\n );\n}\n\nfunction getBuilderGatewayTimeoutMs(): number {\n const raw = process.env.AGENT_NATIVE_BUILDER_GATEWAY_TIMEOUT_MS;\n const maxMs = resolveMaxBuilderGatewayTimeoutMs();\n if (!raw) return maxMs;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return maxMs;\n }\n return Math.min(parsed, maxMs);\n}\n\nfunction createGatewayAbortSignal(\n parentSignal: AbortSignal,\n timeoutMs: number,\n): {\n signal: AbortSignal;\n didTimeout: () => boolean;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n let timedOut = false;\n\n const abortFromParent = () => {\n if (!controller.signal.aborted) {\n controller.abort(parentSignal.reason);\n }\n };\n\n const timeout = setTimeout(() => {\n timedOut = true;\n if (!controller.signal.aborted) {\n controller.abort(new Error(\"Builder gateway request timed out\"));\n }\n }, timeoutMs);\n\n if (parentSignal.aborted) abortFromParent();\n parentSignal.addEventListener(\"abort\", abortFromParent, { once: true });\n\n return {\n signal: controller.signal,\n didTimeout: () => timedOut,\n cleanup: () => {\n clearTimeout(timeout);\n parentSignal.removeEventListener(\"abort\", abortFromParent);\n },\n };\n}\n\nfunction isBuilderCredentialAuthError(message: string): boolean {\n const lowerMessage = message.toLowerCase();\n const referencesAccessToken =\n lowerMessage.includes(\"personal access token\") ||\n lowerMessage.includes(\"access token\");\n const rejectedToken =\n lowerMessage.includes(\"invalid\") ||\n lowerMessage.includes(\"inactive\") ||\n lowerMessage.includes(\"expired\") ||\n lowerMessage.includes(\"revoked\");\n return (\n lowerMessage.includes(\"unauthorized\") ||\n lowerMessage.includes(\"private key\") ||\n lowerMessage.includes(\"invalid token\") ||\n lowerMessage.includes(\"invalid_token\") ||\n lowerMessage.includes(\"token invalid\") ||\n (referencesAccessToken && rejectedToken)\n );\n}\n\nfunction normalizeBuilderGatewayFetchError(\n err: unknown,\n timedOut: boolean,\n timeoutMs: number,\n): string {\n if (timedOut) {\n return `Builder gateway timed out after ${formatTimeoutMs(\n timeoutMs,\n )} before the hosting function limit. Please retry; if this keeps happening, reduce the prompt size or try again when the gateway is less busy.`;\n }\n const message = errorMessage(err);\n if (isBuilderGatewayNetworkError(err)) {\n return `Builder gateway network error: ${message}`;\n }\n return message;\n}\n\nfunction createBuilderGatewayTimeoutStop(\n err: unknown,\n timedOut: boolean,\n timeoutMs: number,\n): EngineEvent {\n const networkError = !timedOut && isBuilderGatewayNetworkError(err);\n return {\n type: \"stop\",\n reason: \"error\",\n error: normalizeBuilderGatewayFetchError(err, timedOut, timeoutMs),\n ...(timedOut\n ? { errorCode: \"builder_gateway_timeout\" }\n : networkError\n ? { errorCode: BUILDER_GATEWAY_NETWORK_ERROR_CODE }\n : {}),\n };\n}\n\nfunction formatTimeoutMs(timeoutMs: number): string {\n if (timeoutMs < 1000) return `${timeoutMs}ms`;\n return `${Math.round(timeoutMs / 1000)}s`;\n}\n\nfunction errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction errorSearchText(err: unknown): string {\n const parts: string[] = [];\n if (err instanceof Error) {\n parts.push(err.name, err.message);\n const maybe = err as Error & {\n code?: unknown;\n cause?: unknown;\n };\n if (typeof maybe.code === \"string\") parts.push(maybe.code);\n if (maybe.cause) parts.push(errorSearchText(maybe.cause));\n } else {\n parts.push(String(err));\n }\n return parts.join(\" \").toLowerCase();\n}\n\nfunction isBuilderGatewayNetworkError(err: unknown): boolean {\n const text = errorSearchText(err);\n return (\n text.includes(\"socket hang up\") ||\n text.includes(\"econnreset\") ||\n text.includes(\"enetreset\") ||\n text.includes(\"econnaborted\") ||\n text.includes(\"fetch failed\") ||\n text.includes(\"network error\") ||\n // Anthropic SDK's APIConnectionError default (\"Connection error.\") is\n // often forwarded by the Builder gateway as a stop event with no code.\n text.includes(\"connection error\") ||\n text.includes(\"connection reset\") ||\n text.includes(\"connection closed\") ||\n text.includes(\"stream closed\") ||\n text.includes(\"terminated\")\n );\n}\n\nfunction isProviderConnectionErrorMessage(message: string): boolean {\n return message.trim().toLowerCase() === \"connection error.\";\n}\n\nfunction captureBuilderGatewayTransportError(\n err: unknown,\n context: {\n phase: \"request\" | \"stream\";\n model: string;\n gatewayUrl?: URL;\n timeoutMs: number;\n timedOut: boolean;\n elapsedMs?: number;\n },\n): void {\n captureError(err, {\n route: \"/_agent-native/agent-chat\",\n tags: {\n source: \"builder-engine\",\n phase: context.phase,\n model: context.model,\n timedOut: context.timedOut ? \"true\" : \"false\",\n errorCode: context.timedOut\n ? \"builder_gateway_timeout\"\n : BUILDER_GATEWAY_NETWORK_ERROR_CODE,\n },\n extra: {\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n timeoutMs: context.timeoutMs,\n elapsedMs: context.elapsedMs,\n },\n contexts: {\n builderGateway: {\n phase: context.phase,\n model: context.model,\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n timeoutMs: context.timeoutMs,\n timedOut: context.timedOut,\n elapsedMs: context.elapsedMs,\n },\n },\n });\n}\n\n/**\n * Capture a Builder-gateway no-detail stop event to Sentry with the request\n * context the run-manager doesn't have. The gateway emits\n * `{type:\"stop\",reason:\"error\",requestId:\"...\"}` with no diagnostic — the\n * only way to debug it is from the gateway side, so we surface model,\n * gatewayOrigin, and requestId as searchable tags.\n */\nfunction captureBuilderGatewayNoDetailError(context: {\n requestId?: string;\n model: string;\n gatewayUrl?: URL;\n rawEvent: unknown;\n}): void {\n const err = new Error(\n context.requestId\n ? `Builder gateway stop reason=error with no detail (requestId=${context.requestId})`\n : \"Builder gateway stop reason=error with no detail\",\n );\n err.name = \"BuilderGatewayNoDetailError\";\n captureError(err, {\n route: \"/_agent-native/agent-chat\",\n tags: {\n source: \"builder-engine\",\n phase: \"stream\",\n model: context.model,\n errorCode: \"builder_gateway_error\",\n ...(context.requestId ? { gatewayRequestId: context.requestId } : {}),\n },\n extra: {\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n rawEvent: context.rawEvent,\n },\n contexts: {\n builderGateway: {\n phase: \"stream\",\n model: context.model,\n gatewayOrigin: context.gatewayUrl?.origin,\n gatewayPath: context.gatewayUrl?.pathname,\n requestId: context.requestId,\n errorCode: \"builder_gateway_error\",\n },\n },\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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"}
@@ -77,16 +77,61 @@ export function isAgentEnginePackageInstalled(entry) {
77
77
  .filter((name) => Boolean(name)) ?? [];
78
78
  return packageNames.every(canResolvePackage);
79
79
  }
80
+ function parseVersionedModelId(model) {
81
+ const match = /^(?<family>.+?)[-.](?<version>\d+(?:[-.]\d+)*)(?<suffix>(?:[-.][a-z][a-z0-9]*)*)$/i.exec(model.trim().toLowerCase());
82
+ const groups = match?.groups;
83
+ if (!groups?.family || !groups.version)
84
+ return null;
85
+ const version = groups.version.split(/[-.]/).map((part) => Number(part));
86
+ if (version.some((part) => !Number.isSafeInteger(part)))
87
+ return null;
88
+ return {
89
+ family: groups.family,
90
+ version,
91
+ suffix: groups.suffix ?? "",
92
+ };
93
+ }
94
+ function compareModelVersions(left, right) {
95
+ const length = Math.max(left.length, right.length);
96
+ for (let index = 0; index < length; index += 1) {
97
+ const delta = (left[index] ?? 0) - (right[index] ?? 0);
98
+ if (delta !== 0)
99
+ return delta;
100
+ }
101
+ return 0;
102
+ }
103
+ function findLatestSupportedVersionMatch(candidate, supportedModels) {
104
+ const parsedCandidate = parseVersionedModelId(candidate);
105
+ if (!parsedCandidate)
106
+ return undefined;
107
+ let best;
108
+ for (const supportedModel of supportedModels) {
109
+ const parsedSupported = parseVersionedModelId(supportedModel);
110
+ if (!parsedSupported)
111
+ continue;
112
+ if (parsedSupported.family !== parsedCandidate.family)
113
+ continue;
114
+ if (parsedSupported.suffix !== parsedCandidate.suffix)
115
+ continue;
116
+ if (best &&
117
+ compareModelVersions(parsedSupported.version, best.version) <= 0) {
118
+ continue;
119
+ }
120
+ best = { model: supportedModel, version: parsedSupported.version };
121
+ }
122
+ return best?.model;
123
+ }
80
124
  export function normalizeModelForEngine(engine, model) {
81
125
  const candidate = typeof model === "string" ? model.trim() : "";
82
126
  if (!candidate)
83
127
  return engine.defaultModel;
84
- if (engine.name !== "builder")
128
+ if (engine.supportedModels.length === 0)
85
129
  return candidate;
86
130
  if (candidate === "auto" || engine.supportedModels.includes(candidate)) {
87
131
  return candidate;
88
132
  }
89
- return engine.supportedModels.includes("auto") ? "auto" : engine.defaultModel;
133
+ return (findLatestSupportedVersionMatch(candidate, engine.supportedModels) ??
134
+ engine.defaultModel);
90
135
  }
91
136
  function assertAgentEnginePackageInstalled(entry) {
92
137
  if (isAgentEnginePackageInstalled(entry))
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Engine Registry.\n *\n * Mirrors the CLI_REGISTRY pattern (packages/core/src/terminal/cli-registry.ts)\n * but is open — anyone can register a custom engine via registerAgentEngine()\n * from a server plugin at startup.\n *\n * Built-in engines (anthropic, ai-sdk) are auto-registered by builtin.ts.\n */\n\nimport { createRequire } from \"node:module\";\n\nimport {\n canUseDeployCredentialFallbackForRequest,\n getProviderCredentialAuthFailure,\n readDeployCredentialEnv,\n resolveBuilderCredentials,\n resolveSecret,\n} from \"../../server/credential-provider.js\";\nimport { getSetting } from \"../../settings/store.js\";\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../app-model-defaults.js\";\nimport {\n normalizeOpenAiBaseUrl,\n OPENAI_BASE_URL_ENV_VAR,\n} from \"./openai-compatible-endpoint.js\";\nimport type { AgentEngine, EngineCapabilities } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport interface AgentEngineEntry {\n /** Unique name, e.g. \"anthropic\", \"ai-sdk:anthropic\", \"ai-sdk:openai\" */\n name: string;\n /** Human-readable label for UI */\n label: string;\n /** Short description for engine picker */\n description: string;\n /** npm package hint displayed in UI when package is missing */\n installPackage?: string;\n /** Engine capabilities */\n capabilities: EngineCapabilities;\n /** Default model string */\n defaultModel: string;\n /** All supported models (shown in model picker) */\n supportedModels: readonly string[];\n /** Environment variables required for this engine to work */\n requiredEnvVars: string[];\n /** Create an engine instance from config */\n create(config: Record<string, unknown>): AgentEngine;\n}\n\nconst _registry = new Map<string, AgentEngineEntry>();\nconst _packageAvailabilityCache = new Map<string, boolean>();\n\n/**\n * Register a custom agent engine. Called at server startup (e.g., from a\n * server plugin or builtin.ts). Throws if name is already registered.\n */\nexport function registerAgentEngine(entry: AgentEngineEntry): void {\n if (_registry.has(entry.name)) {\n // Allow re-registration in tests / hot-reload — just overwrite\n if (process.env.NODE_ENV === \"test\") {\n _registry.set(entry.name, entry);\n return;\n }\n console.warn(\n `[agent-engine] Engine \"${entry.name}\" is already registered. Skipping.`,\n );\n return;\n }\n _registry.set(entry.name, entry);\n}\n\n/** Get a registered engine entry by name, or undefined if not found */\nexport function getAgentEngineEntry(\n name: string,\n): AgentEngineEntry | undefined {\n return _registry.get(name);\n}\n\n/** List all registered engine entries */\nexport function listAgentEngines(): AgentEngineEntry[] {\n return Array.from(_registry.values());\n}\n\nfunction packageNameFromInstallSpecifier(specifier: string): string | null {\n const trimmed = specifier.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith(\"-\")) return null;\n if (trimmed.startsWith(\"@\")) {\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex === -1) return trimmed;\n const versionIndex = trimmed.indexOf(\"@\", slashIndex + 1);\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n }\n const versionIndex = trimmed.indexOf(\"@\");\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n}\n\nfunction canResolvePackage(packageName: string): boolean {\n const cached = _packageAvailabilityCache.get(packageName);\n if (cached !== undefined) return cached;\n let available = false;\n try {\n require.resolve(packageName);\n available = true;\n } catch {\n available = false;\n }\n _packageAvailabilityCache.set(packageName, available);\n return available;\n}\n\nexport function isAgentEnginePackageInstalled(\n entry: AgentEngineEntry,\n): boolean {\n const packageNames =\n entry.installPackage\n ?.split(/\\s+/)\n .map(packageNameFromInstallSpecifier)\n .filter((name): name is string => Boolean(name)) ?? [];\n return packageNames.every(canResolvePackage);\n}\n\nexport function normalizeModelForEngine(\n engine: Pick<AgentEngine, \"name\" | \"defaultModel\" | \"supportedModels\">,\n model: string | null | undefined,\n): string {\n const candidate = typeof model === \"string\" ? model.trim() : \"\";\n if (!candidate) return engine.defaultModel;\n\n if (engine.name !== \"builder\") return candidate;\n\n if (candidate === \"auto\" || engine.supportedModels.includes(candidate)) {\n return candidate;\n }\n\n return engine.supportedModels.includes(\"auto\") ? \"auto\" : engine.defaultModel;\n}\n\nfunction assertAgentEnginePackageInstalled(entry: AgentEngineEntry): void {\n if (isAgentEnginePackageInstalled(entry)) return;\n const installHint = entry.installPackage\n ? ` Run: pnpm add ${entry.installPackage}`\n : \"\";\n throw new Error(\n `[agent-engine] Engine \"${entry.name}\" requires optional packages that are not installed in this app.${installHint}`,\n );\n}\n\n/**\n * First registered engine whose requiredEnvVars are all set. Registration\n * order controls priority — the Builder gateway is registered first so it\n * wins when the Builder private key is present.\n *\n * Escape hatch: AGENT_ENGINE_PREFER_BYO_KEY=true skips the Builder engine\n * on the first pass, so an explicit provider key (ANTHROPIC_API_KEY etc.)\n * is picked instead. Builder is still used as the fallback when no other\n * provider key is set.\n *\n * This sync helper is for CLI/status callers that cannot await settings. Prefer\n * {@link detectEngineFromEnvForRequest} at request time so sticky auth-failure\n * markers can skip rejected deploy keys.\n */\nexport function detectEngineFromEnv(): AgentEngineEntry | null {\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (entry.requiredEnvVars.length === 0) continue;\n if (!isAgentEnginePackageInstalled(entry)) continue;\n if (\n entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n )\n ) {\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (entry.requiredEnvVars.length === 0) continue;\n if (!isAgentEnginePackageInstalled(entry)) continue;\n if (\n entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n )\n ) {\n return entry;\n }\n }\n return null;\n}\n\nasync function envKeyUsableForEntry(\n entry: AgentEngineEntry,\n key: string,\n): Promise<boolean> {\n if (\n !(\n canUseDeployCredentialFallbackForRequest(key) &&\n !!readDeployCredentialEnv(key)\n )\n ) {\n return false;\n }\n if (entry.name === \"builder\") {\n return true;\n }\n const value = readDeployCredentialEnv(key);\n if (!value) return false;\n return !(await getProviderCredentialAuthFailure({ key, value }));\n}\n\nasync function hasUsableEnvKeys(entry: AgentEngineEntry): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return false;\n for (const key of entry.requiredEnvVars) {\n if (!(await envKeyUsableForEntry(entry, key))) return false;\n }\n return true;\n}\n\n/**\n * Request-aware env auto-detect. Same priority as {@link detectEngineFromEnv},\n * but skips provider keys that currently have an auth-failure marker so a\n * rejected deploy key does not permanently win selection and leave chat stuck\n * on `missing_credentials`.\n */\nexport async function detectEngineFromEnvForRequest(): Promise<AgentEngineEntry | null> {\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasUsableEnvKeys(entry)) return entry;\n }\n }\n\n for (const entry of _registry.values()) {\n if (await hasUsableEnvKeys(entry)) return entry;\n }\n return null;\n}\n\nfunction shouldTraceEngineDetection(): boolean {\n return /^(1|true)$/i.test(\n process.env.AGENT_NATIVE_DEBUG_AGENT_ENGINE_DETECT ??\n process.env.AGENT_NATIVE_DEBUG_CREDENTIAL_RESOLVE ??\n \"\",\n );\n}\n\n/**\n * Detect a usable engine from the current request user's accessible\n * `app_secrets` rows. Mirrors `detectEngineFromEnv` but consults the\n * encrypted secret store instead of `process.env`, including org-scoped\n * credentials shared with the active organization.\n *\n * Required because the Builder OAuth callback (and the settings UI's\n * \"paste your own key\" flow) writes credentials to app_secrets, not env.\n * Without this check, a user who connected Builder would see status\n * \"configured\" but the next chat turn would fall through to the default\n * Anthropic engine and hit `missing_api_key` — exactly Brent's symptom\n * on the docs site (Loom 2026-04-28: \"It doesn't seem to realize I'm\n * connected once I do a chat\").\n *\n * Includes the local dev session (`local@localhost`): the Builder\n * OAuth flow writes credentials scoped to that email when run from\n * `pnpm dev`, so detection has to consult those rows or the dev user\n * sees the same \"Connect your AI\" card after they've already connected\n * (Sami, 2026-04-30). Org-scoped Builder credentials must also count here:\n * `/builder/status` resolves them via the same request org context, and the\n * chat engine picker must not disagree with that card.\n */\nexport async function detectEngineFromUserSecrets(): Promise<AgentEngineEntry | null> {\n const traceLookup = shouldTraceEngineDetection();\n let email: string | undefined;\n let orgId: string | null | undefined;\n try {\n const { getRequestUserEmail, getRequestOrgId } =\n await import(\"../../server/request-context.js\");\n email = getRequestUserEmail();\n orgId = getRequestOrgId();\n } catch {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-request-context email=(unknown) orgId=(unknown)`,\n );\n }\n return null;\n }\n if (!email) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-email email=(empty) orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n }\n\n const hasAllKeys = async (entry: AgentEngineEntry): Promise<boolean> => {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return false;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (!(await resolveUsableProviderSecret(key))) return false;\n } catch {\n return false;\n }\n }\n return true;\n };\n\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"} byo=true`,\n );\n }\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return entry;\n }\n }\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-engine-keys-found email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n}\n\n/**\n * Legacy inline API keys on the global `agent-engine` settings row are\n * intentionally ignored. That row is deployment-wide, so treating\n * `{ apiKey }` or `{ config: { apiKey } }` as configured would let one\n * user's pasted key power every other user. Per-user keys live in\n * `app_secrets` and are resolved separately.\n */\nexport function isAgentEngineSettingConfigured(stored: unknown): boolean {\n if (!stored || typeof stored !== \"object\") return false;\n const s = stored as {\n engine?: unknown;\n };\n if (typeof s.engine !== \"string\" || !s.engine) return false;\n return false;\n}\n\nfunction stripInlineApiKeyConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!config) return {};\n const { apiKey: _discardedApiKey, ...safeConfig } = config;\n return safeConfig;\n}\n\nfunction canUseDeployEnvForEntry(entry: AgentEngineEntry): boolean {\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every((key) =>\n canUseDeployCredentialFallbackForRequest(key),\n );\n}\n\nfunction engineCreateConfig(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n apiKey,\n allowEnvFallback: canUseDeployEnvForEntry(entry),\n ...(extra ?? {}),\n };\n}\n\nasync function resolveOpenAiBaseUrl(): Promise<string | undefined> {\n let raw: string | null | undefined = null;\n try {\n raw = await resolveSecret(OPENAI_BASE_URL_ENV_VAR);\n } catch {\n raw = null;\n }\n\n if (\n !raw &&\n canUseDeployCredentialFallbackForRequest(OPENAI_BASE_URL_ENV_VAR)\n ) {\n raw = readDeployCredentialEnv(OPENAI_BASE_URL_ENV_VAR);\n }\n\n return raw ? normalizeOpenAiBaseUrl(raw) : undefined;\n}\n\nasync function resolveUsableProviderSecret(\n key: string,\n): Promise<string | null> {\n const value = await resolveSecret(key);\n if (!value) return null;\n const authFailure = await getProviderCredentialAuthFailure({ key, value });\n return authFailure ? null : value;\n}\n\nasync function engineCreateConfigForEntry(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const safeExtra = { ...(extra ?? {}) };\n if (entry.name === \"ai-sdk:openai\") {\n if (typeof safeExtra.baseURL === \"string\" && safeExtra.baseUrl == null) {\n safeExtra.baseUrl = normalizeOpenAiBaseUrl(safeExtra.baseURL);\n }\n if (safeExtra.baseUrl == null) {\n const baseUrl = await resolveOpenAiBaseUrl();\n if (baseUrl) safeExtra.baseUrl = baseUrl;\n }\n }\n return engineCreateConfig(entry, apiKey, safeExtra);\n}\n\n/**\n * True when the stored `agent-engine` row points at a registered engine\n * AND an API key for it is reachable via the engine's required env vars.\n * Inline keys on the global settings row are ignored; see\n * `isAgentEngineSettingConfigured`.\n *\n * Sync helper for CLI/status. Prefer {@link isStoredEngineUsableForRequest}\n * so sticky auth-failure markers are respected.\n */\nexport function isStoredEngineUsable(\n stored: unknown,\n entry: AgentEngineEntry,\n): boolean {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n );\n}\n\n/**\n * Request-aware version of `isStoredEngineUsable`.\n *\n * The settings row stores the selected engine/model, while credentials may\n * live in per-user/org `app_secrets`. The sync helper intentionally only sees\n * deploy env vars; this async helper is what request-time routes should use\n * when deciding whether a stored engine can actually run for the current user.\n */\nexport async function isStoredEngineUsableForRequest(\n stored: unknown,\n entry: AgentEngineEntry,\n): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\n/**\n * Request-aware credential preflight for an already-resolved engine instance.\n * `resolveEngine()` may still return a default or explicitly requested engine\n * object before credentials are actually usable; call this before starting a\n * user-visible run so missing providers fail immediately.\n */\nexport async function isResolvedEngineUsableForRequest(\n engine: AgentEngine,\n options: { apiKey?: string } = {},\n): Promise<boolean> {\n const entry = _registry.get(engine.name);\n // Custom engines may have their own credential contract outside the core\n // registry metadata, so do not block them speculatively.\n if (!entry) return true;\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return true;\n\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n\n if (options.apiKey?.trim()) {\n const key = entry.requiredEnvVars[0];\n if (!key) return true;\n return !(await getProviderCredentialAuthFailure({\n key,\n value: options.apiKey,\n }));\n }\n\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\nexport interface ResolveEngineConfig {\n /** Explicit engine name or instance from createAgentChatPlugin options */\n engineOption?:\n | string\n | AgentEngine\n | { name: string; config: Record<string, unknown> };\n /** API key (used as config for the resolved engine) */\n apiKey?: string;\n /** Model override (used as part of engine config) */\n model?: string;\n /** App/template id used for org-scoped per-app model defaults. */\n appId?: string;\n}\n\n/**\n * Resolve an AgentEngine from options → explicit env → app default →\n * settings → request credentials → env → default.\n *\n * Resolution order:\n * 1. Explicit `engineOption` from plugin options (string name, instance, or {name, config})\n * 2. Env var AGENT_ENGINE\n * 3. Org/user app-template default, when usable\n * 4. Settings store key \"agent-engine\" → { engine: string }, when usable\n * 5. Current request's app_secrets; Builder wins by default when connected\n * 6. Auto-detect deployment env credentials\n * 7. Default \"anthropic\" (requires ANTHROPIC_API_KEY)\n */\nexport async function resolveEngine(\n config: ResolveEngineConfig,\n): Promise<AgentEngine> {\n const { engineOption, apiKey, model: _model, appId } = config;\n\n // 1. Explicit instance passed directly\n if (\n engineOption &&\n typeof engineOption === \"object\" &&\n \"stream\" in engineOption\n ) {\n return engineOption as AgentEngine;\n }\n\n // 2. Explicit {name, config} object\n if (\n engineOption &&\n typeof engineOption === \"object\" &&\n \"name\" in engineOption\n ) {\n const { name, config: engineConfig } = engineOption as {\n name: string;\n config: Record<string, unknown>;\n };\n const entry = _registry.get(name);\n if (!entry)\n throw new Error(\n `[agent-engine] Unknown engine: \"${name}\". Registered: ${[..._registry.keys()].join(\", \")}`,\n );\n assertAgentEnginePackageInstalled(entry);\n return entry.create(\n await engineCreateConfigForEntry(entry, apiKey, engineConfig),\n );\n }\n\n // 3. Explicit string name from options\n if (typeof engineOption === \"string\") {\n const entry = _registry.get(engineOption);\n if (!entry)\n throw new Error(\n `[agent-engine] Unknown engine: \"${engineOption}\". Registered: ${[..._registry.keys()].join(\", \")}`,\n );\n assertAgentEnginePackageInstalled(entry);\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n\n // 4. Env var — explicit engine name override\n const envEngine = process.env.AGENT_ENGINE;\n if (envEngine) {\n const entry = _registry.get(envEngine);\n if (entry) {\n assertAgentEnginePackageInstalled(entry);\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(appId);\n if (appDefault?.engine) {\n const entry = _registry.get(appDefault.engine);\n if (entry && (await isStoredEngineUsableForRequest(appDefault, entry))) {\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n let stored: { engine?: unknown; config?: unknown } | null = null;\n try {\n stored = (await getSetting(\"agent-engine\")) as typeof stored;\n } catch {\n // Settings not available — fall through\n }\n\n // Auto-detect from the current user's per-user `app_secrets` rows\n // (Builder OAuth callback + \"paste your own key\" settings flow write here,\n // not env). Stored/app defaults are checked first so an explicit provider\n // selection can override a connected Builder account.\n const detectedFromUser = await detectEngineFromUserSecrets();\n\n // 6. Settings store — only when the stored row's API key is reachable.\n // This explicit selection beats automatic Builder detection so users can\n // switch away from Builder credits by saving/applying their own provider key.\n const storedRaw = stored as { engine?: unknown; config?: unknown } | null;\n const storedEngine = storedRaw?.engine;\n const storedConfig = storedRaw?.config;\n if (storedRaw && typeof storedEngine === \"string\") {\n const entry = _registry.get(storedEngine);\n if (entry && (await isStoredEngineUsableForRequest(storedRaw, entry))) {\n return entry.create(\n await engineCreateConfigForEntry(\n entry,\n apiKey,\n stripInlineApiKeyConfig(\n storedConfig as Record<string, unknown> | undefined,\n ),\n ),\n );\n }\n }\n\n if (detectedFromUser) {\n return detectedFromUser.create(\n await engineCreateConfigForEntry(detectedFromUser, apiKey),\n );\n }\n\n // 8. Auto-detect from any provider env var — so just dropping a key in\n // .env works without also setting AGENT_ENGINE. Skip keys with active\n // auth-failure markers so a rejected deploy key cannot permanently win.\n const detected = await detectEngineFromEnvForRequest();\n if (detected) {\n return detected.create(await engineCreateConfigForEntry(detected, apiKey));\n }\n\n // 9. Default: anthropic\n const anthropicEntry = _registry.get(\"anthropic\");\n if (!anthropicEntry) {\n throw new Error(\n \"[agent-engine] Default Anthropic engine is not registered. Did builtin.ts fail to load?\",\n );\n }\n return anthropicEntry.create(\n await engineCreateConfigForEntry(anthropicEntry, apiKey),\n );\n}\n\n/**\n * Read the user-selected model for an engine from the `agent-engine` setting.\n *\n * The settings UI writes `{engine, model}` via the `manage-agent-engine` action=\"set\",\n * but `resolveEngine` only uses the stored engine (the model is a separate\n * per-request concern). Call this helper alongside `resolveEngine` to honor\n * the user's model choice without requiring a process restart.\n *\n * Returns the stored model only when the stored engine name matches `engine`\n * — otherwise returns `undefined` to avoid applying an Anthropic model string\n * to, say, an OpenRouter engine.\n */\nexport async function getStoredModelForEngine(\n engine: AgentEngine | string,\n options: { appId?: string } = {},\n): Promise<string | undefined> {\n const engineName = typeof engine === \"string\" ? engine : engine.name;\n try {\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(\n options.appId,\n );\n if (\n appDefault?.engine === engineName &&\n typeof appDefault.model === \"string\" &&\n appDefault.model.length > 0\n ) {\n return appDefault.model;\n }\n } catch {\n // Settings/request context may not be available — fall through.\n }\n\n try {\n const stored = await getSetting(\"agent-engine\");\n if (\n stored &&\n typeof stored.engine === \"string\" &&\n stored.engine === engineName &&\n typeof stored.model === \"string\" &&\n stored.model.length > 0\n ) {\n return stored.model;\n }\n } catch {\n // Settings store not ready (fresh install, migration pending) — skip.\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Engine Registry.\n *\n * Mirrors the CLI_REGISTRY pattern (packages/core/src/terminal/cli-registry.ts)\n * but is open — anyone can register a custom engine via registerAgentEngine()\n * from a server plugin at startup.\n *\n * Built-in engines (anthropic, ai-sdk) are auto-registered by builtin.ts.\n */\n\nimport { createRequire } from \"node:module\";\n\nimport {\n canUseDeployCredentialFallbackForRequest,\n getProviderCredentialAuthFailure,\n readDeployCredentialEnv,\n resolveBuilderCredentials,\n resolveSecret,\n} from \"../../server/credential-provider.js\";\nimport { getSetting } from \"../../settings/store.js\";\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../app-model-defaults.js\";\nimport {\n normalizeOpenAiBaseUrl,\n OPENAI_BASE_URL_ENV_VAR,\n} from \"./openai-compatible-endpoint.js\";\nimport type { AgentEngine, EngineCapabilities } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport interface AgentEngineEntry {\n /** Unique name, e.g. \"anthropic\", \"ai-sdk:anthropic\", \"ai-sdk:openai\" */\n name: string;\n /** Human-readable label for UI */\n label: string;\n /** Short description for engine picker */\n description: string;\n /** npm package hint displayed in UI when package is missing */\n installPackage?: string;\n /** Engine capabilities */\n capabilities: EngineCapabilities;\n /** Default model string */\n defaultModel: string;\n /** All supported models (shown in model picker) */\n supportedModels: readonly string[];\n /** Environment variables required for this engine to work */\n requiredEnvVars: string[];\n /** Create an engine instance from config */\n create(config: Record<string, unknown>): AgentEngine;\n}\n\nconst _registry = new Map<string, AgentEngineEntry>();\nconst _packageAvailabilityCache = new Map<string, boolean>();\n\n/**\n * Register a custom agent engine. Called at server startup (e.g., from a\n * server plugin or builtin.ts). Throws if name is already registered.\n */\nexport function registerAgentEngine(entry: AgentEngineEntry): void {\n if (_registry.has(entry.name)) {\n // Allow re-registration in tests / hot-reload — just overwrite\n if (process.env.NODE_ENV === \"test\") {\n _registry.set(entry.name, entry);\n return;\n }\n console.warn(\n `[agent-engine] Engine \"${entry.name}\" is already registered. Skipping.`,\n );\n return;\n }\n _registry.set(entry.name, entry);\n}\n\n/** Get a registered engine entry by name, or undefined if not found */\nexport function getAgentEngineEntry(\n name: string,\n): AgentEngineEntry | undefined {\n return _registry.get(name);\n}\n\n/** List all registered engine entries */\nexport function listAgentEngines(): AgentEngineEntry[] {\n return Array.from(_registry.values());\n}\n\nfunction packageNameFromInstallSpecifier(specifier: string): string | null {\n const trimmed = specifier.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith(\"-\")) return null;\n if (trimmed.startsWith(\"@\")) {\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex === -1) return trimmed;\n const versionIndex = trimmed.indexOf(\"@\", slashIndex + 1);\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n }\n const versionIndex = trimmed.indexOf(\"@\");\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n}\n\nfunction canResolvePackage(packageName: string): boolean {\n const cached = _packageAvailabilityCache.get(packageName);\n if (cached !== undefined) return cached;\n let available = false;\n try {\n require.resolve(packageName);\n available = true;\n } catch {\n available = false;\n }\n _packageAvailabilityCache.set(packageName, available);\n return available;\n}\n\nexport function isAgentEnginePackageInstalled(\n entry: AgentEngineEntry,\n): boolean {\n const packageNames =\n entry.installPackage\n ?.split(/\\s+/)\n .map(packageNameFromInstallSpecifier)\n .filter((name): name is string => Boolean(name)) ?? [];\n return packageNames.every(canResolvePackage);\n}\n\ninterface ParsedVersionedModelId {\n family: string;\n version: number[];\n suffix: string;\n}\n\nfunction parseVersionedModelId(model: string): ParsedVersionedModelId | null {\n const match =\n /^(?<family>.+?)[-.](?<version>\\d+(?:[-.]\\d+)*)(?<suffix>(?:[-.][a-z][a-z0-9]*)*)$/i.exec(\n model.trim().toLowerCase(),\n );\n const groups = match?.groups;\n if (!groups?.family || !groups.version) return null;\n\n const version = groups.version.split(/[-.]/).map((part) => Number(part));\n if (version.some((part) => !Number.isSafeInteger(part))) return null;\n\n return {\n family: groups.family,\n version,\n suffix: groups.suffix ?? \"\",\n };\n}\n\nfunction compareModelVersions(left: number[], right: number[]): number {\n const length = Math.max(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const delta = (left[index] ?? 0) - (right[index] ?? 0);\n if (delta !== 0) return delta;\n }\n return 0;\n}\n\nfunction findLatestSupportedVersionMatch(\n candidate: string,\n supportedModels: readonly string[],\n): string | undefined {\n const parsedCandidate = parseVersionedModelId(candidate);\n if (!parsedCandidate) return undefined;\n\n let best: { model: string; version: number[] } | undefined;\n for (const supportedModel of supportedModels) {\n const parsedSupported = parseVersionedModelId(supportedModel);\n if (!parsedSupported) continue;\n if (parsedSupported.family !== parsedCandidate.family) continue;\n if (parsedSupported.suffix !== parsedCandidate.suffix) continue;\n if (\n best &&\n compareModelVersions(parsedSupported.version, best.version) <= 0\n ) {\n continue;\n }\n best = { model: supportedModel, version: parsedSupported.version };\n }\n\n return best?.model;\n}\n\nexport function normalizeModelForEngine(\n engine: Pick<AgentEngine, \"name\" | \"defaultModel\" | \"supportedModels\">,\n model: string | null | undefined,\n): string {\n const candidate = typeof model === \"string\" ? model.trim() : \"\";\n if (!candidate) return engine.defaultModel;\n\n if (engine.supportedModels.length === 0) return candidate;\n\n if (candidate === \"auto\" || engine.supportedModels.includes(candidate)) {\n return candidate;\n }\n\n return (\n findLatestSupportedVersionMatch(candidate, engine.supportedModels) ??\n engine.defaultModel\n );\n}\n\nfunction assertAgentEnginePackageInstalled(entry: AgentEngineEntry): void {\n if (isAgentEnginePackageInstalled(entry)) return;\n const installHint = entry.installPackage\n ? ` Run: pnpm add ${entry.installPackage}`\n : \"\";\n throw new Error(\n `[agent-engine] Engine \"${entry.name}\" requires optional packages that are not installed in this app.${installHint}`,\n );\n}\n\n/**\n * First registered engine whose requiredEnvVars are all set. Registration\n * order controls priority — the Builder gateway is registered first so it\n * wins when the Builder private key is present.\n *\n * Escape hatch: AGENT_ENGINE_PREFER_BYO_KEY=true skips the Builder engine\n * on the first pass, so an explicit provider key (ANTHROPIC_API_KEY etc.)\n * is picked instead. Builder is still used as the fallback when no other\n * provider key is set.\n *\n * This sync helper is for CLI/status callers that cannot await settings. Prefer\n * {@link detectEngineFromEnvForRequest} at request time so sticky auth-failure\n * markers can skip rejected deploy keys.\n */\nexport function detectEngineFromEnv(): AgentEngineEntry | null {\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (entry.requiredEnvVars.length === 0) continue;\n if (!isAgentEnginePackageInstalled(entry)) continue;\n if (\n entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n )\n ) {\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (entry.requiredEnvVars.length === 0) continue;\n if (!isAgentEnginePackageInstalled(entry)) continue;\n if (\n entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n )\n ) {\n return entry;\n }\n }\n return null;\n}\n\nasync function envKeyUsableForEntry(\n entry: AgentEngineEntry,\n key: string,\n): Promise<boolean> {\n if (\n !(\n canUseDeployCredentialFallbackForRequest(key) &&\n !!readDeployCredentialEnv(key)\n )\n ) {\n return false;\n }\n if (entry.name === \"builder\") {\n return true;\n }\n const value = readDeployCredentialEnv(key);\n if (!value) return false;\n return !(await getProviderCredentialAuthFailure({ key, value }));\n}\n\nasync function hasUsableEnvKeys(entry: AgentEngineEntry): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return false;\n for (const key of entry.requiredEnvVars) {\n if (!(await envKeyUsableForEntry(entry, key))) return false;\n }\n return true;\n}\n\n/**\n * Request-aware env auto-detect. Same priority as {@link detectEngineFromEnv},\n * but skips provider keys that currently have an auth-failure marker so a\n * rejected deploy key does not permanently win selection and leave chat stuck\n * on `missing_credentials`.\n */\nexport async function detectEngineFromEnvForRequest(): Promise<AgentEngineEntry | null> {\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasUsableEnvKeys(entry)) return entry;\n }\n }\n\n for (const entry of _registry.values()) {\n if (await hasUsableEnvKeys(entry)) return entry;\n }\n return null;\n}\n\nfunction shouldTraceEngineDetection(): boolean {\n return /^(1|true)$/i.test(\n process.env.AGENT_NATIVE_DEBUG_AGENT_ENGINE_DETECT ??\n process.env.AGENT_NATIVE_DEBUG_CREDENTIAL_RESOLVE ??\n \"\",\n );\n}\n\n/**\n * Detect a usable engine from the current request user's accessible\n * `app_secrets` rows. Mirrors `detectEngineFromEnv` but consults the\n * encrypted secret store instead of `process.env`, including org-scoped\n * credentials shared with the active organization.\n *\n * Required because the Builder OAuth callback (and the settings UI's\n * \"paste your own key\" flow) writes credentials to app_secrets, not env.\n * Without this check, a user who connected Builder would see status\n * \"configured\" but the next chat turn would fall through to the default\n * Anthropic engine and hit `missing_api_key` — exactly Brent's symptom\n * on the docs site (Loom 2026-04-28: \"It doesn't seem to realize I'm\n * connected once I do a chat\").\n *\n * Includes the local dev session (`local@localhost`): the Builder\n * OAuth flow writes credentials scoped to that email when run from\n * `pnpm dev`, so detection has to consult those rows or the dev user\n * sees the same \"Connect your AI\" card after they've already connected\n * (Sami, 2026-04-30). Org-scoped Builder credentials must also count here:\n * `/builder/status` resolves them via the same request org context, and the\n * chat engine picker must not disagree with that card.\n */\nexport async function detectEngineFromUserSecrets(): Promise<AgentEngineEntry | null> {\n const traceLookup = shouldTraceEngineDetection();\n let email: string | undefined;\n let orgId: string | null | undefined;\n try {\n const { getRequestUserEmail, getRequestOrgId } =\n await import(\"../../server/request-context.js\");\n email = getRequestUserEmail();\n orgId = getRequestOrgId();\n } catch {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-request-context email=(unknown) orgId=(unknown)`,\n );\n }\n return null;\n }\n if (!email) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-email email=(empty) orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n }\n\n const hasAllKeys = async (entry: AgentEngineEntry): Promise<boolean> => {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return false;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (!(await resolveUsableProviderSecret(key))) return false;\n } catch {\n return false;\n }\n }\n return true;\n };\n\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"} byo=true`,\n );\n }\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return entry;\n }\n }\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-engine-keys-found email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n}\n\n/**\n * Legacy inline API keys on the global `agent-engine` settings row are\n * intentionally ignored. That row is deployment-wide, so treating\n * `{ apiKey }` or `{ config: { apiKey } }` as configured would let one\n * user's pasted key power every other user. Per-user keys live in\n * `app_secrets` and are resolved separately.\n */\nexport function isAgentEngineSettingConfigured(stored: unknown): boolean {\n if (!stored || typeof stored !== \"object\") return false;\n const s = stored as {\n engine?: unknown;\n };\n if (typeof s.engine !== \"string\" || !s.engine) return false;\n return false;\n}\n\nfunction stripInlineApiKeyConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!config) return {};\n const { apiKey: _discardedApiKey, ...safeConfig } = config;\n return safeConfig;\n}\n\nfunction canUseDeployEnvForEntry(entry: AgentEngineEntry): boolean {\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every((key) =>\n canUseDeployCredentialFallbackForRequest(key),\n );\n}\n\nfunction engineCreateConfig(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n apiKey,\n allowEnvFallback: canUseDeployEnvForEntry(entry),\n ...(extra ?? {}),\n };\n}\n\nasync function resolveOpenAiBaseUrl(): Promise<string | undefined> {\n let raw: string | null | undefined = null;\n try {\n raw = await resolveSecret(OPENAI_BASE_URL_ENV_VAR);\n } catch {\n raw = null;\n }\n\n if (\n !raw &&\n canUseDeployCredentialFallbackForRequest(OPENAI_BASE_URL_ENV_VAR)\n ) {\n raw = readDeployCredentialEnv(OPENAI_BASE_URL_ENV_VAR);\n }\n\n return raw ? normalizeOpenAiBaseUrl(raw) : undefined;\n}\n\nasync function resolveUsableProviderSecret(\n key: string,\n): Promise<string | null> {\n const value = await resolveSecret(key);\n if (!value) return null;\n const authFailure = await getProviderCredentialAuthFailure({ key, value });\n return authFailure ? null : value;\n}\n\nasync function engineCreateConfigForEntry(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const safeExtra = { ...(extra ?? {}) };\n if (entry.name === \"ai-sdk:openai\") {\n if (typeof safeExtra.baseURL === \"string\" && safeExtra.baseUrl == null) {\n safeExtra.baseUrl = normalizeOpenAiBaseUrl(safeExtra.baseURL);\n }\n if (safeExtra.baseUrl == null) {\n const baseUrl = await resolveOpenAiBaseUrl();\n if (baseUrl) safeExtra.baseUrl = baseUrl;\n }\n }\n return engineCreateConfig(entry, apiKey, safeExtra);\n}\n\n/**\n * True when the stored `agent-engine` row points at a registered engine\n * AND an API key for it is reachable via the engine's required env vars.\n * Inline keys on the global settings row are ignored; see\n * `isAgentEngineSettingConfigured`.\n *\n * Sync helper for CLI/status. Prefer {@link isStoredEngineUsableForRequest}\n * so sticky auth-failure markers are respected.\n */\nexport function isStoredEngineUsable(\n stored: unknown,\n entry: AgentEngineEntry,\n): boolean {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n );\n}\n\n/**\n * Request-aware version of `isStoredEngineUsable`.\n *\n * The settings row stores the selected engine/model, while credentials may\n * live in per-user/org `app_secrets`. The sync helper intentionally only sees\n * deploy env vars; this async helper is what request-time routes should use\n * when deciding whether a stored engine can actually run for the current user.\n */\nexport async function isStoredEngineUsableForRequest(\n stored: unknown,\n entry: AgentEngineEntry,\n): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\n/**\n * Request-aware credential preflight for an already-resolved engine instance.\n * `resolveEngine()` may still return a default or explicitly requested engine\n * object before credentials are actually usable; call this before starting a\n * user-visible run so missing providers fail immediately.\n */\nexport async function isResolvedEngineUsableForRequest(\n engine: AgentEngine,\n options: { apiKey?: string } = {},\n): Promise<boolean> {\n const entry = _registry.get(engine.name);\n // Custom engines may have their own credential contract outside the core\n // registry metadata, so do not block them speculatively.\n if (!entry) return true;\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return true;\n\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n\n if (options.apiKey?.trim()) {\n const key = entry.requiredEnvVars[0];\n if (!key) return true;\n return !(await getProviderCredentialAuthFailure({\n key,\n value: options.apiKey,\n }));\n }\n\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\nexport interface ResolveEngineConfig {\n /** Explicit engine name or instance from createAgentChatPlugin options */\n engineOption?:\n | string\n | AgentEngine\n | { name: string; config: Record<string, unknown> };\n /** API key (used as config for the resolved engine) */\n apiKey?: string;\n /** Model override (used as part of engine config) */\n model?: string;\n /** App/template id used for org-scoped per-app model defaults. */\n appId?: string;\n}\n\n/**\n * Resolve an AgentEngine from options → explicit env → app default →\n * settings → request credentials → env → default.\n *\n * Resolution order:\n * 1. Explicit `engineOption` from plugin options (string name, instance, or {name, config})\n * 2. Env var AGENT_ENGINE\n * 3. Org/user app-template default, when usable\n * 4. Settings store key \"agent-engine\" → { engine: string }, when usable\n * 5. Current request's app_secrets; Builder wins by default when connected\n * 6. Auto-detect deployment env credentials\n * 7. Default \"anthropic\" (requires ANTHROPIC_API_KEY)\n */\nexport async function resolveEngine(\n config: ResolveEngineConfig,\n): Promise<AgentEngine> {\n const { engineOption, apiKey, model: _model, appId } = config;\n\n // 1. Explicit instance passed directly\n if (\n engineOption &&\n typeof engineOption === \"object\" &&\n \"stream\" in engineOption\n ) {\n return engineOption as AgentEngine;\n }\n\n // 2. Explicit {name, config} object\n if (\n engineOption &&\n typeof engineOption === \"object\" &&\n \"name\" in engineOption\n ) {\n const { name, config: engineConfig } = engineOption as {\n name: string;\n config: Record<string, unknown>;\n };\n const entry = _registry.get(name);\n if (!entry)\n throw new Error(\n `[agent-engine] Unknown engine: \"${name}\". Registered: ${[..._registry.keys()].join(\", \")}`,\n );\n assertAgentEnginePackageInstalled(entry);\n return entry.create(\n await engineCreateConfigForEntry(entry, apiKey, engineConfig),\n );\n }\n\n // 3. Explicit string name from options\n if (typeof engineOption === \"string\") {\n const entry = _registry.get(engineOption);\n if (!entry)\n throw new Error(\n `[agent-engine] Unknown engine: \"${engineOption}\". Registered: ${[..._registry.keys()].join(\", \")}`,\n );\n assertAgentEnginePackageInstalled(entry);\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n\n // 4. Env var — explicit engine name override\n const envEngine = process.env.AGENT_ENGINE;\n if (envEngine) {\n const entry = _registry.get(envEngine);\n if (entry) {\n assertAgentEnginePackageInstalled(entry);\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(appId);\n if (appDefault?.engine) {\n const entry = _registry.get(appDefault.engine);\n if (entry && (await isStoredEngineUsableForRequest(appDefault, entry))) {\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n let stored: { engine?: unknown; config?: unknown } | null = null;\n try {\n stored = (await getSetting(\"agent-engine\")) as typeof stored;\n } catch {\n // Settings not available — fall through\n }\n\n // Auto-detect from the current user's per-user `app_secrets` rows\n // (Builder OAuth callback + \"paste your own key\" settings flow write here,\n // not env). Stored/app defaults are checked first so an explicit provider\n // selection can override a connected Builder account.\n const detectedFromUser = await detectEngineFromUserSecrets();\n\n // 6. Settings store — only when the stored row's API key is reachable.\n // This explicit selection beats automatic Builder detection so users can\n // switch away from Builder credits by saving/applying their own provider key.\n const storedRaw = stored as { engine?: unknown; config?: unknown } | null;\n const storedEngine = storedRaw?.engine;\n const storedConfig = storedRaw?.config;\n if (storedRaw && typeof storedEngine === \"string\") {\n const entry = _registry.get(storedEngine);\n if (entry && (await isStoredEngineUsableForRequest(storedRaw, entry))) {\n return entry.create(\n await engineCreateConfigForEntry(\n entry,\n apiKey,\n stripInlineApiKeyConfig(\n storedConfig as Record<string, unknown> | undefined,\n ),\n ),\n );\n }\n }\n\n if (detectedFromUser) {\n return detectedFromUser.create(\n await engineCreateConfigForEntry(detectedFromUser, apiKey),\n );\n }\n\n // 8. Auto-detect from any provider env var — so just dropping a key in\n // .env works without also setting AGENT_ENGINE. Skip keys with active\n // auth-failure markers so a rejected deploy key cannot permanently win.\n const detected = await detectEngineFromEnvForRequest();\n if (detected) {\n return detected.create(await engineCreateConfigForEntry(detected, apiKey));\n }\n\n // 9. Default: anthropic\n const anthropicEntry = _registry.get(\"anthropic\");\n if (!anthropicEntry) {\n throw new Error(\n \"[agent-engine] Default Anthropic engine is not registered. Did builtin.ts fail to load?\",\n );\n }\n return anthropicEntry.create(\n await engineCreateConfigForEntry(anthropicEntry, apiKey),\n );\n}\n\n/**\n * Read the user-selected model for an engine from the `agent-engine` setting.\n *\n * The settings UI writes `{engine, model}` via the `manage-agent-engine` action=\"set\",\n * but `resolveEngine` only uses the stored engine (the model is a separate\n * per-request concern). Call this helper alongside `resolveEngine` to honor\n * the user's model choice without requiring a process restart.\n *\n * Returns the stored model only when the stored engine name matches `engine`\n * — otherwise returns `undefined` to avoid applying an Anthropic model string\n * to, say, an OpenRouter engine.\n */\nexport async function getStoredModelForEngine(\n engine: AgentEngine | string,\n options: { appId?: string } = {},\n): Promise<string | undefined> {\n const engineName = typeof engine === \"string\" ? engine : engine.name;\n try {\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(\n options.appId,\n );\n if (\n appDefault?.engine === engineName &&\n typeof appDefault.model === \"string\" &&\n appDefault.model.length > 0\n ) {\n return appDefault.model;\n }\n } catch {\n // Settings/request context may not be available — fall through.\n }\n\n try {\n const stored = await getSetting(\"agent-engine\");\n if (\n stored &&\n typeof stored.engine === \"string\" &&\n stored.engine === engineName &&\n typeof stored.model === \"string\" &&\n stored.model.length > 0\n ) {\n return stored.model;\n }\n } catch {\n // Settings store not ready (fresh install, migration pending) — skip.\n }\n return undefined;\n}\n"]}