@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,1164 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+
3
+ import type { H3Event } from "h3";
4
+ import { getHeader, readRawBody as h3ReadRawBody } from "h3";
5
+
6
+ import { getDbExec } from "../../db/client.js";
7
+ import type { EnvKeyConfig } from "../../server/create-server.js";
8
+ import { resolveSecret } from "../../server/credential-provider.js";
9
+ import {
10
+ sendEmail,
11
+ isEmailConfigured,
12
+ getEmailProvider,
13
+ } from "../../server/email.js";
14
+ import { getIntegrationConfig } from "../config-store.js";
15
+ import type {
16
+ PlatformAdapter,
17
+ IncomingMessage,
18
+ OutgoingMessage,
19
+ IntegrationStatus,
20
+ OutboundTarget,
21
+ PlatformDeliveryReceipt,
22
+ } from "../types.js";
23
+
24
+ /** Max body length before truncation */
25
+ const EMAIL_MAX_BODY_LENGTH = 15000;
26
+
27
+ /** Rate limit: max emails per sender within the window */
28
+ const RATE_LIMIT_MAX = 20;
29
+ /** Rate limit window in ms (1 hour) */
30
+ const RATE_LIMIT_WINDOW_MS = 60 * 60 * 1000;
31
+
32
+ /**
33
+ * One-shot warning flags so we don't spam logs on every webhook.
34
+ * Cleared per process — one warning per cold start is enough to surface
35
+ * a misconfiguration without leaking config status to anyone with log access
36
+ * (M6 in the webhook security audit).
37
+ */
38
+ let _resendUnverifiedWarned = false;
39
+ let _sendgridUnverifiedWarned = false;
40
+
41
+ function escapeLike(value: string): string {
42
+ return value.replace(/[!%_]/g, (match) => `!${match}`);
43
+ }
44
+
45
+ /**
46
+ * Returns true when the deployment is running in production mode and the
47
+ * operator has NOT explicitly opted into accepting unverified webhooks for
48
+ * local testing. In production we MUST refuse webhooks whose signature can't
49
+ * be verified — accepting them with attacker-controlled `from:` addresses
50
+ * lets the dispatch owner-resolution path run as the victim (C1 in the
51
+ * webhook security audit).
52
+ */
53
+ function shouldRefuseWhenSecretMissing(): boolean {
54
+ if (process.env.AGENT_NATIVE_ALLOW_UNVERIFIED_WEBHOOKS === "1") return false;
55
+ return process.env.NODE_ENV === "production";
56
+ }
57
+
58
+ /**
59
+ * Create an Email platform adapter for inbound/outbound email via
60
+ * Resend or SendGrid webhooks.
61
+ *
62
+ * Required env vars:
63
+ * - EMAIL_AGENT_ADDRESS — The email address the agent receives mail at
64
+ *
65
+ * One of these must also be set (checked via isEmailConfigured()):
66
+ * - RESEND_API_KEY — For sending/receiving via Resend
67
+ * - SENDGRID_API_KEY — For sending/receiving via SendGrid
68
+ *
69
+ * Optional:
70
+ * - EMAIL_INBOUND_WEBHOOK_SECRET — Webhook signature verification secret
71
+ */
72
+ export function emailAdapter(): PlatformAdapter {
73
+ return {
74
+ platform: "email",
75
+ label: "Email",
76
+
77
+ getRequiredEnvKeys(): EnvKeyConfig[] {
78
+ return [
79
+ {
80
+ key: "EMAIL_AGENT_ADDRESS",
81
+ label: "Agent Email Address",
82
+ required: true,
83
+ helpText:
84
+ "The email address people will use to message your agent (e.g. `agent@yourcompany.com`, or pick from your `<slug>.resend.app` sandbox).",
85
+ },
86
+ {
87
+ key: "RESEND_API_KEY",
88
+ label: "Resend API Key",
89
+ required: false,
90
+ helpText:
91
+ "From resend.com → API keys (starts with `re_`). Either Resend or SendGrid is required for sending and receiving mail.",
92
+ },
93
+ {
94
+ key: "SENDGRID_API_KEY",
95
+ label: "SendGrid API Key",
96
+ required: false,
97
+ helpText:
98
+ "From sendgrid.com → Settings → API Keys (starts with `SG.`). Either Resend or SendGrid is required.",
99
+ },
100
+ {
101
+ key: "EMAIL_INBOUND_WEBHOOK_SECRET",
102
+ label: "Inbound Webhook Secret",
103
+ required: false,
104
+ helpText:
105
+ "Optional. From Resend (Webhooks → Signing Secret, starts with `whsec_`) or your SendGrid Inbound Parse basic-auth password. Used to verify inbound webhooks are real.",
106
+ },
107
+ ];
108
+ },
109
+
110
+ async handleVerification(
111
+ _event: H3Event,
112
+ ): Promise<{ handled: boolean; response?: unknown }> {
113
+ // Email webhooks don't need challenge handshakes
114
+ return { handled: false };
115
+ },
116
+
117
+ async verifyWebhook(event: H3Event): Promise<boolean> {
118
+ const secret =
119
+ (await resolveSecret("EMAIL_INBOUND_WEBHOOK_SECRET")) ?? undefined;
120
+ const provider = await getEmailProvider();
121
+
122
+ if (provider === "resend") {
123
+ return verifyResendWebhook(event, secret);
124
+ }
125
+
126
+ if (provider === "sendgrid") {
127
+ return verifySendGridWebhook(event, secret);
128
+ }
129
+
130
+ // No provider configured — reject
131
+ console.warn("[email] No email provider configured, rejecting webhook");
132
+ return false;
133
+ },
134
+
135
+ async parseIncomingMessage(
136
+ event: H3Event,
137
+ ): Promise<IncomingMessage | null> {
138
+ const provider = await getEmailProvider();
139
+ const agentAddress = (
140
+ await resolveSecret("EMAIL_AGENT_ADDRESS")
141
+ )?.toLowerCase();
142
+ if (!agentAddress) {
143
+ console.warn("[email] EMAIL_AGENT_ADDRESS not configured");
144
+ return null;
145
+ }
146
+
147
+ let parsed: ParsedEmail | null = null;
148
+
149
+ if (provider === "resend") {
150
+ parsed = await parseResendWebhook(event);
151
+ } else if (provider === "sendgrid") {
152
+ parsed = await parseSendGridWebhook(event);
153
+ }
154
+
155
+ if (!parsed) return null;
156
+
157
+ // Rate limiting (SQL-backed heuristic — counts the sender's already-queued
158
+ // tasks within the last hour). The previous in-memory map reset on every
159
+ // serverless cold start, so the actual ceiling per attacker was
160
+ // RATE_LIMIT_MAX × number_of_active_instances. SQL-backed counting holds
161
+ // across instances. See H4 in the webhook security audit.
162
+ const senderEmail = parsed.from.email.toLowerCase();
163
+ if (await isRateLimited(senderEmail)) {
164
+ console.warn(
165
+ `[email] Rate limited sender: ${senderEmail} (>${RATE_LIMIT_MAX}/hr)`,
166
+ );
167
+ return null;
168
+ }
169
+
170
+ // Check allowed domains
171
+ const config = await getIntegrationConfig("email");
172
+ if (config?.configData?.allowedDomains) {
173
+ const allowed = config.configData.allowedDomains as string[];
174
+ if (allowed.length > 0) {
175
+ const senderDomain = senderEmail.split("@")[1];
176
+ if (!senderDomain || !allowed.includes(senderDomain)) {
177
+ console.warn(
178
+ `[email] Rejected email from ${senderEmail}: domain not in allowedDomains`,
179
+ );
180
+ return null;
181
+ }
182
+ }
183
+ }
184
+
185
+ // Determine if agent was CC'd (not in To, but in CC)
186
+ const toAddresses = parsed.to.map((a) => a.toLowerCase());
187
+ const ccAddresses = (parsed.cc ?? []).map((a) => a.toLowerCase());
188
+ const isCC =
189
+ !toAddresses.includes(agentAddress) &&
190
+ ccAddresses.includes(agentAddress);
191
+
192
+ // Build thread ID from References chain (Gmail-style: oldest Message-ID is thread root).
193
+ // Scope the thread root by sender so an attacker who can forge a `References:`
194
+ // header pointing at someone else's thread root can't graft into that thread.
195
+ // Without this scoping, a third party could craft an inbound email whose
196
+ // References chain matches a known victim's Message-ID and inject messages into
197
+ // the victim's existing conversation — leaking prior content via the agent's
198
+ // reply (M1 in the webhooks security audit).
199
+ const threadRootId = scopeThreadIdToSender(
200
+ getThreadRootId(parsed.messageId, parsed.references),
201
+ senderEmail,
202
+ );
203
+
204
+ // Build body text
205
+ let bodyText = parsed.text || stripHtmlForPlainText(parsed.html || "");
206
+
207
+ // Truncate if needed
208
+ if (bodyText.length > EMAIL_MAX_BODY_LENGTH) {
209
+ bodyText =
210
+ bodyText.slice(0, EMAIL_MAX_BODY_LENGTH) + "\n[Message truncated]";
211
+ }
212
+
213
+ // Prefix CC'd emails with context
214
+ if (isCC) {
215
+ const otherRecipients = toAddresses
216
+ .filter((a) => a !== agentAddress)
217
+ .join(", ");
218
+ bodyText =
219
+ `[CC'd on email between ${senderEmail} and ${otherRecipients || "others"}]\n` +
220
+ `Subject: ${parsed.subject}\n\n` +
221
+ bodyText;
222
+ }
223
+
224
+ return {
225
+ platform: "email",
226
+ externalThreadId: threadRootId,
227
+ text: bodyText,
228
+ senderName: parsed.from.name,
229
+ senderId: senderEmail,
230
+ // Carry the message-authentication verdict downstream. Owner
231
+ // resolution (dispatch) must NOT grant a real user's identity /
232
+ // credentials unless the sender is verified — an unverified or
233
+ // spoofed `From:` falls back to a synthetic, credential-less owner.
234
+ senderVerified: parsed.senderVerified,
235
+ platformContext: {
236
+ messageId: parsed.messageId,
237
+ subject: parsed.subject,
238
+ from: senderEmail,
239
+ to: parsed.to,
240
+ cc: parsed.cc,
241
+ inReplyTo: parsed.inReplyTo,
242
+ references: parsed.references,
243
+ isCC,
244
+ senderVerified: parsed.senderVerified,
245
+ },
246
+ timestamp: parsed.date ? new Date(parsed.date).getTime() : Date.now(),
247
+ };
248
+ },
249
+
250
+ async sendResponse(
251
+ message: OutgoingMessage,
252
+ context: IncomingMessage,
253
+ ): Promise<void | PlatformDeliveryReceipt> {
254
+ const agentAddress = await resolveSecret("EMAIL_AGENT_ADDRESS");
255
+ if (!agentAddress) {
256
+ console.error("[email] EMAIL_AGENT_ADDRESS not configured");
257
+ return;
258
+ }
259
+
260
+ const config = await getIntegrationConfig("email");
261
+ const displayName =
262
+ (config?.configData?.displayName as string) || "Dispatch Agent";
263
+
264
+ // EMAIL_FROM overrides the from-address — required when the receiving
265
+ // address is on a sub-domain that can't be a verified sender (e.g.
266
+ // *.resend.app). Inbound and outbound addresses can differ.
267
+ const emailFrom = await resolveSecret("EMAIL_FROM");
268
+ const fromAddress = emailFrom || `${displayName} <${agentAddress}>`;
269
+
270
+ const subject = context.platformContext.subject as string;
271
+ const reSubject = subject.startsWith("Re: ") ? subject : `Re: ${subject}`;
272
+
273
+ try {
274
+ await sendEmail({
275
+ to: context.senderId!,
276
+ from: fromAddress,
277
+ subject: reSubject,
278
+ html: message.text,
279
+ text: stripHtmlForPlainText(message.text),
280
+ inReplyTo: context.platformContext.messageId as string,
281
+ references: buildReferencesHeader(context.platformContext),
282
+ cc: context.platformContext.isCC
283
+ ? buildReplyAllCc(context, agentAddress)
284
+ : undefined,
285
+ });
286
+ } catch (err) {
287
+ console.error("[email] Failed to send response:", err);
288
+ throw err;
289
+ }
290
+ return { status: "delivered" };
291
+ },
292
+
293
+ async sendMessageToTarget(
294
+ message: OutgoingMessage,
295
+ target: OutboundTarget,
296
+ ): Promise<void> {
297
+ const agentAddress = await resolveSecret("EMAIL_AGENT_ADDRESS");
298
+ if (!agentAddress) {
299
+ console.error("[email] EMAIL_AGENT_ADDRESS not configured");
300
+ return;
301
+ }
302
+
303
+ const config = await getIntegrationConfig("email");
304
+ const displayName =
305
+ (config?.configData?.displayName as string) || "Dispatch Agent";
306
+
307
+ try {
308
+ await sendEmail({
309
+ to: target.destination,
310
+ from: `${displayName} <${agentAddress}>`,
311
+ subject: target.label || "Message from Dispatch Agent",
312
+ html: message.text,
313
+ text: stripHtmlForPlainText(message.text),
314
+ ...(target.threadRef
315
+ ? {
316
+ inReplyTo: target.threadRef,
317
+ references: target.threadRef,
318
+ }
319
+ : {}),
320
+ });
321
+ } catch (err) {
322
+ console.error("[email] Failed to send proactive message:", err);
323
+ throw err;
324
+ }
325
+ },
326
+
327
+ formatAgentResponse(text: string): OutgoingMessage {
328
+ const bodyHtml = markdownToHtml(text);
329
+ const html = wrapInEmailTemplate(bodyHtml);
330
+ return { text: html, platformContext: {} };
331
+ },
332
+
333
+ async getStatus(_baseUrl?: string): Promise<IntegrationStatus> {
334
+ const hasAgentAddress = !!(await resolveSecret("EMAIL_AGENT_ADDRESS"));
335
+ const hasEmailProvider = await isEmailConfigured();
336
+ const hasWebhookSecret = !!(await resolveSecret(
337
+ "EMAIL_INBOUND_WEBHOOK_SECRET",
338
+ ));
339
+ const configured = hasAgentAddress && hasEmailProvider;
340
+
341
+ return {
342
+ platform: "email",
343
+ label: "Email",
344
+ enabled: false, // overridden by plugin
345
+ configured,
346
+ details: {
347
+ hasAgentAddress,
348
+ hasEmailProvider,
349
+ hasWebhookSecret,
350
+ provider: await getEmailProvider(),
351
+ },
352
+ error: !configured
353
+ ? "Save EMAIL_AGENT_ADDRESS and either RESEND_API_KEY or SENDGRID_API_KEY in settings"
354
+ : undefined,
355
+ };
356
+ },
357
+ };
358
+ }
359
+
360
+ // ---------------------------------------------------------------------------
361
+ // Parsed email shape
362
+ // ---------------------------------------------------------------------------
363
+
364
+ interface ParsedEmail {
365
+ messageId: string;
366
+ subject: string;
367
+ from: { name?: string; email: string };
368
+ to: string[];
369
+ cc?: string[];
370
+ text?: string;
371
+ html?: string;
372
+ inReplyTo?: string;
373
+ references?: string[];
374
+ date?: string;
375
+ /**
376
+ * True when the provider's message-authentication results show that the
377
+ * mail genuinely originated from the From domain: DKIM `pass` aligned with
378
+ * the From domain, or an aligned SPF `pass`. False when results are absent
379
+ * or fail — we fail closed so a spoofed `From:` can never be treated as
380
+ * verified. See FINDING 3 (inbound-email impersonation) in the webhook
381
+ * security audit.
382
+ */
383
+ senderVerified: boolean;
384
+ }
385
+
386
+ // ---------------------------------------------------------------------------
387
+ // Webhook verification
388
+ // ---------------------------------------------------------------------------
389
+
390
+ async function verifyResendWebhook(
391
+ event: H3Event,
392
+ secret?: string,
393
+ ): Promise<boolean> {
394
+ if (!secret) {
395
+ if (shouldRefuseWhenSecretMissing()) {
396
+ if (!_resendUnverifiedWarned) {
397
+ _resendUnverifiedWarned = true;
398
+ console.error(
399
+ "[email] EMAIL_INBOUND_WEBHOOK_SECRET not set — refusing Resend webhook in production. " +
400
+ "Set EMAIL_INBOUND_WEBHOOK_SECRET, or set AGENT_NATIVE_ALLOW_UNVERIFIED_WEBHOOKS=1 for local testing only.",
401
+ );
402
+ }
403
+ return false;
404
+ }
405
+ if (!_resendUnverifiedWarned) {
406
+ _resendUnverifiedWarned = true;
407
+ console.warn(
408
+ "[email] EMAIL_INBOUND_WEBHOOK_SECRET not set — accepting Resend webhook without verification (dev mode)",
409
+ );
410
+ }
411
+ return true;
412
+ }
413
+
414
+ const svixId = getHeader(event, "svix-id");
415
+ const svixTimestamp = getHeader(event, "svix-timestamp");
416
+ const svixSignature = getHeader(event, "svix-signature");
417
+
418
+ if (!svixId || !svixTimestamp || !svixSignature) {
419
+ console.warn("[email] Missing Svix signature headers");
420
+ return false;
421
+ }
422
+
423
+ // Reject requests older than 5 minutes (replay protection)
424
+ const ts = parseInt(svixTimestamp, 10);
425
+ if (Math.abs(Date.now() / 1000 - ts) > 300) {
426
+ console.warn("[email] Svix timestamp too old, rejecting");
427
+ return false;
428
+ }
429
+
430
+ const body = await readRawBody(event);
431
+ const crypto = await import("node:crypto");
432
+
433
+ // Svix signing secret may be prefixed with "whsec_"
434
+ const rawSecret = secret.startsWith("whsec_") ? secret.slice(6) : secret;
435
+ const secretBytes = Buffer.from(rawSecret, "base64");
436
+
437
+ const signedContent = `${svixId}.${svixTimestamp}.${body}`;
438
+ const expectedSignature = crypto
439
+ .createHmac("sha256", secretBytes)
440
+ .update(signedContent)
441
+ .digest("base64");
442
+
443
+ // Svix sends multiple signatures separated by spaces, each prefixed with "v1,"
444
+ const signatures = svixSignature.split(" ");
445
+ for (const sig of signatures) {
446
+ const sigValue = sig.startsWith("v1,") ? sig.slice(3) : sig;
447
+ try {
448
+ if (
449
+ crypto.timingSafeEqual(
450
+ Buffer.from(expectedSignature),
451
+ Buffer.from(sigValue),
452
+ )
453
+ ) {
454
+ return true;
455
+ }
456
+ } catch {
457
+ // Length mismatch — try next signature
458
+ }
459
+ }
460
+
461
+ console.warn("[email] Svix signature verification failed");
462
+ return false;
463
+ }
464
+
465
+ function safeEq(a: string, b: string): boolean {
466
+ const aBuf = Buffer.from(a);
467
+ const bBuf = Buffer.from(b);
468
+ if (aBuf.length !== bBuf.length) return false;
469
+ return timingSafeEqual(aBuf, bBuf);
470
+ }
471
+
472
+ async function verifySendGridWebhook(
473
+ event: H3Event,
474
+ secret?: string,
475
+ ): Promise<boolean> {
476
+ if (!secret) {
477
+ if (shouldRefuseWhenSecretMissing()) {
478
+ if (!_sendgridUnverifiedWarned) {
479
+ _sendgridUnverifiedWarned = true;
480
+ console.error(
481
+ "[email] EMAIL_INBOUND_WEBHOOK_SECRET not set — refusing SendGrid webhook in production. " +
482
+ "Set EMAIL_INBOUND_WEBHOOK_SECRET, or set AGENT_NATIVE_ALLOW_UNVERIFIED_WEBHOOKS=1 for local testing only.",
483
+ );
484
+ }
485
+ return false;
486
+ }
487
+ if (!_sendgridUnverifiedWarned) {
488
+ _sendgridUnverifiedWarned = true;
489
+ console.warn(
490
+ "[email] EMAIL_INBOUND_WEBHOOK_SECRET not set — accepting SendGrid webhook without verification (dev mode)",
491
+ );
492
+ }
493
+ return true;
494
+ }
495
+
496
+ // Check for the secret in a custom header or basic auth
497
+ const authHeader = getHeader(event, "authorization");
498
+ if (authHeader) {
499
+ // Basic auth: "Basic base64(user:pass)" — secret is the password
500
+ if (authHeader.startsWith("Basic ")) {
501
+ const decoded = Buffer.from(authHeader.slice(6), "base64").toString();
502
+ const password = decoded.split(":")[1];
503
+ if (password !== undefined && safeEq(password, secret)) return true;
504
+ }
505
+ }
506
+
507
+ // Also check a custom header (common SendGrid Inbound Parse pattern)
508
+ const customSecret = getHeader(event, "x-webhook-secret");
509
+ if (customSecret !== undefined && safeEq(customSecret, secret)) return true;
510
+
511
+ console.warn("[email] SendGrid webhook secret verification failed");
512
+ return false;
513
+ }
514
+
515
+ // ---------------------------------------------------------------------------
516
+ // Inbound email parsing
517
+ // ---------------------------------------------------------------------------
518
+
519
+ async function parseResendWebhook(event: H3Event): Promise<ParsedEmail | null> {
520
+ const raw = await readRawBody(event);
521
+ const body = JSON.parse(raw);
522
+ if (!body || body.type !== "email.received") return null;
523
+
524
+ const data = body.data;
525
+ if (!data) return null;
526
+
527
+ // Resend webhook payload provides email metadata directly in data
528
+ // Fields: from, to, cc, subject, text, html, headers, created_at
529
+ const fromRaw = data.from as string | undefined;
530
+ const from = fromRaw ? parseEmailAddress(fromRaw) : null;
531
+ if (!from) return null;
532
+
533
+ const toRaw = data.to as string | string[] | undefined;
534
+ const to = normalizeAddressList(toRaw);
535
+ const ccRaw = data.cc as string | string[] | undefined;
536
+ const cc = normalizeAddressList(ccRaw);
537
+
538
+ // Parse headers for Message-ID, In-Reply-To, References
539
+ const headers = parseHeadersObject(data.headers);
540
+ const messageId =
541
+ headers["message-id"] || data.email_id || `resend-${Date.now()}`;
542
+
543
+ // Resend forwards the raw `Authentication-Results` header (and may also
544
+ // surface explicit `dkim`/`spf` fields). Derive a verified verdict from
545
+ // whichever is present; absent results fail closed (unverified).
546
+ const senderVerified = computeSenderVerified({
547
+ fromEmail: from.email,
548
+ authResults: headers["authentication-results"],
549
+ dkim: typeof data.dkim === "string" ? data.dkim : undefined,
550
+ spf: typeof data.spf === "string" ? data.spf : undefined,
551
+ });
552
+
553
+ return {
554
+ messageId,
555
+ subject: (data.subject as string) || "(no subject)",
556
+ from,
557
+ to,
558
+ cc: cc.length > 0 ? cc : undefined,
559
+ text: data.text as string | undefined,
560
+ html: data.html as string | undefined,
561
+ inReplyTo: headers["in-reply-to"] || undefined,
562
+ references: parseReferencesHeader(headers["references"]),
563
+ date: (data.created_at as string) || undefined,
564
+ senderVerified,
565
+ };
566
+ }
567
+
568
+ async function parseSendGridWebhook(
569
+ event: H3Event,
570
+ ): Promise<ParsedEmail | null> {
571
+ const raw = await readRawBody(event);
572
+ const body = JSON.parse(raw);
573
+ if (!body) return null;
574
+
575
+ // SendGrid Inbound Parse sends form data with fields:
576
+ // from, to, cc, subject, text, html, headers, envelope
577
+ const fromRaw = body.from as string | undefined;
578
+ const from = fromRaw ? parseEmailAddress(fromRaw) : null;
579
+ if (!from) return null;
580
+
581
+ const toRaw = body.to as string | undefined;
582
+ const to = toRaw ? toRaw.split(",").map((a: string) => a.trim()) : [];
583
+ const ccRaw = body.cc as string | undefined;
584
+ const cc = ccRaw ? ccRaw.split(",").map((a: string) => a.trim()) : [];
585
+
586
+ // Parse raw headers string
587
+ const headersStr = body.headers as string | undefined;
588
+ const headers = parseHeadersString(headersStr);
589
+ const messageId = headers["message-id"] || `sendgrid-${Date.now()}`;
590
+
591
+ // SendGrid Inbound Parse posts explicit `dkim` (e.g. `{@example.com : pass}`)
592
+ // and `SPF` (e.g. `pass`) form fields, and also carries
593
+ // `Authentication-Results` inside the raw headers blob. Use all available
594
+ // signals; absent results fail closed (unverified).
595
+ const senderVerified = computeSenderVerified({
596
+ fromEmail: from.email,
597
+ authResults: headers["authentication-results"],
598
+ dkim: typeof body.dkim === "string" ? body.dkim : undefined,
599
+ spf: typeof body.SPF === "string" ? body.SPF : undefined,
600
+ });
601
+
602
+ return {
603
+ messageId,
604
+ subject: (body.subject as string) || "(no subject)",
605
+ from,
606
+ to,
607
+ cc: cc.length > 0 ? cc : undefined,
608
+ text: body.text as string | undefined,
609
+ html: body.html as string | undefined,
610
+ inReplyTo: headers["in-reply-to"] || undefined,
611
+ references: parseReferencesHeader(headers["references"]),
612
+ date: headers["date"] || undefined,
613
+ senderVerified,
614
+ };
615
+ }
616
+
617
+ // ---------------------------------------------------------------------------
618
+ // Helpers — sender authentication (DKIM / SPF)
619
+ // ---------------------------------------------------------------------------
620
+
621
+ /**
622
+ * Extract the registrable-ish domain from an email address (lowercased).
623
+ * We keep the full host rather than collapsing to an eTLD+1 — exact-domain
624
+ * alignment is the conservative choice here, and avoids bundling a public
625
+ * suffix list. Subdomain senders that legitimately DKIM-sign with the parent
626
+ * domain are handled by the suffix check in `domainsAlign`.
627
+ */
628
+ function emailDomain(email: string): string {
629
+ const at = email.lastIndexOf("@");
630
+ return at >= 0
631
+ ? email
632
+ .slice(at + 1)
633
+ .trim()
634
+ .toLowerCase()
635
+ : "";
636
+ }
637
+
638
+ /**
639
+ * True when `signingDomain` is the From domain or a parent of it (e.g.
640
+ * From `user@mail.example.com` aligned with a `d=example.com` signature).
641
+ * Both directions of subdomain nesting are accepted because senders sign
642
+ * with either the exact From host or the organizational parent.
643
+ */
644
+ function domainsAlign(fromDomain: string, signingDomain: string): boolean {
645
+ if (!fromDomain || !signingDomain) return false;
646
+ if (fromDomain === signingDomain) return true;
647
+ return (
648
+ fromDomain.endsWith(`.${signingDomain}`) ||
649
+ signingDomain.endsWith(`.${fromDomain}`)
650
+ );
651
+ }
652
+
653
+ /**
654
+ * Compute whether an inbound email is authenticated as genuinely coming from
655
+ * its `From:` domain. Returns true only when DKIM passes for an aligned
656
+ * domain, or SPF passes for an aligned domain. Anything else — missing
657
+ * results, `fail`, `softfail`, `none`, `neutral`, `temperror`, `permerror`
658
+ * — returns false (fail closed).
659
+ *
660
+ * Inputs may come from provider-specific fields (`dkim`, `spf`) and/or the
661
+ * RFC 8601 `Authentication-Results` header, in any combination. We treat the
662
+ * union: if ANY source shows an aligned pass, the sender is verified.
663
+ */
664
+ function computeSenderVerified(input: {
665
+ fromEmail: string;
666
+ authResults?: string;
667
+ dkim?: string;
668
+ spf?: string;
669
+ }): boolean {
670
+ const fromDomain = emailDomain(input.fromEmail);
671
+ if (!fromDomain) return false;
672
+
673
+ // 1. Provider DKIM field, e.g. SendGrid `{@example.com : pass}` or
674
+ // `{@example.com : pass; @other.com : fail}`.
675
+ if (input.dkim) {
676
+ const dkimEntries = input.dkim.matchAll(
677
+ /@([a-z0-9.-]+)\s*:\s*(pass|fail|none|neutral|softfail|temperror|permerror)/gi,
678
+ );
679
+ for (const m of dkimEntries) {
680
+ const domain = m[1].toLowerCase();
681
+ const verdict = m[2].toLowerCase();
682
+ if (verdict === "pass" && domainsAlign(fromDomain, domain)) return true;
683
+ }
684
+ }
685
+
686
+ // 2. Provider SPF field. SendGrid posts a bare verdict (e.g. `pass`); since
687
+ // SPF authenticates the envelope/MailFrom rather than the header From,
688
+ // a bare `pass` with no domain only counts when we can't tell it's
689
+ // misaligned. We accept a bare `pass` as an aligned SPF pass — this is
690
+ // the same trust level Gmail-style routing assigns to a plain SPF pass.
691
+ if (input.spf) {
692
+ const spfVerdict = input.spf.trim().toLowerCase();
693
+ if (spfVerdict === "pass") return true;
694
+ }
695
+
696
+ // 3. RFC 8601 `Authentication-Results` header (may list multiple methods).
697
+ if (input.authResults) {
698
+ const ar = input.authResults.toLowerCase();
699
+ // DKIM with an aligned domain.
700
+ const dkimRe = /dkim=pass[^;]*?(?:header\.(?:d|i)=|@)([a-z0-9.-]+)/g;
701
+ for (const m of ar.matchAll(dkimRe)) {
702
+ const domain = m[1].replace(/^@/, "");
703
+ if (domainsAlign(fromDomain, domain)) return true;
704
+ }
705
+ // SPF pass (envelope auth) — accept as an aligned pass.
706
+ if (/spf=pass\b/.test(ar)) return true;
707
+ }
708
+
709
+ return false;
710
+ }
711
+
712
+ // ---------------------------------------------------------------------------
713
+ // Rate limiting
714
+ // ---------------------------------------------------------------------------
715
+
716
+ /**
717
+ * Rate-limit heuristic backed by the `integration_pending_tasks` queue.
718
+ *
719
+ * Counts how many tasks this sender has produced in the last hour. The count
720
+ * INCLUDES tasks already processed (status = completed/failed) because the
721
+ * rows aren't deleted on completion — that's enough signal to throttle a
722
+ * single noisy/abusive sender without needing a dedicated counter table.
723
+ *
724
+ * Two trade-offs worth knowing:
725
+ * - This is a coarse heuristic, not exact metering. Within one hour the
726
+ * count is correct; rows produced more than an hour ago naturally drop
727
+ * off. We don't try to be precise, only to raise the bar past the
728
+ * "send 10K emails through one Lambda burst" failure mode.
729
+ * - The query relies on the `idx_pending_tasks_status_created` index plus
730
+ * a sender substring match. A targeted attacker could amortise the cost
731
+ * by reusing one sender address — that's fine, the goal here is to bound
732
+ * the attack within a single attacker identity, not to detect spoofing.
733
+ *
734
+ * If the table doesn't yet exist on this deployment (no inbound webhook has
735
+ * been processed before), we silently allow the message — the schema is
736
+ * provisioned on first task insert. See H4 in the webhook security audit.
737
+ */
738
+ async function isRateLimited(senderEmail: string): Promise<boolean> {
739
+ const cutoff = Date.now() - RATE_LIMIT_WINDOW_MS;
740
+ try {
741
+ const client = getDbExec();
742
+ const { rows } = await client.execute({
743
+ sql: `
744
+ SELECT COUNT(*) AS c
745
+ FROM integration_pending_tasks
746
+ WHERE platform = ?
747
+ AND created_at >= ?
748
+ AND payload LIKE ? ESCAPE '!'
749
+ `,
750
+ args: ["email", cutoff, `%"senderId":"${escapeLike(senderEmail)}"%`],
751
+ });
752
+ const count = Number(
753
+ (rows[0] as Record<string, unknown> | undefined)?.c ?? 0,
754
+ );
755
+ return count >= RATE_LIMIT_MAX;
756
+ } catch {
757
+ // Table doesn't exist yet (first webhook on a fresh deployment) — allow.
758
+ return false;
759
+ }
760
+ }
761
+
762
+ // ---------------------------------------------------------------------------
763
+ // Helpers — email address parsing
764
+ // ---------------------------------------------------------------------------
765
+
766
+ /** Parse "Name <addr@example.com>" or plain "addr@example.com" */
767
+ function parseEmailAddress(raw: string): { name?: string; email: string } {
768
+ const match = raw.match(/^\s*(.*?)\s*<([^>]+)>\s*$/);
769
+ if (match && match[2]) {
770
+ return {
771
+ name: match[1].replace(/^["']|["']$/g, "").trim() || undefined,
772
+ email: match[2].trim(),
773
+ };
774
+ }
775
+ return { email: raw.trim() };
776
+ }
777
+
778
+ /** Normalize a to/cc field that may be a string, array, or undefined into a string[] of addresses */
779
+ function normalizeAddressList(raw: string | string[] | undefined): string[] {
780
+ if (!raw) return [];
781
+ if (Array.isArray(raw)) return raw.map((a) => a.trim());
782
+ return raw.split(",").map((a) => a.trim());
783
+ }
784
+
785
+ // ---------------------------------------------------------------------------
786
+ // Helpers — header parsing
787
+ // ---------------------------------------------------------------------------
788
+
789
+ /** Parse a headers object (Resend format: array of {name, value} or Record) */
790
+ function parseHeadersObject(headers: unknown): Record<string, string> {
791
+ const result: Record<string, string> = {};
792
+ if (!headers) return result;
793
+
794
+ if (Array.isArray(headers)) {
795
+ for (const h of headers) {
796
+ if (h && typeof h === "object" && "name" in h && "value" in h) {
797
+ result[(h.name as string).toLowerCase()] = h.value as string;
798
+ }
799
+ }
800
+ } else if (typeof headers === "object") {
801
+ for (const [key, value] of Object.entries(
802
+ headers as Record<string, unknown>,
803
+ )) {
804
+ result[key.toLowerCase()] = String(value);
805
+ }
806
+ }
807
+ return result;
808
+ }
809
+
810
+ /** Parse a raw headers string (SendGrid format: "Key: Value\nKey: Value\n...") */
811
+ function parseHeadersString(raw: string | undefined): Record<string, string> {
812
+ const result: Record<string, string> = {};
813
+ if (!raw) return result;
814
+
815
+ const lines = raw.split(/\r?\n/);
816
+ let currentKey = "";
817
+ let currentValue = "";
818
+
819
+ for (const line of lines) {
820
+ // Continuation line (starts with whitespace)
821
+ if (/^\s/.test(line) && currentKey) {
822
+ currentValue += " " + line.trim();
823
+ continue;
824
+ }
825
+ // Save previous header
826
+ if (currentKey) {
827
+ result[currentKey.toLowerCase()] = currentValue;
828
+ }
829
+ const colonIdx = line.indexOf(":");
830
+ if (colonIdx > 0) {
831
+ currentKey = line.slice(0, colonIdx).trim();
832
+ currentValue = line.slice(colonIdx + 1).trim();
833
+ } else {
834
+ currentKey = "";
835
+ currentValue = "";
836
+ }
837
+ }
838
+ // Save last header
839
+ if (currentKey) {
840
+ result[currentKey.toLowerCase()] = currentValue;
841
+ }
842
+ return result;
843
+ }
844
+
845
+ /** Parse a References header value into an array of Message-IDs */
846
+ function parseReferencesHeader(
847
+ references: string | undefined,
848
+ ): string[] | undefined {
849
+ if (!references) return undefined;
850
+ const ids = references.match(/<[^>]+>/g);
851
+ return ids && ids.length > 0 ? ids : undefined;
852
+ }
853
+
854
+ // ---------------------------------------------------------------------------
855
+ // Helpers — threading
856
+ // ---------------------------------------------------------------------------
857
+
858
+ /**
859
+ * Get the thread root ID using a Gmail-style approach:
860
+ * the oldest Message-ID from the References chain is the thread root.
861
+ * If no References, use the current Message-ID.
862
+ */
863
+ function getThreadRootId(messageId: string, references?: string[]): string {
864
+ if (references && references.length > 0) {
865
+ return references[0];
866
+ }
867
+ return messageId;
868
+ }
869
+
870
+ /**
871
+ * Scope a raw thread root id by the sender's email address. Two different
872
+ * senders crafting the same `References:` header value should NOT collide
873
+ * onto the same internal thread mapping — that's the email-side fix for the
874
+ * thread-injection finding (M1 in the webhook security audit).
875
+ *
876
+ * The returned id is opaque to callers and stays stable across messages
877
+ * from the same sender on the same conversation thread, so reply behaviour
878
+ * is unchanged.
879
+ */
880
+ function scopeThreadIdToSender(
881
+ rawThreadId: string,
882
+ senderEmail: string,
883
+ ): string {
884
+ return `${senderEmail.toLowerCase()}::${rawThreadId}`;
885
+ }
886
+
887
+ // ---------------------------------------------------------------------------
888
+ // Helpers — reply building
889
+ // ---------------------------------------------------------------------------
890
+
891
+ /** Build a References header from the platform context */
892
+ function buildReferencesHeader(ctx: Record<string, unknown>): string {
893
+ const parts: string[] = [];
894
+
895
+ // Include existing references
896
+ const refs = ctx.references as string[] | undefined;
897
+ if (refs) {
898
+ parts.push(...refs);
899
+ }
900
+
901
+ // Append the current message ID
902
+ const messageId = ctx.messageId as string | undefined;
903
+ if (messageId) {
904
+ // Avoid duplicates
905
+ if (!parts.includes(messageId)) {
906
+ parts.push(messageId);
907
+ }
908
+ }
909
+
910
+ return parts.join(" ");
911
+ }
912
+
913
+ /**
914
+ * Build CC list for reply-all when agent was CC'd.
915
+ * Include original To addresses and other CC addresses, excluding the agent and the original sender.
916
+ */
917
+ function buildReplyAllCc(
918
+ context: IncomingMessage,
919
+ agentAddress: string,
920
+ ): string[] | undefined {
921
+ const normalizedAgentAddress = agentAddress.toLowerCase();
922
+ const senderEmail = context.senderId?.toLowerCase();
923
+ const toAddresses = (context.platformContext.to as string[]) || [];
924
+ const ccAddresses = (context.platformContext.cc as string[]) || [];
925
+
926
+ const allRecipients = new Set<string>();
927
+ for (const addr of [...toAddresses, ...ccAddresses]) {
928
+ const normalized = addr.toLowerCase().trim();
929
+ // Exclude agent address and original sender (sender goes in To)
930
+ if (normalized !== normalizedAgentAddress && normalized !== senderEmail) {
931
+ allRecipients.add(normalized);
932
+ }
933
+ }
934
+
935
+ return allRecipients.size > 0 ? Array.from(allRecipients) : undefined;
936
+ }
937
+
938
+ // ---------------------------------------------------------------------------
939
+ // Helpers — text conversion
940
+ // ---------------------------------------------------------------------------
941
+
942
+ /** Strip HTML tags for a plain-text version of the email */
943
+ function stripHtmlForPlainText(html: string): string {
944
+ return html
945
+ .replace(/<br\s*\/?>/gi, "\n")
946
+ .replace(/<\/p>/gi, "\n\n")
947
+ .replace(/<\/div>/gi, "\n")
948
+ .replace(/<\/li>/gi, "\n")
949
+ .replace(/<li[^>]*>/gi, "- ")
950
+ .replace(/<\/h[1-6]>/gi, "\n\n")
951
+ .replace(/<[^>]+>/g, "")
952
+ .replace(/&nbsp;/g, " ")
953
+ .replace(/&amp;/g, "&")
954
+ .replace(/&lt;/g, "<")
955
+ .replace(/&gt;/g, ">")
956
+ .replace(/&quot;/g, '"')
957
+ .replace(/&#39;/g, "'")
958
+ .replace(/\n{3,}/g, "\n\n")
959
+ .trim();
960
+ }
961
+
962
+ function escapeHtml(s: string): string {
963
+ return s
964
+ .replace(/&/g, "&amp;")
965
+ .replace(/</g, "&lt;")
966
+ .replace(/>/g, "&gt;")
967
+ .replace(/"/g, "&quot;")
968
+ .replace(/'/g, "&#39;");
969
+ }
970
+
971
+ function decodeBasicHtmlEntities(s: string): string {
972
+ return s
973
+ .replace(/&amp;/g, "&")
974
+ .replace(/&lt;/g, "<")
975
+ .replace(/&gt;/g, ">")
976
+ .replace(/&quot;/g, '"')
977
+ .replace(/&#39;/g, "'");
978
+ }
979
+
980
+ function splitTrailingUrlPunctuation(raw: string): {
981
+ url: string;
982
+ trailing: string;
983
+ } {
984
+ let url = raw;
985
+ let trailing = "";
986
+ const trailingEntities = ["&quot;", "&#39;"];
987
+
988
+ for (;;) {
989
+ const entity = trailingEntities.find((candidate) =>
990
+ url.endsWith(candidate),
991
+ );
992
+ if (!entity) break;
993
+ url = url.slice(0, -entity.length);
994
+ trailing = entity + trailing;
995
+ }
996
+
997
+ while (/[.,!?;:]$/.test(url)) {
998
+ trailing = url.slice(-1) + trailing;
999
+ url = url.slice(0, -1);
1000
+ }
1001
+
1002
+ while (url.endsWith(")") && !url.includes("(")) {
1003
+ trailing = ")" + trailing;
1004
+ url = url.slice(0, -1);
1005
+ }
1006
+
1007
+ return { url, trailing };
1008
+ }
1009
+
1010
+ function labelForUrl(rawUrl: string): string {
1011
+ try {
1012
+ const parsed = new URL(decodeBasicHtmlEntities(rawUrl));
1013
+ const host = parsed.hostname.replace(/^www\./, "");
1014
+ return host ? `Open ${host}` : "Open link";
1015
+ } catch {
1016
+ return "Open link";
1017
+ }
1018
+ }
1019
+
1020
+ function linkifyTextSegment(segment: string): string {
1021
+ return segment.replace(/\bhttps?:\/\/[^\s<>"']+/gi, (raw) => {
1022
+ const { url, trailing } = splitTrailingUrlPunctuation(raw);
1023
+ const href = decodeBasicHtmlEntities(url);
1024
+ return `<a href="${escapeHtml(href)}" style="color:#2563eb;text-decoration:underline;">${escapeHtml(
1025
+ labelForUrl(url),
1026
+ )}</a>${trailing}`;
1027
+ });
1028
+ }
1029
+
1030
+ function linkifyBareUrlsInHtml(html: string): string {
1031
+ const parts = html.split(/(<\/?[^>]+>)/g);
1032
+ let skipDepth = 0;
1033
+
1034
+ return parts
1035
+ .map((part) => {
1036
+ if (part.startsWith("<") && part.endsWith(">")) {
1037
+ if (/^<\/\s*(a|code)\b/i.test(part)) {
1038
+ skipDepth = Math.max(0, skipDepth - 1);
1039
+ } else if (/^<\s*(a|code)\b/i.test(part)) {
1040
+ skipDepth += 1;
1041
+ }
1042
+ return part;
1043
+ }
1044
+ return skipDepth > 0 ? part : linkifyTextSegment(part);
1045
+ })
1046
+ .join("");
1047
+ }
1048
+
1049
+ /** Convert basic markdown to HTML for email rendering */
1050
+ function markdownToHtml(md: string): string {
1051
+ let html = md;
1052
+
1053
+ // Escape HTML entities in the source (but not our generated tags)
1054
+ html = escapeHtml(html);
1055
+
1056
+ // Bold: **text** or __text__
1057
+ html = html.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
1058
+ html = html.replace(/__(.+?)__/g, "<strong>$1</strong>");
1059
+
1060
+ // Italic: *text* or _text_ (but not inside words with underscores)
1061
+ html = html.replace(/(?<!\w)\*([^*]+?)\*(?!\w)/g, "<em>$1</em>");
1062
+ html = html.replace(/(?<!\w)_([^_]+?)_(?!\w)/g, "<em>$1</em>");
1063
+
1064
+ // Links: [text](url)
1065
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_match, label, url) => {
1066
+ const visibleLabel = /^https?:\/\//i.test(decodeBasicHtmlEntities(label))
1067
+ ? escapeHtml(labelForUrl(label))
1068
+ : label;
1069
+ return `<a href="${escapeHtml(
1070
+ decodeBasicHtmlEntities(url),
1071
+ )}" style="color:#2563eb;text-decoration:underline;">${visibleLabel}</a>`;
1072
+ });
1073
+
1074
+ // Inline code: `code`
1075
+ html = html.replace(
1076
+ /`([^`]+)`/g,
1077
+ '<code style="background:#f1f5f9;padding:1px 4px;border-radius:3px;font-size:0.9em;">$1</code>',
1078
+ );
1079
+
1080
+ // Bare URLs: keep the destination in href but avoid spelling long URLs out.
1081
+ html = linkifyBareUrlsInHtml(html);
1082
+
1083
+ // Unordered lists: lines starting with "- " or "* "
1084
+ html = html.replace(/^([*-]) (.+)$/gm, "<li>$2</li>");
1085
+ // Wrap consecutive <li> in <ul>
1086
+ html = html.replace(
1087
+ /(<li>.*?<\/li>\n?)+/g,
1088
+ '<ul style="margin:8px 0;padding-left:20px;">$&</ul>',
1089
+ );
1090
+
1091
+ // Ordered lists: lines starting with "1. ", "2. " etc.
1092
+ html = html.replace(/^\d+\. (.+)$/gm, "<li>$1</li>");
1093
+ // Wrap consecutive <li> that aren't in <ul> in <ol>
1094
+ html = html.replace(/(?<!<\/ul>)(<li>.*?<\/li>\n?)+/g, (match) => {
1095
+ if (match.includes("<ul")) return match;
1096
+ return `<ol style="margin:8px 0;padding-left:20px;">${match}</ol>`;
1097
+ });
1098
+
1099
+ // Headings: # through ###
1100
+ html = html.replace(
1101
+ /^### (.+)$/gm,
1102
+ '<h3 style="margin:16px 0 8px;font-size:1.1em;">$1</h3>',
1103
+ );
1104
+ html = html.replace(
1105
+ /^## (.+)$/gm,
1106
+ '<h2 style="margin:16px 0 8px;font-size:1.25em;">$1</h2>',
1107
+ );
1108
+ html = html.replace(
1109
+ /^# (.+)$/gm,
1110
+ '<h1 style="margin:16px 0 8px;font-size:1.4em;">$1</h1>',
1111
+ );
1112
+
1113
+ // Horizontal rules: --- or ***
1114
+ html = html.replace(
1115
+ /^(-{3,}|\*{3,})$/gm,
1116
+ '<hr style="border:none;border-top:1px solid #e2e8f0;margin:16px 0;">',
1117
+ );
1118
+
1119
+ // Paragraphs: double newlines
1120
+ html = html.replace(/\n\n/g, "</p><p>");
1121
+ // Single newlines → <br>
1122
+ html = html.replace(/\n/g, "<br>");
1123
+
1124
+ // Wrap in paragraph tags
1125
+ html = `<p>${html}</p>`;
1126
+ // Clean up empty paragraphs
1127
+ html = html.replace(/<p>\s*<\/p>/g, "");
1128
+
1129
+ return html;
1130
+ }
1131
+
1132
+ /** Wrap body HTML in a minimal email template with inline styles */
1133
+ function wrapInEmailTemplate(bodyHtml: string): string {
1134
+ return `<!DOCTYPE html>
1135
+ <html>
1136
+ <head>
1137
+ <meta charset="utf-8">
1138
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
1139
+ </head>
1140
+ <body style="margin:0;padding:0;background-color:#ffffff;">
1141
+ <div style="max-width:600px;margin:0 auto;padding:20px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.6;color:#1a1a1a;">
1142
+ ${bodyHtml}
1143
+ </div>
1144
+ </body>
1145
+ </html>`;
1146
+ }
1147
+
1148
+ // ---------------------------------------------------------------------------
1149
+ // Raw body reader (matches Slack adapter pattern)
1150
+ // ---------------------------------------------------------------------------
1151
+
1152
+ /**
1153
+ * Read the raw request body as a string and cache on the event context.
1154
+ * Reads raw bytes from the request stream — never re-stringifies a parsed
1155
+ * body, since the Resend / Svix HMAC is computed over the exact bytes sent
1156
+ * (M2 in the webhook security audit).
1157
+ */
1158
+ async function readRawBody(event: H3Event): Promise<string> {
1159
+ const cached = event.context.__rawBody;
1160
+ if (typeof cached === "string") return cached;
1161
+ const raw = (await h3ReadRawBody(event)) ?? "";
1162
+ event.context.__rawBody = raw;
1163
+ return raw;
1164
+ }