@agent-native/core 0.113.0 → 0.114.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1508) hide show
  1. package/agent-native.eject.json +164 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +11 -0
  4. package/corpus/core/README.md +61 -174
  5. package/corpus/core/agent-native.eject.json +164 -0
  6. package/corpus/core/docs/content/agent-native-toolkit.mdx +38 -0
  7. package/corpus/core/docs/content/package-lifecycle.mdx +54 -4
  8. package/corpus/core/package.json +15 -2
  9. package/corpus/core/src/cli/eject.ts +1594 -0
  10. package/corpus/core/src/cli/index.ts +16 -0
  11. package/corpus/core/src/client/index.ts +4 -0
  12. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +8 -2
  13. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +7 -2
  14. package/corpus/core/src/client/resources/ResourcesPanel.tsx +17 -3
  15. package/corpus/core/src/client/resources/index.ts +19 -0
  16. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +9 -1
  17. package/corpus/core/src/client/resources/runtime.ts +1 -0
  18. package/corpus/core/src/client/setup-connections/catalog.ts +6 -0
  19. package/corpus/core/src/client/setup-connections/index.ts +1 -0
  20. package/corpus/core/src/client/setup-connections/runtime.ts +1 -0
  21. package/corpus/core/src/connections/catalog.ts +41 -24
  22. package/corpus/core/src/connections/index.ts +1 -0
  23. package/corpus/core/src/connections/runtime.ts +1 -0
  24. package/corpus/core/src/eject/provider-api-definitions.ts +193 -0
  25. package/corpus/core/src/eject/remote-mcp-presets.ts +137 -0
  26. package/corpus/core/src/eject/setup-readiness-ui.tsx +29 -0
  27. package/corpus/core/src/eject/workspace-connections.ts +92 -0
  28. package/corpus/core/src/index.ts +1 -0
  29. package/corpus/core/src/integrations/adapter-overrides.ts +12 -0
  30. package/corpus/core/src/integrations/eject/messaging-adapters.ts +85 -0
  31. package/corpus/core/src/integrations/index.ts +5 -1
  32. package/corpus/core/src/integrations/plugin.ts +34 -12
  33. package/corpus/core/src/integrations/runtime.ts +1 -0
  34. package/corpus/core/src/integrations/types.ts +3 -1
  35. package/corpus/core/src/package-lifecycle/eject-manifest.ts +345 -0
  36. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  37. package/corpus/core/src/provider-api/index.ts +46 -12
  38. package/corpus/core/src/provider-api/runtime.ts +1 -0
  39. package/corpus/core/src/setup-connections/index.ts +1 -0
  40. package/corpus/core/src/shared/merge-by-id.ts +14 -0
  41. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  42. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  43. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  44. package/corpus/core/src/templates/default/AGENTS.md +6 -5
  45. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  46. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  47. package/corpus/core/src/templates/headless/AGENTS.md +5 -4
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  52. package/corpus/core/src/templates/workspace-core/AGENTS.md +4 -4
  53. package/corpus/core/src/templates/workspace-root/AGENTS.md +4 -4
  54. package/corpus/core/src/vite/client.ts +25 -2
  55. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  56. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +9 -6
  57. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  58. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +9 -6
  59. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  60. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +9 -6
  61. package/corpus/templates/brain/actions/remediate-legacy-capture-audiences.ts +167 -0
  62. package/corpus/templates/brain/app/lib/brain-chat-readiness.ts +6 -0
  63. package/corpus/templates/brain/app/routes/_index.tsx +8 -0
  64. package/corpus/templates/brain/app/routes.ts +1 -0
  65. package/corpus/templates/brain/changelog/2026-07-19-ask-starts-immediately-when-builder-s-managed-ai-connection-.md +6 -0
  66. package/corpus/templates/brain/changelog/2026-07-19-slack-and-granola-backfills-now-process-captures-concurrentl.md +6 -0
  67. package/corpus/templates/brain/changelog/2026-07-19-source-review-settings-now-control-knowledge-approval.md +6 -0
  68. package/corpus/templates/brain/changelog/2026-07-19-the-manage-agent-page-now-opens-correctly-from-brain-navigat.md +6 -0
  69. package/corpus/templates/brain/server/db/schema.ts +3 -0
  70. package/corpus/templates/brain/server/lib/brain.ts +41 -2
  71. package/corpus/templates/brain/server/lib/connectors.ts +379 -113
  72. package/corpus/templates/brain/server/lib/meeting-audience.ts +38 -0
  73. package/corpus/templates/brain/server/plugins/db.ts +10 -0
  74. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +6 -4
  75. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  76. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +9 -6
  77. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  78. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  79. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  80. package/corpus/templates/chat/AGENTS.md +3 -2
  81. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  82. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +9 -6
  83. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  84. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +9 -6
  85. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  86. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +9 -6
  87. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  88. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +9 -6
  89. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  90. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +9 -6
  91. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  92. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  93. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +9 -6
  94. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  95. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +9 -6
  96. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  97. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +9 -6
  98. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +15 -13
  99. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  100. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +9 -6
  101. package/corpus/toolkit/CHANGELOG.md +6 -0
  102. package/corpus/toolkit/agent-native.eject.json +411 -0
  103. package/corpus/toolkit/package.json +5 -2
  104. package/dist/cli/eject.d.ts +21 -0
  105. package/dist/cli/eject.d.ts.map +1 -0
  106. package/dist/cli/eject.js +1145 -0
  107. package/dist/cli/eject.js.map +1 -0
  108. package/dist/cli/index.js +15 -0
  109. package/dist/cli/index.js.map +1 -1
  110. package/dist/client/index.d.ts +1 -1
  111. package/dist/client/index.d.ts.map +1 -1
  112. package/dist/client/index.js +1 -1
  113. package/dist/client/index.js.map +1 -1
  114. package/dist/client/resources/McpConnectionSuggestion.d.ts +4 -3
  115. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  116. package/dist/client/resources/McpConnectionSuggestion.js +3 -3
  117. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  118. package/dist/client/resources/McpIntegrationDialog.d.ts +4 -3
  119. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  120. package/dist/client/resources/McpIntegrationDialog.js +2 -2
  121. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  122. package/dist/client/resources/ResourcesPanel.d.ts +4 -1
  123. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  124. package/dist/client/resources/ResourcesPanel.js +9 -7
  125. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  126. package/dist/client/resources/index.d.ts +3 -0
  127. package/dist/client/resources/index.d.ts.map +1 -1
  128. package/dist/client/resources/index.js +3 -0
  129. package/dist/client/resources/index.js.map +1 -1
  130. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -1
  131. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  132. package/dist/client/resources/mcp-integration-catalog.js +6 -2
  133. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  134. package/dist/client/resources/runtime.d.ts +2 -0
  135. package/dist/client/resources/runtime.d.ts.map +1 -0
  136. package/dist/client/resources/runtime.js +2 -0
  137. package/dist/client/resources/runtime.js.map +1 -0
  138. package/dist/client/setup-connections/catalog.d.ts +2 -0
  139. package/dist/client/setup-connections/catalog.d.ts.map +1 -0
  140. package/dist/client/setup-connections/catalog.js +7 -0
  141. package/dist/client/setup-connections/catalog.js.map +1 -0
  142. package/dist/client/setup-connections/index.d.ts +1 -0
  143. package/dist/client/setup-connections/index.d.ts.map +1 -1
  144. package/dist/client/setup-connections/index.js +1 -0
  145. package/dist/client/setup-connections/index.js.map +1 -1
  146. package/dist/client/setup-connections/runtime.d.ts +2 -0
  147. package/dist/client/setup-connections/runtime.d.ts.map +1 -0
  148. package/dist/client/setup-connections/runtime.js +2 -0
  149. package/dist/client/setup-connections/runtime.js.map +1 -0
  150. package/dist/collab/awareness.d.ts +2 -2
  151. package/dist/collab/awareness.d.ts.map +1 -1
  152. package/dist/collab/routes.d.ts +1 -1
  153. package/dist/connections/catalog.d.ts +5 -3
  154. package/dist/connections/catalog.d.ts.map +1 -1
  155. package/dist/connections/catalog.js +16 -8
  156. package/dist/connections/catalog.js.map +1 -1
  157. package/dist/connections/index.d.ts +1 -1
  158. package/dist/connections/index.d.ts.map +1 -1
  159. package/dist/connections/index.js +1 -1
  160. package/dist/connections/index.js.map +1 -1
  161. package/dist/connections/runtime.d.ts +2 -0
  162. package/dist/connections/runtime.d.ts.map +1 -0
  163. package/dist/connections/runtime.js +2 -0
  164. package/dist/connections/runtime.js.map +1 -0
  165. package/dist/eject/provider-api-definitions.d.ts +34 -0
  166. package/dist/eject/provider-api-definitions.d.ts.map +1 -0
  167. package/dist/eject/provider-api-definitions.js +88 -0
  168. package/dist/eject/provider-api-definitions.js.map +1 -0
  169. package/dist/eject/remote-mcp-presets.d.ts +17 -0
  170. package/dist/eject/remote-mcp-presets.d.ts.map +1 -0
  171. package/dist/eject/remote-mcp-presets.js +81 -0
  172. package/dist/eject/remote-mcp-presets.js.map +1 -0
  173. package/dist/eject/setup-readiness-ui.d.ts +7 -0
  174. package/dist/eject/setup-readiness-ui.d.ts.map +1 -0
  175. package/dist/eject/setup-readiness-ui.js +13 -0
  176. package/dist/eject/setup-readiness-ui.js.map +1 -0
  177. package/dist/eject/workspace-connections.d.ts +11 -0
  178. package/dist/eject/workspace-connections.d.ts.map +1 -0
  179. package/dist/eject/workspace-connections.js +47 -0
  180. package/dist/eject/workspace-connections.js.map +1 -0
  181. package/dist/index.d.ts +1 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +1 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/integrations/adapter-overrides.d.ts +3 -0
  186. package/dist/integrations/adapter-overrides.d.ts.map +1 -0
  187. package/dist/integrations/adapter-overrides.js +7 -0
  188. package/dist/integrations/adapter-overrides.js.map +1 -0
  189. package/dist/integrations/eject/messaging-adapters.d.ts +12 -0
  190. package/dist/integrations/eject/messaging-adapters.d.ts.map +1 -0
  191. package/dist/integrations/eject/messaging-adapters.js +49 -0
  192. package/dist/integrations/eject/messaging-adapters.js.map +1 -0
  193. package/dist/integrations/index.d.ts +3 -2
  194. package/dist/integrations/index.d.ts.map +1 -1
  195. package/dist/integrations/index.js +2 -1
  196. package/dist/integrations/index.js.map +1 -1
  197. package/dist/integrations/plugin.d.ts +32 -1
  198. package/dist/integrations/plugin.d.ts.map +1 -1
  199. package/dist/integrations/plugin.js +19 -12
  200. package/dist/integrations/plugin.js.map +1 -1
  201. package/dist/integrations/runtime.d.ts +2 -0
  202. package/dist/integrations/runtime.d.ts.map +1 -0
  203. package/dist/integrations/runtime.js +2 -0
  204. package/dist/integrations/runtime.js.map +1 -0
  205. package/dist/integrations/types.d.ts +3 -1
  206. package/dist/integrations/types.d.ts.map +1 -1
  207. package/dist/integrations/types.js.map +1 -1
  208. package/dist/notifications/routes.d.ts +3 -3
  209. package/dist/package-lifecycle/eject-manifest.d.ts +43 -0
  210. package/dist/package-lifecycle/eject-manifest.d.ts.map +1 -0
  211. package/dist/package-lifecycle/eject-manifest.js +219 -0
  212. package/dist/package-lifecycle/eject-manifest.js.map +1 -0
  213. package/dist/package-lifecycle/index.d.ts +1 -0
  214. package/dist/package-lifecycle/index.d.ts.map +1 -1
  215. package/dist/package-lifecycle/index.js +1 -0
  216. package/dist/package-lifecycle/index.js.map +1 -1
  217. package/dist/progress/routes.d.ts +1 -1
  218. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  219. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  220. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  221. package/dist/provider-api/index.d.ts +6 -2
  222. package/dist/provider-api/index.d.ts.map +1 -1
  223. package/dist/provider-api/index.js +25 -12
  224. package/dist/provider-api/index.js.map +1 -1
  225. package/dist/provider-api/runtime.d.ts +2 -0
  226. package/dist/provider-api/runtime.d.ts.map +1 -0
  227. package/dist/provider-api/runtime.js +2 -0
  228. package/dist/provider-api/runtime.js.map +1 -0
  229. package/dist/secrets/routes.d.ts +9 -9
  230. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  231. package/dist/server/transcribe-voice.d.ts +1 -1
  232. package/dist/setup-connections/index.d.ts +1 -1
  233. package/dist/setup-connections/index.d.ts.map +1 -1
  234. package/dist/setup-connections/index.js +1 -1
  235. package/dist/setup-connections/index.js.map +1 -1
  236. package/dist/shared/merge-by-id.d.ts +5 -0
  237. package/dist/shared/merge-by-id.d.ts.map +1 -0
  238. package/dist/shared/merge-by-id.js +7 -0
  239. package/dist/shared/merge-by-id.js.map +1 -0
  240. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  241. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  242. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  243. package/dist/templates/chat/AGENTS.md +3 -2
  244. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  245. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  246. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  247. package/dist/templates/default/AGENTS.md +6 -5
  248. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  249. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  250. package/dist/templates/headless/AGENTS.md +5 -4
  251. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  252. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  253. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  254. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  255. package/dist/templates/workspace-core/AGENTS.md +4 -4
  256. package/dist/templates/workspace-root/AGENTS.md +4 -4
  257. package/dist/vite/client.d.ts.map +1 -1
  258. package/dist/vite/client.js +22 -2
  259. package/dist/vite/client.js.map +1 -1
  260. package/docs/content/agent-native-toolkit.mdx +38 -0
  261. package/docs/content/package-lifecycle.mdx +54 -4
  262. package/package.json +15 -2
  263. package/src/a2a/agent-card.ts +83 -0
  264. package/src/a2a/artifact-response.ts +1648 -0
  265. package/src/a2a/auth-policy.ts +66 -0
  266. package/src/a2a/caller-auth.ts +102 -0
  267. package/src/a2a/client.ts +876 -0
  268. package/src/a2a/correlation.ts +50 -0
  269. package/src/a2a/handlers.ts +1285 -0
  270. package/src/a2a/index.ts +50 -0
  271. package/src/a2a/invoke.ts +348 -0
  272. package/src/a2a/response-text.ts +53 -0
  273. package/src/a2a/server.ts +586 -0
  274. package/src/a2a/task-store.ts +917 -0
  275. package/src/a2a/types.ts +221 -0
  276. package/src/a2a-claims.ts +52 -0
  277. package/src/action-change-marker.ts +74 -0
  278. package/src/action-ui.ts +38 -0
  279. package/src/action.ts +1406 -0
  280. package/src/adapters/cli/index.ts +6 -0
  281. package/src/adapters/cli/registry.ts +73 -0
  282. package/src/adapters/cli/shell-adapter.ts +92 -0
  283. package/src/adapters/cli/types.ts +27 -0
  284. package/src/agent/action-continuation-guidance.ts +38 -0
  285. package/src/agent/app-model-defaults.ts +201 -0
  286. package/src/agent/context-xray/actions/context-evict.ts +56 -0
  287. package/src/agent/context-xray/actions/context-manifest-get.ts +75 -0
  288. package/src/agent/context-xray/actions/context-pin.ts +56 -0
  289. package/src/agent/context-xray/actions/context-preview-get.ts +134 -0
  290. package/src/agent/context-xray/actions/context-report.ts +75 -0
  291. package/src/agent/context-xray/actions/context-restore.ts +51 -0
  292. package/src/agent/context-xray/actions/errors.ts +40 -0
  293. package/src/agent/context-xray/apply-directives.ts +137 -0
  294. package/src/agent/context-xray/directives-store.ts +178 -0
  295. package/src/agent/context-xray/identity.ts +37 -0
  296. package/src/agent/context-xray/manifest.ts +284 -0
  297. package/src/agent/context-xray/migrations.ts +32 -0
  298. package/src/agent/context-xray/plugin.ts +23 -0
  299. package/src/agent/context-xray/schema.ts +17 -0
  300. package/src/agent/context-xray/segments.ts +194 -0
  301. package/src/agent/context-xray/tokenize.ts +93 -0
  302. package/src/agent/default-model.ts +5 -0
  303. package/src/agent/durable-background.ts +547 -0
  304. package/src/agent/engine/ai-sdk-engine.ts +565 -0
  305. package/src/agent/engine/anthropic-engine.ts +320 -0
  306. package/src/agent/engine/builder-engine.ts +1110 -0
  307. package/src/agent/engine/builder-gateway-headers.ts +44 -0
  308. package/src/agent/engine/builtin.ts +122 -0
  309. package/src/agent/engine/context-directives-transform.ts +73 -0
  310. package/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  311. package/src/agent/engine/credential-errors.ts +69 -0
  312. package/src/agent/engine/index.ts +54 -0
  313. package/src/agent/engine/openai-compatible-endpoint.ts +25 -0
  314. package/src/agent/engine/output-tokens.ts +181 -0
  315. package/src/agent/engine/provider-env-vars.ts +69 -0
  316. package/src/agent/engine/registry.ts +853 -0
  317. package/src/agent/engine/tool-call-journal-seed.ts +85 -0
  318. package/src/agent/engine/translate-ai-sdk.ts +407 -0
  319. package/src/agent/engine/translate-anthropic.ts +611 -0
  320. package/src/agent/engine/types.ts +310 -0
  321. package/src/agent/harness/acp-adapter.ts +893 -0
  322. package/src/agent/harness/acp-builtin.ts +70 -0
  323. package/src/agent/harness/ai-sdk-adapter.ts +509 -0
  324. package/src/agent/harness/background.ts +365 -0
  325. package/src/agent/harness/builtin.ts +50 -0
  326. package/src/agent/harness/index.ts +86 -0
  327. package/src/agent/harness/lifecycle.ts +498 -0
  328. package/src/agent/harness/registry.ts +97 -0
  329. package/src/agent/harness/runner.ts +182 -0
  330. package/src/agent/harness/store.ts +466 -0
  331. package/src/agent/harness/translate.ts +130 -0
  332. package/src/agent/harness/types.ts +129 -0
  333. package/src/agent/index.ts +32 -0
  334. package/src/agent/loop-settings.ts +186 -0
  335. package/src/agent/model-config.ts +363 -0
  336. package/src/agent/observational-memory/compactor.ts +78 -0
  337. package/src/agent/observational-memory/config.ts +78 -0
  338. package/src/agent/observational-memory/index.ts +79 -0
  339. package/src/agent/observational-memory/internal-run.ts +89 -0
  340. package/src/agent/observational-memory/message-text.ts +49 -0
  341. package/src/agent/observational-memory/migrations.ts +44 -0
  342. package/src/agent/observational-memory/observer.ts +128 -0
  343. package/src/agent/observational-memory/plugin.ts +35 -0
  344. package/src/agent/observational-memory/prompts.ts +53 -0
  345. package/src/agent/observational-memory/read.ts +131 -0
  346. package/src/agent/observational-memory/reflector.ts +119 -0
  347. package/src/agent/observational-memory/schema.ts +48 -0
  348. package/src/agent/observational-memory/store.ts +275 -0
  349. package/src/agent/observational-memory/types.ts +65 -0
  350. package/src/agent/processors.ts +209 -0
  351. package/src/agent/production-agent.ts +8254 -0
  352. package/src/agent/run-loop-with-resume.ts +394 -0
  353. package/src/agent/run-manager.ts +1825 -0
  354. package/src/agent/run-ownership.ts +75 -0
  355. package/src/agent/run-store.ts +2601 -0
  356. package/src/agent/runtime-context.ts +169 -0
  357. package/src/agent/thread-data-builder.ts +1584 -0
  358. package/src/agent/tool-call-journal.ts +368 -0
  359. package/src/agent/tool-error-redaction.ts +52 -0
  360. package/src/agent/tool-result-images.ts +178 -0
  361. package/src/agent/tool-search.ts +376 -0
  362. package/src/agent/types.ts +372 -0
  363. package/src/agent-native/index.ts +198 -0
  364. package/src/agent-web/config.ts +253 -0
  365. package/src/agent-web/generator.ts +382 -0
  366. package/src/agent-web/index.ts +36 -0
  367. package/src/appearance/actions/change-appearance.ts +35 -0
  368. package/src/application-state/emitter.ts +81 -0
  369. package/src/application-state/handlers.ts +121 -0
  370. package/src/application-state/index.ts +44 -0
  371. package/src/application-state/script-helpers.ts +155 -0
  372. package/src/application-state/store.ts +274 -0
  373. package/src/assets/branding/agent-native.icon/Assets/background.svg +3 -0
  374. package/src/assets/branding/agent-native.icon/Assets/foreground.svg +12 -0
  375. package/src/assets/branding/agent-native.icon/icon.json +49 -0
  376. package/src/assets/branding/favicon.png +0 -0
  377. package/src/assets/branding/favicon.svg +1 -0
  378. package/src/assets/branding/icon-on-dark.svg +10 -0
  379. package/src/assets/branding/icon-on-light.svg +10 -0
  380. package/src/assets/branding/mac-app-icon.svg +1 -0
  381. package/src/assets/branding/slack-bot/agent-native-1024.png +0 -0
  382. package/src/assets/branding/slack-bot/agent-native-512.png +0 -0
  383. package/src/assets/branding/tray-icon.svg +6 -0
  384. package/src/assets/branding/wordmark-on-dark.svg +21 -0
  385. package/src/assets/branding/wordmark-on-light.svg +21 -0
  386. package/src/assets/fonts/LICENSE_LIBERATION +96 -0
  387. package/src/assets/fonts/LICENSE_NOTO_NASKH_ARABIC +93 -0
  388. package/src/assets/fonts/LiberationSans-Bold.ttf +0 -0
  389. package/src/assets/fonts/LiberationSans-Regular.ttf +0 -0
  390. package/src/assets/fonts/NotoNaskhArabic-Variable.ttf +0 -0
  391. package/src/audit/actions/export-audit-events.ts +162 -0
  392. package/src/audit/actions/get-audit-event.ts +24 -0
  393. package/src/audit/actions/list-audit-events.ts +66 -0
  394. package/src/audit/cleanup-job.ts +100 -0
  395. package/src/audit/config.ts +90 -0
  396. package/src/audit/index.ts +43 -0
  397. package/src/audit/record.ts +180 -0
  398. package/src/audit/redact.ts +109 -0
  399. package/src/audit/store.ts +346 -0
  400. package/src/audit/types.ts +141 -0
  401. package/src/automation/index.ts +802 -0
  402. package/src/brand-kit/brand-signals.ts +124 -0
  403. package/src/brand-kit/fig/index.ts +64 -0
  404. package/src/brand-kit/index.ts +72 -0
  405. package/src/brand-kit/types.ts +113 -0
  406. package/src/browser-sessions/actions.ts +302 -0
  407. package/src/browser-sessions/routes.ts +234 -0
  408. package/src/browser-sessions/store.ts +679 -0
  409. package/src/browser-sessions/types.ts +84 -0
  410. package/src/changelog/parse.ts +328 -0
  411. package/src/chat-threads/emitter.ts +22 -0
  412. package/src/chat-threads/schema.ts +43 -0
  413. package/src/chat-threads/store.ts +1311 -0
  414. package/src/checkpoints/index.ts +15 -0
  415. package/src/checkpoints/service.ts +142 -0
  416. package/src/checkpoints/store.ts +153 -0
  417. package/src/cli/add.ts +425 -0
  418. package/src/cli/agent.ts +424 -0
  419. package/src/cli/agents.ts +122 -0
  420. package/src/cli/app-skill.ts +1455 -0
  421. package/src/cli/atomic-json-file.ts +324 -0
  422. package/src/cli/audit-agent-web.ts +324 -0
  423. package/src/cli/changelog.ts +199 -0
  424. package/src/cli/claude-code-participant.ts +515 -0
  425. package/src/cli/code-agent-commands.ts +270 -0
  426. package/src/cli/code-agent-connector.ts +1109 -0
  427. package/src/cli/code-agent-executor.ts +1970 -0
  428. package/src/cli/code-agent-output-smoother.ts +140 -0
  429. package/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  430. package/src/cli/code-agent-runs.ts +548 -0
  431. package/src/cli/code.ts +1805 -0
  432. package/src/cli/codex-cli-participant.ts +496 -0
  433. package/src/cli/connect.ts +2714 -0
  434. package/src/cli/content-local.ts +442 -0
  435. package/src/cli/context-xray-local.ts +2193 -0
  436. package/src/cli/create-workspace.ts +30 -0
  437. package/src/cli/create.ts +2247 -0
  438. package/src/cli/deploy-build.ts +50 -0
  439. package/src/cli/design-connect.ts +3187 -0
  440. package/src/cli/doctor.ts +472 -0
  441. package/src/cli/eject.ts +1594 -0
  442. package/src/cli/eval.ts +134 -0
  443. package/src/cli/gateway-helpers.ts +70 -0
  444. package/src/cli/index.ts +1217 -0
  445. package/src/cli/info.ts +105 -0
  446. package/src/cli/invoke.ts +288 -0
  447. package/src/cli/mcp-config-writers.ts +857 -0
  448. package/src/cli/mcp.ts +594 -0
  449. package/src/cli/migrate.ts +1813 -0
  450. package/src/cli/migration-codemod.ts +646 -0
  451. package/src/cli/multi-frontier-runs.ts +1952 -0
  452. package/src/cli/package-lifecycle.ts +823 -0
  453. package/src/cli/plan-blocks.ts +143 -0
  454. package/src/cli/plan-local.ts +3189 -0
  455. package/src/cli/plan-publish-store.ts +138 -0
  456. package/src/cli/pr-visual-recap-workflow.ts +2 -0
  457. package/src/cli/recap.ts +5 -0
  458. package/src/cli/setup-agents.ts +120 -0
  459. package/src/cli/skills-content/assets-skill.ts +83 -0
  460. package/src/cli/skills-content/canvas.ts +153 -0
  461. package/src/cli/skills-content/connection.ts +52 -0
  462. package/src/cli/skills-content/content-skill.ts +120 -0
  463. package/src/cli/skills-content/design-exploration-skill.ts +118 -0
  464. package/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  465. package/src/cli/skills-content/document-quality.ts +196 -0
  466. package/src/cli/skills-content/exemplar.ts +69 -0
  467. package/src/cli/skills-content/help.ts +77 -0
  468. package/src/cli/skills-content/index.ts +22 -0
  469. package/src/cli/skills-content/local-files.ts +100 -0
  470. package/src/cli/skills-content/plan-setup-auth.ts +80 -0
  471. package/src/cli/skills-content/visual-plan-skill.ts +493 -0
  472. package/src/cli/skills-content/visual-recap-skill.ts +553 -0
  473. package/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  474. package/src/cli/skills-content/wireframe.ts +349 -0
  475. package/src/cli/skills.ts +4340 -0
  476. package/src/cli/sync-builder-starter-manifest.ts +631 -0
  477. package/src/cli/telemetry.ts +136 -0
  478. package/src/cli/templates-meta.ts +269 -0
  479. package/src/cli/upgrade.ts +956 -0
  480. package/src/cli/visualize-repo.ts +715 -0
  481. package/src/cli/workspace-dev.ts +1486 -0
  482. package/src/cli/workspacify.ts +258 -0
  483. package/src/client/AgentAskPopover.tsx +89 -0
  484. package/src/client/AgentChatHome.tsx +66 -0
  485. package/src/client/AgentNative.tsx +161 -0
  486. package/src/client/AgentNativeEmbedded.tsx +288 -0
  487. package/src/client/AgentNativeFrame.tsx +151 -0
  488. package/src/client/AgentPanel.tsx +3437 -0
  489. package/src/client/AgentTaskCard.tsx +273 -0
  490. package/src/client/AppearancePicker.tsx +79 -0
  491. package/src/client/AssistantChat.tsx +5793 -0
  492. package/src/client/ClientOnly.tsx +22 -0
  493. package/src/client/CommandMenu.tsx +726 -0
  494. package/src/client/ConnectBuilderCard.tsx +390 -0
  495. package/src/client/DefaultSpinner.tsx +47 -0
  496. package/src/client/ErrorBoundary.tsx +359 -0
  497. package/src/client/ErrorReportActions.tsx +69 -0
  498. package/src/client/FeedbackButton.tsx +553 -0
  499. package/src/client/HighlightedCodeBlock.tsx +173 -0
  500. package/src/client/IframeEmbed.tsx +151 -0
  501. package/src/client/KeepTabOpenNotice.tsx +181 -0
  502. package/src/client/MultiTabAssistantChat.tsx +2576 -0
  503. package/src/client/NewWorkspaceAppFlow.tsx +525 -0
  504. package/src/client/PoweredByBadge.tsx +284 -0
  505. package/src/client/RunStuckBanner.tsx +431 -0
  506. package/src/client/StarfieldBackground.tsx +466 -0
  507. package/src/client/Turnstile.tsx +125 -0
  508. package/src/client/active-run-state.ts +139 -0
  509. package/src/client/agent-chat/index.ts +279 -0
  510. package/src/client/agent-chat-adapter.ts +3692 -0
  511. package/src/client/agent-chat.ts +1233 -0
  512. package/src/client/agent-engine-key.ts +122 -0
  513. package/src/client/agent-page/AgentContextTab.tsx +487 -0
  514. package/src/client/agent-page/AgentEmptyState.tsx +44 -0
  515. package/src/client/agent-page/AgentJobsTab.tsx +441 -0
  516. package/src/client/agent-page/AgentTabFrame.tsx +39 -0
  517. package/src/client/agent-page/AgentTabsPage.tsx +1096 -0
  518. package/src/client/agent-page/types.ts +18 -0
  519. package/src/client/agent-page/use-jobs.ts +150 -0
  520. package/src/client/agent-sidebar-state.ts +166 -0
  521. package/src/client/analytics/index.ts +40 -0
  522. package/src/client/analytics-session.ts +70 -0
  523. package/src/client/analytics.ts +1757 -0
  524. package/src/client/api-path.ts +124 -0
  525. package/src/client/app-providers.tsx +230 -0
  526. package/src/client/appearance.ts +130 -0
  527. package/src/client/application-state.ts +154 -0
  528. package/src/client/assistant-ui-recovery.tsx +205 -0
  529. package/src/client/automation/index.ts +4 -0
  530. package/src/client/automation.ts +22 -0
  531. package/src/client/blocks/AiEditableField.tsx +30 -0
  532. package/src/client/blocks/BlockView.tsx +145 -0
  533. package/src/client/blocks/RegistryBlockDataProvider.tsx +121 -0
  534. package/src/client/blocks/SchemaBlockEditor.tsx +457 -0
  535. package/src/client/blocks/agent.ts +95 -0
  536. package/src/client/blocks/code-block-direction.ts +21 -0
  537. package/src/client/blocks/index.ts +308 -0
  538. package/src/client/blocks/library/AnnotatedCodeBlock.tsx +710 -0
  539. package/src/client/blocks/library/ApiEndpointBlock.tsx +1120 -0
  540. package/src/client/blocks/library/DataModelBlock.tsx +775 -0
  541. package/src/client/blocks/library/DiffBlock.tsx +1854 -0
  542. package/src/client/blocks/library/FileTreeBlock.tsx +868 -0
  543. package/src/client/blocks/library/HighlightedCode.tsx +260 -0
  544. package/src/client/blocks/library/JsonExplorerBlock.tsx +608 -0
  545. package/src/client/blocks/library/MermaidBlock.tsx +362 -0
  546. package/src/client/blocks/library/OpenApiSpecBlock.tsx +998 -0
  547. package/src/client/blocks/library/annotated-code.config.ts +101 -0
  548. package/src/client/blocks/library/annotation-rail.tsx +1020 -0
  549. package/src/client/blocks/library/api-endpoint.config.ts +207 -0
  550. package/src/client/blocks/library/block-copy.ts +399 -0
  551. package/src/client/blocks/library/callout.config.ts +57 -0
  552. package/src/client/blocks/library/callout.tsx +149 -0
  553. package/src/client/blocks/library/checklist.config.ts +56 -0
  554. package/src/client/blocks/library/checklist.tsx +208 -0
  555. package/src/client/blocks/library/code-filename-label.tsx +59 -0
  556. package/src/client/blocks/library/code-highlight.tsx +178 -0
  557. package/src/client/blocks/library/code-tabs.config.ts +70 -0
  558. package/src/client/blocks/library/code-tabs.tsx +606 -0
  559. package/src/client/blocks/library/code.config.ts +69 -0
  560. package/src/client/blocks/library/code.tsx +440 -0
  561. package/src/client/blocks/library/columns.config.ts +85 -0
  562. package/src/client/blocks/library/columns.tsx +334 -0
  563. package/src/client/blocks/library/data-model.config.ts +152 -0
  564. package/src/client/blocks/library/dev-doc-ui.tsx +191 -0
  565. package/src/client/blocks/library/diagram.config.ts +222 -0
  566. package/src/client/blocks/library/diagram.tsx +958 -0
  567. package/src/client/blocks/library/diff.config.ts +115 -0
  568. package/src/client/blocks/library/file-tree.config.ts +92 -0
  569. package/src/client/blocks/library/html.config.ts +79 -0
  570. package/src/client/blocks/library/html.tsx +258 -0
  571. package/src/client/blocks/library/json-explorer.config.ts +74 -0
  572. package/src/client/blocks/library/mermaid.config.ts +49 -0
  573. package/src/client/blocks/library/narrow-container.tsx +37 -0
  574. package/src/client/blocks/library/openapi-spec.config.ts +66 -0
  575. package/src/client/blocks/library/question-form.config.ts +127 -0
  576. package/src/client/blocks/library/question-form.tsx +944 -0
  577. package/src/client/blocks/library/sanitize-html.ts +343 -0
  578. package/src/client/blocks/library/server-specs.ts +338 -0
  579. package/src/client/blocks/library/specs.tsx +308 -0
  580. package/src/client/blocks/library/table.config.ts +61 -0
  581. package/src/client/blocks/library/table.tsx +449 -0
  582. package/src/client/blocks/library/tabs.config.ts +96 -0
  583. package/src/client/blocks/library/tabs.tsx +665 -0
  584. package/src/client/blocks/library/wireframe-icons.ts +210 -0
  585. package/src/client/blocks/library/wireframe-kit.tsx +1850 -0
  586. package/src/client/blocks/library/wireframe.config.ts +539 -0
  587. package/src/client/blocks/library/wireframe.tsx +535 -0
  588. package/src/client/blocks/mdx.ts +364 -0
  589. package/src/client/blocks/provider.tsx +51 -0
  590. package/src/client/blocks/registry.ts +83 -0
  591. package/src/client/blocks/schema-form/introspect.ts +201 -0
  592. package/src/client/blocks/server.ts +170 -0
  593. package/src/client/blocks/types.ts +415 -0
  594. package/src/client/browser-session-bridge.ts +548 -0
  595. package/src/client/browser-tab-id.ts +36 -0
  596. package/src/client/builder-frame.ts +194 -0
  597. package/src/client/builder-mark.tsx +21 -0
  598. package/src/client/changelog/Changelog.tsx +333 -0
  599. package/src/client/changelog/index.ts +1 -0
  600. package/src/client/chat/ChatHistoryList.tsx +7 -0
  601. package/src/client/chat/attachment-adapters.ts +426 -0
  602. package/src/client/chat/connectors.ts +1579 -0
  603. package/src/client/chat/index.ts +160 -0
  604. package/src/client/chat/markdown-renderer.tsx +693 -0
  605. package/src/client/chat/message-components.tsx +1326 -0
  606. package/src/client/chat/repo-helpers.ts +281 -0
  607. package/src/client/chat/run-recovery.tsx +994 -0
  608. package/src/client/chat/runtime.ts +1810 -0
  609. package/src/client/chat/tool-call-display.tsx +1270 -0
  610. package/src/client/chat/tool-render-registry.tsx +144 -0
  611. package/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  612. package/src/client/chat/use-reconnect-reader-owner.ts +28 -0
  613. package/src/client/chat/widgets/DataChartRenderer.tsx +242 -0
  614. package/src/client/chat/widgets/DataChartWidget.tsx +51 -0
  615. package/src/client/chat/widgets/DataInsightsWidget.tsx +59 -0
  616. package/src/client/chat/widgets/DataTableWidget.tsx +240 -0
  617. package/src/client/chat/widgets/InlineExtensionWidget.tsx +60 -0
  618. package/src/client/chat/widgets/builtin-tool-renderers.tsx +213 -0
  619. package/src/client/chat/widgets/data-widget-types.ts +1 -0
  620. package/src/client/chat/widgets/inline-extension-result.ts +86 -0
  621. package/src/client/chat-model-groups.ts +171 -0
  622. package/src/client/chat-thread-url.ts +11 -0
  623. package/src/client/chat-view-transition.ts +213 -0
  624. package/src/client/client-action.ts +21 -0
  625. package/src/client/client-bootstrap.ts +7 -0
  626. package/src/client/client-surface.ts +41 -0
  627. package/src/client/clipboard.ts +89 -0
  628. package/src/client/code-agent-chat-adapter.ts +537 -0
  629. package/src/client/collab/index.ts +60 -0
  630. package/src/client/command-navigation/index.ts +15 -0
  631. package/src/client/comments-review/index.ts +1 -0
  632. package/src/client/components/AgentPresenceChip.tsx +4 -0
  633. package/src/client/components/ApiKeySettings.tsx +309 -0
  634. package/src/client/components/CodeAgentIndicator.tsx +59 -0
  635. package/src/client/components/CodeRequiredDialog.tsx +470 -0
  636. package/src/client/components/LiveCursorOverlay.tsx +5 -0
  637. package/src/client/components/MissingKeyCard.tsx +61 -0
  638. package/src/client/components/PresenceBar.tsx +4 -0
  639. package/src/client/components/RecentEditHighlights.tsx +4 -0
  640. package/src/client/components/RemoteSelectionRings.tsx +5 -0
  641. package/src/client/components/icons/AgentNativeIcon.tsx +46 -0
  642. package/src/client/components/ui/dialog.tsx +1 -0
  643. package/src/client/components/ui/dropdown-menu.tsx +1 -0
  644. package/src/client/components/ui/hover-card.tsx +1 -0
  645. package/src/client/components/ui/message-scroller.tsx +131 -0
  646. package/src/client/components/ui/popover.tsx +1 -0
  647. package/src/client/components/ui/sheet.tsx +1 -0
  648. package/src/client/components/ui/tooltip.tsx +1 -0
  649. package/src/client/composer/index.ts +11 -0
  650. package/src/client/composer/runtime-adapters.tsx +123 -0
  651. package/src/client/composer/use-mention-search.ts +7 -0
  652. package/src/client/composer/wired-components.tsx +53 -0
  653. package/src/client/context-xray/ContextMeter.tsx +124 -0
  654. package/src/client/context-xray/ContextSegmentRow.tsx +27 -0
  655. package/src/client/context-xray/ContextTreemap.tsx +24 -0
  656. package/src/client/context-xray/ContextXRayPanel.tsx +59 -0
  657. package/src/client/context-xray/SegmentProvenancePopover.tsx +18 -0
  658. package/src/client/context-xray/format.ts +27 -0
  659. package/src/client/conversation/AgentConversation.tsx +555 -0
  660. package/src/client/conversation/code-agent-transcript.ts +283 -0
  661. package/src/client/conversation/index.ts +22 -0
  662. package/src/client/conversation/types.ts +85 -0
  663. package/src/client/conversation/use-near-bottom-autoscroll.ts +278 -0
  664. package/src/client/create-query-client.ts +86 -0
  665. package/src/client/db-admin/DataGrid.tsx +551 -0
  666. package/src/client/db-admin/DbAdminPage.tsx +218 -0
  667. package/src/client/db-admin/DevDatabaseLink.tsx +16 -0
  668. package/src/client/db-admin/EditableCell.tsx +451 -0
  669. package/src/client/db-admin/FilterBar.tsx +203 -0
  670. package/src/client/db-admin/ResultsGrid.tsx +114 -0
  671. package/src/client/db-admin/RowSidePanel.tsx +337 -0
  672. package/src/client/db-admin/SqlEditor.tsx +840 -0
  673. package/src/client/db-admin/TableBrowser.tsx +212 -0
  674. package/src/client/db-admin/TableEditor.tsx +760 -0
  675. package/src/client/db-admin/cell-format.ts +246 -0
  676. package/src/client/db-admin/changeset.ts +296 -0
  677. package/src/client/db-admin/export-utils.ts +78 -0
  678. package/src/client/db-admin/index.ts +33 -0
  679. package/src/client/db-admin/sql-storage.ts +134 -0
  680. package/src/client/db-admin/storage.ts +68 -0
  681. package/src/client/db-admin/useAgentSync.ts +226 -0
  682. package/src/client/db-admin/useDbAdmin.ts +294 -0
  683. package/src/client/dev-overlay/DevOverlay.tsx +576 -0
  684. package/src/client/dev-overlay/builtins.ts +40 -0
  685. package/src/client/dev-overlay/index.ts +23 -0
  686. package/src/client/dev-overlay/registry.ts +67 -0
  687. package/src/client/dev-overlay/types.ts +64 -0
  688. package/src/client/dev-overlay/use-dev-option.ts +78 -0
  689. package/src/client/dev-overlay/use-dev-overlay-shortcut.ts +31 -0
  690. package/src/client/dynamic-suggestions.ts +455 -0
  691. package/src/client/embed-auth.ts +544 -0
  692. package/src/client/embed.ts +54 -0
  693. package/src/client/error-capture.ts +690 -0
  694. package/src/client/error-format.ts +211 -0
  695. package/src/client/error-reporting.ts +100 -0
  696. package/src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx +136 -0
  697. package/src/client/extensions/AgentNativeExtensionFrame.tsx +708 -0
  698. package/src/client/extensions/EmbeddedExtension.tsx +604 -0
  699. package/src/client/extensions/ExtensionEditor.tsx +450 -0
  700. package/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  701. package/src/client/extensions/ExtensionSlot.tsx +345 -0
  702. package/src/client/extensions/ExtensionViewer.tsx +1502 -0
  703. package/src/client/extensions/ExtensionViewerPage.tsx +32 -0
  704. package/src/client/extensions/ExtensionsListPage.tsx +432 -0
  705. package/src/client/extensions/ExtensionsSidebarSection.tsx +1259 -0
  706. package/src/client/extensions/InlineExtensionFrame.tsx +660 -0
  707. package/src/client/extensions/agent-native-extension-runtime.ts +495 -0
  708. package/src/client/extensions/delete-extension.ts +76 -0
  709. package/src/client/extensions/extension-load-error.ts +26 -0
  710. package/src/client/extensions/extension-order.ts +49 -0
  711. package/src/client/extensions/extension-popularity.ts +61 -0
  712. package/src/client/extensions/iframe-bridge.ts +377 -0
  713. package/src/client/extensions/index.ts +84 -0
  714. package/src/client/extensions/portable-extension.ts +712 -0
  715. package/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  716. package/src/client/feature-flags/helpers.ts +77 -0
  717. package/src/client/feature-flags/index.ts +13 -0
  718. package/src/client/feature-flags/types.ts +29 -0
  719. package/src/client/feature-flags/use-feature-flag.ts +26 -0
  720. package/src/client/feedback-context.ts +90 -0
  721. package/src/client/frame-protocol.ts +168 -0
  722. package/src/client/frame.ts +329 -0
  723. package/src/client/guided-questions.tsx +1152 -0
  724. package/src/client/history/VersionHistoryPanel.tsx +175 -0
  725. package/src/client/history/index.ts +21 -0
  726. package/src/client/history/use-history.ts +114 -0
  727. package/src/client/hooks/index.ts +46 -0
  728. package/src/client/host/index.ts +170 -0
  729. package/src/client/host-bridge.ts +1272 -0
  730. package/src/client/host-tools.ts +190 -0
  731. package/src/client/i18n.tsx +798 -0
  732. package/src/client/index.ts +370 -0
  733. package/src/client/integrations/IntegrationCard.tsx +186 -0
  734. package/src/client/integrations/IntegrationsPanel.tsx +633 -0
  735. package/src/client/integrations/api.ts +295 -0
  736. package/src/client/integrations/index.ts +29 -0
  737. package/src/client/integrations/useIntegrationStatus.ts +52 -0
  738. package/src/client/mcp-app-host.ts +720 -0
  739. package/src/client/mcp-apps/McpAppRenderer.tsx +760 -0
  740. package/src/client/navigation/index.ts +54 -0
  741. package/src/client/notifications/NotificationsBell.tsx +383 -0
  742. package/src/client/notifications/index.ts +1 -0
  743. package/src/client/observability/ObservabilityDashboard.tsx +890 -0
  744. package/src/client/observability/ThumbsFeedback.tsx +160 -0
  745. package/src/client/observability/index.ts +20 -0
  746. package/src/client/observability/useObservability.ts +266 -0
  747. package/src/client/onboarding/OnboardingBanner.tsx +73 -0
  748. package/src/client/onboarding/OnboardingPanel.tsx +1036 -0
  749. package/src/client/onboarding/SetupButton.tsx +64 -0
  750. package/src/client/onboarding/index.ts +25 -0
  751. package/src/client/onboarding/use-onboarding.ts +164 -0
  752. package/src/client/onboarding/use-preview-mode.ts +40 -0
  753. package/src/client/org/InvitationBanner.tsx +148 -0
  754. package/src/client/org/OrgSwitcher.tsx +754 -0
  755. package/src/client/org/RequireActiveOrg.tsx +337 -0
  756. package/src/client/org/TeamPage.tsx +1432 -0
  757. package/src/client/org/hooks.ts +359 -0
  758. package/src/client/org/index.ts +70 -0
  759. package/src/client/org/workspace-app-links.ts +367 -0
  760. package/src/client/org-team/index.ts +1 -0
  761. package/src/client/progress/RunsTray.tsx +680 -0
  762. package/src/client/progress/index.ts +1 -0
  763. package/src/client/require-session.tsx +142 -0
  764. package/src/client/resources/BuiltinCapabilityDetail.tsx +258 -0
  765. package/src/client/resources/McpConnectionSuggestion.tsx +276 -0
  766. package/src/client/resources/McpIntegrationDialog.tsx +808 -0
  767. package/src/client/resources/McpServerDetail.tsx +230 -0
  768. package/src/client/resources/ResourceEditor.tsx +872 -0
  769. package/src/client/resources/ResourceTree.tsx +860 -0
  770. package/src/client/resources/ResourcesPanel.tsx +1960 -0
  771. package/src/client/resources/index.ts +25 -0
  772. package/src/client/resources/mcp-integration-catalog.ts +771 -0
  773. package/src/client/resources/mcp-integration-logos.ts +108 -0
  774. package/src/client/resources/runtime.ts +1 -0
  775. package/src/client/resources/use-builtin-capabilities.ts +113 -0
  776. package/src/client/resources/use-mcp-servers.ts +217 -0
  777. package/src/client/resources/use-resources.ts +402 -0
  778. package/src/client/review/ReviewCommentComposer.tsx +123 -0
  779. package/src/client/review/ReviewStatusBadge.tsx +39 -0
  780. package/src/client/review/ReviewThreadPanel.tsx +625 -0
  781. package/src/client/review/index.ts +38 -0
  782. package/src/client/review/use-review.ts +186 -0
  783. package/src/client/route-chunk-recovery/index.ts +1 -0
  784. package/src/client/route-chunk-recovery.ts +331 -0
  785. package/src/client/route-state.ts +455 -0
  786. package/src/client/route-warmup.tsx +543 -0
  787. package/src/client/session-replay-iframe.e2e-host.tsx +100 -0
  788. package/src/client/session-replay.ts +3417 -0
  789. package/src/client/settings/AgentsSection.tsx +441 -0
  790. package/src/client/settings/AutomationsSection.tsx +516 -0
  791. package/src/client/settings/BackgroundAgentSection.tsx +189 -0
  792. package/src/client/settings/BrowserSection.tsx +110 -0
  793. package/src/client/settings/DemoModeSection.tsx +48 -0
  794. package/src/client/settings/SecretsSection.tsx +875 -0
  795. package/src/client/settings/SettingsPanel.tsx +3162 -0
  796. package/src/client/settings/SettingsSection.tsx +283 -0
  797. package/src/client/settings/SettingsTabsPage.tsx +592 -0
  798. package/src/client/settings/UsageSection.tsx +401 -0
  799. package/src/client/settings/VoiceTranscriptionSection.tsx +960 -0
  800. package/src/client/settings/agent-settings-search.ts +220 -0
  801. package/src/client/settings/index.ts +27 -0
  802. package/src/client/settings/useBuilderStatus.ts +1055 -0
  803. package/src/client/setup-connections/BuilderConnectCard.tsx +89 -0
  804. package/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  805. package/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  806. package/src/client/setup-connections/catalog.ts +6 -0
  807. package/src/client/setup-connections/index.ts +47 -0
  808. package/src/client/setup-connections/runtime.ts +1 -0
  809. package/src/client/sharing/ShareButton.tsx +1748 -0
  810. package/src/client/sharing/ShareDialog.tsx +846 -0
  811. package/src/client/sharing/VisibilityBadge.tsx +4 -0
  812. package/src/client/sharing/index.ts +2 -0
  813. package/src/client/sse-event-processor.ts +2002 -0
  814. package/src/client/terminal/AgentTerminal.tsx +488 -0
  815. package/src/client/terminal/index.ts +7 -0
  816. package/src/client/theme.ts +27 -0
  817. package/src/client/tombstone/agent-presence-chip.ts +17 -0
  818. package/src/client/tombstone/editor.ts +265 -0
  819. package/src/client/tombstone/live-cursor-overlay.ts +21 -0
  820. package/src/client/tombstone/presence-bar.ts +17 -0
  821. package/src/client/tombstone/recent-edit-highlights.ts +17 -0
  822. package/src/client/tombstone/remote-selection-rings.ts +21 -0
  823. package/src/client/tombstone/rich-markdown-editor.ts +265 -0
  824. package/src/client/tombstone/ui-dialog.ts +49 -0
  825. package/src/client/tombstone/ui-dropdown-menu.ts +69 -0
  826. package/src/client/tombstone/ui-hover-card.ts +21 -0
  827. package/src/client/tombstone/ui-popover.ts +25 -0
  828. package/src/client/tombstone/ui-sheet.ts +49 -0
  829. package/src/client/tombstone/ui-tooltip.ts +29 -0
  830. package/src/client/tombstone/visual-style-controls.ts +61 -0
  831. package/src/client/tool-cells/BashCell.tsx +164 -0
  832. package/src/client/tool-cells/EditCell.tsx +303 -0
  833. package/src/client/tool-cells/FilesChangedSummary.tsx +208 -0
  834. package/src/client/tool-cells/WriteCell.tsx +145 -0
  835. package/src/client/tool-cells/index.ts +7 -0
  836. package/src/client/tool-display.ts +41 -0
  837. package/src/client/track.ts +57 -0
  838. package/src/client/transcription/BuilderTranscriptionCta.tsx +120 -0
  839. package/src/client/transcription/use-live-transcription.ts +292 -0
  840. package/src/client/ui/index.ts +55 -0
  841. package/src/client/uploads/index.ts +6 -0
  842. package/src/client/uploads/upload-editor-image.ts +79 -0
  843. package/src/client/uploads/use-upload-resource.ts +24 -0
  844. package/src/client/url-scrub.ts +51 -0
  845. package/src/client/use-action.ts +766 -0
  846. package/src/client/use-agent-chat-context.ts +63 -0
  847. package/src/client/use-agent-chat-home-handoff.ts +207 -0
  848. package/src/client/use-agent-chat.ts +53 -0
  849. package/src/client/use-agent-engine-configured.ts +211 -0
  850. package/src/client/use-avatar.ts +127 -0
  851. package/src/client/use-change-version.ts +150 -0
  852. package/src/client/use-chat-models.ts +252 -0
  853. package/src/client/use-chat-threads.ts +1262 -0
  854. package/src/client/use-db-sync.ts +1112 -0
  855. package/src/client/use-demo-mode-status.ts +30 -0
  856. package/src/client/use-dev-mode.ts +177 -0
  857. package/src/client/use-external-value.ts +40 -0
  858. package/src/client/use-pausing-interval.ts +65 -0
  859. package/src/client/use-pinch-zoom.ts +202 -0
  860. package/src/client/use-run-stuck-detection.ts +427 -0
  861. package/src/client/use-send-to-agent-chat.ts +85 -0
  862. package/src/client/use-session.ts +114 -0
  863. package/src/client/utils.ts +7 -0
  864. package/src/client/visual-style-controls.tsx +1 -0
  865. package/src/client/vite-dev-recovery-script.ts +226 -0
  866. package/src/client/voice-provider-status.ts +44 -0
  867. package/src/client/widgets/index.ts +41 -0
  868. package/src/code-agents/background-controller.ts +398 -0
  869. package/src/code-agents/background-run.ts +156 -0
  870. package/src/code-agents/index.ts +95 -0
  871. package/src/code-agents/prompt-attachments.ts +39 -0
  872. package/src/code-agents/transcript-normalizer.ts +750 -0
  873. package/src/code-agents/transcript-order.ts +73 -0
  874. package/src/coding-tools/index.ts +742 -0
  875. package/src/coding-tools/run-code.ts +1662 -0
  876. package/src/coding-tools/sandbox/adapter.ts +82 -0
  877. package/src/coding-tools/sandbox/background.ts +406 -0
  878. package/src/coding-tools/sandbox/executions-store.ts +517 -0
  879. package/src/coding-tools/sandbox/index.ts +132 -0
  880. package/src/coding-tools/sandbox/local-child-process-adapter.ts +217 -0
  881. package/src/collab/agent-identity.ts +5 -0
  882. package/src/collab/agent-presence.ts +341 -0
  883. package/src/collab/awareness-store.ts +196 -0
  884. package/src/collab/awareness.ts +317 -0
  885. package/src/collab/client-struct.ts +366 -0
  886. package/src/collab/client.ts +1205 -0
  887. package/src/collab/emitter.ts +31 -0
  888. package/src/collab/follow-mode.ts +107 -0
  889. package/src/collab/index.ts +151 -0
  890. package/src/collab/json-to-yjs.ts +504 -0
  891. package/src/collab/presence.ts +207 -0
  892. package/src/collab/recent-edits.ts +215 -0
  893. package/src/collab/routes.ts +191 -0
  894. package/src/collab/storage.ts +228 -0
  895. package/src/collab/struct-routes.ts +133 -0
  896. package/src/collab/text-to-yjs.ts +79 -0
  897. package/src/collab/undo.ts +432 -0
  898. package/src/collab/xml-ops.ts +68 -0
  899. package/src/collab/ydoc-manager.ts +544 -0
  900. package/src/command-navigation/actions.ts +100 -0
  901. package/src/command-navigation/index.ts +12 -0
  902. package/src/comments-review/index.ts +1 -0
  903. package/src/connections/catalog.ts +451 -0
  904. package/src/connections/index.ts +48 -0
  905. package/src/connections/reader.ts +911 -0
  906. package/src/connections/runtime.ts +1 -0
  907. package/src/credentials/index.ts +187 -0
  908. package/src/data-programs/actions.ts +335 -0
  909. package/src/data-programs/contract.ts +284 -0
  910. package/src/data-programs/execute.ts +693 -0
  911. package/src/data-programs/index.ts +72 -0
  912. package/src/data-programs/schema.ts +148 -0
  913. package/src/data-programs/store.ts +755 -0
  914. package/src/data-widgets/index.ts +376 -0
  915. package/src/db/client.ts +1627 -0
  916. package/src/db/create-get-db.ts +579 -0
  917. package/src/db/ddl-guard.ts +302 -0
  918. package/src/db/drizzle-config.ts +190 -0
  919. package/src/db/ensure-additive-columns.ts +430 -0
  920. package/src/db/index.ts +57 -0
  921. package/src/db/migrations.ts +691 -0
  922. package/src/db/request-telemetry.ts +154 -0
  923. package/src/db/runtime-diagnostics.ts +331 -0
  924. package/src/db/schema.ts +121 -0
  925. package/src/db/widen-columns.ts +75 -0
  926. package/src/db-admin/agent-tools.ts +202 -0
  927. package/src/db-admin/index.ts +26 -0
  928. package/src/db-admin/operations.ts +803 -0
  929. package/src/db-admin/routes.ts +174 -0
  930. package/src/db-admin/types.ts +110 -0
  931. package/src/demo/browser-state.ts +47 -0
  932. package/src/demo/fetch-interceptor.ts +175 -0
  933. package/src/demo/redact.ts +575 -0
  934. package/src/deploy/build.ts +3935 -0
  935. package/src/deploy/immutable-assets.ts +65 -0
  936. package/src/deploy/route-discovery.ts +458 -0
  937. package/src/deploy/workspace-core.ts +282 -0
  938. package/src/deploy/workspace-deploy.ts +1488 -0
  939. package/src/eject/provider-api-definitions.ts +193 -0
  940. package/src/eject/remote-mcp-presets.ts +137 -0
  941. package/src/eject/setup-readiness-ui.tsx +29 -0
  942. package/src/eject/workspace-connections.ts +92 -0
  943. package/src/embedding/agent.ts +159 -0
  944. package/src/embedding/bridge.ts +297 -0
  945. package/src/embedding/index.ts +43 -0
  946. package/src/embedding/protocol.ts +185 -0
  947. package/src/embedding/react.tsx +319 -0
  948. package/src/embeddings/index.ts +233 -0
  949. package/src/eval/agent-runner.ts +210 -0
  950. package/src/eval/define-eval.ts +55 -0
  951. package/src/eval/index.ts +49 -0
  952. package/src/eval/report.ts +75 -0
  953. package/src/eval/runner.ts +369 -0
  954. package/src/eval/scorer.ts +244 -0
  955. package/src/eval/types.ts +188 -0
  956. package/src/event-bus/bus.ts +140 -0
  957. package/src/event-bus/index.ts +3 -0
  958. package/src/event-bus/registry.ts +79 -0
  959. package/src/event-bus/types.ts +29 -0
  960. package/src/extensions/actions.ts +1636 -0
  961. package/src/extensions/change-marker.ts +54 -0
  962. package/src/extensions/content-patch.ts +468 -0
  963. package/src/extensions/fetch-tool.ts +461 -0
  964. package/src/extensions/html-shell.ts +803 -0
  965. package/src/extensions/local.ts +462 -0
  966. package/src/extensions/path.ts +40 -0
  967. package/src/extensions/proxy-security.ts +171 -0
  968. package/src/extensions/routes.ts +1080 -0
  969. package/src/extensions/schema.ts +269 -0
  970. package/src/extensions/session-replay-iframe.ts +131 -0
  971. package/src/extensions/slots/routes.ts +126 -0
  972. package/src/extensions/slots/schema.ts +87 -0
  973. package/src/extensions/slots/store.ts +450 -0
  974. package/src/extensions/store.ts +1347 -0
  975. package/src/extensions/theme.ts +114 -0
  976. package/src/extensions/url-safety.ts +316 -0
  977. package/src/extensions/web-content.ts +663 -0
  978. package/src/extensions/web-search-tool.ts +437 -0
  979. package/src/feature-flags/a2a-action-route.ts +56 -0
  980. package/src/feature-flags/actions/get-feature-flags.ts +24 -0
  981. package/src/feature-flags/actions/list-feature-flags.ts +69 -0
  982. package/src/feature-flags/actions/set-feature-flag.ts +89 -0
  983. package/src/feature-flags/index.ts +21 -0
  984. package/src/feature-flags/permissions.ts +53 -0
  985. package/src/feature-flags/plugin.ts +44 -0
  986. package/src/feature-flags/registry.ts +96 -0
  987. package/src/feature-flags/store.ts +176 -0
  988. package/src/file-upload/actions/upload-image.ts +213 -0
  989. package/src/file-upload/builder.ts +431 -0
  990. package/src/file-upload/index.ts +24 -0
  991. package/src/file-upload/pre-upload-attachments.ts +305 -0
  992. package/src/file-upload/registry.ts +125 -0
  993. package/src/file-upload/types.ts +89 -0
  994. package/src/guards/db-tool-scoping.ts +129 -0
  995. package/src/guards/index.ts +23 -0
  996. package/src/guards/no-drizzle-push.ts +116 -0
  997. package/src/guards/no-env-credentials.ts +229 -0
  998. package/src/guards/no-env-mutation.ts +114 -0
  999. package/src/guards/no-localhost-fallback.ts +124 -0
  1000. package/src/guards/no-unscoped-credentials.ts +227 -0
  1001. package/src/guards/no-unscoped-queries.ts +834 -0
  1002. package/src/guards/scan-utils.ts +105 -0
  1003. package/src/guards/types.ts +30 -0
  1004. package/src/history/actions/create-resource-version.ts +92 -0
  1005. package/src/history/actions/get-resource-version.ts +60 -0
  1006. package/src/history/actions/list-resource-history.ts +53 -0
  1007. package/src/history/actions/list-resource-versions.ts +43 -0
  1008. package/src/history/actions/restore-resource-version.ts +96 -0
  1009. package/src/history/index.ts +26 -0
  1010. package/src/history/registry.ts +111 -0
  1011. package/src/history/store.ts +379 -0
  1012. package/src/history/types.ts +69 -0
  1013. package/src/index.browser.ts +155 -0
  1014. package/src/index.ts +408 -0
  1015. package/src/ingestion/docx.ts +158 -0
  1016. package/src/ingestion/figma-node-to-html.ts +1860 -0
  1017. package/src/ingestion/figma.ts +548 -0
  1018. package/src/ingestion/index.ts +107 -0
  1019. package/src/ingestion/media.ts +264 -0
  1020. package/src/ingestion/notion.ts +121 -0
  1021. package/src/ingestion/office.ts +213 -0
  1022. package/src/ingestion/orchestration.ts +160 -0
  1023. package/src/ingestion/pptx.ts +331 -0
  1024. package/src/ingestion/selection.ts +81 -0
  1025. package/src/ingestion/website.ts +151 -0
  1026. package/src/integrations/a2a-continuation-marker.ts +2 -0
  1027. package/src/integrations/a2a-continuation-processor.ts +888 -0
  1028. package/src/integrations/a2a-continuations-store.ts +643 -0
  1029. package/src/integrations/adapter-overrides.ts +12 -0
  1030. package/src/integrations/adapters/discord.ts +364 -0
  1031. package/src/integrations/adapters/email.ts +1164 -0
  1032. package/src/integrations/adapters/google-docs.ts +371 -0
  1033. package/src/integrations/adapters/index.ts +29 -0
  1034. package/src/integrations/adapters/microsoft-teams.ts +413 -0
  1035. package/src/integrations/adapters/slack.ts +1914 -0
  1036. package/src/integrations/adapters/telegram.ts +386 -0
  1037. package/src/integrations/adapters/whatsapp.ts +358 -0
  1038. package/src/integrations/awaiting-input-store.ts +130 -0
  1039. package/src/integrations/catalog.ts +571 -0
  1040. package/src/integrations/computer-supervision-store.ts +423 -0
  1041. package/src/integrations/computer-supervision.ts +213 -0
  1042. package/src/integrations/config-store.ts +131 -0
  1043. package/src/integrations/controls-store.ts +187 -0
  1044. package/src/integrations/eject/messaging-adapters.ts +85 -0
  1045. package/src/integrations/google-docs-poller.ts +671 -0
  1046. package/src/integrations/identity-links-store.ts +210 -0
  1047. package/src/integrations/identity.ts +196 -0
  1048. package/src/integrations/index.ts +220 -0
  1049. package/src/integrations/installations-store.ts +677 -0
  1050. package/src/integrations/integration-memory.ts +187 -0
  1051. package/src/integrations/internal-token.ts +106 -0
  1052. package/src/integrations/pending-tasks-retry-job.ts +286 -0
  1053. package/src/integrations/pending-tasks-store.ts +468 -0
  1054. package/src/integrations/plugin.ts +3048 -0
  1055. package/src/integrations/remote-commands-store.ts +690 -0
  1056. package/src/integrations/remote-devices-store.ts +492 -0
  1057. package/src/integrations/remote-json-safety.ts +127 -0
  1058. package/src/integrations/remote-push-delivery-job.ts +48 -0
  1059. package/src/integrations/remote-push-delivery.ts +370 -0
  1060. package/src/integrations/remote-push-store.ts +664 -0
  1061. package/src/integrations/remote-retry-job.ts +55 -0
  1062. package/src/integrations/remote-run-events-store.ts +222 -0
  1063. package/src/integrations/remote-types.ts +186 -0
  1064. package/src/integrations/runtime.ts +1 -0
  1065. package/src/integrations/scope-store.ts +498 -0
  1066. package/src/integrations/slack-manifest.ts +78 -0
  1067. package/src/integrations/slack-oauth.ts +344 -0
  1068. package/src/integrations/task-queue-stats.ts +144 -0
  1069. package/src/integrations/thread-mapping-store.ts +134 -0
  1070. package/src/integrations/types.ts +485 -0
  1071. package/src/integrations/usage-budget-store.ts +906 -0
  1072. package/src/integrations/webhook-delivery.ts +55 -0
  1073. package/src/integrations/webhook-handler.ts +1939 -0
  1074. package/src/jobs/actions/list-recurring-jobs.ts +105 -0
  1075. package/src/jobs/actions/manage-recurring-job.ts +85 -0
  1076. package/src/jobs/cron.ts +126 -0
  1077. package/src/jobs/index.ts +9 -0
  1078. package/src/jobs/scheduler.ts +703 -0
  1079. package/src/jobs/tools.ts +367 -0
  1080. package/src/local-artifacts/index.ts +1372 -0
  1081. package/src/localization/actions/get-localization-preference.ts +24 -0
  1082. package/src/localization/actions/set-localization-preference.ts +32 -0
  1083. package/src/localization/default-messages.ts +1009 -0
  1084. package/src/localization/index.ts +2 -0
  1085. package/src/localization/server.ts +131 -0
  1086. package/src/localization/shared.ts +208 -0
  1087. package/src/mcp/actions/call-mcp-tool.ts +19 -0
  1088. package/src/mcp/actions/create-org-service-token.ts +87 -0
  1089. package/src/mcp/actions/list-mcp-tools.ts +18 -0
  1090. package/src/mcp/actions/list-org-service-tokens.ts +44 -0
  1091. package/src/mcp/actions/revoke-org-service-token.ts +30 -0
  1092. package/src/mcp/actions/service-token-access.ts +121 -0
  1093. package/src/mcp/ask-app-inline-tasks.ts +125 -0
  1094. package/src/mcp/build-server.ts +2356 -0
  1095. package/src/mcp/builtin-tools.ts +1506 -0
  1096. package/src/mcp/connect-route.ts +1460 -0
  1097. package/src/mcp/connect-store.ts +680 -0
  1098. package/src/mcp/embed-app.ts +2051 -0
  1099. package/src/mcp/embed-route.ts +84 -0
  1100. package/src/mcp/external-agent-policy.ts +18 -0
  1101. package/src/mcp/index.ts +47 -0
  1102. package/src/mcp/oauth-route.ts +1016 -0
  1103. package/src/mcp/oauth-store.ts +581 -0
  1104. package/src/mcp/oauth-token.ts +227 -0
  1105. package/src/mcp/org-directory.ts +343 -0
  1106. package/src/mcp/route-paths.ts +34 -0
  1107. package/src/mcp/screen-memory-stdio.ts +290 -0
  1108. package/src/mcp/server.ts +507 -0
  1109. package/src/mcp/stdio.ts +328 -0
  1110. package/src/mcp/workspace-resolve.ts +261 -0
  1111. package/src/mcp-client/app-api.ts +136 -0
  1112. package/src/mcp-client/app-result.ts +64 -0
  1113. package/src/mcp-client/builtin-capabilities.ts +146 -0
  1114. package/src/mcp-client/builtin-store.ts +93 -0
  1115. package/src/mcp-client/config.ts +281 -0
  1116. package/src/mcp-client/errors.ts +54 -0
  1117. package/src/mcp-client/hub-client.ts +172 -0
  1118. package/src/mcp-client/hub-routes.ts +198 -0
  1119. package/src/mcp-client/index.ts +504 -0
  1120. package/src/mcp-client/manager.ts +968 -0
  1121. package/src/mcp-client/oauth-client.ts +462 -0
  1122. package/src/mcp-client/oauth-routes.ts +307 -0
  1123. package/src/mcp-client/remote-store.ts +674 -0
  1124. package/src/mcp-client/remote-url.ts +97 -0
  1125. package/src/mcp-client/routes.ts +1093 -0
  1126. package/src/mcp-client/screen-memory-local.ts +461 -0
  1127. package/src/mcp-client/tool-policy.ts +182 -0
  1128. package/src/mcp-client/visibility.ts +56 -0
  1129. package/src/mcp-client/workspace-servers.ts +379 -0
  1130. package/src/navigation/index.ts +170 -0
  1131. package/src/notifications/actions.ts +151 -0
  1132. package/src/notifications/channels.ts +410 -0
  1133. package/src/notifications/index.ts +22 -0
  1134. package/src/notifications/registry.ts +216 -0
  1135. package/src/notifications/routes.ts +106 -0
  1136. package/src/notifications/store.ts +236 -0
  1137. package/src/notifications/types.ts +52 -0
  1138. package/src/oauth-tokens/google-refresh.ts +175 -0
  1139. package/src/oauth-tokens/index.ts +15 -0
  1140. package/src/oauth-tokens/store.ts +384 -0
  1141. package/src/observability/cleanup-job.ts +124 -0
  1142. package/src/observability/evals.ts +507 -0
  1143. package/src/observability/experiments.ts +359 -0
  1144. package/src/observability/feedback.ts +332 -0
  1145. package/src/observability/hosted-model-experiment.ts +118 -0
  1146. package/src/observability/index.ts +62 -0
  1147. package/src/observability/plugin.ts +31 -0
  1148. package/src/observability/routes.ts +431 -0
  1149. package/src/observability/sentiment.ts +261 -0
  1150. package/src/observability/store.ts +1347 -0
  1151. package/src/observability/traces.ts +789 -0
  1152. package/src/observability/tracing.ts +157 -0
  1153. package/src/observability/tracking-identity.ts +55 -0
  1154. package/src/observability/types.ts +211 -0
  1155. package/src/onboarding/default-steps.ts +428 -0
  1156. package/src/onboarding/index.ts +22 -0
  1157. package/src/onboarding/plugin.ts +262 -0
  1158. package/src/onboarding/registry.ts +47 -0
  1159. package/src/onboarding/types.ts +96 -0
  1160. package/src/org/accept-pending.ts +98 -0
  1161. package/src/org/auto-join-domain.ts +113 -0
  1162. package/src/org/context.ts +614 -0
  1163. package/src/org/free-email-providers.ts +124 -0
  1164. package/src/org/handlers.ts +1153 -0
  1165. package/src/org/index.ts +63 -0
  1166. package/src/org/migrations.ts +105 -0
  1167. package/src/org/permissions.ts +30 -0
  1168. package/src/org/plugin.ts +255 -0
  1169. package/src/org/schema.ts +28 -0
  1170. package/src/org/types.ts +57 -0
  1171. package/src/org-team/index.ts +1 -0
  1172. package/src/package-lifecycle/deprecated-imports.ts +179 -0
  1173. package/src/package-lifecycle/eject-manifest.ts +345 -0
  1174. package/src/package-lifecycle/index.ts +7 -0
  1175. package/src/package-lifecycle/manifest.ts +120 -0
  1176. package/src/package-lifecycle/migration-manifest.ts +159 -0
  1177. package/src/package-lifecycle/migration-message.ts +6 -0
  1178. package/src/package-lifecycle/tombstone.ts +58 -0
  1179. package/src/package-lifecycle/upgrade-error.ts +37 -0
  1180. package/src/private-blob/index.ts +18 -0
  1181. package/src/private-blob/registry.ts +242 -0
  1182. package/src/private-blob/types.ts +55 -0
  1183. package/src/progress/actions.ts +179 -0
  1184. package/src/progress/index.ts +16 -0
  1185. package/src/progress/registry.ts +127 -0
  1186. package/src/progress/routes.ts +89 -0
  1187. package/src/progress/store.ts +353 -0
  1188. package/src/progress/types.ts +59 -0
  1189. package/src/provider-api/actions/custom-provider-registration.ts +197 -0
  1190. package/src/provider-api/actions/delete-staged-dataset.ts +5 -0
  1191. package/src/provider-api/actions/github-repo-files.ts +266 -0
  1192. package/src/provider-api/actions/list-staged-datasets.ts +5 -0
  1193. package/src/provider-api/actions/provider-api-audit.ts +88 -0
  1194. package/src/provider-api/actions/provider-api.ts +460 -0
  1195. package/src/provider-api/actions/query-staged-dataset.ts +5 -0
  1196. package/src/provider-api/actions/staged-datasets.ts +359 -0
  1197. package/src/provider-api/corpus-jobs-store.ts +522 -0
  1198. package/src/provider-api/corpus-jobs.ts +1817 -0
  1199. package/src/provider-api/custom-registry.ts +456 -0
  1200. package/src/provider-api/github-repo.ts +675 -0
  1201. package/src/provider-api/gong.ts +108 -0
  1202. package/src/provider-api/index.ts +5444 -0
  1203. package/src/provider-api/quota-governor.ts +562 -0
  1204. package/src/provider-api/runtime.ts +1 -0
  1205. package/src/provider-api/staged-datasets-aggregate.ts +304 -0
  1206. package/src/provider-api/staged-datasets-store.ts +441 -0
  1207. package/src/provider-api/staging.ts +483 -0
  1208. package/src/resources/agents.ts +65 -0
  1209. package/src/resources/emitter.ts +54 -0
  1210. package/src/resources/handlers.ts +728 -0
  1211. package/src/resources/index.ts +4 -0
  1212. package/src/resources/metadata.ts +252 -0
  1213. package/src/resources/script-helpers.ts +160 -0
  1214. package/src/resources/store.ts +1618 -0
  1215. package/src/review/actions/consume-review-feedback.ts +48 -0
  1216. package/src/review/actions/create-review-comment.ts +108 -0
  1217. package/src/review/actions/delete-review-comment.ts +67 -0
  1218. package/src/review/actions/get-review-feedback.ts +49 -0
  1219. package/src/review/actions/list-review-comments.ts +87 -0
  1220. package/src/review/actions/reply-review-comment.ts +118 -0
  1221. package/src/review/actions/resolve-review-thread.ts +94 -0
  1222. package/src/review/actions/send-review-thread-to-agent.ts +62 -0
  1223. package/src/review/actions/set-review-status.ts +58 -0
  1224. package/src/review/identity.ts +101 -0
  1225. package/src/review/index.ts +45 -0
  1226. package/src/review/mentions.ts +44 -0
  1227. package/src/review/registry.ts +111 -0
  1228. package/src/review/store.ts +997 -0
  1229. package/src/review/types.ts +101 -0
  1230. package/src/router/index.ts +24 -0
  1231. package/src/scripts/agent-engines/list-agent-engines.ts +130 -0
  1232. package/src/scripts/agent-engines/manage-agent-engine.ts +197 -0
  1233. package/src/scripts/agent-engines/set-agent-engine.ts +84 -0
  1234. package/src/scripts/agent-engines/test-agent-engine.ts +174 -0
  1235. package/src/scripts/call-agent.ts +792 -0
  1236. package/src/scripts/chat/index.ts +8 -0
  1237. package/src/scripts/chat/open-chat.ts +56 -0
  1238. package/src/scripts/chat/search-chats.ts +121 -0
  1239. package/src/scripts/core-scripts.ts +22 -0
  1240. package/src/scripts/db/check-scoping.ts +212 -0
  1241. package/src/scripts/db/exec.ts +791 -0
  1242. package/src/scripts/db/index.ts +19 -0
  1243. package/src/scripts/db/migrate-encrypt-credentials.ts +223 -0
  1244. package/src/scripts/db/migrate-encrypt-oauth-tokens.ts +213 -0
  1245. package/src/scripts/db/migrate-user-api-keys.ts +257 -0
  1246. package/src/scripts/db/patch.ts +820 -0
  1247. package/src/scripts/db/query.ts +299 -0
  1248. package/src/scripts/db/reset-dev-owner.ts +285 -0
  1249. package/src/scripts/db/safety.ts +286 -0
  1250. package/src/scripts/db/schema.ts +364 -0
  1251. package/src/scripts/db/scoping.ts +341 -0
  1252. package/src/scripts/db/sqlite-client.ts +78 -0
  1253. package/src/scripts/db/tool-mode.ts +23 -0
  1254. package/src/scripts/db/tool-schemas.ts +31 -0
  1255. package/src/scripts/db/wipe-leaked-builder-keys.ts +201 -0
  1256. package/src/scripts/dev/index.ts +296 -0
  1257. package/src/scripts/dev/list-files.ts +119 -0
  1258. package/src/scripts/dev/read-file.ts +77 -0
  1259. package/src/scripts/dev/search-files.ts +151 -0
  1260. package/src/scripts/dev/shell.ts +111 -0
  1261. package/src/scripts/dev/write-file.ts +56 -0
  1262. package/src/scripts/dev-session.ts +96 -0
  1263. package/src/scripts/docs/index.ts +8 -0
  1264. package/src/scripts/docs/search.ts +274 -0
  1265. package/src/scripts/docs/source-search.ts +363 -0
  1266. package/src/scripts/index.ts +15 -0
  1267. package/src/scripts/manage-agent-loop-settings.ts +84 -0
  1268. package/src/scripts/parse-args.ts +46 -0
  1269. package/src/scripts/resources/delete-memory.ts +67 -0
  1270. package/src/scripts/resources/delete.ts +69 -0
  1271. package/src/scripts/resources/effective.ts +71 -0
  1272. package/src/scripts/resources/index.ts +18 -0
  1273. package/src/scripts/resources/list.ts +103 -0
  1274. package/src/scripts/resources/migrate-learnings.ts +40 -0
  1275. package/src/scripts/resources/read.ts +107 -0
  1276. package/src/scripts/resources/save-memory.ts +99 -0
  1277. package/src/scripts/resources/write.ts +158 -0
  1278. package/src/scripts/runner.ts +339 -0
  1279. package/src/scripts/utils.ts +130 -0
  1280. package/src/search/index.ts +413 -0
  1281. package/src/search-utils/index.ts +112 -0
  1282. package/src/secrets/crypto.ts +228 -0
  1283. package/src/secrets/index.ts +65 -0
  1284. package/src/secrets/onboarding.ts +101 -0
  1285. package/src/secrets/register-framework-secrets.ts +228 -0
  1286. package/src/secrets/register.ts +129 -0
  1287. package/src/secrets/routes.ts +697 -0
  1288. package/src/secrets/schema.ts +52 -0
  1289. package/src/secrets/storage.ts +561 -0
  1290. package/src/secrets/substitution.ts +305 -0
  1291. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +150 -0
  1292. package/src/server/action-change.ts +66 -0
  1293. package/src/server/action-discovery.ts +774 -0
  1294. package/src/server/action-routes.ts +608 -0
  1295. package/src/server/agent-access.ts +72 -0
  1296. package/src/server/agent-chat/action-filters-a2a.ts +339 -0
  1297. package/src/server/agent-chat/browser-team-tools.ts +510 -0
  1298. package/src/server/agent-chat/context-tools.ts +599 -0
  1299. package/src/server/agent-chat/framework-prompts.ts +467 -0
  1300. package/src/server/agent-chat/lazy-fs.ts +11 -0
  1301. package/src/server/agent-chat/mcp-glue.ts +91 -0
  1302. package/src/server/agent-chat/plugin-options.ts +379 -0
  1303. package/src/server/agent-chat/process-run-failure.ts +62 -0
  1304. package/src/server/agent-chat/prompt-resources.ts +1004 -0
  1305. package/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  1306. package/src/server/agent-chat/request-surface.ts +71 -0
  1307. package/src/server/agent-chat/run-code-tools.ts +67 -0
  1308. package/src/server/agent-chat/script-entries.ts +796 -0
  1309. package/src/server/agent-chat/shared-thread.ts +301 -0
  1310. package/src/server/agent-chat/skill-frontmatter.ts +41 -0
  1311. package/src/server/agent-chat-plugin.ts +5930 -0
  1312. package/src/server/agent-discovery.ts +706 -0
  1313. package/src/server/agent-engine-api-key-route.ts +236 -0
  1314. package/src/server/agent-run-context.ts +204 -0
  1315. package/src/server/agent-teams-run-queue.ts +344 -0
  1316. package/src/server/agent-teams.ts +2257 -0
  1317. package/src/server/agents-bundle.ts +464 -0
  1318. package/src/server/analytics.ts +105 -0
  1319. package/src/server/app-base-path.ts +79 -0
  1320. package/src/server/app-name.ts +53 -0
  1321. package/src/server/app-url.ts +184 -0
  1322. package/src/server/attachment-actions.ts +276 -0
  1323. package/src/server/attribution.ts +214 -0
  1324. package/src/server/auth-marketing.ts +260 -0
  1325. package/src/server/auth-plugin.ts +27 -0
  1326. package/src/server/auth.ts +3803 -0
  1327. package/src/server/better-auth-instance.ts +1197 -0
  1328. package/src/server/builder-browser.ts +1701 -0
  1329. package/src/server/builder-design-systems.ts +668 -0
  1330. package/src/server/builder-space.ts +176 -0
  1331. package/src/server/captcha.ts +63 -0
  1332. package/src/server/capture-error.ts +64 -0
  1333. package/src/server/cli-capture.ts +141 -0
  1334. package/src/server/collab-plugin.ts +391 -0
  1335. package/src/server/complete-text.ts +231 -0
  1336. package/src/server/cookie-namespace.ts +159 -0
  1337. package/src/server/core-routes-plugin.ts +4122 -0
  1338. package/src/server/cors-origins.ts +60 -0
  1339. package/src/server/create-server.ts +268 -0
  1340. package/src/server/credential-provider.ts +1202 -0
  1341. package/src/server/csrf.ts +229 -0
  1342. package/src/server/date-utils.ts +42 -0
  1343. package/src/server/deep-link.ts +119 -0
  1344. package/src/server/derived-secret.ts +32 -0
  1345. package/src/server/design-token-utils.ts +1032 -0
  1346. package/src/server/desktop-sso.ts +83 -0
  1347. package/src/server/edge.ts +69 -0
  1348. package/src/server/email-actions.ts +218 -0
  1349. package/src/server/email-template.ts +192 -0
  1350. package/src/server/email-templates.ts +148 -0
  1351. package/src/server/email.ts +219 -0
  1352. package/src/server/embed-route.ts +283 -0
  1353. package/src/server/embed-session.ts +805 -0
  1354. package/src/server/embedded.ts +252 -0
  1355. package/src/server/entry-server.tsx +154 -0
  1356. package/src/server/framework-request-handler.ts +848 -0
  1357. package/src/server/fusion-app.ts +447 -0
  1358. package/src/server/google-auth-mode.ts +34 -0
  1359. package/src/server/google-auth-plugin.ts +496 -0
  1360. package/src/server/google-oauth-credentials.ts +128 -0
  1361. package/src/server/google-oauth.ts +972 -0
  1362. package/src/server/google-realtime-session.ts +182 -0
  1363. package/src/server/h3-helpers.ts +174 -0
  1364. package/src/server/http-response-telemetry.ts +396 -0
  1365. package/src/server/identity-sso-store.ts +304 -0
  1366. package/src/server/identity-sso.ts +514 -0
  1367. package/src/server/index.ts +593 -0
  1368. package/src/server/missing-key.ts +36 -0
  1369. package/src/server/oauth-helpers.ts +44 -0
  1370. package/src/server/oauth-public-origin.ts +44 -0
  1371. package/src/server/oauth-return-url.ts +120 -0
  1372. package/src/server/og-fonts-data.ts +15 -0
  1373. package/src/server/og-fonts.ts +75 -0
  1374. package/src/server/onboarding-html.ts +4040 -0
  1375. package/src/server/open-route.ts +311 -0
  1376. package/src/server/org-admin.ts +28 -0
  1377. package/src/server/poll-events.ts +88 -0
  1378. package/src/server/poll.ts +1224 -0
  1379. package/src/server/prompts/framework-core-compact.ts +107 -0
  1380. package/src/server/prompts/framework-core.ts +143 -0
  1381. package/src/server/prompts/index.ts +16 -0
  1382. package/src/server/prompts/model-overlays.ts +54 -0
  1383. package/src/server/prompts/shared-rules.ts +104 -0
  1384. package/src/server/realtime-voice.ts +967 -0
  1385. package/src/server/recap-image-route.ts +242 -0
  1386. package/src/server/recap-image-store.ts +185 -0
  1387. package/src/server/request-context.ts +416 -0
  1388. package/src/server/request-origin.ts +67 -0
  1389. package/src/server/resources-plugin.ts +119 -0
  1390. package/src/server/schema-prompt.ts +429 -0
  1391. package/src/server/scoped-key-storage.ts +223 -0
  1392. package/src/server/security-headers.ts +170 -0
  1393. package/src/server/self-dispatch.ts +224 -0
  1394. package/src/server/sentry-config.ts +73 -0
  1395. package/src/server/sentry-plugin.ts +138 -0
  1396. package/src/server/sentry.ts +444 -0
  1397. package/src/server/short-lived-token.ts +170 -0
  1398. package/src/server/social-og-image.ts +454 -0
  1399. package/src/server/sse.ts +102 -0
  1400. package/src/server/ssr-handler.ts +466 -0
  1401. package/src/server/transcribe-voice.ts +1076 -0
  1402. package/src/server/voice-providers-status.ts +118 -0
  1403. package/src/server/workspace-oauth.ts +31 -0
  1404. package/src/server/workspace-provider-oauth.ts +970 -0
  1405. package/src/session-replay-iframe-protocol.ts +58 -0
  1406. package/src/settings/handlers.ts +44 -0
  1407. package/src/settings/index.ts +34 -0
  1408. package/src/settings/org-settings.ts +83 -0
  1409. package/src/settings/script-helpers.ts +24 -0
  1410. package/src/settings/store.ts +247 -0
  1411. package/src/settings/user-settings.ts +47 -0
  1412. package/src/setup-connections/index.ts +90 -0
  1413. package/src/setup-connections/onboarding.ts +47 -0
  1414. package/src/shared/agent-access.ts +112 -0
  1415. package/src/shared/agent-chat.ts +124 -0
  1416. package/src/shared/agent-env.ts +46 -0
  1417. package/src/shared/agent-readable-resource.ts +111 -0
  1418. package/src/shared/agent-sidebar-url.ts +39 -0
  1419. package/src/shared/cache-control.ts +25 -0
  1420. package/src/shared/cloudflare-globals.d.ts +34 -0
  1421. package/src/shared/context-xray.ts +172 -0
  1422. package/src/shared/embed-auth.ts +6 -0
  1423. package/src/shared/index.ts +83 -0
  1424. package/src/shared/llm-connection.ts +42 -0
  1425. package/src/shared/markdown-block-split.ts +129 -0
  1426. package/src/shared/mcp-connect-content.ts +130 -0
  1427. package/src/shared/mcp-embed-headers.ts +175 -0
  1428. package/src/shared/mcp-integration-config.ts +101 -0
  1429. package/src/shared/merge-by-id.ts +14 -0
  1430. package/src/shared/oauth-state.ts +39 -0
  1431. package/src/shared/reasoning-effort.ts +228 -0
  1432. package/src/shared/route-warmup-config.ts +128 -0
  1433. package/src/shared/runtime.ts +31 -0
  1434. package/src/shared/social-meta.ts +82 -0
  1435. package/src/shared/streaming-text-smoothing.ts +184 -0
  1436. package/src/shared/truncate.ts +13 -0
  1437. package/src/shared/workspace-app-audience.ts +177 -0
  1438. package/src/shared/workspace-app-id.ts +54 -0
  1439. package/src/sharing/access.ts +585 -0
  1440. package/src/sharing/actions/create-agent-resource-link.ts +91 -0
  1441. package/src/sharing/actions/extension-change.ts +22 -0
  1442. package/src/sharing/actions/list-resource-shares.ts +93 -0
  1443. package/src/sharing/actions/set-resource-visibility.ts +91 -0
  1444. package/src/sharing/actions/share-resource.ts +322 -0
  1445. package/src/sharing/actions/unshare-resource.ts +72 -0
  1446. package/src/sharing/index.ts +35 -0
  1447. package/src/sharing/registry.ts +201 -0
  1448. package/src/sharing/schema.ts +99 -0
  1449. package/src/styles/agent-conversation.css +766 -0
  1450. package/src/styles/agent-native.css +938 -0
  1451. package/src/styles/blocks.css +1717 -0
  1452. package/src/styles/chat-history-list.css +1 -0
  1453. package/src/styles/rich-markdown-editor.css +1 -0
  1454. package/src/tailwind.preset.ts +140 -0
  1455. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1456. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1457. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1458. package/src/templates/chat/AGENTS.md +3 -2
  1459. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1460. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1461. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1462. package/src/templates/default/AGENTS.md +6 -5
  1463. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1464. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1465. package/src/templates/headless/AGENTS.md +5 -4
  1466. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1467. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  1468. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1469. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1470. package/src/templates/workspace-core/AGENTS.md +4 -4
  1471. package/src/templates/workspace-root/AGENTS.md +4 -4
  1472. package/src/terminal/cli-registry.ts +57 -0
  1473. package/src/terminal/index.ts +22 -0
  1474. package/src/terminal/pty-server.ts +389 -0
  1475. package/src/terminal/terminal-plugin.ts +265 -0
  1476. package/src/testing.ts +23 -0
  1477. package/src/tracking/index.ts +10 -0
  1478. package/src/tracking/providers.ts +422 -0
  1479. package/src/tracking/registry.ts +102 -0
  1480. package/src/tracking/route.ts +108 -0
  1481. package/src/tracking/types.ts +16 -0
  1482. package/src/transcription/builder-transcription.ts +118 -0
  1483. package/src/triggers/actions/list-automations.ts +99 -0
  1484. package/src/triggers/actions/manage-automation.ts +78 -0
  1485. package/src/triggers/actions.ts +333 -0
  1486. package/src/triggers/condition-evaluator.ts +163 -0
  1487. package/src/triggers/dispatcher.ts +536 -0
  1488. package/src/triggers/index.ts +13 -0
  1489. package/src/triggers/routes.ts +322 -0
  1490. package/src/triggers/types.ts +42 -0
  1491. package/src/types/pglite.d.ts +26 -0
  1492. package/src/usage/store.ts +698 -0
  1493. package/src/vite/action-types-plugin.ts +481 -0
  1494. package/src/vite/agent-web-plugin.ts +78 -0
  1495. package/src/vite/agents-bundle-plugin.ts +185 -0
  1496. package/src/vite/client.ts +3039 -0
  1497. package/src/vite/index.ts +21 -0
  1498. package/src/voice/index.ts +18 -0
  1499. package/src/voice/voice-cleanup-prompt.ts +38 -0
  1500. package/src/voice/voice-context.ts +217 -0
  1501. package/src/voice/voice-replacements.ts +75 -0
  1502. package/src/workspace-connections/credentials.ts +603 -0
  1503. package/src/workspace-connections/index.ts +72 -0
  1504. package/src/workspace-connections/lifecycle.ts +43 -0
  1505. package/src/workspace-connections/store.ts +1943 -0
  1506. package/src/workspace-files/index.ts +18 -0
  1507. package/src/workspace-files/store.ts +339 -0
  1508. package/src/workspace-files/tool.ts +266 -0
