@agent-native/core 0.12.16 → 0.12.18

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 (76) hide show
  1. package/dist/agent/engine/index.d.ts +1 -1
  2. package/dist/agent/engine/index.d.ts.map +1 -1
  3. package/dist/agent/engine/index.js +1 -1
  4. package/dist/agent/engine/index.js.map +1 -1
  5. package/dist/agent/engine/registry.d.ts +16 -4
  6. package/dist/agent/engine/registry.d.ts.map +1 -1
  7. package/dist/agent/engine/registry.js +59 -23
  8. package/dist/agent/engine/registry.js.map +1 -1
  9. package/dist/agent/production-agent.d.ts +1 -1
  10. package/dist/agent/production-agent.d.ts.map +1 -1
  11. package/dist/agent/production-agent.js +1 -1
  12. package/dist/agent/production-agent.js.map +1 -1
  13. package/dist/cli/create.js +1 -1
  14. package/dist/cli/create.js.map +1 -1
  15. package/dist/cli/index.js +13 -2
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/workspace-dev.d.ts +40 -1
  18. package/dist/cli/workspace-dev.d.ts.map +1 -1
  19. package/dist/cli/workspace-dev.js +506 -384
  20. package/dist/cli/workspace-dev.js.map +1 -1
  21. package/dist/client/AgentPanel.d.ts +16 -0
  22. package/dist/client/AgentPanel.d.ts.map +1 -1
  23. package/dist/client/AgentPanel.js +37 -10
  24. package/dist/client/AgentPanel.js.map +1 -1
  25. package/dist/client/AssistantChat.d.ts +4 -0
  26. package/dist/client/AssistantChat.d.ts.map +1 -1
  27. package/dist/client/AssistantChat.js +16 -8
  28. package/dist/client/AssistantChat.js.map +1 -1
  29. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  30. package/dist/client/MultiTabAssistantChat.js +20 -1
  31. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  32. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  33. package/dist/client/NewWorkspaceAppFlow.js +2 -1
  34. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  35. package/dist/client/agent-chat.d.ts +1 -1
  36. package/dist/client/agent-chat.js.map +1 -1
  37. package/dist/client/components/CodeRequiredDialog.d.ts +3 -2
  38. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  39. package/dist/client/components/CodeRequiredDialog.js +4 -3
  40. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  41. package/dist/client/composer/PromptComposer.d.ts +2 -0
  42. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  43. package/dist/client/composer/PromptComposer.js +2 -2
  44. package/dist/client/composer/PromptComposer.js.map +1 -1
  45. package/dist/client/composer/TiptapComposer.d.ts +6 -1
  46. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  47. package/dist/client/composer/TiptapComposer.js +21 -12
  48. package/dist/client/composer/TiptapComposer.js.map +1 -1
  49. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  50. package/dist/client/settings/SettingsPanel.js +3 -0
  51. package/dist/client/settings/SettingsPanel.js.map +1 -1
  52. package/dist/client/use-send-to-agent-chat.d.ts +3 -3
  53. package/dist/client/use-send-to-agent-chat.js +3 -3
  54. package/dist/client/use-send-to-agent-chat.js.map +1 -1
  55. package/dist/deploy/workspace-deploy.js +4 -1
  56. package/dist/deploy/workspace-deploy.js.map +1 -1
  57. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  58. package/dist/scripts/agent-engines/list-agent-engines.js +17 -10
  59. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  60. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  61. package/dist/server/core-routes-plugin.js +35 -13
  62. package/dist/server/core-routes-plugin.js.map +1 -1
  63. package/dist/server/google-oauth.d.ts.map +1 -1
  64. package/dist/server/google-oauth.js +5 -10
  65. package/dist/server/google-oauth.js.map +1 -1
  66. package/dist/templates/workspace-root/AGENTS.md +3 -1
  67. package/dist/templates/workspace-root/README.md +4 -4
  68. package/dist/vite/client.d.ts.map +1 -1
  69. package/dist/vite/client.js +34 -6
  70. package/dist/vite/client.js.map +1 -1
  71. package/docs/content/multi-app-workspace.md +1 -1
  72. package/package.json +1 -1
  73. package/src/templates/workspace-root/AGENTS.md +3 -1
  74. package/src/templates/workspace-root/README.md +4 -4
  75. package/dist/templates/workspace-root/netlify.toml +0 -11
  76. package/src/templates/workspace-root/netlify.toml +0 -11
@@ -3,9 +3,9 @@ import { type AgentChatMessage } from "./agent-chat.js";
3
3
  * Wraps sendToAgentChat with code-request gating.
4
4
  *
5
5
  * When a message has `type: "code"` (or `requiresCode: true`) and no
6
- * frame is connected, shows a dialog explaining code changes need a
7
- * dev frame. When a frame IS connected, the message is sent to the
8
- * frame and a code-agent indicator is shown.
6
+ * frame is connected, shows a dialog explaining code changes need Agent
7
+ * Native Desktop or Builder. When a frame IS connected, the message is sent
8
+ * to the frame and a code-agent indicator is shown.
9
9
  *
10
10
  * Returns a `codeRequiredDialog` React element that must be rendered
11
11
  * somewhere in the consumer's JSX tree.
@@ -8,9 +8,9 @@ import { CodeRequiredDialog } from "./components/CodeRequiredDialog.js";
8
8
  * Wraps sendToAgentChat with code-request gating.
9
9
  *
10
10
  * When a message has `type: "code"` (or `requiresCode: true`) and no
11
- * frame is connected, shows a dialog explaining code changes need a
12
- * dev frame. When a frame IS connected, the message is sent to the
13
- * frame and a code-agent indicator is shown.
11
+ * frame is connected, shows a dialog explaining code changes need Agent
12
+ * Native Desktop or Builder. When a frame IS connected, the message is sent
13
+ * to the frame and a code-agent indicator is shown.
14
14
  *
15
15
  * Returns a `codeRequiredDialog` React element that must be rendered
16
16
  * somewhere in the consumer's JSX tree.
