@agent-native/core 0.112.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 (1902) hide show
  1. package/agent-native.eject.json +164 -0
  2. package/corpus/README.md +4 -2
  3. package/corpus/core/CHANGELOG.md +33 -0
  4. package/corpus/core/README.md +61 -174
  5. package/corpus/core/agent-native.eject.json +164 -0
  6. package/corpus/core/docs/AGENTS.md +7 -0
  7. package/corpus/core/docs/content/agent-native-toolkit.mdx +38 -0
  8. package/corpus/core/docs/content/integrations.mdx +63 -2
  9. package/corpus/core/docs/content/package-lifecycle.mdx +54 -4
  10. package/corpus/core/docs/design/provider-integration-authority.md +117 -0
  11. package/corpus/core/package.json +20 -2
  12. package/corpus/core/scripts/materialize-source-corpus.mjs +9 -2
  13. package/corpus/core/src/cli/atomic-json-file.ts +324 -0
  14. package/corpus/core/src/cli/claude-code-participant.ts +515 -0
  15. package/corpus/core/src/cli/code-agent-executor.ts +18 -10
  16. package/corpus/core/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  17. package/corpus/core/src/cli/code-agent-runs.ts +55 -62
  18. package/corpus/core/src/cli/codex-cli-participant.ts +496 -0
  19. package/corpus/core/src/cli/eject.ts +1594 -0
  20. package/corpus/core/src/cli/index.ts +16 -0
  21. package/corpus/core/src/cli/multi-frontier-runs.ts +1246 -135
  22. package/corpus/core/src/client/chat/ChatHistoryList.tsx +7 -404
  23. package/corpus/core/src/client/index.ts +4 -0
  24. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +8 -2
  25. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +7 -2
  26. package/corpus/core/src/client/resources/ResourcesPanel.tsx +17 -3
  27. package/corpus/core/src/client/resources/index.ts +19 -0
  28. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +9 -1
  29. package/corpus/core/src/client/resources/runtime.ts +1 -0
  30. package/corpus/core/src/client/setup-connections/catalog.ts +6 -0
  31. package/corpus/core/src/client/setup-connections/index.ts +1 -0
  32. package/corpus/core/src/client/setup-connections/runtime.ts +1 -0
  33. package/corpus/core/src/connections/catalog.ts +41 -24
  34. package/corpus/core/src/connections/index.ts +1 -0
  35. package/corpus/core/src/connections/runtime.ts +1 -0
  36. package/corpus/core/src/eject/provider-api-definitions.ts +193 -0
  37. package/corpus/core/src/eject/remote-mcp-presets.ts +137 -0
  38. package/corpus/core/src/eject/setup-readiness-ui.tsx +29 -0
  39. package/corpus/core/src/eject/workspace-connections.ts +92 -0
  40. package/corpus/core/src/index.ts +1 -0
  41. package/corpus/core/src/integrations/adapter-overrides.ts +12 -0
  42. package/corpus/core/src/integrations/eject/messaging-adapters.ts +85 -0
  43. package/corpus/core/src/integrations/index.ts +15 -1
  44. package/corpus/core/src/integrations/plugin.ts +34 -12
  45. package/corpus/core/src/integrations/runtime.ts +1 -0
  46. package/corpus/core/src/integrations/slack-oauth.ts +1 -0
  47. package/corpus/core/src/integrations/types.ts +3 -1
  48. package/corpus/core/src/integrations/webhook-delivery.ts +55 -0
  49. package/corpus/core/src/notifications/channels.ts +4 -10
  50. package/corpus/core/src/package-lifecycle/eject-manifest.ts +345 -0
  51. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  52. package/corpus/core/src/provider-api/actions/custom-provider-registration.ts +197 -0
  53. package/corpus/core/src/provider-api/actions/delete-staged-dataset.ts +3 -42
  54. package/corpus/core/src/provider-api/actions/list-staged-datasets.ts +3 -45
  55. package/corpus/core/src/provider-api/actions/provider-api-audit.ts +88 -0
  56. package/corpus/core/src/provider-api/actions/provider-api.ts +460 -0
  57. package/corpus/core/src/provider-api/actions/query-staged-dataset.ts +3 -140
  58. package/corpus/core/src/provider-api/actions/staged-datasets.ts +359 -0
  59. package/corpus/core/src/provider-api/gong.ts +108 -0
  60. package/corpus/core/src/provider-api/index.ts +46 -12
  61. package/corpus/core/src/provider-api/runtime.ts +1 -0
  62. package/corpus/core/src/scripts/docs/source-search.ts +2 -1
  63. package/corpus/core/src/server/google-oauth-credentials.ts +80 -3
  64. package/corpus/core/src/server/index.ts +6 -0
  65. package/corpus/core/src/setup-connections/index.ts +1 -0
  66. package/corpus/core/src/shared/merge-by-id.ts +14 -0
  67. package/corpus/core/src/styles/chat-history-list.css +1 -313
  68. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +32 -12
  69. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +21 -9
  70. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  71. package/corpus/core/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +323 -0
  72. package/corpus/core/src/templates/default/.agents/skills/onboarding/SKILL.md +56 -0
  73. package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +273 -0
  74. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +14 -2
  75. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  76. package/corpus/core/src/templates/default/AGENTS.md +26 -18
  77. package/corpus/core/src/templates/headless/.agents/skills/actions/SKILL.md +512 -0
  78. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +21 -9
  79. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  80. package/corpus/core/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +323 -0
  81. package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +273 -0
  82. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  83. package/corpus/core/src/templates/headless/AGENTS.md +8 -0
  84. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -12
  85. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +21 -9
  86. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +7 -0
  87. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  88. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +14 -2
  89. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  90. package/corpus/core/src/templates/workspace-core/AGENTS.md +4 -0
  91. package/corpus/core/src/templates/workspace-root/AGENTS.md +4 -0
  92. package/corpus/core/src/vite/client.ts +25 -2
  93. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +32 -12
  94. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  95. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +14 -2
  96. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  97. package/corpus/templates/analytics/actions/delete-staged-dataset.ts +3 -23
  98. package/corpus/templates/analytics/actions/list-staged-datasets.ts +3 -27
  99. package/corpus/templates/analytics/actions/provider-api-catalog.ts +16 -19
  100. package/corpus/templates/analytics/actions/provider-api-docs.ts +3 -5
  101. package/corpus/templates/analytics/actions/provider-api-request.ts +162 -185
  102. package/corpus/templates/analytics/actions/query-staged-dataset.ts +3 -47
  103. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +52 -161
  104. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +32 -12
  105. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  106. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +14 -2
  107. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  108. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +63 -160
  109. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +32 -12
  110. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  111. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +14 -2
  112. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  113. package/corpus/templates/brain/actions/_schemas.ts +13 -7
  114. package/corpus/templates/brain/actions/delete-staged-dataset.ts +3 -24
  115. package/corpus/templates/brain/actions/list-staged-datasets.ts +3 -28
  116. package/corpus/templates/brain/actions/provider-api-catalog.ts +5 -11
  117. package/corpus/templates/brain/actions/provider-api-docs.ts +3 -5
  118. package/corpus/templates/brain/actions/provider-api-request.ts +3 -37
  119. package/corpus/templates/brain/actions/query-staged-dataset.ts +3 -48
  120. package/corpus/templates/brain/actions/remediate-legacy-capture-audiences.ts +167 -0
  121. package/corpus/templates/brain/actions/update-source.ts +5 -1
  122. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +48 -154
  123. package/corpus/templates/brain/app/lib/brain-chat-readiness.ts +6 -0
  124. package/corpus/templates/brain/app/lib/brain.ts +55 -0
  125. package/corpus/templates/brain/app/lib/ingest-handoff.ts +35 -0
  126. package/corpus/templates/brain/app/routes/_index.tsx +8 -0
  127. package/corpus/templates/brain/app/routes.ts +1 -0
  128. package/corpus/templates/brain/changelog/2026-07-19-ask-starts-immediately-when-builder-s-managed-ai-connection-.md +6 -0
  129. package/corpus/templates/brain/changelog/2026-07-19-slack-and-granola-backfills-now-process-captures-concurrentl.md +6 -0
  130. package/corpus/templates/brain/changelog/2026-07-19-slack-backfills-can-now-join-configured-public-channels-befo.md +6 -0
  131. package/corpus/templates/brain/changelog/2026-07-19-slack-backfills-now-continue-across-the-configured-number-of.md +6 -0
  132. package/corpus/templates/brain/changelog/2026-07-19-slack-backfills-now-start-with-a-safe-four-week-window-and-r.md +6 -0
  133. package/corpus/templates/brain/changelog/2026-07-19-source-review-settings-now-control-knowledge-approval.md +6 -0
  134. package/corpus/templates/brain/changelog/2026-07-19-the-manage-agent-page-now-opens-correctly-from-brain-navigat.md +6 -0
  135. package/corpus/templates/brain/server/db/schema.ts +3 -0
  136. package/corpus/templates/brain/server/lib/brain.ts +41 -2
  137. package/corpus/templates/brain/server/lib/connectors.ts +432 -115
  138. package/corpus/templates/brain/server/lib/meeting-audience.ts +38 -0
  139. package/corpus/templates/brain/server/lib/slack-channel-membership.ts +44 -0
  140. package/corpus/templates/brain/server/plugins/db.ts +10 -0
  141. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +6 -4
  142. package/corpus/templates/brain/shared/slack-source-config.ts +60 -0
  143. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +32 -12
  144. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  145. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +14 -2
  146. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  147. package/corpus/templates/calendar/actions/delete-staged-dataset.ts +3 -24
  148. package/corpus/templates/calendar/actions/list-staged-datasets.ts +3 -28
  149. package/corpus/templates/calendar/actions/provider-api-catalog.ts +5 -11
  150. package/corpus/templates/calendar/actions/provider-api-docs.ts +3 -5
  151. package/corpus/templates/calendar/actions/provider-api-request.ts +3 -37
  152. package/corpus/templates/calendar/actions/query-staged-dataset.ts +3 -48
  153. package/corpus/templates/calendar/server/handlers/gong.ts +6 -61
  154. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -8
  155. package/corpus/templates/calendar/server/lib/google-calendar.ts +7 -45
  156. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +32 -12
  157. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +21 -9
  158. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  159. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +14 -2
  160. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  161. package/corpus/templates/chat/AGENTS.md +6 -2
  162. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +51 -157
  163. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +32 -12
  164. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  165. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +14 -2
  166. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  167. package/corpus/templates/clips/AGENTS.md +11 -0
  168. package/corpus/templates/clips/actions/export-to-brain.ts +505 -171
  169. package/corpus/templates/clips/changelog/2026-07-19-ready-clips-transcripts-can-be-backfilled-to-brain-for-a-bou.md +6 -0
  170. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +1 -1
  171. package/corpus/templates/clips/server/lib/google-calendar-client.ts +12 -22
  172. package/corpus/templates/clips/server/lib/google-calendar-oauth.ts +9 -6
  173. package/corpus/templates/clips/server/lib/slack-oauth.ts +12 -47
  174. package/corpus/templates/clips/server/routes/_agent-native/google/auth-url.get.ts +2 -6
  175. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +4 -4
  176. package/corpus/templates/content/.agents/skills/actions/SKILL.md +32 -12
  177. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  178. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +14 -2
  179. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  180. package/corpus/templates/content/actions/delete-staged-dataset.ts +3 -24
  181. package/corpus/templates/content/actions/list-staged-datasets.ts +3 -28
  182. package/corpus/templates/content/actions/provider-api-catalog.ts +5 -11
  183. package/corpus/templates/content/actions/provider-api-docs.ts +3 -5
  184. package/corpus/templates/content/actions/provider-api-request.ts +3 -37
  185. package/corpus/templates/content/actions/query-staged-dataset.ts +3 -48
  186. package/corpus/templates/design/.agents/skills/actions/SKILL.md +32 -12
  187. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  188. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +14 -2
  189. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  190. package/corpus/templates/design/actions/delete-staged-dataset.ts +4 -23
  191. package/corpus/templates/design/actions/list-staged-datasets.ts +4 -27
  192. package/corpus/templates/design/actions/provider-api-catalog.ts +15 -18
  193. package/corpus/templates/design/actions/provider-api-docs.ts +57 -48
  194. package/corpus/templates/design/actions/provider-api-request.ts +140 -164
  195. package/corpus/templates/design/actions/query-staged-dataset.ts +4 -47
  196. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +32 -12
  197. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  198. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +14 -2
  199. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  200. package/corpus/templates/dispatch/actions/delete-staged-dataset.ts +4 -23
  201. package/corpus/templates/dispatch/actions/list-staged-datasets.ts +4 -30
  202. package/corpus/templates/dispatch/actions/provider-api-catalog.ts +15 -18
  203. package/corpus/templates/dispatch/actions/provider-api-docs.ts +57 -48
  204. package/corpus/templates/dispatch/actions/provider-api-request.ts +138 -163
  205. package/corpus/templates/dispatch/actions/query-staged-dataset.ts +4 -47
  206. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +32 -12
  207. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  208. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +14 -2
  209. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  210. package/corpus/templates/forms/server/lib/integrations.ts +23 -22
  211. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  212. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  213. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +32 -12
  214. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  215. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +14 -2
  216. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  217. package/corpus/templates/mail/actions/delete-staged-dataset.ts +4 -23
  218. package/corpus/templates/mail/actions/list-staged-datasets.ts +4 -27
  219. package/corpus/templates/mail/actions/provider-api-catalog.ts +15 -18
  220. package/corpus/templates/mail/actions/provider-api-docs.ts +57 -48
  221. package/corpus/templates/mail/actions/provider-api-request.ts +146 -173
  222. package/corpus/templates/mail/actions/query-staged-dataset.ts +4 -47
  223. package/corpus/templates/mail/server/handlers/gong.ts +6 -61
  224. package/corpus/templates/mail/server/lib/google-auth.ts +10 -13
  225. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +32 -12
  226. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  227. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +14 -2
  228. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  229. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +47 -156
  230. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +32 -12
  231. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  232. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +14 -2
  233. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  234. package/corpus/templates/slides/actions/delete-staged-dataset.ts +4 -23
  235. package/corpus/templates/slides/actions/list-staged-datasets.ts +4 -27
  236. package/corpus/templates/slides/actions/provider-api-catalog.ts +15 -18
  237. package/corpus/templates/slides/actions/provider-api-docs.ts +57 -48
  238. package/corpus/templates/slides/actions/provider-api-request.ts +145 -172
  239. package/corpus/templates/slides/actions/query-staged-dataset.ts +4 -47
  240. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +11 -36
  241. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +32 -12
  242. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +21 -9
  243. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  244. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +14 -2
  245. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  246. package/corpus/toolkit/CHANGELOG.md +131 -0
  247. package/corpus/toolkit/README.md +60 -0
  248. package/corpus/toolkit/agent-native.eject.json +411 -0
  249. package/corpus/toolkit/export-snapshot.json +35 -0
  250. package/corpus/toolkit/migration-manifest.json +4 -0
  251. package/corpus/toolkit/package.json +284 -0
  252. package/corpus/toolkit/scripts/finalize-build.mjs +55 -0
  253. package/corpus/toolkit/src/app-shell/header-actions.tsx +84 -0
  254. package/corpus/toolkit/src/app-shell/index.ts +1 -0
  255. package/corpus/toolkit/src/chat-history/ChatHistoryList.tsx +469 -0
  256. package/corpus/toolkit/src/chat-history/index.ts +7 -0
  257. package/corpus/toolkit/src/chat-history.css +314 -0
  258. package/corpus/toolkit/src/collab-ui/AgentPresenceChip.tsx +69 -0
  259. package/corpus/toolkit/src/collab-ui/LiveCursorOverlay.tsx +241 -0
  260. package/corpus/toolkit/src/collab-ui/PresenceBar.tsx +346 -0
  261. package/corpus/toolkit/src/collab-ui/RecentEditHighlights.tsx +225 -0
  262. package/corpus/toolkit/src/collab-ui/RemoteSelectionRings.tsx +227 -0
  263. package/corpus/toolkit/src/collab-ui/agent-identity.ts +16 -0
  264. package/corpus/toolkit/src/collab-ui/index.ts +39 -0
  265. package/corpus/toolkit/src/collab-ui/lead-client.ts +32 -0
  266. package/corpus/toolkit/src/collab-ui/types.ts +96 -0
  267. package/corpus/toolkit/src/composer/AgentComposerFrame.tsx +59 -0
  268. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +983 -0
  269. package/corpus/toolkit/src/composer/MentionPopover.tsx +412 -0
  270. package/corpus/toolkit/src/composer/PastedTextChip.tsx +150 -0
  271. package/corpus/toolkit/src/composer/PromptComposer.tsx +718 -0
  272. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +856 -0
  273. package/corpus/toolkit/src/composer/TiptapComposer.tsx +2936 -0
  274. package/corpus/toolkit/src/composer/VoiceButton.tsx +255 -0
  275. package/corpus/toolkit/src/composer/asset-picker-url.ts +80 -0
  276. package/corpus/toolkit/src/composer/attachment-accept.ts +71 -0
  277. package/corpus/toolkit/src/composer/draft-key.ts +7 -0
  278. package/corpus/toolkit/src/composer/extensions/FileReference.tsx +55 -0
  279. package/corpus/toolkit/src/composer/extensions/MentionReference.tsx +93 -0
  280. package/corpus/toolkit/src/composer/extensions/SkillReference.tsx +56 -0
  281. package/corpus/toolkit/src/composer/index.ts +79 -0
  282. package/corpus/toolkit/src/composer/pasted-text.ts +160 -0
  283. package/corpus/toolkit/src/composer/prompt-attachments.ts +93 -0
  284. package/corpus/toolkit/src/composer/realtime-voice-audio-level.ts +64 -0
  285. package/corpus/toolkit/src/composer/realtime-voice-transcript.ts +134 -0
  286. package/corpus/toolkit/src/composer/runtime-adapters.tsx +343 -0
  287. package/corpus/toolkit/src/composer/types.ts +66 -0
  288. package/corpus/toolkit/src/composer/use-file-search.ts +64 -0
  289. package/corpus/toolkit/src/composer/use-mention-search.ts +90 -0
  290. package/corpus/toolkit/src/composer/use-skills.ts +45 -0
  291. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +2117 -0
  292. package/corpus/toolkit/src/composer/useVoiceDictation.ts +1191 -0
  293. package/corpus/toolkit/src/context-ui/ContextMeter.tsx +101 -0
  294. package/corpus/toolkit/src/context-ui/ContextSegmentRow.tsx +184 -0
  295. package/corpus/toolkit/src/context-ui/ContextTreemap.tsx +125 -0
  296. package/corpus/toolkit/src/context-ui/ContextXRayPanel.tsx +377 -0
  297. package/corpus/toolkit/src/context-ui/format.ts +42 -0
  298. package/corpus/toolkit/src/context-ui/index.ts +15 -0
  299. package/corpus/toolkit/src/context-ui/types.ts +43 -0
  300. package/corpus/toolkit/src/design-tweaks/index.ts +1 -0
  301. package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +1084 -0
  302. package/corpus/toolkit/src/editor/BubbleToolbar.tsx +253 -0
  303. package/corpus/toolkit/src/editor/CodeBlockNode.tsx +254 -0
  304. package/corpus/toolkit/src/editor/DragHandle.ts +1437 -0
  305. package/corpus/toolkit/src/editor/ImageExtension.ts +306 -0
  306. package/corpus/toolkit/src/editor/RegistryBlockContext.tsx +107 -0
  307. package/corpus/toolkit/src/editor/RegistryBlockNode.tsx +652 -0
  308. package/corpus/toolkit/src/editor/RichMarkdownEditor.tsx +81 -0
  309. package/corpus/toolkit/src/editor/RunId.ts +61 -0
  310. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +321 -0
  311. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +310 -0
  312. package/corpus/toolkit/src/editor/extensions.ts +402 -0
  313. package/corpus/toolkit/src/editor/gfmDoc.ts +92 -0
  314. package/corpus/toolkit/src/editor/index.ts +93 -0
  315. package/corpus/toolkit/src/editor/registrySlashCommands.ts +131 -0
  316. package/corpus/toolkit/src/editor/surgical-apply.ts +192 -0
  317. package/corpus/toolkit/src/editor/useCollabReconcile.ts +589 -0
  318. package/corpus/toolkit/src/editor.css +510 -0
  319. package/corpus/toolkit/src/hooks/index.ts +2 -0
  320. package/corpus/toolkit/src/hooks/use-mobile.tsx +21 -0
  321. package/corpus/toolkit/src/hooks/use-toast.ts +188 -0
  322. package/corpus/toolkit/src/index.ts +8 -0
  323. package/corpus/toolkit/src/onboarding/index.ts +1 -0
  324. package/corpus/toolkit/src/provider.tsx +47 -0
  325. package/corpus/toolkit/src/sharing/VisibilityBadge.tsx +37 -0
  326. package/corpus/toolkit/src/sharing/index.ts +4 -0
  327. package/corpus/toolkit/src/styles.css +21 -0
  328. package/corpus/toolkit/src/ui/accordion.tsx +56 -0
  329. package/corpus/toolkit/src/ui/alert-dialog.tsx +141 -0
  330. package/corpus/toolkit/src/ui/alert.tsx +59 -0
  331. package/corpus/toolkit/src/ui/aspect-ratio.tsx +5 -0
  332. package/corpus/toolkit/src/ui/avatar.tsx +48 -0
  333. package/corpus/toolkit/src/ui/badge.tsx +37 -0
  334. package/corpus/toolkit/src/ui/breadcrumb.tsx +115 -0
  335. package/corpus/toolkit/src/ui/button.tsx +78 -0
  336. package/corpus/toolkit/src/ui/calendar.tsx +214 -0
  337. package/corpus/toolkit/src/ui/card.tsx +86 -0
  338. package/corpus/toolkit/src/ui/carousel.tsx +260 -0
  339. package/corpus/toolkit/src/ui/chart.tsx +375 -0
  340. package/corpus/toolkit/src/ui/checkbox.tsx +28 -0
  341. package/corpus/toolkit/src/ui/collapsible.tsx +9 -0
  342. package/corpus/toolkit/src/ui/command.tsx +174 -0
  343. package/corpus/toolkit/src/ui/context-menu.tsx +202 -0
  344. package/corpus/toolkit/src/ui/date-picker.tsx +64 -0
  345. package/corpus/toolkit/src/ui/dialog.tsx +146 -0
  346. package/corpus/toolkit/src/ui/drawer.tsx +126 -0
  347. package/corpus/toolkit/src/ui/dropdown-menu.tsx +218 -0
  348. package/corpus/toolkit/src/ui/form.tsx +177 -0
  349. package/corpus/toolkit/src/ui/hover-card.tsx +27 -0
  350. package/corpus/toolkit/src/ui/index.ts +52 -0
  351. package/corpus/toolkit/src/ui/input-otp.tsx +69 -0
  352. package/corpus/toolkit/src/ui/input.tsx +22 -0
  353. package/corpus/toolkit/src/ui/label.tsx +24 -0
  354. package/corpus/toolkit/src/ui/logo.tsx +36 -0
  355. package/corpus/toolkit/src/ui/menubar.tsx +235 -0
  356. package/corpus/toolkit/src/ui/navigation-menu.tsx +128 -0
  357. package/corpus/toolkit/src/ui/pagination.tsx +121 -0
  358. package/corpus/toolkit/src/ui/popover.tsx +44 -0
  359. package/corpus/toolkit/src/ui/progress.tsx +26 -0
  360. package/corpus/toolkit/src/ui/radio-group.tsx +42 -0
  361. package/corpus/toolkit/src/ui/resizable.tsx +43 -0
  362. package/corpus/toolkit/src/ui/scroll-area.tsx +46 -0
  363. package/corpus/toolkit/src/ui/select.tsx +158 -0
  364. package/corpus/toolkit/src/ui/separator.tsx +29 -0
  365. package/corpus/toolkit/src/ui/sheet.tsx +160 -0
  366. package/corpus/toolkit/src/ui/sidebar.tsx +777 -0
  367. package/corpus/toolkit/src/ui/skeleton.tsx +18 -0
  368. package/corpus/toolkit/src/ui/slider.tsx +26 -0
  369. package/corpus/toolkit/src/ui/sonner.tsx +58 -0
  370. package/corpus/toolkit/src/ui/spinner.tsx +17 -0
  371. package/corpus/toolkit/src/ui/switch.tsx +27 -0
  372. package/corpus/toolkit/src/ui/table.tsx +117 -0
  373. package/corpus/toolkit/src/ui/tabs.tsx +53 -0
  374. package/corpus/toolkit/src/ui/textarea.tsx +23 -0
  375. package/corpus/toolkit/src/ui/toast.tsx +127 -0
  376. package/corpus/toolkit/src/ui/toaster.tsx +33 -0
  377. package/corpus/toolkit/src/ui/toggle-group.tsx +59 -0
  378. package/corpus/toolkit/src/ui/toggle.tsx +43 -0
  379. package/corpus/toolkit/src/ui/tooltip.tsx +53 -0
  380. package/corpus/toolkit/src/ui/use-toast.ts +3 -0
  381. package/corpus/toolkit/src/utils.ts +8 -0
  382. package/corpus/toolkit/tsconfig.json +23 -0
  383. package/dist/cli/atomic-json-file.d.ts +30 -0
  384. package/dist/cli/atomic-json-file.d.ts.map +1 -0
  385. package/dist/cli/atomic-json-file.js +240 -0
  386. package/dist/cli/atomic-json-file.js.map +1 -0
  387. package/dist/cli/claude-code-participant.d.ts +77 -0
  388. package/dist/cli/claude-code-participant.d.ts.map +1 -0
  389. package/dist/cli/claude-code-participant.js +355 -0
  390. package/dist/cli/claude-code-participant.js.map +1 -0
  391. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  392. package/dist/cli/code-agent-executor.js +18 -10
  393. package/dist/cli/code-agent-executor.js.map +1 -1
  394. package/dist/cli/code-agent-runs.concurrent-worker.d.ts +2 -0
  395. package/dist/cli/code-agent-runs.concurrent-worker.d.ts.map +1 -0
  396. package/dist/cli/code-agent-runs.concurrent-worker.js +32 -0
  397. package/dist/cli/code-agent-runs.concurrent-worker.js.map +1 -0
  398. package/dist/cli/code-agent-runs.d.ts.map +1 -1
  399. package/dist/cli/code-agent-runs.js +43 -56
  400. package/dist/cli/code-agent-runs.js.map +1 -1
  401. package/dist/cli/codex-cli-participant.d.ts +77 -0
  402. package/dist/cli/codex-cli-participant.d.ts.map +1 -0
  403. package/dist/cli/codex-cli-participant.js +354 -0
  404. package/dist/cli/codex-cli-participant.js.map +1 -0
  405. package/dist/cli/eject.d.ts +21 -0
  406. package/dist/cli/eject.d.ts.map +1 -0
  407. package/dist/cli/eject.js +1145 -0
  408. package/dist/cli/eject.js.map +1 -0
  409. package/dist/cli/index.js +15 -0
  410. package/dist/cli/index.js.map +1 -1
  411. package/dist/cli/multi-frontier-runs.d.ts +115 -0
  412. package/dist/cli/multi-frontier-runs.d.ts.map +1 -1
  413. package/dist/cli/multi-frontier-runs.js +831 -113
  414. package/dist/cli/multi-frontier-runs.js.map +1 -1
  415. package/dist/client/chat/ChatHistoryList.d.ts +1 -87
  416. package/dist/client/chat/ChatHistoryList.d.ts.map +1 -1
  417. package/dist/client/chat/ChatHistoryList.js +1 -82
  418. package/dist/client/chat/ChatHistoryList.js.map +1 -1
  419. package/dist/client/index.d.ts +1 -1
  420. package/dist/client/index.d.ts.map +1 -1
  421. package/dist/client/index.js +1 -1
  422. package/dist/client/index.js.map +1 -1
  423. package/dist/client/resources/McpConnectionSuggestion.d.ts +4 -3
  424. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  425. package/dist/client/resources/McpConnectionSuggestion.js +3 -3
  426. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  427. package/dist/client/resources/McpIntegrationDialog.d.ts +4 -3
  428. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  429. package/dist/client/resources/McpIntegrationDialog.js +2 -2
  430. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  431. package/dist/client/resources/ResourcesPanel.d.ts +4 -1
  432. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  433. package/dist/client/resources/ResourcesPanel.js +9 -7
  434. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  435. package/dist/client/resources/index.d.ts +3 -0
  436. package/dist/client/resources/index.d.ts.map +1 -1
  437. package/dist/client/resources/index.js +3 -0
  438. package/dist/client/resources/index.js.map +1 -1
  439. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -1
  440. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  441. package/dist/client/resources/mcp-integration-catalog.js +6 -2
  442. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  443. package/dist/client/resources/runtime.d.ts +2 -0
  444. package/dist/client/resources/runtime.d.ts.map +1 -0
  445. package/dist/client/resources/runtime.js +2 -0
  446. package/dist/client/resources/runtime.js.map +1 -0
  447. package/dist/client/setup-connections/catalog.d.ts +2 -0
  448. package/dist/client/setup-connections/catalog.d.ts.map +1 -0
  449. package/dist/client/setup-connections/catalog.js +7 -0
  450. package/dist/client/setup-connections/catalog.js.map +1 -0
  451. package/dist/client/setup-connections/index.d.ts +1 -0
  452. package/dist/client/setup-connections/index.d.ts.map +1 -1
  453. package/dist/client/setup-connections/index.js +1 -0
  454. package/dist/client/setup-connections/index.js.map +1 -1
  455. package/dist/client/setup-connections/runtime.d.ts +2 -0
  456. package/dist/client/setup-connections/runtime.d.ts.map +1 -0
  457. package/dist/client/setup-connections/runtime.js +2 -0
  458. package/dist/client/setup-connections/runtime.js.map +1 -0
  459. package/dist/collab/awareness.d.ts +2 -2
  460. package/dist/collab/awareness.d.ts.map +1 -1
  461. package/dist/collab/routes.d.ts +1 -1
  462. package/dist/connections/catalog.d.ts +5 -3
  463. package/dist/connections/catalog.d.ts.map +1 -1
  464. package/dist/connections/catalog.js +16 -8
  465. package/dist/connections/catalog.js.map +1 -1
  466. package/dist/connections/index.d.ts +1 -1
  467. package/dist/connections/index.d.ts.map +1 -1
  468. package/dist/connections/index.js +1 -1
  469. package/dist/connections/index.js.map +1 -1
  470. package/dist/connections/runtime.d.ts +2 -0
  471. package/dist/connections/runtime.d.ts.map +1 -0
  472. package/dist/connections/runtime.js +2 -0
  473. package/dist/connections/runtime.js.map +1 -0
  474. package/dist/eject/provider-api-definitions.d.ts +34 -0
  475. package/dist/eject/provider-api-definitions.d.ts.map +1 -0
  476. package/dist/eject/provider-api-definitions.js +88 -0
  477. package/dist/eject/provider-api-definitions.js.map +1 -0
  478. package/dist/eject/remote-mcp-presets.d.ts +17 -0
  479. package/dist/eject/remote-mcp-presets.d.ts.map +1 -0
  480. package/dist/eject/remote-mcp-presets.js +81 -0
  481. package/dist/eject/remote-mcp-presets.js.map +1 -0
  482. package/dist/eject/setup-readiness-ui.d.ts +7 -0
  483. package/dist/eject/setup-readiness-ui.d.ts.map +1 -0
  484. package/dist/eject/setup-readiness-ui.js +13 -0
  485. package/dist/eject/setup-readiness-ui.js.map +1 -0
  486. package/dist/eject/workspace-connections.d.ts +11 -0
  487. package/dist/eject/workspace-connections.d.ts.map +1 -0
  488. package/dist/eject/workspace-connections.js +47 -0
  489. package/dist/eject/workspace-connections.js.map +1 -0
  490. package/dist/index.d.ts +1 -1
  491. package/dist/index.d.ts.map +1 -1
  492. package/dist/index.js +1 -1
  493. package/dist/index.js.map +1 -1
  494. package/dist/integrations/adapter-overrides.d.ts +3 -0
  495. package/dist/integrations/adapter-overrides.d.ts.map +1 -0
  496. package/dist/integrations/adapter-overrides.js +7 -0
  497. package/dist/integrations/adapter-overrides.js.map +1 -0
  498. package/dist/integrations/eject/messaging-adapters.d.ts +12 -0
  499. package/dist/integrations/eject/messaging-adapters.d.ts.map +1 -0
  500. package/dist/integrations/eject/messaging-adapters.js +49 -0
  501. package/dist/integrations/eject/messaging-adapters.js.map +1 -0
  502. package/dist/integrations/index.d.ts +5 -3
  503. package/dist/integrations/index.d.ts.map +1 -1
  504. package/dist/integrations/index.js +4 -2
  505. package/dist/integrations/index.js.map +1 -1
  506. package/dist/integrations/plugin.d.ts +32 -1
  507. package/dist/integrations/plugin.d.ts.map +1 -1
  508. package/dist/integrations/plugin.js +19 -12
  509. package/dist/integrations/plugin.js.map +1 -1
  510. package/dist/integrations/runtime.d.ts +2 -0
  511. package/dist/integrations/runtime.d.ts.map +1 -0
  512. package/dist/integrations/runtime.js +2 -0
  513. package/dist/integrations/runtime.js.map +1 -0
  514. package/dist/integrations/slack-manifest.d.ts +1 -1
  515. package/dist/integrations/slack-oauth.d.ts +1 -1
  516. package/dist/integrations/slack-oauth.d.ts.map +1 -1
  517. package/dist/integrations/slack-oauth.js +1 -0
  518. package/dist/integrations/slack-oauth.js.map +1 -1
  519. package/dist/integrations/types.d.ts +3 -1
  520. package/dist/integrations/types.d.ts.map +1 -1
  521. package/dist/integrations/types.js.map +1 -1
  522. package/dist/integrations/webhook-delivery.d.ts +23 -0
  523. package/dist/integrations/webhook-delivery.d.ts.map +1 -0
  524. package/dist/integrations/webhook-delivery.js +32 -0
  525. package/dist/integrations/webhook-delivery.js.map +1 -0
  526. package/dist/notifications/channels.d.ts.map +1 -1
  527. package/dist/notifications/channels.js +4 -9
  528. package/dist/notifications/channels.js.map +1 -1
  529. package/dist/notifications/routes.d.ts +3 -3
  530. package/dist/package-lifecycle/eject-manifest.d.ts +43 -0
  531. package/dist/package-lifecycle/eject-manifest.d.ts.map +1 -0
  532. package/dist/package-lifecycle/eject-manifest.js +219 -0
  533. package/dist/package-lifecycle/eject-manifest.js.map +1 -0
  534. package/dist/package-lifecycle/index.d.ts +1 -0
  535. package/dist/package-lifecycle/index.d.ts.map +1 -1
  536. package/dist/package-lifecycle/index.js +1 -0
  537. package/dist/package-lifecycle/index.js.map +1 -1
  538. package/dist/progress/routes.d.ts +1 -1
  539. package/dist/provider-api/actions/custom-provider-registration.d.ts +136 -0
  540. package/dist/provider-api/actions/custom-provider-registration.d.ts.map +1 -0
  541. package/dist/provider-api/actions/custom-provider-registration.js +154 -0
  542. package/dist/provider-api/actions/custom-provider-registration.js.map +1 -0
  543. package/dist/provider-api/actions/delete-staged-dataset.d.ts +1 -1
  544. package/dist/provider-api/actions/delete-staged-dataset.d.ts.map +1 -1
  545. package/dist/provider-api/actions/delete-staged-dataset.js +3 -34
  546. package/dist/provider-api/actions/delete-staged-dataset.js.map +1 -1
  547. package/dist/provider-api/actions/list-staged-datasets.d.ts +2 -3
  548. package/dist/provider-api/actions/list-staged-datasets.d.ts.map +1 -1
  549. package/dist/provider-api/actions/list-staged-datasets.js +3 -40
  550. package/dist/provider-api/actions/list-staged-datasets.js.map +1 -1
  551. package/dist/provider-api/actions/provider-api-audit.d.ts +7 -0
  552. package/dist/provider-api/actions/provider-api-audit.d.ts.map +1 -0
  553. package/dist/provider-api/actions/provider-api-audit.js +74 -0
  554. package/dist/provider-api/actions/provider-api-audit.js.map +1 -0
  555. package/dist/provider-api/actions/provider-api.d.ts +370 -0
  556. package/dist/provider-api/actions/provider-api.d.ts.map +1 -0
  557. package/dist/provider-api/actions/provider-api.js +280 -0
  558. package/dist/provider-api/actions/provider-api.js.map +1 -0
  559. package/dist/provider-api/actions/query-staged-dataset.d.ts +1 -1
  560. package/dist/provider-api/actions/query-staged-dataset.d.ts.map +1 -1
  561. package/dist/provider-api/actions/query-staged-dataset.js +3 -116
  562. package/dist/provider-api/actions/query-staged-dataset.js.map +1 -1
  563. package/dist/provider-api/actions/staged-datasets.d.ts +190 -0
  564. package/dist/provider-api/actions/staged-datasets.d.ts.map +1 -0
  565. package/dist/provider-api/actions/staged-datasets.js +210 -0
  566. package/dist/provider-api/actions/staged-datasets.js.map +1 -0
  567. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  568. package/dist/provider-api/gong.d.ts +44 -0
  569. package/dist/provider-api/gong.d.ts.map +1 -0
  570. package/dist/provider-api/gong.js +56 -0
  571. package/dist/provider-api/gong.js.map +1 -0
  572. package/dist/provider-api/index.d.ts +6 -2
  573. package/dist/provider-api/index.d.ts.map +1 -1
  574. package/dist/provider-api/index.js +25 -12
  575. package/dist/provider-api/index.js.map +1 -1
  576. package/dist/provider-api/runtime.d.ts +2 -0
  577. package/dist/provider-api/runtime.d.ts.map +1 -0
  578. package/dist/provider-api/runtime.js +2 -0
  579. package/dist/provider-api/runtime.js.map +1 -0
  580. package/dist/scripts/docs/source-search.d.ts +2 -1
  581. package/dist/scripts/docs/source-search.d.ts.map +1 -1
  582. package/dist/scripts/docs/source-search.js +2 -1
  583. package/dist/scripts/docs/source-search.js.map +1 -1
  584. package/dist/secrets/routes.d.ts +9 -9
  585. package/dist/server/google-oauth-credentials.d.ts +35 -0
  586. package/dist/server/google-oauth-credentials.d.ts.map +1 -1
  587. package/dist/server/google-oauth-credentials.js +48 -2
  588. package/dist/server/google-oauth-credentials.js.map +1 -1
  589. package/dist/server/index.d.ts +1 -1
  590. package/dist/server/index.d.ts.map +1 -1
  591. package/dist/server/index.js +1 -1
  592. package/dist/server/index.js.map +1 -1
  593. package/dist/server/transcribe-voice.d.ts +1 -1
  594. package/dist/setup-connections/index.d.ts +1 -1
  595. package/dist/setup-connections/index.d.ts.map +1 -1
  596. package/dist/setup-connections/index.js +1 -1
  597. package/dist/setup-connections/index.js.map +1 -1
  598. package/dist/shared/merge-by-id.d.ts +5 -0
  599. package/dist/shared/merge-by-id.d.ts.map +1 -0
  600. package/dist/shared/merge-by-id.js +7 -0
  601. package/dist/shared/merge-by-id.js.map +1 -0
  602. package/dist/styles/chat-history-list.css +1 -313
  603. package/dist/templates/chat/.agents/skills/actions/SKILL.md +32 -12
  604. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +21 -9
  605. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  606. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +14 -2
  607. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  608. package/dist/templates/chat/AGENTS.md +6 -2
  609. package/dist/templates/chat/app/components/layout/Sidebar.tsx +51 -157
  610. package/dist/templates/default/.agents/skills/actions/SKILL.md +32 -12
  611. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +21 -9
  612. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  613. package/dist/templates/default/.agents/skills/integration-webhooks/SKILL.md +323 -0
  614. package/dist/templates/default/.agents/skills/onboarding/SKILL.md +56 -0
  615. package/dist/templates/default/.agents/skills/secrets/SKILL.md +273 -0
  616. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +14 -2
  617. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  618. package/dist/templates/default/AGENTS.md +26 -18
  619. package/dist/templates/headless/.agents/skills/actions/SKILL.md +512 -0
  620. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +21 -9
  621. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  622. package/dist/templates/headless/.agents/skills/integration-webhooks/SKILL.md +323 -0
  623. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +273 -0
  624. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  625. package/dist/templates/headless/AGENTS.md +8 -0
  626. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -12
  627. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +21 -9
  628. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +7 -0
  629. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  630. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +14 -2
  631. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  632. package/dist/templates/workspace-core/AGENTS.md +4 -0
  633. package/dist/templates/workspace-root/AGENTS.md +4 -0
  634. package/dist/vite/client.d.ts.map +1 -1
  635. package/dist/vite/client.js +22 -2
  636. package/dist/vite/client.js.map +1 -1
  637. package/docs/AGENTS.md +7 -0
  638. package/docs/content/agent-native-toolkit.mdx +38 -0
  639. package/docs/content/integrations.mdx +63 -2
  640. package/docs/content/package-lifecycle.mdx +54 -4
  641. package/docs/design/provider-integration-authority.md +117 -0
  642. package/package.json +20 -2
  643. package/src/a2a/agent-card.ts +83 -0
  644. package/src/a2a/artifact-response.ts +1648 -0
  645. package/src/a2a/auth-policy.ts +66 -0
  646. package/src/a2a/caller-auth.ts +102 -0
  647. package/src/a2a/client.ts +876 -0
  648. package/src/a2a/correlation.ts +50 -0
  649. package/src/a2a/handlers.ts +1285 -0
  650. package/src/a2a/index.ts +50 -0
  651. package/src/a2a/invoke.ts +348 -0
  652. package/src/a2a/response-text.ts +53 -0
  653. package/src/a2a/server.ts +586 -0
  654. package/src/a2a/task-store.ts +917 -0
  655. package/src/a2a/types.ts +221 -0
  656. package/src/a2a-claims.ts +52 -0
  657. package/src/action-change-marker.ts +74 -0
  658. package/src/action-ui.ts +38 -0
  659. package/src/action.ts +1406 -0
  660. package/src/adapters/cli/index.ts +6 -0
  661. package/src/adapters/cli/registry.ts +73 -0
  662. package/src/adapters/cli/shell-adapter.ts +92 -0
  663. package/src/adapters/cli/types.ts +27 -0
  664. package/src/agent/action-continuation-guidance.ts +38 -0
  665. package/src/agent/app-model-defaults.ts +201 -0
  666. package/src/agent/context-xray/actions/context-evict.ts +56 -0
  667. package/src/agent/context-xray/actions/context-manifest-get.ts +75 -0
  668. package/src/agent/context-xray/actions/context-pin.ts +56 -0
  669. package/src/agent/context-xray/actions/context-preview-get.ts +134 -0
  670. package/src/agent/context-xray/actions/context-report.ts +75 -0
  671. package/src/agent/context-xray/actions/context-restore.ts +51 -0
  672. package/src/agent/context-xray/actions/errors.ts +40 -0
  673. package/src/agent/context-xray/apply-directives.ts +137 -0
  674. package/src/agent/context-xray/directives-store.ts +178 -0
  675. package/src/agent/context-xray/identity.ts +37 -0
  676. package/src/agent/context-xray/manifest.ts +284 -0
  677. package/src/agent/context-xray/migrations.ts +32 -0
  678. package/src/agent/context-xray/plugin.ts +23 -0
  679. package/src/agent/context-xray/schema.ts +17 -0
  680. package/src/agent/context-xray/segments.ts +194 -0
  681. package/src/agent/context-xray/tokenize.ts +93 -0
  682. package/src/agent/default-model.ts +5 -0
  683. package/src/agent/durable-background.ts +547 -0
  684. package/src/agent/engine/ai-sdk-engine.ts +565 -0
  685. package/src/agent/engine/anthropic-engine.ts +320 -0
  686. package/src/agent/engine/builder-engine.ts +1110 -0
  687. package/src/agent/engine/builder-gateway-headers.ts +44 -0
  688. package/src/agent/engine/builtin.ts +122 -0
  689. package/src/agent/engine/context-directives-transform.ts +73 -0
  690. package/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  691. package/src/agent/engine/credential-errors.ts +69 -0
  692. package/src/agent/engine/index.ts +54 -0
  693. package/src/agent/engine/openai-compatible-endpoint.ts +25 -0
  694. package/src/agent/engine/output-tokens.ts +181 -0
  695. package/src/agent/engine/provider-env-vars.ts +69 -0
  696. package/src/agent/engine/registry.ts +853 -0
  697. package/src/agent/engine/tool-call-journal-seed.ts +85 -0
  698. package/src/agent/engine/translate-ai-sdk.ts +407 -0
  699. package/src/agent/engine/translate-anthropic.ts +611 -0
  700. package/src/agent/engine/types.ts +310 -0
  701. package/src/agent/harness/acp-adapter.ts +893 -0
  702. package/src/agent/harness/acp-builtin.ts +70 -0
  703. package/src/agent/harness/ai-sdk-adapter.ts +509 -0
  704. package/src/agent/harness/background.ts +365 -0
  705. package/src/agent/harness/builtin.ts +50 -0
  706. package/src/agent/harness/index.ts +86 -0
  707. package/src/agent/harness/lifecycle.ts +498 -0
  708. package/src/agent/harness/registry.ts +97 -0
  709. package/src/agent/harness/runner.ts +182 -0
  710. package/src/agent/harness/store.ts +466 -0
  711. package/src/agent/harness/translate.ts +130 -0
  712. package/src/agent/harness/types.ts +129 -0
  713. package/src/agent/index.ts +32 -0
  714. package/src/agent/loop-settings.ts +186 -0
  715. package/src/agent/model-config.ts +363 -0
  716. package/src/agent/observational-memory/compactor.ts +78 -0
  717. package/src/agent/observational-memory/config.ts +78 -0
  718. package/src/agent/observational-memory/index.ts +79 -0
  719. package/src/agent/observational-memory/internal-run.ts +89 -0
  720. package/src/agent/observational-memory/message-text.ts +49 -0
  721. package/src/agent/observational-memory/migrations.ts +44 -0
  722. package/src/agent/observational-memory/observer.ts +128 -0
  723. package/src/agent/observational-memory/plugin.ts +35 -0
  724. package/src/agent/observational-memory/prompts.ts +53 -0
  725. package/src/agent/observational-memory/read.ts +131 -0
  726. package/src/agent/observational-memory/reflector.ts +119 -0
  727. package/src/agent/observational-memory/schema.ts +48 -0
  728. package/src/agent/observational-memory/store.ts +275 -0
  729. package/src/agent/observational-memory/types.ts +65 -0
  730. package/src/agent/processors.ts +209 -0
  731. package/src/agent/production-agent.ts +8254 -0
  732. package/src/agent/run-loop-with-resume.ts +394 -0
  733. package/src/agent/run-manager.ts +1825 -0
  734. package/src/agent/run-ownership.ts +75 -0
  735. package/src/agent/run-store.ts +2601 -0
  736. package/src/agent/runtime-context.ts +169 -0
  737. package/src/agent/thread-data-builder.ts +1584 -0
  738. package/src/agent/tool-call-journal.ts +368 -0
  739. package/src/agent/tool-error-redaction.ts +52 -0
  740. package/src/agent/tool-result-images.ts +178 -0
  741. package/src/agent/tool-search.ts +376 -0
  742. package/src/agent/types.ts +372 -0
  743. package/src/agent-native/index.ts +198 -0
  744. package/src/agent-web/config.ts +253 -0
  745. package/src/agent-web/generator.ts +382 -0
  746. package/src/agent-web/index.ts +36 -0
  747. package/src/appearance/actions/change-appearance.ts +35 -0
  748. package/src/application-state/emitter.ts +81 -0
  749. package/src/application-state/handlers.ts +121 -0
  750. package/src/application-state/index.ts +44 -0
  751. package/src/application-state/script-helpers.ts +155 -0
  752. package/src/application-state/store.ts +274 -0
  753. package/src/assets/branding/agent-native.icon/Assets/background.svg +3 -0
  754. package/src/assets/branding/agent-native.icon/Assets/foreground.svg +12 -0
  755. package/src/assets/branding/agent-native.icon/icon.json +49 -0
  756. package/src/assets/branding/favicon.png +0 -0
  757. package/src/assets/branding/favicon.svg +1 -0
  758. package/src/assets/branding/icon-on-dark.svg +10 -0
  759. package/src/assets/branding/icon-on-light.svg +10 -0
  760. package/src/assets/branding/mac-app-icon.svg +1 -0
  761. package/src/assets/branding/slack-bot/agent-native-1024.png +0 -0
  762. package/src/assets/branding/slack-bot/agent-native-512.png +0 -0
  763. package/src/assets/branding/tray-icon.svg +6 -0
  764. package/src/assets/branding/wordmark-on-dark.svg +21 -0
  765. package/src/assets/branding/wordmark-on-light.svg +21 -0
  766. package/src/assets/fonts/LICENSE_LIBERATION +96 -0
  767. package/src/assets/fonts/LICENSE_NOTO_NASKH_ARABIC +93 -0
  768. package/src/assets/fonts/LiberationSans-Bold.ttf +0 -0
  769. package/src/assets/fonts/LiberationSans-Regular.ttf +0 -0
  770. package/src/assets/fonts/NotoNaskhArabic-Variable.ttf +0 -0
  771. package/src/audit/actions/export-audit-events.ts +162 -0
  772. package/src/audit/actions/get-audit-event.ts +24 -0
  773. package/src/audit/actions/list-audit-events.ts +66 -0
  774. package/src/audit/cleanup-job.ts +100 -0
  775. package/src/audit/config.ts +90 -0
  776. package/src/audit/index.ts +43 -0
  777. package/src/audit/record.ts +180 -0
  778. package/src/audit/redact.ts +109 -0
  779. package/src/audit/store.ts +346 -0
  780. package/src/audit/types.ts +141 -0
  781. package/src/automation/index.ts +802 -0
  782. package/src/brand-kit/brand-signals.ts +124 -0
  783. package/src/brand-kit/fig/index.ts +64 -0
  784. package/src/brand-kit/index.ts +72 -0
  785. package/src/brand-kit/types.ts +113 -0
  786. package/src/browser-sessions/actions.ts +302 -0
  787. package/src/browser-sessions/routes.ts +234 -0
  788. package/src/browser-sessions/store.ts +679 -0
  789. package/src/browser-sessions/types.ts +84 -0
  790. package/src/changelog/parse.ts +328 -0
  791. package/src/chat-threads/emitter.ts +22 -0
  792. package/src/chat-threads/schema.ts +43 -0
  793. package/src/chat-threads/store.ts +1311 -0
  794. package/src/checkpoints/index.ts +15 -0
  795. package/src/checkpoints/service.ts +142 -0
  796. package/src/checkpoints/store.ts +153 -0
  797. package/src/cli/add.ts +425 -0
  798. package/src/cli/agent.ts +424 -0
  799. package/src/cli/agents.ts +122 -0
  800. package/src/cli/app-skill.ts +1455 -0
  801. package/src/cli/atomic-json-file.ts +324 -0
  802. package/src/cli/audit-agent-web.ts +324 -0
  803. package/src/cli/changelog.ts +199 -0
  804. package/src/cli/claude-code-participant.ts +515 -0
  805. package/src/cli/code-agent-commands.ts +270 -0
  806. package/src/cli/code-agent-connector.ts +1109 -0
  807. package/src/cli/code-agent-executor.ts +1970 -0
  808. package/src/cli/code-agent-output-smoother.ts +140 -0
  809. package/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  810. package/src/cli/code-agent-runs.ts +548 -0
  811. package/src/cli/code.ts +1805 -0
  812. package/src/cli/codex-cli-participant.ts +496 -0
  813. package/src/cli/connect.ts +2714 -0
  814. package/src/cli/content-local.ts +442 -0
  815. package/src/cli/context-xray-local.ts +2193 -0
  816. package/src/cli/create-workspace.ts +30 -0
  817. package/src/cli/create.ts +2247 -0
  818. package/src/cli/deploy-build.ts +50 -0
  819. package/src/cli/design-connect.ts +3187 -0
  820. package/src/cli/doctor.ts +472 -0
  821. package/src/cli/eject.ts +1594 -0
  822. package/src/cli/eval.ts +134 -0
  823. package/src/cli/gateway-helpers.ts +70 -0
  824. package/src/cli/index.ts +1217 -0
  825. package/src/cli/info.ts +105 -0
  826. package/src/cli/invoke.ts +288 -0
  827. package/src/cli/mcp-config-writers.ts +857 -0
  828. package/src/cli/mcp.ts +594 -0
  829. package/src/cli/migrate.ts +1813 -0
  830. package/src/cli/migration-codemod.ts +646 -0
  831. package/src/cli/multi-frontier-runs.ts +1952 -0
  832. package/src/cli/package-lifecycle.ts +823 -0
  833. package/src/cli/plan-blocks.ts +143 -0
  834. package/src/cli/plan-local.ts +3189 -0
  835. package/src/cli/plan-publish-store.ts +138 -0
  836. package/src/cli/pr-visual-recap-workflow.ts +2 -0
  837. package/src/cli/recap.ts +5 -0
  838. package/src/cli/setup-agents.ts +120 -0
  839. package/src/cli/skills-content/assets-skill.ts +83 -0
  840. package/src/cli/skills-content/canvas.ts +153 -0
  841. package/src/cli/skills-content/connection.ts +52 -0
  842. package/src/cli/skills-content/content-skill.ts +120 -0
  843. package/src/cli/skills-content/design-exploration-skill.ts +118 -0
  844. package/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  845. package/src/cli/skills-content/document-quality.ts +196 -0
  846. package/src/cli/skills-content/exemplar.ts +69 -0
  847. package/src/cli/skills-content/help.ts +77 -0
  848. package/src/cli/skills-content/index.ts +22 -0
  849. package/src/cli/skills-content/local-files.ts +100 -0
  850. package/src/cli/skills-content/plan-setup-auth.ts +80 -0
  851. package/src/cli/skills-content/visual-plan-skill.ts +493 -0
  852. package/src/cli/skills-content/visual-recap-skill.ts +553 -0
  853. package/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  854. package/src/cli/skills-content/wireframe.ts +349 -0
  855. package/src/cli/skills.ts +4340 -0
  856. package/src/cli/sync-builder-starter-manifest.ts +631 -0
  857. package/src/cli/telemetry.ts +136 -0
  858. package/src/cli/templates-meta.ts +269 -0
  859. package/src/cli/upgrade.ts +956 -0
  860. package/src/cli/visualize-repo.ts +715 -0
  861. package/src/cli/workspace-dev.ts +1486 -0
  862. package/src/cli/workspacify.ts +258 -0
  863. package/src/client/AgentAskPopover.tsx +89 -0
  864. package/src/client/AgentChatHome.tsx +66 -0
  865. package/src/client/AgentNative.tsx +161 -0
  866. package/src/client/AgentNativeEmbedded.tsx +288 -0
  867. package/src/client/AgentNativeFrame.tsx +151 -0
  868. package/src/client/AgentPanel.tsx +3437 -0
  869. package/src/client/AgentTaskCard.tsx +273 -0
  870. package/src/client/AppearancePicker.tsx +79 -0
  871. package/src/client/AssistantChat.tsx +5793 -0
  872. package/src/client/ClientOnly.tsx +22 -0
  873. package/src/client/CommandMenu.tsx +726 -0
  874. package/src/client/ConnectBuilderCard.tsx +390 -0
  875. package/src/client/DefaultSpinner.tsx +47 -0
  876. package/src/client/ErrorBoundary.tsx +359 -0
  877. package/src/client/ErrorReportActions.tsx +69 -0
  878. package/src/client/FeedbackButton.tsx +553 -0
  879. package/src/client/HighlightedCodeBlock.tsx +173 -0
  880. package/src/client/IframeEmbed.tsx +151 -0
  881. package/src/client/KeepTabOpenNotice.tsx +181 -0
  882. package/src/client/MultiTabAssistantChat.tsx +2576 -0
  883. package/src/client/NewWorkspaceAppFlow.tsx +525 -0
  884. package/src/client/PoweredByBadge.tsx +284 -0
  885. package/src/client/RunStuckBanner.tsx +431 -0
  886. package/src/client/StarfieldBackground.tsx +466 -0
  887. package/src/client/Turnstile.tsx +125 -0
  888. package/src/client/active-run-state.ts +139 -0
  889. package/src/client/agent-chat/index.ts +279 -0
  890. package/src/client/agent-chat-adapter.ts +3692 -0
  891. package/src/client/agent-chat.ts +1233 -0
  892. package/src/client/agent-engine-key.ts +122 -0
  893. package/src/client/agent-page/AgentContextTab.tsx +487 -0
  894. package/src/client/agent-page/AgentEmptyState.tsx +44 -0
  895. package/src/client/agent-page/AgentJobsTab.tsx +441 -0
  896. package/src/client/agent-page/AgentTabFrame.tsx +39 -0
  897. package/src/client/agent-page/AgentTabsPage.tsx +1096 -0
  898. package/src/client/agent-page/types.ts +18 -0
  899. package/src/client/agent-page/use-jobs.ts +150 -0
  900. package/src/client/agent-sidebar-state.ts +166 -0
  901. package/src/client/analytics/index.ts +40 -0
  902. package/src/client/analytics-session.ts +70 -0
  903. package/src/client/analytics.ts +1757 -0
  904. package/src/client/api-path.ts +124 -0
  905. package/src/client/app-providers.tsx +230 -0
  906. package/src/client/appearance.ts +130 -0
  907. package/src/client/application-state.ts +154 -0
  908. package/src/client/assistant-ui-recovery.tsx +205 -0
  909. package/src/client/automation/index.ts +4 -0
  910. package/src/client/automation.ts +22 -0
  911. package/src/client/blocks/AiEditableField.tsx +30 -0
  912. package/src/client/blocks/BlockView.tsx +145 -0
  913. package/src/client/blocks/RegistryBlockDataProvider.tsx +121 -0
  914. package/src/client/blocks/SchemaBlockEditor.tsx +457 -0
  915. package/src/client/blocks/agent.ts +95 -0
  916. package/src/client/blocks/code-block-direction.ts +21 -0
  917. package/src/client/blocks/index.ts +308 -0
  918. package/src/client/blocks/library/AnnotatedCodeBlock.tsx +710 -0
  919. package/src/client/blocks/library/ApiEndpointBlock.tsx +1120 -0
  920. package/src/client/blocks/library/DataModelBlock.tsx +775 -0
  921. package/src/client/blocks/library/DiffBlock.tsx +1854 -0
  922. package/src/client/blocks/library/FileTreeBlock.tsx +868 -0
  923. package/src/client/blocks/library/HighlightedCode.tsx +260 -0
  924. package/src/client/blocks/library/JsonExplorerBlock.tsx +608 -0
  925. package/src/client/blocks/library/MermaidBlock.tsx +362 -0
  926. package/src/client/blocks/library/OpenApiSpecBlock.tsx +998 -0
  927. package/src/client/blocks/library/annotated-code.config.ts +101 -0
  928. package/src/client/blocks/library/annotation-rail.tsx +1020 -0
  929. package/src/client/blocks/library/api-endpoint.config.ts +207 -0
  930. package/src/client/blocks/library/block-copy.ts +399 -0
  931. package/src/client/blocks/library/callout.config.ts +57 -0
  932. package/src/client/blocks/library/callout.tsx +149 -0
  933. package/src/client/blocks/library/checklist.config.ts +56 -0
  934. package/src/client/blocks/library/checklist.tsx +208 -0
  935. package/src/client/blocks/library/code-filename-label.tsx +59 -0
  936. package/src/client/blocks/library/code-highlight.tsx +178 -0
  937. package/src/client/blocks/library/code-tabs.config.ts +70 -0
  938. package/src/client/blocks/library/code-tabs.tsx +606 -0
  939. package/src/client/blocks/library/code.config.ts +69 -0
  940. package/src/client/blocks/library/code.tsx +440 -0
  941. package/src/client/blocks/library/columns.config.ts +85 -0
  942. package/src/client/blocks/library/columns.tsx +334 -0
  943. package/src/client/blocks/library/data-model.config.ts +152 -0
  944. package/src/client/blocks/library/dev-doc-ui.tsx +191 -0
  945. package/src/client/blocks/library/diagram.config.ts +222 -0
  946. package/src/client/blocks/library/diagram.tsx +958 -0
  947. package/src/client/blocks/library/diff.config.ts +115 -0
  948. package/src/client/blocks/library/file-tree.config.ts +92 -0
  949. package/src/client/blocks/library/html.config.ts +79 -0
  950. package/src/client/blocks/library/html.tsx +258 -0
  951. package/src/client/blocks/library/json-explorer.config.ts +74 -0
  952. package/src/client/blocks/library/mermaid.config.ts +49 -0
  953. package/src/client/blocks/library/narrow-container.tsx +37 -0
  954. package/src/client/blocks/library/openapi-spec.config.ts +66 -0
  955. package/src/client/blocks/library/question-form.config.ts +127 -0
  956. package/src/client/blocks/library/question-form.tsx +944 -0
  957. package/src/client/blocks/library/sanitize-html.ts +343 -0
  958. package/src/client/blocks/library/server-specs.ts +338 -0
  959. package/src/client/blocks/library/specs.tsx +308 -0
  960. package/src/client/blocks/library/table.config.ts +61 -0
  961. package/src/client/blocks/library/table.tsx +449 -0
  962. package/src/client/blocks/library/tabs.config.ts +96 -0
  963. package/src/client/blocks/library/tabs.tsx +665 -0
  964. package/src/client/blocks/library/wireframe-icons.ts +210 -0
  965. package/src/client/blocks/library/wireframe-kit.tsx +1850 -0
  966. package/src/client/blocks/library/wireframe.config.ts +539 -0
  967. package/src/client/blocks/library/wireframe.tsx +535 -0
  968. package/src/client/blocks/mdx.ts +364 -0
  969. package/src/client/blocks/provider.tsx +51 -0
  970. package/src/client/blocks/registry.ts +83 -0
  971. package/src/client/blocks/schema-form/introspect.ts +201 -0
  972. package/src/client/blocks/server.ts +170 -0
  973. package/src/client/blocks/types.ts +415 -0
  974. package/src/client/browser-session-bridge.ts +548 -0
  975. package/src/client/browser-tab-id.ts +36 -0
  976. package/src/client/builder-frame.ts +194 -0
  977. package/src/client/builder-mark.tsx +21 -0
  978. package/src/client/changelog/Changelog.tsx +333 -0
  979. package/src/client/changelog/index.ts +1 -0
  980. package/src/client/chat/ChatHistoryList.tsx +7 -0
  981. package/src/client/chat/attachment-adapters.ts +426 -0
  982. package/src/client/chat/connectors.ts +1579 -0
  983. package/src/client/chat/index.ts +160 -0
  984. package/src/client/chat/markdown-renderer.tsx +693 -0
  985. package/src/client/chat/message-components.tsx +1326 -0
  986. package/src/client/chat/repo-helpers.ts +281 -0
  987. package/src/client/chat/run-recovery.tsx +994 -0
  988. package/src/client/chat/runtime.ts +1810 -0
  989. package/src/client/chat/tool-call-display.tsx +1270 -0
  990. package/src/client/chat/tool-render-registry.tsx +144 -0
  991. package/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  992. package/src/client/chat/use-reconnect-reader-owner.ts +28 -0
  993. package/src/client/chat/widgets/DataChartRenderer.tsx +242 -0
  994. package/src/client/chat/widgets/DataChartWidget.tsx +51 -0
  995. package/src/client/chat/widgets/DataInsightsWidget.tsx +59 -0
  996. package/src/client/chat/widgets/DataTableWidget.tsx +240 -0
  997. package/src/client/chat/widgets/InlineExtensionWidget.tsx +60 -0
  998. package/src/client/chat/widgets/builtin-tool-renderers.tsx +213 -0
  999. package/src/client/chat/widgets/data-widget-types.ts +1 -0
  1000. package/src/client/chat/widgets/inline-extension-result.ts +86 -0
  1001. package/src/client/chat-model-groups.ts +171 -0
  1002. package/src/client/chat-thread-url.ts +11 -0
  1003. package/src/client/chat-view-transition.ts +213 -0
  1004. package/src/client/client-action.ts +21 -0
  1005. package/src/client/client-bootstrap.ts +7 -0
  1006. package/src/client/client-surface.ts +41 -0
  1007. package/src/client/clipboard.ts +89 -0
  1008. package/src/client/code-agent-chat-adapter.ts +537 -0
  1009. package/src/client/collab/index.ts +60 -0
  1010. package/src/client/command-navigation/index.ts +15 -0
  1011. package/src/client/comments-review/index.ts +1 -0
  1012. package/src/client/components/AgentPresenceChip.tsx +4 -0
  1013. package/src/client/components/ApiKeySettings.tsx +309 -0
  1014. package/src/client/components/CodeAgentIndicator.tsx +59 -0
  1015. package/src/client/components/CodeRequiredDialog.tsx +470 -0
  1016. package/src/client/components/LiveCursorOverlay.tsx +5 -0
  1017. package/src/client/components/MissingKeyCard.tsx +61 -0
  1018. package/src/client/components/PresenceBar.tsx +4 -0
  1019. package/src/client/components/RecentEditHighlights.tsx +4 -0
  1020. package/src/client/components/RemoteSelectionRings.tsx +5 -0
  1021. package/src/client/components/icons/AgentNativeIcon.tsx +46 -0
  1022. package/src/client/components/ui/dialog.tsx +1 -0
  1023. package/src/client/components/ui/dropdown-menu.tsx +1 -0
  1024. package/src/client/components/ui/hover-card.tsx +1 -0
  1025. package/src/client/components/ui/message-scroller.tsx +131 -0
  1026. package/src/client/components/ui/popover.tsx +1 -0
  1027. package/src/client/components/ui/sheet.tsx +1 -0
  1028. package/src/client/components/ui/tooltip.tsx +1 -0
  1029. package/src/client/composer/index.ts +11 -0
  1030. package/src/client/composer/runtime-adapters.tsx +123 -0
  1031. package/src/client/composer/use-mention-search.ts +7 -0
  1032. package/src/client/composer/wired-components.tsx +53 -0
  1033. package/src/client/context-xray/ContextMeter.tsx +124 -0
  1034. package/src/client/context-xray/ContextSegmentRow.tsx +27 -0
  1035. package/src/client/context-xray/ContextTreemap.tsx +24 -0
  1036. package/src/client/context-xray/ContextXRayPanel.tsx +59 -0
  1037. package/src/client/context-xray/SegmentProvenancePopover.tsx +18 -0
  1038. package/src/client/context-xray/format.ts +27 -0
  1039. package/src/client/conversation/AgentConversation.tsx +555 -0
  1040. package/src/client/conversation/code-agent-transcript.ts +283 -0
  1041. package/src/client/conversation/index.ts +22 -0
  1042. package/src/client/conversation/types.ts +85 -0
  1043. package/src/client/conversation/use-near-bottom-autoscroll.ts +278 -0
  1044. package/src/client/create-query-client.ts +86 -0
  1045. package/src/client/db-admin/DataGrid.tsx +551 -0
  1046. package/src/client/db-admin/DbAdminPage.tsx +218 -0
  1047. package/src/client/db-admin/DevDatabaseLink.tsx +16 -0
  1048. package/src/client/db-admin/EditableCell.tsx +451 -0
  1049. package/src/client/db-admin/FilterBar.tsx +203 -0
  1050. package/src/client/db-admin/ResultsGrid.tsx +114 -0
  1051. package/src/client/db-admin/RowSidePanel.tsx +337 -0
  1052. package/src/client/db-admin/SqlEditor.tsx +840 -0
  1053. package/src/client/db-admin/TableBrowser.tsx +212 -0
  1054. package/src/client/db-admin/TableEditor.tsx +760 -0
  1055. package/src/client/db-admin/cell-format.ts +246 -0
  1056. package/src/client/db-admin/changeset.ts +296 -0
  1057. package/src/client/db-admin/export-utils.ts +78 -0
  1058. package/src/client/db-admin/index.ts +33 -0
  1059. package/src/client/db-admin/sql-storage.ts +134 -0
  1060. package/src/client/db-admin/storage.ts +68 -0
  1061. package/src/client/db-admin/useAgentSync.ts +226 -0
  1062. package/src/client/db-admin/useDbAdmin.ts +294 -0
  1063. package/src/client/dev-overlay/DevOverlay.tsx +576 -0
  1064. package/src/client/dev-overlay/builtins.ts +40 -0
  1065. package/src/client/dev-overlay/index.ts +23 -0
  1066. package/src/client/dev-overlay/registry.ts +67 -0
  1067. package/src/client/dev-overlay/types.ts +64 -0
  1068. package/src/client/dev-overlay/use-dev-option.ts +78 -0
  1069. package/src/client/dev-overlay/use-dev-overlay-shortcut.ts +31 -0
  1070. package/src/client/dynamic-suggestions.ts +455 -0
  1071. package/src/client/embed-auth.ts +544 -0
  1072. package/src/client/embed.ts +54 -0
  1073. package/src/client/error-capture.ts +690 -0
  1074. package/src/client/error-format.ts +211 -0
  1075. package/src/client/error-reporting.ts +100 -0
  1076. package/src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx +136 -0
  1077. package/src/client/extensions/AgentNativeExtensionFrame.tsx +708 -0
  1078. package/src/client/extensions/EmbeddedExtension.tsx +604 -0
  1079. package/src/client/extensions/ExtensionEditor.tsx +450 -0
  1080. package/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  1081. package/src/client/extensions/ExtensionSlot.tsx +345 -0
  1082. package/src/client/extensions/ExtensionViewer.tsx +1502 -0
  1083. package/src/client/extensions/ExtensionViewerPage.tsx +32 -0
  1084. package/src/client/extensions/ExtensionsListPage.tsx +432 -0
  1085. package/src/client/extensions/ExtensionsSidebarSection.tsx +1259 -0
  1086. package/src/client/extensions/InlineExtensionFrame.tsx +660 -0
  1087. package/src/client/extensions/agent-native-extension-runtime.ts +495 -0
  1088. package/src/client/extensions/delete-extension.ts +76 -0
  1089. package/src/client/extensions/extension-load-error.ts +26 -0
  1090. package/src/client/extensions/extension-order.ts +49 -0
  1091. package/src/client/extensions/extension-popularity.ts +61 -0
  1092. package/src/client/extensions/iframe-bridge.ts +377 -0
  1093. package/src/client/extensions/index.ts +84 -0
  1094. package/src/client/extensions/portable-extension.ts +712 -0
  1095. package/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  1096. package/src/client/feature-flags/helpers.ts +77 -0
  1097. package/src/client/feature-flags/index.ts +13 -0
  1098. package/src/client/feature-flags/types.ts +29 -0
  1099. package/src/client/feature-flags/use-feature-flag.ts +26 -0
  1100. package/src/client/feedback-context.ts +90 -0
  1101. package/src/client/frame-protocol.ts +168 -0
  1102. package/src/client/frame.ts +329 -0
  1103. package/src/client/guided-questions.tsx +1152 -0
  1104. package/src/client/history/VersionHistoryPanel.tsx +175 -0
  1105. package/src/client/history/index.ts +21 -0
  1106. package/src/client/history/use-history.ts +114 -0
  1107. package/src/client/hooks/index.ts +46 -0
  1108. package/src/client/host/index.ts +170 -0
  1109. package/src/client/host-bridge.ts +1272 -0
  1110. package/src/client/host-tools.ts +190 -0
  1111. package/src/client/i18n.tsx +798 -0
  1112. package/src/client/index.ts +370 -0
  1113. package/src/client/integrations/IntegrationCard.tsx +186 -0
  1114. package/src/client/integrations/IntegrationsPanel.tsx +633 -0
  1115. package/src/client/integrations/api.ts +295 -0
  1116. package/src/client/integrations/index.ts +29 -0
  1117. package/src/client/integrations/useIntegrationStatus.ts +52 -0
  1118. package/src/client/mcp-app-host.ts +720 -0
  1119. package/src/client/mcp-apps/McpAppRenderer.tsx +760 -0
  1120. package/src/client/navigation/index.ts +54 -0
  1121. package/src/client/notifications/NotificationsBell.tsx +383 -0
  1122. package/src/client/notifications/index.ts +1 -0
  1123. package/src/client/observability/ObservabilityDashboard.tsx +890 -0
  1124. package/src/client/observability/ThumbsFeedback.tsx +160 -0
  1125. package/src/client/observability/index.ts +20 -0
  1126. package/src/client/observability/useObservability.ts +266 -0
  1127. package/src/client/onboarding/OnboardingBanner.tsx +73 -0
  1128. package/src/client/onboarding/OnboardingPanel.tsx +1036 -0
  1129. package/src/client/onboarding/SetupButton.tsx +64 -0
  1130. package/src/client/onboarding/index.ts +25 -0
  1131. package/src/client/onboarding/use-onboarding.ts +164 -0
  1132. package/src/client/onboarding/use-preview-mode.ts +40 -0
  1133. package/src/client/org/InvitationBanner.tsx +148 -0
  1134. package/src/client/org/OrgSwitcher.tsx +754 -0
  1135. package/src/client/org/RequireActiveOrg.tsx +337 -0
  1136. package/src/client/org/TeamPage.tsx +1432 -0
  1137. package/src/client/org/hooks.ts +359 -0
  1138. package/src/client/org/index.ts +70 -0
  1139. package/src/client/org/workspace-app-links.ts +367 -0
  1140. package/src/client/org-team/index.ts +1 -0
  1141. package/src/client/progress/RunsTray.tsx +680 -0
  1142. package/src/client/progress/index.ts +1 -0
  1143. package/src/client/require-session.tsx +142 -0
  1144. package/src/client/resources/BuiltinCapabilityDetail.tsx +258 -0
  1145. package/src/client/resources/McpConnectionSuggestion.tsx +276 -0
  1146. package/src/client/resources/McpIntegrationDialog.tsx +808 -0
  1147. package/src/client/resources/McpServerDetail.tsx +230 -0
  1148. package/src/client/resources/ResourceEditor.tsx +872 -0
  1149. package/src/client/resources/ResourceTree.tsx +860 -0
  1150. package/src/client/resources/ResourcesPanel.tsx +1960 -0
  1151. package/src/client/resources/index.ts +25 -0
  1152. package/src/client/resources/mcp-integration-catalog.ts +771 -0
  1153. package/src/client/resources/mcp-integration-logos.ts +108 -0
  1154. package/src/client/resources/runtime.ts +1 -0
  1155. package/src/client/resources/use-builtin-capabilities.ts +113 -0
  1156. package/src/client/resources/use-mcp-servers.ts +217 -0
  1157. package/src/client/resources/use-resources.ts +402 -0
  1158. package/src/client/review/ReviewCommentComposer.tsx +123 -0
  1159. package/src/client/review/ReviewStatusBadge.tsx +39 -0
  1160. package/src/client/review/ReviewThreadPanel.tsx +625 -0
  1161. package/src/client/review/index.ts +38 -0
  1162. package/src/client/review/use-review.ts +186 -0
  1163. package/src/client/route-chunk-recovery/index.ts +1 -0
  1164. package/src/client/route-chunk-recovery.ts +331 -0
  1165. package/src/client/route-state.ts +455 -0
  1166. package/src/client/route-warmup.tsx +543 -0
  1167. package/src/client/session-replay-iframe.e2e-host.tsx +100 -0
  1168. package/src/client/session-replay.ts +3417 -0
  1169. package/src/client/settings/AgentsSection.tsx +441 -0
  1170. package/src/client/settings/AutomationsSection.tsx +516 -0
  1171. package/src/client/settings/BackgroundAgentSection.tsx +189 -0
  1172. package/src/client/settings/BrowserSection.tsx +110 -0
  1173. package/src/client/settings/DemoModeSection.tsx +48 -0
  1174. package/src/client/settings/SecretsSection.tsx +875 -0
  1175. package/src/client/settings/SettingsPanel.tsx +3162 -0
  1176. package/src/client/settings/SettingsSection.tsx +283 -0
  1177. package/src/client/settings/SettingsTabsPage.tsx +592 -0
  1178. package/src/client/settings/UsageSection.tsx +401 -0
  1179. package/src/client/settings/VoiceTranscriptionSection.tsx +960 -0
  1180. package/src/client/settings/agent-settings-search.ts +220 -0
  1181. package/src/client/settings/index.ts +27 -0
  1182. package/src/client/settings/useBuilderStatus.ts +1055 -0
  1183. package/src/client/setup-connections/BuilderConnectCard.tsx +89 -0
  1184. package/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  1185. package/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  1186. package/src/client/setup-connections/catalog.ts +6 -0
  1187. package/src/client/setup-connections/index.ts +47 -0
  1188. package/src/client/setup-connections/runtime.ts +1 -0
  1189. package/src/client/sharing/ShareButton.tsx +1748 -0
  1190. package/src/client/sharing/ShareDialog.tsx +846 -0
  1191. package/src/client/sharing/VisibilityBadge.tsx +4 -0
  1192. package/src/client/sharing/index.ts +2 -0
  1193. package/src/client/sse-event-processor.ts +2002 -0
  1194. package/src/client/terminal/AgentTerminal.tsx +488 -0
  1195. package/src/client/terminal/index.ts +7 -0
  1196. package/src/client/theme.ts +27 -0
  1197. package/src/client/tombstone/agent-presence-chip.ts +17 -0
  1198. package/src/client/tombstone/editor.ts +265 -0
  1199. package/src/client/tombstone/live-cursor-overlay.ts +21 -0
  1200. package/src/client/tombstone/presence-bar.ts +17 -0
  1201. package/src/client/tombstone/recent-edit-highlights.ts +17 -0
  1202. package/src/client/tombstone/remote-selection-rings.ts +21 -0
  1203. package/src/client/tombstone/rich-markdown-editor.ts +265 -0
  1204. package/src/client/tombstone/ui-dialog.ts +49 -0
  1205. package/src/client/tombstone/ui-dropdown-menu.ts +69 -0
  1206. package/src/client/tombstone/ui-hover-card.ts +21 -0
  1207. package/src/client/tombstone/ui-popover.ts +25 -0
  1208. package/src/client/tombstone/ui-sheet.ts +49 -0
  1209. package/src/client/tombstone/ui-tooltip.ts +29 -0
  1210. package/src/client/tombstone/visual-style-controls.ts +61 -0
  1211. package/src/client/tool-cells/BashCell.tsx +164 -0
  1212. package/src/client/tool-cells/EditCell.tsx +303 -0
  1213. package/src/client/tool-cells/FilesChangedSummary.tsx +208 -0
  1214. package/src/client/tool-cells/WriteCell.tsx +145 -0
  1215. package/src/client/tool-cells/index.ts +7 -0
  1216. package/src/client/tool-display.ts +41 -0
  1217. package/src/client/track.ts +57 -0
  1218. package/src/client/transcription/BuilderTranscriptionCta.tsx +120 -0
  1219. package/src/client/transcription/use-live-transcription.ts +292 -0
  1220. package/src/client/ui/index.ts +55 -0
  1221. package/src/client/uploads/index.ts +6 -0
  1222. package/src/client/uploads/upload-editor-image.ts +79 -0
  1223. package/src/client/uploads/use-upload-resource.ts +24 -0
  1224. package/src/client/url-scrub.ts +51 -0
  1225. package/src/client/use-action.ts +766 -0
  1226. package/src/client/use-agent-chat-context.ts +63 -0
  1227. package/src/client/use-agent-chat-home-handoff.ts +207 -0
  1228. package/src/client/use-agent-chat.ts +53 -0
  1229. package/src/client/use-agent-engine-configured.ts +211 -0
  1230. package/src/client/use-avatar.ts +127 -0
  1231. package/src/client/use-change-version.ts +150 -0
  1232. package/src/client/use-chat-models.ts +252 -0
  1233. package/src/client/use-chat-threads.ts +1262 -0
  1234. package/src/client/use-db-sync.ts +1112 -0
  1235. package/src/client/use-demo-mode-status.ts +30 -0
  1236. package/src/client/use-dev-mode.ts +177 -0
  1237. package/src/client/use-external-value.ts +40 -0
  1238. package/src/client/use-pausing-interval.ts +65 -0
  1239. package/src/client/use-pinch-zoom.ts +202 -0
  1240. package/src/client/use-run-stuck-detection.ts +427 -0
  1241. package/src/client/use-send-to-agent-chat.ts +85 -0
  1242. package/src/client/use-session.ts +114 -0
  1243. package/src/client/utils.ts +7 -0
  1244. package/src/client/visual-style-controls.tsx +1 -0
  1245. package/src/client/vite-dev-recovery-script.ts +226 -0
  1246. package/src/client/voice-provider-status.ts +44 -0
  1247. package/src/client/widgets/index.ts +41 -0
  1248. package/src/code-agents/background-controller.ts +398 -0
  1249. package/src/code-agents/background-run.ts +156 -0
  1250. package/src/code-agents/index.ts +95 -0
  1251. package/src/code-agents/prompt-attachments.ts +39 -0
  1252. package/src/code-agents/transcript-normalizer.ts +750 -0
  1253. package/src/code-agents/transcript-order.ts +73 -0
  1254. package/src/coding-tools/index.ts +742 -0
  1255. package/src/coding-tools/run-code.ts +1662 -0
  1256. package/src/coding-tools/sandbox/adapter.ts +82 -0
  1257. package/src/coding-tools/sandbox/background.ts +406 -0
  1258. package/src/coding-tools/sandbox/executions-store.ts +517 -0
  1259. package/src/coding-tools/sandbox/index.ts +132 -0
  1260. package/src/coding-tools/sandbox/local-child-process-adapter.ts +217 -0
  1261. package/src/collab/agent-identity.ts +5 -0
  1262. package/src/collab/agent-presence.ts +341 -0
  1263. package/src/collab/awareness-store.ts +196 -0
  1264. package/src/collab/awareness.ts +317 -0
  1265. package/src/collab/client-struct.ts +366 -0
  1266. package/src/collab/client.ts +1205 -0
  1267. package/src/collab/emitter.ts +31 -0
  1268. package/src/collab/follow-mode.ts +107 -0
  1269. package/src/collab/index.ts +151 -0
  1270. package/src/collab/json-to-yjs.ts +504 -0
  1271. package/src/collab/presence.ts +207 -0
  1272. package/src/collab/recent-edits.ts +215 -0
  1273. package/src/collab/routes.ts +191 -0
  1274. package/src/collab/storage.ts +228 -0
  1275. package/src/collab/struct-routes.ts +133 -0
  1276. package/src/collab/text-to-yjs.ts +79 -0
  1277. package/src/collab/undo.ts +432 -0
  1278. package/src/collab/xml-ops.ts +68 -0
  1279. package/src/collab/ydoc-manager.ts +544 -0
  1280. package/src/command-navigation/actions.ts +100 -0
  1281. package/src/command-navigation/index.ts +12 -0
  1282. package/src/comments-review/index.ts +1 -0
  1283. package/src/connections/catalog.ts +451 -0
  1284. package/src/connections/index.ts +48 -0
  1285. package/src/connections/reader.ts +911 -0
  1286. package/src/connections/runtime.ts +1 -0
  1287. package/src/credentials/index.ts +187 -0
  1288. package/src/data-programs/actions.ts +335 -0
  1289. package/src/data-programs/contract.ts +284 -0
  1290. package/src/data-programs/execute.ts +693 -0
  1291. package/src/data-programs/index.ts +72 -0
  1292. package/src/data-programs/schema.ts +148 -0
  1293. package/src/data-programs/store.ts +755 -0
  1294. package/src/data-widgets/index.ts +376 -0
  1295. package/src/db/client.ts +1627 -0
  1296. package/src/db/create-get-db.ts +579 -0
  1297. package/src/db/ddl-guard.ts +302 -0
  1298. package/src/db/drizzle-config.ts +190 -0
  1299. package/src/db/ensure-additive-columns.ts +430 -0
  1300. package/src/db/index.ts +57 -0
  1301. package/src/db/migrations.ts +691 -0
  1302. package/src/db/request-telemetry.ts +154 -0
  1303. package/src/db/runtime-diagnostics.ts +331 -0
  1304. package/src/db/schema.ts +121 -0
  1305. package/src/db/widen-columns.ts +75 -0
  1306. package/src/db-admin/agent-tools.ts +202 -0
  1307. package/src/db-admin/index.ts +26 -0
  1308. package/src/db-admin/operations.ts +803 -0
  1309. package/src/db-admin/routes.ts +174 -0
  1310. package/src/db-admin/types.ts +110 -0
  1311. package/src/demo/browser-state.ts +47 -0
  1312. package/src/demo/fetch-interceptor.ts +175 -0
  1313. package/src/demo/redact.ts +575 -0
  1314. package/src/deploy/build.ts +3935 -0
  1315. package/src/deploy/immutable-assets.ts +65 -0
  1316. package/src/deploy/route-discovery.ts +458 -0
  1317. package/src/deploy/workspace-core.ts +282 -0
  1318. package/src/deploy/workspace-deploy.ts +1488 -0
  1319. package/src/eject/provider-api-definitions.ts +193 -0
  1320. package/src/eject/remote-mcp-presets.ts +137 -0
  1321. package/src/eject/setup-readiness-ui.tsx +29 -0
  1322. package/src/eject/workspace-connections.ts +92 -0
  1323. package/src/embedding/agent.ts +159 -0
  1324. package/src/embedding/bridge.ts +297 -0
  1325. package/src/embedding/index.ts +43 -0
  1326. package/src/embedding/protocol.ts +185 -0
  1327. package/src/embedding/react.tsx +319 -0
  1328. package/src/embeddings/index.ts +233 -0
  1329. package/src/eval/agent-runner.ts +210 -0
  1330. package/src/eval/define-eval.ts +55 -0
  1331. package/src/eval/index.ts +49 -0
  1332. package/src/eval/report.ts +75 -0
  1333. package/src/eval/runner.ts +369 -0
  1334. package/src/eval/scorer.ts +244 -0
  1335. package/src/eval/types.ts +188 -0
  1336. package/src/event-bus/bus.ts +140 -0
  1337. package/src/event-bus/index.ts +3 -0
  1338. package/src/event-bus/registry.ts +79 -0
  1339. package/src/event-bus/types.ts +29 -0
  1340. package/src/extensions/actions.ts +1636 -0
  1341. package/src/extensions/change-marker.ts +54 -0
  1342. package/src/extensions/content-patch.ts +468 -0
  1343. package/src/extensions/fetch-tool.ts +461 -0
  1344. package/src/extensions/html-shell.ts +803 -0
  1345. package/src/extensions/local.ts +462 -0
  1346. package/src/extensions/path.ts +40 -0
  1347. package/src/extensions/proxy-security.ts +171 -0
  1348. package/src/extensions/routes.ts +1080 -0
  1349. package/src/extensions/schema.ts +269 -0
  1350. package/src/extensions/session-replay-iframe.ts +131 -0
  1351. package/src/extensions/slots/routes.ts +126 -0
  1352. package/src/extensions/slots/schema.ts +87 -0
  1353. package/src/extensions/slots/store.ts +450 -0
  1354. package/src/extensions/store.ts +1347 -0
  1355. package/src/extensions/theme.ts +114 -0
  1356. package/src/extensions/url-safety.ts +316 -0
  1357. package/src/extensions/web-content.ts +663 -0
  1358. package/src/extensions/web-search-tool.ts +437 -0
  1359. package/src/feature-flags/a2a-action-route.ts +56 -0
  1360. package/src/feature-flags/actions/get-feature-flags.ts +24 -0
  1361. package/src/feature-flags/actions/list-feature-flags.ts +69 -0
  1362. package/src/feature-flags/actions/set-feature-flag.ts +89 -0
  1363. package/src/feature-flags/index.ts +21 -0
  1364. package/src/feature-flags/permissions.ts +53 -0
  1365. package/src/feature-flags/plugin.ts +44 -0
  1366. package/src/feature-flags/registry.ts +96 -0
  1367. package/src/feature-flags/store.ts +176 -0
  1368. package/src/file-upload/actions/upload-image.ts +213 -0
  1369. package/src/file-upload/builder.ts +431 -0
  1370. package/src/file-upload/index.ts +24 -0
  1371. package/src/file-upload/pre-upload-attachments.ts +305 -0
  1372. package/src/file-upload/registry.ts +125 -0
  1373. package/src/file-upload/types.ts +89 -0
  1374. package/src/guards/db-tool-scoping.ts +129 -0
  1375. package/src/guards/index.ts +23 -0
  1376. package/src/guards/no-drizzle-push.ts +116 -0
  1377. package/src/guards/no-env-credentials.ts +229 -0
  1378. package/src/guards/no-env-mutation.ts +114 -0
  1379. package/src/guards/no-localhost-fallback.ts +124 -0
  1380. package/src/guards/no-unscoped-credentials.ts +227 -0
  1381. package/src/guards/no-unscoped-queries.ts +834 -0
  1382. package/src/guards/scan-utils.ts +105 -0
  1383. package/src/guards/types.ts +30 -0
  1384. package/src/history/actions/create-resource-version.ts +92 -0
  1385. package/src/history/actions/get-resource-version.ts +60 -0
  1386. package/src/history/actions/list-resource-history.ts +53 -0
  1387. package/src/history/actions/list-resource-versions.ts +43 -0
  1388. package/src/history/actions/restore-resource-version.ts +96 -0
  1389. package/src/history/index.ts +26 -0
  1390. package/src/history/registry.ts +111 -0
  1391. package/src/history/store.ts +379 -0
  1392. package/src/history/types.ts +69 -0
  1393. package/src/index.browser.ts +155 -0
  1394. package/src/index.ts +408 -0
  1395. package/src/ingestion/docx.ts +158 -0
  1396. package/src/ingestion/figma-node-to-html.ts +1860 -0
  1397. package/src/ingestion/figma.ts +548 -0
  1398. package/src/ingestion/index.ts +107 -0
  1399. package/src/ingestion/media.ts +264 -0
  1400. package/src/ingestion/notion.ts +121 -0
  1401. package/src/ingestion/office.ts +213 -0
  1402. package/src/ingestion/orchestration.ts +160 -0
  1403. package/src/ingestion/pptx.ts +331 -0
  1404. package/src/ingestion/selection.ts +81 -0
  1405. package/src/ingestion/website.ts +151 -0
  1406. package/src/integrations/a2a-continuation-marker.ts +2 -0
  1407. package/src/integrations/a2a-continuation-processor.ts +888 -0
  1408. package/src/integrations/a2a-continuations-store.ts +643 -0
  1409. package/src/integrations/adapter-overrides.ts +12 -0
  1410. package/src/integrations/adapters/discord.ts +364 -0
  1411. package/src/integrations/adapters/email.ts +1164 -0
  1412. package/src/integrations/adapters/google-docs.ts +371 -0
  1413. package/src/integrations/adapters/index.ts +29 -0
  1414. package/src/integrations/adapters/microsoft-teams.ts +413 -0
  1415. package/src/integrations/adapters/slack.ts +1914 -0
  1416. package/src/integrations/adapters/telegram.ts +386 -0
  1417. package/src/integrations/adapters/whatsapp.ts +358 -0
  1418. package/src/integrations/awaiting-input-store.ts +130 -0
  1419. package/src/integrations/catalog.ts +571 -0
  1420. package/src/integrations/computer-supervision-store.ts +423 -0
  1421. package/src/integrations/computer-supervision.ts +213 -0
  1422. package/src/integrations/config-store.ts +131 -0
  1423. package/src/integrations/controls-store.ts +187 -0
  1424. package/src/integrations/eject/messaging-adapters.ts +85 -0
  1425. package/src/integrations/google-docs-poller.ts +671 -0
  1426. package/src/integrations/identity-links-store.ts +210 -0
  1427. package/src/integrations/identity.ts +196 -0
  1428. package/src/integrations/index.ts +220 -0
  1429. package/src/integrations/installations-store.ts +677 -0
  1430. package/src/integrations/integration-memory.ts +187 -0
  1431. package/src/integrations/internal-token.ts +106 -0
  1432. package/src/integrations/pending-tasks-retry-job.ts +286 -0
  1433. package/src/integrations/pending-tasks-store.ts +468 -0
  1434. package/src/integrations/plugin.ts +3048 -0
  1435. package/src/integrations/remote-commands-store.ts +690 -0
  1436. package/src/integrations/remote-devices-store.ts +492 -0
  1437. package/src/integrations/remote-json-safety.ts +127 -0
  1438. package/src/integrations/remote-push-delivery-job.ts +48 -0
  1439. package/src/integrations/remote-push-delivery.ts +370 -0
  1440. package/src/integrations/remote-push-store.ts +664 -0
  1441. package/src/integrations/remote-retry-job.ts +55 -0
  1442. package/src/integrations/remote-run-events-store.ts +222 -0
  1443. package/src/integrations/remote-types.ts +186 -0
  1444. package/src/integrations/runtime.ts +1 -0
  1445. package/src/integrations/scope-store.ts +498 -0
  1446. package/src/integrations/slack-manifest.ts +78 -0
  1447. package/src/integrations/slack-oauth.ts +344 -0
  1448. package/src/integrations/task-queue-stats.ts +144 -0
  1449. package/src/integrations/thread-mapping-store.ts +134 -0
  1450. package/src/integrations/types.ts +485 -0
  1451. package/src/integrations/usage-budget-store.ts +906 -0
  1452. package/src/integrations/webhook-delivery.ts +55 -0
  1453. package/src/integrations/webhook-handler.ts +1939 -0
  1454. package/src/jobs/actions/list-recurring-jobs.ts +105 -0
  1455. package/src/jobs/actions/manage-recurring-job.ts +85 -0
  1456. package/src/jobs/cron.ts +126 -0
  1457. package/src/jobs/index.ts +9 -0
  1458. package/src/jobs/scheduler.ts +703 -0
  1459. package/src/jobs/tools.ts +367 -0
  1460. package/src/local-artifacts/index.ts +1372 -0
  1461. package/src/localization/actions/get-localization-preference.ts +24 -0
  1462. package/src/localization/actions/set-localization-preference.ts +32 -0
  1463. package/src/localization/default-messages.ts +1009 -0
  1464. package/src/localization/index.ts +2 -0
  1465. package/src/localization/server.ts +131 -0
  1466. package/src/localization/shared.ts +208 -0
  1467. package/src/mcp/actions/call-mcp-tool.ts +19 -0
  1468. package/src/mcp/actions/create-org-service-token.ts +87 -0
  1469. package/src/mcp/actions/list-mcp-tools.ts +18 -0
  1470. package/src/mcp/actions/list-org-service-tokens.ts +44 -0
  1471. package/src/mcp/actions/revoke-org-service-token.ts +30 -0
  1472. package/src/mcp/actions/service-token-access.ts +121 -0
  1473. package/src/mcp/ask-app-inline-tasks.ts +125 -0
  1474. package/src/mcp/build-server.ts +2356 -0
  1475. package/src/mcp/builtin-tools.ts +1506 -0
  1476. package/src/mcp/connect-route.ts +1460 -0
  1477. package/src/mcp/connect-store.ts +680 -0
  1478. package/src/mcp/embed-app.ts +2051 -0
  1479. package/src/mcp/embed-route.ts +84 -0
  1480. package/src/mcp/external-agent-policy.ts +18 -0
  1481. package/src/mcp/index.ts +47 -0
  1482. package/src/mcp/oauth-route.ts +1016 -0
  1483. package/src/mcp/oauth-store.ts +581 -0
  1484. package/src/mcp/oauth-token.ts +227 -0
  1485. package/src/mcp/org-directory.ts +343 -0
  1486. package/src/mcp/route-paths.ts +34 -0
  1487. package/src/mcp/screen-memory-stdio.ts +290 -0
  1488. package/src/mcp/server.ts +507 -0
  1489. package/src/mcp/stdio.ts +328 -0
  1490. package/src/mcp/workspace-resolve.ts +261 -0
  1491. package/src/mcp-client/app-api.ts +136 -0
  1492. package/src/mcp-client/app-result.ts +64 -0
  1493. package/src/mcp-client/builtin-capabilities.ts +146 -0
  1494. package/src/mcp-client/builtin-store.ts +93 -0
  1495. package/src/mcp-client/config.ts +281 -0
  1496. package/src/mcp-client/errors.ts +54 -0
  1497. package/src/mcp-client/hub-client.ts +172 -0
  1498. package/src/mcp-client/hub-routes.ts +198 -0
  1499. package/src/mcp-client/index.ts +504 -0
  1500. package/src/mcp-client/manager.ts +968 -0
  1501. package/src/mcp-client/oauth-client.ts +462 -0
  1502. package/src/mcp-client/oauth-routes.ts +307 -0
  1503. package/src/mcp-client/remote-store.ts +674 -0
  1504. package/src/mcp-client/remote-url.ts +97 -0
  1505. package/src/mcp-client/routes.ts +1093 -0
  1506. package/src/mcp-client/screen-memory-local.ts +461 -0
  1507. package/src/mcp-client/tool-policy.ts +182 -0
  1508. package/src/mcp-client/visibility.ts +56 -0
  1509. package/src/mcp-client/workspace-servers.ts +379 -0
  1510. package/src/navigation/index.ts +170 -0
  1511. package/src/notifications/actions.ts +151 -0
  1512. package/src/notifications/channels.ts +410 -0
  1513. package/src/notifications/index.ts +22 -0
  1514. package/src/notifications/registry.ts +216 -0
  1515. package/src/notifications/routes.ts +106 -0
  1516. package/src/notifications/store.ts +236 -0
  1517. package/src/notifications/types.ts +52 -0
  1518. package/src/oauth-tokens/google-refresh.ts +175 -0
  1519. package/src/oauth-tokens/index.ts +15 -0
  1520. package/src/oauth-tokens/store.ts +384 -0
  1521. package/src/observability/cleanup-job.ts +124 -0
  1522. package/src/observability/evals.ts +507 -0
  1523. package/src/observability/experiments.ts +359 -0
  1524. package/src/observability/feedback.ts +332 -0
  1525. package/src/observability/hosted-model-experiment.ts +118 -0
  1526. package/src/observability/index.ts +62 -0
  1527. package/src/observability/plugin.ts +31 -0
  1528. package/src/observability/routes.ts +431 -0
  1529. package/src/observability/sentiment.ts +261 -0
  1530. package/src/observability/store.ts +1347 -0
  1531. package/src/observability/traces.ts +789 -0
  1532. package/src/observability/tracing.ts +157 -0
  1533. package/src/observability/tracking-identity.ts +55 -0
  1534. package/src/observability/types.ts +211 -0
  1535. package/src/onboarding/default-steps.ts +428 -0
  1536. package/src/onboarding/index.ts +22 -0
  1537. package/src/onboarding/plugin.ts +262 -0
  1538. package/src/onboarding/registry.ts +47 -0
  1539. package/src/onboarding/types.ts +96 -0
  1540. package/src/org/accept-pending.ts +98 -0
  1541. package/src/org/auto-join-domain.ts +113 -0
  1542. package/src/org/context.ts +614 -0
  1543. package/src/org/free-email-providers.ts +124 -0
  1544. package/src/org/handlers.ts +1153 -0
  1545. package/src/org/index.ts +63 -0
  1546. package/src/org/migrations.ts +105 -0
  1547. package/src/org/permissions.ts +30 -0
  1548. package/src/org/plugin.ts +255 -0
  1549. package/src/org/schema.ts +28 -0
  1550. package/src/org/types.ts +57 -0
  1551. package/src/org-team/index.ts +1 -0
  1552. package/src/package-lifecycle/deprecated-imports.ts +179 -0
  1553. package/src/package-lifecycle/eject-manifest.ts +345 -0
  1554. package/src/package-lifecycle/index.ts +7 -0
  1555. package/src/package-lifecycle/manifest.ts +120 -0
  1556. package/src/package-lifecycle/migration-manifest.ts +159 -0
  1557. package/src/package-lifecycle/migration-message.ts +6 -0
  1558. package/src/package-lifecycle/tombstone.ts +58 -0
  1559. package/src/package-lifecycle/upgrade-error.ts +37 -0
  1560. package/src/private-blob/index.ts +18 -0
  1561. package/src/private-blob/registry.ts +242 -0
  1562. package/src/private-blob/types.ts +55 -0
  1563. package/src/progress/actions.ts +179 -0
  1564. package/src/progress/index.ts +16 -0
  1565. package/src/progress/registry.ts +127 -0
  1566. package/src/progress/routes.ts +89 -0
  1567. package/src/progress/store.ts +353 -0
  1568. package/src/progress/types.ts +59 -0
  1569. package/src/provider-api/actions/custom-provider-registration.ts +197 -0
  1570. package/src/provider-api/actions/delete-staged-dataset.ts +5 -0
  1571. package/src/provider-api/actions/github-repo-files.ts +266 -0
  1572. package/src/provider-api/actions/list-staged-datasets.ts +5 -0
  1573. package/src/provider-api/actions/provider-api-audit.ts +88 -0
  1574. package/src/provider-api/actions/provider-api.ts +460 -0
  1575. package/src/provider-api/actions/query-staged-dataset.ts +5 -0
  1576. package/src/provider-api/actions/staged-datasets.ts +359 -0
  1577. package/src/provider-api/corpus-jobs-store.ts +522 -0
  1578. package/src/provider-api/corpus-jobs.ts +1817 -0
  1579. package/src/provider-api/custom-registry.ts +456 -0
  1580. package/src/provider-api/github-repo.ts +675 -0
  1581. package/src/provider-api/gong.ts +108 -0
  1582. package/src/provider-api/index.ts +5444 -0
  1583. package/src/provider-api/quota-governor.ts +562 -0
  1584. package/src/provider-api/runtime.ts +1 -0
  1585. package/src/provider-api/staged-datasets-aggregate.ts +304 -0
  1586. package/src/provider-api/staged-datasets-store.ts +441 -0
  1587. package/src/provider-api/staging.ts +483 -0
  1588. package/src/resources/agents.ts +65 -0
  1589. package/src/resources/emitter.ts +54 -0
  1590. package/src/resources/handlers.ts +728 -0
  1591. package/src/resources/index.ts +4 -0
  1592. package/src/resources/metadata.ts +252 -0
  1593. package/src/resources/script-helpers.ts +160 -0
  1594. package/src/resources/store.ts +1618 -0
  1595. package/src/review/actions/consume-review-feedback.ts +48 -0
  1596. package/src/review/actions/create-review-comment.ts +108 -0
  1597. package/src/review/actions/delete-review-comment.ts +67 -0
  1598. package/src/review/actions/get-review-feedback.ts +49 -0
  1599. package/src/review/actions/list-review-comments.ts +87 -0
  1600. package/src/review/actions/reply-review-comment.ts +118 -0
  1601. package/src/review/actions/resolve-review-thread.ts +94 -0
  1602. package/src/review/actions/send-review-thread-to-agent.ts +62 -0
  1603. package/src/review/actions/set-review-status.ts +58 -0
  1604. package/src/review/identity.ts +101 -0
  1605. package/src/review/index.ts +45 -0
  1606. package/src/review/mentions.ts +44 -0
  1607. package/src/review/registry.ts +111 -0
  1608. package/src/review/store.ts +997 -0
  1609. package/src/review/types.ts +101 -0
  1610. package/src/router/index.ts +24 -0
  1611. package/src/scripts/agent-engines/list-agent-engines.ts +130 -0
  1612. package/src/scripts/agent-engines/manage-agent-engine.ts +197 -0
  1613. package/src/scripts/agent-engines/set-agent-engine.ts +84 -0
  1614. package/src/scripts/agent-engines/test-agent-engine.ts +174 -0
  1615. package/src/scripts/call-agent.ts +792 -0
  1616. package/src/scripts/chat/index.ts +8 -0
  1617. package/src/scripts/chat/open-chat.ts +56 -0
  1618. package/src/scripts/chat/search-chats.ts +121 -0
  1619. package/src/scripts/core-scripts.ts +22 -0
  1620. package/src/scripts/db/check-scoping.ts +212 -0
  1621. package/src/scripts/db/exec.ts +791 -0
  1622. package/src/scripts/db/index.ts +19 -0
  1623. package/src/scripts/db/migrate-encrypt-credentials.ts +223 -0
  1624. package/src/scripts/db/migrate-encrypt-oauth-tokens.ts +213 -0
  1625. package/src/scripts/db/migrate-user-api-keys.ts +257 -0
  1626. package/src/scripts/db/patch.ts +820 -0
  1627. package/src/scripts/db/query.ts +299 -0
  1628. package/src/scripts/db/reset-dev-owner.ts +285 -0
  1629. package/src/scripts/db/safety.ts +286 -0
  1630. package/src/scripts/db/schema.ts +364 -0
  1631. package/src/scripts/db/scoping.ts +341 -0
  1632. package/src/scripts/db/sqlite-client.ts +78 -0
  1633. package/src/scripts/db/tool-mode.ts +23 -0
  1634. package/src/scripts/db/tool-schemas.ts +31 -0
  1635. package/src/scripts/db/wipe-leaked-builder-keys.ts +201 -0
  1636. package/src/scripts/dev/index.ts +296 -0
  1637. package/src/scripts/dev/list-files.ts +119 -0
  1638. package/src/scripts/dev/read-file.ts +77 -0
  1639. package/src/scripts/dev/search-files.ts +151 -0
  1640. package/src/scripts/dev/shell.ts +111 -0
  1641. package/src/scripts/dev/write-file.ts +56 -0
  1642. package/src/scripts/dev-session.ts +96 -0
  1643. package/src/scripts/docs/index.ts +8 -0
  1644. package/src/scripts/docs/search.ts +274 -0
  1645. package/src/scripts/docs/source-search.ts +363 -0
  1646. package/src/scripts/index.ts +15 -0
  1647. package/src/scripts/manage-agent-loop-settings.ts +84 -0
  1648. package/src/scripts/parse-args.ts +46 -0
  1649. package/src/scripts/resources/delete-memory.ts +67 -0
  1650. package/src/scripts/resources/delete.ts +69 -0
  1651. package/src/scripts/resources/effective.ts +71 -0
  1652. package/src/scripts/resources/index.ts +18 -0
  1653. package/src/scripts/resources/list.ts +103 -0
  1654. package/src/scripts/resources/migrate-learnings.ts +40 -0
  1655. package/src/scripts/resources/read.ts +107 -0
  1656. package/src/scripts/resources/save-memory.ts +99 -0
  1657. package/src/scripts/resources/write.ts +158 -0
  1658. package/src/scripts/runner.ts +339 -0
  1659. package/src/scripts/utils.ts +130 -0
  1660. package/src/search/index.ts +413 -0
  1661. package/src/search-utils/index.ts +112 -0
  1662. package/src/secrets/crypto.ts +228 -0
  1663. package/src/secrets/index.ts +65 -0
  1664. package/src/secrets/onboarding.ts +101 -0
  1665. package/src/secrets/register-framework-secrets.ts +228 -0
  1666. package/src/secrets/register.ts +129 -0
  1667. package/src/secrets/routes.ts +697 -0
  1668. package/src/secrets/schema.ts +52 -0
  1669. package/src/secrets/storage.ts +561 -0
  1670. package/src/secrets/substitution.ts +305 -0
  1671. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +150 -0
  1672. package/src/server/action-change.ts +66 -0
  1673. package/src/server/action-discovery.ts +774 -0
  1674. package/src/server/action-routes.ts +608 -0
  1675. package/src/server/agent-access.ts +72 -0
  1676. package/src/server/agent-chat/action-filters-a2a.ts +339 -0
  1677. package/src/server/agent-chat/browser-team-tools.ts +510 -0
  1678. package/src/server/agent-chat/context-tools.ts +599 -0
  1679. package/src/server/agent-chat/framework-prompts.ts +467 -0
  1680. package/src/server/agent-chat/lazy-fs.ts +11 -0
  1681. package/src/server/agent-chat/mcp-glue.ts +91 -0
  1682. package/src/server/agent-chat/plugin-options.ts +379 -0
  1683. package/src/server/agent-chat/process-run-failure.ts +62 -0
  1684. package/src/server/agent-chat/prompt-resources.ts +1004 -0
  1685. package/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  1686. package/src/server/agent-chat/request-surface.ts +71 -0
  1687. package/src/server/agent-chat/run-code-tools.ts +67 -0
  1688. package/src/server/agent-chat/script-entries.ts +796 -0
  1689. package/src/server/agent-chat/shared-thread.ts +301 -0
  1690. package/src/server/agent-chat/skill-frontmatter.ts +41 -0
  1691. package/src/server/agent-chat-plugin.ts +5930 -0
  1692. package/src/server/agent-discovery.ts +706 -0
  1693. package/src/server/agent-engine-api-key-route.ts +236 -0
  1694. package/src/server/agent-run-context.ts +204 -0
  1695. package/src/server/agent-teams-run-queue.ts +344 -0
  1696. package/src/server/agent-teams.ts +2257 -0
  1697. package/src/server/agents-bundle.ts +464 -0
  1698. package/src/server/analytics.ts +105 -0
  1699. package/src/server/app-base-path.ts +79 -0
  1700. package/src/server/app-name.ts +53 -0
  1701. package/src/server/app-url.ts +184 -0
  1702. package/src/server/attachment-actions.ts +276 -0
  1703. package/src/server/attribution.ts +214 -0
  1704. package/src/server/auth-marketing.ts +260 -0
  1705. package/src/server/auth-plugin.ts +27 -0
  1706. package/src/server/auth.ts +3803 -0
  1707. package/src/server/better-auth-instance.ts +1197 -0
  1708. package/src/server/builder-browser.ts +1701 -0
  1709. package/src/server/builder-design-systems.ts +668 -0
  1710. package/src/server/builder-space.ts +176 -0
  1711. package/src/server/captcha.ts +63 -0
  1712. package/src/server/capture-error.ts +64 -0
  1713. package/src/server/cli-capture.ts +141 -0
  1714. package/src/server/collab-plugin.ts +391 -0
  1715. package/src/server/complete-text.ts +231 -0
  1716. package/src/server/cookie-namespace.ts +159 -0
  1717. package/src/server/core-routes-plugin.ts +4122 -0
  1718. package/src/server/cors-origins.ts +60 -0
  1719. package/src/server/create-server.ts +268 -0
  1720. package/src/server/credential-provider.ts +1202 -0
  1721. package/src/server/csrf.ts +229 -0
  1722. package/src/server/date-utils.ts +42 -0
  1723. package/src/server/deep-link.ts +119 -0
  1724. package/src/server/derived-secret.ts +32 -0
  1725. package/src/server/design-token-utils.ts +1032 -0
  1726. package/src/server/desktop-sso.ts +83 -0
  1727. package/src/server/edge.ts +69 -0
  1728. package/src/server/email-actions.ts +218 -0
  1729. package/src/server/email-template.ts +192 -0
  1730. package/src/server/email-templates.ts +148 -0
  1731. package/src/server/email.ts +219 -0
  1732. package/src/server/embed-route.ts +283 -0
  1733. package/src/server/embed-session.ts +805 -0
  1734. package/src/server/embedded.ts +252 -0
  1735. package/src/server/entry-server.tsx +154 -0
  1736. package/src/server/framework-request-handler.ts +848 -0
  1737. package/src/server/fusion-app.ts +447 -0
  1738. package/src/server/google-auth-mode.ts +34 -0
  1739. package/src/server/google-auth-plugin.ts +496 -0
  1740. package/src/server/google-oauth-credentials.ts +128 -0
  1741. package/src/server/google-oauth.ts +972 -0
  1742. package/src/server/google-realtime-session.ts +182 -0
  1743. package/src/server/h3-helpers.ts +174 -0
  1744. package/src/server/http-response-telemetry.ts +396 -0
  1745. package/src/server/identity-sso-store.ts +304 -0
  1746. package/src/server/identity-sso.ts +514 -0
  1747. package/src/server/index.ts +593 -0
  1748. package/src/server/missing-key.ts +36 -0
  1749. package/src/server/oauth-helpers.ts +44 -0
  1750. package/src/server/oauth-public-origin.ts +44 -0
  1751. package/src/server/oauth-return-url.ts +120 -0
  1752. package/src/server/og-fonts-data.ts +15 -0
  1753. package/src/server/og-fonts.ts +75 -0
  1754. package/src/server/onboarding-html.ts +4040 -0
  1755. package/src/server/open-route.ts +311 -0
  1756. package/src/server/org-admin.ts +28 -0
  1757. package/src/server/poll-events.ts +88 -0
  1758. package/src/server/poll.ts +1224 -0
  1759. package/src/server/prompts/framework-core-compact.ts +107 -0
  1760. package/src/server/prompts/framework-core.ts +143 -0
  1761. package/src/server/prompts/index.ts +16 -0
  1762. package/src/server/prompts/model-overlays.ts +54 -0
  1763. package/src/server/prompts/shared-rules.ts +104 -0
  1764. package/src/server/realtime-voice.ts +967 -0
  1765. package/src/server/recap-image-route.ts +242 -0
  1766. package/src/server/recap-image-store.ts +185 -0
  1767. package/src/server/request-context.ts +416 -0
  1768. package/src/server/request-origin.ts +67 -0
  1769. package/src/server/resources-plugin.ts +119 -0
  1770. package/src/server/schema-prompt.ts +429 -0
  1771. package/src/server/scoped-key-storage.ts +223 -0
  1772. package/src/server/security-headers.ts +170 -0
  1773. package/src/server/self-dispatch.ts +224 -0
  1774. package/src/server/sentry-config.ts +73 -0
  1775. package/src/server/sentry-plugin.ts +138 -0
  1776. package/src/server/sentry.ts +444 -0
  1777. package/src/server/short-lived-token.ts +170 -0
  1778. package/src/server/social-og-image.ts +454 -0
  1779. package/src/server/sse.ts +102 -0
  1780. package/src/server/ssr-handler.ts +466 -0
  1781. package/src/server/transcribe-voice.ts +1076 -0
  1782. package/src/server/voice-providers-status.ts +118 -0
  1783. package/src/server/workspace-oauth.ts +31 -0
  1784. package/src/server/workspace-provider-oauth.ts +970 -0
  1785. package/src/session-replay-iframe-protocol.ts +58 -0
  1786. package/src/settings/handlers.ts +44 -0
  1787. package/src/settings/index.ts +34 -0
  1788. package/src/settings/org-settings.ts +83 -0
  1789. package/src/settings/script-helpers.ts +24 -0
  1790. package/src/settings/store.ts +247 -0
  1791. package/src/settings/user-settings.ts +47 -0
  1792. package/src/setup-connections/index.ts +90 -0
  1793. package/src/setup-connections/onboarding.ts +47 -0
  1794. package/src/shared/agent-access.ts +112 -0
  1795. package/src/shared/agent-chat.ts +124 -0
  1796. package/src/shared/agent-env.ts +46 -0
  1797. package/src/shared/agent-readable-resource.ts +111 -0
  1798. package/src/shared/agent-sidebar-url.ts +39 -0
  1799. package/src/shared/cache-control.ts +25 -0
  1800. package/src/shared/cloudflare-globals.d.ts +34 -0
  1801. package/src/shared/context-xray.ts +172 -0
  1802. package/src/shared/embed-auth.ts +6 -0
  1803. package/src/shared/index.ts +83 -0
  1804. package/src/shared/llm-connection.ts +42 -0
  1805. package/src/shared/markdown-block-split.ts +129 -0
  1806. package/src/shared/mcp-connect-content.ts +130 -0
  1807. package/src/shared/mcp-embed-headers.ts +175 -0
  1808. package/src/shared/mcp-integration-config.ts +101 -0
  1809. package/src/shared/merge-by-id.ts +14 -0
  1810. package/src/shared/oauth-state.ts +39 -0
  1811. package/src/shared/reasoning-effort.ts +228 -0
  1812. package/src/shared/route-warmup-config.ts +128 -0
  1813. package/src/shared/runtime.ts +31 -0
  1814. package/src/shared/social-meta.ts +82 -0
  1815. package/src/shared/streaming-text-smoothing.ts +184 -0
  1816. package/src/shared/truncate.ts +13 -0
  1817. package/src/shared/workspace-app-audience.ts +177 -0
  1818. package/src/shared/workspace-app-id.ts +54 -0
  1819. package/src/sharing/access.ts +585 -0
  1820. package/src/sharing/actions/create-agent-resource-link.ts +91 -0
  1821. package/src/sharing/actions/extension-change.ts +22 -0
  1822. package/src/sharing/actions/list-resource-shares.ts +93 -0
  1823. package/src/sharing/actions/set-resource-visibility.ts +91 -0
  1824. package/src/sharing/actions/share-resource.ts +322 -0
  1825. package/src/sharing/actions/unshare-resource.ts +72 -0
  1826. package/src/sharing/index.ts +35 -0
  1827. package/src/sharing/registry.ts +201 -0
  1828. package/src/sharing/schema.ts +99 -0
  1829. package/src/styles/agent-conversation.css +766 -0
  1830. package/src/styles/agent-native.css +938 -0
  1831. package/src/styles/blocks.css +1717 -0
  1832. package/src/styles/chat-history-list.css +1 -0
  1833. package/src/styles/rich-markdown-editor.css +1 -0
  1834. package/src/tailwind.preset.ts +140 -0
  1835. package/src/templates/chat/.agents/skills/actions/SKILL.md +32 -12
  1836. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +21 -9
  1837. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  1838. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +14 -2
  1839. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  1840. package/src/templates/chat/AGENTS.md +6 -2
  1841. package/src/templates/chat/app/components/layout/Sidebar.tsx +51 -157
  1842. package/src/templates/default/.agents/skills/actions/SKILL.md +32 -12
  1843. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +21 -9
  1844. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  1845. package/src/templates/default/.agents/skills/integration-webhooks/SKILL.md +323 -0
  1846. package/src/templates/default/.agents/skills/onboarding/SKILL.md +56 -0
  1847. package/src/templates/default/.agents/skills/secrets/SKILL.md +273 -0
  1848. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +14 -2
  1849. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  1850. package/src/templates/default/AGENTS.md +26 -18
  1851. package/src/templates/headless/.agents/skills/actions/SKILL.md +512 -0
  1852. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +21 -9
  1853. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  1854. package/src/templates/headless/.agents/skills/integration-webhooks/SKILL.md +323 -0
  1855. package/src/templates/headless/.agents/skills/secrets/SKILL.md +273 -0
  1856. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  1857. package/src/templates/headless/AGENTS.md +8 -0
  1858. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +32 -12
  1859. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +21 -9
  1860. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +7 -0
  1861. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  1862. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +14 -2
  1863. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +6 -0
  1864. package/src/templates/workspace-core/AGENTS.md +4 -0
  1865. package/src/templates/workspace-root/AGENTS.md +4 -0
  1866. package/src/terminal/cli-registry.ts +57 -0
  1867. package/src/terminal/index.ts +22 -0
  1868. package/src/terminal/pty-server.ts +389 -0
  1869. package/src/terminal/terminal-plugin.ts +265 -0
  1870. package/src/testing.ts +23 -0
  1871. package/src/tracking/index.ts +10 -0
  1872. package/src/tracking/providers.ts +422 -0
  1873. package/src/tracking/registry.ts +102 -0
  1874. package/src/tracking/route.ts +108 -0
  1875. package/src/tracking/types.ts +16 -0
  1876. package/src/transcription/builder-transcription.ts +118 -0
  1877. package/src/triggers/actions/list-automations.ts +99 -0
  1878. package/src/triggers/actions/manage-automation.ts +78 -0
  1879. package/src/triggers/actions.ts +333 -0
  1880. package/src/triggers/condition-evaluator.ts +163 -0
  1881. package/src/triggers/dispatcher.ts +536 -0
  1882. package/src/triggers/index.ts +13 -0
  1883. package/src/triggers/routes.ts +322 -0
  1884. package/src/triggers/types.ts +42 -0
  1885. package/src/types/pglite.d.ts +26 -0
  1886. package/src/usage/store.ts +698 -0
  1887. package/src/vite/action-types-plugin.ts +481 -0
  1888. package/src/vite/agent-web-plugin.ts +78 -0
  1889. package/src/vite/agents-bundle-plugin.ts +185 -0
  1890. package/src/vite/client.ts +3039 -0
  1891. package/src/vite/index.ts +21 -0
  1892. package/src/voice/index.ts +18 -0
  1893. package/src/voice/voice-cleanup-prompt.ts +38 -0
  1894. package/src/voice/voice-context.ts +217 -0
  1895. package/src/voice/voice-replacements.ts +75 -0
  1896. package/src/workspace-connections/credentials.ts +603 -0
  1897. package/src/workspace-connections/index.ts +72 -0
  1898. package/src/workspace-connections/lifecycle.ts +43 -0
  1899. package/src/workspace-connections/store.ts +1943 -0
  1900. package/src/workspace-files/index.ts +18 -0
  1901. package/src/workspace-files/store.ts +339 -0
  1902. package/src/workspace-files/tool.ts +266 -0