@@ -0,0 +1,1701 @@
1
+ import {
2
+ createHash,
3
+ createHmac,
4
+ randomBytes,
5
+ timingSafeEqual,
6
+ } from "node:crypto";
7
+
8
+ import type { H3Event } from "h3";
9
+ import { getHeader } from "h3";
10
+
11
+ import {
12
+ getAuthSecret,
13
+ resolveSignupTrackingIdentity,
14
+ } from "./better-auth-instance.js";
15
+ import { getAppBasePath, getOrigin } from "./google-oauth.js";
16
+
17
+ const DEFAULT_BUILDER_APP_HOST = "https://builder.io";
18
+ const DEFAULT_BUILDER_API_HOST = "https://api.builder.io";
19
+ const BUILDER_BROWSER_HOST = "agent-native-browser";
20
+ const BUILDER_BROWSER_CLIENT_ID = "Agent Native Browser";
21
+
22
+ export const BUILDER_CALLBACK_PATH = "/_agent-native/builder/callback";
23
+ export const BUILDER_RELAY_PATH = "/_agent-native/builder/relay";
24
+ export const BUILDER_RELAY_STATE_PARAM = "_an_relay";
25
+ export const BUILDER_RELAY_SECRET_ENV = "AGENT_NATIVE_BUILDER_RELAY_SECRET";
26
+ export const BUILDER_RELAY_TARGET_ORIGINS_ENV =
27
+ "AGENT_NATIVE_BUILDER_RELAY_TARGET_ORIGINS";
28
+ export const BUILDER_RELAY_TIMESTAMP_HEADER = "x-agent-native-relay-timestamp";
29
+ export const BUILDER_RELAY_FLOW_HEADER = "x-agent-native-relay-flow";
30
+ export const BUILDER_RELAY_SIGNATURE_HEADER = "x-agent-native-relay-signature";
31
+
32
+ const BUILDER_RELAY_PURPOSE = "builder-preview-callback-relay";
33
+ const BUILDER_RELAY_STATE_VERSION = 1;
34
+ const BUILDER_RELAY_TTL_MS = 10 * 60 * 1000;
35
+ const BUILDER_RELAY_REQUEST_SKEW_MS = 2 * 60 * 1000;
36
+
37
+ export interface BuilderPreviewRelayState {
38
+ v: 1;
39
+ purpose: typeof BUILDER_RELAY_PURPOSE;
40
+ flowId: string;
41
+ ownerEmail: string;
42
+ targetOrigin: string;
43
+ basePath: string;
44
+ iat: number;
45
+ exp: number;
46
+ }
47
+
48
+ export interface BuilderRelayCredentials {
49
+ privateKey: string;
50
+ publicKey: string;
51
+ userId: string | null;
52
+ orgName: string | null;
53
+ orgKind: string | null;
54
+ subscription: string | null;
55
+ subscriptionLevel: string | null;
56
+ subscriptionName: string | null;
57
+ isEnterprise: boolean | null;
58
+ isFreeAccount: boolean | null;
59
+ }
60
+
61
+ export interface BuilderRelayRequestBody {
62
+ relayState: string;
63
+ credentials: BuilderRelayCredentials;
64
+ }
65
+
66
+ function builderRelaySecret(): string {
67
+ const secret = process.env[BUILDER_RELAY_SECRET_ENV]?.trim();
68
+ if (!secret) {
69
+ throw new Error(
70
+ `${BUILDER_RELAY_SECRET_ENV} is required for Builder preview authorization relay.`,
71
+ );
72
+ }
73
+ if (secret.length < 32) {
74
+ throw new Error(
75
+ `${BUILDER_RELAY_SECRET_ENV} must be at least 32 characters long.`,
76
+ );
77
+ }
78
+ return secret;
79
+ }
80
+
81
+ function builderRelayMac(value: string): string {
82
+ return createHmac("sha256", builderRelaySecret())
83
+ .update(value)
84
+ .digest("base64url");
85
+ }
86
+
87
+ function safeEqualText(expected: string, actual: string): boolean {
88
+ const expectedBuffer = Buffer.from(expected);
89
+ const actualBuffer = Buffer.from(actual);
90
+ return (
91
+ expectedBuffer.length === actualBuffer.length &&
92
+ timingSafeEqual(expectedBuffer, actualBuffer)
93
+ );
94
+ }
95
+
96
+ function normalizeBuilderRelayBasePath(value: string): string | null {
97
+ if (!value) return "";
98
+ if (!value.startsWith("/") || value.includes("?") || value.includes("#")) {
99
+ return null;
100
+ }
101
+ const normalized = value.replace(/\/+$/, "");
102
+ if (normalized.split("/").some((part) => part === "." || part === "..")) {
103
+ return null;
104
+ }
105
+ return normalized;
106
+ }
107
+
108
+ export function isSafeBuilderRelayTargetOrigin(value: string): boolean {
109
+ try {
110
+ const url = new URL(value);
111
+ if (
112
+ url.origin !== value ||
113
+ url.username ||
114
+ url.password ||
115
+ url.hostname.includes("*")
116
+ )
117
+ return false;
118
+ const hostname = url.hostname.toLowerCase();
119
+ const loopback =
120
+ hostname === "localhost" ||
121
+ hostname === "127.0.0.1" ||
122
+ hostname === "::1" ||
123
+ hostname === "[::1]";
124
+ if (loopback)
125
+ return url.protocol === "http:" && process.env.NODE_ENV !== "production";
126
+ if (url.protocol !== "https:") return false;
127
+ return (
128
+ hostname.endsWith(".netlify.app") ||
129
+ hostname.endsWith(".vercel.app") ||
130
+ hostname === "agent-native.com" ||
131
+ hostname.endsWith(".agent-native.com") ||
132
+ hostname.endsWith(".builder.io") ||
133
+ hostname.endsWith(".builderio.xyz") ||
134
+ hostname.endsWith(".builderio.dev") ||
135
+ hostname.endsWith(".builder.codes")
136
+ );
137
+ } catch {
138
+ return false;
139
+ }
140
+ }
141
+
142
+ export function isTrustedBuilderRelayTargetOrigin(value: string): boolean {
143
+ if (!isSafeBuilderRelayTargetOrigin(value)) return false;
144
+ const hostname = new URL(value).hostname.toLowerCase();
145
+ if (
146
+ hostname.endsWith(".netlify.app") &&
147
+ !/^[a-f0-9]{24}--[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.netlify\.app$/.test(
148
+ hostname,
149
+ )
150
+ ) {
151
+ return false;
152
+ }
153
+ const configured = process.env[BUILDER_RELAY_TARGET_ORIGINS_ENV];
154
+ if (!configured) return false;
155
+ return configured
156
+ .split(",")
157
+ .map((origin) => origin.trim())
158
+ .filter(Boolean)
159
+ .some((origin) => origin === value && !origin.includes("*"));
160
+ }
161
+
162
+ export function signBuilderPreviewRelayState(input: {
163
+ ownerEmail: string;
164
+ targetOrigin: string;
165
+ basePath?: string;
166
+ flowId?: string;
167
+ now?: number;
168
+ }): { state: string; payload: BuilderPreviewRelayState } {
169
+ if (!isSafeBuilderRelayTargetOrigin(input.targetOrigin)) {
170
+ throw new Error(
171
+ "Builder relay target origin is not an approved preview origin.",
172
+ );
173
+ }
174
+ const basePath = normalizeBuilderRelayBasePath(input.basePath ?? "");
175
+ if (basePath === null) throw new Error("Builder relay base path is invalid.");
176
+ const now = input.now ?? Date.now();
177
+ const payload: BuilderPreviewRelayState = {
178
+ v: BUILDER_RELAY_STATE_VERSION,
179
+ purpose: BUILDER_RELAY_PURPOSE,
180
+ flowId: input.flowId ?? randomBytes(24).toString("base64url"),
181
+ ownerEmail: input.ownerEmail,
182
+ targetOrigin: input.targetOrigin,
183
+ basePath,
184
+ iat: now,
185
+ exp: now + BUILDER_RELAY_TTL_MS,
186
+ };
187
+ const encoded = Buffer.from(JSON.stringify(payload), "utf8").toString(
188
+ "base64url",
189
+ );
190
+ return { state: `${encoded}.${builderRelayMac(encoded)}`, payload };
191
+ }
192
+
193
+ export function verifyBuilderPreviewRelayState(
194
+ state: string | null | undefined,
195
+ options: { now?: number } = {},
196
+ ): BuilderPreviewRelayState | null {
197
+ if (!state) return null;
198
+ const parts = state.split(".");
199
+ if (parts.length !== 2 || !parts[0] || !parts[1]) return null;
200
+ if (!safeEqualText(builderRelayMac(parts[0]), parts[1])) return null;
201
+ let value: unknown;
202
+ try {
203
+ value = JSON.parse(Buffer.from(parts[0], "base64url").toString("utf8"));
204
+ } catch {
205
+ return null;
206
+ }
207
+ if (!value || typeof value !== "object") return null;
208
+ const payload = value as Partial<BuilderPreviewRelayState>;
209
+ const now = options.now ?? Date.now();
210
+ if (
211
+ payload.v !== BUILDER_RELAY_STATE_VERSION ||
212
+ payload.purpose !== BUILDER_RELAY_PURPOSE ||
213
+ typeof payload.flowId !== "string" ||
214
+ !/^[A-Za-z0-9_-]{24,128}$/.test(payload.flowId) ||
215
+ typeof payload.ownerEmail !== "string" ||
216
+ !payload.ownerEmail.includes("@") ||
217
+ typeof payload.targetOrigin !== "string" ||
218
+ !isSafeBuilderRelayTargetOrigin(payload.targetOrigin) ||
219
+ typeof payload.basePath !== "string" ||
220
+ normalizeBuilderRelayBasePath(payload.basePath) !== payload.basePath ||
221
+ typeof payload.iat !== "number" ||
222
+ typeof payload.exp !== "number" ||
223
+ payload.exp <= payload.iat ||
224
+ payload.exp - payload.iat > BUILDER_RELAY_TTL_MS ||
225
+ payload.iat > now + BUILDER_RELAY_REQUEST_SKEW_MS ||
226
+ payload.exp < now
227
+ ) {
228
+ return null;
229
+ }
230
+ return payload as BuilderPreviewRelayState;
231
+ }
232
+
233
+ /**
234
+ * Corporate callback trust check. Preview-side state verification and relay
235
+ * receipt deliberately do not require this callback-only allowlist.
236
+ */
237
+ export function verifyBuilderPreviewRelayStateForCallback(
238
+ state: string | null | undefined,
239
+ options: { now?: number } = {},
240
+ ): BuilderPreviewRelayState | null {
241
+ const payload = verifyBuilderPreviewRelayState(state, options);
242
+ return payload && isTrustedBuilderRelayTargetOrigin(payload.targetOrigin)
243
+ ? payload
244
+ : null;
245
+ }
246
+
247
+ export function getBuilderPreviewRelayUrl(
248
+ payload: BuilderPreviewRelayState,
249
+ ): string {
250
+ return `${payload.targetOrigin}${payload.basePath}${BUILDER_RELAY_PATH}`;
251
+ }
252
+
253
+ function builderRelayBodyDigest(body: string): string {
254
+ return createHash("sha256").update(body).digest("base64url");
255
+ }
256
+
257
+ function builderRelayRequestSignature(
258
+ timestamp: number,
259
+ flowId: string,
260
+ body: string,
261
+ ): string {
262
+ return builderRelayMac(
263
+ `v1.${timestamp}.${flowId}.${builderRelayBodyDigest(body)}`,
264
+ );
265
+ }
266
+
267
+ export function createBuilderRelayRequest(
268
+ relayState: string,
269
+ credentials: BuilderRelayCredentials,
270
+ options: { now?: number } = {},
271
+ ): { body: string; headers: Record<string, string>; url: string } {
272
+ const payload = verifyBuilderPreviewRelayState(relayState, options);
273
+ if (!payload) throw new Error("Builder relay state is invalid or expired.");
274
+ const body = JSON.stringify({
275
+ relayState,
276
+ credentials,
277
+ } satisfies BuilderRelayRequestBody);
278
+ const timestamp = options.now ?? Date.now();
279
+ return {
280
+ body,
281
+ url: getBuilderPreviewRelayUrl(payload),
282
+ headers: {
283
+ "content-type": "application/json",
284
+ [BUILDER_RELAY_TIMESTAMP_HEADER]: String(timestamp),
285
+ [BUILDER_RELAY_FLOW_HEADER]: payload.flowId,
286
+ [BUILDER_RELAY_SIGNATURE_HEADER]: builderRelayRequestSignature(
287
+ timestamp,
288
+ payload.flowId,
289
+ body,
290
+ ),
291
+ },
292
+ };
293
+ }
294
+
295
+ export function verifyBuilderRelayRequest(input: {
296
+ body: string;
297
+ timestamp: string | null | undefined;
298
+ flowId: string | null | undefined;
299
+ signature: string | null | undefined;
300
+ requestOrigin: string;
301
+ requestBasePath: string;
302
+ now?: number;
303
+ }): {
304
+ payload: BuilderPreviewRelayState;
305
+ body: BuilderRelayRequestBody;
306
+ } | null {
307
+ const timestamp = Number(input.timestamp);
308
+ const now = input.now ?? Date.now();
309
+ if (
310
+ !Number.isFinite(timestamp) ||
311
+ Math.abs(now - timestamp) > BUILDER_RELAY_REQUEST_SKEW_MS ||
312
+ !input.flowId ||
313
+ !input.signature ||
314
+ !safeEqualText(
315
+ builderRelayRequestSignature(timestamp, input.flowId, input.body),
316
+ input.signature,
317
+ )
318
+ ) {
319
+ return null;
320
+ }
321
+ let body: BuilderRelayRequestBody;
322
+ try {
323
+ body = JSON.parse(input.body) as BuilderRelayRequestBody;
324
+ } catch {
325
+ return null;
326
+ }
327
+ const payload = verifyBuilderPreviewRelayState(body.relayState, { now });
328
+ if (
329
+ !payload ||
330
+ payload.flowId !== input.flowId ||
331
+ payload.targetOrigin !== input.requestOrigin ||
332
+ payload.basePath !== input.requestBasePath ||
333
+ !body.credentials ||
334
+ typeof body.credentials.privateKey !== "string" ||
335
+ typeof body.credentials.publicKey !== "string" ||
336
+ !body.credentials.privateKey ||
337
+ !body.credentials.publicKey
338
+ ) {
339
+ return null;
340
+ }
341
+ const nullableString = (value: unknown): string | null =>
342
+ typeof value === "string" ? value : null;
343
+ const nullableBoolean = (value: unknown): boolean | null =>
344
+ typeof value === "boolean" ? value : null;
345
+ return {
346
+ payload,
347
+ body: {
348
+ relayState: body.relayState,
349
+ // Explicitly rebuild the credential payload. Extra fields such as an
350
+ // attacker-supplied ownerEmail/orgId never reach the credential writer.
351
+ credentials: {
352
+ privateKey: body.credentials.privateKey,
353
+ publicKey: body.credentials.publicKey,
354
+ userId: nullableString(body.credentials.userId),
355
+ orgName: nullableString(body.credentials.orgName),
356
+ orgKind: nullableString(body.credentials.orgKind),
357
+ subscription: nullableString(body.credentials.subscription),
358
+ subscriptionLevel: nullableString(body.credentials.subscriptionLevel),
359
+ subscriptionName: nullableString(body.credentials.subscriptionName),
360
+ isEnterprise: nullableBoolean(body.credentials.isEnterprise),
361
+ isFreeAccount: nullableBoolean(body.credentials.isFreeAccount),
362
+ },
363
+ },
364
+ };
365
+ }
366
+
367
+ function escapeHtml(value: string): string {
368
+ return value.replace(/[&<>"']/g, (ch) => {
369
+ switch (ch) {
370
+ case "&":
371
+ return "&amp;";
372
+ case "<":
373
+ return "&lt;";
374
+ case ">":
375
+ return "&gt;";
376
+ case '"':
377
+ return "&quot;";
378
+ default:
379
+ return "&#39;";
380
+ }
381
+ });
382
+ }
383
+
384
+ /**
385
+ * Query-param name carrying the signed CSRF state on the connect→callback
386
+ * round-trip. Prefixed with `_an_` to avoid collisions if Builder ever
387
+ * adds standard OAuth `state` support to cli-auth. Builder preserves
388
+ * the path/query of `redirect_url` verbatim when redirecting back, so
389
+ * we embed `_an_state=…` inside the redirect_url query string at
390
+ * connect time and read it back on the callback.
391
+ */
392
+ export const BUILDER_STATE_PARAM = "_an_state";
393
+ export const BUILDER_CONNECT_PARAM = "_an_connect";
394
+ export const BUILDER_CONNECT_OWNER_COOKIE = "an_builder_connect_owner";
395
+ export const BUILDER_SIGNUP_SOURCE_PARAM = "signupSource";
396
+ export const BUILDER_AGENT_NATIVE_FLOW_PARAM = "agentNativeFlow";
397
+ export const BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM =
398
+ "agentNativeConnectSource";
399
+ export const BUILDER_AGENT_NATIVE_APP_PARAM = "agentNativeApp";
400
+ export const BUILDER_AGENT_NATIVE_TEMPLATE_PARAM = "agentNativeTemplate";
401
+
402
+ const BUILDER_STATE_TTL_MS = 10 * 60 * 1000;
403
+ const BUILDER_SIGNUP_SOURCE = "agent-native";
404
+
405
+ export interface BuilderConnectTrackingParams {
406
+ signupSource?: string;
407
+ agentNativeFlow?: string;
408
+ agentNativeConnectSource?: string;
409
+ agentNativeApp?: string;
410
+ agentNativeTemplate?: string;
411
+ }
412
+
413
+ function cleanTrackingParam(value: unknown): string | undefined {
414
+ if (typeof value !== "string") return undefined;
415
+ const trimmed = value.trim();
416
+ return trimmed ? trimmed.slice(0, 120) : undefined;
417
+ }
418
+
419
+ export function getBuilderConnectTrackingParams(
420
+ params: URLSearchParams,
421
+ ): BuilderConnectTrackingParams {
422
+ return {
423
+ signupSource:
424
+ cleanTrackingParam(params.get(BUILDER_SIGNUP_SOURCE_PARAM)) ??
425
+ BUILDER_SIGNUP_SOURCE,
426
+ agentNativeFlow: cleanTrackingParam(
427
+ params.get(BUILDER_AGENT_NATIVE_FLOW_PARAM),
428
+ ),
429
+ agentNativeConnectSource: cleanTrackingParam(
430
+ params.get(BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM),
431
+ ),
432
+ agentNativeApp: cleanTrackingParam(
433
+ params.get(BUILDER_AGENT_NATIVE_APP_PARAM),
434
+ ),
435
+ agentNativeTemplate: cleanTrackingParam(
436
+ params.get(BUILDER_AGENT_NATIVE_TEMPLATE_PARAM),
437
+ ),
438
+ };
439
+ }
440
+
441
+ export function builderConnectTrackingProperties(
442
+ tracking: BuilderConnectTrackingParams,
443
+ ): Record<string, string> {
444
+ const properties: Record<string, string> = {};
445
+ if (tracking.signupSource) properties.signup_source = tracking.signupSource;
446
+ if (tracking.agentNativeFlow) {
447
+ properties.agent_native_flow = tracking.agentNativeFlow;
448
+ }
449
+ if (tracking.agentNativeConnectSource) {
450
+ properties.agent_native_connect_source = tracking.agentNativeConnectSource;
451
+ }
452
+ if (tracking.agentNativeApp) {
453
+ properties.agent_native_app = tracking.agentNativeApp;
454
+ }
455
+ if (tracking.agentNativeTemplate) {
456
+ properties.agent_native_template = tracking.agentNativeTemplate;
457
+ }
458
+ return properties;
459
+ }
460
+
461
+ function applyBuilderConnectTrackingParams(
462
+ params: URLSearchParams,
463
+ tracking: BuilderConnectTrackingParams,
464
+ ) {
465
+ params.set(
466
+ BUILDER_SIGNUP_SOURCE_PARAM,
467
+ cleanTrackingParam(tracking.signupSource) ?? BUILDER_SIGNUP_SOURCE,
468
+ );
469
+ const flow = cleanTrackingParam(tracking.agentNativeFlow);
470
+ if (flow) params.set(BUILDER_AGENT_NATIVE_FLOW_PARAM, flow);
471
+ const source = cleanTrackingParam(tracking.agentNativeConnectSource);
472
+ if (source) params.set(BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM, source);
473
+ const app = cleanTrackingParam(tracking.agentNativeApp);
474
+ if (app) params.set(BUILDER_AGENT_NATIVE_APP_PARAM, app);
475
+ const template = cleanTrackingParam(tracking.agentNativeTemplate);
476
+ if (template) params.set(BUILDER_AGENT_NATIVE_TEMPLATE_PARAM, template);
477
+ }
478
+
479
+ export interface BuilderBrowserStatus {
480
+ configured: boolean;
481
+ builderEnabled: boolean;
482
+ branchProjectIdConfigured: boolean;
483
+ branchProjectId?: string;
484
+ /**
485
+ * True when `BUILDER_PRIVATE_KEY` is set at the deployment level. This is a
486
+ * fallback credential; signed-in users can still connect their own Builder
487
+ * account, which takes precedence for their request.
488
+ */
489
+ envManaged: boolean;
490
+ credentialSource?: "user" | "org" | "workspace" | "env";
491
+ /**
492
+ * The currently effective Builder credential was rejected by Builder's API.
493
+ * This is durable status about the credential pair, not a failure of an
494
+ * in-progress cli-auth callback.
495
+ */
496
+ authError?: { message: string; at: number };
497
+ connectError?: { message: string; at: number };
498
+ appHost: string;
499
+ apiHost: string;
500
+ /**
501
+ * Ready-to-open Builder CLI auth URL for this request owner, when the
502
+ * callback can return to the same deployment that minted the state. Preview
503
+ * deployments that must callback through a gateway omit this and use
504
+ * connectUrl so the server can write a pending-connect row first.
505
+ */
506
+ cliAuthUrl?: string;
507
+ connectUrl: string;
508
+ publicKeyConfigured: boolean;
509
+ privateKeyConfigured: boolean;
510
+ userId?: string;
511
+ orgName?: string;
512
+ /**
513
+ * The Builder space(s) the effective credential can reach, with their real
514
+ * display names (derived from the Admin GraphQL API). A `bpk-` key is
515
+ * space-scoped, so today this is one entry; the list shape lets the Sources
516
+ * drill-down grow to multiple spaces without a restructure. Absent/empty when
517
+ * the name can't be derived — UIs fall back to `orgName`.
518
+ */
519
+ spaces?: Array<{ id: string; name: string }>;
520
+ orgKind?: string;
521
+ subscription?: string;
522
+ subscriptionLevel?: string;
523
+ subscriptionName?: string;
524
+ isEnterprise?: boolean;
525
+ isFreeAccount?: boolean;
526
+ }
527
+
528
+ export interface BrowserConnectionArgs {
529
+ sessionId?: string;
530
+ projectId?: string;
531
+ branchName?: string;
532
+ proxyOrigin?: string;
533
+ proxyDefaultOrigin?: string;
534
+ proxyDestination?: string;
535
+ }
536
+
537
+ type BuilderSignedTokenPurpose = "callback" | "connect";
538
+
539
+ function signingKeyForPurpose(purpose: BuilderSignedTokenPurpose): string {
540
+ // Preserve the original callback-state signing key for any in-flight legacy
541
+ // callbacks; use a separate key domain for connect-entry tokens.
542
+ return purpose === "callback"
543
+ ? `builder-csrf:${getAuthSecret()}`
544
+ : `builder-connect:${getAuthSecret()}`;
545
+ }
546
+
547
+ function macForParts(
548
+ purpose: BuilderSignedTokenPurpose,
549
+ nonce: string,
550
+ emailEncoded: string,
551
+ ts: number,
552
+ ): string {
553
+ return createHmac("sha256", signingKeyForPurpose(purpose))
554
+ .update(`${nonce}.${emailEncoded}.${ts}`)
555
+ .digest("base64url");
556
+ }
557
+
558
+ function signEmailBoundBuilderToken(
559
+ ownerEmail: string,
560
+ purpose: BuilderSignedTokenPurpose,
561
+ ): string {
562
+ const nonce = randomBytes(16).toString("base64url");
563
+ const ts = Date.now();
564
+ const emailEncoded = Buffer.from(ownerEmail, "utf8").toString("base64url");
565
+ const mac = macForParts(purpose, nonce, emailEncoded, ts);
566
+ return `${nonce}.${emailEncoded}.${ts}.${mac}`;
567
+ }
568
+
569
+ function verifyEmailBoundBuilderToken(
570
+ token: string | null | undefined,
571
+ ownerEmail: string,
572
+ purpose: BuilderSignedTokenPurpose,
573
+ ): boolean {
574
+ if (typeof token !== "string" || token.length === 0) return false;
575
+ const parts = token.split(".");
576
+ if (parts.length !== 4) return false;
577
+ const [nonce, emailEncoded, tsStr, mac] = parts;
578
+ if (!nonce || !emailEncoded || !tsStr || !mac) return false;
579
+
580
+ let boundEmail: string;
581
+ try {
582
+ boundEmail = Buffer.from(emailEncoded, "base64url").toString("utf8");
583
+ } catch {
584
+ return false;
585
+ }
586
+ if (boundEmail !== ownerEmail) return false;
587
+
588
+ const ts = Number(tsStr);
589
+ if (!Number.isFinite(ts)) return false;
590
+ // Reject expired AND far-future timestamps so leaked tokens do not gain an
591
+ // arbitrary lifetime through clock skew or forged future issue times.
592
+ if (Math.abs(Date.now() - ts) > BUILDER_STATE_TTL_MS) return false;
593
+
594
+ const expected = Buffer.from(macForParts(purpose, nonce, emailEncoded, ts));
595
+ const candidate = Buffer.from(mac);
596
+ if (expected.length !== candidate.length) return false;
597
+ return timingSafeEqual(expected, candidate);
598
+ }
599
+
600
+ /**
601
+ * Mint a signed CSRF state token bound to the current session's email
602
+ * and a fresh nonce. Round-trips through Builder's cli-auth flow inside
603
+ * the redirect_url query string and is verified on the callback before
604
+ * any keys are written.
605
+ *
606
+ * Why bind to email: it's the only stable, universally-available
607
+ * identity field across all auth modes (Better Auth, BYOA, AUTH_MODE=local).
608
+ * Binding to the session token instead would put the cookie value in a
609
+ * URL that may end up in server logs / browser history.
610
+ */
611
+ export function signBuilderCallbackState(sessionEmail: string): string {
612
+ return signEmailBoundBuilderToken(sessionEmail, "callback");
613
+ }
614
+
615
+ /**
616
+ * Verify a state token produced by `signBuilderCallbackState`. Returns
617
+ * false on any malformed, forged, expired, or cross-session token.
618
+ */
619
+ export function verifyBuilderCallbackState(
620
+ token: string | null | undefined,
621
+ sessionEmail: string,
622
+ ): boolean {
623
+ return verifyEmailBoundBuilderToken(token, sessionEmail, "callback");
624
+ }
625
+
626
+ export function verifyBuilderCallbackStateAndGetOwner(
627
+ token: string | null | undefined,
628
+ ): string | null {
629
+ if (typeof token !== "string" || token.length === 0) return null;
630
+ const parts = token.split(".");
631
+ if (parts.length !== 4) return null;
632
+ const emailEncoded = parts[1];
633
+ if (!emailEncoded) return null;
634
+
635
+ let ownerEmail: string;
636
+ try {
637
+ ownerEmail = Buffer.from(emailEncoded, "base64url").toString("utf8");
638
+ } catch {
639
+ return null;
640
+ }
641
+ if (!ownerEmail) return null;
642
+ return verifyBuilderCallbackState(token, ownerEmail) ? ownerEmail : null;
643
+ }
644
+
645
+ export function signBuilderConnectToken(ownerEmail: string): string {
646
+ return signEmailBoundBuilderToken(ownerEmail, "connect");
647
+ }
648
+
649
+ export function verifyBuilderConnectToken(
650
+ token: string | null | undefined,
651
+ ownerEmail: string,
652
+ ): boolean {
653
+ return verifyEmailBoundBuilderToken(token, ownerEmail, "connect");
654
+ }
655
+
656
+ export function verifyBuilderConnectTokenAndGetOwner(
657
+ token: string | null | undefined,
658
+ ): string | null {
659
+ if (typeof token !== "string" || token.length === 0) return null;
660
+ const parts = token.split(".");
661
+ if (parts.length !== 4) return null;
662
+ const emailEncoded = parts[1];
663
+ if (!emailEncoded) return null;
664
+
665
+ let ownerEmail: string;
666
+ try {
667
+ ownerEmail = Buffer.from(emailEncoded, "base64url").toString("utf8");
668
+ } catch {
669
+ return null;
670
+ }
671
+ if (!ownerEmail) return null;
672
+ return verifyBuilderConnectToken(token, ownerEmail) ? ownerEmail : null;
673
+ }
674
+
675
+ export function appendBuilderConnectToken(
676
+ connectUrl: string,
677
+ ownerEmail: string,
678
+ ): string {
679
+ const url = new URL(connectUrl);
680
+ url.searchParams.set(
681
+ BUILDER_CONNECT_PARAM,
682
+ signBuilderConnectToken(ownerEmail),
683
+ );
684
+ return url.toString();
685
+ }
686
+
687
+ function isAllowedBrowserReturnUrl(urlString: string): boolean {
688
+ try {
689
+ const parsed = new URL(urlString);
690
+ const hostname = parsed.hostname.toLowerCase();
691
+ const isAllowedProtocol =
692
+ parsed.protocol === "http:" || parsed.protocol === "https:";
693
+ const isLocalhost =
694
+ hostname === "localhost" ||
695
+ hostname === "127.0.0.1" ||
696
+ hostname === "[::1]";
697
+ const isBuilderDomain =
698
+ hostname === "builder.io" ||
699
+ hostname.endsWith(".builder.io") ||
700
+ hostname === "builder.my" ||
701
+ hostname.endsWith(".builder.my") ||
702
+ hostname === "builderio.xyz" ||
703
+ hostname.endsWith(".builderio.xyz") ||
704
+ hostname === "builderio.dev" ||
705
+ hostname.endsWith(".builderio.dev") ||
706
+ hostname === "builder.codes" ||
707
+ hostname.endsWith(".builder.codes");
708
+ const isAgentNativeDomain =
709
+ hostname === "agent-native.com" || hostname.endsWith(".agent-native.com");
710
+ return (
711
+ isAllowedProtocol &&
712
+ (isLocalhost || isBuilderDomain || isAgentNativeDomain)
713
+ );
714
+ } catch {
715
+ return false;
716
+ }
717
+ }
718
+
719
+ function normalizeOrigin(origin: string): string {
720
+ return origin.replace(/\/+$/, "");
721
+ }
722
+
723
+ export function getBuilderAppHost(): string {
724
+ return (
725
+ process.env.BUILDER_APP_HOST ||
726
+ process.env.BUILDER_PUBLIC_APP_HOST ||
727
+ DEFAULT_BUILDER_APP_HOST
728
+ );
729
+ }
730
+
731
+ export function getBuilderApiHost(): string {
732
+ return (
733
+ process.env.AIR_HOST ||
734
+ process.env.BUILDER_HOST ||
735
+ process.env.BUILDER_API_HOST ||
736
+ DEFAULT_BUILDER_API_HOST
737
+ );
738
+ }
739
+
740
+ function getConfiguredBuilderBranchProjectId(): string | undefined {
741
+ const projectId =
742
+ process.env.DISPATCH_BUILDER_PROJECT_ID ||
743
+ process.env.BUILDER_BRANCH_PROJECT_ID ||
744
+ process.env.BUILDER_PROJECT_ID;
745
+ return projectId?.trim() || undefined;
746
+ }
747
+
748
+ export function getBuilderBranchProjectId(): string {
749
+ return getConfiguredBuilderBranchProjectId() || "";
750
+ }
751
+
752
+ export function isBuilderBranchingEnabled(): boolean {
753
+ return !!getConfiguredBuilderBranchProjectId();
754
+ }
755
+
756
+ export async function resolveBuilderBranchProjectId(): Promise<string> {
757
+ const envProjectId = getConfiguredBuilderBranchProjectId();
758
+ if (envProjectId) return envProjectId;
759
+
760
+ try {
761
+ const { resolveSecret } = await import("./credential-provider.js");
762
+ for (const key of [
763
+ "DISPATCH_BUILDER_PROJECT_ID",
764
+ "BUILDER_BRANCH_PROJECT_ID",
765
+ "BUILDER_PROJECT_ID",
766
+ ]) {
767
+ const value = await resolveSecret(key);
768
+ if (value?.trim()) return value.trim();
769
+ }
770
+ } catch {
771
+ // Secrets table or request context not ready — treat as not configured.
772
+ }
773
+
774
+ return "";
775
+ }
776
+
777
+ export async function resolveIsBuilderBranchingEnabled(): Promise<boolean> {
778
+ return !!(await resolveBuilderBranchProjectId());
779
+ }
780
+
781
+ function isBuilderCliAuthAllowedOrigin(origin: string | null | undefined) {
782
+ if (!origin) return false;
783
+ try {
784
+ const parsed = new URL(origin);
785
+ const hostname = parsed.hostname.toLowerCase();
786
+ const isAllowedProtocol =
787
+ parsed.protocol === "http:" || parsed.protocol === "https:";
788
+ const isLocalhost =
789
+ hostname === "localhost" ||
790
+ hostname === "127.0.0.1" ||
791
+ hostname === "::1" ||
792
+ hostname === "[::1]";
793
+ const isBuilderDomain =
794
+ hostname === "builder.io" || hostname.endsWith(".builder.io");
795
+ const isAgentNativeDomain =
796
+ hostname === "agent-native.com" || hostname.endsWith(".agent-native.com");
797
+ return (
798
+ isAllowedProtocol &&
799
+ (isLocalhost || isBuilderDomain || isAgentNativeDomain)
800
+ );
801
+ } catch {
802
+ return false;
803
+ }
804
+ }
805
+
806
+ function firstBuilderCliAuthCallbackOriginFromEnv(): string | null {
807
+ for (const key of [
808
+ "APP_URL",
809
+ "VITE_APP_URL",
810
+ "BETTER_AUTH_URL",
811
+ "VITE_BETTER_AUTH_URL",
812
+ "WORKSPACE_GATEWAY_URL",
813
+ "VITE_WORKSPACE_GATEWAY_URL",
814
+ ]) {
815
+ const raw = process.env[key];
816
+ if (!raw) continue;
817
+ try {
818
+ const origin = new URL(raw).origin;
819
+ if (isBuilderCliAuthAllowedOrigin(origin)) return origin;
820
+ } catch {
821
+ // Ignore malformed environment values.
822
+ }
823
+ }
824
+ return null;
825
+ }
826
+
827
+ /**
828
+ * Query param on the callback URL that carries the original preview opener
829
+ * origin when cli-auth's allow-list forces `preview_url` to the gateway.
830
+ * Read on the callback to derive the correct postMessage targetOrigin.
831
+ *
832
+ * Not signed: the receive-side trust check in `useBuilderStatus` still
833
+ * gates messages by allow-listed origin. The worst an attacker could do by
834
+ * crafting a different `_an_opener` value is target a postMessage to an
835
+ * origin that doesn't match the actual opener — postMessage drops the
836
+ * message in that case, identical to the legacy wildcard-fallback path.
837
+ */
838
+ export const BUILDER_OPENER_PARAM = "_an_opener";
839
+
840
+ function isBuilderOpenerOriginSafe(value: string | null | undefined): boolean {
841
+ if (!value) return false;
842
+ try {
843
+ const parsed = new URL(value);
844
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
845
+ } catch {
846
+ return false;
847
+ }
848
+ }
849
+
850
+ /**
851
+ * Build the Builder cli-auth URL for the connect popup. When a signed
852
+ * `state` token is supplied it is embedded inside the `redirect_url`
853
+ * query string so it survives Builder's redirect verbatim — Builder
854
+ * preserves the redirect_url's existing query when appending p-key /
855
+ * api-key / etc., so we don't depend on Builder echoing a top-level
856
+ * `state` parameter (it doesn't).
857
+ *
858
+ * Status responses can surface this URL directly; the legacy
859
+ * `/_agent-native/builder/connect` trampoline still calls this helper for
860
+ * clients that only know the app-local connect URL.
861
+ */
862
+ export function buildBuilderCliAuthUrl(
863
+ callbackOrigin: string,
864
+ state: string | null = null,
865
+ options: {
866
+ previewOrigin?: string;
867
+ relayState?: string;
868
+ tracking?: BuilderConnectTrackingParams;
869
+ } = {},
870
+ ): string {
871
+ const normalizedCallbackOrigin = normalizeOrigin(callbackOrigin);
872
+ const requestedPreviewOrigin = normalizeOrigin(
873
+ options.previewOrigin || callbackOrigin,
874
+ );
875
+ const normalizedPreviewOrigin = isBuilderCliAuthAllowedOrigin(
876
+ requestedPreviewOrigin,
877
+ )
878
+ ? requestedPreviewOrigin
879
+ : normalizedCallbackOrigin;
880
+ const appBasePath = getAppBasePath();
881
+ const callbackUrl = new URL(
882
+ `${appBasePath}${BUILDER_CALLBACK_PATH}`,
883
+ normalizedCallbackOrigin,
884
+ );
885
+ if (state) {
886
+ callbackUrl.searchParams.set(BUILDER_STATE_PARAM, state);
887
+ }
888
+ if (options.relayState) {
889
+ callbackUrl.searchParams.set(BUILDER_RELAY_STATE_PARAM, options.relayState);
890
+ }
891
+ // When the cli-auth allow-list forces preview_url onto the gateway origin,
892
+ // the callback would otherwise lose the real opener origin and post its
893
+ // success message to the gateway instead of the preview tab. Embed the
894
+ // original preview origin in the callback's own query string so the
895
+ // callback handler can recover it for parentOrigin / postMessage. Builder
896
+ // preserves the redirect_url's query verbatim, so this round-trips.
897
+ if (
898
+ requestedPreviewOrigin &&
899
+ requestedPreviewOrigin !== normalizedPreviewOrigin &&
900
+ isBuilderOpenerOriginSafe(requestedPreviewOrigin)
901
+ ) {
902
+ callbackUrl.searchParams.set(BUILDER_OPENER_PARAM, requestedPreviewOrigin);
903
+ }
904
+ const identity = resolveSignupTrackingIdentity();
905
+ const tracking = {
906
+ signupSource: BUILDER_SIGNUP_SOURCE,
907
+ agentNativeApp: identity.app,
908
+ agentNativeTemplate: identity.template,
909
+ ...options.tracking,
910
+ };
911
+ applyBuilderConnectTrackingParams(callbackUrl.searchParams, tracking);
912
+ const url = new URL("/cli-auth", getBuilderAppHost());
913
+ url.searchParams.set("response_type", "code");
914
+ url.searchParams.set("host", BUILDER_BROWSER_HOST);
915
+ url.searchParams.set("client_id", BUILDER_BROWSER_CLIENT_ID);
916
+ url.searchParams.set("redirect_url", callbackUrl.toString());
917
+ url.searchParams.set(
918
+ "preview_url",
919
+ `${normalizedPreviewOrigin}${appBasePath}`,
920
+ );
921
+ url.searchParams.set("framework", "agent-native");
922
+ applyBuilderConnectTrackingParams(url.searchParams, tracking);
923
+ return url.toString();
924
+ }
925
+
926
+ /**
927
+ * The bare URL surfaced to clients as `connectUrl`. The status route appends
928
+ * a short-lived signed connect token when it knows the current owner; this
929
+ * helper stays bare so server-rendered cards can still render without a
930
+ * request-bound owner and the connect route can fall back to Fetch Metadata.
931
+ */
932
+ export function getBuilderBrowserConnectUrl(origin: string): string {
933
+ return `${normalizeOrigin(origin)}${getAppBasePath()}/_agent-native/builder/connect`;
934
+ }
935
+
936
+ export function getBuilderBrowserConnectUrlForOwner(
937
+ origin: string,
938
+ ownerEmail: string | null | undefined,
939
+ ): string {
940
+ const connectUrl = getBuilderBrowserConnectUrl(origin);
941
+ return ownerEmail
942
+ ? appendBuilderConnectToken(connectUrl, ownerEmail)
943
+ : connectUrl;
944
+ }
945
+
946
+ function firstHeaderValue(value: string | undefined): string | undefined {
947
+ return value?.split(",")[0]?.trim() || undefined;
948
+ }
949
+
950
+ function readEventHeader(event: H3Event, name: string): string | undefined {
951
+ try {
952
+ return getHeader(event, name) ?? undefined;
953
+ } catch {
954
+ const headers = (
955
+ event as unknown as {
956
+ node?: {
957
+ req?: { headers?: Record<string, string | string[] | undefined> };
958
+ };
959
+ }
960
+ ).node?.req?.headers;
961
+ const value = headers?.[name.toLowerCase()] ?? headers?.[name];
962
+ if (Array.isArray(value)) return value[0];
963
+ return typeof value === "string" ? value : undefined;
964
+ }
965
+ }
966
+
967
+ function isTrustedBuilderRequestHost(host: string | undefined): boolean {
968
+ if (!host) return false;
969
+ try {
970
+ const hostname = new URL(`http://${host}`).hostname.toLowerCase();
971
+ return (
972
+ hostname === "localhost" ||
973
+ hostname === "127.0.0.1" ||
974
+ hostname === "::1" ||
975
+ hostname === "[::1]" ||
976
+ hostname === "builderio.xyz" ||
977
+ hostname.endsWith(".builderio.xyz") ||
978
+ hostname === "builderio.dev" ||
979
+ hostname.endsWith(".builderio.dev") ||
980
+ hostname === "builder.codes" ||
981
+ hostname.endsWith(".builder.codes") ||
982
+ hostname === "builder.io" ||
983
+ hostname.endsWith(".builder.io") ||
984
+ hostname === "builder.my" ||
985
+ hostname.endsWith(".builder.my")
986
+ );
987
+ } catch {
988
+ return false;
989
+ }
990
+ }
991
+
992
+ function isLoopbackBuilderRequestHost(host: string | undefined): boolean {
993
+ if (!host) return false;
994
+ try {
995
+ const hostname = new URL(`http://${host}`).hostname.toLowerCase();
996
+ return (
997
+ hostname === "localhost" ||
998
+ hostname === "127.0.0.1" ||
999
+ hostname === "::1" ||
1000
+ hostname === "[::1]"
1001
+ );
1002
+ } catch {
1003
+ return false;
1004
+ }
1005
+ }
1006
+
1007
+ function firstPublicBuilderPreviewOriginFromEnv(): string | null {
1008
+ for (const key of [
1009
+ "FUSION_ENV_ORIGIN",
1010
+ "VITE_FUSION_ENV_ORIGIN",
1011
+ "BUILDER_PREVIEW_URL",
1012
+ "VITE_BUILDER_PREVIEW_URL",
1013
+ ]) {
1014
+ const raw = process.env[key];
1015
+ if (!raw) continue;
1016
+ try {
1017
+ const url = new URL(raw);
1018
+ if (url.protocol !== "http:" && url.protocol !== "https:") continue;
1019
+ if (isLoopbackBuilderRequestHost(url.host)) continue;
1020
+ if (!isTrustedBuilderRequestHost(url.host)) continue;
1021
+ return url.origin;
1022
+ } catch {
1023
+ // Ignore malformed environment values.
1024
+ }
1025
+ }
1026
+ return null;
1027
+ }
1028
+
1029
+ /**
1030
+ * User-visible Builder connect origin. In Builder/Fusion previews, keep the
1031
+ * connect URL on the actual app preview origin so clicking Connect happens in
1032
+ * the same deployment that minted the signed connect token.
1033
+ */
1034
+ export function getBuilderBrowserOriginForEvent(event: H3Event): string {
1035
+ const headerHost = firstHeaderValue(
1036
+ readEventHeader(event, "x-forwarded-host") ||
1037
+ readEventHeader(event, "host"),
1038
+ );
1039
+ if (!isTrustedBuilderRequestHost(headerHost)) return getOrigin(event);
1040
+ if (isLoopbackBuilderRequestHost(headerHost)) {
1041
+ const publicPreviewOrigin = firstPublicBuilderPreviewOriginFromEnv();
1042
+ if (publicPreviewOrigin) return publicPreviewOrigin;
1043
+ }
1044
+
1045
+ const rawProto = firstHeaderValue(
1046
+ readEventHeader(event, "x-forwarded-proto"),
1047
+ );
1048
+ const proto =
1049
+ rawProto === "http" || rawProto === "https"
1050
+ ? rawProto
1051
+ : process.env.NODE_ENV === "production"
1052
+ ? "https"
1053
+ : "http";
1054
+ return `${proto}://${headerHost}`;
1055
+ }
1056
+
1057
+ /**
1058
+ * Builder's /cli-auth page currently only accepts localhost, *.builder.io,
1059
+ * *.agent-native.com, or builder: redirect_url destinations. Preview hosts
1060
+ * such as *.builderio.xyz and *.builder.codes are valid app origins for us,
1061
+ * but Builder rejects them and falls back to http://localhost:10110/auth.
1062
+ * Use a configured public gateway for the callback in those cases while
1063
+ * leaving the surfaced connect URL on the user's active preview.
1064
+ */
1065
+ export function getBuilderCliAuthCallbackOriginForEvent(
1066
+ event: H3Event,
1067
+ ): string {
1068
+ const previewOrigin = getBuilderBrowserOriginForEvent(event);
1069
+ if (isBuilderCliAuthAllowedOrigin(previewOrigin)) return previewOrigin;
1070
+ const envOrigin = firstBuilderCliAuthCallbackOriginFromEnv();
1071
+ if (envOrigin) return envOrigin;
1072
+ // The app is being reached via a tunnel (e.g. ngrok) whose origin Builder's
1073
+ // /cli-auth does not trust, and no public gateway is configured. Handing
1074
+ // Builder the rejected tunnel origin makes it fall back to its own *dead*
1075
+ // http://localhost:10110/auth default (ERR_CONNECTION_REFUSED). In local dev
1076
+ // the app is also reachable at http://localhost:<PORT> — an origin Builder
1077
+ // accepts and a same-machine browser can reach — so use that for the callback
1078
+ // instead of a broken redirect. (Production origins are *.agent-native.com,
1079
+ // which pass the allow-list above and never reach here.)
1080
+ return localBuilderCliAuthCallbackOrigin() ?? previewOrigin;
1081
+ }
1082
+
1083
+ /** App's own localhost origin for the Builder connect callback, in local dev. */
1084
+ function localBuilderCliAuthCallbackOrigin(): string | null {
1085
+ if (process.env.NODE_ENV === "production") return null;
1086
+ const port = process.env.PORT?.trim();
1087
+ if (!port || !/^\d{1,5}$/.test(port)) return null;
1088
+ return `http://localhost:${port}`;
1089
+ }
1090
+
1091
+ export function getBuilderBrowserStatus(origin: string): BuilderBrowserStatus {
1092
+ const branchProjectId = getConfiguredBuilderBranchProjectId();
1093
+ const envManaged = !!process.env.BUILDER_PRIVATE_KEY;
1094
+ return {
1095
+ configured: !!(
1096
+ process.env.BUILDER_PRIVATE_KEY && process.env.BUILDER_PUBLIC_KEY
1097
+ ),
1098
+ builderEnabled: isBuilderBranchingEnabled(),
1099
+ branchProjectIdConfigured: !!branchProjectId,
1100
+ branchProjectId: branchProjectId || undefined,
1101
+ envManaged,
1102
+ credentialSource: envManaged ? "env" : undefined,
1103
+ appHost: getBuilderAppHost(),
1104
+ apiHost: getBuilderApiHost(),
1105
+ connectUrl: getBuilderBrowserConnectUrl(origin),
1106
+ publicKeyConfigured: !!process.env.BUILDER_PUBLIC_KEY,
1107
+ privateKeyConfigured: !!process.env.BUILDER_PRIVATE_KEY,
1108
+ userId: process.env.BUILDER_USER_ID || undefined,
1109
+ orgName: process.env.BUILDER_ORG_NAME || undefined,
1110
+ orgKind: process.env.BUILDER_ORG_KIND || undefined,
1111
+ subscription: process.env.BUILDER_SUBSCRIPTION || undefined,
1112
+ subscriptionLevel: process.env.BUILDER_SUBSCRIPTION_LEVEL || undefined,
1113
+ subscriptionName: process.env.BUILDER_SUBSCRIPTION_NAME || undefined,
1114
+ isEnterprise: parseOptionalEnvBoolean(process.env.BUILDER_IS_ENTERPRISE),
1115
+ isFreeAccount: parseOptionalEnvBoolean(process.env.BUILDER_IS_FREE_ACCOUNT),
1116
+ };
1117
+ }
1118
+
1119
+ function parseOptionalEnvBoolean(
1120
+ value: string | undefined,
1121
+ ): boolean | undefined {
1122
+ if (!value) return undefined;
1123
+ return /^(1|true)$/i.test(value);
1124
+ }
1125
+
1126
+ export function getBuilderBrowserStatusForEvent(
1127
+ event: H3Event,
1128
+ ): BuilderBrowserStatus {
1129
+ return getBuilderBrowserStatus(getBuilderBrowserOriginForEvent(event));
1130
+ }
1131
+
1132
+ /**
1133
+ * Env vars written by the Builder CLI-auth callback. Single source of truth
1134
+ * for the connect/disconnect key set — `getBuilderCallbackEnvVars` and the
1135
+ * disconnect handler's scrub loop both derive from this list, so drift
1136
+ * (e.g. disconnect silently leaving `BUILDER_USER_ID` behind because
1137
+ * someone added a key to one site but not the other) is impossible.
1138
+ */
1139
+ export const BUILDER_ENV_KEYS = [
1140
+ "BUILDER_PRIVATE_KEY",
1141
+ "BUILDER_PUBLIC_KEY",
1142
+ "BUILDER_USER_ID",
1143
+ "BUILDER_ORG_NAME",
1144
+ "BUILDER_ORG_KIND",
1145
+ "BUILDER_SUBSCRIPTION",
1146
+ "BUILDER_SUBSCRIPTION_LEVEL",
1147
+ "BUILDER_SUBSCRIPTION_NAME",
1148
+ "BUILDER_IS_ENTERPRISE",
1149
+ "BUILDER_IS_FREE_ACCOUNT",
1150
+ ] as const;
1151
+
1152
+ export type BuilderEnvKey = (typeof BUILDER_ENV_KEYS)[number];
1153
+
1154
+ export function getBuilderCallbackEnvVars(params: {
1155
+ privateKey?: string | null;
1156
+ publicKey?: string | null;
1157
+ userId?: string | null;
1158
+ orgName?: string | null;
1159
+ orgKind?: string | null;
1160
+ subscription?: string | null;
1161
+ subscriptionLevel?: string | null;
1162
+ subscriptionName?: string | null;
1163
+ isEnterprise?: boolean | null;
1164
+ isFreeAccount?: boolean | null;
1165
+ }) {
1166
+ const values: Record<BuilderEnvKey, string> = {
1167
+ BUILDER_PRIVATE_KEY: params.privateKey?.trim() || "",
1168
+ BUILDER_PUBLIC_KEY: params.publicKey?.trim() || "",
1169
+ BUILDER_USER_ID: params.userId?.trim() || "",
1170
+ BUILDER_ORG_NAME: params.orgName?.trim() || "",
1171
+ BUILDER_ORG_KIND: params.orgKind?.trim() || "",
1172
+ BUILDER_SUBSCRIPTION: params.subscription?.trim() || "",
1173
+ BUILDER_SUBSCRIPTION_LEVEL: params.subscriptionLevel?.trim() || "",
1174
+ BUILDER_SUBSCRIPTION_NAME: params.subscriptionName?.trim() || "",
1175
+ BUILDER_IS_ENTERPRISE:
1176
+ typeof params.isEnterprise === "boolean"
1177
+ ? String(params.isEnterprise)
1178
+ : "",
1179
+ BUILDER_IS_FREE_ACCOUNT:
1180
+ typeof params.isFreeAccount === "boolean"
1181
+ ? String(params.isFreeAccount)
1182
+ : "",
1183
+ };
1184
+ return BUILDER_ENV_KEYS.map((key) => ({ key, value: values[key] }));
1185
+ }
1186
+
1187
+ export function resolveSafePreviewUrl(
1188
+ previewUrl: string | null | undefined,
1189
+ event: H3Event,
1190
+ ): string {
1191
+ if (previewUrl && isAllowedBrowserReturnUrl(previewUrl)) {
1192
+ return previewUrl;
1193
+ }
1194
+ return getBuilderBrowserOriginForEvent(event);
1195
+ }
1196
+
1197
+ export function resolveBuilderCallbackReturnUrl(options: {
1198
+ event: H3Event;
1199
+ openerOrigin?: string | null;
1200
+ previewUrl?: string | null;
1201
+ }): string {
1202
+ const openerOrigin =
1203
+ options.openerOrigin && isAllowedBrowserReturnUrl(options.openerOrigin)
1204
+ ? options.openerOrigin
1205
+ : null;
1206
+ if (openerOrigin) {
1207
+ return new URL(getAppBasePath() || "/", openerOrigin).toString();
1208
+ }
1209
+ return resolveSafePreviewUrl(options.previewUrl, options.event);
1210
+ }
1211
+
1212
+ /**
1213
+ * Inline theme-detection script that runs before the body paints. Reads the
1214
+ * app's stored theme preference (same `localStorage.theme` key used by the
1215
+ * client-side theme manager) and falls back to `prefers-color-scheme`. This
1216
+ * way the popup matches whatever theme the user already picked in the app
1217
+ * — light, dark, or auto — instead of always rendering in OS-default mode.
1218
+ */
1219
+ const BUILDER_CALLBACK_THEME_SCRIPT = `<script>
1220
+ (function () {
1221
+ try {
1222
+ var stored = window.localStorage && window.localStorage.getItem("theme");
1223
+ var resolved;
1224
+ if (stored === "light" || stored === "dark") {
1225
+ resolved = stored;
1226
+ } else {
1227
+ var mq = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)");
1228
+ resolved = mq && mq.matches ? "dark" : "light";
1229
+ }
1230
+ document.documentElement.classList.add(resolved);
1231
+ document.documentElement.style.colorScheme = resolved;
1232
+ } catch (e) {}
1233
+ })();
1234
+ </script>`;
1235
+
1236
+ /**
1237
+ * Brand-aligned CSS for the Builder connect callback / error pages.
1238
+ *
1239
+ * Uses the same neutral-zinc palette and Inter font as the rest of the
1240
+ * framework's templates (see `templates/*\/app/global.css`). Tokens map to
1241
+ * the same HSL values the templates set on `:root` / `.dark`, so the popup
1242
+ * reads as part of the same app — not a stranded marketing page.
1243
+ */
1244
+ const BUILDER_CALLBACK_BASE_CSS = `
1245
+ :root {
1246
+ --bg: hsl(0 0% 100%);
1247
+ --fg: hsl(220 10% 10%);
1248
+ --muted-fg: hsl(220 5% 45%);
1249
+ --card: hsl(0 0% 100%);
1250
+ --border: hsl(220 10% 90%);
1251
+ --primary: hsl(220 10% 15%);
1252
+ --primary-fg: hsl(0 0% 100%);
1253
+ --primary-hover: hsl(220 10% 25%);
1254
+ --success-bg: hsl(143 50% 96%);
1255
+ --success-fg: hsl(143 60% 32%);
1256
+ --error-fg: hsl(0 75% 45%);
1257
+ --error-bg: hsl(0 80% 97%);
1258
+ --error-border: hsl(0 80% 92%);
1259
+ }
1260
+ :root.dark {
1261
+ --bg: hsl(220 6% 6%);
1262
+ --fg: hsl(0 0% 92%);
1263
+ --muted-fg: hsl(220 4% 60%);
1264
+ --card: hsl(220 5% 8%);
1265
+ --border: hsl(220 4% 14%);
1266
+ --primary: hsl(0 0% 92%);
1267
+ --primary-fg: hsl(220 6% 6%);
1268
+ --primary-hover: hsl(0 0% 75%);
1269
+ --success-bg: hsl(143 30% 12%);
1270
+ --success-fg: hsl(143 50% 70%);
1271
+ --error-fg: hsl(0 80% 75%);
1272
+ --error-bg: hsl(0 35% 12%);
1273
+ --error-border: hsl(0 30% 20%);
1274
+ }
1275
+ *, *::before, *::after { box-sizing: border-box; }
1276
+ html, body { height: 100%; }
1277
+ body {
1278
+ margin: 0;
1279
+ min-height: 100vh;
1280
+ display: grid;
1281
+ place-items: center;
1282
+ background: var(--bg);
1283
+ color: var(--fg);
1284
+ font-family: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
1285
+ font-size: 14px;
1286
+ line-height: 1.55;
1287
+ font-feature-settings: "cv02", "cv03", "cv04", "cv11";
1288
+ -webkit-font-smoothing: antialiased;
1289
+ -moz-osx-font-smoothing: grayscale;
1290
+ padding: 24px;
1291
+ }
1292
+ .card {
1293
+ width: min(420px, 100%);
1294
+ border: 1px solid var(--border);
1295
+ border-radius: 12px;
1296
+ padding: 32px 28px;
1297
+ background: var(--card);
1298
+ text-align: center;
1299
+ }
1300
+ .icon {
1301
+ display: inline-flex;
1302
+ align-items: center;
1303
+ justify-content: center;
1304
+ width: 44px;
1305
+ height: 44px;
1306
+ border-radius: 999px;
1307
+ margin-bottom: 16px;
1308
+ }
1309
+ .icon svg { width: 22px; height: 22px; display: block; }
1310
+ .icon-success { background: var(--success-bg); color: var(--success-fg); }
1311
+ .icon-error { background: var(--error-bg); color: var(--error-fg); }
1312
+ h1 {
1313
+ margin: 0 0 6px;
1314
+ font-size: 17px;
1315
+ font-weight: 600;
1316
+ letter-spacing: -0.01em;
1317
+ color: var(--fg);
1318
+ }
1319
+ p {
1320
+ margin: 0 0 4px;
1321
+ color: var(--fg);
1322
+ font-size: 14px;
1323
+ }
1324
+ p.muted { color: var(--muted-fg); }
1325
+ .btn {
1326
+ display: inline-flex;
1327
+ align-items: center;
1328
+ justify-content: center;
1329
+ height: 36px;
1330
+ padding: 0 16px;
1331
+ margin-top: 20px;
1332
+ background: var(--primary);
1333
+ color: var(--primary-fg);
1334
+ border-radius: 8px;
1335
+ font-size: 13px;
1336
+ font-weight: 500;
1337
+ text-decoration: none;
1338
+ border: none;
1339
+ cursor: pointer;
1340
+ }
1341
+ .btn:hover { background: var(--primary-hover); }
1342
+ pre.error-detail {
1343
+ margin: 16px 0 0;
1344
+ padding: 10px 12px;
1345
+ background: var(--error-bg);
1346
+ border: 1px solid var(--error-border);
1347
+ border-radius: 8px;
1348
+ color: var(--error-fg);
1349
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1350
+ font-size: 12px;
1351
+ line-height: 1.5;
1352
+ text-align: left;
1353
+ white-space: pre-wrap;
1354
+ word-break: break-word;
1355
+ }
1356
+ `;
1357
+
1358
+ function safeOriginFromUrl(value: string | null | undefined): string | null {
1359
+ if (!value) return null;
1360
+ try {
1361
+ return new URL(value).origin;
1362
+ } catch {
1363
+ return null;
1364
+ }
1365
+ }
1366
+
1367
+ export function createBuilderBrowserCallbackPage(
1368
+ previewUrl: string,
1369
+ opts: { parentOrigin?: string } = {},
1370
+ ): string {
1371
+ const escapedUrl = JSON.stringify(previewUrl);
1372
+ const parentOrigin =
1373
+ safeOriginFromUrl(opts.parentOrigin) ?? safeOriginFromUrl(previewUrl);
1374
+ // postMessage requires a specific target origin for cross-origin opener
1375
+ // delivery; only fall back to "*" when we have no usable origin (the
1376
+ // BroadcastChannel path on the success page still works for same-origin
1377
+ // openers in that case).
1378
+ const escapedTargetOrigin = JSON.stringify(parentOrigin ?? "*");
1379
+ return `<!doctype html>
1380
+ <html lang="en">
1381
+ <head>
1382
+ <meta charset="utf-8" />
1383
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
1384
+ <title>Builder connected</title>
1385
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
1386
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
1387
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet" />
1388
+ ${BUILDER_CALLBACK_THEME_SCRIPT}
1389
+ <style>${BUILDER_CALLBACK_BASE_CSS}</style>
1390
+ </head>
1391
+ <body>
1392
+ <main class="card" role="status" aria-live="polite">
1393
+ <span class="icon icon-success" aria-hidden="true">
1394
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>
1395
+ </span>
1396
+ <h1>Builder connected</h1>
1397
+ <p>Browser access is now available to your app.</p>
1398
+ <p class="muted">You can close this tab and return to the workspace.</p>
1399
+ <a class="btn" href=${escapedUrl}>Open the workspace</a>
1400
+ </main>
1401
+ <script>
1402
+ // Tell the opener tab the connect succeeded. The parent has two ways
1403
+ // to learn this:
1404
+ // 1. The popup-based connect flow (window.open + 2s polling on
1405
+ // /builder/status) — picks it up via the next poll within ~2s.
1406
+ // 2. The link-based "Use Builder" flow (target="_blank" tab) — the
1407
+ // AgentPanel only fetches /builder/status once on mount, so it
1408
+ // stays stuck on "Use Builder" unless we explicitly signal.
1409
+ // BroadcastChannel + postMessage cover both cases. Use the same channel
1410
+ // name as the error path (createBuilderBrowserCallbackErrorPage) and
1411
+ // mirror the parent-side listener in useBuilderStatus / useBuilderConnectUrl.
1412
+ try {
1413
+ var bc = new BroadcastChannel("builder-connect:" + window.location.host);
1414
+ bc.postMessage({ type: "builder-connect-success" });
1415
+ bc.close();
1416
+ } catch (e) {}
1417
+ try {
1418
+ if (window.opener && !window.opener.closed) {
1419
+ window.opener.postMessage(
1420
+ { type: "builder-connect-success" },
1421
+ ${escapedTargetOrigin},
1422
+ );
1423
+ }
1424
+ } catch (e) {}
1425
+ // If we're a popup opened by the app, close ourselves and let the
1426
+ // parent tab keep polling for connection status. If close() is
1427
+ // blocked (e.g. we're the top-level tab because popups were
1428
+ // downgraded), fall back to navigating back to the workspace.
1429
+ window.setTimeout(function () {
1430
+ try { window.close(); } catch (e) {}
1431
+ window.setTimeout(function () {
1432
+ if (!window.closed) {
1433
+ window.location.replace(${escapedUrl});
1434
+ }
1435
+ }, 200);
1436
+ }, 700);
1437
+ </script>
1438
+ </body>
1439
+ </html>`;
1440
+ }
1441
+
1442
+ /**
1443
+ * HTML page rendered inside the OAuth popup when the callback handler caught
1444
+ * an error persisting the per-user Builder credentials. Without this, the
1445
+ * popup would show the success page even though the write failed — leaving
1446
+ * the parent window stuck on "Waiting for Builder…" until the 5-minute poll
1447
+ * timeout fires (Midhun reported this on 2026-04-28).
1448
+ *
1449
+ * The page does two things:
1450
+ * 1. Shows the user a clear "couldn't save credentials" message with the
1451
+ * underlying error so they can retry or report.
1452
+ * 2. `postMessage`s the parent (same-origin opener) so the connect-flow
1453
+ * polling stops immediately rather than waiting for the next /status
1454
+ * poll to surface the SQL `builder-connect-error:<email>` row.
1455
+ */
1456
+ export function createBuilderBrowserCallbackErrorPage(
1457
+ message: string,
1458
+ opts: {
1459
+ title?: string;
1460
+ body?: string;
1461
+ closeHint?: string;
1462
+ parentOrigin?: string;
1463
+ } = {},
1464
+ ): string {
1465
+ const escapedMessage = JSON.stringify(message);
1466
+ const parentOrigin = safeOriginFromUrl(opts.parentOrigin);
1467
+ const escapedTargetOrigin = JSON.stringify(parentOrigin ?? "*");
1468
+ const title = opts.title ?? "Couldn't save Builder connection";
1469
+ const body =
1470
+ opts.body ??
1471
+ "Builder authorized your account but the server couldn't persist the credentials.";
1472
+ const closeHint =
1473
+ opts.closeHint ?? "You can close this tab and try again from settings.";
1474
+ return `<!doctype html>
1475
+ <html lang="en">
1476
+ <head>
1477
+ <meta charset="utf-8" />
1478
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
1479
+ <title>Builder connect failed</title>
1480
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
1481
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
1482
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap" rel="stylesheet" />
1483
+ ${BUILDER_CALLBACK_THEME_SCRIPT}
1484
+ <style>${BUILDER_CALLBACK_BASE_CSS}</style>
1485
+ </head>
1486
+ <body>
1487
+ <main class="card" role="alert" aria-live="assertive">
1488
+ <span class="icon icon-error" aria-hidden="true">
1489
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z"></path><line x1="12" y1="9" x2="12" y2="13"></line><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>
1490
+ </span>
1491
+ <h1>${escapeHtml(title)}</h1>
1492
+ <p class="muted">${escapeHtml(body)}</p>
1493
+ <pre class="error-detail" id="msg"></pre>
1494
+ <p class="muted" style="margin-top:12px">${escapeHtml(closeHint)}</p>
1495
+ </main>
1496
+ <script>
1497
+ try {
1498
+ var msg = ${escapedMessage};
1499
+ document.getElementById("msg").textContent = msg;
1500
+ // Notify the parent tab immediately so its polling loop stops
1501
+ // without waiting for the next /builder/status tick.
1502
+ //
1503
+ // BroadcastChannel works across same-origin windows regardless of
1504
+ // opener access — it is the only reliable channel here because
1505
+ // popups opened with window.open(..., "noopener") or links with
1506
+ // rel="noopener" have window.opener === null. The legacy
1507
+ // window.opener.postMessage path is kept as a belt-and-suspenders
1508
+ // fallback for non-BroadcastChannel environments.
1509
+ try {
1510
+ var bc = new BroadcastChannel("builder-connect:" + window.location.host);
1511
+ bc.postMessage({ type: "builder-connect-error", message: msg });
1512
+ bc.close();
1513
+ } catch (e) {}
1514
+ if (window.opener && !window.opener.closed) {
1515
+ try {
1516
+ window.opener.postMessage(
1517
+ { type: "builder-connect-error", message: msg },
1518
+ ${escapedTargetOrigin},
1519
+ );
1520
+ } catch (e) {}
1521
+ }
1522
+ } catch (e) {}
1523
+ </script>
1524
+ </body>
1525
+ </html>`;
1526
+ }
1527
+
1528
+ export interface RunBuilderAgentArgs {
1529
+ prompt: string;
1530
+ projectId?: string;
1531
+ branchName?: string;
1532
+ userEmail?: string;
1533
+ userId?: string;
1534
+ }
1535
+
1536
+ export interface RunBuilderAgentResult {
1537
+ branchName: string;
1538
+ projectId: string;
1539
+ url: string;
1540
+ status: string;
1541
+ }
1542
+
1543
+ function normalizeBuilderApiString(value: unknown, fieldName: string): string {
1544
+ if (typeof value !== "string" || !value.trim()) {
1545
+ throw new Error(`Builder agent run returned a blank ${fieldName}`);
1546
+ }
1547
+ const trimmed = value.trim();
1548
+ if (/[\u0000-\u001f\u007f]/.test(trimmed)) {
1549
+ throw new Error(`Builder agent run returned a malformed ${fieldName}`);
1550
+ }
1551
+ return trimmed;
1552
+ }
1553
+
1554
+ function normalizeBuilderBranchUrl(value: unknown): string {
1555
+ const urlString = normalizeBuilderApiString(value, "url");
1556
+ let parsed: URL;
1557
+ try {
1558
+ parsed = new URL(urlString);
1559
+ } catch {
1560
+ throw new Error("Builder agent run returned a malformed url");
1561
+ }
1562
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
1563
+ throw new Error("Builder agent run returned a malformed url");
1564
+ }
1565
+ if (
1566
+ parsed.hostname !== "builder.io" &&
1567
+ !parsed.hostname.endsWith(".builder.io")
1568
+ ) {
1569
+ throw new Error("Builder agent run returned a non-Builder url");
1570
+ }
1571
+ return parsed.toString();
1572
+ }
1573
+
1574
+ /**
1575
+ * POST a prompt to the Builder agents-run API. The Builder agent runs in a
1576
+ * cloud sandbox and writes code to a branch; the returned URL opens that
1577
+ * branch in the Visual Editor so the user can watch progress.
1578
+ *
1579
+ * Spec: https://www.builder.io/c/docs/agents-run-api
1580
+ */
1581
+ export async function runBuilderAgent(
1582
+ args: RunBuilderAgentArgs,
1583
+ ): Promise<RunBuilderAgentResult> {
1584
+ const { resolveBuilderCredentials } =
1585
+ await import("./credential-provider.js");
1586
+ const creds = await resolveBuilderCredentials();
1587
+ if (!creds.privateKey || !creds.publicKey) {
1588
+ throw new Error("Builder keys are not configured");
1589
+ }
1590
+ if (!args.prompt || !args.prompt.trim()) {
1591
+ throw new Error("prompt is required");
1592
+ }
1593
+ const projectId = args.projectId?.trim();
1594
+ if (!projectId) {
1595
+ throw new Error(
1596
+ "Builder project ID is not configured. Set DISPATCH_BUILDER_PROJECT_ID, BUILDER_BRANCH_PROJECT_ID, or BUILDER_PROJECT_ID.",
1597
+ );
1598
+ }
1599
+ const builderUserId = args.userId || creds.userId || undefined;
1600
+ const builderUserEmail = builderUserId ? undefined : args.userEmail;
1601
+ if (!builderUserEmail && !builderUserId) {
1602
+ throw new Error("userEmail or userId is required");
1603
+ }
1604
+
1605
+ const url = new URL("/agents/run", getBuilderApiHost());
1606
+ url.searchParams.set("apiKey", creds.publicKey);
1607
+
1608
+ const body: Record<string, unknown> = {
1609
+ userMessage: { userPrompt: args.prompt },
1610
+ projectId,
1611
+ };
1612
+ if (args.branchName) body.branchName = args.branchName;
1613
+ if (builderUserEmail) body.userEmail = builderUserEmail;
1614
+ if (builderUserId) body.userId = builderUserId;
1615
+
1616
+ const response = await fetch(url, {
1617
+ method: "POST",
1618
+ headers: {
1619
+ Authorization: `Bearer ${creds.privateKey}`,
1620
+ "Content-Type": "application/json",
1621
+ },
1622
+ body: JSON.stringify(body),
1623
+ });
1624
+
1625
+ const parsed = (await response.json().catch(() => ({}))) as Record<
1626
+ string,
1627
+ unknown
1628
+ >;
1629
+ if (!response.ok) {
1630
+ const msg =
1631
+ typeof parsed.error === "string"
1632
+ ? parsed.error
1633
+ : `Builder agent run failed (${response.status})`;
1634
+ throw new Error(msg);
1635
+ }
1636
+
1637
+ return {
1638
+ branchName: normalizeBuilderApiString(parsed.branchName, "branchName"),
1639
+ projectId:
1640
+ typeof parsed.projectId === "string" && parsed.projectId.trim()
1641
+ ? parsed.projectId.trim()
1642
+ : projectId,
1643
+ url: normalizeBuilderBranchUrl(parsed.url),
1644
+ status:
1645
+ typeof parsed.status === "string" && parsed.status.trim()
1646
+ ? parsed.status.trim()
1647
+ : "processing",
1648
+ };
1649
+ }
1650
+
1651
+ export async function requestBuilderBrowserConnection(
1652
+ args: BrowserConnectionArgs,
1653
+ ): Promise<Record<string, unknown>> {
1654
+ const { resolveBuilderCredentials } =
1655
+ await import("./credential-provider.js");
1656
+ const creds = await resolveBuilderCredentials();
1657
+ if (!creds.privateKey || !creds.publicKey) {
1658
+ throw new Error("Builder browser access is not configured");
1659
+ }
1660
+
1661
+ const sessionId = args.sessionId?.trim();
1662
+ if (!sessionId) {
1663
+ throw new Error("sessionId is required");
1664
+ }
1665
+
1666
+ const url = new URL("/codegen/get-browser-connection", getBuilderApiHost());
1667
+ url.searchParams.set("apiKey", creds.publicKey);
1668
+ if (creds.userId) {
1669
+ url.searchParams.set("userId", creds.userId);
1670
+ }
1671
+
1672
+ const response = await fetch(url, {
1673
+ method: "POST",
1674
+ headers: {
1675
+ Authorization: `Bearer ${creds.privateKey}`,
1676
+ "Content-Type": "application/json",
1677
+ },
1678
+ body: JSON.stringify({
1679
+ sessionId,
1680
+ projectId: args.projectId || undefined,
1681
+ branchName: args.branchName || undefined,
1682
+ proxyOrigin: args.proxyOrigin || undefined,
1683
+ proxyDefaultOrigin: args.proxyDefaultOrigin || undefined,
1684
+ proxyDst: args.proxyDestination || undefined,
1685
+ }),
1686
+ });
1687
+
1688
+ const body = (await response.json().catch(() => ({}))) as Record<
1689
+ string,
1690
+ unknown
1691
+ >;
1692
+ if (!response.ok) {
1693
+ const error =
1694
+ typeof body.error === "string"
1695
+ ? body.error
1696
+ : `Builder browser request failed (${response.status})`;
1697
+ throw new Error(error);
1698
+ }
1699
+
1700
+ return body;
1701
+ }