@@ -1 +1 @@
1
- {"version":3,"file":"use-send-to-agent-chat.js","sourceRoot":"","sources":["../../src/client/use-send-to-agent-chat.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useCallback, createElement } from \"react\";\nimport { sendToAgentChat, type AgentChatMessage } from \"./agent-chat.js\";\nimport { useAgentChatGenerating } from \"./use-agent-chat.js\";\nimport { isInFrame, isTrustedFrameMessage } from \"./frame.js\";\nimport { isInBuilderFrame, isTrustedBuilderMessage } from \"./builder-frame.js\";\nimport { CodeRequiredDialog } from \"./components/CodeRequiredDialog.js\";\n\n/**\n * Wraps sendToAgentChat with code-request gating.\n *\n * When a message has `type: \"code\"` (or `requiresCode: true`) and no\n * frame is connected, shows a dialog explaining code changes need a\n * dev frame. When a frame IS connected, the message is sent to the\n * frame and a code-agent indicator is shown.\n *\n * Returns a `codeRequiredDialog` React element that must be rendered\n * somewhere in the consumer's JSX tree.\n */\nexport function useSendToAgentChat(): {\n send: (opts: AgentChatMessage) => string | null;\n isGenerating: boolean;\n /** True when a code request is being processed by the frame */\n isCodeAgentWorking: boolean;\n codeRequiredDialog: React.ReactNode;\n} {\n const [agentGenerating] = useAgentChatGenerating();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [featureLabel, setFeatureLabel] = useState<string | undefined>();\n const [codeAgentWorking, setCodeAgentWorking] = useState(false);\n\n // Listen for code completion from frame\n useEffect(() => {\n if (!codeAgentWorking) return;\n function handler(event: MessageEvent) {\n const fromAgentFrame = isTrustedFrameMessage(event);\n const fromBuilderFrame = isTrustedBuilderMessage(event);\n if (!fromAgentFrame && !fromBuilderFrame) return;\n const runningDetail = event.data?.detail ?? event.data?.data;\n if (\n event.data?.type === \"agentNative.codeComplete\" ||\n (fromBuilderFrame && event.data?.type === \"builder.codeComplete\") ||\n (event.data?.type === \"agentNative.chatRunning\" &&\n !runningDetail?.isRunning) ||\n (fromBuilderFrame &&\n event.data?.type === \"builder.chatRunning\" &&\n !runningDetail?.isRunning)\n ) {\n setCodeAgentWorking(false);\n }\n }\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [codeAgentWorking]);\n\n const send = useCallback((opts: AgentChatMessage): string | null => {\n const isCodeRequest = opts.type === \"code\" || opts.requiresCode === true;\n\n if (isCodeRequest && !isInFrame() && !isInBuilderFrame()) {\n setFeatureLabel(opts.message?.slice(0, 80));\n setDialogOpen(true);\n return null;\n }\n\n if (isCodeRequest) {\n setCodeAgentWorking(true);\n opts = { ...opts, type: \"code\" };\n }\n\n return sendToAgentChat(opts);\n }, []);\n\n const dialog = createElement(CodeRequiredDialog, {\n open: dialogOpen,\n onClose: () => setDialogOpen(false),\n featureLabel,\n });\n\n return {\n send,\n isGenerating: agentGenerating,\n isCodeAgentWorking: codeAgentWorking,\n codeRequiredDialog: dialog,\n };\n}\n"]}
1
+ {"version":3,"file":"use-send-to-agent-chat.js","sourceRoot":"","sources":["../../src/client/use-send-to-agent-chat.ts"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useCallback, createElement } from \"react\";\nimport { sendToAgentChat, type AgentChatMessage } from \"./agent-chat.js\";\nimport { useAgentChatGenerating } from \"./use-agent-chat.js\";\nimport { isInFrame, isTrustedFrameMessage } from \"./frame.js\";\nimport { isInBuilderFrame, isTrustedBuilderMessage } from \"./builder-frame.js\";\nimport { CodeRequiredDialog } from \"./components/CodeRequiredDialog.js\";\n\n/**\n * Wraps sendToAgentChat with code-request gating.\n *\n * When a message has `type: \"code\"` (or `requiresCode: true`) and no\n * frame is connected, shows a dialog explaining code changes need Agent\n * Native Desktop or Builder. When a frame IS connected, the message is sent\n * to the frame and a code-agent indicator is shown.\n *\n * Returns a `codeRequiredDialog` React element that must be rendered\n * somewhere in the consumer's JSX tree.\n */\nexport function useSendToAgentChat(): {\n send: (opts: AgentChatMessage) => string | null;\n isGenerating: boolean;\n /** True when a code request is being processed by the frame */\n isCodeAgentWorking: boolean;\n codeRequiredDialog: React.ReactNode;\n} {\n const [agentGenerating] = useAgentChatGenerating();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [featureLabel, setFeatureLabel] = useState<string | undefined>();\n const [codeAgentWorking, setCodeAgentWorking] = useState(false);\n\n // Listen for code completion from frame\n useEffect(() => {\n if (!codeAgentWorking) return;\n function handler(event: MessageEvent) {\n const fromAgentFrame = isTrustedFrameMessage(event);\n const fromBuilderFrame = isTrustedBuilderMessage(event);\n if (!fromAgentFrame && !fromBuilderFrame) return;\n const runningDetail = event.data?.detail ?? event.data?.data;\n if (\n event.data?.type === \"agentNative.codeComplete\" ||\n (fromBuilderFrame && event.data?.type === \"builder.codeComplete\") ||\n (event.data?.type === \"agentNative.chatRunning\" &&\n !runningDetail?.isRunning) ||\n (fromBuilderFrame &&\n event.data?.type === \"builder.chatRunning\" &&\n !runningDetail?.isRunning)\n ) {\n setCodeAgentWorking(false);\n }\n }\n window.addEventListener(\"message\", handler);\n return () => window.removeEventListener(\"message\", handler);\n }, [codeAgentWorking]);\n\n const send = useCallback((opts: AgentChatMessage): string | null => {\n const isCodeRequest = opts.type === \"code\" || opts.requiresCode === true;\n\n if (isCodeRequest && !isInFrame() && !isInBuilderFrame()) {\n setFeatureLabel(opts.message?.slice(0, 80));\n setDialogOpen(true);\n return null;\n }\n\n if (isCodeRequest) {\n setCodeAgentWorking(true);\n opts = { ...opts, type: \"code\" };\n }\n\n return sendToAgentChat(opts);\n }, []);\n\n const dialog = createElement(CodeRequiredDialog, {\n open: dialogOpen,\n onClose: () => setDialogOpen(false),\n featureLabel,\n });\n\n return {\n send,\n isGenerating: agentGenerating,\n isCodeAgentWorking: codeAgentWorking,\n codeRequiredDialog: dialog,\n };\n}\n"]}
@@ -563,10 +563,13 @@ function assertWorkspaceDeployProductionEnv(opts) {
563
563
  return;
564
564
  if (process.env.A2A_SECRET?.trim())
565
565
  return;
566
+ const providerHint = opts.preset === "netlify"
567
+ ? ' For Netlify, one option is: netlify env:set A2A_SECRET "$(openssl rand -hex 32)".'
568
+ : "";
566
569
  throw new Error([
567
570
  "A2A_SECRET is required for production workspace deploys.",
568
571
  "Workspace Slack, webhook, and cross-app A2A work resumes through signed background processors; without A2A_SECRET those production routes return 503.",
569
- 'Set A2A_SECRET in your deploy provider (for example: netlify env:set A2A_SECRET "$(openssl rand -hex 32)") and redeploy.',
572
+ `Set A2A_SECRET in your deploy provider and redeploy.${providerHint}`,
570
573
  "For local artifact checks, run agent-native deploy --build-only outside the deploy provider environment.",
571
574
  ].join(" "));
572
575
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-deploy.js","sourceRoot":"","sources":["../../src/deploy/workspace-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAIlF,MAAM,4BAA4B,GAAG,mBAAmB,CAAC;AACzD,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC;IAC9C,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,IAAI;IACJ,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AACH,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAClE,MAAM,2BAA2B,GAAG,eAAe,CAAC;AACpD,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAuB3D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA+B,EAAE;IAEjC,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,+BAA+B,aAAa,8CAA8C,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE7D,MAAM,IAAI,GAAG,EAAE;SACZ,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;SACnE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEhC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,+BAA+B,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,wBAAwB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnD,kCAAkC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACjD,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACxD,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,GAAG,CACT,+BAA+B,IAAI,CAAC,MAAM,sBAAsB,MAAM,EAAE,CACzE,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,WAAW,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,oBAAoB,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3E,CAAC;IACD,0BAA0B,CACxB,aAAa,EACb,OAAO,EACP,IAAI,EACJ,aAAa,EACb,MAAM,CACP,CAAC;IAEF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,8BAA8B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,0CAA0C,OAAO,oCAAoC,CACtF,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CACT,8EAA8E,CAC/E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,GAAG,CACT,yHAAyH,CAC1H,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,aAAqB,EACrB,GAAW,EACX,MAA6B,EAC7B,QAA6B,EAC7B,aAA0C;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,GAAG,GAAsB;QAC7B,GAAG,OAAO,CAAC,GAAG;QACd,YAAY,EAAE,MAAM;QACpB,sBAAsB,EAAE,GAAG;QAC3B,2BAA2B,EAAE,GAAG;QAChC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,kBAAkB,EAAE,IAAI,GAAG,EAAE;QAC7B,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;KACxD,CAAC;IAEF,IAAI,MAAM,KAAK,SAAS,IAAI,iCAAiC,CAAC,MAAM,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,YAAY;YACd,OAAO,CAAC,GAAG,CAAC,6BAA6B;gBACzC,OAAO,CAAC,GAAG,CAAC,YAAY;gBACxB,GAAG,CAAC,YAAY,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,GAAG,CACT,+BAA+B,GAAG,WAAW,GAAG,YAAY,MAAM,GAAG,CACtE,CAAC;IAEF,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,QAAQ,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAC3C,GAAG,EAAE,aAAa;QAClB,GAAG;QACH,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAC3B,aAAqB,EACrB,GAAW,EACX,OAAe,EACf,MAA6B,EAC7B,aAA0C;IAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,0EAA0E;IAC1E,qEAAqE;IACrE,kCAAkC;IAClC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,UAAU;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SAChC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,YAAY,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,MAAM,kDAAkD,CACtG,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,4BAA4B,EAAE,GAAG,CAAC,CAAC;QACrE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3B,0EAA0E;QAC1E,sEAAsE;QACtE,uEAAuE;QACvE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,gCAAgC,CAAC,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,8BAA8B,CAAC,OAAe,EAAE,IAAc;IACrE,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpD,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;IACT,uEAAuE;IACvE,qEAAqE;IACrE,WAAW;IACX,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CACV,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,oBAAoB;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,CAAC;QACV,OAAO;QACP,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAClC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACvC,CAAC;IAEF,oEAAoE;IACpE,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI;SACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC;SAChE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,QAAQ,GAAG,IAAI;SAClB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,wBAAwB,CAAC,8BAA8B,CAAC,eAAe,WAAW,CAAC,CAAC,CAAC,4BAA4B,CACpH;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,2BAA2B,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC3D,CAAC,CAAC,kKAAkK,WAAW,CAAC,UAAU,CAAC;CAC9L;QACG,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,wBAAwB,GAAG,oBAAoB;QACnD,CAAC,CAAC,oFAAoF,oBAAoB;CAC7G;QACG,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,uBAAuB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvD,CAAC,CAAC,iCAAiC,CAAC,GAAG,CACnC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CACb,0BAA0B,IAAI,kDAAkD,EAAE,4CAA4C,CACjI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACrB,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,8BAA8B,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC9D,CAAC,CAAC;CACL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,MAAM,GAAG,GAAG,OAAO;;;;;EAKzB,2BAA2B,GAAG,wBAAwB,GAAG,uBAAuB,GAAG,8BAA8B,GAAG,QAAQ;;0CAEpF,0BAA0B,CAAC,IAAI,CAAC;;;;;CAKzE,CAAC;IACA,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAc;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAE,IAAc;IAC5D,MAAM,KAAK,GAAa;QACtB,qDAAqD;QACrD,iHAAiH;KAClH,CAAC;IAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,0BAA0B,YAAY,MAAM,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,iCAAiC,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAW,EAAE,OAAe;IAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,4BAA4B,IAAI,GAAG,EAAE,CAAC;IACrD,OAAO;QACL,GAAG,IAAI,aAAa,EAAE,oBAAoB;QAC1C,GAAG,2BAA2B,CAC5B,GAAG,EACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,4BAA4B,EAAE,GAAG,CAAC,CACtD,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YAClB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,OAAO,GAAG,SAAS,IAAI,EAAE,IAAI,SAAS,MAAM,CAAC;QAC/C,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,KAAK,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC;QAClE,IAAI,uBAAuB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAe,EACf,GAAW,EACX,KAAa;IAEb,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,4BAA4B,EAAE,GAAG,EAAE,KAAK,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;KAC/B,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IACzC,eAAe;IACf,mBAAmB;IACnB,SAAS;IACT,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;CAC3D,CAAC,CAAC;AAEH,SAAS,+BAA+B,CAAC,IAAc;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,UAAU,IAAI,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,CACnE,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACnC,MAAM,IAAI,KAAK,CACb,oBAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uEAAuE,CACvI,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,aAAqB,EACrB,GAAW,EACX,aAA0C,EAC1C,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,mBAAmB,GAAG,kDAAkD,CAC5G,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,CAAC;IAC5E,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnB,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,yBAAyB,CAChC,WAAmB,EACnB,GAAW,EACX,aAA0C,EAC1C,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAEvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,MAAM,UAAU,GACd,GAAG,KAAK,UAAU;QAChB,CAAC,CAAC,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,GAAG,QAAQ,IAAI,CAAC;QACzD,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC;IAClC,MAAM,uBAAuB,GAC3B,GAAG,KAAK,UAAU;QAChB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;;;;;;;;;;;;;CAaP,CAAC;IACA,MAAM,WAAW,GACf,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC;IACpE,MAAM,MAAM,GAAG,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;;;;;MAUvD,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;;;;;EAK5F,uBAAuB;;;;;;;yBAOA,WAAW;;;;UAI1B,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,iBAAiB,CAAC;;UAEvC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;;kBAGlB,IAAI,CAAC,SAAS,CAC5B,4BAA4B,CAAC,GAAG,EAAE,SAAS,CAAC,EAC5C,IAAI,EACJ,CAAC,CACF;SACE,KAAK,CAAC,IAAI,CAAC;SACX,IAAI,CAAC,MAAM,CAAC;;;CAGhB,CAAC;IACA,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,4BAA4B,CACnC,GAAW,EACX,SAAiB;IAEjB,OAAO;QACL,aAAa;QACb,IAAI,GAAG,WAAW;QAClB,GAAG,2BAA2B,CAAC,GAAG,EAAE,SAAS,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAW,EAAE,SAAiB;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,EAAE;SACN,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC/C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,OAAO,+BAA+B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC,CAAC;SACD,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,aAAqB;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAc;IAC1C,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE;QAC7D,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iCAAiC,CAAC,MAAc;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,EAAE;aACN,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC;aAClC,QAAQ,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CACjC,aAAqB,EACrB,OAAe,EACf,IAAc,EACd,aAA0C,EAC1C,MAA6B;IAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,aAAa;KACpB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEF,MAAM,OAAO,GACX,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,IAAI,CACP,mBAAmB,CAAC,aAAa,CAAC,EAClC,GAAG,GAAG,SAAS,EACf,2BAA2B,EAC3B,4BAA4B,CAC7B,CACF;QACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,IAAI,CACP,OAAO,EACP,GAAG,EACH,2BAA2B,EAC3B,4BAA4B,CAC7B,CACF,CAAC;IAER,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,aAAqB,EACrB,IAAc;IAEd,MAAM,YAAY,GAAG,gCAAgC,CAAC,aAAa,CAAC,CAAC;IAErE,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GACP,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO;YACL,EAAE,EAAE,GAAG;YACP,IAAI,EAAE,GAAG,EAAE,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC;YACxC,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,EAAE;YACnC,IAAI,EAAE,OAAO;YACb,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,UAAU,EAAE,GAAG,KAAK,UAAU;SAC/B,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU;YAAE,OAAO,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gCAAgC,CACvC,aAAqB;IAErB,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC5E,MAAM,QAAQ,GACZ,yBAAyB,CACvB,IAAI,CAAC,IAAI,CACP,aAAa,EACb,2BAA2B,EAC3B,4BAA4B,CAC7B,CACF;QACD,yBAAyB,CACvB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,4BAA4B,CAAC,CACvD,CAAC;IACJ,MAAM,IAAI,GAAG,OAAO,IAAI,QAAQ,IAAI,EAAE,CAAC;IACvC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAC7B,GAAuB;IAEvB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAY;IAEZ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,0BAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,0BAA0B,CACjC,MAAW;IAEX,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;QACzC,CAAC,CAAC,MAAM,CAAC,IAAI;QACb,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACrB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACrB,MAAM,GAAG,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO;YACL,EAAE;YACF,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAAG,EAAuC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAE/D,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,OAAO,CAAC,GAAG,CAAC,OAAO;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG;QACf,OAAO,CAAC,GAAG,CAAC,UAAU;QACtB,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3B,IAAI,CACL,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAc;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CACpB,YAA+C,EAC/C,IAAc;IAEd,OAAO,CACL,YAAY;QACZ,cAAc,CAAC,IAAI,CAAC;QACpB,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACzC,kBAAkB,CACnB,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CAAC,IAG3C;IACC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC;QAAE,OAAO;IAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO;IAC3C,MAAM,IAAI,KAAK,CACb;QACE,0DAA0D;QAC1D,uJAAuJ;QACvJ,0HAA0H;QAC1H,0GAA0G;KAC3G,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,IAGpC;IACC,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;QACzB,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM;QAC9B,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,EACpC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,KAAyB;IAEzB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,KAAK,kBAAkB,IAAI,KAAK,KAAK,kBAAkB,EAAE,CAAC;QACjE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,kDAAkD,CAChG,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAS,EAAE,CAAS;IAClD,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY;IACxC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAClC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["/**\n * `agent-native deploy` — build and deploy every app in a workspace to a\n * single origin. Each app is served from `/<app-name>/*`, so:\n *\n * https://your-agents.com/mail/* → apps/mail\n * https://your-agents.com/calendar/* → apps/calendar\n *\n * Benefits of same-origin deploy:\n * - Shared auth cookie → log in once, every app is signed in\n * - Cross-app A2A is a same-origin fetch (no CORS, no JWT for siblings)\n * - One DNS record, one TLS cert, one CDN cache\n *\n * Per-app independent deploy is still supported — just cd into the app and\n * run `agent-native build` as before. This orchestrator is for teams that\n * want the whole workspace behind one domain.\n */\nimport { execFileSync } from \"child_process\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { findWorkspaceRoot } from \"../scripts/utils.js\";\nimport { DISPATCH_WORKSPACE_ROOT_REDIRECTS } from \"../shared/workspace-app-id.js\";\n\nexport type WorkspaceDeployPreset = \"cloudflare_pages\" | \"netlify\";\n\nconst NETLIFY_WORKSPACE_STATIC_DIR = \"_workspace_static\";\nconst NETLIFY_PUBLIC_ASSET_EXTENSIONS = new Set([\n \"avif\",\n \"css\",\n \"gif\",\n \"ico\",\n \"jpeg\",\n \"jpg\",\n \"js\",\n \"json\",\n \"map\",\n \"mp4\",\n \"pdf\",\n \"png\",\n \"svg\",\n \"txt\",\n \"wasm\",\n \"webm\",\n \"webmanifest\",\n \"webp\",\n \"xml\",\n]);\nconst WORKSPACE_APPS_ENV_KEY = \"AGENT_NATIVE_WORKSPACE_APPS_JSON\";\nconst WORKSPACE_APPS_MANIFEST_DIR = \".agent-native\";\nconst WORKSPACE_APPS_MANIFEST_FILE = \"workspace-apps.json\";\n\ninterface WorkspaceAppManifestEntry {\n id: string;\n name: string;\n description: string;\n path: string;\n url?: string;\n isDispatch: boolean;\n}\n\nexport interface WorkspaceDeployOptions {\n args?: string[];\n /** Override the workspace root (defaults to walking up from cwd). */\n workspaceRoot?: string;\n /** Only build — don't invoke the deploy platform CLI. */\n buildOnly?: boolean;\n /** Target preset. Defaults to `cloudflare_pages`. */\n preset?: WorkspaceDeployPreset;\n /** @internal Override process execution in tests. */\n execFile?: typeof execFileSync;\n}\n\nexport async function runWorkspaceDeploy(\n opts: WorkspaceDeployOptions = {},\n): Promise<void> {\n const workspaceRoot =\n opts.workspaceRoot ?? findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const appsDir = path.join(workspaceRoot, \"apps\");\n if (!fs.existsSync(appsDir)) {\n throw new Error(\n `No apps/ directory found at ${workspaceRoot}. Run this inside an agent-native workspace.`,\n );\n }\n\n const rawArgs = opts.args ?? [];\n const args = new Set(rawArgs);\n const buildOnly = opts.buildOnly ?? args.has(\"--build-only\");\n\n const apps = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .filter((n) => fs.existsSync(path.join(appsDir, n, \"package.json\")))\n .sort(compareWorkspaceAppIds);\n\n if (apps.length === 0) {\n throw new Error(\n `Workspace has no apps. Run \\`agent-native add-app\\` to add one.`,\n );\n }\n assertNoReservedWorkspaceAppIds(apps);\n const workspaceApps = readWorkspaceAppManifest(workspaceRoot, apps);\n\n const preset = resolvePreset(opts.preset, rawArgs);\n assertWorkspaceDeployProductionEnv({ buildOnly, preset });\n const distDir = path.join(workspaceRoot, \"dist\");\n fs.rmSync(distDir, { recursive: true, force: true });\n fs.mkdirSync(distDir, { recursive: true });\n\n if (preset === \"netlify\") {\n const functionsDir = netlifyFunctionsDir(workspaceRoot);\n fs.rmSync(functionsDir, { recursive: true, force: true });\n fs.mkdirSync(functionsDir, { recursive: true });\n }\n\n console.log(\n `[workspace-deploy] Building ${apps.length} app(s) for preset=${preset}`,\n );\n\n const execFile = opts.execFile ?? execFileSync;\n for (const app of apps) {\n buildOneApp(workspaceRoot, app, preset, execFile, workspaceApps);\n moveAppBuildIntoDist(workspaceRoot, app, distDir, preset, workspaceApps);\n }\n writeWorkspaceAppManifests(\n workspaceRoot,\n distDir,\n apps,\n workspaceApps,\n preset,\n );\n\n if (preset === \"netlify\") {\n writeNetlifyRedirects(distDir, apps);\n } else {\n writeCloudflareRoutingManifest(distDir, apps);\n }\n\n if (buildOnly) {\n console.log(\n `\\n[workspace-deploy] Build complete at ${distDir}. Skipping publish (--build-only).`,\n );\n return;\n }\n\n console.log(`\\n[workspace-deploy] Build complete. Publish with:\\n`);\n console.log(` cd ${path.relative(process.cwd(), workspaceRoot) || \".\"}`);\n if (preset === \"netlify\") {\n console.log(\n ` netlify deploy --prod --dir=dist --functions=.netlify/functions-internal\\n`,\n );\n } else {\n console.log(` wrangler pages deploy dist\\n`);\n }\n console.log(\n `All apps live at https://<origin>/<app-name>/*. Log in once on any app\\nand the session is shared across the workspace.`,\n );\n}\n\nfunction buildOneApp(\n workspaceRoot: string,\n app: string,\n preset: WorkspaceDeployPreset,\n execFile: typeof execFileSync,\n workspaceApps: WorkspaceAppManifestEntry[],\n): void {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n NITRO_PRESET: preset,\n AGENT_NATIVE_WORKSPACE: \"1\",\n VITE_AGENT_NATIVE_WORKSPACE: \"1\",\n APP_BASE_PATH: `/${app}`,\n VITE_APP_BASE_PATH: `/${app}`,\n [WORKSPACE_APPS_ENV_KEY]: JSON.stringify(workspaceApps),\n };\n\n if (preset === \"netlify\" && appUsesNetlifyUnpooledDatabaseUrl(appDir)) {\n env.DATABASE_URL =\n process.env.NETLIFY_DATABASE_URL_UNPOOLED ??\n process.env.DATABASE_URL ??\n env.DATABASE_URL;\n }\n\n console.log(\n `[workspace-deploy] Building ${app} (base=/${app}, preset=${preset})`,\n );\n\n cleanAppBuildOutputs(appDir);\n\n execFile(\"pnpm\", [\"--filter\", app, \"build\"], {\n cwd: workspaceRoot,\n env,\n stdio: \"inherit\",\n });\n}\n\nfunction moveAppBuildIntoDist(\n workspaceRoot: string,\n app: string,\n distDir: string,\n preset: WorkspaceDeployPreset,\n workspaceApps: WorkspaceAppManifestEntry[],\n): void {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n // Resolve the per-app build output: prefer dist/ (standard), fall back to\n // .output/ (Nitro's default). The Cloudflare preset emits into dist/\n // containing the worker + assets.\n const candidates = [\"dist\", \".output\"];\n const src = candidates\n .map((c) => path.join(appDir, c))\n .find((p) => fs.existsSync(p));\n if (!src) {\n throw new Error(\n `Expected ${candidates.join(\" or \")} under ${appDir} but none existed. Check the app's build script.`,\n );\n }\n if (preset === \"netlify\") {\n const mountedSrc = path.join(src, app);\n const staticSrc = fs.existsSync(mountedSrc) ? mountedSrc : src;\n const target = path.join(distDir, NETLIFY_WORKSPACE_STATIC_DIR, app);\n fs.mkdirSync(target, { recursive: true });\n copyDir(staticSrc, target);\n // Nitro/Vite mounted builds can contain a nested copy of public assets at\n // dist/<app>/<app>/...; the workspace root already supplies the outer\n // mount path, so keeping it would publish duplicate /<app>/<app> URLs.\n fs.rmSync(path.join(target, app), { recursive: true, force: true });\n copyNetlifyFunctionIntoWorkspace(workspaceRoot, app, workspaceApps, target);\n } else {\n const target = path.join(distDir, app);\n fs.mkdirSync(target, { recursive: true });\n copyDir(src, target);\n }\n}\n\n/**\n * Write the Cloudflare Pages `_routes.json` and a dispatcher `_worker.js` at\n * the workspace dist root so each app is reachable under /<app>/*.\n */\nfunction writeCloudflareRoutingManifest(distDir: string, apps: string[]): void {\n const dispatchFaviconAsset = apps.includes(\"dispatch\")\n ? dispatchRootFaviconAsset(distDir)\n : null;\n // _routes.json tells Cloudflare which paths are dynamic (Functions) vs\n // static. Mark /<app>/* as include so every app's worker handles its\n // subtree.\n const include = apps.map((a) => `/${a}/*`).concat([\"/\"]);\n if (apps.includes(\"dispatch\")) {\n include.push(\"/_agent-native/*\");\n include.push(\"/.well-known/*\");\n include.push(\n ...DISPATCH_WORKSPACE_ROOT_REDIRECTS.map(([from]) => `/${from}`),\n );\n include.push(\"/apps/*\");\n if (dispatchFaviconAsset) include.push(\"/favicon.ico\");\n }\n const routes = {\n version: 1,\n include,\n exclude: [],\n };\n fs.writeFileSync(\n path.join(distDir, \"_routes.json\"),\n JSON.stringify(routes, null, 2) + \"\\n\",\n );\n\n // Dispatcher worker: inspects the path and forwards to the matching\n // per-app worker.\n const imports = apps\n .map((a) => `import ${moduleIdent(a)} from \"./${a}/_worker.js\";`)\n .join(\"\\n\");\n const dispatch = apps\n .map(\n (a) =>\n ` if (pathname === \"/${a}\" || pathname.startsWith(\"/${a}/\")) return ${moduleIdent(a)}.fetch(request, env, ctx);`,\n )\n .join(\"\\n\");\n const dispatchRootFrameworkRoutes = apps.includes(\"dispatch\")\n ? ` if (pathname === \"/_agent-native\" || pathname.startsWith(\"/_agent-native/\") || pathname === \"/.well-known\" || pathname.startsWith(\"/.well-known/\")) return ${moduleIdent(\"dispatch\")}.fetch(request, env, ctx);\n`\n : \"\";\n const dispatchRootFaviconRoute = dispatchFaviconAsset\n ? ` if (pathname === \"/favicon.ico\") return Response.redirect(new URL(\"/dispatch/${dispatchFaviconAsset}\", request.url).toString(), 302);\n`\n : \"\";\n const dispatchRootAliasRoutes = apps.includes(\"dispatch\")\n ? DISPATCH_WORKSPACE_ROOT_REDIRECTS.map(\n ([from, to]) =>\n ` if (pathname === \"/${from}\") return Response.redirect(new URL(\"/dispatch/${to}\" + search, request.url).toString(), 302);`,\n ).join(\"\\n\") + \"\\n\"\n : \"\";\n const dispatchRootDynamicAliasRoutes = apps.includes(\"dispatch\")\n ? ` if (pathname.startsWith(\"/apps/\")) return Response.redirect(new URL(\"/dispatch\" + pathname + search, request.url).toString(), 302);\n`\n : \"\";\n\n const worker = `${imports}\n\nexport default {\n async fetch(request, env, ctx) {\n const { pathname, search } = new URL(request.url);\n${dispatchRootFrameworkRoutes}${dispatchRootFaviconRoute}${dispatchRootAliasRoutes}${dispatchRootDynamicAliasRoutes}${dispatch}\n if (pathname === \"/\") {\n return Response.redirect(new URL(\"${cloudflareRootRedirectPath(apps)}\", request.url).toString(), 302);\n }\n return new Response(\"Not found\", { status: 404 });\n },\n};\n`;\n fs.writeFileSync(path.join(distDir, \"_worker.js\"), worker);\n}\n\nfunction cloudflareRootRedirectPath(apps: string[]): string {\n return apps.includes(\"dispatch\") ? \"/dispatch/overview\" : `/${apps[0]}/`;\n}\n\nfunction writeNetlifyRedirects(distDir: string, apps: string[]): void {\n const lines: string[] = [\n \"# Generated by agent-native deploy --preset netlify\",\n \"# Static app assets are stored under a safe namespace; dynamic app routes are handled by function route config.\",\n ];\n\n if (apps.includes(\"dispatch\")) {\n lines.push(\"/_agent-native/* /.netlify/functions/dispatch-server 200\");\n lines.push(\"/.well-known/* /.netlify/functions/dispatch-server 200\");\n const faviconAsset = dispatchRootFaviconAsset(distDir);\n if (faviconAsset) {\n lines.push(`/favicon.ico /dispatch/${faviconAsset} 302`);\n }\n }\n\n for (const app of apps) {\n lines.push(...netlifyAssetRedirectsFor(app, distDir));\n }\n\n if (apps.includes(\"dispatch\")) {\n lines.push(\"/ /dispatch/overview 302\");\n lines.push(\"/dispatch /dispatch/overview 302\");\n for (const [from, to] of DISPATCH_WORKSPACE_ROOT_REDIRECTS) {\n lines.push(`/${from} /dispatch/${to} 302`);\n }\n lines.push(\"/apps/* /dispatch/apps/:splat 302\");\n } else {\n lines.push(`/ /${apps[0]}/ 302`);\n }\n\n fs.writeFileSync(path.join(distDir, \"_redirects\"), lines.join(\"\\n\") + \"\\n\");\n}\n\nfunction netlifyAssetRedirectsFor(app: string, distDir: string): string[] {\n const from = `/${app}`;\n const to = `/${NETLIFY_WORKSPACE_STATIC_DIR}/${app}`;\n return [\n `${from}/assets/* ${to}/assets/:splat 200`,\n ...netlifyPublicRootAssetPaths(\n app,\n path.join(distDir, NETLIFY_WORKSPACE_STATIC_DIR, app),\n ).map((assetPath) => {\n const assetName = assetPath.slice(from.length + 1);\n return `${assetPath} ${to}/${assetName} 200`;\n }),\n ];\n}\n\nfunction dispatchRootFaviconAsset(distDir: string): string | null {\n for (const asset of [\"favicon.ico\", \"favicon.svg\", \"favicon.png\"]) {\n if (workspaceAppAssetExists(distDir, \"dispatch\", asset)) return asset;\n }\n return null;\n}\n\nfunction workspaceAppAssetExists(\n distDir: string,\n app: string,\n asset: string,\n): boolean {\n return [\n path.join(distDir, NETLIFY_WORKSPACE_STATIC_DIR, app, asset),\n path.join(distDir, app, app, asset),\n path.join(distDir, app, asset),\n ].some((candidate) => fs.existsSync(candidate));\n}\n\nconst RESERVED_WORKSPACE_APP_IDS = new Set([\n \"_agent-native\",\n \"_workspace_static\",\n \"netlify\",\n ...DISPATCH_WORKSPACE_ROOT_REDIRECTS.map(([from]) => from),\n]);\n\nfunction assertNoReservedWorkspaceAppIds(apps: string[]): void {\n const conflicts = apps.filter(\n (app) => app !== \"dispatch\" && RESERVED_WORKSPACE_APP_IDS.has(app),\n );\n if (conflicts.length === 0) return;\n throw new Error(\n `Workspace app id ${conflicts.map((id) => `\"${id}\"`).join(\", \")} conflicts with reserved workspace routes. Choose a different app id.`,\n );\n}\n\nfunction copyNetlifyFunctionIntoWorkspace(\n workspaceRoot: string,\n app: string,\n workspaceApps: WorkspaceAppManifestEntry[],\n staticDir: string,\n): void {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n const src = path.join(appDir, \".netlify\", \"functions-internal\", \"server\");\n if (!fs.existsSync(src)) {\n throw new Error(\n `Expected Netlify function at ${src} after building ${app}. Check the app's build script and NITRO_PRESET.`,\n );\n }\n\n const dest = path.join(netlifyFunctionsDir(workspaceRoot), `${app}-server`);\n fs.rmSync(dest, { recursive: true, force: true });\n copyDir(src, dest);\n patchNetlifyFunctionEntry(dest, app, workspaceApps, staticDir);\n}\n\nfunction patchNetlifyFunctionEntry(\n functionDir: string,\n app: string,\n workspaceApps: WorkspaceAppManifestEntry[],\n staticDir: string,\n): void {\n const serverPath = path.join(functionDir, \"server.mjs\");\n if (!fs.existsSync(serverPath)) return;\n\n const basePath = `/${app}`;\n const pathConfig =\n app === \"dispatch\"\n ? [\"/_agent-native/*\", \"/.well-known/*\", `${basePath}/*`]\n : [basePath, `${basePath}/*`];\n const normalizeBasePathHelper =\n app === \"dispatch\"\n ? \"\"\n : `\nfunction normalizeBasePathArgs(args) {\n const request = args[0];\n if (!request || typeof request.url !== \"string\" || typeof Request !== \"function\") {\n return args;\n }\n const url = new URL(request.url);\n if (url.pathname === basePath || url.pathname === \\`\\${basePath}/\\`) {\n url.pathname = \\`\\${basePath}//\\`;\n return [new Request(url, request), ...args.slice(1)];\n }\n return args;\n}\n`;\n const handlerArgs =\n app === \"dispatch\" ? \"...args\" : \"...normalizeBasePathArgs(args)\";\n const server = `const basePath = ${JSON.stringify(basePath)};\n\nfunction setBasePathEnv() {\n const processRef = globalThis.process ??= { env: {} };\n processRef.env ??= {};\n Object.assign(processRef.env, {\n AGENT_NATIVE_WORKSPACE: \"1\",\n APP_BASE_PATH: basePath,\n VITE_AGENT_NATIVE_WORKSPACE: \"1\",\n VITE_APP_BASE_PATH: basePath,\n ${JSON.stringify(WORKSPACE_APPS_ENV_KEY)}: ${JSON.stringify(JSON.stringify(workspaceApps))},\n });\n}\n\nsetBasePathEnv();\n${normalizeBasePathHelper}\n\nlet cachedHandler;\n\nexport default async function handler(...args) {\n setBasePathEnv();\n cachedHandler ??= (await import(\"./main.mjs\")).default;\n return cachedHandler(${handlerArgs});\n}\n\nexport const config = {\n name: ${JSON.stringify(`${app} server handler`)},\n generator: \"agent-native workspace deploy\",\n path: ${JSON.stringify(pathConfig)},\n nodeBundler: \"none\",\n includedFiles: [\"**\"],\n excludedPath: ${JSON.stringify(\n netlifyFunctionExcludedPaths(app, staticDir),\n null,\n 2,\n )\n .split(\"\\n\")\n .join(\"\\n \")},\n preferStatic: false,\n};\n`;\n fs.rmSync(serverPath, { force: true });\n fs.writeFileSync(path.join(functionDir, `${app}-server.mjs`), server);\n}\n\nfunction netlifyFunctionExcludedPaths(\n app: string,\n staticDir: string,\n): string[] {\n return [\n \"/.netlify/*\",\n `/${app}/assets/*`,\n ...netlifyPublicRootAssetPaths(app, staticDir),\n ];\n}\n\nfunction netlifyPublicRootAssetPaths(app: string, staticDir: string): string[] {\n if (!fs.existsSync(staticDir)) return [];\n return fs\n .readdirSync(staticDir, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => {\n const ext = path.extname(name).slice(1).toLowerCase();\n return NETLIFY_PUBLIC_ASSET_EXTENSIONS.has(ext);\n })\n .sort()\n .map((name) => `/${app}/${encodeURI(name)}`);\n}\n\nfunction netlifyFunctionsDir(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".netlify\", \"functions-internal\");\n}\n\nfunction cleanAppBuildOutputs(appDir: string): void {\n for (const name of [\"dist\", \".output\", \"build\"]) {\n fs.rmSync(path.join(appDir, name), { recursive: true, force: true });\n }\n fs.rmSync(path.join(appDir, \".netlify\", \"functions-internal\"), {\n recursive: true,\n force: true,\n });\n}\n\nfunction appUsesNetlifyUnpooledDatabaseUrl(appDir: string): boolean {\n const netlifyPath = path.join(appDir, \"netlify.toml\");\n if (!fs.existsSync(netlifyPath)) return false;\n try {\n return fs\n .readFileSync(netlifyPath, \"utf-8\")\n .includes(\"NETLIFY_DATABASE_URL_UNPOOLED\");\n } catch {\n return false;\n }\n}\n\nfunction writeWorkspaceAppManifests(\n workspaceRoot: string,\n distDir: string,\n apps: string[],\n workspaceApps: WorkspaceAppManifestEntry[],\n preset: WorkspaceDeployPreset,\n): void {\n const manifest = JSON.stringify(\n {\n version: 1,\n apps: workspaceApps,\n },\n null,\n 2,\n );\n\n const targets =\n preset === \"netlify\"\n ? apps.map((app) =>\n path.join(\n netlifyFunctionsDir(workspaceRoot),\n `${app}-server`,\n WORKSPACE_APPS_MANIFEST_DIR,\n WORKSPACE_APPS_MANIFEST_FILE,\n ),\n )\n : apps.map((app) =>\n path.join(\n distDir,\n app,\n WORKSPACE_APPS_MANIFEST_DIR,\n WORKSPACE_APPS_MANIFEST_FILE,\n ),\n );\n\n for (const target of targets) {\n fs.mkdirSync(path.dirname(target), { recursive: true });\n fs.writeFileSync(target, `${manifest}\\n`);\n }\n}\n\nfunction readWorkspaceAppManifest(\n workspaceRoot: string,\n apps: string[],\n): WorkspaceAppManifestEntry[] {\n const explicitApps = readExistingWorkspaceAppManifest(workspaceRoot);\n\n return apps\n .map((app) => {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n const pkg = readPackageJson(path.join(appDir, \"package.json\"));\n const appPath = `/${app}`;\n const explicit = explicitApps.get(app);\n const url =\n normalizeWorkspaceAppUrl(explicit?.url) ?? workspaceAppUrl(appPath);\n return {\n id: app,\n name: pkg?.displayName || titleCase(app),\n description: pkg?.description || \"\",\n path: appPath,\n ...(url ? { url } : {}),\n isDispatch: app === \"dispatch\",\n };\n })\n .sort((a, b) => {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction readExistingWorkspaceAppManifest(\n workspaceRoot: string,\n): Map<string, { url?: string }> {\n const fromEnv = parseWorkspaceAppsJson(process.env[WORKSPACE_APPS_ENV_KEY]);\n const fromFile =\n readWorkspaceAppsFromFile(\n path.join(\n workspaceRoot,\n WORKSPACE_APPS_MANIFEST_DIR,\n WORKSPACE_APPS_MANIFEST_FILE,\n ),\n ) ??\n readWorkspaceAppsFromFile(\n path.join(workspaceRoot, WORKSPACE_APPS_MANIFEST_FILE),\n );\n const apps = fromEnv ?? fromFile ?? [];\n return new Map(apps.map((app) => [app.id, app]));\n}\n\nfunction parseWorkspaceAppsJson(\n raw: string | undefined,\n): Array<{ id: string; url?: string }> | null {\n if (!raw) return null;\n try {\n return parseWorkspaceAppsManifest(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nfunction readWorkspaceAppsFromFile(\n file: string,\n): Array<{ id: string; url?: string }> | null {\n if (!fs.existsSync(file)) return null;\n return parseWorkspaceAppsManifest(readPackageJson(file));\n}\n\nfunction parseWorkspaceAppsManifest(\n parsed: any,\n): Array<{ id: string; url?: string }> | null {\n const rawApps = Array.isArray(parsed?.apps)\n ? parsed.apps\n : Array.isArray(parsed)\n ? parsed\n : null;\n if (!rawApps) return null;\n\n const apps = rawApps\n .map((entry) => {\n if (!entry || typeof entry !== \"object\") return null;\n const id = typeof entry.id === \"string\" ? entry.id.trim() : \"\";\n if (!id) return null;\n const url = normalizeWorkspaceAppUrl(entry.url);\n return {\n id,\n ...(url ? { url } : {}),\n };\n })\n .filter((app): app is { id: string; url?: string } => !!app);\n\n return apps.length ? apps : null;\n}\n\nfunction workspaceBaseUrl(): string | null {\n return (\n process.env.WORKSPACE_GATEWAY_URL ||\n process.env.APP_URL ||\n process.env.URL ||\n process.env.DEPLOY_URL ||\n process.env.BETTER_AUTH_URL ||\n null\n );\n}\n\nfunction workspaceAppUrl(appPath: string): string | undefined {\n const base = workspaceBaseUrl();\n if (!base) return undefined;\n try {\n return new URL(appPath, `${base.replace(/\\/$/, \"\")}/`).toString();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeWorkspaceAppUrl(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value.trim()) return undefined;\n try {\n return new URL(value.trim()).toString().replace(/\\/$/, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction readPackageJson(file: string): Record<string, any> | null {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction parsePresetArg(args: string[]): WorkspaceDeployPreset | null {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--preset\" && args[i + 1]) {\n return normalizePreset(args[i + 1]);\n }\n if (arg.startsWith(\"--preset=\")) {\n return normalizePreset(arg.slice(\"--preset=\".length));\n }\n }\n return null;\n}\n\nfunction resolvePreset(\n optionPreset: WorkspaceDeployPreset | undefined,\n args: string[],\n): WorkspaceDeployPreset {\n return (\n optionPreset ??\n parsePresetArg(args) ??\n normalizePreset(process.env.NITRO_PRESET) ??\n \"cloudflare_pages\"\n );\n}\n\nfunction assertWorkspaceDeployProductionEnv(opts: {\n buildOnly: boolean;\n preset: WorkspaceDeployPreset;\n}): void {\n if (!isProductionWorkspaceDeploy(opts)) return;\n if (process.env.A2A_SECRET?.trim()) return;\n throw new Error(\n [\n \"A2A_SECRET is required for production workspace deploys.\",\n \"Workspace Slack, webhook, and cross-app A2A work resumes through signed background processors; without A2A_SECRET those production routes return 503.\",\n 'Set A2A_SECRET in your deploy provider (for example: netlify env:set A2A_SECRET \"$(openssl rand -hex 32)\") and redeploy.',\n \"For local artifact checks, run agent-native deploy --build-only outside the deploy provider environment.\",\n ].join(\" \"),\n );\n}\n\nfunction isProductionWorkspaceDeploy(opts: {\n buildOnly: boolean;\n preset: WorkspaceDeployPreset;\n}): boolean {\n if (!opts.buildOnly) return true;\n if (\n opts.preset === \"netlify\" &&\n process.env.NETLIFY === \"true\" &&\n process.env.NETLIFY_LOCAL !== \"true\"\n ) {\n return true;\n }\n if (opts.preset === \"cloudflare_pages\" && process.env.CF_PAGES === \"1\") {\n return true;\n }\n return false;\n}\n\nfunction normalizePreset(\n value: string | undefined,\n): WorkspaceDeployPreset | null {\n if (!value) return null;\n if (value === \"cloudflare_pages\" || value === \"cloudflare-pages\") {\n return \"cloudflare_pages\";\n }\n if (value === \"netlify\") return \"netlify\";\n throw new Error(\n `Unsupported workspace deploy preset \"${value}\". Supported presets: cloudflare_pages, netlify.`,\n );\n}\n\nfunction moduleIdent(app: string): string {\n return \"app_\" + app.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\nfunction compareWorkspaceAppIds(a: string, b: string): number {\n if (a === \"dispatch\") return -1;\n if (b === \"dispatch\") return 1;\n return a.localeCompare(b);\n}\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n for (const entry of fs.readdirSync(src, { withFileTypes: true })) {\n const s = path.join(src, entry.name);\n const d = path.join(dest, entry.name);\n if (entry.isSymbolicLink()) {\n try {\n const target = fs.readlinkSync(s);\n fs.symlinkSync(target, d);\n } catch {\n fs.copyFileSync(s, d);\n }\n } else if (entry.isDirectory()) {\n copyDir(s, d);\n } else {\n fs.copyFileSync(s, d);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"workspace-deploy.js","sourceRoot":"","sources":["../../src/deploy/workspace-deploy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `agent-native deploy` — build and deploy every app in a workspace to a\n * single origin. Each app is served from `/<app-name>/*`, so:\n *\n * https://your-agents.com/mail/* → apps/mail\n * https://your-agents.com/calendar/* → apps/calendar\n *\n * Benefits of same-origin deploy:\n * - Shared auth cookie → log in once, every app is signed in\n * - Cross-app A2A is a same-origin fetch (no CORS, no JWT for siblings)\n * - One DNS record, one TLS cert, one CDN cache\n *\n * Per-app independent deploy is still supported — just cd into the app and\n * run `agent-native build` as before. This orchestrator is for teams that\n * want the whole workspace behind one domain.\n */\nimport { execFileSync } from \"child_process\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { findWorkspaceRoot } from \"../scripts/utils.js\";\nimport { DISPATCH_WORKSPACE_ROOT_REDIRECTS } from \"../shared/workspace-app-id.js\";\n\nexport type WorkspaceDeployPreset = \"cloudflare_pages\" | \"netlify\";\n\nconst NETLIFY_WORKSPACE_STATIC_DIR = \"_workspace_static\";\nconst NETLIFY_PUBLIC_ASSET_EXTENSIONS = new Set([\n \"avif\",\n \"css\",\n \"gif\",\n \"ico\",\n \"jpeg\",\n \"jpg\",\n \"js\",\n \"json\",\n \"map\",\n \"mp4\",\n \"pdf\",\n \"png\",\n \"svg\",\n \"txt\",\n \"wasm\",\n \"webm\",\n \"webmanifest\",\n \"webp\",\n \"xml\",\n]);\nconst WORKSPACE_APPS_ENV_KEY = \"AGENT_NATIVE_WORKSPACE_APPS_JSON\";\nconst WORKSPACE_APPS_MANIFEST_DIR = \".agent-native\";\nconst WORKSPACE_APPS_MANIFEST_FILE = \"workspace-apps.json\";\n\ninterface WorkspaceAppManifestEntry {\n id: string;\n name: string;\n description: string;\n path: string;\n url?: string;\n isDispatch: boolean;\n}\n\nexport interface WorkspaceDeployOptions {\n args?: string[];\n /** Override the workspace root (defaults to walking up from cwd). */\n workspaceRoot?: string;\n /** Only build — don't invoke the deploy platform CLI. */\n buildOnly?: boolean;\n /** Target preset. Defaults to `cloudflare_pages`. */\n preset?: WorkspaceDeployPreset;\n /** @internal Override process execution in tests. */\n execFile?: typeof execFileSync;\n}\n\nexport async function runWorkspaceDeploy(\n opts: WorkspaceDeployOptions = {},\n): Promise<void> {\n const workspaceRoot =\n opts.workspaceRoot ?? findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const appsDir = path.join(workspaceRoot, \"apps\");\n if (!fs.existsSync(appsDir)) {\n throw new Error(\n `No apps/ directory found at ${workspaceRoot}. Run this inside an agent-native workspace.`,\n );\n }\n\n const rawArgs = opts.args ?? [];\n const args = new Set(rawArgs);\n const buildOnly = opts.buildOnly ?? args.has(\"--build-only\");\n\n const apps = fs\n .readdirSync(appsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .filter((n) => fs.existsSync(path.join(appsDir, n, \"package.json\")))\n .sort(compareWorkspaceAppIds);\n\n if (apps.length === 0) {\n throw new Error(\n `Workspace has no apps. Run \\`agent-native add-app\\` to add one.`,\n );\n }\n assertNoReservedWorkspaceAppIds(apps);\n const workspaceApps = readWorkspaceAppManifest(workspaceRoot, apps);\n\n const preset = resolvePreset(opts.preset, rawArgs);\n assertWorkspaceDeployProductionEnv({ buildOnly, preset });\n const distDir = path.join(workspaceRoot, \"dist\");\n fs.rmSync(distDir, { recursive: true, force: true });\n fs.mkdirSync(distDir, { recursive: true });\n\n if (preset === \"netlify\") {\n const functionsDir = netlifyFunctionsDir(workspaceRoot);\n fs.rmSync(functionsDir, { recursive: true, force: true });\n fs.mkdirSync(functionsDir, { recursive: true });\n }\n\n console.log(\n `[workspace-deploy] Building ${apps.length} app(s) for preset=${preset}`,\n );\n\n const execFile = opts.execFile ?? execFileSync;\n for (const app of apps) {\n buildOneApp(workspaceRoot, app, preset, execFile, workspaceApps);\n moveAppBuildIntoDist(workspaceRoot, app, distDir, preset, workspaceApps);\n }\n writeWorkspaceAppManifests(\n workspaceRoot,\n distDir,\n apps,\n workspaceApps,\n preset,\n );\n\n if (preset === \"netlify\") {\n writeNetlifyRedirects(distDir, apps);\n } else {\n writeCloudflareRoutingManifest(distDir, apps);\n }\n\n if (buildOnly) {\n console.log(\n `\\n[workspace-deploy] Build complete at ${distDir}. Skipping publish (--build-only).`,\n );\n return;\n }\n\n console.log(`\\n[workspace-deploy] Build complete. Publish with:\\n`);\n console.log(` cd ${path.relative(process.cwd(), workspaceRoot) || \".\"}`);\n if (preset === \"netlify\") {\n console.log(\n ` netlify deploy --prod --dir=dist --functions=.netlify/functions-internal\\n`,\n );\n } else {\n console.log(` wrangler pages deploy dist\\n`);\n }\n console.log(\n `All apps live at https://<origin>/<app-name>/*. Log in once on any app\\nand the session is shared across the workspace.`,\n );\n}\n\nfunction buildOneApp(\n workspaceRoot: string,\n app: string,\n preset: WorkspaceDeployPreset,\n execFile: typeof execFileSync,\n workspaceApps: WorkspaceAppManifestEntry[],\n): void {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n NITRO_PRESET: preset,\n AGENT_NATIVE_WORKSPACE: \"1\",\n VITE_AGENT_NATIVE_WORKSPACE: \"1\",\n APP_BASE_PATH: `/${app}`,\n VITE_APP_BASE_PATH: `/${app}`,\n [WORKSPACE_APPS_ENV_KEY]: JSON.stringify(workspaceApps),\n };\n\n if (preset === \"netlify\" && appUsesNetlifyUnpooledDatabaseUrl(appDir)) {\n env.DATABASE_URL =\n process.env.NETLIFY_DATABASE_URL_UNPOOLED ??\n process.env.DATABASE_URL ??\n env.DATABASE_URL;\n }\n\n console.log(\n `[workspace-deploy] Building ${app} (base=/${app}, preset=${preset})`,\n );\n\n cleanAppBuildOutputs(appDir);\n\n execFile(\"pnpm\", [\"--filter\", app, \"build\"], {\n cwd: workspaceRoot,\n env,\n stdio: \"inherit\",\n });\n}\n\nfunction moveAppBuildIntoDist(\n workspaceRoot: string,\n app: string,\n distDir: string,\n preset: WorkspaceDeployPreset,\n workspaceApps: WorkspaceAppManifestEntry[],\n): void {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n // Resolve the per-app build output: prefer dist/ (standard), fall back to\n // .output/ (Nitro's default). The Cloudflare preset emits into dist/\n // containing the worker + assets.\n const candidates = [\"dist\", \".output\"];\n const src = candidates\n .map((c) => path.join(appDir, c))\n .find((p) => fs.existsSync(p));\n if (!src) {\n throw new Error(\n `Expected ${candidates.join(\" or \")} under ${appDir} but none existed. Check the app's build script.`,\n );\n }\n if (preset === \"netlify\") {\n const mountedSrc = path.join(src, app);\n const staticSrc = fs.existsSync(mountedSrc) ? mountedSrc : src;\n const target = path.join(distDir, NETLIFY_WORKSPACE_STATIC_DIR, app);\n fs.mkdirSync(target, { recursive: true });\n copyDir(staticSrc, target);\n // Nitro/Vite mounted builds can contain a nested copy of public assets at\n // dist/<app>/<app>/...; the workspace root already supplies the outer\n // mount path, so keeping it would publish duplicate /<app>/<app> URLs.\n fs.rmSync(path.join(target, app), { recursive: true, force: true });\n copyNetlifyFunctionIntoWorkspace(workspaceRoot, app, workspaceApps, target);\n } else {\n const target = path.join(distDir, app);\n fs.mkdirSync(target, { recursive: true });\n copyDir(src, target);\n }\n}\n\n/**\n * Write the Cloudflare Pages `_routes.json` and a dispatcher `_worker.js` at\n * the workspace dist root so each app is reachable under /<app>/*.\n */\nfunction writeCloudflareRoutingManifest(distDir: string, apps: string[]): void {\n const dispatchFaviconAsset = apps.includes(\"dispatch\")\n ? dispatchRootFaviconAsset(distDir)\n : null;\n // _routes.json tells Cloudflare which paths are dynamic (Functions) vs\n // static. Mark /<app>/* as include so every app's worker handles its\n // subtree.\n const include = apps.map((a) => `/${a}/*`).concat([\"/\"]);\n if (apps.includes(\"dispatch\")) {\n include.push(\"/_agent-native/*\");\n include.push(\"/.well-known/*\");\n include.push(\n ...DISPATCH_WORKSPACE_ROOT_REDIRECTS.map(([from]) => `/${from}`),\n );\n include.push(\"/apps/*\");\n if (dispatchFaviconAsset) include.push(\"/favicon.ico\");\n }\n const routes = {\n version: 1,\n include,\n exclude: [],\n };\n fs.writeFileSync(\n path.join(distDir, \"_routes.json\"),\n JSON.stringify(routes, null, 2) + \"\\n\",\n );\n\n // Dispatcher worker: inspects the path and forwards to the matching\n // per-app worker.\n const imports = apps\n .map((a) => `import ${moduleIdent(a)} from \"./${a}/_worker.js\";`)\n .join(\"\\n\");\n const dispatch = apps\n .map(\n (a) =>\n ` if (pathname === \"/${a}\" || pathname.startsWith(\"/${a}/\")) return ${moduleIdent(a)}.fetch(request, env, ctx);`,\n )\n .join(\"\\n\");\n const dispatchRootFrameworkRoutes = apps.includes(\"dispatch\")\n ? ` if (pathname === \"/_agent-native\" || pathname.startsWith(\"/_agent-native/\") || pathname === \"/.well-known\" || pathname.startsWith(\"/.well-known/\")) return ${moduleIdent(\"dispatch\")}.fetch(request, env, ctx);\n`\n : \"\";\n const dispatchRootFaviconRoute = dispatchFaviconAsset\n ? ` if (pathname === \"/favicon.ico\") return Response.redirect(new URL(\"/dispatch/${dispatchFaviconAsset}\", request.url).toString(), 302);\n`\n : \"\";\n const dispatchRootAliasRoutes = apps.includes(\"dispatch\")\n ? DISPATCH_WORKSPACE_ROOT_REDIRECTS.map(\n ([from, to]) =>\n ` if (pathname === \"/${from}\") return Response.redirect(new URL(\"/dispatch/${to}\" + search, request.url).toString(), 302);`,\n ).join(\"\\n\") + \"\\n\"\n : \"\";\n const dispatchRootDynamicAliasRoutes = apps.includes(\"dispatch\")\n ? ` if (pathname.startsWith(\"/apps/\")) return Response.redirect(new URL(\"/dispatch\" + pathname + search, request.url).toString(), 302);\n`\n : \"\";\n\n const worker = `${imports}\n\nexport default {\n async fetch(request, env, ctx) {\n const { pathname, search } = new URL(request.url);\n${dispatchRootFrameworkRoutes}${dispatchRootFaviconRoute}${dispatchRootAliasRoutes}${dispatchRootDynamicAliasRoutes}${dispatch}\n if (pathname === \"/\") {\n return Response.redirect(new URL(\"${cloudflareRootRedirectPath(apps)}\", request.url).toString(), 302);\n }\n return new Response(\"Not found\", { status: 404 });\n },\n};\n`;\n fs.writeFileSync(path.join(distDir, \"_worker.js\"), worker);\n}\n\nfunction cloudflareRootRedirectPath(apps: string[]): string {\n return apps.includes(\"dispatch\") ? \"/dispatch/overview\" : `/${apps[0]}/`;\n}\n\nfunction writeNetlifyRedirects(distDir: string, apps: string[]): void {\n const lines: string[] = [\n \"# Generated by agent-native deploy --preset netlify\",\n \"# Static app assets are stored under a safe namespace; dynamic app routes are handled by function route config.\",\n ];\n\n if (apps.includes(\"dispatch\")) {\n lines.push(\"/_agent-native/* /.netlify/functions/dispatch-server 200\");\n lines.push(\"/.well-known/* /.netlify/functions/dispatch-server 200\");\n const faviconAsset = dispatchRootFaviconAsset(distDir);\n if (faviconAsset) {\n lines.push(`/favicon.ico /dispatch/${faviconAsset} 302`);\n }\n }\n\n for (const app of apps) {\n lines.push(...netlifyAssetRedirectsFor(app, distDir));\n }\n\n if (apps.includes(\"dispatch\")) {\n lines.push(\"/ /dispatch/overview 302\");\n lines.push(\"/dispatch /dispatch/overview 302\");\n for (const [from, to] of DISPATCH_WORKSPACE_ROOT_REDIRECTS) {\n lines.push(`/${from} /dispatch/${to} 302`);\n }\n lines.push(\"/apps/* /dispatch/apps/:splat 302\");\n } else {\n lines.push(`/ /${apps[0]}/ 302`);\n }\n\n fs.writeFileSync(path.join(distDir, \"_redirects\"), lines.join(\"\\n\") + \"\\n\");\n}\n\nfunction netlifyAssetRedirectsFor(app: string, distDir: string): string[] {\n const from = `/${app}`;\n const to = `/${NETLIFY_WORKSPACE_STATIC_DIR}/${app}`;\n return [\n `${from}/assets/* ${to}/assets/:splat 200`,\n ...netlifyPublicRootAssetPaths(\n app,\n path.join(distDir, NETLIFY_WORKSPACE_STATIC_DIR, app),\n ).map((assetPath) => {\n const assetName = assetPath.slice(from.length + 1);\n return `${assetPath} ${to}/${assetName} 200`;\n }),\n ];\n}\n\nfunction dispatchRootFaviconAsset(distDir: string): string | null {\n for (const asset of [\"favicon.ico\", \"favicon.svg\", \"favicon.png\"]) {\n if (workspaceAppAssetExists(distDir, \"dispatch\", asset)) return asset;\n }\n return null;\n}\n\nfunction workspaceAppAssetExists(\n distDir: string,\n app: string,\n asset: string,\n): boolean {\n return [\n path.join(distDir, NETLIFY_WORKSPACE_STATIC_DIR, app, asset),\n path.join(distDir, app, app, asset),\n path.join(distDir, app, asset),\n ].some((candidate) => fs.existsSync(candidate));\n}\n\nconst RESERVED_WORKSPACE_APP_IDS = new Set([\n \"_agent-native\",\n \"_workspace_static\",\n \"netlify\",\n ...DISPATCH_WORKSPACE_ROOT_REDIRECTS.map(([from]) => from),\n]);\n\nfunction assertNoReservedWorkspaceAppIds(apps: string[]): void {\n const conflicts = apps.filter(\n (app) => app !== \"dispatch\" && RESERVED_WORKSPACE_APP_IDS.has(app),\n );\n if (conflicts.length === 0) return;\n throw new Error(\n `Workspace app id ${conflicts.map((id) => `\"${id}\"`).join(\", \")} conflicts with reserved workspace routes. Choose a different app id.`,\n );\n}\n\nfunction copyNetlifyFunctionIntoWorkspace(\n workspaceRoot: string,\n app: string,\n workspaceApps: WorkspaceAppManifestEntry[],\n staticDir: string,\n): void {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n const src = path.join(appDir, \".netlify\", \"functions-internal\", \"server\");\n if (!fs.existsSync(src)) {\n throw new Error(\n `Expected Netlify function at ${src} after building ${app}. Check the app's build script and NITRO_PRESET.`,\n );\n }\n\n const dest = path.join(netlifyFunctionsDir(workspaceRoot), `${app}-server`);\n fs.rmSync(dest, { recursive: true, force: true });\n copyDir(src, dest);\n patchNetlifyFunctionEntry(dest, app, workspaceApps, staticDir);\n}\n\nfunction patchNetlifyFunctionEntry(\n functionDir: string,\n app: string,\n workspaceApps: WorkspaceAppManifestEntry[],\n staticDir: string,\n): void {\n const serverPath = path.join(functionDir, \"server.mjs\");\n if (!fs.existsSync(serverPath)) return;\n\n const basePath = `/${app}`;\n const pathConfig =\n app === \"dispatch\"\n ? [\"/_agent-native/*\", \"/.well-known/*\", `${basePath}/*`]\n : [basePath, `${basePath}/*`];\n const normalizeBasePathHelper =\n app === \"dispatch\"\n ? \"\"\n : `\nfunction normalizeBasePathArgs(args) {\n const request = args[0];\n if (!request || typeof request.url !== \"string\" || typeof Request !== \"function\") {\n return args;\n }\n const url = new URL(request.url);\n if (url.pathname === basePath || url.pathname === \\`\\${basePath}/\\`) {\n url.pathname = \\`\\${basePath}//\\`;\n return [new Request(url, request), ...args.slice(1)];\n }\n return args;\n}\n`;\n const handlerArgs =\n app === \"dispatch\" ? \"...args\" : \"...normalizeBasePathArgs(args)\";\n const server = `const basePath = ${JSON.stringify(basePath)};\n\nfunction setBasePathEnv() {\n const processRef = globalThis.process ??= { env: {} };\n processRef.env ??= {};\n Object.assign(processRef.env, {\n AGENT_NATIVE_WORKSPACE: \"1\",\n APP_BASE_PATH: basePath,\n VITE_AGENT_NATIVE_WORKSPACE: \"1\",\n VITE_APP_BASE_PATH: basePath,\n ${JSON.stringify(WORKSPACE_APPS_ENV_KEY)}: ${JSON.stringify(JSON.stringify(workspaceApps))},\n });\n}\n\nsetBasePathEnv();\n${normalizeBasePathHelper}\n\nlet cachedHandler;\n\nexport default async function handler(...args) {\n setBasePathEnv();\n cachedHandler ??= (await import(\"./main.mjs\")).default;\n return cachedHandler(${handlerArgs});\n}\n\nexport const config = {\n name: ${JSON.stringify(`${app} server handler`)},\n generator: \"agent-native workspace deploy\",\n path: ${JSON.stringify(pathConfig)},\n nodeBundler: \"none\",\n includedFiles: [\"**\"],\n excludedPath: ${JSON.stringify(\n netlifyFunctionExcludedPaths(app, staticDir),\n null,\n 2,\n )\n .split(\"\\n\")\n .join(\"\\n \")},\n preferStatic: false,\n};\n`;\n fs.rmSync(serverPath, { force: true });\n fs.writeFileSync(path.join(functionDir, `${app}-server.mjs`), server);\n}\n\nfunction netlifyFunctionExcludedPaths(\n app: string,\n staticDir: string,\n): string[] {\n return [\n \"/.netlify/*\",\n `/${app}/assets/*`,\n ...netlifyPublicRootAssetPaths(app, staticDir),\n ];\n}\n\nfunction netlifyPublicRootAssetPaths(app: string, staticDir: string): string[] {\n if (!fs.existsSync(staticDir)) return [];\n return fs\n .readdirSync(staticDir, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => {\n const ext = path.extname(name).slice(1).toLowerCase();\n return NETLIFY_PUBLIC_ASSET_EXTENSIONS.has(ext);\n })\n .sort()\n .map((name) => `/${app}/${encodeURI(name)}`);\n}\n\nfunction netlifyFunctionsDir(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".netlify\", \"functions-internal\");\n}\n\nfunction cleanAppBuildOutputs(appDir: string): void {\n for (const name of [\"dist\", \".output\", \"build\"]) {\n fs.rmSync(path.join(appDir, name), { recursive: true, force: true });\n }\n fs.rmSync(path.join(appDir, \".netlify\", \"functions-internal\"), {\n recursive: true,\n force: true,\n });\n}\n\nfunction appUsesNetlifyUnpooledDatabaseUrl(appDir: string): boolean {\n const netlifyPath = path.join(appDir, \"netlify.toml\");\n if (!fs.existsSync(netlifyPath)) return false;\n try {\n return fs\n .readFileSync(netlifyPath, \"utf-8\")\n .includes(\"NETLIFY_DATABASE_URL_UNPOOLED\");\n } catch {\n return false;\n }\n}\n\nfunction writeWorkspaceAppManifests(\n workspaceRoot: string,\n distDir: string,\n apps: string[],\n workspaceApps: WorkspaceAppManifestEntry[],\n preset: WorkspaceDeployPreset,\n): void {\n const manifest = JSON.stringify(\n {\n version: 1,\n apps: workspaceApps,\n },\n null,\n 2,\n );\n\n const targets =\n preset === \"netlify\"\n ? apps.map((app) =>\n path.join(\n netlifyFunctionsDir(workspaceRoot),\n `${app}-server`,\n WORKSPACE_APPS_MANIFEST_DIR,\n WORKSPACE_APPS_MANIFEST_FILE,\n ),\n )\n : apps.map((app) =>\n path.join(\n distDir,\n app,\n WORKSPACE_APPS_MANIFEST_DIR,\n WORKSPACE_APPS_MANIFEST_FILE,\n ),\n );\n\n for (const target of targets) {\n fs.mkdirSync(path.dirname(target), { recursive: true });\n fs.writeFileSync(target, `${manifest}\\n`);\n }\n}\n\nfunction readWorkspaceAppManifest(\n workspaceRoot: string,\n apps: string[],\n): WorkspaceAppManifestEntry[] {\n const explicitApps = readExistingWorkspaceAppManifest(workspaceRoot);\n\n return apps\n .map((app) => {\n const appDir = path.join(workspaceRoot, \"apps\", app);\n const pkg = readPackageJson(path.join(appDir, \"package.json\"));\n const appPath = `/${app}`;\n const explicit = explicitApps.get(app);\n const url =\n normalizeWorkspaceAppUrl(explicit?.url) ?? workspaceAppUrl(appPath);\n return {\n id: app,\n name: pkg?.displayName || titleCase(app),\n description: pkg?.description || \"\",\n path: appPath,\n ...(url ? { url } : {}),\n isDispatch: app === \"dispatch\",\n };\n })\n .sort((a, b) => {\n if (a.id === \"dispatch\") return -1;\n if (b.id === \"dispatch\") return 1;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction readExistingWorkspaceAppManifest(\n workspaceRoot: string,\n): Map<string, { url?: string }> {\n const fromEnv = parseWorkspaceAppsJson(process.env[WORKSPACE_APPS_ENV_KEY]);\n const fromFile =\n readWorkspaceAppsFromFile(\n path.join(\n workspaceRoot,\n WORKSPACE_APPS_MANIFEST_DIR,\n WORKSPACE_APPS_MANIFEST_FILE,\n ),\n ) ??\n readWorkspaceAppsFromFile(\n path.join(workspaceRoot, WORKSPACE_APPS_MANIFEST_FILE),\n );\n const apps = fromEnv ?? fromFile ?? [];\n return new Map(apps.map((app) => [app.id, app]));\n}\n\nfunction parseWorkspaceAppsJson(\n raw: string | undefined,\n): Array<{ id: string; url?: string }> | null {\n if (!raw) return null;\n try {\n return parseWorkspaceAppsManifest(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nfunction readWorkspaceAppsFromFile(\n file: string,\n): Array<{ id: string; url?: string }> | null {\n if (!fs.existsSync(file)) return null;\n return parseWorkspaceAppsManifest(readPackageJson(file));\n}\n\nfunction parseWorkspaceAppsManifest(\n parsed: any,\n): Array<{ id: string; url?: string }> | null {\n const rawApps = Array.isArray(parsed?.apps)\n ? parsed.apps\n : Array.isArray(parsed)\n ? parsed\n : null;\n if (!rawApps) return null;\n\n const apps = rawApps\n .map((entry) => {\n if (!entry || typeof entry !== \"object\") return null;\n const id = typeof entry.id === \"string\" ? entry.id.trim() : \"\";\n if (!id) return null;\n const url = normalizeWorkspaceAppUrl(entry.url);\n return {\n id,\n ...(url ? { url } : {}),\n };\n })\n .filter((app): app is { id: string; url?: string } => !!app);\n\n return apps.length ? apps : null;\n}\n\nfunction workspaceBaseUrl(): string | null {\n return (\n process.env.WORKSPACE_GATEWAY_URL ||\n process.env.APP_URL ||\n process.env.URL ||\n process.env.DEPLOY_URL ||\n process.env.BETTER_AUTH_URL ||\n null\n );\n}\n\nfunction workspaceAppUrl(appPath: string): string | undefined {\n const base = workspaceBaseUrl();\n if (!base) return undefined;\n try {\n return new URL(appPath, `${base.replace(/\\/$/, \"\")}/`).toString();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeWorkspaceAppUrl(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value.trim()) return undefined;\n try {\n return new URL(value.trim()).toString().replace(/\\/$/, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction readPackageJson(file: string): Record<string, any> | null {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\"));\n } catch {\n return null;\n }\n}\n\nfunction titleCase(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction parsePresetArg(args: string[]): WorkspaceDeployPreset | null {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--preset\" && args[i + 1]) {\n return normalizePreset(args[i + 1]);\n }\n if (arg.startsWith(\"--preset=\")) {\n return normalizePreset(arg.slice(\"--preset=\".length));\n }\n }\n return null;\n}\n\nfunction resolvePreset(\n optionPreset: WorkspaceDeployPreset | undefined,\n args: string[],\n): WorkspaceDeployPreset {\n return (\n optionPreset ??\n parsePresetArg(args) ??\n normalizePreset(process.env.NITRO_PRESET) ??\n \"cloudflare_pages\"\n );\n}\n\nfunction assertWorkspaceDeployProductionEnv(opts: {\n buildOnly: boolean;\n preset: WorkspaceDeployPreset;\n}): void {\n if (!isProductionWorkspaceDeploy(opts)) return;\n if (process.env.A2A_SECRET?.trim()) return;\n const providerHint =\n opts.preset === \"netlify\"\n ? ' For Netlify, one option is: netlify env:set A2A_SECRET \"$(openssl rand -hex 32)\".'\n : \"\";\n throw new Error(\n [\n \"A2A_SECRET is required for production workspace deploys.\",\n \"Workspace Slack, webhook, and cross-app A2A work resumes through signed background processors; without A2A_SECRET those production routes return 503.\",\n `Set A2A_SECRET in your deploy provider and redeploy.${providerHint}`,\n \"For local artifact checks, run agent-native deploy --build-only outside the deploy provider environment.\",\n ].join(\" \"),\n );\n}\n\nfunction isProductionWorkspaceDeploy(opts: {\n buildOnly: boolean;\n preset: WorkspaceDeployPreset;\n}): boolean {\n if (!opts.buildOnly) return true;\n if (\n opts.preset === \"netlify\" &&\n process.env.NETLIFY === \"true\" &&\n process.env.NETLIFY_LOCAL !== \"true\"\n ) {\n return true;\n }\n if (opts.preset === \"cloudflare_pages\" && process.env.CF_PAGES === \"1\") {\n return true;\n }\n return false;\n}\n\nfunction normalizePreset(\n value: string | undefined,\n): WorkspaceDeployPreset | null {\n if (!value) return null;\n if (value === \"cloudflare_pages\" || value === \"cloudflare-pages\") {\n return \"cloudflare_pages\";\n }\n if (value === \"netlify\") return \"netlify\";\n throw new Error(\n `Unsupported workspace deploy preset \"${value}\". Supported presets: cloudflare_pages, netlify.`,\n );\n}\n\nfunction moduleIdent(app: string): string {\n return \"app_\" + app.replace(/[^a-zA-Z0-9_]/g, \"_\");\n}\n\nfunction compareWorkspaceAppIds(a: string, b: string): number {\n if (a === \"dispatch\") return -1;\n if (b === \"dispatch\") return 1;\n return a.localeCompare(b);\n}\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, { recursive: true });\n for (const entry of fs.readdirSync(src, { withFileTypes: true })) {\n const s = path.join(src, entry.name);\n const d = path.join(dest, entry.name);\n if (entry.isSymbolicLink()) {\n try {\n const target = fs.readlinkSync(s);\n fs.symlinkSync(target, d);\n } catch {\n fs.copyFileSync(s, d);\n }\n } else if (entry.isDirectory()) {\n copyDir(s, d);\n } else {\n fs.copyFileSync(s, d);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"list-agent-engines.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAWvD,eAAO,MAAM,IAAI,EAAE,UAQlB,CAAC;AAEF,wBAAsB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CA+C3C"}
1
+ {"version":3,"file":"list-agent-engines.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAYvD,eAAO,MAAM,IAAI,EAAE,UAQlB,CAAC;AAEF,wBAAsB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAuD3C"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * list-agent-engines — returns the registered engine registry and current selection.
3
3
  */
4
- import { listAgentEngines, registerBuiltinEngines, detectEngineFromEnv, getAgentEngineEntry, isStoredEngineUsable, } from "../../agent/engine/index.js";
4
+ import { listAgentEngines, registerBuiltinEngines, detectEngineFromEnv, detectEngineFromUserSecrets, getAgentEngineEntry, isStoredEngineUsableForRequest, } from "../../agent/engine/index.js";
5
5
  import { DEFAULT_MODEL } from "../../agent/default-model.js";
6
6
  import { getSetting } from "../../settings/index.js";
7
7
  export const tool = {
@@ -19,20 +19,27 @@ export async function run() {
19
19
  const current = currentSetting
20
20
  ? currentSetting
21
21
  : null;
22
- // Same priority chain resolveEngine uses: stored (if usable) → AGENT_ENGINE
23
- // → detectanthropic. Gating stored on isStoredEngineUsable keeps this
24
- // in step with /agent-engine/status.
22
+ // Same priority chain resolveEngine uses after explicit request options:
23
+ // AGENT_ENGINE Builder app_secrets stored (if usable) user BYOK
24
+ // app_secrets env → anthropic. Gating stored on the request-aware helper
25
+ // keeps the picker in step with the runtime.
25
26
  const storedEntry = typeof current?.engine === "string"
26
27
  ? getAgentEngineEntry(current.engine)
27
28
  : undefined;
28
- const storedUsable = !!storedEntry && isStoredEngineUsable(current, storedEntry);
29
- const currentEntry = (storedUsable ? storedEntry : undefined) ??
30
- (process.env.AGENT_ENGINE
31
- ? getAgentEngineEntry(process.env.AGENT_ENGINE)
32
- : undefined) ??
29
+ const storedUsable = !!storedEntry &&
30
+ (await isStoredEngineUsableForRequest(current, storedEntry));
31
+ const detectedFromUser = await detectEngineFromUserSecrets();
32
+ const currentEntry = (process.env.AGENT_ENGINE
33
+ ? getAgentEngineEntry(process.env.AGENT_ENGINE)
34
+ : undefined) ??
35
+ (detectedFromUser?.name === "builder" ? detectedFromUser : undefined) ??
36
+ (storedUsable ? storedEntry : undefined) ??
37
+ detectedFromUser ??
33
38
  detectEngineFromEnv() ??
34
39
  undefined;
35
- const currentModel = storedUsable ? current?.model : undefined;
40
+ const currentModel = storedUsable && currentEntry?.name === current?.engine
41
+ ? current?.model
42
+ : undefined;
36
43
  const currentEngineName = currentEntry?.name ?? "anthropic";
37
44
  const result = {
38
45
  engines: engines.map((e) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"list-agent-engines.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,mNAAmN;IACrN,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,sBAAsB,EAAE,CAAC;IAEzB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,cAAc;QAC5B,CAAC,CAAE,cAAsD;QACzD,CAAC,CAAC,IAAI,CAAC;IAET,4EAA4E;IAC5E,yEAAyE;IACzE,qCAAqC;IACrC,MAAM,WAAW,GACf,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ;QACjC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAChB,CAAC,CAAC,WAAW,IAAI,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE9D,MAAM,YAAY,GAChB,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACxC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;YACvB,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAC/C,CAAC,CAAC,SAAS,CAAC;QACd,mBAAmB,EAAE;QACrB,SAAS,CAAC;IACZ,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,MAAM,iBAAiB,GAAG,YAAY,EAAE,IAAI,IAAI,WAAW,CAAC;IAE5D,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,cAAc,EAAE,CAAC,CAAC,cAAc;SACjC,CAAC,CAAC;QACH,OAAO,EAAE;YACP,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,YAAY,IAAI,YAAY,EAAE,YAAY,IAAI,aAAa;SACnE;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC","sourcesContent":["/**\n * list-agent-engines — returns the registered engine registry and current selection.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n listAgentEngines,\n registerBuiltinEngines,\n detectEngineFromEnv,\n getAgentEngineEntry,\n isStoredEngineUsable,\n} from \"../../agent/engine/index.js\";\nimport { DEFAULT_MODEL } from \"../../agent/default-model.js\";\nimport { getSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'List all available AI agent engines (Anthropic, OpenAI, Gemini, Groq, etc.) and the currently selected engine. Use this to check what engines are available before calling manage-agent-engine with action=\"set\".',\n parameters: {\n type: \"object\",\n properties: {},\n required: [],\n },\n};\n\nexport async function run(): Promise<string> {\n registerBuiltinEngines();\n\n const engines = listAgentEngines();\n const currentSetting = await getSetting(\"agent-engine\");\n const current = currentSetting\n ? (currentSetting as { engine?: string; model?: string })\n : null;\n\n // Same priority chain resolveEngine uses: stored (if usable) → AGENT_ENGINE\n // → detect → anthropic. Gating stored on isStoredEngineUsable keeps this\n // in step with /agent-engine/status.\n const storedEntry =\n typeof current?.engine === \"string\"\n ? getAgentEngineEntry(current.engine)\n : undefined;\n const storedUsable =\n !!storedEntry && isStoredEngineUsable(current, storedEntry);\n\n const currentEntry =\n (storedUsable ? storedEntry : undefined) ??\n (process.env.AGENT_ENGINE\n ? getAgentEngineEntry(process.env.AGENT_ENGINE)\n : undefined) ??\n detectEngineFromEnv() ??\n undefined;\n const currentModel = storedUsable ? current?.model : undefined;\n const currentEngineName = currentEntry?.name ?? \"anthropic\";\n\n const result = {\n engines: engines.map((e) => ({\n name: e.name,\n label: e.label,\n description: e.description,\n defaultModel: e.defaultModel,\n supportedModels: e.supportedModels,\n capabilities: e.capabilities,\n requiredEnvVars: e.requiredEnvVars,\n installPackage: e.installPackage,\n })),\n current: {\n engine: currentEngineName,\n model: currentModel ?? currentEntry?.defaultModel ?? DEFAULT_MODEL,\n },\n };\n\n return JSON.stringify(result, null, 2);\n}\n"]}
1
+ {"version":3,"file":"list-agent-engines.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/list-agent-engines.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,mNAAmN;IACrN,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;KACb;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,sBAAsB,EAAE,CAAC;IAEzB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,cAAc;QAC5B,CAAC,CAAE,cAAsD;QACzD,CAAC,CAAC,IAAI,CAAC;IAET,yEAAyE;IACzE,sEAAsE;IACtE,2EAA2E;IAC3E,6CAA6C;IAC7C,MAAM,WAAW,GACf,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ;QACjC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;QACrC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAChB,CAAC,CAAC,WAAW;QACb,CAAC,MAAM,8BAA8B,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,MAAM,2BAA2B,EAAE,CAAC;IAE7D,MAAM,YAAY,GAChB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;QACvB,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;QACd,CAAC,gBAAgB,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACxC,gBAAgB;QAChB,mBAAmB,EAAE;QACrB,SAAS,CAAC;IACZ,MAAM,YAAY,GAChB,YAAY,IAAI,YAAY,EAAE,IAAI,KAAK,OAAO,EAAE,MAAM;QACpD,CAAC,CAAC,OAAO,EAAE,KAAK;QAChB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,iBAAiB,GAAG,YAAY,EAAE,IAAI,IAAI,WAAW,CAAC;IAE5D,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,cAAc,EAAE,CAAC,CAAC,cAAc;SACjC,CAAC,CAAC;QACH,OAAO,EAAE;YACP,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,YAAY,IAAI,YAAY,EAAE,YAAY,IAAI,aAAa;SACnE;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC","sourcesContent":["/**\n * list-agent-engines — returns the registered engine registry and current selection.\n */\n\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n listAgentEngines,\n registerBuiltinEngines,\n detectEngineFromEnv,\n detectEngineFromUserSecrets,\n getAgentEngineEntry,\n isStoredEngineUsableForRequest,\n} from \"../../agent/engine/index.js\";\nimport { DEFAULT_MODEL } from \"../../agent/default-model.js\";\nimport { getSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'List all available AI agent engines (Anthropic, OpenAI, Gemini, Groq, etc.) and the currently selected engine. Use this to check what engines are available before calling manage-agent-engine with action=\"set\".',\n parameters: {\n type: \"object\",\n properties: {},\n required: [],\n },\n};\n\nexport async function run(): Promise<string> {\n registerBuiltinEngines();\n\n const engines = listAgentEngines();\n const currentSetting = await getSetting(\"agent-engine\");\n const current = currentSetting\n ? (currentSetting as { engine?: string; model?: string })\n : null;\n\n // Same priority chain resolveEngine uses after explicit request options:\n // AGENT_ENGINE → Builder app_secrets → stored (if usable) → user BYOK\n // app_secrets env → anthropic. Gating stored on the request-aware helper\n // keeps the picker in step with the runtime.\n const storedEntry =\n typeof current?.engine === \"string\"\n ? getAgentEngineEntry(current.engine)\n : undefined;\n const storedUsable =\n !!storedEntry &&\n (await isStoredEngineUsableForRequest(current, storedEntry));\n const detectedFromUser = await detectEngineFromUserSecrets();\n\n const currentEntry =\n (process.env.AGENT_ENGINE\n ? getAgentEngineEntry(process.env.AGENT_ENGINE)\n : undefined) ??\n (detectedFromUser?.name === \"builder\" ? detectedFromUser : undefined) ??\n (storedUsable ? storedEntry : undefined) ??\n detectedFromUser ??\n detectEngineFromEnv() ??\n undefined;\n const currentModel =\n storedUsable && currentEntry?.name === current?.engine\n ? current?.model\n : undefined;\n const currentEngineName = currentEntry?.name ?? \"anthropic\";\n\n const result = {\n engines: engines.map((e) => ({\n name: e.name,\n label: e.label,\n description: e.description,\n defaultModel: e.defaultModel,\n supportedModels: e.supportedModels,\n capabilities: e.capabilities,\n requiredEnvVars: e.requiredEnvVars,\n installPackage: e.installPackage,\n })),\n current: {\n engine: currentEngineName,\n model: currentModel ?? currentEntry?.defaultModel ?? DEFAULT_MODEL,\n },\n };\n\n return JSON.stringify(result, null, 2);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA4EvD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AA8EvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAWf;AAUD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qEAAqE;IACrE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,cAAc,CAqyDhB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAyC,CAAC"}
1
+ {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAKlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA4EvD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AAoFvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAWf;AAUD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qEAAqE;IACrE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,cAAc,CA2zDhB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAyC,CAAC"}
@@ -29,7 +29,7 @@ import { runWithRequestContext } from "./request-context.js";
29
29
  import { createVoiceProvidersStatusHandler } from "./voice-providers-status.js";
30
30
  import { PROVIDER_ENV_META } from "../agent/engine/provider-env-vars.js";
31
31
  import { canUpdateAgentLoopSettings, readAgentLoopSettings, resetAgentLoopSettings, validateMaxIterationsInput, writeAgentLoopSettings, } from "../agent/loop-settings.js";
32
- import { isAgentEngineSettingConfigured, getAgentEngineEntry, detectEngineFromEnv, detectEngineFromUserSecrets, isStoredEngineUsable, } from "../agent/engine/registry.js";
32
+ import { isAgentEngineSettingConfigured, getAgentEngineEntry, detectEngineFromEnv, detectEngineFromUserSecrets, isStoredEngineUsableForRequest, } from "../agent/engine/registry.js";
33
33
  import { registerBuiltinEngines } from "../agent/engine/builtin.js";
34
34
  import { getOrgContext } from "../org/context.js";
35
35
  import { isEnvVarWriteAllowed } from "./env-var-writes.js";
@@ -46,12 +46,6 @@ async function detectUsageEngineName(event, userEmail) {
46
46
  if (isAgentEngineSettingConfigured(stored)) {
47
47
  return stored.engine;
48
48
  }
49
- if (stored && typeof stored.engine === "string") {
50
- const entry = getAgentEngineEntry(stored.engine);
51
- if (entry && isStoredEngineUsable(stored, entry)) {
52
- return stored.engine;
53
- }
54
- }
55
49
  let orgId;
56
50
  if (userEmail) {
57
51
  try {
@@ -63,6 +57,15 @@ async function detectUsageEngineName(event, userEmail) {
63
57
  }
64
58
  }
65
59
  const detectedFromUser = await runWithRequestContext({ userEmail, orgId }, () => detectEngineFromUserSecrets());
60
+ if (detectedFromUser?.name === "builder")
61
+ return detectedFromUser.name;
62
+ if (stored && typeof stored.engine === "string") {
63
+ const entry = getAgentEngineEntry(stored.engine);
64
+ if (entry &&
65
+ (await runWithRequestContext({ userEmail, orgId }, () => isStoredEngineUsableForRequest(stored, entry)))) {
66
+ return stored.engine;
67
+ }
68
+ }
66
69
  if (detectedFromUser)
67
70
  return detectedFromUser.name;
68
71
  return detectEngineFromEnv()?.name ?? null;
@@ -1091,6 +1094,16 @@ export function createCoreRoutesPlugin(options = {}) {
1091
1094
  try {
1092
1095
  const session = await getSession(event).catch(() => null);
1093
1096
  const userEmail = session?.email;
1097
+ let orgId;
1098
+ if (userEmail) {
1099
+ try {
1100
+ const orgCtx = await getOrgContext(event);
1101
+ orgId = orgCtx.orgId ?? undefined;
1102
+ }
1103
+ catch {
1104
+ /* org module not present in this template */
1105
+ }
1106
+ }
1094
1107
  const stored = (await getSetting("agent-engine"));
1095
1108
  if (isAgentEngineSettingConfigured(stored)) {
1096
1109
  return {
@@ -1099,9 +1112,23 @@ export function createCoreRoutesPlugin(options = {}) {
1099
1112
  source: "settings",
1100
1113
  };
1101
1114
  }
1115
+ // Per-user app_secrets — a user who connected Builder (or pasted
1116
+ // their own provider key) may not have any deploy-level env vars
1117
+ // set, so check their per-user secret store before reporting "no
1118
+ // engine configured" and re-showing the onboarding gate.
1119
+ const detectedFromUser = await runWithRequestContext({ userEmail, orgId }, () => detectEngineFromUserSecrets());
1120
+ if (detectedFromUser?.name === "builder") {
1121
+ return {
1122
+ configured: true,
1123
+ engine: detectedFromUser.name,
1124
+ source: "app_secrets",
1125
+ envVar: detectedFromUser.requiredEnvVars[0],
1126
+ };
1127
+ }
1102
1128
  if (stored && typeof stored.engine === "string") {
1103
1129
  const entry = getAgentEngineEntry(stored.engine);
1104
- if (entry && isStoredEngineUsable(stored, entry)) {
1130
+ if (entry &&
1131
+ (await runWithRequestContext({ userEmail, orgId }, () => isStoredEngineUsableForRequest(stored, entry)))) {
1105
1132
  return {
1106
1133
  configured: true,
1107
1134
  engine: stored.engine,
@@ -1110,11 +1137,6 @@ export function createCoreRoutesPlugin(options = {}) {
1110
1137
  };
1111
1138
  }
1112
1139
  }
1113
- // Per-user app_secrets — a user who connected Builder (or pasted
1114
- // their own provider key) may not have any deploy-level env vars
1115
- // set, so check their per-user secret store before reporting "no
1116
- // engine configured" and re-showing the onboarding gate.
1117
- const detectedFromUser = await runWithRequestContext({ userEmail }, () => detectEngineFromUserSecrets());
1118
1140
  if (detectedFromUser) {
1119
1141
  return {
1120
1142
  configured: true,