@agent-native/core 0.131.6 → 0.131.9

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 (113) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +31 -0
  3. package/corpus/core/docs/content/deployment.mdx +12 -10
  4. package/corpus/core/docs/content/security.mdx +2 -2
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/a2a/invoke.ts +4 -2
  7. package/corpus/core/src/agent/action-continuation-guidance.ts +2 -1
  8. package/corpus/core/src/agent/engine/registry.ts +61 -9
  9. package/corpus/core/src/application-state/store.ts +18 -31
  10. package/corpus/core/src/cli/create.ts +115 -16
  11. package/corpus/core/src/client/AssistantChat.tsx +10 -2
  12. package/corpus/core/src/client/frame-protocol.ts +5 -1
  13. package/corpus/core/src/guards/no-env-credentials.ts +2 -0
  14. package/corpus/core/src/scripts/call-agent.ts +4 -2
  15. package/corpus/core/src/secrets/crypto.ts +44 -15
  16. package/corpus/core/src/secrets/storage.ts +6 -4
  17. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +2 -0
  18. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +14 -9
  19. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +14 -9
  20. package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -9
  21. package/corpus/core/src/workspace-files/tool.ts +18 -11
  22. package/corpus/templates/analytics/AGENTS.md +1 -0
  23. package/corpus/templates/analytics/changelog/2026-07-30-delegated-analytics-questions-now-return-a-useful-current-me.md +6 -0
  24. package/corpus/templates/analytics/server/lib/real-data-actions.ts +10 -0
  25. package/corpus/templates/clips/actions/generate-workflow.ts +6 -4
  26. package/corpus/templates/clips/actions/reconcile-workflow-generation.ts +257 -0
  27. package/corpus/templates/clips/app/hooks/use-auto-title.ts +166 -4
  28. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +1 -1
  29. package/corpus/templates/clips/changelog/2026-07-27-stopped-agent-runs-no-longer-leave-generated-workflow-cards-.md +6 -0
  30. package/corpus/templates/clips/changelog/2026-07-30-workflow-generation-now-stops-retrying-after-repeated-failur.md +6 -0
  31. package/corpus/templates/clips/shared/workflow.ts +5 -0
  32. package/corpus/templates/plan/actions/get-visual-plan.ts +10 -6
  33. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +117 -1
  34. package/corpus/templates/plan/actions/update-visual-plan.ts +56 -14
  35. package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
  36. package/corpus/templates/plan/changelog/2026-07-30-plan-agents-recover-with-targeted-writes.md +6 -0
  37. package/corpus/templates/plan/shared/plan-content.ts +35 -0
  38. package/corpus/templates/slides/actions/create-deck.ts +1 -1
  39. package/corpus/templates/slides/changelog/2026-07-30-new-decks-now-start-with-an-empty-slide-list-when-no-slides-.md +6 -0
  40. package/dist/a2a/invoke.d.ts.map +1 -1
  41. package/dist/a2a/invoke.js +4 -2
  42. package/dist/a2a/invoke.js.map +1 -1
  43. package/dist/agent/action-continuation-guidance.d.ts.map +1 -1
  44. package/dist/agent/action-continuation-guidance.js +2 -1
  45. package/dist/agent/action-continuation-guidance.js.map +1 -1
  46. package/dist/agent/engine/registry.d.ts.map +1 -1
  47. package/dist/agent/engine/registry.js +59 -12
  48. package/dist/agent/engine/registry.js.map +1 -1
  49. package/dist/application-state/store.d.ts.map +1 -1
  50. package/dist/application-state/store.js +20 -36
  51. package/dist/application-state/store.js.map +1 -1
  52. package/dist/cli/create.d.ts +8 -1
  53. package/dist/cli/create.d.ts.map +1 -1
  54. package/dist/cli/create.js +98 -16
  55. package/dist/cli/create.js.map +1 -1
  56. package/dist/client/AssistantChat.d.ts.map +1 -1
  57. package/dist/client/AssistantChat.js +10 -2
  58. package/dist/client/AssistantChat.js.map +1 -1
  59. package/dist/client/frame-protocol.d.ts +1 -0
  60. package/dist/client/frame-protocol.d.ts.map +1 -1
  61. package/dist/client/frame-protocol.js.map +1 -1
  62. package/dist/collab/routes.d.ts +1 -1
  63. package/dist/collab/struct-routes.d.ts +1 -1
  64. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  65. package/dist/guards/no-env-credentials.d.ts.map +1 -1
  66. package/dist/guards/no-env-credentials.js +2 -0
  67. package/dist/guards/no-env-credentials.js.map +1 -1
  68. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  69. package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
  70. package/dist/notifications/routes.d.ts +6 -6
  71. package/dist/observability/routes.d.ts +3 -3
  72. package/dist/scripts/call-agent.d.ts.map +1 -1
  73. package/dist/scripts/call-agent.js +4 -2
  74. package/dist/scripts/call-agent.js.map +1 -1
  75. package/dist/secrets/crypto.d.ts +14 -9
  76. package/dist/secrets/crypto.d.ts.map +1 -1
  77. package/dist/secrets/crypto.js +42 -16
  78. package/dist/secrets/crypto.js.map +1 -1
  79. package/dist/secrets/storage.d.ts +6 -4
  80. package/dist/secrets/storage.d.ts.map +1 -1
  81. package/dist/secrets/storage.js +6 -4
  82. package/dist/secrets/storage.js.map +1 -1
  83. package/dist/server/agent-chat/action-filters-a2a.d.ts +1 -1
  84. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  85. package/dist/server/agent-chat/action-filters-a2a.js +2 -0
  86. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  87. package/dist/server/realtime-token.d.ts +1 -1
  88. package/dist/server/transcribe-voice.d.ts +1 -1
  89. package/dist/templates/default/.agents/skills/secrets/SKILL.md +14 -9
  90. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +14 -9
  91. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -9
  92. package/dist/workspace-files/tool.d.ts.map +1 -1
  93. package/dist/workspace-files/tool.js +18 -11
  94. package/dist/workspace-files/tool.js.map +1 -1
  95. package/docs/content/deployment.mdx +12 -10
  96. package/docs/content/security.mdx +2 -2
  97. package/package.json +1 -1
  98. package/src/a2a/invoke.ts +4 -2
  99. package/src/agent/action-continuation-guidance.ts +2 -1
  100. package/src/agent/engine/registry.ts +61 -9
  101. package/src/application-state/store.ts +18 -31
  102. package/src/cli/create.ts +115 -16
  103. package/src/client/AssistantChat.tsx +10 -2
  104. package/src/client/frame-protocol.ts +5 -1
  105. package/src/guards/no-env-credentials.ts +2 -0
  106. package/src/scripts/call-agent.ts +4 -2
  107. package/src/secrets/crypto.ts +44 -15
  108. package/src/secrets/storage.ts +6 -4
  109. package/src/server/agent-chat/action-filters-a2a.ts +2 -0
  110. package/src/templates/default/.agents/skills/secrets/SKILL.md +14 -9
  111. package/src/templates/headless/.agents/skills/secrets/SKILL.md +14 -9
  112. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +14 -9
  113. package/src/workspace-files/tool.ts +18 -11
