@agent-native/core 0.119.4 → 0.119.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +14 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/durable-background.ts +1 -0
- package/corpus/core/src/agent/engine/index.ts +2 -0
- package/corpus/core/src/agent/engine/registry.ts +95 -2
- package/corpus/core/src/deploy/build.ts +144 -2
- package/corpus/core/src/deploy/workspace-deploy.ts +123 -1
- package/corpus/core/src/integrations/integration-durable-dispatch-config.ts +22 -0
- package/corpus/core/src/integrations/integration-durable-dispatch.ts +190 -0
- package/corpus/core/src/integrations/pending-tasks-retry-job.ts +175 -87
- package/corpus/core/src/integrations/pending-tasks-store.ts +114 -11
- package/corpus/core/src/integrations/plugin.ts +113 -60
- package/corpus/core/src/integrations/task-queue-stats.ts +68 -15
- package/corpus/core/src/integrations/webhook-handler.ts +21 -46
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +8 -0
- package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +5 -1
- package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +9 -1
- package/corpus/core/src/server/auth.ts +6 -0
- package/corpus/core/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/corpus/core/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/corpus/core/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/corpus/templates/dispatch/changelog/2026-07-21-recover-stalled-slack-agent-work.md +6 -0
- package/corpus/templates/slides/actions/patch-deck.ts +2 -1
- package/corpus/templates/slides/changelog/2026-07-23-opening-or-refining-a-deck-no-longer-crashes-with-a-blank-er.md +6 -0
- package/corpus/templates/slides/shared/aspect-ratios.ts +4 -1
- package/corpus/templates/tasks/.oxfmtrc.json +8 -0
- package/corpus/templates/tasks/AGENTS.md +34 -41
- package/corpus/templates/tasks/README.md +13 -6
- package/corpus/templates/tasks/actions/bulk-delete-inbox-items.ts +10 -8
- package/corpus/templates/tasks/actions/bulk-delete-tasks.ts +10 -8
- package/corpus/templates/tasks/actions/bulk-mark-inbox-items-ready.ts +1 -1
- package/corpus/templates/tasks/actions/bulk-update-tasks.ts +12 -10
- package/corpus/templates/tasks/actions/create-inbox-item.ts +7 -4
- package/corpus/templates/tasks/actions/create-task.ts +2 -1
- package/corpus/templates/tasks/actions/delete-inbox-item.ts +6 -4
- package/corpus/templates/tasks/actions/delete-task.ts +1 -1
- package/corpus/templates/tasks/actions/list-inbox-items.ts +4 -2
- package/corpus/templates/tasks/actions/list-visible-task-fields.ts +3 -1
- package/corpus/templates/tasks/actions/mark-inbox-item-ready.ts +6 -4
- package/corpus/templates/tasks/actions/navigate.ts +16 -14
- package/corpus/templates/tasks/actions/reorder-inbox-items.ts +9 -7
- package/corpus/templates/tasks/actions/update-inbox-item.ts +6 -4
- package/corpus/templates/tasks/actions/update-task.ts +12 -9
- package/corpus/templates/tasks/actions/update-visible-task-fields.ts +10 -8
- package/corpus/templates/tasks/actions/view-screen.ts +1 -1
- package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +15 -0
- package/corpus/templates/tasks/changelog/2026-07-23-task-detail-extensions.md +6 -0
- package/corpus/templates/tasks/drizzle.config.ts +3 -0
- package/corpus/templates/tasks/package.json +4 -1
- package/corpus/templates/tasks/server/db/schema.ts +0 -10
- package/corpus/templates/tasks/server/db/test-tasks-table.ts +0 -5
- package/corpus/templates/tasks/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/tasks/server/plugins/db.ts +43 -10
- package/corpus/templates/tasks/server/user-config/store.ts +42 -81
- package/corpus/templates/tasks/tsconfig.json +1 -2
- package/corpus/templates/tasks/vitest.config.ts +10 -1
- package/dist/agent/durable-background.d.ts +1 -0
- package/dist/agent/durable-background.d.ts.map +1 -1
- package/dist/agent/durable-background.js +1 -0
- package/dist/agent/durable-background.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +32 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +75 -3
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/deploy/build.d.ts +3 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +106 -3
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/workspace-deploy.d.ts.map +1 -1
- package/dist/deploy/workspace-deploy.js +103 -2
- package/dist/deploy/workspace-deploy.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/integration-durable-dispatch-config.d.ts +7 -0
- package/dist/integrations/integration-durable-dispatch-config.d.ts.map +1 -0
- package/dist/integrations/integration-durable-dispatch-config.js +16 -0
- package/dist/integrations/integration-durable-dispatch-config.js.map +1 -0
- package/dist/integrations/integration-durable-dispatch.d.ts +23 -0
- package/dist/integrations/integration-durable-dispatch.d.ts.map +1 -0
- package/dist/integrations/integration-durable-dispatch.js +115 -0
- package/dist/integrations/integration-durable-dispatch.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts +13 -1
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +133 -74
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +14 -2
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-store.js +75 -11
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +88 -55
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/task-queue-stats.d.ts +15 -3
- package/dist/integrations/task-queue-stats.d.ts.map +1 -1
- package/dist/integrations/task-queue-stats.js +45 -15
- package/dist/integrations/task-queue-stats.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +18 -42
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +5 -5
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +5 -5
- package/dist/provider-api/actions/provider-api.d.ts +4 -4
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +8 -2
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +5 -2
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +9 -2
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/secrets/routes.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +5 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/templates/default/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/dist/templates/headless/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/package.json +1 -1
- package/src/agent/durable-background.ts +1 -0
- package/src/agent/engine/index.ts +2 -0
- package/src/agent/engine/registry.ts +95 -2
- package/src/deploy/build.ts +144 -2
- package/src/deploy/workspace-deploy.ts +123 -1
- package/src/integrations/integration-durable-dispatch-config.ts +22 -0
- package/src/integrations/integration-durable-dispatch.ts +190 -0
- package/src/integrations/pending-tasks-retry-job.ts +175 -87
- package/src/integrations/pending-tasks-store.ts +114 -11
- package/src/integrations/plugin.ts +113 -60
- package/src/integrations/task-queue-stats.ts +68 -15
- package/src/integrations/webhook-handler.ts +21 -46
- package/src/scripts/agent-engines/list-agent-engines.ts +8 -0
- package/src/scripts/agent-engines/manage-agent-engine.ts +5 -1
- package/src/scripts/agent-engines/set-agent-engine.ts +9 -1
- package/src/server/auth.ts +6 -0
- package/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +63 -22
- package/corpus/templates/tasks/.prettierrc +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Engine Registry.\n *\n * Mirrors the CLI_REGISTRY pattern (packages/core/src/terminal/cli-registry.ts)\n * but is open — anyone can register a custom engine via registerAgentEngine()\n * from a server plugin at startup.\n *\n * Built-in engines (anthropic, ai-sdk) are auto-registered by builtin.ts.\n */\n\nimport { createRequire } from \"node:module\";\n\nimport {\n canUseDeployCredentialFallbackForRequest,\n getProviderCredentialAuthFailure,\n readDeployCredentialEnv,\n resolveBuilderCredentials,\n resolveSecret,\n} from \"../../server/credential-provider.js\";\nimport { getSetting } from \"../../settings/store.js\";\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../app-model-defaults.js\";\nimport {\n normalizeOpenAiBaseUrl,\n OPENAI_BASE_URL_ENV_VAR,\n} from \"./openai-compatible-endpoint.js\";\nimport type { AgentEngine, EngineCapabilities } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport interface AgentEngineEntry {\n /** Unique name, e.g. \"anthropic\", \"ai-sdk:anthropic\", \"ai-sdk:openai\" */\n name: string;\n /** Human-readable label for UI */\n label: string;\n /** Short description for engine picker */\n description: string;\n /** npm package hint displayed in UI when package is missing */\n installPackage?: string;\n /** Engine capabilities */\n capabilities: EngineCapabilities;\n /** Default model string */\n defaultModel: string;\n /** All supported models (shown in model picker) */\n supportedModels: readonly string[];\n /** Environment variables required for this engine to work */\n requiredEnvVars: string[];\n /** Create an engine instance from config */\n create(config: Record<string, unknown>): AgentEngine;\n}\n\nconst _registry = new Map<string, AgentEngineEntry>();\nconst _packageAvailabilityCache = new Map<string, boolean>();\n\n/**\n * Register a custom agent engine. Called at server startup (e.g., from a\n * server plugin or builtin.ts). Throws if name is already registered.\n */\nexport function registerAgentEngine(entry: AgentEngineEntry): void {\n if (_registry.has(entry.name)) {\n // Allow re-registration in tests / hot-reload — just overwrite\n if (process.env.NODE_ENV === \"test\") {\n _registry.set(entry.name, entry);\n return;\n }\n console.warn(\n `[agent-engine] Engine \"${entry.name}\" is already registered. Skipping.`,\n );\n return;\n }\n _registry.set(entry.name, entry);\n}\n\n/** Get a registered engine entry by name, or undefined if not found */\nexport function getAgentEngineEntry(\n name: string,\n): AgentEngineEntry | undefined {\n return _registry.get(name);\n}\n\n/** List all registered engine entries */\nexport function listAgentEngines(): AgentEngineEntry[] {\n return Array.from(_registry.values());\n}\n\nfunction packageNameFromInstallSpecifier(specifier: string): string | null {\n const trimmed = specifier.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith(\"-\")) return null;\n if (trimmed.startsWith(\"@\")) {\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex === -1) return trimmed;\n const versionIndex = trimmed.indexOf(\"@\", slashIndex + 1);\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n }\n const versionIndex = trimmed.indexOf(\"@\");\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n}\n\nfunction canResolvePackage(packageName: string): boolean {\n const cached = _packageAvailabilityCache.get(packageName);\n if (cached !== undefined) return cached;\n let available = false;\n try {\n require.resolve(packageName);\n available = true;\n } catch {\n available = false;\n }\n _packageAvailabilityCache.set(packageName, available);\n return available;\n}\n\nexport function isAgentEnginePackageInstalled(\n entry: AgentEngineEntry,\n): boolean {\n const packageNames =\n entry.installPackage\n ?.split(/\\s+/)\n .map(packageNameFromInstallSpecifier)\n .filter((name): name is string => Boolean(name)) ?? [];\n return packageNames.every(canResolvePackage);\n}\n\ninterface ParsedVersionedModelId {\n family: string;\n version: number[];\n suffix: string;\n}\n\nfunction parseVersionedModelId(model: string): ParsedVersionedModelId | null {\n const match =\n /^(?<family>.+?)[-.](?<version>\\d+(?:[-.]\\d+)*)(?<suffix>(?:[-.][a-z][a-z0-9]*)*)$/i.exec(\n model.trim().toLowerCase(),\n );\n const groups = match?.groups;\n if (!groups?.family || !groups.version) return null;\n\n const version = groups.version.split(/[-.]/).map((part) => Number(part));\n if (version.some((part) => !Number.isSafeInteger(part))) return null;\n\n return {\n family: groups.family,\n version,\n suffix: groups.suffix ?? \"\",\n };\n}\n\nfunction compareModelVersions(left: number[], right: number[]): number {\n const length = Math.max(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const delta = (left[index] ?? 0) - (right[index] ?? 0);\n if (delta !== 0) return delta;\n }\n return 0;\n}\n\nfunction findLatestSupportedVersionMatch(\n candidate: string,\n supportedModels: readonly string[],\n): string | undefined {\n const parsedCandidate = parseVersionedModelId(candidate);\n if (!parsedCandidate) return undefined;\n\n let best: { model: string; version: number[] } | undefined;\n for (const supportedModel of supportedModels) {\n const parsedSupported = parseVersionedModelId(supportedModel);\n if (!parsedSupported) continue;\n if (parsedSupported.family !== parsedCandidate.family) continue;\n if (parsedSupported.suffix !== parsedCandidate.suffix) continue;\n if (\n best &&\n compareModelVersions(parsedSupported.version, best.version) <= 0\n ) {\n continue;\n }\n best = { model: supportedModel, version: parsedSupported.version };\n }\n\n return best?.model;\n}\n\nexport function normalizeModelForEngine(\n engine: Pick<\n AgentEngine,\n \"name\" | \"defaultModel\" | \"supportedModels\" | \"preserveCustomModels\"\n >,\n model: string | null | undefined,\n): string {\n const candidate = typeof model === \"string\" ? model.trim() : \"\";\n if (!candidate) return engine.defaultModel;\n\n if (engine.preserveCustomModels) return candidate;\n\n if (engine.supportedModels.length === 0) return candidate;\n\n if (candidate === \"auto\" || engine.supportedModels.includes(candidate)) {\n return candidate;\n }\n\n return (\n findLatestSupportedVersionMatch(candidate, engine.supportedModels) ??\n engine.defaultModel\n );\n}\n\nfunction assertAgentEnginePackageInstalled(entry: AgentEngineEntry): void {\n if (isAgentEnginePackageInstalled(entry)) return;\n const installHint = entry.installPackage\n ? ` Run: pnpm add ${entry.installPackage}`\n : \"\";\n throw new Error(\n `[agent-engine] Engine \"${entry.name}\" requires optional packages that are not installed in this app.${installHint}`,\n );\n}\n\n/**\n * First registered engine whose requiredEnvVars are all set. Registration\n * order controls priority — the Builder gateway is registered first so it\n * wins when the Builder private key is present.\n *\n * Escape hatch: AGENT_ENGINE_PREFER_BYO_KEY=true skips the Builder engine\n * on the first pass, so an explicit provider key (ANTHROPIC_API_KEY etc.)\n * is picked instead. Builder is still used as the fallback when no other\n * provider key is set.\n *\n * This sync helper is for CLI/status callers that cannot await settings. Prefer\n * {@link detectEngineFromEnvForRequest} at request time so sticky auth-failure\n * markers can skip rejected deploy keys.\n */\nexport function detectEngineFromEnv(): AgentEngineEntry | null {\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (entry.requiredEnvVars.length === 0) continue;\n if (!isAgentEnginePackageInstalled(entry)) continue;\n if (\n entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n )\n ) {\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (entry.requiredEnvVars.length === 0) continue;\n if (!isAgentEnginePackageInstalled(entry)) continue;\n if (\n entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n )\n ) {\n return entry;\n }\n }\n return null;\n}\n\nasync function envKeyUsableForEntry(\n entry: AgentEngineEntry,\n key: string,\n): Promise<boolean> {\n if (\n !(\n canUseDeployCredentialFallbackForRequest(key) &&\n !!readDeployCredentialEnv(key)\n )\n ) {\n return false;\n }\n if (entry.name === \"builder\") {\n return true;\n }\n const value = readDeployCredentialEnv(key);\n if (!value) return false;\n return !(await getProviderCredentialAuthFailure({ key, value }));\n}\n\nasync function hasUsableEnvKeys(entry: AgentEngineEntry): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return false;\n for (const key of entry.requiredEnvVars) {\n if (!(await envKeyUsableForEntry(entry, key))) return false;\n }\n return true;\n}\n\n/**\n * Request-aware env auto-detect. Same priority as {@link detectEngineFromEnv},\n * but skips provider keys that currently have an auth-failure marker so a\n * rejected deploy key does not permanently win selection and leave chat stuck\n * on `missing_credentials`.\n */\nexport async function detectEngineFromEnvForRequest(): Promise<AgentEngineEntry | null> {\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasUsableEnvKeys(entry)) return entry;\n }\n }\n\n for (const entry of _registry.values()) {\n if (await hasUsableEnvKeys(entry)) return entry;\n }\n return null;\n}\n\nfunction shouldTraceEngineDetection(): boolean {\n return /^(1|true)$/i.test(\n process.env.AGENT_NATIVE_DEBUG_AGENT_ENGINE_DETECT ??\n process.env.AGENT_NATIVE_DEBUG_CREDENTIAL_RESOLVE ??\n \"\",\n );\n}\n\n/**\n * Detect a usable engine from the current request user's accessible\n * `app_secrets` rows. Mirrors `detectEngineFromEnv` but consults the\n * encrypted secret store instead of `process.env`, including org-scoped\n * credentials shared with the active organization.\n *\n * Required because the Builder OAuth callback (and the settings UI's\n * \"paste your own key\" flow) writes credentials to app_secrets, not env.\n * Without this check, a user who connected Builder would see status\n * \"configured\" but the next chat turn would fall through to the default\n * Anthropic engine and hit `missing_api_key` — exactly Brent's symptom\n * on the docs site (Loom 2026-04-28: \"It doesn't seem to realize I'm\n * connected once I do a chat\").\n *\n * Includes the local dev session (`local@localhost`): the Builder\n * OAuth flow writes credentials scoped to that email when run from\n * `pnpm dev`, so detection has to consult those rows or the dev user\n * sees the same \"Connect your AI\" card after they've already connected\n * (Sami, 2026-04-30). Org-scoped Builder credentials must also count here:\n * `/builder/status` resolves them via the same request org context, and the\n * chat engine picker must not disagree with that card.\n */\nexport async function detectEngineFromUserSecrets(): Promise<AgentEngineEntry | null> {\n const traceLookup = shouldTraceEngineDetection();\n let email: string | undefined;\n let orgId: string | null | undefined;\n try {\n const { getRequestUserEmail, getRequestOrgId } =\n await import(\"../../server/request-context.js\");\n email = getRequestUserEmail();\n orgId = getRequestOrgId();\n } catch {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-request-context email=(unknown) orgId=(unknown)`,\n );\n }\n return null;\n }\n if (!email) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-email email=(empty) orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n }\n\n const hasAllKeys = async (entry: AgentEngineEntry): Promise<boolean> => {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return false;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (!(await resolveUsableProviderSecret(key))) return false;\n } catch {\n return false;\n }\n }\n return true;\n };\n\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"} byo=true`,\n );\n }\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return entry;\n }\n }\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-engine-keys-found email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n}\n\n/**\n * Legacy inline API keys on the global `agent-engine` settings row are\n * intentionally ignored. That row is deployment-wide, so treating\n * `{ apiKey }` or `{ config: { apiKey } }` as configured would let one\n * user's pasted key power every other user. Per-user keys live in\n * `app_secrets` and are resolved separately.\n */\nexport function isAgentEngineSettingConfigured(stored: unknown): boolean {\n if (!stored || typeof stored !== \"object\") return false;\n const s = stored as {\n engine?: unknown;\n };\n if (typeof s.engine !== \"string\" || !s.engine) return false;\n return false;\n}\n\nfunction stripInlineApiKeyConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!config) return {};\n const { apiKey: _discardedApiKey, ...safeConfig } = config;\n return safeConfig;\n}\n\nfunction canUseDeployEnvForEntry(entry: AgentEngineEntry): boolean {\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every((key) =>\n canUseDeployCredentialFallbackForRequest(key),\n );\n}\n\nfunction engineCreateConfig(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n apiKey,\n allowEnvFallback: canUseDeployEnvForEntry(entry),\n ...(extra ?? {}),\n };\n}\n\nasync function resolveOpenAiBaseUrl(): Promise<string | undefined> {\n let raw: string | null | undefined = null;\n try {\n raw = await resolveSecret(OPENAI_BASE_URL_ENV_VAR);\n } catch {\n raw = null;\n }\n\n if (\n !raw &&\n canUseDeployCredentialFallbackForRequest(OPENAI_BASE_URL_ENV_VAR)\n ) {\n raw = readDeployCredentialEnv(OPENAI_BASE_URL_ENV_VAR);\n }\n\n return raw ? normalizeOpenAiBaseUrl(raw) : undefined;\n}\n\nasync function resolveUsableProviderSecret(\n key: string,\n): Promise<string | null> {\n const value = await resolveSecret(key);\n if (!value) return null;\n const authFailure = await getProviderCredentialAuthFailure({ key, value });\n return authFailure ? null : value;\n}\n\nasync function engineCreateConfigForEntry(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const safeExtra = { ...(extra ?? {}) };\n if (entry.name === \"ai-sdk:openai\") {\n if (typeof safeExtra.baseURL === \"string\" && safeExtra.baseUrl == null) {\n safeExtra.baseUrl = normalizeOpenAiBaseUrl(safeExtra.baseURL);\n }\n if (safeExtra.baseUrl == null) {\n const baseUrl = await resolveOpenAiBaseUrl();\n if (baseUrl) safeExtra.baseUrl = baseUrl;\n }\n }\n return engineCreateConfig(entry, apiKey, safeExtra);\n}\n\n/**\n * True when the stored `agent-engine` row points at a registered engine\n * AND an API key for it is reachable via the engine's required env vars.\n * Inline keys on the global settings row are ignored; see\n * `isAgentEngineSettingConfigured`.\n *\n * Sync helper for CLI/status. Prefer {@link isStoredEngineUsableForRequest}\n * so sticky auth-failure markers are respected.\n */\nexport function isStoredEngineUsable(\n stored: unknown,\n entry: AgentEngineEntry,\n): boolean {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n );\n}\n\n/**\n * Request-aware version of `isStoredEngineUsable`.\n *\n * The settings row stores the selected engine/model, while credentials may\n * live in per-user/org `app_secrets`. The sync helper intentionally only sees\n * deploy env vars; this async helper is what request-time routes should use\n * when deciding whether a stored engine can actually run for the current user.\n */\nexport async function isStoredEngineUsableForRequest(\n stored: unknown,\n entry: AgentEngineEntry,\n): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\n/**\n * Request-aware credential preflight for an already-resolved engine instance.\n * `resolveEngine()` may still return a default or explicitly requested engine\n * object before credentials are actually usable; call this before starting a\n * user-visible run so missing providers fail immediately.\n */\nexport async function isResolvedEngineUsableForRequest(\n engine: AgentEngine,\n options: { apiKey?: string } = {},\n): Promise<boolean> {\n const entry = _registry.get(engine.name);\n // Custom engines may have their own credential contract outside the core\n // registry metadata, so do not block them speculatively.\n if (!entry) return true;\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return true;\n\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n\n if (options.apiKey?.trim()) {\n const key = entry.requiredEnvVars[0];\n if (!key) return true;\n return !(await getProviderCredentialAuthFailure({\n key,\n value: options.apiKey,\n }));\n }\n\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\nexport interface ResolveEngineConfig {\n /** Explicit engine name or instance from createAgentChatPlugin options */\n engineOption?:\n | string\n | AgentEngine\n | { name: string; config: Record<string, unknown> };\n /** API key (used as config for the resolved engine) */\n apiKey?: string;\n /** Model override (used as part of engine config) */\n model?: string;\n /** App/template id used for org-scoped per-app model defaults. */\n appId?: string;\n}\n\n/**\n * 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(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(appId);\n if (appDefault?.engine) {\n const entry = _registry.get(appDefault.engine);\n if (entry && (await isStoredEngineUsableForRequest(appDefault, entry))) {\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n let stored: { engine?: unknown; config?: unknown } | null = null;\n try {\n stored = (await getSetting(\"agent-engine\")) as typeof stored;\n } catch {\n // Settings not available — fall through\n }\n\n // Auto-detect from the current user's per-user `app_secrets` rows\n // (Builder OAuth callback + \"paste your own key\" settings flow write here,\n // not env). Stored/app defaults are checked first so an explicit provider\n // selection can override a connected Builder account.\n const detectedFromUser = await detectEngineFromUserSecrets();\n\n // 6. Settings store — only when the stored row's API key is reachable.\n // This explicit selection beats automatic Builder detection so users can\n // switch away from Builder credits by saving/applying their own provider key.\n const storedRaw = stored as { engine?: unknown; config?: unknown } | null;\n const storedEngine = storedRaw?.engine;\n const storedConfig = storedRaw?.config;\n if (storedRaw && typeof storedEngine === \"string\") {\n const entry = _registry.get(storedEngine);\n if (entry && (await isStoredEngineUsableForRequest(storedRaw, entry))) {\n return entry.create(\n await engineCreateConfigForEntry(\n entry,\n apiKey,\n stripInlineApiKeyConfig(\n storedConfig as Record<string, unknown> | undefined,\n ),\n ),\n );\n }\n }\n\n if (detectedFromUser) {\n return detectedFromUser.create(\n await engineCreateConfigForEntry(detectedFromUser, apiKey),\n );\n }\n\n // 8. Auto-detect from any provider env var — so just dropping a key in\n // .env works without also setting AGENT_ENGINE. Skip keys with active\n // auth-failure markers so a rejected deploy key cannot permanently win.\n const detected = await detectEngineFromEnvForRequest();\n if (detected) {\n return detected.create(await engineCreateConfigForEntry(detected, apiKey));\n }\n\n // 9. Default: anthropic\n const anthropicEntry = _registry.get(\"anthropic\");\n if (!anthropicEntry) {\n throw new Error(\n \"[agent-engine] Default Anthropic engine is not registered. Did builtin.ts fail to load?\",\n );\n }\n return anthropicEntry.create(\n await engineCreateConfigForEntry(anthropicEntry, apiKey),\n );\n}\n\n/**\n * Read the user-selected model for an engine from the `agent-engine` setting.\n *\n * The settings UI writes `{engine, model}` via the `manage-agent-engine` action=\"set\",\n * but `resolveEngine` only uses the stored engine (the model is a separate\n * per-request concern). Call this helper alongside `resolveEngine` to honor\n * the user's model choice without requiring a process restart.\n *\n * Returns the stored model only when the stored engine name matches `engine`\n * — otherwise returns `undefined` to avoid applying an Anthropic model string\n * to, say, an OpenRouter engine.\n */\nexport async function getStoredModelForEngine(\n engine: AgentEngine | string,\n options: { appId?: string } = {},\n): Promise<string | undefined> {\n const engineName = typeof engine === \"string\" ? engine : engine.name;\n try {\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(\n options.appId,\n );\n if (\n appDefault?.engine === engineName &&\n typeof appDefault.model === \"string\" &&\n appDefault.model.length > 0\n ) {\n return appDefault.model;\n }\n } catch {\n // Settings/request context may not be available — fall through.\n }\n\n try {\n const stored = await getSetting(\"agent-engine\");\n if (\n stored &&\n typeof stored.engine === \"string\" &&\n stored.engine === engineName &&\n typeof stored.model === \"string\" &&\n stored.model.length > 0\n ) {\n return stored.model;\n }\n } catch {\n // Settings store not ready (fresh install, migration pending) — skip.\n }\n return undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agent/engine/registry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Agent Engine Registry.\n *\n * Mirrors the CLI_REGISTRY pattern (packages/core/src/terminal/cli-registry.ts)\n * but is open — anyone can register a custom engine via registerAgentEngine()\n * from a server plugin at startup.\n *\n * Built-in engines (anthropic, ai-sdk) are auto-registered by builtin.ts.\n */\n\nimport { createRequire } from \"node:module\";\n\nimport {\n canUseDeployCredentialFallbackForRequest,\n getProviderCredentialAuthFailure,\n readDeployCredentialEnv,\n resolveBuilderCredentials,\n resolveSecret,\n} from \"../../server/credential-provider.js\";\nimport { getSetting } from \"../../settings/store.js\";\nimport { getAgentAppModelDefaultForCurrentRequest } from \"../app-model-defaults.js\";\nimport {\n normalizeOpenAiBaseUrl,\n OPENAI_BASE_URL_ENV_VAR,\n} from \"./openai-compatible-endpoint.js\";\nimport type { AgentEngine, EngineCapabilities } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport interface AgentEngineEntry {\n /** Unique name, e.g. \"anthropic\", \"ai-sdk:anthropic\", \"ai-sdk:openai\" */\n name: string;\n /** Human-readable label for UI */\n label: string;\n /** Short description for engine picker */\n description: string;\n /** npm package hint displayed in UI when package is missing */\n installPackage?: string;\n /** Engine capabilities */\n capabilities: EngineCapabilities;\n /** Default model string */\n defaultModel: string;\n /** All supported models (shown in model picker) */\n supportedModels: readonly string[];\n /** Environment variables required for this engine to work */\n requiredEnvVars: string[];\n /** Create an engine instance from config */\n create(config: Record<string, unknown>): AgentEngine;\n}\n\nconst _registry = new Map<string, AgentEngineEntry>();\nconst _packageAvailabilityCache = new Map<string, boolean>();\n\n/**\n * Register a custom agent engine. Called at server startup (e.g., from a\n * server plugin or builtin.ts). Throws if name is already registered.\n */\nexport function registerAgentEngine(entry: AgentEngineEntry): void {\n if (_registry.has(entry.name)) {\n // Allow re-registration in tests / hot-reload — just overwrite\n if (process.env.NODE_ENV === \"test\") {\n _registry.set(entry.name, entry);\n return;\n }\n console.warn(\n `[agent-engine] Engine \"${entry.name}\" is already registered. Skipping.`,\n );\n return;\n }\n _registry.set(entry.name, entry);\n}\n\n/** Get a registered engine entry by name, or undefined if not found */\nexport function getAgentEngineEntry(\n name: string,\n): AgentEngineEntry | undefined {\n return _registry.get(name);\n}\n\n/** List all registered engine entries */\nexport function listAgentEngines(): AgentEngineEntry[] {\n return Array.from(_registry.values());\n}\n\nfunction packageNameFromInstallSpecifier(specifier: string): string | null {\n const trimmed = specifier.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith(\"-\")) return null;\n if (trimmed.startsWith(\"@\")) {\n const slashIndex = trimmed.indexOf(\"/\");\n if (slashIndex === -1) return trimmed;\n const versionIndex = trimmed.indexOf(\"@\", slashIndex + 1);\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n }\n const versionIndex = trimmed.indexOf(\"@\");\n return versionIndex === -1 ? trimmed : trimmed.slice(0, versionIndex);\n}\n\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\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (!(await resolveUsableProviderSecret(key))) return false;\n } catch {\n return false;\n }\n }\n return true;\n };\n\n const preferByo = /^(1|true)$/i.test(\n process.env.AGENT_ENGINE_PREFER_BYO_KEY ?? \"\",\n );\n\n if (preferByo) {\n for (const entry of _registry.values()) {\n if (entry.name === \"builder\") continue;\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"} byo=true`,\n );\n }\n return entry;\n }\n }\n // No BYO key matched — fall through to include Builder as fallback.\n }\n\n for (const entry of _registry.values()) {\n if (await hasAllKeys(entry)) {\n if (traceLookup) {\n console.log(\n `[engine-detect] result=${entry.name} email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return entry;\n }\n }\n if (traceLookup) {\n console.log(\n `[engine-detect] result=null reason=no-engine-keys-found email=${email} orgId=${orgId ?? \"(none)\"}`,\n );\n }\n return null;\n}\n\n/**\n * Legacy inline API keys on the global `agent-engine` settings row are\n * intentionally ignored. That row is deployment-wide, so treating\n * `{ apiKey }` or `{ config: { apiKey } }` as configured would let one\n * user's pasted key power every other user. Per-user keys live in\n * `app_secrets` and are resolved separately.\n */\nexport function isAgentEngineSettingConfigured(stored: unknown): boolean {\n if (!stored || typeof stored !== \"object\") return false;\n const s = stored as {\n engine?: unknown;\n };\n if (typeof s.engine !== \"string\" || !s.engine) return false;\n return false;\n}\n\nfunction stripInlineApiKeyConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n if (!config) return {};\n const { apiKey: _discardedApiKey, ...safeConfig } = config;\n return safeConfig;\n}\n\nfunction canUseDeployEnvForEntry(entry: AgentEngineEntry): boolean {\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every((key) =>\n canUseDeployCredentialFallbackForRequest(key),\n );\n}\n\nfunction engineCreateConfig(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n apiKey,\n allowEnvFallback: canUseDeployEnvForEntry(entry),\n ...(extra ?? {}),\n };\n}\n\nasync function resolveOpenAiBaseUrl(): Promise<string | undefined> {\n let raw: string | null | undefined = null;\n try {\n raw = await resolveSecret(OPENAI_BASE_URL_ENV_VAR);\n } catch {\n raw = null;\n }\n\n if (\n !raw &&\n canUseDeployCredentialFallbackForRequest(OPENAI_BASE_URL_ENV_VAR)\n ) {\n raw = readDeployCredentialEnv(OPENAI_BASE_URL_ENV_VAR);\n }\n\n return raw ? normalizeOpenAiBaseUrl(raw) : undefined;\n}\n\nasync function resolveUsableProviderSecret(\n key: string,\n): Promise<string | null> {\n const value = await resolveSecret(key);\n if (!value) return null;\n const authFailure = await getProviderCredentialAuthFailure({ key, value });\n return authFailure ? null : value;\n}\n\nasync function engineCreateConfigForEntry(\n entry: AgentEngineEntry,\n apiKey: string | undefined,\n extra?: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n const safeExtra = { ...(extra ?? {}) };\n if (entry.name === \"ai-sdk:openai\") {\n if (typeof safeExtra.baseURL === \"string\" && safeExtra.baseUrl == null) {\n safeExtra.baseUrl = normalizeOpenAiBaseUrl(safeExtra.baseURL);\n }\n if (safeExtra.baseUrl == null) {\n const baseUrl = await resolveOpenAiBaseUrl();\n if (baseUrl) safeExtra.baseUrl = baseUrl;\n }\n }\n return engineCreateConfig(entry, apiKey, safeExtra);\n}\n\n/**\n * True when the stored `agent-engine` row points at a registered engine\n * AND an API key for it is reachable via the engine's required env vars.\n * Inline keys on the global settings row are ignored; see\n * `isAgentEngineSettingConfigured`.\n *\n * Sync helper for CLI/status. Prefer {@link isStoredEngineUsableForRequest}\n * so sticky auth-failure markers are respected.\n */\nexport function isStoredEngineUsable(\n stored: unknown,\n entry: AgentEngineEntry,\n): boolean {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n return entry.requiredEnvVars.every(\n (v) =>\n canUseDeployCredentialFallbackForRequest(v) &&\n !!readDeployCredentialEnv(v),\n );\n}\n\n/**\n * Request-aware version of `isStoredEngineUsable`.\n *\n * The settings row stores the selected engine/model, while credentials may\n * live in per-user/org `app_secrets`. The sync helper intentionally only sees\n * deploy env vars; this async helper is what request-time routes should use\n * when deciding whether a stored engine can actually run for the current user.\n */\nexport async function isStoredEngineUsableForRequest(\n stored: unknown,\n entry: AgentEngineEntry,\n): Promise<boolean> {\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (isAgentEngineSettingConfigured(stored)) return true;\n if (entry.requiredEnvVars.length === 0) return true;\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\n/**\n * Request-aware credential preflight for an already-resolved engine instance.\n * `resolveEngine()` may still return a default or explicitly requested engine\n * object before credentials are actually usable; call this before starting a\n * user-visible run so missing providers fail immediately.\n */\nexport async function isResolvedEngineUsableForRequest(\n engine: AgentEngine,\n options: { apiKey?: string } = {},\n): Promise<boolean> {\n const entry = _registry.get(engine.name);\n // Custom engines may have their own credential contract outside the core\n // registry metadata, so do not block them speculatively.\n if (!entry) return true;\n if (!isAgentEnginePackageInstalled(entry)) return false;\n if (entry.requiredEnvVars.length === 0) return true;\n\n if (entry.name === \"builder\") {\n const creds = await resolveBuilderCredentials();\n return Boolean(creds.privateKey && creds.publicKey);\n }\n\n if (options.apiKey?.trim()) {\n const key = entry.requiredEnvVars[0];\n if (!key) return true;\n return !(await getProviderCredentialAuthFailure({\n key,\n value: options.apiKey,\n }));\n }\n\n for (const key of entry.requiredEnvVars) {\n try {\n if (await resolveUsableProviderSecret(key)) continue;\n } catch {\n return false;\n }\n return false;\n }\n return true;\n}\n\nexport interface ResolveEngineConfig {\n /** Explicit engine name or instance from createAgentChatPlugin options */\n engineOption?:\n | string\n | AgentEngine\n | { name: string; config: Record<string, unknown> };\n /** API key (used as config for the resolved engine) */\n apiKey?: string;\n /** Model override (used as part of engine config) */\n model?: string;\n /** App/template id used for org-scoped per-app model defaults. */\n appId?: string;\n}\n\n/**\n * 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(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(appId);\n if (appDefault?.engine) {\n const entry = _registry.get(appDefault.engine);\n if (entry && (await isStoredEngineUsableForRequest(appDefault, entry))) {\n return entry.create(await engineCreateConfigForEntry(entry, apiKey));\n }\n }\n\n let stored: { engine?: unknown; config?: unknown } | null = null;\n try {\n stored = (await getSetting(\"agent-engine\")) as typeof stored;\n } catch {\n // Settings not available — fall through\n }\n\n // Auto-detect from the current user's per-user `app_secrets` rows\n // (Builder OAuth callback + \"paste your own key\" settings flow write here,\n // not env). Stored/app defaults are checked first so an explicit provider\n // selection can override a connected Builder account.\n const detectedFromUser = await detectEngineFromUserSecrets();\n\n // 6. Settings store — only when the stored row's API key is reachable.\n // This explicit selection beats automatic Builder detection so users can\n // switch away from Builder credits by saving/applying their own provider key.\n const storedRaw = stored as { engine?: unknown; config?: unknown } | null;\n const storedEngine = storedRaw?.engine;\n const storedConfig = storedRaw?.config;\n if (storedRaw && typeof storedEngine === \"string\") {\n const entry = _registry.get(storedEngine);\n if (entry && (await isStoredEngineUsableForRequest(storedRaw, entry))) {\n return entry.create(\n await engineCreateConfigForEntry(\n entry,\n apiKey,\n stripInlineApiKeyConfig(\n storedConfig as Record<string, unknown> | undefined,\n ),\n ),\n );\n }\n }\n\n if (detectedFromUser) {\n return detectedFromUser.create(\n await engineCreateConfigForEntry(detectedFromUser, apiKey),\n );\n }\n\n // 8. Auto-detect from any provider env var — so just dropping a key in\n // .env works without also setting AGENT_ENGINE. Skip keys with active\n // auth-failure markers so a rejected deploy key cannot permanently win.\n const detected = await detectEngineFromEnvForRequest();\n if (detected) {\n return detected.create(await engineCreateConfigForEntry(detected, apiKey));\n }\n\n // 9. Default: anthropic\n const anthropicEntry = _registry.get(\"anthropic\");\n if (!anthropicEntry) {\n throw new Error(\n \"[agent-engine] Default Anthropic engine is not registered. Did builtin.ts fail to load?\",\n );\n }\n return anthropicEntry.create(\n await engineCreateConfigForEntry(anthropicEntry, apiKey),\n );\n}\n\n/**\n * Read the user-selected model for an engine from the `agent-engine` setting.\n *\n * The settings UI writes `{engine, model}` via the `manage-agent-engine` action=\"set\",\n * but `resolveEngine` only uses the stored engine (the model is a separate\n * per-request concern). Call this helper alongside `resolveEngine` to honor\n * the user's model choice without requiring a process restart.\n *\n * Returns the stored model only when the stored engine name matches `engine`\n * — otherwise returns `undefined` to avoid applying an Anthropic model string\n * to, say, an OpenRouter engine.\n */\nexport async function getStoredModelForEngine(\n engine: AgentEngine | string,\n options: { appId?: string } = {},\n): Promise<string | undefined> {\n const engineName = typeof engine === \"string\" ? engine : engine.name;\n try {\n const appDefault = await getAgentAppModelDefaultForCurrentRequest(\n options.appId,\n );\n if (\n appDefault?.engine === engineName &&\n typeof appDefault.model === \"string\" &&\n appDefault.model.length > 0\n ) {\n return appDefault.model;\n }\n } catch {\n // Settings/request context may not be available — fall through.\n }\n\n try {\n const stored = await getSetting(\"agent-engine\");\n if (\n stored &&\n typeof stored.engine === \"string\" &&\n stored.engine === engineName &&\n typeof stored.model === \"string\" &&\n stored.model.length > 0\n ) {\n return stored.model;\n }\n } catch {\n // Settings store not ready (fresh install, migration pending) — skip.\n }\n return undefined;\n}\n"]}
|
package/dist/deploy/build.d.ts
CHANGED
|
@@ -90,6 +90,8 @@ export declare function findInstalledResvgPackages(nodeModulesRoots: string[]):
|
|
|
90
90
|
* so a missing emit degrades to clean 40s-chunked runs rather than the loop.)
|
|
91
91
|
*/
|
|
92
92
|
export declare function isDurableBackgroundDeployEnabled(): boolean;
|
|
93
|
+
export declare const NETLIFY_INTEGRATION_RECOVERY_FUNCTION_NAME = "server-integration-recovery";
|
|
94
|
+
export declare function isIntegrationDurableDispatchDeployEnabled(): boolean;
|
|
93
95
|
/**
|
|
94
96
|
* Emit a site-local Netlify Scheduled Function that wakes the public server
|
|
95
97
|
* function and its database every minute. GitHub Actions schedules can be
|
|
@@ -160,6 +162,7 @@ export declare function emitSingleTemplateNetlifyKeepWarmFunction(projectCwd: st
|
|
|
160
162
|
* inline 40s synchronous run (see production-agent.ts).
|
|
161
163
|
*/
|
|
162
164
|
export declare function emitSingleTemplateNetlifyBackgroundFunction(projectCwd: string): void;
|
|
165
|
+
export declare function emitSingleTemplateNetlifyIntegrationRecoveryFunction(projectCwd: string): void;
|
|
163
166
|
/**
|
|
164
167
|
* Nitro receives the React Router SSR build as prebuilt chunks, so its normal
|
|
165
168
|
* dependency resolver cannot reliably fold the preserved bare `yjs` imports
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/deploy/build.ts"],"names":[],"mappings":"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"}
|
package/dist/deploy/build.js
CHANGED
|
@@ -17,7 +17,8 @@ import fs from "fs";
|
|
|
17
17
|
import { createRequire } from "module";
|
|
18
18
|
import path from "path";
|
|
19
19
|
import { fileURLToPath } from "url";
|
|
20
|
-
import { AGENT_BACKGROUND_FUNCTION_NAME, AGENT_BACKGROUND_PROCESSOR_A2A, AGENT_BACKGROUND_PROCESSOR_FIELD, AGENT_BACKGROUND_PROCESSOR_ROUTE, AGENT_BACKGROUND_PROCESSOR_ROUTE_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, } from "../agent/durable-background.js";
|
|
20
|
+
import { AGENT_BACKGROUND_FUNCTION_NAME, AGENT_BACKGROUND_PROCESSOR_A2A, AGENT_BACKGROUND_PROCESSOR_FIELD, AGENT_BACKGROUND_PROCESSOR_INTEGRATION, AGENT_BACKGROUND_PROCESSOR_ROUTE, AGENT_BACKGROUND_PROCESSOR_ROUTE_FIELD, AGENT_CHAT_PROCESS_RUN_PATH, } from "../agent/durable-background.js";
|
|
21
|
+
import { INTEGRATION_RETRY_SWEEP_PATH, INTEGRATION_RETRY_SWEEP_TOKEN_SUBJECT, isIntegrationDurableDispatchConfigured, } from "../integrations/integration-durable-dispatch-config.js";
|
|
21
22
|
import { normalizeAppBasePath } from "../server/app-base-path.js";
|
|
22
23
|
import { DEFAULT_SSR_CDN_CACHE_CONTROL, DEFAULT_SSR_NETLIFY_CDN_CACHE_CONTROL, DEFAULT_SPECULATION_RULES_PATH, DEFAULT_SSR_CACHE_CONTROL, } from "../shared/cache-control.js";
|
|
23
24
|
import { mcpEmbedStaticAssetRouteRules } from "../shared/mcp-embed-headers.js";
|
|
@@ -1942,6 +1943,10 @@ export function isDurableBackgroundDeployEnabled() {
|
|
|
1942
1943
|
const v = raw.trim().toLowerCase();
|
|
1943
1944
|
return v === "1" || v === "true" || v === "yes" || v === "on";
|
|
1944
1945
|
}
|
|
1946
|
+
export const NETLIFY_INTEGRATION_RECOVERY_FUNCTION_NAME = "server-integration-recovery";
|
|
1947
|
+
export function isIntegrationDurableDispatchDeployEnabled() {
|
|
1948
|
+
return isIntegrationDurableDispatchConfigured();
|
|
1949
|
+
}
|
|
1945
1950
|
const NETLIFY_KEEP_WARM_FUNCTION_NAME = "agent-native-keep-warm";
|
|
1946
1951
|
/**
|
|
1947
1952
|
* Emit a site-local Netlify Scheduled Function that wakes the public server
|
|
@@ -2090,8 +2095,10 @@ export function emitSingleTemplateNetlifyBackgroundFunction(projectCwd) {
|
|
|
2090
2095
|
fs.rmSync(path.join(dest, "server.mjs"), { force: true });
|
|
2091
2096
|
const processRunPath = JSON.stringify(AGENT_CHAT_PROCESS_RUN_PATH);
|
|
2092
2097
|
const a2aProcessTaskPath = JSON.stringify("/_agent-native/a2a/_process-task");
|
|
2098
|
+
const integrationProcessTaskPath = JSON.stringify("/_agent-native/integrations/process-task");
|
|
2093
2099
|
const backgroundProcessorField = JSON.stringify(AGENT_BACKGROUND_PROCESSOR_FIELD);
|
|
2094
2100
|
const backgroundProcessorA2A = JSON.stringify(AGENT_BACKGROUND_PROCESSOR_A2A);
|
|
2101
|
+
const backgroundProcessorIntegration = JSON.stringify(AGENT_BACKGROUND_PROCESSOR_INTEGRATION);
|
|
2095
2102
|
const backgroundProcessorRoute = JSON.stringify(AGENT_BACKGROUND_PROCESSOR_ROUTE);
|
|
2096
2103
|
const backgroundProcessorRouteField = JSON.stringify(AGENT_BACKGROUND_PROCESSOR_ROUTE_FIELD);
|
|
2097
2104
|
const entry = `// Mark this isolate as the durable background runtime BEFORE the handler
|
|
@@ -2106,8 +2113,10 @@ globalThis.__AGENT_NATIVE_BACKGROUND_RUNTIME__ = true;
|
|
|
2106
2113
|
// The framework route the Nitro router dispatches to (the _process-run plugin).
|
|
2107
2114
|
const PROCESS_RUN_PATH = ${processRunPath};
|
|
2108
2115
|
const A2A_PROCESS_TASK_PATH = ${a2aProcessTaskPath};
|
|
2116
|
+
const INTEGRATION_PROCESS_TASK_PATH = ${integrationProcessTaskPath};
|
|
2109
2117
|
const BACKGROUND_PROCESSOR_FIELD = ${backgroundProcessorField};
|
|
2110
2118
|
const BACKGROUND_PROCESSOR_A2A = ${backgroundProcessorA2A};
|
|
2119
|
+
const BACKGROUND_PROCESSOR_INTEGRATION = ${backgroundProcessorIntegration};
|
|
2111
2120
|
const BACKGROUND_PROCESSOR_ROUTE = ${backgroundProcessorRoute};
|
|
2112
2121
|
const BACKGROUND_PROCESSOR_ROUTE_FIELD = ${backgroundProcessorRouteField};
|
|
2113
2122
|
|
|
@@ -2118,6 +2127,12 @@ function processorPathFromBody(body) {
|
|
|
2118
2127
|
if (parsed?.[BACKGROUND_PROCESSOR_FIELD] === BACKGROUND_PROCESSOR_A2A) {
|
|
2119
2128
|
return A2A_PROCESS_TASK_PATH;
|
|
2120
2129
|
}
|
|
2130
|
+
if (
|
|
2131
|
+
parsed?.[BACKGROUND_PROCESSOR_FIELD] ===
|
|
2132
|
+
BACKGROUND_PROCESSOR_INTEGRATION
|
|
2133
|
+
) {
|
|
2134
|
+
return INTEGRATION_PROCESS_TASK_PATH;
|
|
2135
|
+
}
|
|
2121
2136
|
const route = parsed?.[BACKGROUND_PROCESSOR_ROUTE_FIELD];
|
|
2122
2137
|
if (
|
|
2123
2138
|
parsed?.[BACKGROUND_PROCESSOR_FIELD] === BACKGROUND_PROCESSOR_ROUTE &&
|
|
@@ -2203,6 +2218,72 @@ export const config = {
|
|
|
2203
2218
|
`verification of Netlify async (202) invocation — see ` +
|
|
2204
2219
|
`docs/design/durable-agent-runs.md.`);
|
|
2205
2220
|
}
|
|
2221
|
+
export function emitSingleTemplateNetlifyIntegrationRecoveryFunction(projectCwd) {
|
|
2222
|
+
const internalDir = path.join(projectCwd, ".netlify", "functions-internal");
|
|
2223
|
+
const serverDir = path.join(internalDir, "server");
|
|
2224
|
+
if (!fs.existsSync(path.join(serverDir, "main.mjs"))) {
|
|
2225
|
+
console.warn("[build] Integration recovery emit skipped: expected Nitro Netlify function " +
|
|
2226
|
+
"at .netlify/functions-internal/server/main.mjs was not found.");
|
|
2227
|
+
return;
|
|
2228
|
+
}
|
|
2229
|
+
const functionName = NETLIFY_INTEGRATION_RECOVERY_FUNCTION_NAME;
|
|
2230
|
+
const dest = path.join(internalDir, functionName);
|
|
2231
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
2232
|
+
copyDir(serverDir, dest);
|
|
2233
|
+
fs.rmSync(path.join(dest, "server.mjs"), { force: true });
|
|
2234
|
+
const entry = `import { createHmac } from "node:crypto";
|
|
2235
|
+
|
|
2236
|
+
const SWEEP_PATH = ${JSON.stringify(INTEGRATION_RETRY_SWEEP_PATH)};
|
|
2237
|
+
const SWEEP_SUBJECT = ${JSON.stringify(INTEGRATION_RETRY_SWEEP_TOKEN_SUBJECT)};
|
|
2238
|
+
|
|
2239
|
+
function enabled() {
|
|
2240
|
+
const raw = process.env.AGENT_INTEGRATION_DURABLE_DISPATCH;
|
|
2241
|
+
if (!raw) return false;
|
|
2242
|
+
return ["1", "true", "yes", "on"].includes(raw.trim().toLowerCase());
|
|
2243
|
+
}
|
|
2244
|
+
|
|
2245
|
+
function token(secret) {
|
|
2246
|
+
const timestamp = Date.now();
|
|
2247
|
+
const signature = createHmac("sha256", secret)
|
|
2248
|
+
.update(\`${INTEGRATION_RETRY_SWEEP_TOKEN_SUBJECT}:\${timestamp}\`)
|
|
2249
|
+
.digest("hex");
|
|
2250
|
+
return \`\${timestamp}.\${signature}\`;
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2253
|
+
let cachedHandler;
|
|
2254
|
+
|
|
2255
|
+
export default async function handler(request, context) {
|
|
2256
|
+
if (!enabled()) return new Response(null, { status: 204 });
|
|
2257
|
+
const secret = process.env.A2A_SECRET;
|
|
2258
|
+
if (!secret) {
|
|
2259
|
+
console.error("[integration-recovery] A2A_SECRET is required; sweep skipped");
|
|
2260
|
+
return new Response(null, { status: 204 });
|
|
2261
|
+
}
|
|
2262
|
+
cachedHandler ??= (await import("./main.mjs")).default;
|
|
2263
|
+
const url = new URL(request.url);
|
|
2264
|
+
url.pathname = SWEEP_PATH;
|
|
2265
|
+
const rewritten = new Request(url.toString(), {
|
|
2266
|
+
method: "POST",
|
|
2267
|
+
headers: {
|
|
2268
|
+
Authorization: \`Bearer \${token(secret)}\`,
|
|
2269
|
+
"Content-Type": "application/json",
|
|
2270
|
+
},
|
|
2271
|
+
body: JSON.stringify({ taskId: SWEEP_SUBJECT }),
|
|
2272
|
+
});
|
|
2273
|
+
return cachedHandler(rewritten, context);
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2276
|
+
export const config = {
|
|
2277
|
+
name: "integration pending-task recovery",
|
|
2278
|
+
generator: "agent-native build",
|
|
2279
|
+
schedule: "* * * * *",
|
|
2280
|
+
nodeBundler: "none",
|
|
2281
|
+
includedFiles: ["**"],
|
|
2282
|
+
preferStatic: false,
|
|
2283
|
+
};
|
|
2284
|
+
`;
|
|
2285
|
+
fs.writeFileSync(path.join(dest, `${functionName}.mjs`), entry);
|
|
2286
|
+
}
|
|
2206
2287
|
/**
|
|
2207
2288
|
* Nitro's Netlify preset can emit a harmful fallback rewrite to
|
|
2208
2289
|
* `/.netlify/functions/server`. With `config.path: "/*"`, that default URL is
|
|
@@ -2408,7 +2489,8 @@ export function assertSingleTemplateNetlifyBuildOutput(projectCwd) {
|
|
|
2408
2489
|
if (bundledVitestRuntime.length > 0) {
|
|
2409
2490
|
failures.push(`Netlify server bundle contains Vitest test runtime code: ${bundledVitestRuntime.join(", ")}`);
|
|
2410
2491
|
}
|
|
2411
|
-
if (isDurableBackgroundDeployEnabled()
|
|
2492
|
+
if (isDurableBackgroundDeployEnabled() ||
|
|
2493
|
+
isIntegrationDurableDispatchDeployEnabled()) {
|
|
2412
2494
|
const backgroundDir = path.join(internalDir, AGENT_BACKGROUND_FUNCTION_NAME);
|
|
2413
2495
|
const backgroundEntryPath = path.join(backgroundDir, `${AGENT_BACKGROUND_FUNCTION_NAME}.mjs`);
|
|
2414
2496
|
if (!fs.existsSync(backgroundEntryPath)) {
|
|
@@ -2424,6 +2506,18 @@ export function assertSingleTemplateNetlifyBuildOutput(projectCwd) {
|
|
|
2424
2506
|
}
|
|
2425
2507
|
}
|
|
2426
2508
|
}
|
|
2509
|
+
if (isIntegrationDurableDispatchDeployEnabled()) {
|
|
2510
|
+
const recoveryEntryPath = path.join(internalDir, NETLIFY_INTEGRATION_RECOVERY_FUNCTION_NAME, `${NETLIFY_INTEGRATION_RECOVERY_FUNCTION_NAME}.mjs`);
|
|
2511
|
+
if (!fs.existsSync(recoveryEntryPath)) {
|
|
2512
|
+
failures.push(`integration durable dispatch is enabled but ${path.relative(projectCwd, recoveryEntryPath)} was not emitted`);
|
|
2513
|
+
}
|
|
2514
|
+
else {
|
|
2515
|
+
const recoveryEntry = fs.readFileSync(recoveryEntryPath, "utf-8");
|
|
2516
|
+
if (!/\bschedule\s*:\s*["']\* \* \* \* \*["']/.test(recoveryEntry)) {
|
|
2517
|
+
failures.push(`integration recovery entry ${path.relative(projectCwd, recoveryEntryPath)} is missing the one-minute schedule`);
|
|
2518
|
+
}
|
|
2519
|
+
}
|
|
2520
|
+
}
|
|
2427
2521
|
if (failures.length > 0) {
|
|
2428
2522
|
throw new Error("[deploy] Netlify deploy guard failed; refusing to publish an output " +
|
|
2429
2523
|
"that would likely serve Netlify 404s:\n" +
|
|
@@ -2969,7 +3063,8 @@ export default bundle;
|
|
|
2969
3063
|
// bundle, so the chat `_process-run` POST lands on Netlify's async (15-min)
|
|
2970
3064
|
// function. When not opted in this is a no-op and the single-function
|
|
2971
3065
|
// deploy is byte-for-byte unchanged.
|
|
2972
|
-
if (isDurableBackgroundDeployEnabled()
|
|
3066
|
+
if (isDurableBackgroundDeployEnabled() ||
|
|
3067
|
+
isIntegrationDurableDispatchDeployEnabled()) {
|
|
2973
3068
|
try {
|
|
2974
3069
|
emitSingleTemplateNetlifyBackgroundFunction(cwd);
|
|
2975
3070
|
}
|
|
@@ -2977,6 +3072,14 @@ export default bundle;
|
|
|
2977
3072
|
console.warn("[build] Failed to emit durable-background Netlify function (non-fatal):", err instanceof Error ? err.message : err);
|
|
2978
3073
|
}
|
|
2979
3074
|
}
|
|
3075
|
+
if (isIntegrationDurableDispatchDeployEnabled()) {
|
|
3076
|
+
try {
|
|
3077
|
+
emitSingleTemplateNetlifyIntegrationRecoveryFunction(cwd);
|
|
3078
|
+
}
|
|
3079
|
+
catch (err) {
|
|
3080
|
+
console.warn("[build] Failed to emit integration recovery Netlify function (non-fatal):", err instanceof Error ? err.message : err);
|
|
3081
|
+
}
|
|
3082
|
+
}
|
|
2980
3083
|
writeSingleTemplateNetlifyRedirects(cwd);
|
|
2981
3084
|
assertSingleTemplateNetlifyBuildOutput(cwd);
|
|
2982
3085
|
}
|