@@ -0,0 +1,1825 @@
1
+ import { captureError } from "../server/capture-error.js";
2
+ import {
3
+ isLlmCredentialError,
4
+ LLM_MISSING_CREDENTIALS_ERROR_CODE,
5
+ LLM_MISSING_CREDENTIALS_MESSAGE,
6
+ } from "./engine/credential-errors.js";
7
+ import { EngineError } from "./engine/types.js";
8
+ import {
9
+ insertRun,
10
+ insertRunEvent,
11
+ updateRunStatusIfRunning,
12
+ markRunAborted,
13
+ getRunAbortState,
14
+ getRunStatus,
15
+ getRunEventsSince,
16
+ getRunById,
17
+ getRunByThread,
18
+ cleanupOldRuns,
19
+ updateRunHeartbeat,
20
+ bumpRunProgress,
21
+ setRunInFlightMarker,
22
+ reapIfStale,
23
+ reapUnclaimedBackgroundRun,
24
+ shouldRedispatchUnclaimedBackgroundRun,
25
+ reconcileTerminalRunFromEvents,
26
+ ensureTerminalRunEvent,
27
+ getLastTerminalRunEvent,
28
+ resolveErroredRunTerminalEvent,
29
+ setRunError,
30
+ setRunTerminalReason,
31
+ } from "./run-store.js";
32
+ import type { AgentChatEvent, RunEvent, RunStatus } from "./types.js";
33
+
34
+ export interface ActiveRun {
35
+ runId: string;
36
+ threadId: string;
37
+ /** Logical-turn identity (see StartRunOptions.turnId). Defaults to runId. */
38
+ turnId: string;
39
+ events: RunEvent[];
40
+ status: RunStatus;
41
+ subscribers: Set<(event: RunEvent) => void>;
42
+ abort: AbortController;
43
+ abortReason?: string;
44
+ startedAt: number;
45
+ }
46
+
47
+ const activeRuns = new Map<string, ActiveRun>();
48
+ const threadToRun = new Map<string, string>();
49
+
50
+ /** How long to keep completed runs in memory before cleanup (5 min) */
51
+ const CLEANUP_DELAY_MS = 5 * 60 * 1000;
52
+
53
+ /**
54
+ * Default run chunk budget for hosted/serverless deploys.
55
+ *
56
+ * This MUST fire before the two upstream hard walls that otherwise kill a run
57
+ * mid-turn with no chance to hand off:
58
+ * 1. The Builder model gateway keeps a 45s cap only for hosted foreground
59
+ * runs; local and proven background-function runs use longer caps.
60
+ * 2. Serverless functions are hard-killed around 60-65s (the heartbeat then
61
+ * reaps the row as a stale_run).
62
+ * Production data showed every cutoff landing in the 44-70s window with ZERO
63
+ * auto_continue events ever emitted — i.e. the old 45s default raced the 45s
64
+ * gateway and lost, and per-template overrides (e.g. 240_000) pushed it past
65
+ * BOTH walls so it could never fire. 40s leaves ~5s of headroom under the
66
+ * gateway wall to abort, persist the partial turn, write the terminal event,
67
+ * and emit a clean auto_continue so the client resumes seamlessly.
68
+ */
69
+ export const DEFAULT_HOSTED_RUN_SOFT_TIMEOUT_MS = 40_000;
70
+
71
+ /**
72
+ * Hard ceiling for the hosted soft timeout. On a hosted runtime the
73
+ * foreground auto_continue soft timeout can never usefully exceed this — the
74
+ * synchronous function (~60s) wall kills the run first, so a larger configured
75
+ * or env value just guarantees the cutoff is a hard error instead of a graceful
76
+ * hand-off. Any resolved value above this is clamped down for hosted foreground
77
+ * runs. Local dev (non-hosted) is left alone so long-running local turns aren't
78
+ * chunked.
79
+ *
80
+ * IMPORTANT: this clamp is for the INTERACTIVE / foreground path and must NOT
81
+ * be raised. The foreground POST still rides a synchronous serverless function
82
+ * (~60-65s wall), so 40s remains correct there. The only sanctioned exception
83
+ * is the opt-in `backgroundFunction` mode (see
84
+ * `BACKGROUND_SOFT_TIMEOUT_CEILING_MS`), which runs inside a Netlify background
85
+ * function (no ~60s wall, 15-min budget) and therefore can safely outlast 40s.
86
+ */
87
+ export const HOSTED_SOFT_TIMEOUT_CEILING_MS = 40_000;
88
+
89
+ /**
90
+ * Hard ceiling for the soft timeout when a run executes inside a Netlify
91
+ * background function (any deployed function whose name ends in `-background`).
92
+ * Background functions return 202 immediately and run detached for up to 15
93
+ * minutes, so the ~60s synchronous function wall that 40s defends against does
94
+ * NOT apply. 13 minutes leaves ~2 min of headroom under Netlify's 15-min hard
95
+ * kill to abort, persist the partial turn, write the terminal event, and (for
96
+ * the rare >13-min turn) self-fire another background continuation.
97
+ *
98
+ * This ceiling is used ONLY when a caller explicitly opts in with
99
+ * `backgroundFunction: true`. It does not change the foreground/interactive
100
+ * ceiling and does not fire unless the durable-background path dispatched the
101
+ * run into a background function. Per the design doc Guardrail, the 40s
102
+ * interactive clamp stays correct for every non-background run.
103
+ */
104
+ export const BACKGROUND_SOFT_TIMEOUT_CEILING_MS = 13 * 60_000; // 780_000
105
+
106
+ /**
107
+ * Default soft-timeout budget for a background-function run when the caller
108
+ * does not pass an explicit `softTimeoutMs`. Same value as the ceiling — we
109
+ * want a background turn to use nearly its whole 15-min budget before handing
110
+ * off to a chained background continuation.
111
+ */
112
+ export const DEFAULT_BACKGROUND_RUN_SOFT_TIMEOUT_MS =
113
+ BACKGROUND_SOFT_TIMEOUT_CEILING_MS;
114
+
115
+ /**
116
+ * Default no-progress window for a run executing inside a proven durable
117
+ * background function. Keep this below the 13-minute soft timeout so a truly
118
+ * wedged background turn can still checkpoint, persist, and continue before
119
+ * the function budget expires, but far above the foreground 150s window so
120
+ * large Design/Plan/Assets generations are not chopped up while the model is
121
+ * legitimately planning a big tool payload.
122
+ */
123
+ export const DEFAULT_BACKGROUND_NO_PROGRESS_TIMEOUT_MS =
124
+ BACKGROUND_SOFT_TIMEOUT_CEILING_MS - 60_000;
125
+
126
+ /**
127
+ * AUTHORITATIVE no-progress backstop for a run, enforced by the run manager
128
+ * itself (timer-driven, independent of any layer below).
129
+ *
130
+ * The finer-grained watchdogs inside the agent loop (model-stream and
131
+ * action-preparation no-progress, both 90s) only guard the model event stream
132
+ * — a stall in any segment OUTSIDE that guarded loop (engine-call
133
+ * establishment, worker setup between continuation chunks, a wedged transport
134
+ * that emits keepalives while the loop never runs) previously hung forever
135
+ * with the client watching keepalives. This backstop covers every segment by
136
+ * construction: if no REAL progress event (see `shouldBumpProgressForEvent`;
137
+ * keepalives and zero-byte prep activity don't count) lands for this long —
138
+ * and no tool call is in flight (tool execution legitimately emits nothing
139
+ * for minutes and has its own 12-min timeout) — the run manager emits
140
+ * `auto_continue { reason: "no_progress" }` and aborts the chunk, exactly
141
+ * like the soft timeout, so the normal continuation machinery recovers it.
142
+ *
143
+ * Sits above the 90s in-loop watchdogs (they get first chance to recover with
144
+ * better context). Foreground hosted chunks keep this short so the user sees
145
+ * recovery promptly; proven durable-background chunks use
146
+ * `DEFAULT_BACKGROUND_NO_PROGRESS_TIMEOUT_MS` so large outputs can use the
147
+ * background budget. Only armed when a soft-timeout regime is active (hosted
148
+ * runs); local dev stays unbounded.
149
+ */
150
+ export const RUN_NO_PROGRESS_HARD_TIMEOUT_MS = 150_000;
151
+
152
+ /** Default SQL retention for completed run event logs (24 hours). */
153
+ export const DEFAULT_COMPLETED_RUN_RETENTION_MS = 24 * 60 * 60 * 1000;
154
+
155
+ /**
156
+ * Default SQL retention for errored/aborted run event logs (7 days). Kept
157
+ * longer than completed runs so cut-off / failed chats survive for pattern
158
+ * analysis (listErroredRuns) — these are rare and small, and they are exactly
159
+ * the runs we need to study to keep hardening reliability.
160
+ */
161
+ export const DEFAULT_ERRORED_RUN_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
162
+
163
+ /**
164
+ * How recently a terminal run must have started for `/runs/active` to surface
165
+ * it. Reconnect after this window won't replay the run — typical real-world
166
+ * disconnects resolve in seconds, so 10 minutes is generous while keeping us
167
+ * from resurrecting ancient turns when the user reopens an old thread.
168
+ */
169
+ export const TERMINAL_RUN_RECONNECT_WINDOW_MS = 10 * 60 * 1000;
170
+
171
+ /** Fast poll cadence while a SQL-backed SSE subscription is actively receiving rows. */
172
+ export const SQL_SUBSCRIPTION_ACTIVE_POLL_MS = 125;
173
+
174
+ /** Baseline SQL-backed SSE poll cadence when the run is idle. */
175
+ export const SQL_SUBSCRIPTION_IDLE_POLL_MS = 500;
176
+
177
+ /**
178
+ * Keep briefly polling quickly after rows arrive so token streams stay smooth,
179
+ * then back off to the idle cadence if the producer goes quiet.
180
+ */
181
+ export const SQL_SUBSCRIPTION_ACTIVE_GRACE_MS = 2_000;
182
+
183
+ /** Keep terminal/status probes at the historical cadence to bound DB work. */
184
+ export const SQL_SUBSCRIPTION_STATUS_POLL_MS = 500;
185
+
186
+ export function resolveSqlSubscriptionPollMs(
187
+ now: number,
188
+ activePollUntil: number,
189
+ ): number {
190
+ return now < activePollUntil
191
+ ? SQL_SUBSCRIPTION_ACTIVE_POLL_MS
192
+ : SQL_SUBSCRIPTION_IDLE_POLL_MS;
193
+ }
194
+
195
+ const PROVIDER_RATE_LIMITED_ERROR_CODE = "provider_rate_limited";
196
+
197
+ function isPreparingActionActivityEvent(event: AgentChatEvent): boolean {
198
+ if (event.type !== "activity") return false;
199
+ const label = event.label.trim().toLowerCase();
200
+ return label.startsWith("preparing ") && label.includes(" action");
201
+ }
202
+
203
+ function getRunErrorMessage(err: unknown): string {
204
+ if (
205
+ typeof err === "object" &&
206
+ err !== null &&
207
+ "message" in err &&
208
+ typeof err.message === "string" &&
209
+ err.message.trim().length > 0
210
+ ) {
211
+ return err.message;
212
+ }
213
+ return "Unknown error";
214
+ }
215
+
216
+ function getEngineRunErrorCode(err: EngineError): string | undefined {
217
+ if (err.errorCode) return err.errorCode;
218
+ if (err.statusCode === 429) return PROVIDER_RATE_LIMITED_ERROR_CODE;
219
+ return undefined;
220
+ }
221
+
222
+ function getEngineRunErrorDetails(err: EngineError): string | undefined {
223
+ if (err.statusCode === 429) return err.message;
224
+ return undefined;
225
+ }
226
+
227
+ function shouldCaptureRunError(err: unknown): boolean {
228
+ if (!(err instanceof EngineError)) return true;
229
+ const errorCode = getEngineRunErrorCode(err);
230
+ if (isLlmCredentialError(err, errorCode)) return false;
231
+ if (err.statusCode === 401 || err.statusCode === 403) return false;
232
+ if (/^40[13] status code\b/i.test(err.message)) return false;
233
+ if (err.message.trim().toLowerCase() === "connection error.") return false;
234
+ if (!errorCode) return true;
235
+ const normalizedCode = errorCode.toLowerCase();
236
+ return (
237
+ !normalizedCode.startsWith("credits-limit") &&
238
+ normalizedCode !== "builder_gateway_network_error" &&
239
+ normalizedCode !== "provider_rate_limited" &&
240
+ normalizedCode !== "rate_limit_exceeded"
241
+ );
242
+ }
243
+
244
+ export interface StartRunOptions {
245
+ /** Optional internal run chunk budget. When reached, the framework emits an
246
+ * auto-continuation signal instead of a user-facing timeout. Leave unset for
247
+ * no framework-imposed run timeout. */
248
+ softTimeoutMs?: number;
249
+ /** Opt into the hosted/serverless default chunk budget. Only callers with
250
+ * automatic continuation support should enable this. */
251
+ useHostedSoftTimeoutDefault?: boolean;
252
+ /** Stable identity for the logical assistant turn this run belongs to. A
253
+ * turn may span several continuation runs (each chunk is its own run); they
254
+ * share one `turnId` so the durable assistant message can be folded across
255
+ * them instead of dropped per-run. Defaults to the runId (turn == run). */
256
+ turnId?: string;
257
+ /**
258
+ * Opt into the durable-background-function soft-timeout regime for THIS run
259
+ * only. When true, `resolveRunSoftTimeoutMs` lifts the hosted ceiling from
260
+ * 40s to ~13min (`BACKGROUND_SOFT_TIMEOUT_CEILING_MS`) because the run is
261
+ * executing inside a Netlify background function (no ~60s wall). Off by
262
+ * default — the foreground/interactive path never sets this, so its 40s
263
+ * clamp is unchanged. See the design doc + the durable-background dispatch
264
+ * decision in production-agent.ts.
265
+ */
266
+ backgroundFunction?: boolean;
267
+ /**
268
+ * Override the run-manager-level no-progress backstop
269
+ * (`RUN_NO_PROGRESS_HARD_TIMEOUT_MS`). `0` disables it. Defaults to the
270
+ * backstop constant whenever a soft-timeout regime is active (hosted runs)
271
+ * and to disabled otherwise (local dev stays unbounded).
272
+ */
273
+ noProgressTimeoutMs?: number;
274
+ /**
275
+ * Lifecycle metadata persisted to `agent_runs.dispatch_mode` and surfaced to
276
+ * clients through `/runs/active`. This does not change run-manager behavior;
277
+ * callers use it to describe who owns continuation at hosted chunk boundaries.
278
+ */
279
+ dispatchMode?: "foreground" | "foreground-self-chain";
280
+ }
281
+
282
+ export interface ResolveRunSoftTimeoutOptions {
283
+ useHostedDefault?: boolean;
284
+ /**
285
+ * Resolve the soft timeout for a run executing inside a Netlify background
286
+ * function. Lifts the hosted clamp to `BACKGROUND_SOFT_TIMEOUT_CEILING_MS`
287
+ * (~13min) for this invocation only and, when no override/env is supplied,
288
+ * defaults to `DEFAULT_BACKGROUND_RUN_SOFT_TIMEOUT_MS`. Does NOT change the
289
+ * foreground ceiling. Off by default.
290
+ */
291
+ backgroundFunction?: boolean;
292
+ }
293
+
294
+ /**
295
+ * True on hosted/serverless runtimes where the soft-timeout regime applies
296
+ * (see `resolveRunSoftTimeoutMs`, which resolves to 0 — disabled — off these
297
+ * runtimes). Exported so production-agent.ts can gate its foreground
298
+ * first-model-event cap (`FOREGROUND_FIRST_MODEL_EVENT_TIMEOUT_MS`) on the
299
+ * SAME predicate that selects the 40s clamp: the cap only makes sense where
300
+ * that clamp (and the platform wall behind it) exists.
301
+ */
302
+ export function isHostedRuntime(): boolean {
303
+ if (
304
+ process.env.NETLIFY &&
305
+ process.env.NETLIFY !== "false" &&
306
+ process.env.NETLIFY_LOCAL !== "true"
307
+ ) {
308
+ return true;
309
+ }
310
+ if (
311
+ process.env.AWS_LAMBDA_FUNCTION_NAME &&
312
+ process.env.NETLIFY_LOCAL !== "true"
313
+ ) {
314
+ return true;
315
+ }
316
+ return Boolean(
317
+ process.env.CF_PAGES ||
318
+ process.env.VERCEL ||
319
+ process.env.VERCEL_ENV ||
320
+ process.env.RENDER ||
321
+ process.env.FLY_APP_NAME ||
322
+ process.env.K_SERVICE,
323
+ );
324
+ }
325
+
326
+ export function resolveRunSoftTimeoutMs(
327
+ overrideMs?: number,
328
+ options?: ResolveRunSoftTimeoutOptions,
329
+ ): number {
330
+ const hosted = isHostedRuntime();
331
+ const background = options?.backgroundFunction === true;
332
+ // The interactive/foreground ceiling is 40s — the synchronous serverless
333
+ // function wall. A background-function run (opt-in only) has no ~60s wall, so
334
+ // it is allowed to outlast that and is clamped to the larger 13-min ceiling
335
+ // instead. The 40s clamp for non-background hosted runs is unchanged.
336
+ const ceiling = background
337
+ ? BACKGROUND_SOFT_TIMEOUT_CEILING_MS
338
+ : HOSTED_SOFT_TIMEOUT_CEILING_MS;
339
+ // A configured/env soft timeout that exceeds the upstream walls can never
340
+ // actually fire (the gateway/function kills the run first), so clamp it down
341
+ // on hosted runtimes. This is what makes auto_continue reach the client
342
+ // instead of the run dying as builder_gateway_timeout / stale_run. `0` means
343
+ // "disabled" and is never clamped up.
344
+ const clampHosted = (ms: number): number =>
345
+ hosted && ms > ceiling ? ceiling : ms;
346
+
347
+ if (typeof overrideMs === "number" && Number.isFinite(overrideMs)) {
348
+ return clampHosted(Math.max(0, overrideMs));
349
+ }
350
+ const envValue = process.env.AGENT_RUN_SOFT_TIMEOUT_MS;
351
+ if (envValue !== undefined) {
352
+ const raw = Number(envValue);
353
+ if (Number.isFinite(raw) && raw >= 0) return clampHosted(raw);
354
+ }
355
+ // A background-function run uses the full background budget by default; the
356
+ // foreground default (40s) is unchanged.
357
+ if (background) {
358
+ return hosted ? DEFAULT_BACKGROUND_RUN_SOFT_TIMEOUT_MS : 0;
359
+ }
360
+ return options?.useHostedDefault && hosted
361
+ ? DEFAULT_HOSTED_RUN_SOFT_TIMEOUT_MS
362
+ : 0;
363
+ }
364
+
365
+ export function resolveCompletedRunRetentionMs(): number {
366
+ const envValue = process.env.AGENT_RUN_RETENTION_MS;
367
+ if (envValue !== undefined) {
368
+ const raw = Number(envValue);
369
+ if (Number.isFinite(raw) && raw >= 0) return raw;
370
+ }
371
+ return DEFAULT_COMPLETED_RUN_RETENTION_MS;
372
+ }
373
+
374
+ export function resolveErroredRunRetentionMs(): number {
375
+ const envValue = process.env.AGENT_ERRORED_RUN_RETENTION_MS;
376
+ if (envValue !== undefined) {
377
+ const raw = Number(envValue);
378
+ if (Number.isFinite(raw) && raw >= 0) return raw;
379
+ }
380
+ return DEFAULT_ERRORED_RUN_RETENTION_MS;
381
+ }
382
+
383
+ function isTerminalRunEvent(event: AgentChatEvent): boolean {
384
+ return (
385
+ event.type === "done" ||
386
+ event.type === "error" ||
387
+ event.type === "missing_api_key" ||
388
+ event.type === "loop_limit" ||
389
+ event.type === "auto_continue"
390
+ );
391
+ }
392
+
393
+ function terminalEventForcesErroredStatus(event: AgentChatEvent | null) {
394
+ return event?.type === "error" || event?.type === "missing_api_key";
395
+ }
396
+
397
+ function terminalReasonForRun(
398
+ finalStatus: "completed" | "errored" | "aborted",
399
+ terminalEvent: AgentChatEvent | null,
400
+ abortReason: string | undefined,
401
+ completionError: unknown,
402
+ ): string {
403
+ if (terminalEvent?.type === "auto_continue") {
404
+ return terminalEvent.reason || "auto_continue";
405
+ }
406
+ if (terminalEvent?.type === "loop_limit") return "loop_limit";
407
+ if (terminalEvent?.type === "missing_api_key") return "missing_api_key";
408
+ if (terminalEvent?.type === "error") {
409
+ return `error:${terminalEvent.errorCode || "unknown"}`;
410
+ }
411
+ if (finalStatus === "aborted") return `aborted:${abortReason ?? "user"}`;
412
+ if (completionError) return "completion_error";
413
+ if (finalStatus === "errored") return "error:unknown";
414
+ return "done";
415
+ }
416
+
417
+ function abortInMemoryRun(run: ActiveRun, reason: string = "user") {
418
+ run.abortReason = reason;
419
+ run.status = "aborted";
420
+ if (threadToRun.get(run.threadId) === run.runId) {
421
+ threadToRun.delete(run.threadId);
422
+ }
423
+ run.abort.abort(reason);
424
+ for (const subscriber of run.subscribers) {
425
+ try {
426
+ subscriber({ seq: run.events.length, event: { type: "done" } });
427
+ } catch {
428
+ // ignore — subscriber is being removed below
429
+ }
430
+ }
431
+ run.subscribers.clear();
432
+ }
433
+
434
+ /**
435
+ * Start a new agent run in the background.
436
+ * `runFn` receives a `send` callback and an `AbortSignal`.
437
+ * The run continues even if all SSE subscribers disconnect.
438
+ *
439
+ * Events are persisted to SQL for cross-isolate access (Cloudflare Workers).
440
+ */
441
+ export function startRun(
442
+ runId: string,
443
+ threadId: string,
444
+ runFn: (
445
+ send: (event: AgentChatEvent) => void,
446
+ signal: AbortSignal,
447
+ ) => Promise<void>,
448
+ onComplete?: (run: ActiveRun) => void | Promise<void>,
449
+ options?: StartRunOptions,
450
+ ): ActiveRun {
451
+ // If there's already a run for this thread, abort it
452
+ const existingRunId = threadToRun.get(threadId);
453
+ if (existingRunId) {
454
+ abortRun(existingRunId);
455
+ }
456
+
457
+ const abort = new AbortController();
458
+ let softTimedOut = false;
459
+ const run: ActiveRun = {
460
+ runId,
461
+ threadId,
462
+ turnId: options?.turnId ?? runId,
463
+ events: [],
464
+ status: "running",
465
+ subscribers: new Set(),
466
+ abort,
467
+ startedAt: Date.now(),
468
+ };
469
+
470
+ activeRuns.set(runId, run);
471
+ threadToRun.set(threadId, runId);
472
+
473
+ const captureRunPersistenceError = (
474
+ error: unknown,
475
+ phase: "insert-run" | "insert-event",
476
+ extra: Record<string, unknown> = {},
477
+ ) => {
478
+ captureError(error, {
479
+ route: "/_agent-native/agent-chat",
480
+ tags: {
481
+ source: "agent-run-manager",
482
+ phase,
483
+ runStatus: run.status,
484
+ },
485
+ extra: {
486
+ runId,
487
+ threadId,
488
+ eventCount: run.events.length,
489
+ startedAt: run.startedAt,
490
+ ...extra,
491
+ },
492
+ contexts: {
493
+ agentRun: {
494
+ runId,
495
+ threadId,
496
+ status: run.status,
497
+ phase,
498
+ eventCount: run.events.length,
499
+ startedAt: run.startedAt,
500
+ },
501
+ },
502
+ });
503
+ };
504
+
505
+ // Persist run to SQL without blocking the response. Keep the promise so
506
+ // final status cannot race ahead of a slow initial INSERT and then get
507
+ // overwritten by a late row stuck at status='running'.
508
+ const insertOptions = options?.dispatchMode
509
+ ? { dispatchMode: options.dispatchMode }
510
+ : undefined;
511
+ const insertRunPromise = (
512
+ insertOptions
513
+ ? insertRun(runId, threadId, options?.turnId, insertOptions)
514
+ : insertRun(runId, threadId, options?.turnId)
515
+ ).catch((error) => {
516
+ captureRunPersistenceError(error, "insert-run");
517
+ });
518
+
519
+ // Per-run event persistence chain: events are chained so SQL inserts commit
520
+ // in seq order. Without this, a fast seq=5 commit before a slow seq=4 means
521
+ // the SQL poller advances its cursor past seq=4 (lastSeq = 5+1 = 6) and
522
+ // reconnecting clients permanently miss that event (silent gap). Chaining
523
+ // per run ensures order without blocking the fast in-memory SSE path.
524
+ let persistenceChain: Promise<void> = Promise.resolve();
525
+
526
+ // Throttle the durable progress timestamp to at most once per second so
527
+ // a chatty token-by-token stream doesn't translate into one DB write per
528
+ // chunk. The stuck-detector threshold is on the order of tens of seconds,
529
+ // so 1s resolution is plenty.
530
+ let lastProgressBumpAt = 0;
531
+ const preparingActivityBytes = new Map<string, number>();
532
+ const preparingActivityTools = new Map<string, string>();
533
+ const preparingActivityRestartHighWater = new Map<string, number>();
534
+ let eventPersistenceErrorCaptured = false;
535
+ const bumpProgressIfDue = () => {
536
+ const now = Date.now();
537
+ if (now - lastProgressBumpAt < 1000) return;
538
+ lastProgressBumpAt = now;
539
+ bumpRunProgress(runId).catch(() => {});
540
+ };
541
+ const shouldBumpProgressForEvent = (event: AgentChatEvent): boolean => {
542
+ if (event.type === "stream_keepalive") return false;
543
+ if (event.type === "clear") {
544
+ for (const [key, bytes] of preparingActivityBytes) {
545
+ const toolKey = preparingActivityTools.get(key) ?? key;
546
+ preparingActivityRestartHighWater.set(
547
+ toolKey,
548
+ Math.max(preparingActivityRestartHighWater.get(toolKey) ?? 0, bytes),
549
+ );
550
+ }
551
+ preparingActivityBytes.clear();
552
+ preparingActivityTools.clear();
553
+ return false;
554
+ }
555
+ if (event.type === "activity" && isPreparingActionActivityEvent(event)) {
556
+ const toolKey = event.tool?.trim() || event.label.trim();
557
+ const activityKey = `${toolKey}:${event.id?.trim() || "no-id"}`;
558
+ const progressBytes =
559
+ typeof event.progressBytes === "number" &&
560
+ Number.isFinite(event.progressBytes) &&
561
+ event.progressBytes >= 0
562
+ ? Math.floor(event.progressBytes)
563
+ : undefined;
564
+ if (progressBytes === undefined) return false;
565
+ const restartHighWater =
566
+ preparingActivityRestartHighWater.get(toolKey) ?? 0;
567
+ if (!event.id?.trim()) {
568
+ if (progressBytes <= restartHighWater) return false;
569
+ preparingActivityTools.set(activityKey, toolKey);
570
+ preparingActivityBytes.set(
571
+ activityKey,
572
+ Math.max(preparingActivityBytes.get(activityKey) ?? 0, progressBytes),
573
+ );
574
+ if (preparingActivityRestartHighWater.has(toolKey)) {
575
+ preparingActivityRestartHighWater.set(
576
+ toolKey,
577
+ Math.max(restartHighWater, progressBytes),
578
+ );
579
+ }
580
+ return progressBytes > 0;
581
+ }
582
+ const previousBytes = Math.max(
583
+ preparingActivityBytes.get(activityKey) ?? 0,
584
+ restartHighWater,
585
+ );
586
+ if (
587
+ !preparingActivityBytes.has(activityKey) &&
588
+ progressBytes === 0 &&
589
+ !preparingActivityRestartHighWater.has(toolKey)
590
+ ) {
591
+ preparingActivityTools.set(activityKey, toolKey);
592
+ preparingActivityBytes.set(activityKey, 0);
593
+ preparingActivityRestartHighWater.set(toolKey, 0);
594
+ return true;
595
+ }
596
+ if (progressBytes <= previousBytes) {
597
+ preparingActivityTools.set(activityKey, toolKey);
598
+ preparingActivityBytes.set(
599
+ activityKey,
600
+ Math.max(previousBytes, progressBytes),
601
+ );
602
+ return false;
603
+ }
604
+ preparingActivityTools.set(activityKey, toolKey);
605
+ preparingActivityBytes.set(activityKey, progressBytes);
606
+ if (preparingActivityRestartHighWater.has(toolKey)) {
607
+ preparingActivityRestartHighWater.set(
608
+ toolKey,
609
+ Math.max(
610
+ preparingActivityRestartHighWater.get(toolKey) ?? 0,
611
+ progressBytes,
612
+ ),
613
+ );
614
+ }
615
+ return true;
616
+ }
617
+ if (event.type === "tool_start" || event.type === "tool_done") {
618
+ preparingActivityBytes.clear();
619
+ preparingActivityTools.clear();
620
+ preparingActivityRestartHighWater.clear();
621
+ }
622
+ if (event.type === "done" || event.type === "error") {
623
+ preparingActivityBytes.clear();
624
+ preparingActivityTools.clear();
625
+ preparingActivityRestartHighWater.clear();
626
+ }
627
+ return true;
628
+ };
629
+
630
+ // ── No-progress backstop (see RUN_NO_PROGRESS_HARD_TIMEOUT_MS) ──────────
631
+ // Timer-driven and independent of the agent loop, so it fires even when the
632
+ // stall is in a segment the in-loop watchdogs never see (engine-call
633
+ // establishment, setup, a wedged transport emitting keepalives). Tool calls
634
+ // and sub-agent calls in flight suspend it — tool execution legitimately
635
+ // emits nothing for minutes and carries its own 12-min timeout.
636
+ let lastRealProgressAt = Date.now();
637
+ let inFlightWorkCount = 0;
638
+ const trackInFlightWork = (event: AgentChatEvent) => {
639
+ const wasIdle = inFlightWorkCount === 0;
640
+ if (event.type === "tool_start") {
641
+ inFlightWorkCount += 1;
642
+ } else if (event.type === "tool_done") {
643
+ inFlightWorkCount = Math.max(0, inFlightWorkCount - 1);
644
+ } else if (event.type === "agent_call") {
645
+ if (event.status === "start") {
646
+ inFlightWorkCount += 1;
647
+ } else {
648
+ inFlightWorkCount = Math.max(0, inFlightWorkCount - 1);
649
+ }
650
+ } else {
651
+ return; // Not a work-tracking event — no transition possible.
652
+ }
653
+ // Mirror the 0<->N transition into SQL so a stale reaper running in a
654
+ // DIFFERENT isolate (a client's SQL-subscription poll, a sibling
655
+ // isolate's opportunistic cleanup, a fresh boot's startup sweep) can
656
+ // grant this demonstrably-alive run a bounded grace even when THIS
657
+ // isolate's own heartbeat write is failing (e.g. Neon pooler saturation)
658
+ // — `inFlightWorkCount` itself is in-memory and invisible to those other
659
+ // isolates. Fire-and-forget: never block event emission on this write,
660
+ // and a write failure here is no worse than today's behavior (the row
661
+ // just gets no grace). See `setRunInFlightMarker` / `IN_FLIGHT_RUN_STALE_GRACE_MS`
662
+ // in run-store.ts for the full reasoning and the bounded-grace derivation.
663
+ if (wasIdle && inFlightWorkCount > 0) {
664
+ setRunInFlightMarker(runId, true).catch(() => {});
665
+ } else if (!wasIdle && inFlightWorkCount === 0) {
666
+ setRunInFlightMarker(runId, false).catch(() => {});
667
+ }
668
+ };
669
+ const checkNoProgressBackstop = () => {
670
+ if (noProgressTimeoutMs <= 0) return;
671
+ if (run.status !== "running" || abort.signal.aborted) return;
672
+ if (inFlightWorkCount > 0) return;
673
+ if (Date.now() - lastRealProgressAt < noProgressTimeoutMs) return;
674
+ console.error(
675
+ `[run-manager] no real progress for ${noProgressTimeoutMs}ms with no tool in flight — ` +
676
+ `checkpointing run for continuation`,
677
+ runId,
678
+ );
679
+ // Mirror the soft-timeout semantics exactly: the chunk completes (not
680
+ // aborts) at an auto_continue boundary, so the continuation machinery —
681
+ // server-chained for background workers, client-driven for foreground —
682
+ // recovers the turn.
683
+ softTimedOut = true;
684
+ send({ type: "auto_continue", reason: "no_progress" });
685
+ abort.abort("no_progress");
686
+ };
687
+
688
+ // Periodic SQL abort check interval (for cross-isolate abort on Workers).
689
+ // Also self-aborts when our row is no longer status='running' — catches the
690
+ // false-stale-reap zombie scenario where the reaper flipped the row while
691
+ // this isolate was briefly unable to heartbeat (DB latency / GC pause).
692
+ let lastAbortCheck = Date.now() - 3000;
693
+ const checkSqlAbort = () => {
694
+ const now = Date.now();
695
+ if (now - lastAbortCheck < 3000) return;
696
+ lastAbortCheck = now;
697
+ getRunAbortState(runId)
698
+ .then(async (state) => {
699
+ if (state.aborted && !abort.signal.aborted) {
700
+ abortInMemoryRun(run, state.reason ?? "user");
701
+ return;
702
+ }
703
+ // If the row is no longer 'running' (reaped / replaced) and we're
704
+ // still executing, self-abort so we stop executing and don't overwrite
705
+ // the newer state with our terminal write.
706
+ if (!abort.signal.aborted) {
707
+ const status = await getRunStatus(runId);
708
+ if (status !== null && status !== "running") {
709
+ abortInMemoryRun(run, "displaced");
710
+ }
711
+ }
712
+ })
713
+ .catch(() => {});
714
+ };
715
+
716
+ // Heartbeat: bump heartbeat_at every 1.5s so watchers can detect a dead
717
+ // producer (process crash, HMR restart, isolate eviction) quickly and
718
+ // reap the row. Paired with RUN_STALE_MS (15s) — 10x the interval to
719
+ // tolerate transient DB slowness without false positives.
720
+ let consecutiveHeartbeatFailures = 0;
721
+ // Single-flight the heartbeat write. The timer fires every 1.5s but a write
722
+ // can take up to the DB op timeout (~8s) when the Neon pooler is saturated.
723
+ // Firing a fresh write each tick regardless piled up ~5 concurrent writes
724
+ // under contention, each holding a pooler connection — ADDING to the exact
725
+ // connection-cap exhaustion that starves the heartbeat and false-reaps the
726
+ // run as stale. Skip a tick's write while one is still outstanding so a run
727
+ // holds at most one heartbeat connection. The abort/backstop checks below
728
+ // still run every tick (they don't touch the DB on the hot path).
729
+ let heartbeatInFlight = false;
730
+ const heartbeatTimer: ReturnType<typeof setInterval> = setInterval(() => {
731
+ if (!heartbeatInFlight) {
732
+ heartbeatInFlight = true;
733
+ updateRunHeartbeat(runId)
734
+ .then(() => {
735
+ consecutiveHeartbeatFailures = 0;
736
+ })
737
+ .catch((error) => {
738
+ consecutiveHeartbeatFailures += 1;
739
+ // Swallow routine single-tick blips; escalate once failures approach
740
+ // the stale window so false-positive stale_run from silent write
741
+ // failures is diagnosable.
742
+ if (consecutiveHeartbeatFailures >= 3) {
743
+ captureError(error, {
744
+ route: "/_agent-native/agent-chat",
745
+ tags: {
746
+ source: "agent-run-manager",
747
+ phase: "heartbeat",
748
+ consecutiveFailures: String(consecutiveHeartbeatFailures),
749
+ },
750
+ extra: { runId, threadId },
751
+ });
752
+ }
753
+ })
754
+ .finally(() => {
755
+ heartbeatInFlight = false;
756
+ });
757
+ }
758
+ checkSqlAbort();
759
+ checkNoProgressBackstop();
760
+ }, 1500);
761
+ const softTimeoutMs = resolveRunSoftTimeoutMs(options?.softTimeoutMs, {
762
+ useHostedDefault: options?.useHostedSoftTimeoutDefault === true,
763
+ backgroundFunction: options?.backgroundFunction === true,
764
+ });
765
+ // Armed only when a soft-timeout regime is active (hosted): local dev keeps
766
+ // unbounded runs. For 40s foreground chunks the soft timeout always fires
767
+ // first, so in practice this guards the long background chunks.
768
+ const noProgressTimeoutMs =
769
+ options?.noProgressTimeoutMs ??
770
+ (softTimeoutMs > 0
771
+ ? options?.backgroundFunction === true
772
+ ? DEFAULT_BACKGROUND_NO_PROGRESS_TIMEOUT_MS
773
+ : RUN_NO_PROGRESS_HARD_TIMEOUT_MS
774
+ : 0);
775
+ const softTimeoutTimer =
776
+ softTimeoutMs > 0
777
+ ? setTimeout(() => {
778
+ if (run.status !== "running" || abort.signal.aborted) return;
779
+ softTimedOut = true;
780
+ send({
781
+ type: "auto_continue",
782
+ reason: "run_timeout",
783
+ });
784
+ abort.abort("run_timeout");
785
+ }, softTimeoutMs)
786
+ : null;
787
+ let pendingTerminalEvent: RunEvent | null = null;
788
+
789
+ const captureRunError = (error: unknown, phase: "run" | "completion") => {
790
+ const errorCode =
791
+ error instanceof EngineError ? getEngineRunErrorCode(error) : undefined;
792
+ captureError(error, {
793
+ route: "/_agent-native/agent-chat",
794
+ tags: {
795
+ source: "agent-run-manager",
796
+ phase,
797
+ runStatus: run.status,
798
+ softTimedOut: softTimedOut ? "true" : "false",
799
+ abortReason: run.abortReason,
800
+ errorCode,
801
+ },
802
+ extra: {
803
+ runId,
804
+ threadId,
805
+ eventCount: run.events.length,
806
+ startedAt: run.startedAt,
807
+ softTimeoutMs,
808
+ },
809
+ contexts: {
810
+ agentRun: {
811
+ runId,
812
+ threadId,
813
+ status: run.status,
814
+ phase,
815
+ eventCount: run.events.length,
816
+ startedAt: run.startedAt,
817
+ softTimeoutMs,
818
+ softTimedOut,
819
+ abortReason: run.abortReason,
820
+ },
821
+ },
822
+ });
823
+ };
824
+
825
+ const emitRunEvent = (
826
+ runEvent: RunEvent,
827
+ options?: { surfacePersistenceError?: boolean },
828
+ ): Promise<void> => {
829
+ run.events.push(runEvent);
830
+
831
+ // Notify in-memory subscribers (same isolate, fast path)
832
+ for (const subscriber of run.subscribers) {
833
+ try {
834
+ subscriber(runEvent);
835
+ } catch {
836
+ run.subscribers.delete(subscriber);
837
+ }
838
+ }
839
+
840
+ // Bump the durable progress timestamp. Distinct from the heartbeat:
841
+ // heartbeat = "process is up", progress = "real work is happening." The
842
+ // gap between them is what the client-side stuck-detector reads to tell
843
+ // a hung run from a healthy one. Keepalive and zero-byte action prep are
844
+ // liveness only; streamed input bytes, text, and tool lifecycle events are
845
+ // real progress.
846
+ trackInFlightWork(runEvent.event);
847
+ if (shouldBumpProgressForEvent(runEvent.event)) {
848
+ lastRealProgressAt = Date.now();
849
+ bumpProgressIfDue();
850
+ }
851
+
852
+ // Persist event to SQL. Events are chained through persistenceChain so
853
+ // inserts commit in seq order — an out-of-order commit would advance the
854
+ // SQL poller's cursor past the slow row, permanently dropping it for
855
+ // reconnecting clients. Terminal events surface persistence errors so the
856
+ // caller can decide how to handle a failed final write.
857
+ const thisInsert = persistenceChain.then(() =>
858
+ insertRunEvent(runId, runEvent.seq, JSON.stringify(runEvent.event)),
859
+ );
860
+ persistenceChain = thisInsert.catch((error) => {
861
+ if (!eventPersistenceErrorCaptured) {
862
+ eventPersistenceErrorCaptured = true;
863
+ captureRunPersistenceError(error, "insert-event", {
864
+ seq: runEvent.seq,
865
+ eventType: runEvent.event.type,
866
+ });
867
+ }
868
+ });
869
+ const persistence = thisInsert;
870
+ if (!options?.surfacePersistenceError) {
871
+ persistence.catch(() => {});
872
+ }
873
+
874
+ checkSqlAbort();
875
+ return persistence;
876
+ };
877
+
878
+ const send = (event: AgentChatEvent) => {
879
+ if (run.status === "aborted" && abort.signal.aborted) return;
880
+
881
+ const runEvent: RunEvent = { seq: run.events.length, event };
882
+ if (isTerminalRunEvent(event)) {
883
+ pendingTerminalEvent = runEvent;
884
+ return;
885
+ }
886
+
887
+ emitRunEvent(runEvent);
888
+ };
889
+
890
+ // Run in background — intentionally detached from any HTTP connection
891
+ const runPromise = runFn(send, abort.signal)
892
+ .then(() => {
893
+ if (abort.signal.aborted) {
894
+ run.status = softTimedOut ? "completed" : "aborted";
895
+ return;
896
+ }
897
+ run.status = "completed";
898
+ })
899
+ .catch((err) => {
900
+ // Don't surface abort errors — the run was intentionally stopped
901
+ if (abort.signal.aborted) {
902
+ run.status = softTimedOut ? "completed" : "aborted";
903
+ return;
904
+ }
905
+ run.status = "errored";
906
+ if (shouldCaptureRunError(err)) {
907
+ captureRunError(err, "run");
908
+ }
909
+ const errorMessage = getRunErrorMessage(err);
910
+ const errorCode =
911
+ err instanceof EngineError ? getEngineRunErrorCode(err) : undefined;
912
+ const details =
913
+ err instanceof EngineError ? getEngineRunErrorDetails(err) : undefined;
914
+ send({
915
+ type: "error",
916
+ error: errorMessage,
917
+ ...(errorCode ? { errorCode } : {}),
918
+ ...(details ? { details } : {}),
919
+ ...(err instanceof EngineError && err.upgradeUrl
920
+ ? { upgradeUrl: err.upgradeUrl }
921
+ : {}),
922
+ });
923
+ })
924
+ .finally(async () => {
925
+ // Ordering matters here — this is the atomic-complete boundary.
926
+ // Invariant: once agent_runs.status flips to "completed"/"errored"
927
+ // in SQL, thread_data for this turn is already durable. This lets
928
+ // reconnecting clients trust the simple rule "status != running →
929
+ // fetch thread_data" without polling/retrying for a race window
930
+ // where onComplete was still pending.
931
+
932
+ // 1. Await the completion callback (thread_data save). Heartbeat is
933
+ // still ticking so the run doesn't look stale to any concurrent
934
+ // /runs/active check while we wait for SQL writes to land.
935
+ let completionError: unknown = null;
936
+ let terminalPersistenceError: unknown = null;
937
+ const terminalEvent = pendingTerminalEvent?.event ?? null;
938
+ if (
939
+ onComplete &&
940
+ !(run.status === "aborted" && run.abortReason === "no_progress")
941
+ ) {
942
+ try {
943
+ const completionStatus =
944
+ run.status !== "aborted" &&
945
+ terminalEventForcesErroredStatus(terminalEvent)
946
+ ? "errored"
947
+ : run.status;
948
+ const completionRun: ActiveRun =
949
+ pendingTerminalEvent || completionStatus !== run.status
950
+ ? {
951
+ ...run,
952
+ status: completionStatus,
953
+ events: pendingTerminalEvent
954
+ ? [...run.events, pendingTerminalEvent]
955
+ : run.events,
956
+ }
957
+ : run;
958
+ await onComplete(completionRun);
959
+ } catch (err) {
960
+ completionError = err;
961
+ captureRunError(err, "completion");
962
+ console.error(
963
+ "[run-manager] onComplete callback error:",
964
+ err instanceof Error ? err.message : err,
965
+ );
966
+ }
967
+ }
968
+
969
+ // 2. Compute final status. If the completion callback threw, we'd
970
+ // rather mark the run errored than claim success with incomplete
971
+ // thread_data.
972
+ const finalStatus =
973
+ run.status === "aborted"
974
+ ? "aborted"
975
+ : run.status === "errored" ||
976
+ completionError ||
977
+ terminalEventForcesErroredStatus(terminalEvent)
978
+ ? "errored"
979
+ : "completed";
980
+ const terminalReason = terminalReasonForRun(
981
+ finalStatus,
982
+ terminalEvent,
983
+ run.abortReason,
984
+ completionError,
985
+ );
986
+
987
+ // 3. Emit the terminal event only after thread_data is durable. Live
988
+ // SSE clients close on this event and usually fetch thread_data
989
+ // immediately, so emitting it earlier recreates the final-message
990
+ // race this manager is meant to avoid.
991
+ if (finalStatus === "completed" || finalStatus === "errored") {
992
+ // Choose the terminal event payload (done / the stashed terminal /
993
+ // a synthesized error). NOTE: the `seq` carried by
994
+ // `pendingTerminalEvent` was captured by `send()` at stash time as
995
+ // `run.events.length` and is NOT authoritative — if the runFn emitted
996
+ // any more events before it actually stopped on the abort signal,
997
+ // those events were pushed and reused that same seq. Persisting the
998
+ // terminal event with the stale seq would collide with an
999
+ // already-persisted streaming event and get silently dropped by
1000
+ // insertRunEvent's `ON CONFLICT (run_id, seq) DO NOTHING`, so the
1001
+ // client would never see the terminal/continuation signal. We always
1002
+ // re-stamp the seq at emit time (max-seq+1) just below.
1003
+ const terminalEvent: AgentChatEvent =
1004
+ finalStatus === "completed"
1005
+ ? (pendingTerminalEvent?.event ?? { type: "done" })
1006
+ : pendingTerminalEvent?.event.type === "error" ||
1007
+ pendingTerminalEvent?.event.type === "missing_api_key"
1008
+ ? pendingTerminalEvent.event
1009
+ : pendingTerminalEvent?.event.type === "auto_continue"
1010
+ ? // The run was checkpointed at a soft-timeout/loop boundary and
1011
+ // is recoverable: the partial turn is in agent_run_events and
1012
+ // the continuation run will re-attempt the thread_data save.
1013
+ // Even though the completion save failed (finalStatus stays
1014
+ // "errored" for SQL/diagnostics), re-emit the auto_continue so
1015
+ // the client resumes instead of seeing a dead chat.
1016
+ pendingTerminalEvent.event
1017
+ : {
1018
+ type: "error",
1019
+ error: completionError
1020
+ ? "Agent response could not be saved."
1021
+ : "Agent run ended unexpectedly",
1022
+ };
1023
+ const last = run.events[run.events.length - 1];
1024
+ if (!last || !isTerminalRunEvent(last.event)) {
1025
+ // Assign the seq at EMIT time, not at stash time. `run.events` is a
1026
+ // contiguous 0-based log, so `run.events.length` is the next free
1027
+ // seq and can never collide with an event that was pushed after the
1028
+ // terminal event was stashed.
1029
+ const terminal: RunEvent = {
1030
+ seq: run.events.length,
1031
+ event: terminalEvent,
1032
+ };
1033
+ try {
1034
+ await emitRunEvent(terminal, { surfacePersistenceError: true });
1035
+ } catch (err) {
1036
+ terminalPersistenceError = err;
1037
+ captureRunError(err, "completion");
1038
+ console.error(
1039
+ "[run-manager] terminal event persistence error:",
1040
+ err instanceof Error ? err.message : err,
1041
+ );
1042
+ }
1043
+ }
1044
+ }
1045
+ for (const subscriber of run.subscribers) {
1046
+ run.subscribers.delete(subscriber);
1047
+ }
1048
+
1049
+ // 4. Stop the heartbeat — all liveness writes are done.
1050
+ clearInterval(heartbeatTimer);
1051
+ if (softTimeoutTimer) clearTimeout(softTimeoutTimer);
1052
+
1053
+ // 5. Persist final status to SQL. Use the conditional write so a zombie
1054
+ // run (reaped or displaced while executing) cannot clobber the newer
1055
+ // status written by the reaper or a replacement run.
1056
+ try {
1057
+ await insertRunPromise;
1058
+ if (!terminalPersistenceError) {
1059
+ let statusUpdated = false;
1060
+ try {
1061
+ statusUpdated = await updateRunStatusIfRunning(runId, finalStatus);
1062
+ } catch {
1063
+ statusUpdated = false;
1064
+ }
1065
+ if (statusUpdated) {
1066
+ await setRunTerminalReason(runId, terminalReason);
1067
+ } else {
1068
+ await reconcileTerminalRunFromEvents(runId).catch(() => false);
1069
+ }
1070
+ }
1071
+ } catch {
1072
+ // Best-effort — reapIfStale will eventually clean this up via
1073
+ // the heartbeat-stale path.
1074
+ }
1075
+
1076
+ // 5b. Record terminal failure classification for errored runs so
1077
+ // cut-off / failed chats are queryable for pattern analysis. Read
1078
+ // the actual error event the run emitted (errorCode + message) so
1079
+ // diagnostics reflect the real cause (builder_gateway_timeout,
1080
+ // stale_run, context_length_exceeded, completion_error, …).
1081
+ if (finalStatus === "errored") {
1082
+ let errorCode: string | undefined;
1083
+ let errorDetail: string | undefined;
1084
+ const diagnosticEvents = pendingTerminalEvent
1085
+ ? [...run.events, pendingTerminalEvent]
1086
+ : run.events;
1087
+ for (let i = diagnosticEvents.length - 1; i >= 0; i--) {
1088
+ const ev = diagnosticEvents[i].event as {
1089
+ type: string;
1090
+ error?: string;
1091
+ errorCode?: string;
1092
+ details?: string;
1093
+ };
1094
+ if (ev.type === "missing_api_key") {
1095
+ errorCode = LLM_MISSING_CREDENTIALS_ERROR_CODE;
1096
+ errorDetail = LLM_MISSING_CREDENTIALS_MESSAGE;
1097
+ break;
1098
+ } else if (ev.type === "error") {
1099
+ errorCode = ev.errorCode;
1100
+ errorDetail = ev.error ?? ev.details;
1101
+ break;
1102
+ }
1103
+ }
1104
+ if (completionError && !errorCode) {
1105
+ errorCode = "completion_error";
1106
+ errorDetail =
1107
+ errorDetail ??
1108
+ (completionError instanceof Error
1109
+ ? completionError.message
1110
+ : String(completionError));
1111
+ }
1112
+ await setRunError(runId, errorCode ?? "unknown", errorDetail);
1113
+ }
1114
+
1115
+ // 6. Schedule in-memory cleanup + opportunistic old-run pruning.
1116
+ setTimeout(() => {
1117
+ activeRuns.delete(runId);
1118
+ if (threadToRun.get(threadId) === runId) {
1119
+ threadToRun.delete(threadId);
1120
+ }
1121
+ }, CLEANUP_DELAY_MS);
1122
+ cleanupOldRuns(
1123
+ resolveCompletedRunRetentionMs(),
1124
+ resolveErroredRunRetentionMs(),
1125
+ ).catch(() => {});
1126
+ });
1127
+
1128
+ // On Cloudflare Workers, keep the isolate alive for this run
1129
+ try {
1130
+ const cfCtx = (
1131
+ globalThis as typeof globalThis & {
1132
+ __cf_ctx?: { waitUntil(promise: Promise<unknown>): void };
1133
+ }
1134
+ ).__cf_ctx;
1135
+ if (cfCtx?.waitUntil) {
1136
+ cfCtx.waitUntil(runPromise);
1137
+ }
1138
+ } catch {
1139
+ // Not on Workers — ignore
1140
+ }
1141
+
1142
+ return run;
1143
+ }
1144
+
1145
+ /**
1146
+ * Subscribe to a run's events starting from `fromSeq`.
1147
+ * Returns a ReadableStream that replays buffered events then live-tails.
1148
+ * Cancelling the stream only unsubscribes — does NOT abort the agent.
1149
+ *
1150
+ * Falls back to SQL polling when the run is not in local memory
1151
+ * (cross-isolate reconnection on Workers).
1152
+ */
1153
+ export function subscribeToRun(
1154
+ runId: string,
1155
+ fromSeq: number,
1156
+ ): ReadableStream<Uint8Array> | null {
1157
+ const run = activeRuns.get(runId);
1158
+ if (run) {
1159
+ return subscribeInMemory(run, fromSeq);
1160
+ }
1161
+ // Not in local memory — try SQL (cross-isolate path)
1162
+ return subscribeFromSQL(runId, fromSeq);
1163
+ }
1164
+
1165
+ /** In-memory subscription (same isolate, fast path) */
1166
+ function subscribeInMemory(
1167
+ run: ActiveRun,
1168
+ fromSeq: number,
1169
+ ): ReadableStream<Uint8Array> {
1170
+ const encoder = new TextEncoder();
1171
+ let subscriberRef: ((event: RunEvent) => void) | null = null;
1172
+ let pingTimer: ReturnType<typeof setInterval> | null = null;
1173
+
1174
+ return new ReadableStream({
1175
+ start(controller) {
1176
+ const ping = () => {
1177
+ try {
1178
+ controller.enqueue(encoder.encode(`: ping ${Date.now()}\n\n`));
1179
+ } catch {
1180
+ if (subscriberRef) run.subscribers.delete(subscriberRef);
1181
+ if (pingTimer) clearInterval(pingTimer);
1182
+ }
1183
+ };
1184
+ ping();
1185
+ pingTimer = setInterval(ping, 10_000);
1186
+
1187
+ // Replay buffered events from fromSeq
1188
+ for (let i = fromSeq; i < run.events.length; i++) {
1189
+ try {
1190
+ controller.enqueue(
1191
+ encoder.encode(
1192
+ `data: ${JSON.stringify({ ...run.events[i].event, seq: run.events[i].seq })}\n\n`,
1193
+ ),
1194
+ );
1195
+ } catch {
1196
+ return;
1197
+ }
1198
+ }
1199
+
1200
+ // If run is already done, close immediately
1201
+ if (run.status !== "running") {
1202
+ if (pingTimer) clearInterval(pingTimer);
1203
+ controller.close();
1204
+ return;
1205
+ }
1206
+
1207
+ // Subscribe to live events
1208
+ subscriberRef = (event: RunEvent) => {
1209
+ try {
1210
+ controller.enqueue(
1211
+ encoder.encode(
1212
+ `data: ${JSON.stringify({ ...event.event, seq: event.seq })}\n\n`,
1213
+ ),
1214
+ );
1215
+ // Close stream after terminal events
1216
+ if (isTerminalRunEvent(event.event)) {
1217
+ run.subscribers.delete(subscriberRef!);
1218
+ if (pingTimer) clearInterval(pingTimer);
1219
+ controller.close();
1220
+ }
1221
+ } catch {
1222
+ run.subscribers.delete(subscriberRef!);
1223
+ }
1224
+ };
1225
+
1226
+ run.subscribers.add(subscriberRef);
1227
+ },
1228
+ cancel() {
1229
+ // Only unsubscribe — do NOT abort the agent run
1230
+ if (subscriberRef) run.subscribers.delete(subscriberRef);
1231
+ if (pingTimer) clearInterval(pingTimer);
1232
+ },
1233
+ });
1234
+ }
1235
+
1236
+ /** SQL-based subscription (cross-isolate, polling) */
1237
+ function subscribeFromSQL(
1238
+ runId: string,
1239
+ fromSeq: number,
1240
+ ): ReadableStream<Uint8Array> | null {
1241
+ const encoder = new TextEncoder();
1242
+ let cancelled = false;
1243
+ let pollTimer: ReturnType<typeof setTimeout> | null = null;
1244
+ let pingTimer: ReturnType<typeof setInterval> | null = null;
1245
+
1246
+ return new ReadableStream({
1247
+ async start(controller) {
1248
+ let lastSeq = fromSeq;
1249
+ let activePollUntil = 0;
1250
+ let lastStatusCheckAt = 0;
1251
+ const ping = () => {
1252
+ try {
1253
+ controller.enqueue(encoder.encode(`: ping ${Date.now()}\n\n`));
1254
+ } catch {
1255
+ cancelled = true;
1256
+ if (pingTimer) clearInterval(pingTimer);
1257
+ }
1258
+ };
1259
+ ping();
1260
+ pingTimer = setInterval(ping, 10_000);
1261
+
1262
+ const poll = async () => {
1263
+ if (cancelled) return;
1264
+ try {
1265
+ // Read new events from SQL
1266
+ const events = await getRunEventsSince(runId, lastSeq);
1267
+ if (events.length > 0) {
1268
+ activePollUntil = Date.now() + SQL_SUBSCRIPTION_ACTIVE_GRACE_MS;
1269
+ }
1270
+ for (const { seq, eventData } of events) {
1271
+ // Advance the cursor first, before any parse/enqueue branch can
1272
+ // `continue`/`return`. Otherwise a single corrupt (unparseable)
1273
+ // event row is re-fetched on every poll tick forever, wedging the
1274
+ // SSE stream open and never delivering a terminal event.
1275
+ lastSeq = seq + 1;
1276
+ let parsed: any;
1277
+ try {
1278
+ parsed = JSON.parse(eventData);
1279
+ } catch {
1280
+ continue;
1281
+ }
1282
+ try {
1283
+ controller.enqueue(
1284
+ encoder.encode(
1285
+ `data: ${JSON.stringify({ ...parsed, seq })}\n\n`,
1286
+ ),
1287
+ );
1288
+ } catch {
1289
+ cancelled = true;
1290
+ return;
1291
+ }
1292
+
1293
+ // Close on terminal events
1294
+ if (isTerminalRunEvent(parsed)) {
1295
+ if (pingTimer) clearInterval(pingTimer);
1296
+ controller.close();
1297
+ return;
1298
+ }
1299
+ }
1300
+
1301
+ // Check if run completed (no terminal event but status changed)
1302
+ if (events.length === 0) {
1303
+ const now = Date.now();
1304
+ if (now - lastStatusCheckAt < SQL_SUBSCRIPTION_STATUS_POLL_MS) {
1305
+ if (!cancelled) {
1306
+ const pollMs = resolveSqlSubscriptionPollMs(
1307
+ now,
1308
+ activePollUntil,
1309
+ );
1310
+ pollTimer = setTimeout(poll, pollMs);
1311
+ }
1312
+ return;
1313
+ }
1314
+ lastStatusCheckAt = now;
1315
+ // Opportunistically reap a stale producer before trusting SQL's
1316
+ // "running" status — otherwise a crashed server leaves us polling
1317
+ // forever.
1318
+ await reapIfStale(runId).catch(() => {});
1319
+ const run = await getRunById(runId);
1320
+ if (!run || run.status !== "running") {
1321
+ // Run ended — do one final event read, then close
1322
+ const finalEvents = await getRunEventsSince(runId, lastSeq);
1323
+ for (const { seq, eventData } of finalEvents) {
1324
+ // Advance first — see the main poll loop above for why.
1325
+ lastSeq = seq + 1;
1326
+ let parsed: any;
1327
+ try {
1328
+ parsed = JSON.parse(eventData);
1329
+ } catch {
1330
+ continue;
1331
+ }
1332
+ try {
1333
+ controller.enqueue(
1334
+ encoder.encode(
1335
+ `data: ${JSON.stringify({ ...parsed, seq })}\n\n`,
1336
+ ),
1337
+ );
1338
+ } catch {
1339
+ cancelled = true;
1340
+ return;
1341
+ }
1342
+ if (isTerminalRunEvent(parsed)) {
1343
+ if (pingTimer) clearInterval(pingTimer);
1344
+ controller.close();
1345
+ return;
1346
+ }
1347
+ }
1348
+ if (run?.status === "aborted") {
1349
+ try {
1350
+ controller.enqueue(
1351
+ encoder.encode(
1352
+ `data: ${JSON.stringify({ type: "done", seq: lastSeq })}\n\n`,
1353
+ ),
1354
+ );
1355
+ } catch {
1356
+ cancelled = true;
1357
+ return;
1358
+ }
1359
+ } else if (run?.status === "completed") {
1360
+ try {
1361
+ controller.enqueue(
1362
+ encoder.encode(
1363
+ `data: ${JSON.stringify({ type: "done", seq: lastSeq })}\n\n`,
1364
+ ),
1365
+ );
1366
+ } catch {
1367
+ cancelled = true;
1368
+ return;
1369
+ }
1370
+ } else if (run?.status === "errored") {
1371
+ // The run row is terminal but this subscriber's cursor is
1372
+ // already past (or never saw) the terminal event. Prefer the
1373
+ // REAL last terminal event / row error_detail over inventing
1374
+ // a stale_run card — slides prod showed Connection error.
1375
+ // rows being mislabeled as stale_run on reconnect because
1376
+ // this path always synthesized STALE_RUN_ERROR_EVENT.
1377
+ const existing = await getLastTerminalRunEvent(runId).catch(
1378
+ () => null,
1379
+ );
1380
+ const resolved = existing
1381
+ ? { event: existing.event, shouldPersist: false }
1382
+ : resolveErroredRunTerminalEvent(run);
1383
+ if (resolved.shouldPersist) {
1384
+ await ensureTerminalRunEvent(runId, resolved.event).catch(
1385
+ () => {},
1386
+ );
1387
+ }
1388
+ try {
1389
+ controller.enqueue(
1390
+ encoder.encode(
1391
+ `data: ${JSON.stringify({
1392
+ ...resolved.event,
1393
+ seq: existing?.seq ?? lastSeq,
1394
+ })}\n\n`,
1395
+ ),
1396
+ );
1397
+ } catch {
1398
+ cancelled = true;
1399
+ return;
1400
+ }
1401
+ }
1402
+ if (pingTimer) clearInterval(pingTimer);
1403
+ controller.close();
1404
+ return;
1405
+ }
1406
+ }
1407
+
1408
+ // Schedule next poll
1409
+ if (!cancelled) {
1410
+ const pollMs = resolveSqlSubscriptionPollMs(
1411
+ Date.now(),
1412
+ activePollUntil,
1413
+ );
1414
+ pollTimer = setTimeout(poll, pollMs);
1415
+ }
1416
+ } catch {
1417
+ // SQL error — close stream
1418
+ try {
1419
+ if (pingTimer) clearInterval(pingTimer);
1420
+ controller.close();
1421
+ } catch {}
1422
+ }
1423
+ };
1424
+
1425
+ // Verify run exists before starting poll
1426
+ try {
1427
+ const run = await getRunById(runId);
1428
+ if (!run) {
1429
+ if (pingTimer) clearInterval(pingTimer);
1430
+ controller.close();
1431
+ return;
1432
+ }
1433
+ } catch {
1434
+ controller.close();
1435
+ return;
1436
+ }
1437
+
1438
+ await poll();
1439
+ },
1440
+ cancel() {
1441
+ cancelled = true;
1442
+ if (pollTimer) clearTimeout(pollTimer);
1443
+ if (pingTimer) clearInterval(pingTimer);
1444
+ },
1445
+ });
1446
+ }
1447
+
1448
+ /** Get the active run for a thread (if any) — checks memory then SQL */
1449
+ export function getActiveRunForThread(threadId: string): ActiveRun | null {
1450
+ const runId = threadToRun.get(threadId);
1451
+ if (runId) {
1452
+ const run = activeRuns.get(runId);
1453
+ if (run) return run;
1454
+ }
1455
+ return null;
1456
+ }
1457
+
1458
+ /**
1459
+ * Async version that also checks SQL — for cross-isolate access.
1460
+ * Used by the /runs/active endpoint.
1461
+ *
1462
+ * Returns `heartbeatAt` so the client can independently decide a run is
1463
+ * dead even before the server-side stale reap has fired. Returns
1464
+ * `lastProgressAt` so the client-side stuck-detector can show a
1465
+ * user-visible "this chat looks stuck" affordance when a run is alive
1466
+ * (heartbeating) but not actually emitting events. Returns
1467
+ * `awaitingRedispatch` so the client's background follow loop can tell a
1468
+ * legitimately-deferred `chainServerDrivenContinuation` successor (recovery
1469
+ * in progress server-side) apart from a genuinely dead run — see this
1470
+ * field's own doc comment below.
1471
+ */
1472
+ export async function getActiveRunForThreadAsync(threadId: string): Promise<{
1473
+ runId: string;
1474
+ threadId: string;
1475
+ turnId: string;
1476
+ status: string;
1477
+ heartbeatAt: number;
1478
+ lastProgressAt: number | null;
1479
+ /** How the run was dispatched/continued (foreground, foreground-self-chain, background...). */
1480
+ dispatchMode?: string | null;
1481
+ /** Compact terminal classification, e.g. done, run_timeout, stale_run. */
1482
+ terminalReason?: string | null;
1483
+ /**
1484
+ * Last reached `_process-run` worker stage as a JSON string
1485
+ * `{stage,detail?,at}`. Surfaced so a silent background-worker death is
1486
+ * diagnosable from the client WITHOUT the unreadable bg-fn logs.
1487
+ */
1488
+ diagStage?: string | null;
1489
+ /**
1490
+ * True exactly when this run is a `chainServerDrivenContinuation` deferral
1491
+ * (dispatch_mode === 'background', never claimed) still inside
1492
+ * `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` — the same condition this
1493
+ * function already uses below to skip its own `reapUnclaimedBackgroundRun`.
1494
+ * Surfaced on `/runs/active` (agent-chat-plugin.ts) so
1495
+ * `agent-chat-adapter.ts`'s follow loop can tell "silently deferred,
1496
+ * server-side recovery in progress" apart from "dead" and stop counting the
1497
+ * quiet gap against its idle timeout — see the THREE-SITE INVARIANT comment
1498
+ * below and in agent-chat-plugin.ts / production-agent.ts. Always false for
1499
+ * an in-memory run (that isolate IS the live producer) and for any run that
1500
+ * isn't an unclaimed background dispatch.
1501
+ */
1502
+ awaitingRedispatch: boolean;
1503
+ /**
1504
+ * True exactly when this run's `in_flight_since` marker is set — a tool
1505
+ * call or A2A `agent_call` delegation is open and has not yet resolved
1506
+ * (see `setRunInFlightMarker` / `IN_FLIGHT_RUN_STALE_GRACE_MS` in
1507
+ * run-store.ts). This is the SAME signal `reapIfStale` reads to grant its
1508
+ * bounded stale-reap grace — computed here from the identical
1509
+ * `in_flight_since` column via `getRunByThread`, never re-derived, so the
1510
+ * client and the reaper cannot disagree about what "in flight" means.
1511
+ *
1512
+ * Surfaced on `/runs/active` (agent-chat-plugin.ts) as the
1513
+ * server-authoritative alternative to the client-side proxy
1514
+ * `RunStuckBanner` currently infers from unresolved `tool-call` content
1515
+ * parts in the local message list — that proxy can go stale after a
1516
+ * reconnect or reader-mode replay; this cannot, because it is read fresh
1517
+ * from SQL on every poll.
1518
+ */
1519
+ hasInFlightWork: boolean;
1520
+ } | null> {
1521
+ // Check memory first — return both running AND recently-completed runs
1522
+ // that still have events in memory. This allows sub-agent tabs to replay
1523
+ // the full conversation from completed runs via SSE.
1524
+ const memRun = getActiveRunForThread(threadId);
1525
+ if (memRun && (memRun.status === "running" || memRun.events.length > 0)) {
1526
+ const sqlSnapshot = await fetchRunThreadSnapshot(memRun.runId, threadId);
1527
+
1528
+ // FIX 1 (durable-background incident): a terminal in-memory run (chunk
1529
+ // completed at a soft-timeout/no-progress/loop-limit boundary, or any
1530
+ // other terminal outcome) never clears `threadToRun` — it stays this
1531
+ // thread's resident in-memory candidate for up to CLEANUP_DELAY_MS
1532
+ // (5 min), and `fetchRunThreadSnapshot` above returns null the instant
1533
+ // SQL's newest row for the thread is no longer THIS run (i.e. a
1534
+ // successor already exists). Left alone, every poll that lands on this
1535
+ // warm isolate would keep falling back to `memRun.status` below and
1536
+ // never discover that a newer, still-running successor already exists
1537
+ // in SQL — exactly the "stale terminal run masks a live successor" bug
1538
+ // that produced the mid-sentence dead turn. Only pay for the extra SQL
1539
+ // read here, in the terminal-candidate branch; the common "still
1540
+ // running" poll (the vast majority) never reaches it.
1541
+ if (!sqlSnapshot && memRun.status !== "running") {
1542
+ const successor = await fetchNewerNonTerminalRunForSameTurn(
1543
+ threadId,
1544
+ memRun,
1545
+ );
1546
+ if (successor) {
1547
+ return {
1548
+ runId: successor.id,
1549
+ threadId: successor.threadId,
1550
+ turnId: successor.turnId ?? successor.id,
1551
+ status: successor.status,
1552
+ heartbeatAt: successor.heartbeatAt ?? successor.startedAt,
1553
+ lastProgressAt: successor.lastProgressAt,
1554
+ dispatchMode: successor.dispatchMode,
1555
+ terminalReason: successor.terminalReason,
1556
+ diagStage: successor.diagStage,
1557
+ // Definitionally non-terminal and freshly read from SQL above —
1558
+ // never the stale in-memory candidate's own state.
1559
+ awaitingRedispatch: false,
1560
+ hasInFlightWork: successor.inFlightSince != null,
1561
+ };
1562
+ }
1563
+ }
1564
+
1565
+ const status = sqlSnapshot?.status ?? memRun.status;
1566
+ const heartbeatAt =
1567
+ status === "running"
1568
+ ? Date.now()
1569
+ : (sqlSnapshot?.heartbeatAt ?? memRun.startedAt);
1570
+ return {
1571
+ runId: memRun.runId,
1572
+ threadId: memRun.threadId,
1573
+ turnId: memRun.turnId,
1574
+ status,
1575
+ // In-memory means this isolate is the producer. By definition, the
1576
+ // heartbeat is fresh as of "now" while the run is still running. Once
1577
+ // SQL has terminal truth, prefer that timestamp so a stale in-memory
1578
+ // buffer cannot keep the browser believing a finished background run is
1579
+ // still alive.
1580
+ heartbeatAt,
1581
+ // For an in-memory run we don't have a separate "last event emit"
1582
+ // timestamp tracked in JS — the SQL bump is throttled per-second.
1583
+ // Read it back from SQL on demand. For the common case the SQL row
1584
+ // is well under 1s old; if it isn't, the stuck-detector will pick
1585
+ // it up on the next poll cycle.
1586
+ lastProgressAt: sqlSnapshot?.lastProgressAt ?? null,
1587
+ dispatchMode: sqlSnapshot?.dispatchMode ?? null,
1588
+ terminalReason: sqlSnapshot?.terminalReason ?? null,
1589
+ diagStage: sqlSnapshot?.diagStage ?? null,
1590
+ // In-memory means this isolate is the live producer — never the
1591
+ // "deferred, nobody producing" state this flag identifies.
1592
+ awaitingRedispatch: false,
1593
+ // Read from the SAME SQL snapshot the other fields above already read
1594
+ // (`fetchRunThreadSnapshot` -> `getRunByThread`) rather than the
1595
+ // producer's own in-memory `inFlightWorkCount` — this isolate IS the
1596
+ // live producer, but there is no separate in-memory channel wired for
1597
+ // that counter today, and the SQL marker is written on every 0<->N
1598
+ // transition (see run-manager's `trackInFlightWork`), so it is at most
1599
+ // one event behind here — the same tolerance `lastProgressAt` above
1600
+ // already accepts.
1601
+ hasInFlightWork: sqlSnapshot?.inFlightSince != null,
1602
+ };
1603
+ }
1604
+ // Fall back to SQL — also surface recently terminated runs so the client
1605
+ // can reconnect and replay synthesized done/error events instead of
1606
+ // retrying the original POST. Without this, a POST that fails after the
1607
+ // server already accepted (and finished) the run would re-execute the
1608
+ // turn and double-apply mutations: the in-memory branch above already
1609
+ // returns terminal runs whose events are still buffered, but the SQL
1610
+ // path is the only authority once memory has been evicted.
1611
+ try {
1612
+ const sqlRun = await getRunByThread(threadId, { includeTerminal: true });
1613
+ if (!sqlRun) return null;
1614
+ if (sqlRun.status === "running") {
1615
+ // FALLBACK HARDENING: a background-dispatched run that is still UNCLAIMED
1616
+ // (dispatch_mode === 'background', never flipped to 'background-processing')
1617
+ // past the tight grace means the bg-fn worker never started — a silent
1618
+ // async-worker death that the 202-ack inline fallback can't catch. Reap it
1619
+ // early and recoverably (background_worker_never_started) so the run no
1620
+ // longer hangs for the full 90s window. Only fires when there is provably
1621
+ // no live worker; a claimed/heartbeating run is left alone by the
1622
+ // conditional SQL.
1623
+ //
1624
+ // REDISPATCH-BOUND GUARD (must be kept in lockstep with the "Unclaimed
1625
+ // background-run sweep" in agent-chat-plugin.ts and with
1626
+ // chainServerDrivenContinuation's deferral in production-agent.ts — do NOT
1627
+ // remove this guard without reading those two sites):
1628
+ // `chainServerDrivenContinuation` now DEFERS a dispatch-failed successor
1629
+ // instead of erroring it — it leaves the row status='running',
1630
+ // dispatch_mode='background' with its dispatch_payload intact so the sweep
1631
+ // can silently redispatch it. This client poll runs every ~1s while a
1632
+ // client is connected, so without this guard it would reap that deferred
1633
+ // successor at the 25s unclaimed grace — long before the ~2-min sweep —
1634
+ // converting the intended SILENT server-side recovery into a user-visible
1635
+ // `background_worker_never_started` manual-retry error (that terminal
1636
+ // reason does NOT auto-continue in the client follow loop; only `stale_run`
1637
+ // does). While the successor is still inside its redispatch bound we skip
1638
+ // this reap and leave it for the sweep. The outer backstops still bound it:
1639
+ // `reapIfStale` below reaps a heartbeat-stale background row at 90s
1640
+ // (BACKGROUND_RUN_STALE_MS) to the recoverable `stale_run` — which the
1641
+ // follow loop AUTO-continues — and once the redispatch bound is exceeded
1642
+ // this reap fires loudly as before. So recovery stays automatic in the
1643
+ // common case and loud failure is only moved later, never removed.
1644
+ //
1645
+ // `isUnclaimedBackgroundDispatch` also becomes the `awaitingRedispatch`
1646
+ // wire field below once the still-inside-the-bound check passes — see
1647
+ // this function's doc comment and the THREE-SITE INVARIANT comment in
1648
+ // agent-chat-plugin.ts / production-agent.ts.
1649
+ const isUnclaimedBackgroundDispatch =
1650
+ sqlRun.dispatchMode === "background";
1651
+ const stillInsideRedispatchBound = shouldRedispatchUnclaimedBackgroundRun(
1652
+ { startedAt: sqlRun.startedAt },
1653
+ );
1654
+ if (isUnclaimedBackgroundDispatch && !stillInsideRedispatchBound) {
1655
+ const recovered = await reapUnclaimedBackgroundRun(sqlRun.id).catch(
1656
+ () => false,
1657
+ );
1658
+ if (recovered) return null;
1659
+ }
1660
+ // If the producer is dead (no recent heartbeat), reap before the
1661
+ // client can see a stale "running" status and enter a reconnect
1662
+ // loop it can never exit.
1663
+ const reaped = await reapIfStale(sqlRun.id).catch(() => false);
1664
+ if (reaped) return null;
1665
+ return {
1666
+ runId: sqlRun.id,
1667
+ threadId: sqlRun.threadId,
1668
+ turnId: sqlRun.turnId ?? sqlRun.id,
1669
+ status: sqlRun.status,
1670
+ heartbeatAt: sqlRun.heartbeatAt ?? sqlRun.startedAt,
1671
+ lastProgressAt: sqlRun.lastProgressAt,
1672
+ dispatchMode: sqlRun.dispatchMode,
1673
+ terminalReason: sqlRun.terminalReason,
1674
+ diagStage: sqlRun.diagStage,
1675
+ awaitingRedispatch:
1676
+ isUnclaimedBackgroundDispatch && stillInsideRedispatchBound,
1677
+ // Same `in_flight_since` column `reapIfStale` (just called above,
1678
+ // and it did NOT reap this row) reads for its own grace decision —
1679
+ // one source of truth, not a second re-derived notion of "in flight".
1680
+ hasInFlightWork: sqlRun.inFlightSince != null,
1681
+ };
1682
+ }
1683
+ if (sqlRun.status === "completed" || sqlRun.status === "errored") {
1684
+ // Cap how far back we'll surface terminal runs as "active". The goal
1685
+ // is to catch the recently-completed-but-reconnecting case, not to
1686
+ // resurrect ancient turns when the user reopens an old thread.
1687
+ //
1688
+ // Measure age from the run's terminal timestamp, not its start. A
1689
+ // long-running task that ran 11 minutes and completed five seconds
1690
+ // ago should still be reachable — the client's disconnect happened
1691
+ // around completion, so completion time is what matters for the
1692
+ // "is the user still here waiting?" question. Fall back to the last
1693
+ // heartbeat (older deployments may have unset completed_at) and
1694
+ // finally to startedAt for ancient rows.
1695
+ const referenceAt =
1696
+ sqlRun.completedAt ?? sqlRun.heartbeatAt ?? sqlRun.startedAt;
1697
+ const terminalAge = Date.now() - referenceAt;
1698
+ if (terminalAge > TERMINAL_RUN_RECONNECT_WINDOW_MS) return null;
1699
+ return {
1700
+ runId: sqlRun.id,
1701
+ threadId: sqlRun.threadId,
1702
+ turnId: sqlRun.turnId ?? sqlRun.id,
1703
+ status: sqlRun.status,
1704
+ heartbeatAt: sqlRun.heartbeatAt ?? sqlRun.startedAt,
1705
+ lastProgressAt: sqlRun.lastProgressAt,
1706
+ dispatchMode: sqlRun.dispatchMode,
1707
+ terminalReason: sqlRun.terminalReason,
1708
+ diagStage: sqlRun.diagStage,
1709
+ // Terminal already — never the "still deferred, running" state.
1710
+ awaitingRedispatch: false,
1711
+ // Terminal already — no live work can still be in flight.
1712
+ hasInFlightWork: false,
1713
+ };
1714
+ }
1715
+ } catch {
1716
+ // SQL error — fall through
1717
+ }
1718
+ return null;
1719
+ }
1720
+
1721
+ async function fetchRunThreadSnapshot(runId: string, threadId: string) {
1722
+ try {
1723
+ // `getRunById` returns a narrow projection today; ask for the row via
1724
+ // the thread lookup which carries dispatch/terminal/progress fields.
1725
+ const byThread = await getRunByThread(threadId, {
1726
+ includeTerminal: true,
1727
+ });
1728
+ if (byThread && byThread.id === runId) return byThread;
1729
+ return null;
1730
+ } catch {
1731
+ return null;
1732
+ }
1733
+ }
1734
+
1735
+ /**
1736
+ * FIX 1 (durable-background incident): find a genuinely newer, still-running
1737
+ * SQL row for the SAME turn as a terminal in-memory `ActiveRun` — used only
1738
+ * when `fetchRunThreadSnapshot` found no SQL row matching the in-memory
1739
+ * run's own id (i.e. SQL's newest row for the thread is a different run).
1740
+ * `getRunByThread` always returns the thread's newest row by `started_at`,
1741
+ * so this is the same read `fetchRunThreadSnapshot` already made; we just
1742
+ * don't throw its result away when the id doesn't match.
1743
+ *
1744
+ * Scoped to the SAME `turnId` (not just the same thread) so an unrelated,
1745
+ * later user turn on the same thread is never mistaken for a continuation
1746
+ * successor of this one.
1747
+ */
1748
+ async function fetchNewerNonTerminalRunForSameTurn(
1749
+ threadId: string,
1750
+ memRun: ActiveRun,
1751
+ ): Promise<Awaited<ReturnType<typeof getRunByThread>> | null> {
1752
+ try {
1753
+ const latest = await getRunByThread(threadId, { includeTerminal: true });
1754
+ if (
1755
+ latest &&
1756
+ latest.id !== memRun.runId &&
1757
+ latest.status === "running" &&
1758
+ latest.startedAt > memRun.startedAt &&
1759
+ (latest.turnId ?? latest.id) === memRun.turnId
1760
+ ) {
1761
+ return latest;
1762
+ }
1763
+ return null;
1764
+ } catch {
1765
+ return null;
1766
+ }
1767
+ }
1768
+
1769
+ /** Get a run by ID */
1770
+ export function getRun(runId: string): ActiveRun | null {
1771
+ return activeRuns.get(runId) ?? null;
1772
+ }
1773
+
1774
+ function abortRunInMemory(runId: string, reason: string): boolean {
1775
+ const run = activeRuns.get(runId);
1776
+ if (run) {
1777
+ abortInMemoryRun(run, reason);
1778
+ }
1779
+ return !!run;
1780
+ }
1781
+
1782
+ /** Explicitly abort a run (e.g. Stop button). */
1783
+ export function abortRun(runId: string, reason: string = "user"): boolean {
1784
+ const abortedInMemory = abortRunInMemory(runId, reason);
1785
+ // Also mark as aborted in SQL (for cross-isolate abort on Workers)
1786
+ markRunAborted(runId, reason).catch(() => {});
1787
+ return abortedInMemory;
1788
+ }
1789
+
1790
+ /**
1791
+ * Abort a run and wait until the cross-isolate SQL state and terminal event
1792
+ * are durable. Request handlers that start recovery immediately after aborting
1793
+ * must use this path; otherwise the recovery POST can race the old row while
1794
+ * it is still marked running.
1795
+ */
1796
+ export async function abortRunDurably(
1797
+ runId: string,
1798
+ reason: string = "user",
1799
+ ): Promise<boolean> {
1800
+ const abortedInMemory = abortRunInMemory(runId, reason);
1801
+ try {
1802
+ await markRunAborted(runId, reason);
1803
+ } catch (error) {
1804
+ // The local run is already stopped. A transient durable cleanup failure
1805
+ // must not turn the user's Stop/Retry request into a 500 after that
1806
+ // irreversible in-memory outcome. Capture it for repair/reaping and let
1807
+ // the request report the abort it did complete.
1808
+ captureError(error, {
1809
+ route: "/_agent-native/agent-chat/runs/:id/abort",
1810
+ tags: {
1811
+ source: "agent-run-manager",
1812
+ phase: "abort-run",
1813
+ },
1814
+ extra: { runId, reason, abortedInMemory },
1815
+ });
1816
+ console.error(
1817
+ "[run-manager] durable abort persistence failed:",
1818
+ error instanceof Error ? error.message : error,
1819
+ );
1820
+ }
1821
+ return abortedInMemory;
1822
+ }
1823
+
1824
+ // Re-export so callers can avoid importing from run-store directly.
1825
+ export { tryClaimRunSlot } from "./run-store.js";