@@ -1 +1 @@
1
- {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/a2a/invoke.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n discoverAgents as defaultDiscoverAgents,\n findAgent as defaultFindAgent,\n type DiscoveredAgent,\n} from \"../server/agent-discovery.js\";\nimport {\n callAction as defaultCallAction,\n callAgent as defaultCallAgent,\n} from \"./client.js\";\nimport type {\n A2ACorrelationMetadata,\n A2AReadOnlyActionResult,\n} from \"./types.js\";\n\nexport type AgentInvocationErrorCode =\n | \"missing-target\"\n | \"missing-prompt\"\n | \"missing-action\"\n | \"invalid-input\"\n | \"invalid-url\"\n | \"self-call\"\n | \"not-found\";\n\nexport class AgentInvocationError extends Error {\n readonly code: AgentInvocationErrorCode;\n readonly target?: string;\n readonly availableAgents?: DiscoveredAgent[];\n\n constructor(\n code: AgentInvocationErrorCode,\n message: string,\n options?: { target?: string; availableAgents?: DiscoveredAgent[] },\n ) {\n super(message);\n this.name = \"AgentInvocationError\";\n this.code = code;\n this.target = options?.target;\n this.availableAgents = options?.availableAgents;\n }\n}\n\nexport interface ResolvedAgentInvocationTarget {\n kind: \"discovered\" | \"url\";\n id?: string;\n name: string;\n description?: string;\n url: string;\n color?: string;\n}\n\nexport interface AgentInvocationResult {\n target: ResolvedAgentInvocationTarget;\n prompt: string;\n responseText: string;\n}\n\nexport interface AgentActionInvocationResult {\n target: ResolvedAgentInvocationTarget;\n action: string;\n result: A2AReadOnlyActionResult;\n}\n\nexport interface AgentInvocationRuntime {\n findAgent: typeof defaultFindAgent;\n discoverAgents: typeof defaultDiscoverAgents;\n callAgent: typeof defaultCallAgent;\n callAction: typeof defaultCallAction;\n}\n\nexport interface ResolveAgentInvocationTargetOptions {\n selfAppId?: string;\n selfUrl?: string;\n runtime?: Partial<AgentInvocationRuntime>;\n}\n\nexport interface InvokeAgentOptions extends ResolveAgentInvocationTargetOptions {\n target: string;\n prompt: string;\n apiKey?: string;\n contextId?: string;\n userEmail?: string;\n orgDomain?: string;\n orgSecret?: string;\n async?: boolean;\n timeoutMs?: number;\n pollIntervalMs?: number;\n includeInvocationHint?: boolean;\n correlation?: A2ACorrelationMetadata;\n idempotencyKey?: string;\n runtime?: Partial<AgentInvocationRuntime>;\n}\n\nexport interface InvokeAgentActionOptions extends ResolveAgentInvocationTargetOptions {\n target: string;\n action: string;\n input?: Record<string, unknown>;\n apiKey?: string;\n userEmail?: string;\n orgDomain?: string;\n orgSecret?: string;\n requestTimeoutMs?: number;\n correlation?: A2ACorrelationMetadata;\n runtime?: Partial<AgentInvocationRuntime>;\n}\n\n/**\n * Resolve an A2A invocation target from a direct URL or from the connected app\n * registry. ID/name resolution deliberately uses the same discovery path as\n * the in-agent `call-agent` script.\n */\nexport async function resolveAgentInvocationTarget(\n target: string,\n options: ResolveAgentInvocationTargetOptions = {},\n): Promise<ResolvedAgentInvocationTarget> {\n const cleanTarget = target.trim();\n if (!cleanTarget) {\n throw new AgentInvocationError(\n \"missing-target\",\n \"Error: agent target is required\",\n );\n }\n\n const directUrl = parseAgentUrl(cleanTarget);\n if (directUrl) {\n assertNotSelfUrl(directUrl, options.selfUrl);\n return {\n kind: \"url\",\n name: directUrl,\n url: directUrl,\n };\n }\n\n if (\n options.selfAppId &&\n normalizeAgentHandle(cleanTarget) ===\n normalizeAgentHandle(options.selfAppId)\n ) {\n throw new AgentInvocationError(\n \"self-call\",\n formatSelfCallError(options.selfAppId),\n { target: cleanTarget },\n );\n }\n\n const findAgent = options.runtime?.findAgent ?? defaultFindAgent;\n const discoverAgents =\n options.runtime?.discoverAgents ?? defaultDiscoverAgents;\n const agent = await findAgent(cleanTarget, options.selfAppId);\n if (!agent) {\n const availableAgents = await discoverAgents(options.selfAppId);\n const available = availableAgents.map((a) => a.name).join(\", \");\n throw new AgentInvocationError(\n \"not-found\",\n `Error: Agent \"${cleanTarget}\" not found. Available agents: ${available || \"(none)\"}`,\n { target: cleanTarget, availableAgents },\n );\n }\n\n return {\n kind: \"discovered\",\n id: agent.id,\n name: agent.name,\n description: agent.description,\n url: agent.url,\n color: agent.color,\n };\n}\n\n/**\n * First-class headless A2A primitive: resolve an app/agent by id, name, or URL,\n * send a text prompt, and return the text response with target metadata.\n */\nexport async function invokeAgent(\n options: InvokeAgentOptions,\n): Promise<AgentInvocationResult> {\n const prompt = options.prompt;\n if (!prompt.trim()) {\n throw new AgentInvocationError(\n \"missing-prompt\",\n \"Error: prompt is required\",\n { target: options.target },\n );\n }\n\n const target = await resolveAgentInvocationTarget(options.target, {\n selfAppId: options.selfAppId,\n selfUrl: options.selfUrl,\n runtime: options.runtime,\n });\n\n const promptToSend =\n options.includeInvocationHint === false\n ? prompt\n : buildAgentInvocationPrompt(prompt, target.url);\n\n const callAgent = options.runtime?.callAgent ?? defaultCallAgent;\n const responseText = await callAgent(target.url, promptToSend, {\n apiKey: options.apiKey,\n contextId: options.contextId,\n userEmail: options.userEmail,\n orgDomain: options.orgDomain,\n orgSecret: options.orgSecret,\n async: options.async,\n timeoutMs: options.timeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n correlation: options.correlation,\n idempotencyKey: options.idempotencyKey,\n });\n\n return {\n target,\n prompt: promptToSend,\n responseText,\n };\n}\n\n/**\n * Resolve another app and execute one explicitly exposed read-only action on\n * it. This is the fast A2A path for bounded data operations that do not need a\n * second model to plan or synthesize.\n */\nexport async function invokeAgentAction(\n options: InvokeAgentActionOptions,\n): Promise<AgentActionInvocationResult> {\n const action = options.action.trim();\n if (!action) {\n throw new AgentInvocationError(\n \"missing-action\",\n \"Error: action is required\",\n { target: options.target },\n );\n }\n const input = options.input ?? {};\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new AgentInvocationError(\n \"invalid-input\",\n \"Error: action input must be an object\",\n { target: options.target },\n );\n }\n\n const target = await resolveAgentInvocationTarget(options.target, {\n selfAppId: options.selfAppId,\n selfUrl: options.selfUrl,\n runtime: options.runtime,\n });\n const callAction = options.runtime?.callAction ?? defaultCallAction;\n const result = await callAction(target.url, action, input, {\n apiKey: options.apiKey,\n userEmail: options.userEmail,\n orgDomain: options.orgDomain,\n orgSecret: options.orgSecret,\n requestTimeoutMs: options.requestTimeoutMs,\n correlation: options.correlation,\n });\n\n return { target, action, result };\n}\n\nexport function buildAgentInvocationPrompt(\n prompt: string,\n agentUrl: string,\n): string {\n return (\n `${prompt}\\n\\n` +\n `[Note: this request comes from another app via A2A. The caller cannot see your local UI, resource list, or navigation - only the literal text you put in your reply. ` +\n `If you create or reference a deck/document/design/dashboard/resource, include its FULLY-QUALIFIED URL (e.g. ${agentUrl.replace(/\\/$/, \"\")}/<path>/<id>) in your reply, not a relative path. ` +\n `Use only artifact IDs and URL paths returned by successful actions - never invent slugs, IDs, or hosts.]`\n );\n}\n\nexport function looksLikeAgentUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(value.trim());\n}\n\nfunction parseAgentUrl(value: string): string | null {\n const trimmed = value.trim();\n if (!looksLikeAgentUrl(trimmed)) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new AgentInvocationError(\n \"invalid-url\",\n `Error: Invalid agent URL \"${trimmed}\"`,\n { target: trimmed },\n );\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new AgentInvocationError(\n \"invalid-url\",\n \"Error: Agent URL must use http or https\",\n { target: trimmed },\n );\n }\n\n parsed.hash = \"\";\n parsed.search = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nfunction assertNotSelfUrl(targetUrl: string, selfUrl: string | undefined) {\n if (!selfUrl) return;\n const target = canonicalAgentBaseUrl(targetUrl);\n const self = canonicalAgentBaseUrl(selfUrl);\n if (!target || !self || target !== self) return;\n throw new AgentInvocationError(\n \"self-call\",\n \"Error: You cannot invoke this app via A2A from itself. Use the app's own registered actions/tools instead. A2A invocation is only for communicating with other separately-deployed apps.\",\n { target: targetUrl },\n );\n}\n\nfunction canonicalAgentBaseUrl(value: string): string | null {\n try {\n const parsed = new URL(value);\n parsed.hash = \"\";\n parsed.search = \"\";\n let pathname = parsed.pathname.replace(/\\/+$/, \"\");\n if (pathname.endsWith(\"/_agent-native/a2a\")) {\n pathname = pathname.slice(0, -\"/_agent-native/a2a\".length);\n } else if (pathname.endsWith(\"/a2a\")) {\n pathname = pathname.slice(0, -\"/a2a\".length);\n }\n parsed.pathname = pathname || \"/\";\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeAgentHandle(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"image\" ||\n normalized === \"images\" ||\n normalized === \"asset\"\n ) {\n return \"assets\";\n }\n return normalized;\n}\n\nfunction formatSelfCallError(selfAppId: string): string {\n return `Error: You cannot use A2A invocation to call yourself (${selfAppId}). Use your own registered actions/tools instead. A2A invocation is only for communicating with OTHER separately-deployed apps.`;\n}\n"]}
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/a2a/invoke.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n discoverAgents as defaultDiscoverAgents,\n findAgent as defaultFindAgent,\n type DiscoveredAgent,\n} from \"../server/agent-discovery.js\";\nimport {\n callAction as defaultCallAction,\n callAgent as defaultCallAgent,\n} from \"./client.js\";\nimport type {\n A2ACorrelationMetadata,\n A2AReadOnlyActionResult,\n} from \"./types.js\";\n\nexport type AgentInvocationErrorCode =\n | \"missing-target\"\n | \"missing-prompt\"\n | \"missing-action\"\n | \"invalid-input\"\n | \"invalid-url\"\n | \"self-call\"\n | \"not-found\";\n\nexport class AgentInvocationError extends Error {\n readonly code: AgentInvocationErrorCode;\n readonly target?: string;\n readonly availableAgents?: DiscoveredAgent[];\n\n constructor(\n code: AgentInvocationErrorCode,\n message: string,\n options?: { target?: string; availableAgents?: DiscoveredAgent[] },\n ) {\n super(message);\n this.name = \"AgentInvocationError\";\n this.code = code;\n this.target = options?.target;\n this.availableAgents = options?.availableAgents;\n }\n}\n\nexport interface ResolvedAgentInvocationTarget {\n kind: \"discovered\" | \"url\";\n id?: string;\n name: string;\n description?: string;\n url: string;\n color?: string;\n}\n\nexport interface AgentInvocationResult {\n target: ResolvedAgentInvocationTarget;\n prompt: string;\n responseText: string;\n}\n\nexport interface AgentActionInvocationResult {\n target: ResolvedAgentInvocationTarget;\n action: string;\n result: A2AReadOnlyActionResult;\n}\n\nexport interface AgentInvocationRuntime {\n findAgent: typeof defaultFindAgent;\n discoverAgents: typeof defaultDiscoverAgents;\n callAgent: typeof defaultCallAgent;\n callAction: typeof defaultCallAction;\n}\n\nexport interface ResolveAgentInvocationTargetOptions {\n selfAppId?: string;\n selfUrl?: string;\n runtime?: Partial<AgentInvocationRuntime>;\n}\n\nexport interface InvokeAgentOptions extends ResolveAgentInvocationTargetOptions {\n target: string;\n prompt: string;\n apiKey?: string;\n contextId?: string;\n userEmail?: string;\n orgDomain?: string;\n orgSecret?: string;\n async?: boolean;\n timeoutMs?: number;\n pollIntervalMs?: number;\n includeInvocationHint?: boolean;\n correlation?: A2ACorrelationMetadata;\n idempotencyKey?: string;\n runtime?: Partial<AgentInvocationRuntime>;\n}\n\nexport interface InvokeAgentActionOptions extends ResolveAgentInvocationTargetOptions {\n target: string;\n action: string;\n input?: Record<string, unknown>;\n apiKey?: string;\n userEmail?: string;\n orgDomain?: string;\n orgSecret?: string;\n requestTimeoutMs?: number;\n correlation?: A2ACorrelationMetadata;\n runtime?: Partial<AgentInvocationRuntime>;\n}\n\n/**\n * Resolve an A2A invocation target from a direct URL or from the connected app\n * registry. ID/name resolution deliberately uses the same discovery path as\n * the in-agent `call-agent` script.\n */\nexport async function resolveAgentInvocationTarget(\n target: string,\n options: ResolveAgentInvocationTargetOptions = {},\n): Promise<ResolvedAgentInvocationTarget> {\n const cleanTarget = target.trim();\n if (!cleanTarget) {\n throw new AgentInvocationError(\n \"missing-target\",\n \"Error: agent target is required\",\n );\n }\n\n const directUrl = parseAgentUrl(cleanTarget);\n if (directUrl) {\n assertNotSelfUrl(directUrl, options.selfUrl);\n return {\n kind: \"url\",\n name: directUrl,\n url: directUrl,\n };\n }\n\n if (\n options.selfAppId &&\n normalizeAgentHandle(cleanTarget) ===\n normalizeAgentHandle(options.selfAppId)\n ) {\n throw new AgentInvocationError(\n \"self-call\",\n formatSelfCallError(options.selfAppId),\n { target: cleanTarget },\n );\n }\n\n const findAgent = options.runtime?.findAgent ?? defaultFindAgent;\n const discoverAgents =\n options.runtime?.discoverAgents ?? defaultDiscoverAgents;\n const agent = await findAgent(cleanTarget, options.selfAppId);\n if (!agent) {\n const availableAgents = await discoverAgents(options.selfAppId);\n const available = availableAgents.map((a) => a.name).join(\", \");\n throw new AgentInvocationError(\n \"not-found\",\n `Error: Agent \"${cleanTarget}\" not found. Available agents: ${available || \"(none)\"}`,\n { target: cleanTarget, availableAgents },\n );\n }\n\n return {\n kind: \"discovered\",\n id: agent.id,\n name: agent.name,\n description: agent.description,\n url: agent.url,\n color: agent.color,\n };\n}\n\n/**\n * First-class headless A2A primitive: resolve an app/agent by id, name, or URL,\n * send a text prompt, and return the text response with target metadata.\n */\nexport async function invokeAgent(\n options: InvokeAgentOptions,\n): Promise<AgentInvocationResult> {\n const prompt = options.prompt;\n if (!prompt.trim()) {\n throw new AgentInvocationError(\n \"missing-prompt\",\n \"Error: prompt is required\",\n { target: options.target },\n );\n }\n\n const target = await resolveAgentInvocationTarget(options.target, {\n selfAppId: options.selfAppId,\n selfUrl: options.selfUrl,\n runtime: options.runtime,\n });\n\n const promptToSend =\n options.includeInvocationHint === false\n ? prompt\n : buildAgentInvocationPrompt(prompt, target.url);\n\n const callAgent = options.runtime?.callAgent ?? defaultCallAgent;\n const responseText = await callAgent(target.url, promptToSend, {\n apiKey: options.apiKey,\n contextId: options.contextId,\n userEmail: options.userEmail,\n orgDomain: options.orgDomain,\n orgSecret: options.orgSecret,\n async: options.async,\n timeoutMs: options.timeoutMs,\n pollIntervalMs: options.pollIntervalMs,\n correlation: options.correlation,\n idempotencyKey: options.idempotencyKey,\n });\n\n return {\n target,\n prompt: promptToSend,\n responseText,\n };\n}\n\n/**\n * Resolve another app and execute one explicitly exposed read-only action on\n * it. This is the fast A2A path for bounded data operations that do not need a\n * second model to plan or synthesize.\n */\nexport async function invokeAgentAction(\n options: InvokeAgentActionOptions,\n): Promise<AgentActionInvocationResult> {\n const action = options.action.trim();\n if (!action) {\n throw new AgentInvocationError(\n \"missing-action\",\n \"Error: action is required\",\n { target: options.target },\n );\n }\n const input = options.input ?? {};\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new AgentInvocationError(\n \"invalid-input\",\n \"Error: action input must be an object\",\n { target: options.target },\n );\n }\n\n const target = await resolveAgentInvocationTarget(options.target, {\n selfAppId: options.selfAppId,\n selfUrl: options.selfUrl,\n runtime: options.runtime,\n });\n const callAction = options.runtime?.callAction ?? defaultCallAction;\n const result = await callAction(target.url, action, input, {\n apiKey: options.apiKey,\n userEmail: options.userEmail,\n orgDomain: options.orgDomain,\n orgSecret: options.orgSecret,\n requestTimeoutMs: options.requestTimeoutMs,\n correlation: options.correlation,\n });\n\n return { target, action, result };\n}\n\nexport function buildAgentInvocationPrompt(\n prompt: string,\n agentUrl: string,\n): string {\n return (\n `${prompt}\\n\\n` +\n `<a2a-caller-hint>\\n` +\n `This request comes from another app via A2A. The caller cannot see your local UI, resource list, or navigation - only the literal text you put in your reply. ` +\n `If you create or reference a deck/document/design/dashboard/resource, include its FULLY-QUALIFIED URL (e.g. ${agentUrl.replace(/\\/$/, \"\")}/<path>/<id>) in your reply, not a relative path. ` +\n `Use only artifact IDs and URL paths returned by successful actions - never invent slugs, IDs, or hosts.\\n` +\n `</a2a-caller-hint>`\n );\n}\n\nexport function looksLikeAgentUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\//i.test(value.trim());\n}\n\nfunction parseAgentUrl(value: string): string | null {\n const trimmed = value.trim();\n if (!looksLikeAgentUrl(trimmed)) return null;\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new AgentInvocationError(\n \"invalid-url\",\n `Error: Invalid agent URL \"${trimmed}\"`,\n { target: trimmed },\n );\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new AgentInvocationError(\n \"invalid-url\",\n \"Error: Agent URL must use http or https\",\n { target: trimmed },\n );\n }\n\n parsed.hash = \"\";\n parsed.search = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nfunction assertNotSelfUrl(targetUrl: string, selfUrl: string | undefined) {\n if (!selfUrl) return;\n const target = canonicalAgentBaseUrl(targetUrl);\n const self = canonicalAgentBaseUrl(selfUrl);\n if (!target || !self || target !== self) return;\n throw new AgentInvocationError(\n \"self-call\",\n \"Error: You cannot invoke this app via A2A from itself. Use the app's own registered actions/tools instead. A2A invocation is only for communicating with other separately-deployed apps.\",\n { target: targetUrl },\n );\n}\n\nfunction canonicalAgentBaseUrl(value: string): string | null {\n try {\n const parsed = new URL(value);\n parsed.hash = \"\";\n parsed.search = \"\";\n let pathname = parsed.pathname.replace(/\\/+$/, \"\");\n if (pathname.endsWith(\"/_agent-native/a2a\")) {\n pathname = pathname.slice(0, -\"/_agent-native/a2a\".length);\n } else if (pathname.endsWith(\"/a2a\")) {\n pathname = pathname.slice(0, -\"/a2a\".length);\n }\n parsed.pathname = pathname || \"/\";\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return null;\n }\n}\n\nfunction normalizeAgentHandle(value: string): string {\n const normalized = value.trim().toLowerCase();\n if (\n normalized === \"image\" ||\n normalized === \"images\" ||\n normalized === \"asset\"\n ) {\n return \"assets\";\n }\n return normalized;\n}\n\nfunction formatSelfCallError(selfAppId: string): string {\n return `Error: You cannot use A2A invocation to call yourself (${selfAppId}). Use your own registered actions/tools instead. A2A invocation is only for communicating with OTHER separately-deployed apps.`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"action-continuation-guidance.d.ts","sourceRoot":"","sources":["../../src/agent/action-continuation-guidance.ts"],"names":[],"mappings":"AAKA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyB1E;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtE"}
1
+ {"version":3,"file":"action-continuation-guidance.d.ts","sourceRoot":"","sources":["../../src/agent/action-continuation-guidance.ts"],"names":[],"mappings":"AAKA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0B1E;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtE"}
@@ -21,8 +21,9 @@ export function incrementalActionGuidance(tool) {
21
21
  case "create-prototype-plan":
22
22
  return "create the plan with its core sections or first screen, then expand it with `update-visual-plan`/`patch-visual-plan-source` follow-up edits";
23
23
  case "update-visual-plan":
24
+ return "apply one or a few small `update-visual-plan` `contentPatches` such as `append-block`, `update-rich-text`, or a text patch; do not resend the full plan or switch to a source-control workflow";
24
25
  case "patch-visual-plan-source":
25
- return "apply smaller, targeted `patch-visual-plan-source` edits rather than rewriting the whole plan in one call";
26
+ return "apply small targeted `patch-visual-plan-source` MDX AST edits; do not use `replace-file`, and do not use this source action for a live plan edit";
26
27
  case "update-dashboard":
27
28
  return "save a small dashboard first, then add panels one at a time with `update-dashboard` incremental `ops` edits instead of authoring the whole config in one call";
28
29
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"action-continuation-guidance.js","sourceRoot":"","sources":["../../src/agent/action-continuation-guidance.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,yBAAyB;AACzB,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC;QACxB,KAAK,kBAAkB;YACrB,OAAO,gHAAgH,CAAC;QAC1H,KAAK,iBAAiB,CAAC;QACvB,KAAK,eAAe;YAClB,OAAO,6aAA6a,CAAC;QACvb,KAAK,aAAa;YAChB,OAAO,8jBAA8jB,CAAC;QACxkB,KAAK,yBAAyB;YAC5B,OAAO,ubAAub,CAAC;QACjc,KAAK,oBAAoB,CAAC;QAC1B,KAAK,gBAAgB,CAAC;QACtB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,uBAAuB;YAC1B,OAAO,6IAA6I,CAAC;QACvJ,KAAK,oBAAoB,CAAC;QAC1B,KAAK,0BAA0B;YAC7B,OAAO,2GAA2G,CAAC;QACrH,KAAK,kBAAkB;YACrB,OAAO,+JAA+J,CAAC;QACzK;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,IAAY;IAC5D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,QAAQ;QACb,CAAC,CAAC,0DAA0D,IAAI,wHAAwH,QAAQ,GAAG;QACnM,CAAC,CAAC,0DAA0D,IAAI,yMAAyM,CAAC;AAC9Q,CAAC","sourcesContent":["// Concrete \"ship a compact first version, then refine incrementally\" guidance\n// keyed by the large-payload action the model was cut off while preparing.\n// A run cut off before the tool starts tends to reassemble the same oversized\n// payload on every continuation; pointing the model at the incremental path is\n// what breaks that loop.\nexport function incrementalActionGuidance(tool: string): string | undefined {\n switch (tool) {\n case \"create-extension\":\n case \"update-extension\":\n return \"create a compact working v1 with `create-extension`, then use focused `update-extension` edits for refinements\";\n case \"generate-design\":\n case \"update-design\":\n return 'if an existing design file or snapshot is already in history, especially after a Design variant pick, stop retrying `generate-design`: call `get-design-snapshot` for the selected file, then call `edit-design` once on that same `fileId` (`mode: \"replace-file\"` for a compact full-file replacement, or search/replace for smaller edits). Use `generate-design` only for a brand-new compact first file when no target file exists yet';\n case \"edit-design\":\n return 'retry with a smaller `edit-design` payload against the already-snapshotted file. If this is a selected Design variant expansion, reuse the existing `fileId` and snapshot in history; do not call `list-files`, `delete-file`, or `get-design-snapshot` again just to recover. Save one compact complete first version with `mode: \"replace-file\"` and `replacementContent`, or use a handful of exact search/replace edits when that is smaller. Avoid another huge full-file rewrite; upgrade the highest-value visible sections first, save once, and summarize any remaining refinements';\n case \"present-design-variants\":\n return 'call `present-design-variants` with concise labels, descriptions, accent colors, and feature bullets; omit large `content` HTML when needed so the action can render compact representative screens. After the user picks a direction, delete unchosen screens, snapshot the selected `fileId`, and refine that same file with `edit-design` (`mode: \"replace-file\"` for placeholder expansion). Do not call `generate-design` after the variant pick';\n case \"create-visual-plan\":\n case \"create-ui-plan\":\n case \"create-plan-design\":\n case \"create-prototype-plan\":\n return \"create the plan with its core sections or first screen, then expand it with `update-visual-plan`/`patch-visual-plan-source` follow-up edits\";\n case \"update-visual-plan\":\n case \"patch-visual-plan-source\":\n return \"apply smaller, targeted `patch-visual-plan-source` edits rather than rewriting the whole plan in one call\";\n case \"update-dashboard\":\n return \"save a small dashboard first, then add panels one at a time with `update-dashboard` incremental `ops` edits instead of authoring the whole config in one call\";\n default:\n return undefined;\n }\n}\n\nexport function actionPreparationContinuationNote(tool: string): string {\n const guidance = incrementalActionGuidance(tool);\n return guidance\n ? `\\n\\nThe previous run was cut off while preparing the \\`${tool}\\` action input before the action could finish. Avoid spending another whole run assembling one large tool payload - ${guidance}.`\n : `\\n\\nThe previous run was cut off while preparing the \\`${tool}\\` action input before the action could finish. Avoid re-assembling one large tool payload: produce a compact first result you can finish in a single run, then refine it with smaller follow-up edits.`;\n}\n"]}
1
+ {"version":3,"file":"action-continuation-guidance.js","sourceRoot":"","sources":["../../src/agent/action-continuation-guidance.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,yBAAyB;AACzB,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC;QACxB,KAAK,kBAAkB;YACrB,OAAO,gHAAgH,CAAC;QAC1H,KAAK,iBAAiB,CAAC;QACvB,KAAK,eAAe;YAClB,OAAO,6aAA6a,CAAC;QACvb,KAAK,aAAa;YAChB,OAAO,8jBAA8jB,CAAC;QACxkB,KAAK,yBAAyB;YAC5B,OAAO,ubAAub,CAAC;QACjc,KAAK,oBAAoB,CAAC;QAC1B,KAAK,gBAAgB,CAAC;QACtB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,uBAAuB;YAC1B,OAAO,6IAA6I,CAAC;QACvJ,KAAK,oBAAoB;YACvB,OAAO,gMAAgM,CAAC;QAC1M,KAAK,0BAA0B;YAC7B,OAAO,kJAAkJ,CAAC;QAC5J,KAAK,kBAAkB;YACrB,OAAO,+JAA+J,CAAC;QACzK;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,IAAY;IAC5D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,QAAQ;QACb,CAAC,CAAC,0DAA0D,IAAI,wHAAwH,QAAQ,GAAG;QACnM,CAAC,CAAC,0DAA0D,IAAI,yMAAyM,CAAC;AAC9Q,CAAC","sourcesContent":["// Concrete \"ship a compact first version, then refine incrementally\" guidance\n// keyed by the large-payload action the model was cut off while preparing.\n// A run cut off before the tool starts tends to reassemble the same oversized\n// payload on every continuation; pointing the model at the incremental path is\n// what breaks that loop.\nexport function incrementalActionGuidance(tool: string): string | undefined {\n switch (tool) {\n case \"create-extension\":\n case \"update-extension\":\n return \"create a compact working v1 with `create-extension`, then use focused `update-extension` edits for refinements\";\n case \"generate-design\":\n case \"update-design\":\n return 'if an existing design file or snapshot is already in history, especially after a Design variant pick, stop retrying `generate-design`: call `get-design-snapshot` for the selected file, then call `edit-design` once on that same `fileId` (`mode: \"replace-file\"` for a compact full-file replacement, or search/replace for smaller edits). Use `generate-design` only for a brand-new compact first file when no target file exists yet';\n case \"edit-design\":\n return 'retry with a smaller `edit-design` payload against the already-snapshotted file. If this is a selected Design variant expansion, reuse the existing `fileId` and snapshot in history; do not call `list-files`, `delete-file`, or `get-design-snapshot` again just to recover. Save one compact complete first version with `mode: \"replace-file\"` and `replacementContent`, or use a handful of exact search/replace edits when that is smaller. Avoid another huge full-file rewrite; upgrade the highest-value visible sections first, save once, and summarize any remaining refinements';\n case \"present-design-variants\":\n return 'call `present-design-variants` with concise labels, descriptions, accent colors, and feature bullets; omit large `content` HTML when needed so the action can render compact representative screens. After the user picks a direction, delete unchosen screens, snapshot the selected `fileId`, and refine that same file with `edit-design` (`mode: \"replace-file\"` for placeholder expansion). Do not call `generate-design` after the variant pick';\n case \"create-visual-plan\":\n case \"create-ui-plan\":\n case \"create-plan-design\":\n case \"create-prototype-plan\":\n return \"create the plan with its core sections or first screen, then expand it with `update-visual-plan`/`patch-visual-plan-source` follow-up edits\";\n case \"update-visual-plan\":\n return \"apply one or a few small `update-visual-plan` `contentPatches` such as `append-block`, `update-rich-text`, or a text patch; do not resend the full plan or switch to a source-control workflow\";\n case \"patch-visual-plan-source\":\n return \"apply small targeted `patch-visual-plan-source` MDX AST edits; do not use `replace-file`, and do not use this source action for a live plan edit\";\n case \"update-dashboard\":\n return \"save a small dashboard first, then add panels one at a time with `update-dashboard` incremental `ops` edits instead of authoring the whole config in one call\";\n default:\n return undefined;\n }\n}\n\nexport function actionPreparationContinuationNote(tool: string): string {\n const guidance = incrementalActionGuidance(tool);\n return guidance\n ? `\\n\\nThe previous run was cut off while preparing the \\`${tool}\\` action input before the action could finish. Avoid spending another whole run assembling one large tool payload - ${guidance}.`\n : `\\n\\nThe previous run was cut off while preparing the \\`${tool}\\` action input before the action could finish. Avoid re-assembling one large tool payload: produce a compact first result you can finish in a single run, then refine it with smaller follow-up edits.`;\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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"}
@@ -459,6 +459,41 @@ async function resolveUsableProviderSecret(key) {
459
459
  const authFailure = await getProviderCredentialAuthFailure({ key, value });
460
460
  return authFailure ? null : value;
461
461
  }
462
+ /**
463
+ * Return true only when the supplied key can be positively identified as a
464
+ * usable credential for a different registered provider.
465
+ *
466
+ * `ResolveEngineConfig.apiKey` is public and may be an opaque caller-provided
467
+ * key, so automatic selection must not silently replace it merely because a
468
+ * stored credential also exists. Delegated/internal callers, however,
469
+ * historically pass the current "active" provider key before the registry
470
+ * selects an app-default engine. Exact in-memory comparison lets us correct
471
+ * that proven mismatch without guessing from provider-specific key prefixes
472
+ * or exposing either value.
473
+ */
474
+ async function apiKeyBelongsToDifferentProvider(apiKey, selectedEntry) {
475
+ const selectedEnvVars = new Set(selectedEntry.requiredEnvVars);
476
+ const checkedEnvVars = new Set();
477
+ for (const entry of _registry.values()) {
478
+ if (entry === selectedEntry || entry.name === "builder")
479
+ continue;
480
+ for (const key of entry.requiredEnvVars) {
481
+ if (selectedEnvVars.has(key) || checkedEnvVars.has(key))
482
+ continue;
483
+ checkedEnvVars.add(key);
484
+ try {
485
+ if ((await resolveUsableProviderSecret(key)) === apiKey)
486
+ return true;
487
+ }
488
+ catch {
489
+ // An unrelated provider store failure is not proof that the explicit
490
+ // key belongs elsewhere. Preserve the caller's key and let the
491
+ // selected provider's own preflight report any relevant failure.
492
+ }
493
+ }
494
+ }
495
+ return false;
496
+ }
462
497
  async function engineCreateConfigForEntry(entry, apiKey, extra, preferResolvedCredential = false) {
463
498
  const safeExtra = { ...(extra ?? {}) };
464
499
  let matchingApiKey = apiKey;
@@ -466,27 +501,39 @@ async function engineCreateConfigForEntry(entry, apiKey, extra, preferResolvedCr
466
501
  // Callers historically passed one untagged "active" key before the registry
467
502
  // chose an engine, which could hand an Anthropic key to an app-default
468
503
  // OpenAI engine (or vice versa). Explicit engineOption branches retain their
469
- // paired key; automatic branches opt into matching the chosen provider here.
504
+ // paired key. Automatic branches replace only a key proven to belong to a
505
+ // different configured provider; opaque caller-supplied keys keep the public
506
+ // `ResolveEngineConfig.apiKey` contract.
470
507
  if (preferResolvedCredential &&
471
508
  entry.name !== "builder" &&
472
509
  entry.requiredEnvVars.length > 0) {
473
- let foundMatchingCredential = false;
510
+ let resolvedMatchingCredential;
511
+ let matchingCredentialUsesDeployFallback = false;
474
512
  for (const key of entry.requiredEnvVars) {
475
513
  const resolved = (await resolveUsableProviderSecret(key)) ?? undefined;
476
514
  if (!resolved)
477
515
  continue;
478
- foundMatchingCredential = true;
479
- const deployFallback = canUseDeployCredentialFallbackForRequest(key) &&
480
- readDeployCredentialEnv(key) === resolved;
516
+ resolvedMatchingCredential = resolved;
517
+ matchingCredentialUsesDeployFallback =
518
+ canUseDeployCredentialFallbackForRequest(key) &&
519
+ readDeployCredentialEnv(key) === resolved;
520
+ break;
521
+ }
522
+ const suppliedKeyMatchesSelected = matchingApiKey !== undefined &&
523
+ matchingApiKey === resolvedMatchingCredential;
524
+ const suppliedKeyBelongsElsewhere = matchingApiKey !== undefined &&
525
+ !suppliedKeyMatchesSelected &&
526
+ (await apiKeyBelongsToDifferentProvider(matchingApiKey, entry));
527
+ if (matchingApiKey === undefined || suppliedKeyBelongsElsewhere) {
481
528
  // Keep deploy-only credentials implicit so provider SDKs retain their
482
529
  // established env-fallback behavior. Scoped credentials must be passed
483
- // explicitly, and replace an unrelated preselected provider key.
484
- if (matchingApiKey || !deployFallback)
485
- matchingApiKey = resolved;
486
- break;
530
+ // explicitly. A proven different-provider key is replaced or cleared;
531
+ // an opaque caller-supplied key is preserved by the branch above.
532
+ matchingApiKey =
533
+ resolvedMatchingCredential && !matchingCredentialUsesDeployFallback
534
+ ? resolvedMatchingCredential
535
+ : undefined;
487
536
  }
488
- if (!foundMatchingCredential)
489
- matchingApiKey = undefined;
490
537
  }
491
538
  if (entry.name === "ai-sdk:openai") {
492
539
  if (typeof safeExtra.baseURL === "string" && safeExtra.baseUrl == null) {
@@ -703,7 +750,7 @@ export async function resolveEngine(config) {
703
750
  if (!anthropicEntry) {
704
751
  throw new Error("[agent-engine] Default Anthropic engine is not registered. Did builtin.ts fail to load?");
705
752
  }
706
- return anthropicEntry.create(await engineCreateConfigForEntry(anthropicEntry, apiKey));
753
+ return anthropicEntry.create(await engineCreateConfigForEntry(anthropicEntry, apiKey, undefined, true));
707
754
  }
708
755
  /**
709
756
  * Read the user-selected model for an engine from the `agent-engine` setting.
@@ -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 assertCredentialStoreReadable,\n canUseDeployCredentialFallbackForRequest,\n getProviderCredentialAuthFailure,\n readDeployCredentialEnv,\n resolveBuilderCredentialsDetailed,\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\n/**\n * True only when there is positive evidence this module is executing from a\n * bundled serverless function where optional dependencies were inlined into the\n * bundle and are therefore NOT resolvable via `require.resolve` — even though\n * the dynamic `import()` the engine uses to load them still works.\n *\n * Deliberately narrow. The Nitro Vercel/Netlify presets (which agent-native's\n * own `deploy` command emits) inline optional peers and always set these env\n * markers, so they are a reliable signal. Other serverless runtimes — a\n * container on Cloud Run / Google Cloud Functions (`K_SERVICE` /\n * `FUNCTION_TARGET`), or a plain AWS Lambda — commonly ship a real\n * `node_modules` where `require.resolve` is authoritative; there a resolve miss\n * means the package is genuinely absent and must NOT be masked. Those runtimes\n * are still covered *when the code is actually bundled*, via the module-path\n * check below, which stays false for a normal `node_modules` layout.\n */\nfunction isBundledServerlessRuntime(): boolean {\n const env = process.env;\n // Nitro's Vercel/Netlify presets inline optional peers into the function\n // bundle; these platforms always set these markers.\n if (env.VERCEL || env.NETLIFY) return true;\n // Otherwise require direct evidence that this module is running from inside a\n // bundle output directory (Vercel's `/var/task`, Nitro's `.output/server`,\n // inlined `_libs`). This is the real signal that `require.resolve` cannot be\n // trusted; it stays false for normal `node_modules` layouts (dev, tests, and\n // container/Lambda/Cloud Run deploys that ship their dependencies), so a\n // genuine \"package not installed\" miss still surfaces there.\n try {\n return /[\\\\/](?:_libs|\\.vercel|\\.netlify|\\.output)[\\\\/]|\\/var\\/task\\//.test(\n import.meta.url ?? \"\",\n );\n } catch {\n return false;\n }\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 // Bundled serverless runtimes (e.g. Nitro on Vercel/Netlify) inline optional\n // provider packages into the function bundle, so require.resolve cannot find\n // them even though the dynamic `import()` the engine actually uses to load\n // them works. Treat them as available there and let the engine's own import\n // be the real gate — it already fails with a clear \"pnpm add …\" message when\n // the package is genuinely missing. Without this, every engine-usability\n // gate rejects the AI-SDK engines at runtime and the agent silently falls\n // back to the native Anthropic engine.\n available = isBundledServerlessRuntime();\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 interface NormalizeModelOptions {\n /**\n * Force unrecognized (custom) model IDs to be kept verbatim, as if\n * `engine.preserveCustomModels` were set on a live engine instance.\n *\n * The settings actions call `normalizeModelForEngine` with a static registry\n * ENTRY, which never carries the runtime `preserveCustomModels` flag — that\n * is only set on the engine INSTANCE created with an OpenAI-compatible\n * `baseUrl`. They resolve the capability with\n * {@link resolveEnginePreservesCustomModels} and pass it here so a gateway\n * model (e.g. an Ollama `gemma4`) is not rewritten to the OpenAI default on\n * save/read. First-party OpenAI (no gateway) leaves this unset, so an unknown\n * or invalid model still normalizes to a supported one.\n */\n preserveCustomModels?: boolean;\n}\n\nexport function normalizeModelForEngine(\n engine: Pick<\n AgentEngine,\n \"name\" | \"defaultModel\" | \"supportedModels\" | \"preserveCustomModels\"\n >,\n model: string | null | undefined,\n options: NormalizeModelOptions = {},\n): string {\n const candidate = typeof model === \"string\" ? model.trim() : \"\";\n if (!candidate) return engine.defaultModel;\n\n // Preserve custom IDs verbatim BEFORE any catalog/version matching, so a\n // version-shaped gateway model that happens to share a family with a\n // built-in model (e.g. `gpt-5.4` on an OpenAI-compatible endpoint) is not\n // rewritten to a catalog entry.\n if (engine.preserveCustomModels || options.preserveCustomModels) {\n return candidate;\n }\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\n/**\n * Whether models saved or read for this engine ENTRY should be preserved\n * verbatim instead of normalized against the built-in catalog.\n *\n * `normalizeModelForEngine` honors a live engine's `preserveCustomModels`, but\n * that flag is only set on an AI SDK engine INSTANCE when the OpenAI provider\n * is pointed at an OpenAI-compatible gateway (a custom base URL — e.g. Ollama\n * Cloud or LiteLLM), whose model IDs are not in the built-in OpenAI catalog.\n * The static registry entry the settings actions pass to\n * `normalizeModelForEngine` cannot carry that runtime flag, so this async\n * helper reproduces the same decision — `ai-sdk:openai` AND a resolved base URL\n * — from the request's stored/deploy config. First-party OpenAI (no gateway)\n * returns false so an unknown/invalid model still normalizes to a supported one.\n */\nexport async function resolveEnginePreservesCustomModels(\n entry: Pick<AgentEngineEntry, \"name\">,\n): Promise<boolean> {\n if (entry.name !== \"ai-sdk:openai\") return false;\n try {\n return Boolean(await resolveOpenAiBaseUrl());\n } catch {\n return false;\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\") return hasUsableBuilderConnection();\n for (const key of entry.requiredEnvVars) {\n // A throw here means the credential store could not be read. Let it\n // propagate: swallowing it reports \"no provider connected\" to a user\n // whose key is sitting in a row we simply failed to load.\n if (!(await resolveUsableProviderSecret(key))) return false;\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\n/**\n * A Builder connection we could not read is not a missing connection. Throwing\n * keeps that distinction instead of reporting \"connect a provider\" to a user\n * whose org-shared keys exist but were unreadable.\n */\nasync function hasUsableBuilderConnection(): Promise<boolean> {\n const creds = await resolveBuilderCredentialsDetailed();\n assertCredentialStoreReadable(creds);\n return Boolean(creds.privateKey && creds.publicKey);\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 preferResolvedCredential = false,\n): Promise<Record<string, unknown>> {\n const safeExtra = { ...(extra ?? {}) };\n let matchingApiKey = apiKey;\n // Automatic engine selection must also select that engine's credential.\n // Callers historically passed one untagged \"active\" key before the registry\n // chose an engine, which could hand an Anthropic key to an app-default\n // OpenAI engine (or vice versa). Explicit engineOption branches retain their\n // paired key; automatic branches opt into matching the chosen provider here.\n if (\n preferResolvedCredential &&\n entry.name !== \"builder\" &&\n entry.requiredEnvVars.length > 0\n ) {\n let foundMatchingCredential = false;\n for (const key of entry.requiredEnvVars) {\n const resolved = (await resolveUsableProviderSecret(key)) ?? undefined;\n if (!resolved) continue;\n foundMatchingCredential = true;\n const deployFallback =\n canUseDeployCredentialFallbackForRequest(key) &&\n readDeployCredentialEnv(key) === resolved;\n // Keep deploy-only credentials implicit so provider SDKs retain their\n // established env-fallback behavior. Scoped credentials must be passed\n // explicitly, and replace an unrelated preselected provider key.\n if (matchingApiKey || !deployFallback) matchingApiKey = resolved;\n break;\n }\n if (!foundMatchingCredential) matchingApiKey = undefined;\n }\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, matchingApiKey, 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\") return hasUsableBuilderConnection();\n for (const key of entry.requiredEnvVars) {\n if (!(await resolveUsableProviderSecret(key))) 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\") return hasUsableBuilderConnection();\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 if (!(await resolveUsableProviderSecret(key))) 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 * Return the usable engine explicitly selected by the current user/org.\n *\n * This is intentionally narrower than {@link resolveEngine}: it only inspects\n * persisted app/global selections and does not auto-detect credentials or fall\n * back to deployment defaults. Callers that have their own configured fallback\n * (notably messaging integrations) can therefore honor the live request's\n * Agent settings before applying that fallback, while still resolving the API\n * key for the provider that was actually selected.\n */\nexport async function getConfiguredEngineNameForRequest(\n options: { appId?: string } = {},\n): Promise<string | undefined> {\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(\n options.appId,\n ).catch(() => null);\n if (appDefault?.engine) {\n const entry = _registry.get(appDefault.engine);\n if (entry && (await isStoredEngineUsableForRequest(appDefault, entry))) {\n return entry.name;\n }\n }\n\n let stored: { engine?: unknown; config?: unknown } | null = null;\n try {\n stored = (await getSetting(\"agent-engine\")) as {\n engine?: unknown;\n config?: unknown;\n } | null;\n } catch {\n return undefined;\n }\n if (typeof stored?.engine !== \"string\") return undefined;\n const entry = _registry.get(stored.engine);\n if (!entry || !(await isStoredEngineUsableForRequest(stored, entry))) {\n return undefined;\n }\n return entry.name;\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(\n await engineCreateConfigForEntry(entry, apiKey, undefined, true),\n );\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(\n await engineCreateConfigForEntry(entry, apiKey, undefined, true),\n );\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 true,\n ),\n );\n }\n }\n\n if (detectedFromUser) {\n return detectedFromUser.create(\n await engineCreateConfigForEntry(\n detectedFromUser,\n apiKey,\n undefined,\n true,\n ),\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(\n await engineCreateConfigForEntry(detected, apiKey, undefined, true),\n );\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 assertCredentialStoreReadable,\n canUseDeployCredentialFallbackForRequest,\n getProviderCredentialAuthFailure,\n readDeployCredentialEnv,\n resolveBuilderCredentialsDetailed,\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\n/**\n * True only when there is positive evidence this module is executing from a\n * bundled serverless function where optional dependencies were inlined into the\n * bundle and are therefore NOT resolvable via `require.resolve` — even though\n * the dynamic `import()` the engine uses to load them still works.\n *\n * Deliberately narrow. The Nitro Vercel/Netlify presets (which agent-native's\n * own `deploy` command emits) inline optional peers and always set these env\n * markers, so they are a reliable signal. Other serverless runtimes — a\n * container on Cloud Run / Google Cloud Functions (`K_SERVICE` /\n * `FUNCTION_TARGET`), or a plain AWS Lambda — commonly ship a real\n * `node_modules` where `require.resolve` is authoritative; there a resolve miss\n * means the package is genuinely absent and must NOT be masked. Those runtimes\n * are still covered *when the code is actually bundled*, via the module-path\n * check below, which stays false for a normal `node_modules` layout.\n */\nfunction isBundledServerlessRuntime(): boolean {\n const env = process.env;\n // Nitro's Vercel/Netlify presets inline optional peers into the function\n // bundle; these platforms always set these markers.\n if (env.VERCEL || env.NETLIFY) return true;\n // Otherwise require direct evidence that this module is running from inside a\n // bundle output directory (Vercel's `/var/task`, Nitro's `.output/server`,\n // inlined `_libs`). This is the real signal that `require.resolve` cannot be\n // trusted; it stays false for normal `node_modules` layouts (dev, tests, and\n // container/Lambda/Cloud Run deploys that ship their dependencies), so a\n // genuine \"package not installed\" miss still surfaces there.\n try {\n return /[\\\\/](?:_libs|\\.vercel|\\.netlify|\\.output)[\\\\/]|\\/var\\/task\\//.test(\n import.meta.url ?? \"\",\n );\n } catch {\n return false;\n }\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 // Bundled serverless runtimes (e.g. Nitro on Vercel/Netlify) inline optional\n // provider packages into the function bundle, so require.resolve cannot find\n // them even though the dynamic `import()` the engine actually uses to load\n // them works. Treat them as available there and let the engine's own import\n // be the real gate — it already fails with a clear \"pnpm add …\" message when\n // the package is genuinely missing. Without this, every engine-usability\n // gate rejects the AI-SDK engines at runtime and the agent silently falls\n // back to the native Anthropic engine.\n available = isBundledServerlessRuntime();\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 interface NormalizeModelOptions {\n /**\n * Force unrecognized (custom) model IDs to be kept verbatim, as if\n * `engine.preserveCustomModels` were set on a live engine instance.\n *\n * The settings actions call `normalizeModelForEngine` with a static registry\n * ENTRY, which never carries the runtime `preserveCustomModels` flag — that\n * is only set on the engine INSTANCE created with an OpenAI-compatible\n * `baseUrl`. They resolve the capability with\n * {@link resolveEnginePreservesCustomModels} and pass it here so a gateway\n * model (e.g. an Ollama `gemma4`) is not rewritten to the OpenAI default on\n * save/read. First-party OpenAI (no gateway) leaves this unset, so an unknown\n * or invalid model still normalizes to a supported one.\n */\n preserveCustomModels?: boolean;\n}\n\nexport function normalizeModelForEngine(\n engine: Pick<\n AgentEngine,\n \"name\" | \"defaultModel\" | \"supportedModels\" | \"preserveCustomModels\"\n >,\n model: string | null | undefined,\n options: NormalizeModelOptions = {},\n): string {\n const candidate = typeof model === \"string\" ? model.trim() : \"\";\n if (!candidate) return engine.defaultModel;\n\n // Preserve custom IDs verbatim BEFORE any catalog/version matching, so a\n // version-shaped gateway model that happens to share a family with a\n // built-in model (e.g. `gpt-5.4` on an OpenAI-compatible endpoint) is not\n // rewritten to a catalog entry.\n if (engine.preserveCustomModels || options.preserveCustomModels) {\n return candidate;\n }\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\n/**\n * Whether models saved or read for this engine ENTRY should be preserved\n * verbatim instead of normalized against the built-in catalog.\n *\n * `normalizeModelForEngine` honors a live engine's `preserveCustomModels`, but\n * that flag is only set on an AI SDK engine INSTANCE when the OpenAI provider\n * is pointed at an OpenAI-compatible gateway (a custom base URL — e.g. Ollama\n * Cloud or LiteLLM), whose model IDs are not in the built-in OpenAI catalog.\n * The static registry entry the settings actions pass to\n * `normalizeModelForEngine` cannot carry that runtime flag, so this async\n * helper reproduces the same decision — `ai-sdk:openai` AND a resolved base URL\n * — from the request's stored/deploy config. First-party OpenAI (no gateway)\n * returns false so an unknown/invalid model still normalizes to a supported one.\n */\nexport async function resolveEnginePreservesCustomModels(\n entry: Pick<AgentEngineEntry, \"name\">,\n): Promise<boolean> {\n if (entry.name !== \"ai-sdk:openai\") return false;\n try {\n return Boolean(await resolveOpenAiBaseUrl());\n } catch {\n return false;\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\") return hasUsableBuilderConnection();\n for (const key of entry.requiredEnvVars) {\n // A throw here means the credential store could not be read. Let it\n // propagate: swallowing it reports \"no provider connected\" to a user\n // whose key is sitting in a row we simply failed to load.\n if (!(await resolveUsableProviderSecret(key))) return false;\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\n/**\n * A Builder connection we could not read is not a missing connection. Throwing\n * keeps that distinction instead of reporting \"connect a provider\" to a user\n * whose org-shared keys exist but were unreadable.\n */\nasync function hasUsableBuilderConnection(): Promise<boolean> {\n const creds = await resolveBuilderCredentialsDetailed();\n assertCredentialStoreReadable(creds);\n return Boolean(creds.privateKey && creds.publicKey);\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\n/**\n * Return true only when the supplied key can be positively identified as a\n * usable credential for a different registered provider.\n *\n * `ResolveEngineConfig.apiKey` is public and may be an opaque caller-provided\n * key, so automatic selection must not silently replace it merely because a\n * stored credential also exists. Delegated/internal callers, however,\n * historically pass the current \"active\" provider key before the registry\n * selects an app-default engine. Exact in-memory comparison lets us correct\n * that proven mismatch without guessing from provider-specific key prefixes\n * or exposing either value.\n */\nasync function apiKeyBelongsToDifferentProvider(\n apiKey: string,\n selectedEntry: AgentEngineEntry,\n): Promise<boolean> {\n const selectedEnvVars = new Set(selectedEntry.requiredEnvVars);\n const checkedEnvVars = new Set<string>();\n for (const entry of _registry.values()) {\n if (entry === selectedEntry || entry.name === \"builder\") continue;\n for (const key of entry.requiredEnvVars) {\n if (selectedEnvVars.has(key) || checkedEnvVars.has(key)) continue;\n checkedEnvVars.add(key);\n try {\n if ((await resolveUsableProviderSecret(key)) === apiKey) return true;\n } catch {\n // An unrelated provider store failure is not proof that the explicit\n // key belongs elsewhere. Preserve the caller's key and let the\n // selected provider's own preflight report any relevant failure.\n }\n }\n }\n return false;\n}\n\nasync function engineCreateConfigForEntry(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n preferResolvedCredential = false,\n): Promise<Record<string, unknown>> {\n const safeExtra = { ...(extra ?? {}) };\n let matchingApiKey = apiKey;\n // Automatic engine selection must also select that engine's credential.\n // Callers historically passed one untagged \"active\" key before the registry\n // chose an engine, which could hand an Anthropic key to an app-default\n // OpenAI engine (or vice versa). Explicit engineOption branches retain their\n // paired key. Automatic branches replace only a key proven to belong to a\n // different configured provider; opaque caller-supplied keys keep the public\n // `ResolveEngineConfig.apiKey` contract.\n if (\n preferResolvedCredential &&\n entry.name !== \"builder\" &&\n entry.requiredEnvVars.length > 0\n ) {\n let resolvedMatchingCredential: string | undefined;\n let matchingCredentialUsesDeployFallback = false;\n for (const key of entry.requiredEnvVars) {\n const resolved = (await resolveUsableProviderSecret(key)) ?? undefined;\n if (!resolved) continue;\n resolvedMatchingCredential = resolved;\n matchingCredentialUsesDeployFallback =\n canUseDeployCredentialFallbackForRequest(key) &&\n readDeployCredentialEnv(key) === resolved;\n break;\n }\n\n const suppliedKeyMatchesSelected =\n matchingApiKey !== undefined &&\n matchingApiKey === resolvedMatchingCredential;\n const suppliedKeyBelongsElsewhere =\n matchingApiKey !== undefined &&\n !suppliedKeyMatchesSelected &&\n (await apiKeyBelongsToDifferentProvider(matchingApiKey, entry));\n\n if (matchingApiKey === undefined || suppliedKeyBelongsElsewhere) {\n // Keep deploy-only credentials implicit so provider SDKs retain their\n // established env-fallback behavior. Scoped credentials must be passed\n // explicitly. A proven different-provider key is replaced or cleared;\n // an opaque caller-supplied key is preserved by the branch above.\n matchingApiKey =\n resolvedMatchingCredential && !matchingCredentialUsesDeployFallback\n ? resolvedMatchingCredential\n : undefined;\n }\n }\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, matchingApiKey, 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\") return hasUsableBuilderConnection();\n for (const key of entry.requiredEnvVars) {\n if (!(await resolveUsableProviderSecret(key))) 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\") return hasUsableBuilderConnection();\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 if (!(await resolveUsableProviderSecret(key))) 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 * Return the usable engine explicitly selected by the current user/org.\n *\n * This is intentionally narrower than {@link resolveEngine}: it only inspects\n * persisted app/global selections and does not auto-detect credentials or fall\n * back to deployment defaults. Callers that have their own configured fallback\n * (notably messaging integrations) can therefore honor the live request's\n * Agent settings before applying that fallback, while still resolving the API\n * key for the provider that was actually selected.\n */\nexport async function getConfiguredEngineNameForRequest(\n options: { appId?: string } = {},\n): Promise<string | undefined> {\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(\n options.appId,\n ).catch(() => null);\n if (appDefault?.engine) {\n const entry = _registry.get(appDefault.engine);\n if (entry && (await isStoredEngineUsableForRequest(appDefault, entry))) {\n return entry.name;\n }\n }\n\n let stored: { engine?: unknown; config?: unknown } | null = null;\n try {\n stored = (await getSetting(\"agent-engine\")) as {\n engine?: unknown;\n config?: unknown;\n } | null;\n } catch {\n return undefined;\n }\n if (typeof stored?.engine !== \"string\") return undefined;\n const entry = _registry.get(stored.engine);\n if (!entry || !(await isStoredEngineUsableForRequest(stored, entry))) {\n return undefined;\n }\n return entry.name;\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(\n await engineCreateConfigForEntry(entry, apiKey, undefined, true),\n );\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(\n await engineCreateConfigForEntry(entry, apiKey, undefined, true),\n );\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 true,\n ),\n );\n }\n }\n\n if (detectedFromUser) {\n return detectedFromUser.create(\n await engineCreateConfigForEntry(\n detectedFromUser,\n apiKey,\n undefined,\n true,\n ),\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(\n await engineCreateConfigForEntry(detected, apiKey, undefined, true),\n );\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, undefined, true),\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 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/application-state/store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAyF9D,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAgBzC;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAsBzD;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,MAAM,WAAW,8BAA8B;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AA0GD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,8BAA8B,EAAE,EACrD,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CA+FlB;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC,CAWjE;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/application-state/store.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAyF9D,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CASzC;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAiBzD;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,MAAM,WAAW,8BAA8B;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AA0GD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,8BAA8B,EAAE,EACrD,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,OAAO,CAAC,CA+FlB;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAAC,CAWjE;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}