@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,1627 @@
1
+ /**
2
+ * Central database client abstraction.
3
+ *
4
+ * Detects the database backend from the environment (D1, Postgres, or SQLite/libsql)
5
+ * and returns a unified `DbExec` interface that all core stores use.
6
+ *
7
+ * Imports for postgres, better-sqlite3, and @libsql/client/web are lazy
8
+ * (dynamic import) so this module can be loaded in any runtime (Node.js,
9
+ * Cloudflare Workers, edge) without failing on missing native deps.
10
+ */
11
+ import path from "path";
12
+
13
+ import {
14
+ beginDatabaseOperation,
15
+ recordDatabaseRetry,
16
+ } from "./request-telemetry.js";
17
+
18
+ const recyclingPostgresPools = new WeakSet<object>();
19
+ const loggedNeonPools = new WeakSet<object>();
20
+
21
+ // ---------------------------------------------------------------------------
22
+ // Types
23
+ // ---------------------------------------------------------------------------
24
+
25
+ export type Dialect = "sqlite" | "postgres" | "d1";
26
+
27
+ export interface DbExec {
28
+ execute(
29
+ sql: string | { sql: string; args?: unknown[] },
30
+ ): Promise<{ rows: any[]; rowsAffected: number }>;
31
+ transaction?<T>(fn: (tx: DbExec) => Promise<T>): Promise<T>;
32
+ /**
33
+ * Release the underlying connection/pool held by this exec.
34
+ * Only non-singleton execs created via `createDbExec()` (e.g. the migration
35
+ * direct-endpoint exec) should call this. The global singleton exec (`getDbExec`)
36
+ * is managed by `closeDbExec()` instead.
37
+ */
38
+ close?(): Promise<void>;
39
+ }
40
+
41
+ export interface DbExecConfig {
42
+ url?: string;
43
+ authToken?: string;
44
+ d1Binding?: any;
45
+ }
46
+
47
+ /** Read the request-scoped Cloudflare binding without requiring every
48
+ * consuming app's TypeScript program to include core's ambient Worker globals. */
49
+ export function getCloudflareD1Binding(): unknown {
50
+ return (
51
+ globalThis as typeof globalThis & {
52
+ __cf_env?: { DB?: unknown };
53
+ }
54
+ ).__cf_env?.DB;
55
+ }
56
+
57
+ // ---------------------------------------------------------------------------
58
+ // Per-app DATABASE_URL resolution
59
+ // ---------------------------------------------------------------------------
60
+
61
+ /**
62
+ * Resolve the database URL for the current app.
63
+ *
64
+ * Checks for `<APP_NAME>_DATABASE_URL` first (e.g. `MAIL_DATABASE_URL`),
65
+ * then falls back to `DATABASE_URL`, then Netlify's managed database env. This
66
+ * allows multiple apps to run in the same process group (e.g. eager repo dev or
67
+ * builder.io) with separate databases while still using the persistent Netlify
68
+ * runtime database when `DATABASE_URL` was only exported for the build command.
69
+ *
70
+ * Set `APP_NAME=mail` in the child process env and
71
+ * `MAIL_DATABASE_URL=postgres://...` in the shared env.
72
+ */
73
+ export function getDatabaseUrl(fallback = ""): string {
74
+ const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, "_");
75
+ if (appName) {
76
+ const prefixed = process.env[`${appName}_DATABASE_URL`];
77
+ if (prefixed) return prefixed;
78
+ }
79
+ return (
80
+ process.env.DATABASE_URL || process.env.NETLIFY_DATABASE_URL || fallback
81
+ );
82
+ }
83
+
84
+ /** Same per-app resolution for DATABASE_AUTH_TOKEN (used by Turso/libsql). */
85
+ export function getDatabaseAuthToken(): string | undefined {
86
+ const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, "_");
87
+ if (appName) {
88
+ const prefixed = process.env[`${appName}_DATABASE_AUTH_TOKEN`];
89
+ if (prefixed) return prefixed;
90
+ }
91
+ return (
92
+ process.env.DATABASE_AUTH_TOKEN || process.env.NETLIFY_DATABASE_AUTH_TOKEN
93
+ );
94
+ }
95
+
96
+ function getAppEnvPrefix(): string | undefined {
97
+ return process.env.APP_NAME?.toUpperCase().replace(/-/g, "_") || undefined;
98
+ }
99
+
100
+ /**
101
+ * Database URL to use for migrations — identical to DATABASE_URL but with the
102
+ * Neon connection-pooler suffix stripped. Neon's PgBouncer runs in transaction
103
+ * mode, which resets session-level ownership after each statement and causes
104
+ * `ALTER TABLE … ADD COLUMN` to fail with "must be owner of table <x>" even
105
+ * when the connecting role owns it. The direct endpoint bypasses PgBouncer so
106
+ * DDL honours the role's actual ownership.
107
+ *
108
+ * Non-Neon URLs and already-direct Neon URLs are returned unchanged.
109
+ */
110
+ export function getMigrationDatabaseUrl(): string {
111
+ const appName = getAppEnvPrefix();
112
+ const appUnpooled = appName
113
+ ? process.env[`${appName}_DATABASE_URL_UNPOOLED`]
114
+ : undefined;
115
+ const url =
116
+ appUnpooled ||
117
+ process.env.NETLIFY_DATABASE_URL_UNPOOLED ||
118
+ process.env.DATABASE_URL_UNPOOLED ||
119
+ getDatabaseUrl();
120
+ // Neon pooler hostname: ep-<id>-pooler.<region>.<cloud>.neon.tech
121
+ // Direct hostname: ep-<id>.<region>.<cloud>.neon.tech
122
+ // The region between `-pooler.` and `.neon.tech` can contain multiple
123
+ // dot-separated labels (e.g. `c-7.us-east-1.aws`), so the matched segment
124
+ // must allow dots — `[a-z0-9.-]+` — not just a single label. Anchoring on the
125
+ // stable `.neon.tech` suffix keeps this from touching non-Neon hosts.
126
+ return url.replace(/-pooler(\.[a-z0-9.-]+\.neon\.tech)/, "$1");
127
+ }
128
+
129
+ export function isLocalSqliteUrl(url: string): boolean {
130
+ return url === "" || url.startsWith("file:") || !url.includes("://");
131
+ }
132
+
133
+ export function isPgliteUrl(url: string): boolean {
134
+ return url.toLowerCase().startsWith("pglite:");
135
+ }
136
+
137
+ export function pgliteDataDirFromUrl(url: string): string {
138
+ const raw = url.slice("pglite:".length);
139
+ const dataDir = raw.startsWith("//") ? raw.slice(2) : raw;
140
+ if (!dataDir || dataDir === "/") return "./data/pglite";
141
+ if (
142
+ dataDir === "memory" ||
143
+ dataDir === "/memory" ||
144
+ dataDir === ":memory:" ||
145
+ dataDir === "/:memory:" ||
146
+ dataDir === "memory://"
147
+ ) {
148
+ return "memory://";
149
+ }
150
+ return dataDir;
151
+ }
152
+
153
+ export function pgliteRuntimeDataDir(dataDir: string): string {
154
+ if (dataDir === "memory://") return dataDir;
155
+ if (!isServerlessRuntime() || path.isAbsolute(dataDir)) return dataDir;
156
+
157
+ const safeParts = dataDir
158
+ .split(/[\\/]+/)
159
+ .filter((part) => part && part !== "." && part !== "..");
160
+ const safeRelative =
161
+ safeParts.length > 0
162
+ ? path.join(...safeParts)
163
+ : path.join("data", "pglite");
164
+ return path.join("/tmp", safeRelative);
165
+ }
166
+
167
+ async function preparePgliteDataDir(dataDir: string): Promise<string> {
168
+ const runtimeDataDir = pgliteRuntimeDataDir(dataDir);
169
+ if (runtimeDataDir === "memory://") return runtimeDataDir;
170
+
171
+ try {
172
+ const fs = await import("fs");
173
+ fs.mkdirSync(runtimeDataDir, { recursive: true });
174
+ } catch {
175
+ // Edge runtimes may not expose fs. PGlite will surface any real open error.
176
+ }
177
+ return runtimeDataDir;
178
+ }
179
+
180
+ async function importOptionalModule(specifier: string): Promise<any> {
181
+ return import(/* @vite-ignore */ specifier);
182
+ }
183
+
184
+ function isMissingPackageError(err: unknown, packageName: string): boolean {
185
+ const anyErr = err as any;
186
+ const message = String(anyErr?.message ?? anyErr ?? "");
187
+ return (
188
+ (anyErr?.code === "ERR_MODULE_NOT_FOUND" &&
189
+ message.includes(packageName)) ||
190
+ message.includes(`Cannot find package '${packageName}'`) ||
191
+ message.includes(`Cannot find module '${packageName}'`)
192
+ );
193
+ }
194
+
195
+ export async function loadPglitePackage(): Promise<{ PGlite: any }> {
196
+ const packageName = "@electric-sql/pglite";
197
+ try {
198
+ return (await importOptionalModule(packageName)) as { PGlite: any };
199
+ } catch (err) {
200
+ if (isMissingPackageError(err, packageName)) {
201
+ throw new Error(
202
+ "PGlite database support requires the optional @electric-sql/pglite package. " +
203
+ "Install it with `pnpm add @electric-sql/pglite@^0.5.3`, then set " +
204
+ "`DATABASE_URL=pglite:./data/pglite`.",
205
+ );
206
+ }
207
+ throw err;
208
+ }
209
+ }
210
+
211
+ export async function loadPgliteDrizzle(): Promise<{
212
+ PGlite: any;
213
+ drizzle: any;
214
+ }> {
215
+ const drizzlePackage = "drizzle-orm/pglite";
216
+ const { PGlite } = await loadPglitePackage();
217
+ const drizzleMod = await importOptionalModule(drizzlePackage);
218
+ return {
219
+ PGlite,
220
+ drizzle: drizzleMod.drizzle,
221
+ };
222
+ }
223
+
224
+ const _pgliteClients = new Map<string, Promise<any>>();
225
+
226
+ export async function getPgliteClient(url: string): Promise<any> {
227
+ const dataDir = await preparePgliteDataDir(pgliteDataDirFromUrl(url));
228
+ let ready = _pgliteClients.get(dataDir);
229
+ if (!ready) {
230
+ ready = loadPglitePackage().then(({ PGlite }) => PGlite.create(dataDir));
231
+ _pgliteClients.set(dataDir, ready);
232
+ }
233
+ return ready;
234
+ }
235
+
236
+ export async function closePgliteClients(): Promise<void> {
237
+ const clients = await Promise.allSettled(_pgliteClients.values());
238
+ _pgliteClients.clear();
239
+ for (const result of clients) {
240
+ if (result.status === "fulfilled") {
241
+ await result.value.close().catch(() => {});
242
+ }
243
+ }
244
+ }
245
+
246
+ export async function closePgliteClient(url: string): Promise<void> {
247
+ const dataDir = pgliteRuntimeDataDir(pgliteDataDirFromUrl(url));
248
+ const ready = _pgliteClients.get(dataDir);
249
+ _pgliteClients.delete(dataDir);
250
+ if (!ready) return;
251
+
252
+ const result = await Promise.resolve(ready).then(
253
+ (client) => ({ status: "fulfilled" as const, client }),
254
+ () => ({ status: "rejected" as const }),
255
+ );
256
+ if (result.status === "fulfilled") {
257
+ await result.client.close().catch(() => {});
258
+ }
259
+ }
260
+
261
+ export async function prepareLocalSqliteUrl(url: string): Promise<string> {
262
+ if (!url.startsWith("file:")) return url;
263
+
264
+ // On serverless runtimes (Netlify / Vercel / AWS Lambda / CF Pages) the
265
+ // working directory is read-only. Detect this and redirect local SQLite to
266
+ // /tmp which IS writable (ephemeral per invocation, but the server stays
267
+ // alive for the request). Shares the canonical isServerlessRuntime() check.
268
+ const isServerless = isServerlessRuntime();
269
+ try {
270
+ const fs = await import("fs");
271
+ if (isServerless && url === "file:./data/app.db") {
272
+ fs.mkdirSync("/tmp/data", { recursive: true });
273
+ return "file:///tmp/data/app.db";
274
+ }
275
+ fs.mkdirSync(path.join(process.cwd(), "data"), { recursive: true });
276
+ } catch {
277
+ // Edge runtime — no filesystem.
278
+ }
279
+ return url;
280
+ }
281
+
282
+ export function sqliteFilenameFromUrl(url: string): string {
283
+ if (url.startsWith("file://")) {
284
+ return decodeURIComponent(new URL(url).pathname);
285
+ }
286
+ if (url.startsWith("file:")) {
287
+ return url.slice("file:".length) || ":memory:";
288
+ }
289
+ return url || "./data/app.db";
290
+ }
291
+
292
+ // ---------------------------------------------------------------------------
293
+ // Safe JSON column parsing
294
+ // ---------------------------------------------------------------------------
295
+
296
+ /**
297
+ * Parse a JSON-serialized column value defensively. A malformed row — from a
298
+ * hand-edit, dirty migration, or a misbehaving agent that wrote raw SQL —
299
+ * must not break an entire list endpoint. Callers supply a fallback for the
300
+ * malformed path; null/undefined values also fall back.
301
+ */
302
+ export function safeJsonParse<T>(value: unknown, fallback: T): T {
303
+ if (value == null) return fallback;
304
+ try {
305
+ return JSON.parse(String(value)) as T;
306
+ } catch {
307
+ return fallback;
308
+ }
309
+ }
310
+
311
+ // ---------------------------------------------------------------------------
312
+ // SQLite retry helper
313
+ // ---------------------------------------------------------------------------
314
+
315
+ /**
316
+ * Retry an async operation when it fails with SQLITE_BUSY.
317
+ * Used during WAL initialization and migrations where a stale WAL from a
318
+ * previous crash or HMR restart can briefly lock the database.
319
+ */
320
+ export async function retrySqliteBusy<T>(
321
+ fn: () => Promise<T>,
322
+ opts: { maxAttempts?: number; baseDelayMs?: number; rethrow?: boolean } = {},
323
+ ): Promise<T> {
324
+ const { maxAttempts = 5, baseDelayMs = 500, rethrow = false } = opts;
325
+ let last: unknown;
326
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
327
+ try {
328
+ return await fn();
329
+ } catch (e: any) {
330
+ last = e;
331
+ const msg = String(e?.message || e);
332
+ if (msg.includes("SQLITE_BUSY") && attempt < maxAttempts - 1) {
333
+ await new Promise((r) => setTimeout(r, baseDelayMs * (attempt + 1)));
334
+ } else {
335
+ break;
336
+ }
337
+ }
338
+ }
339
+ if (rethrow) throw last;
340
+ return undefined as unknown as T; // caller handles undefined (e.g. PRAGMA setup)
341
+ }
342
+
343
+ /**
344
+ * Retry a DDL statement (CREATE TABLE, CREATE INDEX) once when it fails due
345
+ * to a Postgres pg_catalog race.
346
+ *
347
+ * Postgres's `IF NOT EXISTS` check is NOT atomic with the `pg_type` /
348
+ * `pg_class` catalog insert. When multiple processes boot concurrently and
349
+ * issue the same CREATE, both can pass the existence check and one fails
350
+ * with code 23505 on `pg_type_typname_nsp_index`, 42710 from `TypeCreate`,
351
+ * or similar. The table does end up created by the winner, so rerunning the
352
+ * same `IF NOT EXISTS` statement is a safe no-op.
353
+ */
354
+ export async function retryOnDdlRace<T>(fn: () => Promise<T>): Promise<T> {
355
+ try {
356
+ return await fn();
357
+ } catch (e: any) {
358
+ if (!isPgCatalogRace(e)) throw e;
359
+ return await fn();
360
+ }
361
+ }
362
+
363
+ function isPgCatalogRace(e: any): boolean {
364
+ const msg = String(e?.message ?? "");
365
+ if (e?.code === "42P07") return true;
366
+ if (e?.code === "42710") {
367
+ const routine = String(e?.routine ?? "");
368
+ return routine === "TypeCreate" || /type .* already exists/i.test(msg);
369
+ }
370
+ if (e?.code !== "23505") return false;
371
+ const constraint = String(e?.constraint_name ?? e?.constraint ?? "");
372
+ const detail = String(e?.detail ?? "");
373
+ return (
374
+ constraint.startsWith("pg_type") ||
375
+ constraint.startsWith("pg_class") ||
376
+ detail.includes("pg_type") ||
377
+ detail.includes("pg_class") ||
378
+ /relation .* already exists/i.test(msg)
379
+ );
380
+ }
381
+
382
+ /**
383
+ * True when `e` is a UNIQUE / PRIMARY KEY constraint violation from any
384
+ * supported driver (Postgres 23505, SQLite SQLITE_CONSTRAINT_PRIMARYKEY /
385
+ * _UNIQUE, D1). Used by stores that accept caller-provided ids and want to
386
+ * surface a clean "already exists" error instead of the raw SQL text.
387
+ */
388
+ export function isUniqueViolation(e: any): boolean {
389
+ if (e?.code === "23505") return true;
390
+ const code = String(e?.code ?? "");
391
+ if (
392
+ code === "SQLITE_CONSTRAINT_PRIMARYKEY" ||
393
+ code === "SQLITE_CONSTRAINT_UNIQUE"
394
+ ) {
395
+ return true;
396
+ }
397
+ const msg = String(e?.message ?? "").toLowerCase();
398
+ return (
399
+ msg.includes("unique constraint") ||
400
+ msg.includes("primary key constraint") ||
401
+ msg.includes("duplicate key")
402
+ );
403
+ }
404
+
405
+ // ---------------------------------------------------------------------------
406
+ // Dialect detection
407
+ // ---------------------------------------------------------------------------
408
+
409
+ let _dialect: Dialect | undefined;
410
+
411
+ export function getDialect(): Dialect {
412
+ if (_dialect !== undefined) return _dialect;
413
+
414
+ // DATABASE_URL takes priority over D1 when set.
415
+ const url = getDatabaseUrl();
416
+ if (
417
+ url.startsWith("postgres://") ||
418
+ url.startsWith("postgresql://") ||
419
+ isPgliteUrl(url)
420
+ ) {
421
+ _dialect = "postgres";
422
+ return _dialect;
423
+ }
424
+ if (url && !url.startsWith("file:")) {
425
+ // Remote libsql (e.g. Turso)
426
+ _dialect = "sqlite";
427
+ return _dialect;
428
+ }
429
+
430
+ const d1 = getCloudflareD1Binding();
431
+ if (d1) {
432
+ _dialect = "d1";
433
+ return _dialect;
434
+ }
435
+
436
+ // Don't cache the fallthrough — on CF Workers, env bindings (__cf_env) aren't
437
+ // available at import time. If we cache "sqlite" here, D1 will never be
438
+ // detected once the bindings are set in the fetch handler.
439
+ return "sqlite";
440
+ }
441
+
442
+ export function isPostgres(): boolean {
443
+ return getDialect() === "postgres";
444
+ }
445
+
446
+ function dialectForConfig(config: DbExecConfig): Dialect {
447
+ const url = config.url ?? "";
448
+ if (
449
+ url.startsWith("postgres://") ||
450
+ url.startsWith("postgresql://") ||
451
+ isPgliteUrl(url)
452
+ ) {
453
+ return "postgres";
454
+ }
455
+ if (url && !url.startsWith("file:")) {
456
+ return "sqlite";
457
+ }
458
+ if (config.d1Binding) {
459
+ return "d1";
460
+ }
461
+ return "sqlite";
462
+ }
463
+
464
+ /**
465
+ * Returns true when the database is a local-only SQLite file (or unset, which
466
+ * defaults to a local SQLite file). Returns false for Postgres, remote libsql
467
+ * (Turso), and D1 — any backend that could be shared across developers.
468
+ *
469
+ * Used to gate local@localhost mode: that mode uses a single shared virtual
470
+ * user with no per-machine scoping, so on any shared database two developers
471
+ * would read and write each other's settings, oauth tokens, and app state.
472
+ */
473
+ export function isLocalDatabase(): boolean {
474
+ if (isPgliteUrl(getDatabaseUrl())) return true;
475
+ if (getDialect() !== "sqlite") return false;
476
+ const url = getDatabaseUrl();
477
+ return url === "" || url.startsWith("file:");
478
+ }
479
+
480
+ /** Returns BIGINT for Postgres (64-bit), INTEGER for SQLite (already 64-bit). */
481
+ export function intType(): string {
482
+ return isPostgres() ? "BIGINT" : "INTEGER";
483
+ }
484
+
485
+ // `widenIntColumnsToBigInt` lives in `./widen-columns.js` (it depends only on
486
+ // `isPostgres`/`getDbExec` from here) so stores can import it without every
487
+ // `vi.mock("./client.js")` test having to stub the export.
488
+
489
+ // ---------------------------------------------------------------------------
490
+ // Parameter conversion: ? -> $1, $2, $3
491
+ // ---------------------------------------------------------------------------
492
+
493
+ export function sqliteToPostgresParams(sql: string): string {
494
+ let out = "";
495
+ let param = 0;
496
+ let i = 0;
497
+ let mode:
498
+ | "normal"
499
+ | "single"
500
+ | "double"
501
+ | "line-comment"
502
+ | "block-comment"
503
+ | "dollar" = "normal";
504
+ let dollarTag = "";
505
+
506
+ while (i < sql.length) {
507
+ const ch = sql[i];
508
+ const next = sql[i + 1];
509
+
510
+ if (mode === "line-comment") {
511
+ out += ch;
512
+ i++;
513
+ if (ch === "\n") mode = "normal";
514
+ continue;
515
+ }
516
+
517
+ if (mode === "block-comment") {
518
+ out += ch;
519
+ if (ch === "*" && next === "/") {
520
+ out += next;
521
+ i += 2;
522
+ mode = "normal";
523
+ continue;
524
+ }
525
+ i++;
526
+ continue;
527
+ }
528
+
529
+ if (mode === "single") {
530
+ out += ch;
531
+ if (ch === "'" && next === "'") {
532
+ out += next;
533
+ i += 2;
534
+ continue;
535
+ }
536
+ if (ch === "'") mode = "normal";
537
+ i++;
538
+ continue;
539
+ }
540
+
541
+ if (mode === "double") {
542
+ out += ch;
543
+ if (ch === '"' && next === '"') {
544
+ out += next;
545
+ i += 2;
546
+ continue;
547
+ }
548
+ if (ch === '"') mode = "normal";
549
+ i++;
550
+ continue;
551
+ }
552
+
553
+ if (mode === "dollar") {
554
+ if (dollarTag && sql.startsWith(dollarTag, i)) {
555
+ out += dollarTag;
556
+ i += dollarTag.length;
557
+ mode = "normal";
558
+ dollarTag = "";
559
+ continue;
560
+ }
561
+ out += ch;
562
+ i++;
563
+ continue;
564
+ }
565
+
566
+ if (ch === "-" && next === "-") {
567
+ out += ch + next;
568
+ i += 2;
569
+ mode = "line-comment";
570
+ continue;
571
+ }
572
+ if (ch === "/" && next === "*") {
573
+ out += ch + next;
574
+ i += 2;
575
+ mode = "block-comment";
576
+ continue;
577
+ }
578
+ if (ch === "'") {
579
+ out += ch;
580
+ i++;
581
+ mode = "single";
582
+ continue;
583
+ }
584
+ if (ch === '"') {
585
+ out += ch;
586
+ i++;
587
+ mode = "double";
588
+ continue;
589
+ }
590
+ if (ch === "$") {
591
+ const match = /^\$[A-Za-z_][A-Za-z0-9_]*\$|^\$\$/.exec(sql.slice(i));
592
+ if (match) {
593
+ dollarTag = match[0];
594
+ out += dollarTag;
595
+ i += dollarTag.length;
596
+ mode = "dollar";
597
+ continue;
598
+ }
599
+ }
600
+ if (ch === "?") {
601
+ out += `$${++param}`;
602
+ i++;
603
+ continue;
604
+ }
605
+
606
+ out += ch;
607
+ i++;
608
+ }
609
+
610
+ return out;
611
+ }
612
+
613
+ function sqlAndArgs(sql: string | { sql: string; args?: unknown[] }): {
614
+ rawSql: string;
615
+ args: unknown[];
616
+ } {
617
+ return typeof sql === "string"
618
+ ? { rawSql: sql, args: [] }
619
+ : { rawSql: sql.sql, args: sql.args || [] };
620
+ }
621
+
622
+ function explicitTransaction(
623
+ execute: DbExec["execute"],
624
+ begin = "BEGIN",
625
+ ): NonNullable<DbExec["transaction"]> {
626
+ return async (fn) => {
627
+ await execute(begin);
628
+ try {
629
+ const result = await fn({ execute });
630
+ await execute("COMMIT");
631
+ return result;
632
+ } catch (err) {
633
+ await execute("ROLLBACK").catch(() => {});
634
+ throw err;
635
+ }
636
+ };
637
+ }
638
+
639
+ // ---------------------------------------------------------------------------
640
+ // Connection error retry (ECONNRESET, etc.)
641
+ // ---------------------------------------------------------------------------
642
+
643
+ /** Error codes that indicate a dead/stale connection we can safely retry. */
644
+ const CONNECTION_ERROR_CODES = new Set([
645
+ "ECONNRESET",
646
+ "ETIMEDOUT",
647
+ "EPIPE",
648
+ "ENOTFOUND",
649
+ "CONNECT_TIMEOUT",
650
+ "CONNECTION_ENDED",
651
+ "CONNECTION_DESTROYED",
652
+ "CONNECTION_CLOSED",
653
+ ]);
654
+
655
+ export function isConnectionError(err: any): boolean {
656
+ if (!err) return false;
657
+ const code = err.code || err.cause?.code;
658
+ if (code && CONNECTION_ERROR_CODES.has(code)) return true;
659
+ // Neon serverless WS driver: errors from the underlying undici WebSocket
660
+ // closing mid-query come through as TypeError or ErrorEvent without a code.
661
+ const name = err.name || err.cause?.name || "";
662
+ if (name === "ErrorEvent") return true;
663
+ const stack = String(err.stack || err.cause?.stack || "");
664
+ if (
665
+ /WebSocket\.#onSocketClose|failWebsocketConnection|onSocketClose/.test(
666
+ stack,
667
+ )
668
+ ) {
669
+ return true;
670
+ }
671
+ const msg = String(err.message || err.cause?.message || "");
672
+ return /ECONNRESET|ETIMEDOUT|EPIPE|connection.*(closed|ended|terminated)|socket hang up|websocket/i.test(
673
+ msg,
674
+ );
675
+ }
676
+
677
+ /**
678
+ * Classify database failures that should temporarily shed request load.
679
+ * Statement timeouts are not included in isConnectionError() because retrying
680
+ * every timed-out mutation would not be safe, but request handlers can still
681
+ * return a retryable service-unavailable response for them.
682
+ */
683
+ export function isTransientDatabaseError(err: unknown): boolean {
684
+ const error = err as {
685
+ code?: unknown;
686
+ name?: unknown;
687
+ message?: unknown;
688
+ stack?: unknown;
689
+ cause?: {
690
+ code?: unknown;
691
+ name?: unknown;
692
+ message?: unknown;
693
+ stack?: unknown;
694
+ };
695
+ };
696
+ const code = String(error?.code ?? error?.cause?.code ?? "");
697
+ if (
698
+ code === "ECHECKOUTTIMEOUT" ||
699
+ code === "53300" ||
700
+ code === "57014" ||
701
+ /^08/.test(code) ||
702
+ /^57P0[123]$/.test(code)
703
+ ) {
704
+ return true;
705
+ }
706
+
707
+ const message = [error?.message, error?.cause?.message]
708
+ .filter((value): value is string => typeof value === "string")
709
+ .join(" ");
710
+ if (
711
+ /\bstatement timeout\b|\bdb (?:query|connect) timed out\b/i.test(message)
712
+ ) {
713
+ return true;
714
+ }
715
+
716
+ const databaseSurface = [
717
+ error?.name,
718
+ error?.cause?.name,
719
+ error?.stack,
720
+ error?.cause?.stack,
721
+ ]
722
+ .filter((value): value is string => typeof value === "string")
723
+ .join(" ");
724
+ return (
725
+ isConnectionError(error) &&
726
+ /@neondatabase|@libsql|\bpostgres(?:ql)?\b|\bpg-pool\b|drizzle-orm|\/db\/client\.[cm]?[jt]s/i.test(
727
+ databaseSurface,
728
+ )
729
+ );
730
+ }
731
+
732
+ export async function retryOnConnectionError<T>(
733
+ fn: () => Promise<T>,
734
+ maxAttempts = 3,
735
+ ): Promise<T> {
736
+ let last: unknown;
737
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
738
+ try {
739
+ return await fn();
740
+ } catch (e) {
741
+ last = e;
742
+ if (!isConnectionError(e) || attempt === maxAttempts - 1) throw e;
743
+ recordDatabaseRetry();
744
+ await new Promise((r) => setTimeout(r, 100 * (attempt + 1)));
745
+ }
746
+ }
747
+ throw last;
748
+ }
749
+
750
+ // ---------------------------------------------------------------------------
751
+ // Per-op timeout — converts a silent serverless hang into a retryable error
752
+ // ---------------------------------------------------------------------------
753
+
754
+ /**
755
+ * Max wall time for a single DB op (init or query) before we treat it as a
756
+ * dead connection. A frozen→thawed serverless instance can leave the Neon
757
+ * WebSocket (or a postgres.js socket) hung mid-flight: the promise neither
758
+ * settles nor errors, so retryOnConnectionError() — which only retries thrown
759
+ * errors — can't help and the request hangs until the platform kills the
760
+ * function (~30s on Netlify). For authenticated requests that run a session
761
+ * lookup on every navigation this surfaces as "the site won't load". Bounding
762
+ * each op well under the platform function limit turns the silent hang into a
763
+ * CONNECT_TIMEOUT that the existing retry and reject-reset paths already
764
+ * handle. Override with DB_OP_TIMEOUT_MS.
765
+ */
766
+ export function dbOpTimeoutMs(): number {
767
+ const raw = Number(process.env.DB_OP_TIMEOUT_MS);
768
+ if (Number.isFinite(raw) && raw > 0) return raw;
769
+ return isServerlessRuntime() ? 8_000 : 30_000;
770
+ }
771
+
772
+ /**
773
+ * Timeout error tagged with a recognized connection-error code so
774
+ * isConnectionError() / retryOnConnectionError() treat a hung op as a
775
+ * retryable dead connection, and upstream reject-reset guards (e.g. the
776
+ * cached session-table init promise) clear their poisoned state.
777
+ */
778
+ class DbTimeoutError extends Error {
779
+ code = "CONNECT_TIMEOUT";
780
+ constructor(op: string, ms: number) {
781
+ super(`DB ${op} timed out after ${ms}ms (connection terminated)`);
782
+ this.name = "DbTimeoutError";
783
+ }
784
+ }
785
+
786
+ /**
787
+ * Race a DB op against {@link dbOpTimeoutMs}. Callers that own a cancellable
788
+ * query or pooled client should pass onTimeout so the losing operation does
789
+ * not keep occupying a scarce connection slot after the request has recovered.
790
+ */
791
+ export async function withDbTimeout<T>(
792
+ op: string,
793
+ run: () => Promise<T>,
794
+ ms = dbOpTimeoutMs(),
795
+ onTimeout?: () => void | Promise<void>,
796
+ ): Promise<T> {
797
+ let timer: ReturnType<typeof setTimeout> | undefined;
798
+ let settled = false;
799
+ const finishTelemetry = beginDatabaseOperation(
800
+ op === "connect" ? "connect" : "query",
801
+ );
802
+
803
+ const runCleanup = async () => {
804
+ if (!onTimeout) return;
805
+ try {
806
+ await onTimeout();
807
+ } catch (err) {
808
+ console.warn(
809
+ `[db] timeout cleanup for ${op} failed:`,
810
+ err instanceof Error ? err.message : err,
811
+ );
812
+ }
813
+ };
814
+
815
+ return await new Promise<T>((resolve, reject) => {
816
+ const finish = (
817
+ complete: (value: T | PromiseLike<T>) => void,
818
+ value: T | PromiseLike<T>,
819
+ ) => {
820
+ if (settled) return;
821
+ settled = true;
822
+ if (timer) clearTimeout(timer);
823
+ finishTelemetry("success");
824
+ complete(value);
825
+ };
826
+ const fail = (err: unknown) => {
827
+ if (settled) return;
828
+ settled = true;
829
+ if (timer) clearTimeout(timer);
830
+ finishTelemetry("error");
831
+ reject(err);
832
+ };
833
+
834
+ timer = setTimeout(() => {
835
+ if (settled) return;
836
+ settled = true;
837
+ void (async () => {
838
+ await runCleanup();
839
+ finishTelemetry("timeout");
840
+ reject(new DbTimeoutError(op, ms));
841
+ })();
842
+ }, ms);
843
+
844
+ let promise: Promise<T>;
845
+ try {
846
+ promise = run();
847
+ } catch (err) {
848
+ fail(err);
849
+ return;
850
+ }
851
+ promise.then((value) => finish(resolve, value), fail);
852
+ });
853
+ }
854
+
855
+ // ---------------------------------------------------------------------------
856
+ // Serverless-aware Postgres pool options
857
+ // ---------------------------------------------------------------------------
858
+
859
+ /**
860
+ * True on serverless function runtimes (Netlify / Vercel / AWS Lambda /
861
+ * Cloudflare Pages Functions) where every concurrent request can spin up its
862
+ * own frozen process. Connections cannot be shared across instances, so each
863
+ * instance must keep its pool tiny — otherwise dozens of warm instances each
864
+ * holding postgres.js's default 10-connection pool blow past Neon/Postgres'
865
+ * connection cap and every `/_agent-native/*` route 500s with "Max client
866
+ * connections reached".
867
+ */
868
+ export function isServerlessRuntime(): boolean {
869
+ return (
870
+ !!process.env.NETLIFY ||
871
+ !!process.env.VERCEL ||
872
+ !!process.env.AWS_LAMBDA_FUNCTION_NAME ||
873
+ !!process.env.LAMBDA_TASK_ROOT ||
874
+ !!process.env.CF_PAGES
875
+ );
876
+ }
877
+
878
+ /**
879
+ * postgres.js pool options tuned per runtime. A serverless instance handles
880
+ * one request at a time, so a tiny pool is enough — but we cap at 2 (not 1)
881
+ * so a single slow query or open transaction can't serialize every other
882
+ * query in the same request. Total connections stay bounded to ≈ 2×
883
+ * concurrent-instance count instead of 10×. idle_timeout is shortened on
884
+ * serverless so a thawed-but-idle instance releases its connections quickly.
885
+ * Long-lived Node servers keep the normal pool for throughput.
886
+ */
887
+ export function pgPoolOptions(url: string): Record<string, unknown> {
888
+ const serverless = isServerlessRuntime();
889
+ return {
890
+ onnotice: () => {},
891
+ max: serverless ? 2 : 10,
892
+ idle_timeout: serverless ? 20 : 240,
893
+ max_lifetime: 60 * 30,
894
+ connect_timeout: 10,
895
+ // Supabase's connection pooler (Transaction mode) requires prepare:false.
896
+ // Only disable for Supabase URLs to avoid degrading other deployments.
897
+ ...(url.includes("supabase") ? { prepare: false } : {}),
898
+ };
899
+ }
900
+
901
+ /**
902
+ * Connection cap for the @neondatabase/serverless `Pool`. Same instance
903
+ * accumulation risk as postgres.js — a small pool (2) is enough on serverless
904
+ * and keeps total connections bounded while still letting a second query
905
+ * proceed when one connection is busy.
906
+ */
907
+ export function neonPoolMax(): number {
908
+ if (!isServerlessRuntime()) return 10;
909
+ // The durable background-function worker is a SINGLE process per run (unlike
910
+ // the many warm request-instances the foreground serverless has), so it can
911
+ // safely hold a larger pool without risking Neon's connection cap. The agent's
912
+ // pre-send setup fires ~6 concurrent DB reads in parallel; with only 2
913
+ // connections that burst exhausts the pool and a single stalled connection
914
+ // freezes the worker before it can claim — observed on analytics' heavier
915
+ // action surface, where the worker froze right after `model_done` and never
916
+ // recorded `env_config`/`presend`, while the foreground (10-connection pool)
917
+ // ran the identical code in ~2s. Give the bg worker enough connections for the
918
+ // burst; keep the foreground serverless pool tiny to avoid "Max client
919
+ // connections reached" across many warm instances.
920
+ if (isBackgroundFunctionPoolContext()) return 8;
921
+ return 2;
922
+ }
923
+
924
+ /**
925
+ * Inline mirror of `isInBackgroundFunctionRuntime()`
926
+ * (agent/durable-background.ts), replicated here to avoid a `db` → `agent`
927
+ * import cycle. Keep the signals in sync with that function.
928
+ */
929
+ export function isBackgroundFunctionPoolContext(): boolean {
930
+ if (
931
+ (globalThis as Record<string, unknown>)
932
+ .__AGENT_NATIVE_BACKGROUND_RUNTIME__ === true
933
+ ) {
934
+ return true;
935
+ }
936
+ // NOTE: we deliberately do NOT trust `__AGENT_NATIVE_BACKGROUND_RUNTIME_EXPECTED__`
937
+ // here. That flag is set from the dispatch MARKER (which URL the foreground
938
+ // targeted), not from proof the request actually LANDED on a background
939
+ // function. A worker dispatched toward `-background` but routed onto the ~60s
940
+ // synchronous function would otherwise take the 8-connection background pool
941
+ // while running as one of MANY warm sync-function instances — multiplying
942
+ // Neon connections and exhausting the pooled endpoint ("connection
943
+ // terminated" / statement timeouts / failed heartbeat writes → stale runs).
944
+ // The genuine `-background` function sets `__AGENT_NATIVE_BACKGROUND_RUNTIME__`
945
+ // as its first cold-start statement, so a real background worker still gets
946
+ // the larger pool via the check above. Mirrors the same proof-of-landing
947
+ // tightening applied to `shouldUseBackgroundFunctionTimeoutForWorker`.
948
+ const lambdaName = process.env.AWS_LAMBDA_FUNCTION_NAME;
949
+ if (
950
+ typeof lambdaName === "string" &&
951
+ lambdaName.toLowerCase().endsWith("-background")
952
+ ) {
953
+ return true;
954
+ }
955
+ const forced = process.env.AGENT_CHAT_FORCE_BACKGROUND_RUNTIME;
956
+ if (forced != null) {
957
+ const v = forced.trim().toLowerCase();
958
+ return v === "1" || v === "true" || v === "yes" || v === "on";
959
+ }
960
+ return false;
961
+ }
962
+
963
+ /**
964
+ * Render any rejection reason as a readable message. The Neon serverless
965
+ * driver surfaces WebSocket failures as raw DOM-style ErrorEvent objects (not
966
+ * Error instances), which stringify uselessly as "[object ErrorEvent]" — pull
967
+ * the message off the event (or its nested `.error`) instead so logs carry
968
+ * actual context.
969
+ */
970
+ export function describeDbError(err: unknown): string {
971
+ if (err instanceof Error) return err.message;
972
+ if (err && typeof err === "object") {
973
+ const evt = err as {
974
+ message?: unknown;
975
+ error?: { message?: unknown };
976
+ type?: unknown;
977
+ };
978
+ const msg = evt.message ?? evt.error?.message;
979
+ if (typeof msg === "string" && msg) return msg;
980
+ if (evt.type === "error") {
981
+ return "WebSocket ErrorEvent (connection failed; no message attached)";
982
+ }
983
+ }
984
+ return String(err);
985
+ }
986
+
987
+ export function attachNeonPoolErrorLogger(
988
+ pool: unknown,
989
+ label = "db/neon",
990
+ ): void {
991
+ if (!pool || typeof pool !== "object") return;
992
+ if (loggedNeonPools.has(pool)) return;
993
+ const withEvents = pool as {
994
+ on?: (event: string, listener: (...args: unknown[]) => void) => unknown;
995
+ };
996
+ if (typeof withEvents.on !== "function") return;
997
+
998
+ loggedNeonPools.add(pool);
999
+ withEvents.on("error", (err: unknown) => {
1000
+ console.warn(
1001
+ `[${label}] pool error (will reconnect on next query):`,
1002
+ describeDbError(err),
1003
+ );
1004
+ });
1005
+
1006
+ // Attach a persistent 'error' listener to EVERY client for its whole lifetime.
1007
+ //
1008
+ // @neondatabase/serverless mirrors pg-pool, which only keeps its own idle
1009
+ // error listener on a client while that client is idle — it REMOVES the
1010
+ // listener the moment the client is checked out. So when a checked-out
1011
+ // client's WebSocket drops mid-flight (Lambda freeze/thaw, Neon "terminating
1012
+ // connection due to administrator command", an idle socket the pooler closed),
1013
+ // the client emits 'error' with no listener. Node turns an unhandled 'error'
1014
+ // EventEmitter event into an uncaught exception, which crashes the whole
1015
+ // serverless function. This was by far the single highest-volume production
1016
+ // crash (Sentry "Unhandled error. ()", mechanism auto.node.onuncaughtexception,
1017
+ // culprit neondatabase__serverless). pg routes the failure to the in-flight
1018
+ // query independently, so this listener only needs to keep the emit from going
1019
+ // unhandled — the dropped client is discarded and the next query reconnects.
1020
+ withEvents.on("connect", (client: unknown) => {
1021
+ if (!client || typeof client !== "object") return;
1022
+ const clientEvents = client as {
1023
+ on?: (event: string, listener: (...args: unknown[]) => void) => unknown;
1024
+ };
1025
+ if (typeof clientEvents.on !== "function") return;
1026
+ clientEvents.on("error", (err: unknown) => {
1027
+ console.warn(
1028
+ `[${label}] client connection error (connection discarded, next query reconnects):`,
1029
+ describeDbError(err),
1030
+ );
1031
+ });
1032
+ });
1033
+ }
1034
+
1035
+ function disposePostgresPoolEventually(
1036
+ pool: { end: () => Promise<unknown> },
1037
+ label: string,
1038
+ ): void {
1039
+ if (!pool || typeof pool !== "object") return;
1040
+ if (recyclingPostgresPools.has(pool)) return;
1041
+ recyclingPostgresPools.add(pool);
1042
+ void pool.end().catch((err: unknown) => {
1043
+ console.warn(
1044
+ `[db/postgres] ${label} cleanup failed:`,
1045
+ err instanceof Error ? err.message : err,
1046
+ );
1047
+ });
1048
+ }
1049
+
1050
+ // ---------------------------------------------------------------------------
1051
+ // Singleton client — lazy-initialized on first execute() call
1052
+ // ---------------------------------------------------------------------------
1053
+
1054
+ let _exec: DbExec | undefined;
1055
+ let _pgPool: any;
1056
+ let _neonPool: any;
1057
+ let _sqlite: any;
1058
+ let _initPromise: Promise<void> | undefined;
1059
+
1060
+ async function executePglite(
1061
+ client: {
1062
+ query: (
1063
+ sql: string,
1064
+ args?: any[],
1065
+ ) => Promise<{ rows?: any[]; affectedRows?: number; rowCount?: number }>;
1066
+ },
1067
+ sql: Parameters<DbExec["execute"]>[0],
1068
+ ): ReturnType<DbExec["execute"]> {
1069
+ const { rawSql, args } = sqlAndArgs(sql);
1070
+ const pgSql = sqliteToPostgresParams(rawSql);
1071
+ const result = await client.query(pgSql, args as any[]);
1072
+ return {
1073
+ rows: Array.from(result.rows ?? []),
1074
+ rowsAffected: result.affectedRows ?? result.rowCount ?? 0,
1075
+ };
1076
+ }
1077
+
1078
+ async function createDbExecInternal(
1079
+ config: DbExecConfig = {},
1080
+ trackSingletonResources = false,
1081
+ ): Promise<DbExec> {
1082
+ const dialect = dialectForConfig(config);
1083
+
1084
+ // Cloudflare D1
1085
+ if (dialect === "d1") {
1086
+ const d1 = config.d1Binding;
1087
+ const execute: DbExec["execute"] = async (sql) => {
1088
+ if (typeof sql === "string") {
1089
+ const r = await d1.prepare(sql).all();
1090
+ return {
1091
+ rows: r.results || [],
1092
+ rowsAffected: r.meta?.changes ?? 0,
1093
+ };
1094
+ }
1095
+ const r = await d1
1096
+ .prepare(sql.sql)
1097
+ .bind(...(sql.args ?? []))
1098
+ .all();
1099
+ return { rows: r.results || [], rowsAffected: r.meta?.changes ?? 0 };
1100
+ };
1101
+ return {
1102
+ execute,
1103
+ transaction: explicitTransaction(execute),
1104
+ };
1105
+ }
1106
+
1107
+ let url = config.url || "file:./data/app.db";
1108
+
1109
+ if (isPgliteUrl(url)) {
1110
+ const client = await getPgliteClient(url);
1111
+ return {
1112
+ execute: (sql) => executePglite(client, sql),
1113
+ async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {
1114
+ return client.transaction((tx: any) =>
1115
+ fn({
1116
+ execute: (sql) => executePglite(tx, sql),
1117
+ }),
1118
+ );
1119
+ },
1120
+ async close() {
1121
+ await closePgliteClient(url);
1122
+ },
1123
+ };
1124
+ }
1125
+
1126
+ // Postgres — uses postgres.js. Works on Node.js natively and on Cloudflare
1127
+ // Workers with the nodejs_compat compatibility flag (provides net/tls polyfills).
1128
+ // On Workers, connections can't be shared across requests, so we create a
1129
+ // fresh connection per query (max:1) to avoid the "I/O on behalf of a
1130
+ // different request" error.
1131
+ if (dialect === "postgres") {
1132
+ const { isNeonUrl } = await import("./create-get-db.js");
1133
+
1134
+ // Neon over @neondatabase/serverless (WebSocket upgrade on port 443).
1135
+ // postgres-js uses a raw TCP socket on 5432 that frequently fails on
1136
+ // serverless runtimes (Netlify Functions, Vercel, CF Workers) when
1137
+ // Neon's pooler is cold — every request after an idle period times out
1138
+ // with CONNECT_TIMEOUT. The serverless Pool handles wake-up transparently
1139
+ // and keeps the same `pg`-compatible query(...) interface we need here.
1140
+ if (isNeonUrl(url)) {
1141
+ const { Pool, neonConfig } = await import("@neondatabase/serverless");
1142
+ // In the durable background-function worker, route pool queries over Neon's
1143
+ // stateless HTTP transport instead of a long-lived WebSocket. A frozen/thawed
1144
+ // bg-fn instance can leave the pool's WebSocket connections half-dead, so
1145
+ // queries after the first burst stall on connect()/query() — observed: the
1146
+ // analytics worker stalls right after model resolution and never claims.
1147
+ // HTTP-per-query (poolQueryViaFetch) has no persistent socket to die; the
1148
+ // foreground keeps the WebSocket pool. See the bg-fn execute branch below.
1149
+ const bgHttp = isBackgroundFunctionPoolContext();
1150
+ if (bgHttp) {
1151
+ (neonConfig as { poolQueryViaFetch?: boolean }).poolQueryViaFetch =
1152
+ true;
1153
+ }
1154
+ const pool = new Pool({ connectionString: url, max: neonPoolMax() });
1155
+ attachNeonPoolErrorLogger(pool);
1156
+ if (trackSingletonResources) _neonPool = pool;
1157
+ async function queryNeonClient(
1158
+ client: any,
1159
+ sql: Parameters<DbExec["execute"]>[0],
1160
+ ) {
1161
+ const { rawSql, args } = sqlAndArgs(sql);
1162
+ const pgSql = sqliteToPostgresParams(rawSql);
1163
+ const result = await withDbTimeout(
1164
+ "query",
1165
+ () =>
1166
+ client.query(pgSql, args as any[]) as Promise<{
1167
+ rows: unknown[];
1168
+ rowCount?: number;
1169
+ }>,
1170
+ dbOpTimeoutMs(),
1171
+ );
1172
+ return {
1173
+ rows: result.rows,
1174
+ rowsAffected: result.rowCount ?? 0,
1175
+ };
1176
+ }
1177
+ return {
1178
+ async execute(sql) {
1179
+ if (bgHttp) {
1180
+ // HTTP-per-query path (poolQueryViaFetch=true): no pool.connect(), no
1181
+ // persistent socket to stall. queryNeonClient calls pool.query(),
1182
+ // which the driver routes over HTTP when poolQueryViaFetch is set.
1183
+ return retryOnConnectionError<{
1184
+ rows: unknown[];
1185
+ rowsAffected: number;
1186
+ }>(() => queryNeonClient(pool, sql));
1187
+ }
1188
+ const result = await retryOnConnectionError<{
1189
+ rows: unknown[];
1190
+ rowsAffected: number;
1191
+ }>(async () => {
1192
+ // Bound the pooled-connection ACQUIRE, not just the query below.
1193
+ // Neon's pooler can stall on `connect()` when cold or exhausted,
1194
+ // and that happens BEFORE `client.query`, so the query-level
1195
+ // timeout never fires — the request hangs until the platform kills
1196
+ // the function (~"the site won't load" for authenticated users,
1197
+ // whose every request runs a session/org lookup). Time the acquire
1198
+ // out into a retryable CONNECT_TIMEOUT that retryOnConnectionError
1199
+ // already handles, and release the connection if it resolves after
1200
+ // we've given up so the scarce pool slot isn't leaked.
1201
+ let acquireTimedOut = false;
1202
+ const client = await withDbTimeout(
1203
+ "connect",
1204
+ () =>
1205
+ pool.connect().then((c) => {
1206
+ if (acquireTimedOut) c.release();
1207
+ return c;
1208
+ }),
1209
+ dbOpTimeoutMs(),
1210
+ () => {
1211
+ acquireTimedOut = true;
1212
+ },
1213
+ );
1214
+ let released = false;
1215
+ const releaseClient = (err?: Error | boolean) => {
1216
+ if (released) return;
1217
+ released = true;
1218
+ client.release(err);
1219
+ };
1220
+
1221
+ try {
1222
+ const result = await queryNeonClient(client, sql);
1223
+ releaseClient();
1224
+ return result;
1225
+ } catch (err) {
1226
+ releaseClient(isConnectionError(err) ? true : undefined);
1227
+ throw err;
1228
+ }
1229
+ });
1230
+ return {
1231
+ rows: result.rows,
1232
+ rowsAffected: result.rowsAffected,
1233
+ };
1234
+ },
1235
+ async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {
1236
+ return retryOnConnectionError(async () => {
1237
+ let acquireTimedOut = false;
1238
+ const client = await withDbTimeout(
1239
+ "connect",
1240
+ () =>
1241
+ pool.connect().then((c) => {
1242
+ if (acquireTimedOut) c.release();
1243
+ return c;
1244
+ }),
1245
+ dbOpTimeoutMs(),
1246
+ () => {
1247
+ acquireTimedOut = true;
1248
+ },
1249
+ );
1250
+ let released = false;
1251
+ const releaseClient = (err?: Error | boolean) => {
1252
+ if (released) return;
1253
+ released = true;
1254
+ client.release(err);
1255
+ };
1256
+ const tx: DbExec = {
1257
+ execute: (sql) => queryNeonClient(client, sql),
1258
+ };
1259
+ try {
1260
+ await queryNeonClient(client, "BEGIN");
1261
+ const result = await fn(tx);
1262
+ await queryNeonClient(client, "COMMIT");
1263
+ releaseClient();
1264
+ return result;
1265
+ } catch (err) {
1266
+ await queryNeonClient(client, "ROLLBACK").catch(() => {});
1267
+ releaseClient(isConnectionError(err) ? true : undefined);
1268
+ throw err;
1269
+ }
1270
+ }, 1);
1271
+ },
1272
+ async close() {
1273
+ await pool.end();
1274
+ },
1275
+ };
1276
+ }
1277
+
1278
+ const { default: postgres } = await import("postgres");
1279
+ const isWorkers =
1280
+ "__cf_env" in globalThis ||
1281
+ (typeof navigator !== "undefined" &&
1282
+ navigator.userAgent === "Cloudflare-Workers");
1283
+
1284
+ if (isWorkers) {
1285
+ // Workers: fresh connection per query — I/O can't be shared across requests
1286
+ return {
1287
+ async execute(sql) {
1288
+ const conn = postgres(url, {
1289
+ max: 1,
1290
+ idle_timeout: 0,
1291
+ onnotice: () => {},
1292
+ });
1293
+ let timedOut = false;
1294
+ try {
1295
+ const rawSql = typeof sql === "string" ? sql : sql.sql;
1296
+ const args = typeof sql === "string" ? [] : sql.args || [];
1297
+ const pgSql = sqliteToPostgresParams(rawSql);
1298
+ const result = await withDbTimeout<
1299
+ ArrayLike<unknown> & { count?: number }
1300
+ >(
1301
+ "query",
1302
+ () =>
1303
+ conn.unsafe(pgSql, args as any[]) as Promise<
1304
+ ArrayLike<unknown> & { count?: number }
1305
+ >,
1306
+ dbOpTimeoutMs(),
1307
+ () => {
1308
+ timedOut = true;
1309
+ disposePostgresPoolEventually(conn, "timed-out worker query");
1310
+ },
1311
+ );
1312
+ return {
1313
+ rows: Array.from(result),
1314
+ rowsAffected: result.count ?? 0,
1315
+ };
1316
+ } finally {
1317
+ if (!timedOut) {
1318
+ await conn.end().catch((err: unknown) => {
1319
+ console.warn(
1320
+ "[db/postgres] worker query cleanup failed:",
1321
+ err instanceof Error ? err.message : err,
1322
+ );
1323
+ });
1324
+ }
1325
+ }
1326
+ },
1327
+ async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {
1328
+ const conn = postgres(url, {
1329
+ max: 1,
1330
+ idle_timeout: 0,
1331
+ onnotice: () => {},
1332
+ });
1333
+ try {
1334
+ const result = await conn.begin(async (txSql: any) => {
1335
+ const tx: DbExec = {
1336
+ async execute(sql) {
1337
+ const { rawSql, args } = sqlAndArgs(sql);
1338
+ const pgSql = sqliteToPostgresParams(rawSql);
1339
+ const result = await withDbTimeout<
1340
+ ArrayLike<unknown> & { count?: number }
1341
+ >(
1342
+ "query",
1343
+ () =>
1344
+ txSql.unsafe(pgSql, args as any[]) as Promise<
1345
+ ArrayLike<unknown> & { count?: number }
1346
+ >,
1347
+ dbOpTimeoutMs(),
1348
+ );
1349
+ return {
1350
+ rows: Array.from(result),
1351
+ rowsAffected: result.count ?? 0,
1352
+ };
1353
+ },
1354
+ };
1355
+ return fn(tx);
1356
+ });
1357
+ return result as T;
1358
+ } finally {
1359
+ await conn.end().catch((err: unknown) => {
1360
+ console.warn(
1361
+ "[db/postgres] worker transaction cleanup failed:",
1362
+ err instanceof Error ? err.message : err,
1363
+ );
1364
+ });
1365
+ }
1366
+ },
1367
+ };
1368
+ } else {
1369
+ // Node.js: reuse connection pool. pgPoolOptions caps the pool to a
1370
+ // small size on serverless (Netlify/Vercel/Lambda/CF) so concurrent
1371
+ // frozen instances don't exhaust Neon/Postgres' connection limit;
1372
+ // idle_timeout also closes idle connections before Neon's ~5min
1373
+ // server-side timeout, avoiding ECONNRESET when the server hangs up.
1374
+ const createPool = () => postgres(url, pgPoolOptions(url));
1375
+ type PostgresPool = ReturnType<typeof createPool>;
1376
+ let pool = createPool();
1377
+ if (trackSingletonResources) _pgPool = pool;
1378
+ const recyclePool = (timedOutPool: PostgresPool) => {
1379
+ if (pool === timedOutPool) {
1380
+ pool = createPool();
1381
+ if (trackSingletonResources) _pgPool = pool;
1382
+ }
1383
+ disposePostgresPoolEventually(timedOutPool, "timed-out pooled query");
1384
+ };
1385
+
1386
+ return {
1387
+ async execute(sql) {
1388
+ const { rawSql, args } = sqlAndArgs(sql);
1389
+ const pgSql = sqliteToPostgresParams(rawSql);
1390
+ const result = await retryOnConnectionError<
1391
+ ArrayLike<unknown> & { count?: number }
1392
+ >(() => {
1393
+ const queryPool = pool;
1394
+ const query = queryPool.unsafe(pgSql, args as any[]);
1395
+ return withDbTimeout(
1396
+ "query",
1397
+ () => query,
1398
+ dbOpTimeoutMs(),
1399
+ () => recyclePool(queryPool),
1400
+ );
1401
+ });
1402
+ return {
1403
+ rows: Array.from(result),
1404
+ rowsAffected: result.count ?? 0,
1405
+ };
1406
+ },
1407
+ async transaction<T>(fn: (tx: DbExec) => Promise<T>): Promise<T> {
1408
+ const result = await pool.begin(async (txSql: any) => {
1409
+ const tx: DbExec = {
1410
+ async execute(sql) {
1411
+ const { rawSql, args } = sqlAndArgs(sql);
1412
+ const pgSql = sqliteToPostgresParams(rawSql);
1413
+ const result = await withDbTimeout<
1414
+ ArrayLike<unknown> & { count?: number }
1415
+ >(
1416
+ "query",
1417
+ () =>
1418
+ txSql.unsafe(pgSql, args as any[]) as Promise<
1419
+ ArrayLike<unknown> & { count?: number }
1420
+ >,
1421
+ dbOpTimeoutMs(),
1422
+ );
1423
+ return {
1424
+ rows: Array.from(result),
1425
+ rowsAffected: result.count ?? 0,
1426
+ };
1427
+ },
1428
+ };
1429
+ return fn(tx);
1430
+ });
1431
+ return result as T;
1432
+ },
1433
+ async close() {
1434
+ await pool.end();
1435
+ },
1436
+ };
1437
+ }
1438
+ }
1439
+
1440
+ // SQLite / libsql (default). Local file databases use better-sqlite3 so
1441
+ // serverless bundles do not need libsql's platform-specific native package.
1442
+ if (isLocalSqliteUrl(url)) {
1443
+ url = await prepareLocalSqliteUrl(
1444
+ url.startsWith("file:") ? url : `file:${url}`,
1445
+ );
1446
+ const { default: Database } = await import("better-sqlite3");
1447
+ const sqlite = new Database(sqliteFilenameFromUrl(url));
1448
+ sqlite.pragma("busy_timeout = 10000");
1449
+ sqlite.pragma("journal_mode = WAL");
1450
+ if (trackSingletonResources) _sqlite = sqlite;
1451
+ const execute: DbExec["execute"] = async (sql) => {
1452
+ const { rawSql, args } = sqlAndArgs(sql);
1453
+ const stmt = sqlite.prepare(rawSql);
1454
+ if (stmt.reader) {
1455
+ return {
1456
+ rows: stmt.all(...args),
1457
+ rowsAffected: 0,
1458
+ };
1459
+ }
1460
+ const result = stmt.run(...args);
1461
+ return {
1462
+ rows: [],
1463
+ rowsAffected: result.changes ?? 0,
1464
+ };
1465
+ };
1466
+
1467
+ return {
1468
+ execute,
1469
+ transaction: explicitTransaction(execute, "BEGIN IMMEDIATE"),
1470
+ async close() {
1471
+ sqlite.close();
1472
+ },
1473
+ };
1474
+ }
1475
+
1476
+ const { createClient } = await import("@libsql/client/web");
1477
+ const client = createClient({
1478
+ url,
1479
+ authToken: config.authToken,
1480
+ });
1481
+ const execute: DbExec["execute"] = async (sql) => {
1482
+ if (typeof sql === "string") {
1483
+ const r = await client.execute(sql);
1484
+ return {
1485
+ rows: r.rows as any[],
1486
+ rowsAffected: r.rowsAffected,
1487
+ };
1488
+ }
1489
+ const r = await client.execute({
1490
+ sql: sql.sql,
1491
+ args: sql.args as any[],
1492
+ });
1493
+ return {
1494
+ rows: r.rows as any[],
1495
+ rowsAffected: r.rowsAffected,
1496
+ };
1497
+ };
1498
+
1499
+ return {
1500
+ execute,
1501
+ transaction: explicitTransaction(execute),
1502
+ async close() {
1503
+ client.close();
1504
+ },
1505
+ };
1506
+ }
1507
+
1508
+ export async function createDbExec(config: DbExecConfig = {}): Promise<DbExec> {
1509
+ return createDbExecInternal(config, false);
1510
+ }
1511
+
1512
+ async function initClient(): Promise<void> {
1513
+ if (_exec) return;
1514
+
1515
+ const dialect = getDialect();
1516
+ const url = getDatabaseUrl("file:./data/app.db");
1517
+ _exec = await createDbExecInternal(
1518
+ {
1519
+ url,
1520
+ authToken: getDatabaseAuthToken(),
1521
+ d1Binding: dialect === "d1" ? getCloudflareD1Binding() : undefined,
1522
+ },
1523
+ true,
1524
+ );
1525
+ }
1526
+
1527
+ /**
1528
+ * Get the singleton database client. Returns a `DbExec` whose first
1529
+ * `execute()` call lazily initializes the underlying driver.
1530
+ */
1531
+ export function getDbExec(): DbExec {
1532
+ if (_exec) return _exec;
1533
+
1534
+ // Sanitize args: replace undefined with null (libsql rejects undefined)
1535
+ function sanitize(
1536
+ sql: string | { sql: string; args?: unknown[] },
1537
+ ): string | { sql: string; args?: unknown[] } {
1538
+ if (typeof sql === "object" && sql.args) {
1539
+ return { ...sql, args: sql.args.map((a) => a ?? null) };
1540
+ }
1541
+ return sql;
1542
+ }
1543
+
1544
+ // Return a proxy that lazy-inits on first call
1545
+ const proxy: DbExec = {
1546
+ async execute(sql) {
1547
+ if (!_initPromise) _initPromise = initClient();
1548
+ try {
1549
+ await _initPromise;
1550
+ } catch (err) {
1551
+ // A failed/hung init must not poison the singleton for the life of
1552
+ // the process — drop it so the next call retries a fresh connection
1553
+ // instead of re-awaiting a permanently rejected/pending promise.
1554
+ _initPromise = undefined;
1555
+ _exec = undefined;
1556
+ throw err;
1557
+ }
1558
+ // After init, swap to a sanitizing wrapper around the real client
1559
+ const wrapper: DbExec = {
1560
+ execute: (s) => _exec!.execute(sanitize(s)),
1561
+ transaction: _exec!.transaction
1562
+ ? (fn) =>
1563
+ _exec!.transaction!((tx) =>
1564
+ fn({
1565
+ execute: (s) => tx.execute(sanitize(s)),
1566
+ transaction: tx.transaction,
1567
+ }),
1568
+ )
1569
+ : undefined,
1570
+ };
1571
+ Object.assign(proxy, wrapper);
1572
+ return _exec!.execute(sanitize(sql));
1573
+ },
1574
+ async transaction(fn) {
1575
+ if (!_initPromise) _initPromise = initClient();
1576
+ try {
1577
+ await _initPromise;
1578
+ } catch (err) {
1579
+ _initPromise = undefined;
1580
+ _exec = undefined;
1581
+ throw err;
1582
+ }
1583
+ const wrapper: DbExec = {
1584
+ execute: (s) => _exec!.execute(sanitize(s)),
1585
+ transaction: _exec!.transaction
1586
+ ? (innerFn) =>
1587
+ _exec!.transaction!((tx) =>
1588
+ innerFn({
1589
+ execute: (s) => tx.execute(sanitize(s)),
1590
+ transaction: tx.transaction,
1591
+ }),
1592
+ )
1593
+ : undefined,
1594
+ };
1595
+ Object.assign(proxy, wrapper);
1596
+ if (_exec!.transaction) {
1597
+ return _exec!.transaction((tx) =>
1598
+ fn({
1599
+ execute: (s) => tx.execute(sanitize(s)),
1600
+ transaction: tx.transaction,
1601
+ }),
1602
+ );
1603
+ }
1604
+ return explicitTransaction(wrapper.execute)(fn);
1605
+ },
1606
+ };
1607
+ return proxy;
1608
+ }
1609
+
1610
+ /** Close the database connection (for scripts that need cleanup). */
1611
+ export async function closeDbExec(): Promise<void> {
1612
+ if (_pgPool) {
1613
+ await _pgPool.end();
1614
+ _pgPool = undefined;
1615
+ }
1616
+ if (_neonPool) {
1617
+ await _neonPool.end();
1618
+ _neonPool = undefined;
1619
+ }
1620
+ if (_sqlite) {
1621
+ _sqlite.close();
1622
+ _sqlite = undefined;
1623
+ }
1624
+ await closePgliteClients();
1625
+ _exec = undefined;
1626
+ _initPromise = undefined;
1627
+ }