@agent-native/core 0.113.0 → 0.114.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1508) hide show
  1. package/agent-native.eject.json +164 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +11 -0
  4. package/corpus/core/README.md +61 -174
  5. package/corpus/core/agent-native.eject.json +164 -0
  6. package/corpus/core/docs/content/agent-native-toolkit.mdx +38 -0
  7. package/corpus/core/docs/content/package-lifecycle.mdx +54 -4
  8. package/corpus/core/package.json +15 -2
  9. package/corpus/core/src/cli/eject.ts +1594 -0
  10. package/corpus/core/src/cli/index.ts +16 -0
  11. package/corpus/core/src/client/index.ts +4 -0
  12. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +8 -2
  13. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +7 -2
  14. package/corpus/core/src/client/resources/ResourcesPanel.tsx +17 -3
  15. package/corpus/core/src/client/resources/index.ts +19 -0
  16. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +9 -1
  17. package/corpus/core/src/client/resources/runtime.ts +1 -0
  18. package/corpus/core/src/client/setup-connections/catalog.ts +6 -0
  19. package/corpus/core/src/client/setup-connections/index.ts +1 -0
  20. package/corpus/core/src/client/setup-connections/runtime.ts +1 -0
  21. package/corpus/core/src/connections/catalog.ts +41 -24
  22. package/corpus/core/src/connections/index.ts +1 -0
  23. package/corpus/core/src/connections/runtime.ts +1 -0
  24. package/corpus/core/src/eject/provider-api-definitions.ts +193 -0
  25. package/corpus/core/src/eject/remote-mcp-presets.ts +137 -0
  26. package/corpus/core/src/eject/setup-readiness-ui.tsx +29 -0
  27. package/corpus/core/src/eject/workspace-connections.ts +92 -0
  28. package/corpus/core/src/index.ts +1 -0
  29. package/corpus/core/src/integrations/adapter-overrides.ts +12 -0
  30. package/corpus/core/src/integrations/eject/messaging-adapters.ts +85 -0
  31. package/corpus/core/src/integrations/index.ts +5 -1
  32. package/corpus/core/src/integrations/plugin.ts +34 -12
  33. package/corpus/core/src/integrations/runtime.ts +1 -0
  34. package/corpus/core/src/integrations/types.ts +3 -1
  35. package/corpus/core/src/package-lifecycle/eject-manifest.ts +345 -0
  36. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  37. package/corpus/core/src/provider-api/index.ts +46 -12
  38. package/corpus/core/src/provider-api/runtime.ts +1 -0
  39. package/corpus/core/src/setup-connections/index.ts +1 -0
  40. package/corpus/core/src/shared/merge-by-id.ts +14 -0
  41. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  42. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  43. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  44. package/corpus/core/src/templates/default/AGENTS.md +6 -5
  45. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  46. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  47. package/corpus/core/src/templates/headless/AGENTS.md +5 -4
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  52. package/corpus/core/src/templates/workspace-core/AGENTS.md +4 -4
  53. package/corpus/core/src/templates/workspace-root/AGENTS.md +4 -4
  54. package/corpus/core/src/vite/client.ts +25 -2
  55. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  56. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +9 -6
  57. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  58. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +9 -6
  59. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  60. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +9 -6
  61. package/corpus/templates/brain/actions/remediate-legacy-capture-audiences.ts +167 -0
  62. package/corpus/templates/brain/app/lib/brain-chat-readiness.ts +6 -0
  63. package/corpus/templates/brain/app/routes/_index.tsx +8 -0
  64. package/corpus/templates/brain/app/routes.ts +1 -0
  65. package/corpus/templates/brain/changelog/2026-07-19-ask-starts-immediately-when-builder-s-managed-ai-connection-.md +6 -0
  66. package/corpus/templates/brain/changelog/2026-07-19-slack-and-granola-backfills-now-process-captures-concurrentl.md +6 -0
  67. package/corpus/templates/brain/changelog/2026-07-19-source-review-settings-now-control-knowledge-approval.md +6 -0
  68. package/corpus/templates/brain/changelog/2026-07-19-the-manage-agent-page-now-opens-correctly-from-brain-navigat.md +6 -0
  69. package/corpus/templates/brain/server/db/schema.ts +3 -0
  70. package/corpus/templates/brain/server/lib/brain.ts +41 -2
  71. package/corpus/templates/brain/server/lib/connectors.ts +379 -113
  72. package/corpus/templates/brain/server/lib/meeting-audience.ts +38 -0
  73. package/corpus/templates/brain/server/plugins/db.ts +10 -0
  74. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +6 -4
  75. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  76. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +9 -6
  77. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  78. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  79. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  80. package/corpus/templates/chat/AGENTS.md +3 -2
  81. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  82. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +9 -6
  83. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  84. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +9 -6
  85. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  86. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +9 -6
  87. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  88. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +9 -6
  89. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  90. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +9 -6
  91. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  92. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  93. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +9 -6
  94. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  95. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +9 -6
  96. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  97. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +9 -6
  98. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +15 -13
  99. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  100. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +9 -6
  101. package/corpus/toolkit/CHANGELOG.md +6 -0
  102. package/corpus/toolkit/agent-native.eject.json +411 -0
  103. package/corpus/toolkit/package.json +5 -2
  104. package/dist/cli/eject.d.ts +21 -0
  105. package/dist/cli/eject.d.ts.map +1 -0
  106. package/dist/cli/eject.js +1145 -0
  107. package/dist/cli/eject.js.map +1 -0
  108. package/dist/cli/index.js +15 -0
  109. package/dist/cli/index.js.map +1 -1
  110. package/dist/client/index.d.ts +1 -1
  111. package/dist/client/index.d.ts.map +1 -1
  112. package/dist/client/index.js +1 -1
  113. package/dist/client/index.js.map +1 -1
  114. package/dist/client/resources/McpConnectionSuggestion.d.ts +4 -3
  115. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  116. package/dist/client/resources/McpConnectionSuggestion.js +3 -3
  117. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  118. package/dist/client/resources/McpIntegrationDialog.d.ts +4 -3
  119. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  120. package/dist/client/resources/McpIntegrationDialog.js +2 -2
  121. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  122. package/dist/client/resources/ResourcesPanel.d.ts +4 -1
  123. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  124. package/dist/client/resources/ResourcesPanel.js +9 -7
  125. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  126. package/dist/client/resources/index.d.ts +3 -0
  127. package/dist/client/resources/index.d.ts.map +1 -1
  128. package/dist/client/resources/index.js +3 -0
  129. package/dist/client/resources/index.js.map +1 -1
  130. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -1
  131. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  132. package/dist/client/resources/mcp-integration-catalog.js +6 -2
  133. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  134. package/dist/client/resources/runtime.d.ts +2 -0
  135. package/dist/client/resources/runtime.d.ts.map +1 -0
  136. package/dist/client/resources/runtime.js +2 -0
  137. package/dist/client/resources/runtime.js.map +1 -0
  138. package/dist/client/setup-connections/catalog.d.ts +2 -0
  139. package/dist/client/setup-connections/catalog.d.ts.map +1 -0
  140. package/dist/client/setup-connections/catalog.js +7 -0
  141. package/dist/client/setup-connections/catalog.js.map +1 -0
  142. package/dist/client/setup-connections/index.d.ts +1 -0
  143. package/dist/client/setup-connections/index.d.ts.map +1 -1
  144. package/dist/client/setup-connections/index.js +1 -0
  145. package/dist/client/setup-connections/index.js.map +1 -1
  146. package/dist/client/setup-connections/runtime.d.ts +2 -0
  147. package/dist/client/setup-connections/runtime.d.ts.map +1 -0
  148. package/dist/client/setup-connections/runtime.js +2 -0
  149. package/dist/client/setup-connections/runtime.js.map +1 -0
  150. package/dist/collab/awareness.d.ts +2 -2
  151. package/dist/collab/awareness.d.ts.map +1 -1
  152. package/dist/collab/routes.d.ts +1 -1
  153. package/dist/connections/catalog.d.ts +5 -3
  154. package/dist/connections/catalog.d.ts.map +1 -1
  155. package/dist/connections/catalog.js +16 -8
  156. package/dist/connections/catalog.js.map +1 -1
  157. package/dist/connections/index.d.ts +1 -1
  158. package/dist/connections/index.d.ts.map +1 -1
  159. package/dist/connections/index.js +1 -1
  160. package/dist/connections/index.js.map +1 -1
  161. package/dist/connections/runtime.d.ts +2 -0
  162. package/dist/connections/runtime.d.ts.map +1 -0
  163. package/dist/connections/runtime.js +2 -0
  164. package/dist/connections/runtime.js.map +1 -0
  165. package/dist/eject/provider-api-definitions.d.ts +34 -0
  166. package/dist/eject/provider-api-definitions.d.ts.map +1 -0
  167. package/dist/eject/provider-api-definitions.js +88 -0
  168. package/dist/eject/provider-api-definitions.js.map +1 -0
  169. package/dist/eject/remote-mcp-presets.d.ts +17 -0
  170. package/dist/eject/remote-mcp-presets.d.ts.map +1 -0
  171. package/dist/eject/remote-mcp-presets.js +81 -0
  172. package/dist/eject/remote-mcp-presets.js.map +1 -0
  173. package/dist/eject/setup-readiness-ui.d.ts +7 -0
  174. package/dist/eject/setup-readiness-ui.d.ts.map +1 -0
  175. package/dist/eject/setup-readiness-ui.js +13 -0
  176. package/dist/eject/setup-readiness-ui.js.map +1 -0
  177. package/dist/eject/workspace-connections.d.ts +11 -0
  178. package/dist/eject/workspace-connections.d.ts.map +1 -0
  179. package/dist/eject/workspace-connections.js +47 -0
  180. package/dist/eject/workspace-connections.js.map +1 -0
  181. package/dist/index.d.ts +1 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +1 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/integrations/adapter-overrides.d.ts +3 -0
  186. package/dist/integrations/adapter-overrides.d.ts.map +1 -0
  187. package/dist/integrations/adapter-overrides.js +7 -0
  188. package/dist/integrations/adapter-overrides.js.map +1 -0
  189. package/dist/integrations/eject/messaging-adapters.d.ts +12 -0
  190. package/dist/integrations/eject/messaging-adapters.d.ts.map +1 -0
  191. package/dist/integrations/eject/messaging-adapters.js +49 -0
  192. package/dist/integrations/eject/messaging-adapters.js.map +1 -0
  193. package/dist/integrations/index.d.ts +3 -2
  194. package/dist/integrations/index.d.ts.map +1 -1
  195. package/dist/integrations/index.js +2 -1
  196. package/dist/integrations/index.js.map +1 -1
  197. package/dist/integrations/plugin.d.ts +32 -1
  198. package/dist/integrations/plugin.d.ts.map +1 -1
  199. package/dist/integrations/plugin.js +19 -12
  200. package/dist/integrations/plugin.js.map +1 -1
  201. package/dist/integrations/runtime.d.ts +2 -0
  202. package/dist/integrations/runtime.d.ts.map +1 -0
  203. package/dist/integrations/runtime.js +2 -0
  204. package/dist/integrations/runtime.js.map +1 -0
  205. package/dist/integrations/types.d.ts +3 -1
  206. package/dist/integrations/types.d.ts.map +1 -1
  207. package/dist/integrations/types.js.map +1 -1
  208. package/dist/notifications/routes.d.ts +3 -3
  209. package/dist/package-lifecycle/eject-manifest.d.ts +43 -0
  210. package/dist/package-lifecycle/eject-manifest.d.ts.map +1 -0
  211. package/dist/package-lifecycle/eject-manifest.js +219 -0
  212. package/dist/package-lifecycle/eject-manifest.js.map +1 -0
  213. package/dist/package-lifecycle/index.d.ts +1 -0
  214. package/dist/package-lifecycle/index.d.ts.map +1 -1
  215. package/dist/package-lifecycle/index.js +1 -0
  216. package/dist/package-lifecycle/index.js.map +1 -1
  217. package/dist/progress/routes.d.ts +1 -1
  218. package/dist/provider-api/actions/custom-provider-registration.d.ts +4 -4
  219. package/dist/provider-api/actions/provider-api.d.ts +8 -8
  220. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  221. package/dist/provider-api/index.d.ts +6 -2
  222. package/dist/provider-api/index.d.ts.map +1 -1
  223. package/dist/provider-api/index.js +25 -12
  224. package/dist/provider-api/index.js.map +1 -1
  225. package/dist/provider-api/runtime.d.ts +2 -0
  226. package/dist/provider-api/runtime.d.ts.map +1 -0
  227. package/dist/provider-api/runtime.js +2 -0
  228. package/dist/provider-api/runtime.js.map +1 -0
  229. package/dist/secrets/routes.d.ts +9 -9
  230. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  231. package/dist/server/transcribe-voice.d.ts +1 -1
  232. package/dist/setup-connections/index.d.ts +1 -1
  233. package/dist/setup-connections/index.d.ts.map +1 -1
  234. package/dist/setup-connections/index.js +1 -1
  235. package/dist/setup-connections/index.js.map +1 -1
  236. package/dist/shared/merge-by-id.d.ts +5 -0
  237. package/dist/shared/merge-by-id.d.ts.map +1 -0
  238. package/dist/shared/merge-by-id.js +7 -0
  239. package/dist/shared/merge-by-id.js.map +1 -0
  240. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  241. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  242. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  243. package/dist/templates/chat/AGENTS.md +3 -2
  244. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  245. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  246. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  247. package/dist/templates/default/AGENTS.md +6 -5
  248. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  249. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  250. package/dist/templates/headless/AGENTS.md +5 -4
  251. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  252. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  253. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  254. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  255. package/dist/templates/workspace-core/AGENTS.md +4 -4
  256. package/dist/templates/workspace-root/AGENTS.md +4 -4
  257. package/dist/vite/client.d.ts.map +1 -1
  258. package/dist/vite/client.js +22 -2
  259. package/dist/vite/client.js.map +1 -1
  260. package/docs/content/agent-native-toolkit.mdx +38 -0
  261. package/docs/content/package-lifecycle.mdx +54 -4
  262. package/package.json +15 -2
  263. package/src/a2a/agent-card.ts +83 -0
  264. package/src/a2a/artifact-response.ts +1648 -0
  265. package/src/a2a/auth-policy.ts +66 -0
  266. package/src/a2a/caller-auth.ts +102 -0
  267. package/src/a2a/client.ts +876 -0
  268. package/src/a2a/correlation.ts +50 -0
  269. package/src/a2a/handlers.ts +1285 -0
  270. package/src/a2a/index.ts +50 -0
  271. package/src/a2a/invoke.ts +348 -0
  272. package/src/a2a/response-text.ts +53 -0
  273. package/src/a2a/server.ts +586 -0
  274. package/src/a2a/task-store.ts +917 -0
  275. package/src/a2a/types.ts +221 -0
  276. package/src/a2a-claims.ts +52 -0
  277. package/src/action-change-marker.ts +74 -0
  278. package/src/action-ui.ts +38 -0
  279. package/src/action.ts +1406 -0
  280. package/src/adapters/cli/index.ts +6 -0
  281. package/src/adapters/cli/registry.ts +73 -0
  282. package/src/adapters/cli/shell-adapter.ts +92 -0
  283. package/src/adapters/cli/types.ts +27 -0
  284. package/src/agent/action-continuation-guidance.ts +38 -0
  285. package/src/agent/app-model-defaults.ts +201 -0
  286. package/src/agent/context-xray/actions/context-evict.ts +56 -0
  287. package/src/agent/context-xray/actions/context-manifest-get.ts +75 -0
  288. package/src/agent/context-xray/actions/context-pin.ts +56 -0
  289. package/src/agent/context-xray/actions/context-preview-get.ts +134 -0
  290. package/src/agent/context-xray/actions/context-report.ts +75 -0
  291. package/src/agent/context-xray/actions/context-restore.ts +51 -0
  292. package/src/agent/context-xray/actions/errors.ts +40 -0
  293. package/src/agent/context-xray/apply-directives.ts +137 -0
  294. package/src/agent/context-xray/directives-store.ts +178 -0
  295. package/src/agent/context-xray/identity.ts +37 -0
  296. package/src/agent/context-xray/manifest.ts +284 -0
  297. package/src/agent/context-xray/migrations.ts +32 -0
  298. package/src/agent/context-xray/plugin.ts +23 -0
  299. package/src/agent/context-xray/schema.ts +17 -0
  300. package/src/agent/context-xray/segments.ts +194 -0
  301. package/src/agent/context-xray/tokenize.ts +93 -0
  302. package/src/agent/default-model.ts +5 -0
  303. package/src/agent/durable-background.ts +547 -0
  304. package/src/agent/engine/ai-sdk-engine.ts +565 -0
  305. package/src/agent/engine/anthropic-engine.ts +320 -0
  306. package/src/agent/engine/builder-engine.ts +1110 -0
  307. package/src/agent/engine/builder-gateway-headers.ts +44 -0
  308. package/src/agent/engine/builtin.ts +122 -0
  309. package/src/agent/engine/context-directives-transform.ts +73 -0
  310. package/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  311. package/src/agent/engine/credential-errors.ts +69 -0
  312. package/src/agent/engine/index.ts +54 -0
  313. package/src/agent/engine/openai-compatible-endpoint.ts +25 -0
  314. package/src/agent/engine/output-tokens.ts +181 -0
  315. package/src/agent/engine/provider-env-vars.ts +69 -0
  316. package/src/agent/engine/registry.ts +853 -0
  317. package/src/agent/engine/tool-call-journal-seed.ts +85 -0
  318. package/src/agent/engine/translate-ai-sdk.ts +407 -0
  319. package/src/agent/engine/translate-anthropic.ts +611 -0
  320. package/src/agent/engine/types.ts +310 -0
  321. package/src/agent/harness/acp-adapter.ts +893 -0
  322. package/src/agent/harness/acp-builtin.ts +70 -0
  323. package/src/agent/harness/ai-sdk-adapter.ts +509 -0
  324. package/src/agent/harness/background.ts +365 -0
  325. package/src/agent/harness/builtin.ts +50 -0
  326. package/src/agent/harness/index.ts +86 -0
  327. package/src/agent/harness/lifecycle.ts +498 -0
  328. package/src/agent/harness/registry.ts +97 -0
  329. package/src/agent/harness/runner.ts +182 -0
  330. package/src/agent/harness/store.ts +466 -0
  331. package/src/agent/harness/translate.ts +130 -0
  332. package/src/agent/harness/types.ts +129 -0
  333. package/src/agent/index.ts +32 -0
  334. package/src/agent/loop-settings.ts +186 -0
  335. package/src/agent/model-config.ts +363 -0
  336. package/src/agent/observational-memory/compactor.ts +78 -0
  337. package/src/agent/observational-memory/config.ts +78 -0
  338. package/src/agent/observational-memory/index.ts +79 -0
  339. package/src/agent/observational-memory/internal-run.ts +89 -0
  340. package/src/agent/observational-memory/message-text.ts +49 -0
  341. package/src/agent/observational-memory/migrations.ts +44 -0
  342. package/src/agent/observational-memory/observer.ts +128 -0
  343. package/src/agent/observational-memory/plugin.ts +35 -0
  344. package/src/agent/observational-memory/prompts.ts +53 -0
  345. package/src/agent/observational-memory/read.ts +131 -0
  346. package/src/agent/observational-memory/reflector.ts +119 -0
  347. package/src/agent/observational-memory/schema.ts +48 -0
  348. package/src/agent/observational-memory/store.ts +275 -0
  349. package/src/agent/observational-memory/types.ts +65 -0
  350. package/src/agent/processors.ts +209 -0
  351. package/src/agent/production-agent.ts +8254 -0
  352. package/src/agent/run-loop-with-resume.ts +394 -0
  353. package/src/agent/run-manager.ts +1825 -0
  354. package/src/agent/run-ownership.ts +75 -0
  355. package/src/agent/run-store.ts +2601 -0
  356. package/src/agent/runtime-context.ts +169 -0
  357. package/src/agent/thread-data-builder.ts +1584 -0
  358. package/src/agent/tool-call-journal.ts +368 -0
  359. package/src/agent/tool-error-redaction.ts +52 -0
  360. package/src/agent/tool-result-images.ts +178 -0
  361. package/src/agent/tool-search.ts +376 -0
  362. package/src/agent/types.ts +372 -0
  363. package/src/agent-native/index.ts +198 -0
  364. package/src/agent-web/config.ts +253 -0
  365. package/src/agent-web/generator.ts +382 -0
  366. package/src/agent-web/index.ts +36 -0
  367. package/src/appearance/actions/change-appearance.ts +35 -0
  368. package/src/application-state/emitter.ts +81 -0
  369. package/src/application-state/handlers.ts +121 -0
  370. package/src/application-state/index.ts +44 -0
  371. package/src/application-state/script-helpers.ts +155 -0
  372. package/src/application-state/store.ts +274 -0
  373. package/src/assets/branding/agent-native.icon/Assets/background.svg +3 -0
  374. package/src/assets/branding/agent-native.icon/Assets/foreground.svg +12 -0
  375. package/src/assets/branding/agent-native.icon/icon.json +49 -0
  376. package/src/assets/branding/favicon.png +0 -0
  377. package/src/assets/branding/favicon.svg +1 -0
  378. package/src/assets/branding/icon-on-dark.svg +10 -0
  379. package/src/assets/branding/icon-on-light.svg +10 -0
  380. package/src/assets/branding/mac-app-icon.svg +1 -0
  381. package/src/assets/branding/slack-bot/agent-native-1024.png +0 -0
  382. package/src/assets/branding/slack-bot/agent-native-512.png +0 -0
  383. package/src/assets/branding/tray-icon.svg +6 -0
  384. package/src/assets/branding/wordmark-on-dark.svg +21 -0
  385. package/src/assets/branding/wordmark-on-light.svg +21 -0
  386. package/src/assets/fonts/LICENSE_LIBERATION +96 -0
  387. package/src/assets/fonts/LICENSE_NOTO_NASKH_ARABIC +93 -0
  388. package/src/assets/fonts/LiberationSans-Bold.ttf +0 -0
  389. package/src/assets/fonts/LiberationSans-Regular.ttf +0 -0
  390. package/src/assets/fonts/NotoNaskhArabic-Variable.ttf +0 -0
  391. package/src/audit/actions/export-audit-events.ts +162 -0
  392. package/src/audit/actions/get-audit-event.ts +24 -0
  393. package/src/audit/actions/list-audit-events.ts +66 -0
  394. package/src/audit/cleanup-job.ts +100 -0
  395. package/src/audit/config.ts +90 -0
  396. package/src/audit/index.ts +43 -0
  397. package/src/audit/record.ts +180 -0
  398. package/src/audit/redact.ts +109 -0
  399. package/src/audit/store.ts +346 -0
  400. package/src/audit/types.ts +141 -0
  401. package/src/automation/index.ts +802 -0
  402. package/src/brand-kit/brand-signals.ts +124 -0
  403. package/src/brand-kit/fig/index.ts +64 -0
  404. package/src/brand-kit/index.ts +72 -0
  405. package/src/brand-kit/types.ts +113 -0
  406. package/src/browser-sessions/actions.ts +302 -0
  407. package/src/browser-sessions/routes.ts +234 -0
  408. package/src/browser-sessions/store.ts +679 -0
  409. package/src/browser-sessions/types.ts +84 -0
  410. package/src/changelog/parse.ts +328 -0
  411. package/src/chat-threads/emitter.ts +22 -0
  412. package/src/chat-threads/schema.ts +43 -0
  413. package/src/chat-threads/store.ts +1311 -0
  414. package/src/checkpoints/index.ts +15 -0
  415. package/src/checkpoints/service.ts +142 -0
  416. package/src/checkpoints/store.ts +153 -0
  417. package/src/cli/add.ts +425 -0
  418. package/src/cli/agent.ts +424 -0
  419. package/src/cli/agents.ts +122 -0
  420. package/src/cli/app-skill.ts +1455 -0
  421. package/src/cli/atomic-json-file.ts +324 -0
  422. package/src/cli/audit-agent-web.ts +324 -0
  423. package/src/cli/changelog.ts +199 -0
  424. package/src/cli/claude-code-participant.ts +515 -0
  425. package/src/cli/code-agent-commands.ts +270 -0
  426. package/src/cli/code-agent-connector.ts +1109 -0
  427. package/src/cli/code-agent-executor.ts +1970 -0
  428. package/src/cli/code-agent-output-smoother.ts +140 -0
  429. package/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  430. package/src/cli/code-agent-runs.ts +548 -0
  431. package/src/cli/code.ts +1805 -0
  432. package/src/cli/codex-cli-participant.ts +496 -0
  433. package/src/cli/connect.ts +2714 -0
  434. package/src/cli/content-local.ts +442 -0
  435. package/src/cli/context-xray-local.ts +2193 -0
  436. package/src/cli/create-workspace.ts +30 -0
  437. package/src/cli/create.ts +2247 -0
  438. package/src/cli/deploy-build.ts +50 -0
  439. package/src/cli/design-connect.ts +3187 -0
  440. package/src/cli/doctor.ts +472 -0
  441. package/src/cli/eject.ts +1594 -0
  442. package/src/cli/eval.ts +134 -0
  443. package/src/cli/gateway-helpers.ts +70 -0
  444. package/src/cli/index.ts +1217 -0
  445. package/src/cli/info.ts +105 -0
  446. package/src/cli/invoke.ts +288 -0
  447. package/src/cli/mcp-config-writers.ts +857 -0
  448. package/src/cli/mcp.ts +594 -0
  449. package/src/cli/migrate.ts +1813 -0
  450. package/src/cli/migration-codemod.ts +646 -0
  451. package/src/cli/multi-frontier-runs.ts +1952 -0
  452. package/src/cli/package-lifecycle.ts +823 -0
  453. package/src/cli/plan-blocks.ts +143 -0
  454. package/src/cli/plan-local.ts +3189 -0
  455. package/src/cli/plan-publish-store.ts +138 -0
  456. package/src/cli/pr-visual-recap-workflow.ts +2 -0
  457. package/src/cli/recap.ts +5 -0
  458. package/src/cli/setup-agents.ts +120 -0
  459. package/src/cli/skills-content/assets-skill.ts +83 -0
  460. package/src/cli/skills-content/canvas.ts +153 -0
  461. package/src/cli/skills-content/connection.ts +52 -0
  462. package/src/cli/skills-content/content-skill.ts +120 -0
  463. package/src/cli/skills-content/design-exploration-skill.ts +118 -0
  464. package/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  465. package/src/cli/skills-content/document-quality.ts +196 -0
  466. package/src/cli/skills-content/exemplar.ts +69 -0
  467. package/src/cli/skills-content/help.ts +77 -0
  468. package/src/cli/skills-content/index.ts +22 -0
  469. package/src/cli/skills-content/local-files.ts +100 -0
  470. package/src/cli/skills-content/plan-setup-auth.ts +80 -0
  471. package/src/cli/skills-content/visual-plan-skill.ts +493 -0
  472. package/src/cli/skills-content/visual-recap-skill.ts +553 -0
  473. package/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  474. package/src/cli/skills-content/wireframe.ts +349 -0
  475. package/src/cli/skills.ts +4340 -0
  476. package/src/cli/sync-builder-starter-manifest.ts +631 -0
  477. package/src/cli/telemetry.ts +136 -0
  478. package/src/cli/templates-meta.ts +269 -0
  479. package/src/cli/upgrade.ts +956 -0
  480. package/src/cli/visualize-repo.ts +715 -0
  481. package/src/cli/workspace-dev.ts +1486 -0
  482. package/src/cli/workspacify.ts +258 -0
  483. package/src/client/AgentAskPopover.tsx +89 -0
  484. package/src/client/AgentChatHome.tsx +66 -0
  485. package/src/client/AgentNative.tsx +161 -0
  486. package/src/client/AgentNativeEmbedded.tsx +288 -0
  487. package/src/client/AgentNativeFrame.tsx +151 -0
  488. package/src/client/AgentPanel.tsx +3437 -0
  489. package/src/client/AgentTaskCard.tsx +273 -0
  490. package/src/client/AppearancePicker.tsx +79 -0
  491. package/src/client/AssistantChat.tsx +5793 -0
  492. package/src/client/ClientOnly.tsx +22 -0
  493. package/src/client/CommandMenu.tsx +726 -0
  494. package/src/client/ConnectBuilderCard.tsx +390 -0
  495. package/src/client/DefaultSpinner.tsx +47 -0
  496. package/src/client/ErrorBoundary.tsx +359 -0
  497. package/src/client/ErrorReportActions.tsx +69 -0
  498. package/src/client/FeedbackButton.tsx +553 -0
  499. package/src/client/HighlightedCodeBlock.tsx +173 -0
  500. package/src/client/IframeEmbed.tsx +151 -0
  501. package/src/client/KeepTabOpenNotice.tsx +181 -0
  502. package/src/client/MultiTabAssistantChat.tsx +2576 -0
  503. package/src/client/NewWorkspaceAppFlow.tsx +525 -0
  504. package/src/client/PoweredByBadge.tsx +284 -0
  505. package/src/client/RunStuckBanner.tsx +431 -0
  506. package/src/client/StarfieldBackground.tsx +466 -0
  507. package/src/client/Turnstile.tsx +125 -0
  508. package/src/client/active-run-state.ts +139 -0
  509. package/src/client/agent-chat/index.ts +279 -0
  510. package/src/client/agent-chat-adapter.ts +3692 -0
  511. package/src/client/agent-chat.ts +1233 -0
  512. package/src/client/agent-engine-key.ts +122 -0
  513. package/src/client/agent-page/AgentContextTab.tsx +487 -0
  514. package/src/client/agent-page/AgentEmptyState.tsx +44 -0
  515. package/src/client/agent-page/AgentJobsTab.tsx +441 -0
  516. package/src/client/agent-page/AgentTabFrame.tsx +39 -0
  517. package/src/client/agent-page/AgentTabsPage.tsx +1096 -0
  518. package/src/client/agent-page/types.ts +18 -0
  519. package/src/client/agent-page/use-jobs.ts +150 -0
  520. package/src/client/agent-sidebar-state.ts +166 -0
  521. package/src/client/analytics/index.ts +40 -0
  522. package/src/client/analytics-session.ts +70 -0
  523. package/src/client/analytics.ts +1757 -0
  524. package/src/client/api-path.ts +124 -0
  525. package/src/client/app-providers.tsx +230 -0
  526. package/src/client/appearance.ts +130 -0
  527. package/src/client/application-state.ts +154 -0
  528. package/src/client/assistant-ui-recovery.tsx +205 -0
  529. package/src/client/automation/index.ts +4 -0
  530. package/src/client/automation.ts +22 -0
  531. package/src/client/blocks/AiEditableField.tsx +30 -0
  532. package/src/client/blocks/BlockView.tsx +145 -0
  533. package/src/client/blocks/RegistryBlockDataProvider.tsx +121 -0
  534. package/src/client/blocks/SchemaBlockEditor.tsx +457 -0
  535. package/src/client/blocks/agent.ts +95 -0
  536. package/src/client/blocks/code-block-direction.ts +21 -0
  537. package/src/client/blocks/index.ts +308 -0
  538. package/src/client/blocks/library/AnnotatedCodeBlock.tsx +710 -0
  539. package/src/client/blocks/library/ApiEndpointBlock.tsx +1120 -0
  540. package/src/client/blocks/library/DataModelBlock.tsx +775 -0
  541. package/src/client/blocks/library/DiffBlock.tsx +1854 -0
  542. package/src/client/blocks/library/FileTreeBlock.tsx +868 -0
  543. package/src/client/blocks/library/HighlightedCode.tsx +260 -0
  544. package/src/client/blocks/library/JsonExplorerBlock.tsx +608 -0
  545. package/src/client/blocks/library/MermaidBlock.tsx +362 -0
  546. package/src/client/blocks/library/OpenApiSpecBlock.tsx +998 -0
  547. package/src/client/blocks/library/annotated-code.config.ts +101 -0
  548. package/src/client/blocks/library/annotation-rail.tsx +1020 -0
  549. package/src/client/blocks/library/api-endpoint.config.ts +207 -0
  550. package/src/client/blocks/library/block-copy.ts +399 -0
  551. package/src/client/blocks/library/callout.config.ts +57 -0
  552. package/src/client/blocks/library/callout.tsx +149 -0
  553. package/src/client/blocks/library/checklist.config.ts +56 -0
  554. package/src/client/blocks/library/checklist.tsx +208 -0
  555. package/src/client/blocks/library/code-filename-label.tsx +59 -0
  556. package/src/client/blocks/library/code-highlight.tsx +178 -0
  557. package/src/client/blocks/library/code-tabs.config.ts +70 -0
  558. package/src/client/blocks/library/code-tabs.tsx +606 -0
  559. package/src/client/blocks/library/code.config.ts +69 -0
  560. package/src/client/blocks/library/code.tsx +440 -0
  561. package/src/client/blocks/library/columns.config.ts +85 -0
  562. package/src/client/blocks/library/columns.tsx +334 -0
  563. package/src/client/blocks/library/data-model.config.ts +152 -0
  564. package/src/client/blocks/library/dev-doc-ui.tsx +191 -0
  565. package/src/client/blocks/library/diagram.config.ts +222 -0
  566. package/src/client/blocks/library/diagram.tsx +958 -0
  567. package/src/client/blocks/library/diff.config.ts +115 -0
  568. package/src/client/blocks/library/file-tree.config.ts +92 -0
  569. package/src/client/blocks/library/html.config.ts +79 -0
  570. package/src/client/blocks/library/html.tsx +258 -0
  571. package/src/client/blocks/library/json-explorer.config.ts +74 -0
  572. package/src/client/blocks/library/mermaid.config.ts +49 -0
  573. package/src/client/blocks/library/narrow-container.tsx +37 -0
  574. package/src/client/blocks/library/openapi-spec.config.ts +66 -0
  575. package/src/client/blocks/library/question-form.config.ts +127 -0
  576. package/src/client/blocks/library/question-form.tsx +944 -0
  577. package/src/client/blocks/library/sanitize-html.ts +343 -0
  578. package/src/client/blocks/library/server-specs.ts +338 -0
  579. package/src/client/blocks/library/specs.tsx +308 -0
  580. package/src/client/blocks/library/table.config.ts +61 -0
  581. package/src/client/blocks/library/table.tsx +449 -0
  582. package/src/client/blocks/library/tabs.config.ts +96 -0
  583. package/src/client/blocks/library/tabs.tsx +665 -0
  584. package/src/client/blocks/library/wireframe-icons.ts +210 -0
  585. package/src/client/blocks/library/wireframe-kit.tsx +1850 -0
  586. package/src/client/blocks/library/wireframe.config.ts +539 -0
  587. package/src/client/blocks/library/wireframe.tsx +535 -0
  588. package/src/client/blocks/mdx.ts +364 -0
  589. package/src/client/blocks/provider.tsx +51 -0
  590. package/src/client/blocks/registry.ts +83 -0
  591. package/src/client/blocks/schema-form/introspect.ts +201 -0
  592. package/src/client/blocks/server.ts +170 -0
  593. package/src/client/blocks/types.ts +415 -0
  594. package/src/client/browser-session-bridge.ts +548 -0
  595. package/src/client/browser-tab-id.ts +36 -0
  596. package/src/client/builder-frame.ts +194 -0
  597. package/src/client/builder-mark.tsx +21 -0
  598. package/src/client/changelog/Changelog.tsx +333 -0
  599. package/src/client/changelog/index.ts +1 -0
  600. package/src/client/chat/ChatHistoryList.tsx +7 -0
  601. package/src/client/chat/attachment-adapters.ts +426 -0
  602. package/src/client/chat/connectors.ts +1579 -0
  603. package/src/client/chat/index.ts +160 -0
  604. package/src/client/chat/markdown-renderer.tsx +693 -0
  605. package/src/client/chat/message-components.tsx +1326 -0
  606. package/src/client/chat/repo-helpers.ts +281 -0
  607. package/src/client/chat/run-recovery.tsx +994 -0
  608. package/src/client/chat/runtime.ts +1810 -0
  609. package/src/client/chat/tool-call-display.tsx +1270 -0
  610. package/src/client/chat/tool-render-registry.tsx +144 -0
  611. package/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  612. package/src/client/chat/use-reconnect-reader-owner.ts +28 -0
  613. package/src/client/chat/widgets/DataChartRenderer.tsx +242 -0
  614. package/src/client/chat/widgets/DataChartWidget.tsx +51 -0
  615. package/src/client/chat/widgets/DataInsightsWidget.tsx +59 -0
  616. package/src/client/chat/widgets/DataTableWidget.tsx +240 -0
  617. package/src/client/chat/widgets/InlineExtensionWidget.tsx +60 -0
  618. package/src/client/chat/widgets/builtin-tool-renderers.tsx +213 -0
  619. package/src/client/chat/widgets/data-widget-types.ts +1 -0
  620. package/src/client/chat/widgets/inline-extension-result.ts +86 -0
  621. package/src/client/chat-model-groups.ts +171 -0
  622. package/src/client/chat-thread-url.ts +11 -0
  623. package/src/client/chat-view-transition.ts +213 -0
  624. package/src/client/client-action.ts +21 -0
  625. package/src/client/client-bootstrap.ts +7 -0
  626. package/src/client/client-surface.ts +41 -0
  627. package/src/client/clipboard.ts +89 -0
  628. package/src/client/code-agent-chat-adapter.ts +537 -0
  629. package/src/client/collab/index.ts +60 -0
  630. package/src/client/command-navigation/index.ts +15 -0
  631. package/src/client/comments-review/index.ts +1 -0
  632. package/src/client/components/AgentPresenceChip.tsx +4 -0
  633. package/src/client/components/ApiKeySettings.tsx +309 -0
  634. package/src/client/components/CodeAgentIndicator.tsx +59 -0
  635. package/src/client/components/CodeRequiredDialog.tsx +470 -0
  636. package/src/client/components/LiveCursorOverlay.tsx +5 -0
  637. package/src/client/components/MissingKeyCard.tsx +61 -0
  638. package/src/client/components/PresenceBar.tsx +4 -0
  639. package/src/client/components/RecentEditHighlights.tsx +4 -0
  640. package/src/client/components/RemoteSelectionRings.tsx +5 -0
  641. package/src/client/components/icons/AgentNativeIcon.tsx +46 -0
  642. package/src/client/components/ui/dialog.tsx +1 -0
  643. package/src/client/components/ui/dropdown-menu.tsx +1 -0
  644. package/src/client/components/ui/hover-card.tsx +1 -0
  645. package/src/client/components/ui/message-scroller.tsx +131 -0
  646. package/src/client/components/ui/popover.tsx +1 -0
  647. package/src/client/components/ui/sheet.tsx +1 -0
  648. package/src/client/components/ui/tooltip.tsx +1 -0
  649. package/src/client/composer/index.ts +11 -0
  650. package/src/client/composer/runtime-adapters.tsx +123 -0
  651. package/src/client/composer/use-mention-search.ts +7 -0
  652. package/src/client/composer/wired-components.tsx +53 -0
  653. package/src/client/context-xray/ContextMeter.tsx +124 -0
  654. package/src/client/context-xray/ContextSegmentRow.tsx +27 -0
  655. package/src/client/context-xray/ContextTreemap.tsx +24 -0
  656. package/src/client/context-xray/ContextXRayPanel.tsx +59 -0
  657. package/src/client/context-xray/SegmentProvenancePopover.tsx +18 -0
  658. package/src/client/context-xray/format.ts +27 -0
  659. package/src/client/conversation/AgentConversation.tsx +555 -0
  660. package/src/client/conversation/code-agent-transcript.ts +283 -0
  661. package/src/client/conversation/index.ts +22 -0
  662. package/src/client/conversation/types.ts +85 -0
  663. package/src/client/conversation/use-near-bottom-autoscroll.ts +278 -0
  664. package/src/client/create-query-client.ts +86 -0
  665. package/src/client/db-admin/DataGrid.tsx +551 -0
  666. package/src/client/db-admin/DbAdminPage.tsx +218 -0
  667. package/src/client/db-admin/DevDatabaseLink.tsx +16 -0
  668. package/src/client/db-admin/EditableCell.tsx +451 -0
  669. package/src/client/db-admin/FilterBar.tsx +203 -0
  670. package/src/client/db-admin/ResultsGrid.tsx +114 -0
  671. package/src/client/db-admin/RowSidePanel.tsx +337 -0
  672. package/src/client/db-admin/SqlEditor.tsx +840 -0
  673. package/src/client/db-admin/TableBrowser.tsx +212 -0
  674. package/src/client/db-admin/TableEditor.tsx +760 -0
  675. package/src/client/db-admin/cell-format.ts +246 -0
  676. package/src/client/db-admin/changeset.ts +296 -0
  677. package/src/client/db-admin/export-utils.ts +78 -0
  678. package/src/client/db-admin/index.ts +33 -0
  679. package/src/client/db-admin/sql-storage.ts +134 -0
  680. package/src/client/db-admin/storage.ts +68 -0
  681. package/src/client/db-admin/useAgentSync.ts +226 -0
  682. package/src/client/db-admin/useDbAdmin.ts +294 -0
  683. package/src/client/dev-overlay/DevOverlay.tsx +576 -0
  684. package/src/client/dev-overlay/builtins.ts +40 -0
  685. package/src/client/dev-overlay/index.ts +23 -0
  686. package/src/client/dev-overlay/registry.ts +67 -0
  687. package/src/client/dev-overlay/types.ts +64 -0
  688. package/src/client/dev-overlay/use-dev-option.ts +78 -0
  689. package/src/client/dev-overlay/use-dev-overlay-shortcut.ts +31 -0
  690. package/src/client/dynamic-suggestions.ts +455 -0
  691. package/src/client/embed-auth.ts +544 -0
  692. package/src/client/embed.ts +54 -0
  693. package/src/client/error-capture.ts +690 -0
  694. package/src/client/error-format.ts +211 -0
  695. package/src/client/error-reporting.ts +100 -0
  696. package/src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx +136 -0
  697. package/src/client/extensions/AgentNativeExtensionFrame.tsx +708 -0
  698. package/src/client/extensions/EmbeddedExtension.tsx +604 -0
  699. package/src/client/extensions/ExtensionEditor.tsx +450 -0
  700. package/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  701. package/src/client/extensions/ExtensionSlot.tsx +345 -0
  702. package/src/client/extensions/ExtensionViewer.tsx +1502 -0
  703. package/src/client/extensions/ExtensionViewerPage.tsx +32 -0
  704. package/src/client/extensions/ExtensionsListPage.tsx +432 -0
  705. package/src/client/extensions/ExtensionsSidebarSection.tsx +1259 -0
  706. package/src/client/extensions/InlineExtensionFrame.tsx +660 -0
  707. package/src/client/extensions/agent-native-extension-runtime.ts +495 -0
  708. package/src/client/extensions/delete-extension.ts +76 -0
  709. package/src/client/extensions/extension-load-error.ts +26 -0
  710. package/src/client/extensions/extension-order.ts +49 -0
  711. package/src/client/extensions/extension-popularity.ts +61 -0
  712. package/src/client/extensions/iframe-bridge.ts +377 -0
  713. package/src/client/extensions/index.ts +84 -0
  714. package/src/client/extensions/portable-extension.ts +712 -0
  715. package/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  716. package/src/client/feature-flags/helpers.ts +77 -0
  717. package/src/client/feature-flags/index.ts +13 -0
  718. package/src/client/feature-flags/types.ts +29 -0
  719. package/src/client/feature-flags/use-feature-flag.ts +26 -0
  720. package/src/client/feedback-context.ts +90 -0
  721. package/src/client/frame-protocol.ts +168 -0
  722. package/src/client/frame.ts +329 -0
  723. package/src/client/guided-questions.tsx +1152 -0
  724. package/src/client/history/VersionHistoryPanel.tsx +175 -0
  725. package/src/client/history/index.ts +21 -0
  726. package/src/client/history/use-history.ts +114 -0
  727. package/src/client/hooks/index.ts +46 -0
  728. package/src/client/host/index.ts +170 -0
  729. package/src/client/host-bridge.ts +1272 -0
  730. package/src/client/host-tools.ts +190 -0
  731. package/src/client/i18n.tsx +798 -0
  732. package/src/client/index.ts +370 -0
  733. package/src/client/integrations/IntegrationCard.tsx +186 -0
  734. package/src/client/integrations/IntegrationsPanel.tsx +633 -0
  735. package/src/client/integrations/api.ts +295 -0
  736. package/src/client/integrations/index.ts +29 -0
  737. package/src/client/integrations/useIntegrationStatus.ts +52 -0
  738. package/src/client/mcp-app-host.ts +720 -0
  739. package/src/client/mcp-apps/McpAppRenderer.tsx +760 -0
  740. package/src/client/navigation/index.ts +54 -0
  741. package/src/client/notifications/NotificationsBell.tsx +383 -0
  742. package/src/client/notifications/index.ts +1 -0
  743. package/src/client/observability/ObservabilityDashboard.tsx +890 -0
  744. package/src/client/observability/ThumbsFeedback.tsx +160 -0
  745. package/src/client/observability/index.ts +20 -0
  746. package/src/client/observability/useObservability.ts +266 -0
  747. package/src/client/onboarding/OnboardingBanner.tsx +73 -0
  748. package/src/client/onboarding/OnboardingPanel.tsx +1036 -0
  749. package/src/client/onboarding/SetupButton.tsx +64 -0
  750. package/src/client/onboarding/index.ts +25 -0
  751. package/src/client/onboarding/use-onboarding.ts +164 -0
  752. package/src/client/onboarding/use-preview-mode.ts +40 -0
  753. package/src/client/org/InvitationBanner.tsx +148 -0
  754. package/src/client/org/OrgSwitcher.tsx +754 -0
  755. package/src/client/org/RequireActiveOrg.tsx +337 -0
  756. package/src/client/org/TeamPage.tsx +1432 -0
  757. package/src/client/org/hooks.ts +359 -0
  758. package/src/client/org/index.ts +70 -0
  759. package/src/client/org/workspace-app-links.ts +367 -0
  760. package/src/client/org-team/index.ts +1 -0
  761. package/src/client/progress/RunsTray.tsx +680 -0
  762. package/src/client/progress/index.ts +1 -0
  763. package/src/client/require-session.tsx +142 -0
  764. package/src/client/resources/BuiltinCapabilityDetail.tsx +258 -0
  765. package/src/client/resources/McpConnectionSuggestion.tsx +276 -0
  766. package/src/client/resources/McpIntegrationDialog.tsx +808 -0
  767. package/src/client/resources/McpServerDetail.tsx +230 -0
  768. package/src/client/resources/ResourceEditor.tsx +872 -0
  769. package/src/client/resources/ResourceTree.tsx +860 -0
  770. package/src/client/resources/ResourcesPanel.tsx +1960 -0
  771. package/src/client/resources/index.ts +25 -0
  772. package/src/client/resources/mcp-integration-catalog.ts +771 -0
  773. package/src/client/resources/mcp-integration-logos.ts +108 -0
  774. package/src/client/resources/runtime.ts +1 -0
  775. package/src/client/resources/use-builtin-capabilities.ts +113 -0
  776. package/src/client/resources/use-mcp-servers.ts +217 -0
  777. package/src/client/resources/use-resources.ts +402 -0
  778. package/src/client/review/ReviewCommentComposer.tsx +123 -0
  779. package/src/client/review/ReviewStatusBadge.tsx +39 -0
  780. package/src/client/review/ReviewThreadPanel.tsx +625 -0
  781. package/src/client/review/index.ts +38 -0
  782. package/src/client/review/use-review.ts +186 -0
  783. package/src/client/route-chunk-recovery/index.ts +1 -0
  784. package/src/client/route-chunk-recovery.ts +331 -0
  785. package/src/client/route-state.ts +455 -0
  786. package/src/client/route-warmup.tsx +543 -0
  787. package/src/client/session-replay-iframe.e2e-host.tsx +100 -0
  788. package/src/client/session-replay.ts +3417 -0
  789. package/src/client/settings/AgentsSection.tsx +441 -0
  790. package/src/client/settings/AutomationsSection.tsx +516 -0
  791. package/src/client/settings/BackgroundAgentSection.tsx +189 -0
  792. package/src/client/settings/BrowserSection.tsx +110 -0
  793. package/src/client/settings/DemoModeSection.tsx +48 -0
  794. package/src/client/settings/SecretsSection.tsx +875 -0
  795. package/src/client/settings/SettingsPanel.tsx +3162 -0
  796. package/src/client/settings/SettingsSection.tsx +283 -0
  797. package/src/client/settings/SettingsTabsPage.tsx +592 -0
  798. package/src/client/settings/UsageSection.tsx +401 -0
  799. package/src/client/settings/VoiceTranscriptionSection.tsx +960 -0
  800. package/src/client/settings/agent-settings-search.ts +220 -0
  801. package/src/client/settings/index.ts +27 -0
  802. package/src/client/settings/useBuilderStatus.ts +1055 -0
  803. package/src/client/setup-connections/BuilderConnectCard.tsx +89 -0
  804. package/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  805. package/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  806. package/src/client/setup-connections/catalog.ts +6 -0
  807. package/src/client/setup-connections/index.ts +47 -0
  808. package/src/client/setup-connections/runtime.ts +1 -0
  809. package/src/client/sharing/ShareButton.tsx +1748 -0
  810. package/src/client/sharing/ShareDialog.tsx +846 -0
  811. package/src/client/sharing/VisibilityBadge.tsx +4 -0
  812. package/src/client/sharing/index.ts +2 -0
  813. package/src/client/sse-event-processor.ts +2002 -0
  814. package/src/client/terminal/AgentTerminal.tsx +488 -0
  815. package/src/client/terminal/index.ts +7 -0
  816. package/src/client/theme.ts +27 -0
  817. package/src/client/tombstone/agent-presence-chip.ts +17 -0
  818. package/src/client/tombstone/editor.ts +265 -0
  819. package/src/client/tombstone/live-cursor-overlay.ts +21 -0
  820. package/src/client/tombstone/presence-bar.ts +17 -0
  821. package/src/client/tombstone/recent-edit-highlights.ts +17 -0
  822. package/src/client/tombstone/remote-selection-rings.ts +21 -0
  823. package/src/client/tombstone/rich-markdown-editor.ts +265 -0
  824. package/src/client/tombstone/ui-dialog.ts +49 -0
  825. package/src/client/tombstone/ui-dropdown-menu.ts +69 -0
  826. package/src/client/tombstone/ui-hover-card.ts +21 -0
  827. package/src/client/tombstone/ui-popover.ts +25 -0
  828. package/src/client/tombstone/ui-sheet.ts +49 -0
  829. package/src/client/tombstone/ui-tooltip.ts +29 -0
  830. package/src/client/tombstone/visual-style-controls.ts +61 -0
  831. package/src/client/tool-cells/BashCell.tsx +164 -0
  832. package/src/client/tool-cells/EditCell.tsx +303 -0
  833. package/src/client/tool-cells/FilesChangedSummary.tsx +208 -0
  834. package/src/client/tool-cells/WriteCell.tsx +145 -0
  835. package/src/client/tool-cells/index.ts +7 -0
  836. package/src/client/tool-display.ts +41 -0
  837. package/src/client/track.ts +57 -0
  838. package/src/client/transcription/BuilderTranscriptionCta.tsx +120 -0
  839. package/src/client/transcription/use-live-transcription.ts +292 -0
  840. package/src/client/ui/index.ts +55 -0
  841. package/src/client/uploads/index.ts +6 -0
  842. package/src/client/uploads/upload-editor-image.ts +79 -0
  843. package/src/client/uploads/use-upload-resource.ts +24 -0
  844. package/src/client/url-scrub.ts +51 -0
  845. package/src/client/use-action.ts +766 -0
  846. package/src/client/use-agent-chat-context.ts +63 -0
  847. package/src/client/use-agent-chat-home-handoff.ts +207 -0
  848. package/src/client/use-agent-chat.ts +53 -0
  849. package/src/client/use-agent-engine-configured.ts +211 -0
  850. package/src/client/use-avatar.ts +127 -0
  851. package/src/client/use-change-version.ts +150 -0
  852. package/src/client/use-chat-models.ts +252 -0
  853. package/src/client/use-chat-threads.ts +1262 -0
  854. package/src/client/use-db-sync.ts +1112 -0
  855. package/src/client/use-demo-mode-status.ts +30 -0
  856. package/src/client/use-dev-mode.ts +177 -0
  857. package/src/client/use-external-value.ts +40 -0
  858. package/src/client/use-pausing-interval.ts +65 -0
  859. package/src/client/use-pinch-zoom.ts +202 -0
  860. package/src/client/use-run-stuck-detection.ts +427 -0
  861. package/src/client/use-send-to-agent-chat.ts +85 -0
  862. package/src/client/use-session.ts +114 -0
  863. package/src/client/utils.ts +7 -0
  864. package/src/client/visual-style-controls.tsx +1 -0
  865. package/src/client/vite-dev-recovery-script.ts +226 -0
  866. package/src/client/voice-provider-status.ts +44 -0
  867. package/src/client/widgets/index.ts +41 -0
  868. package/src/code-agents/background-controller.ts +398 -0
  869. package/src/code-agents/background-run.ts +156 -0
  870. package/src/code-agents/index.ts +95 -0
  871. package/src/code-agents/prompt-attachments.ts +39 -0
  872. package/src/code-agents/transcript-normalizer.ts +750 -0
  873. package/src/code-agents/transcript-order.ts +73 -0
  874. package/src/coding-tools/index.ts +742 -0
  875. package/src/coding-tools/run-code.ts +1662 -0
  876. package/src/coding-tools/sandbox/adapter.ts +82 -0
  877. package/src/coding-tools/sandbox/background.ts +406 -0
  878. package/src/coding-tools/sandbox/executions-store.ts +517 -0
  879. package/src/coding-tools/sandbox/index.ts +132 -0
  880. package/src/coding-tools/sandbox/local-child-process-adapter.ts +217 -0
  881. package/src/collab/agent-identity.ts +5 -0
  882. package/src/collab/agent-presence.ts +341 -0
  883. package/src/collab/awareness-store.ts +196 -0
  884. package/src/collab/awareness.ts +317 -0
  885. package/src/collab/client-struct.ts +366 -0
  886. package/src/collab/client.ts +1205 -0
  887. package/src/collab/emitter.ts +31 -0
  888. package/src/collab/follow-mode.ts +107 -0
  889. package/src/collab/index.ts +151 -0
  890. package/src/collab/json-to-yjs.ts +504 -0
  891. package/src/collab/presence.ts +207 -0
  892. package/src/collab/recent-edits.ts +215 -0
  893. package/src/collab/routes.ts +191 -0
  894. package/src/collab/storage.ts +228 -0
  895. package/src/collab/struct-routes.ts +133 -0
  896. package/src/collab/text-to-yjs.ts +79 -0
  897. package/src/collab/undo.ts +432 -0
  898. package/src/collab/xml-ops.ts +68 -0
  899. package/src/collab/ydoc-manager.ts +544 -0
  900. package/src/command-navigation/actions.ts +100 -0
  901. package/src/command-navigation/index.ts +12 -0
  902. package/src/comments-review/index.ts +1 -0
  903. package/src/connections/catalog.ts +451 -0
  904. package/src/connections/index.ts +48 -0
  905. package/src/connections/reader.ts +911 -0
  906. package/src/connections/runtime.ts +1 -0
  907. package/src/credentials/index.ts +187 -0
  908. package/src/data-programs/actions.ts +335 -0
  909. package/src/data-programs/contract.ts +284 -0
  910. package/src/data-programs/execute.ts +693 -0
  911. package/src/data-programs/index.ts +72 -0
  912. package/src/data-programs/schema.ts +148 -0
  913. package/src/data-programs/store.ts +755 -0
  914. package/src/data-widgets/index.ts +376 -0
  915. package/src/db/client.ts +1627 -0
  916. package/src/db/create-get-db.ts +579 -0
  917. package/src/db/ddl-guard.ts +302 -0
  918. package/src/db/drizzle-config.ts +190 -0
  919. package/src/db/ensure-additive-columns.ts +430 -0
  920. package/src/db/index.ts +57 -0
  921. package/src/db/migrations.ts +691 -0
  922. package/src/db/request-telemetry.ts +154 -0
  923. package/src/db/runtime-diagnostics.ts +331 -0
  924. package/src/db/schema.ts +121 -0
  925. package/src/db/widen-columns.ts +75 -0
  926. package/src/db-admin/agent-tools.ts +202 -0
  927. package/src/db-admin/index.ts +26 -0
  928. package/src/db-admin/operations.ts +803 -0
  929. package/src/db-admin/routes.ts +174 -0
  930. package/src/db-admin/types.ts +110 -0
  931. package/src/demo/browser-state.ts +47 -0
  932. package/src/demo/fetch-interceptor.ts +175 -0
  933. package/src/demo/redact.ts +575 -0
  934. package/src/deploy/build.ts +3935 -0
  935. package/src/deploy/immutable-assets.ts +65 -0
  936. package/src/deploy/route-discovery.ts +458 -0
  937. package/src/deploy/workspace-core.ts +282 -0
  938. package/src/deploy/workspace-deploy.ts +1488 -0
  939. package/src/eject/provider-api-definitions.ts +193 -0
  940. package/src/eject/remote-mcp-presets.ts +137 -0
  941. package/src/eject/setup-readiness-ui.tsx +29 -0
  942. package/src/eject/workspace-connections.ts +92 -0
  943. package/src/embedding/agent.ts +159 -0
  944. package/src/embedding/bridge.ts +297 -0
  945. package/src/embedding/index.ts +43 -0
  946. package/src/embedding/protocol.ts +185 -0
  947. package/src/embedding/react.tsx +319 -0
  948. package/src/embeddings/index.ts +233 -0
  949. package/src/eval/agent-runner.ts +210 -0
  950. package/src/eval/define-eval.ts +55 -0
  951. package/src/eval/index.ts +49 -0
  952. package/src/eval/report.ts +75 -0
  953. package/src/eval/runner.ts +369 -0
  954. package/src/eval/scorer.ts +244 -0
  955. package/src/eval/types.ts +188 -0
  956. package/src/event-bus/bus.ts +140 -0
  957. package/src/event-bus/index.ts +3 -0
  958. package/src/event-bus/registry.ts +79 -0
  959. package/src/event-bus/types.ts +29 -0
  960. package/src/extensions/actions.ts +1636 -0
  961. package/src/extensions/change-marker.ts +54 -0
  962. package/src/extensions/content-patch.ts +468 -0
  963. package/src/extensions/fetch-tool.ts +461 -0
  964. package/src/extensions/html-shell.ts +803 -0
  965. package/src/extensions/local.ts +462 -0
  966. package/src/extensions/path.ts +40 -0
  967. package/src/extensions/proxy-security.ts +171 -0
  968. package/src/extensions/routes.ts +1080 -0
  969. package/src/extensions/schema.ts +269 -0
  970. package/src/extensions/session-replay-iframe.ts +131 -0
  971. package/src/extensions/slots/routes.ts +126 -0
  972. package/src/extensions/slots/schema.ts +87 -0
  973. package/src/extensions/slots/store.ts +450 -0
  974. package/src/extensions/store.ts +1347 -0
  975. package/src/extensions/theme.ts +114 -0
  976. package/src/extensions/url-safety.ts +316 -0
  977. package/src/extensions/web-content.ts +663 -0
  978. package/src/extensions/web-search-tool.ts +437 -0
  979. package/src/feature-flags/a2a-action-route.ts +56 -0
  980. package/src/feature-flags/actions/get-feature-flags.ts +24 -0
  981. package/src/feature-flags/actions/list-feature-flags.ts +69 -0
  982. package/src/feature-flags/actions/set-feature-flag.ts +89 -0
  983. package/src/feature-flags/index.ts +21 -0
  984. package/src/feature-flags/permissions.ts +53 -0
  985. package/src/feature-flags/plugin.ts +44 -0
  986. package/src/feature-flags/registry.ts +96 -0
  987. package/src/feature-flags/store.ts +176 -0
  988. package/src/file-upload/actions/upload-image.ts +213 -0
  989. package/src/file-upload/builder.ts +431 -0
  990. package/src/file-upload/index.ts +24 -0
  991. package/src/file-upload/pre-upload-attachments.ts +305 -0
  992. package/src/file-upload/registry.ts +125 -0
  993. package/src/file-upload/types.ts +89 -0
  994. package/src/guards/db-tool-scoping.ts +129 -0
  995. package/src/guards/index.ts +23 -0
  996. package/src/guards/no-drizzle-push.ts +116 -0
  997. package/src/guards/no-env-credentials.ts +229 -0
  998. package/src/guards/no-env-mutation.ts +114 -0
  999. package/src/guards/no-localhost-fallback.ts +124 -0
  1000. package/src/guards/no-unscoped-credentials.ts +227 -0
  1001. package/src/guards/no-unscoped-queries.ts +834 -0
  1002. package/src/guards/scan-utils.ts +105 -0
  1003. package/src/guards/types.ts +30 -0
  1004. package/src/history/actions/create-resource-version.ts +92 -0
  1005. package/src/history/actions/get-resource-version.ts +60 -0
  1006. package/src/history/actions/list-resource-history.ts +53 -0
  1007. package/src/history/actions/list-resource-versions.ts +43 -0
  1008. package/src/history/actions/restore-resource-version.ts +96 -0
  1009. package/src/history/index.ts +26 -0
  1010. package/src/history/registry.ts +111 -0
  1011. package/src/history/store.ts +379 -0
  1012. package/src/history/types.ts +69 -0
  1013. package/src/index.browser.ts +155 -0
  1014. package/src/index.ts +408 -0
  1015. package/src/ingestion/docx.ts +158 -0
  1016. package/src/ingestion/figma-node-to-html.ts +1860 -0
  1017. package/src/ingestion/figma.ts +548 -0
  1018. package/src/ingestion/index.ts +107 -0
  1019. package/src/ingestion/media.ts +264 -0
  1020. package/src/ingestion/notion.ts +121 -0
  1021. package/src/ingestion/office.ts +213 -0
  1022. package/src/ingestion/orchestration.ts +160 -0
  1023. package/src/ingestion/pptx.ts +331 -0
  1024. package/src/ingestion/selection.ts +81 -0
  1025. package/src/ingestion/website.ts +151 -0
  1026. package/src/integrations/a2a-continuation-marker.ts +2 -0
  1027. package/src/integrations/a2a-continuation-processor.ts +888 -0
  1028. package/src/integrations/a2a-continuations-store.ts +643 -0
  1029. package/src/integrations/adapter-overrides.ts +12 -0
  1030. package/src/integrations/adapters/discord.ts +364 -0
  1031. package/src/integrations/adapters/email.ts +1164 -0
  1032. package/src/integrations/adapters/google-docs.ts +371 -0
  1033. package/src/integrations/adapters/index.ts +29 -0
  1034. package/src/integrations/adapters/microsoft-teams.ts +413 -0
  1035. package/src/integrations/adapters/slack.ts +1914 -0
  1036. package/src/integrations/adapters/telegram.ts +386 -0
  1037. package/src/integrations/adapters/whatsapp.ts +358 -0
  1038. package/src/integrations/awaiting-input-store.ts +130 -0
  1039. package/src/integrations/catalog.ts +571 -0
  1040. package/src/integrations/computer-supervision-store.ts +423 -0
  1041. package/src/integrations/computer-supervision.ts +213 -0
  1042. package/src/integrations/config-store.ts +131 -0
  1043. package/src/integrations/controls-store.ts +187 -0
  1044. package/src/integrations/eject/messaging-adapters.ts +85 -0
  1045. package/src/integrations/google-docs-poller.ts +671 -0
  1046. package/src/integrations/identity-links-store.ts +210 -0
  1047. package/src/integrations/identity.ts +196 -0
  1048. package/src/integrations/index.ts +220 -0
  1049. package/src/integrations/installations-store.ts +677 -0
  1050. package/src/integrations/integration-memory.ts +187 -0
  1051. package/src/integrations/internal-token.ts +106 -0
  1052. package/src/integrations/pending-tasks-retry-job.ts +286 -0
  1053. package/src/integrations/pending-tasks-store.ts +468 -0
  1054. package/src/integrations/plugin.ts +3048 -0
  1055. package/src/integrations/remote-commands-store.ts +690 -0
  1056. package/src/integrations/remote-devices-store.ts +492 -0
  1057. package/src/integrations/remote-json-safety.ts +127 -0
  1058. package/src/integrations/remote-push-delivery-job.ts +48 -0
  1059. package/src/integrations/remote-push-delivery.ts +370 -0
  1060. package/src/integrations/remote-push-store.ts +664 -0
  1061. package/src/integrations/remote-retry-job.ts +55 -0
  1062. package/src/integrations/remote-run-events-store.ts +222 -0
  1063. package/src/integrations/remote-types.ts +186 -0
  1064. package/src/integrations/runtime.ts +1 -0
  1065. package/src/integrations/scope-store.ts +498 -0
  1066. package/src/integrations/slack-manifest.ts +78 -0
  1067. package/src/integrations/slack-oauth.ts +344 -0
  1068. package/src/integrations/task-queue-stats.ts +144 -0
  1069. package/src/integrations/thread-mapping-store.ts +134 -0
  1070. package/src/integrations/types.ts +485 -0
  1071. package/src/integrations/usage-budget-store.ts +906 -0
  1072. package/src/integrations/webhook-delivery.ts +55 -0
  1073. package/src/integrations/webhook-handler.ts +1939 -0
  1074. package/src/jobs/actions/list-recurring-jobs.ts +105 -0
  1075. package/src/jobs/actions/manage-recurring-job.ts +85 -0
  1076. package/src/jobs/cron.ts +126 -0
  1077. package/src/jobs/index.ts +9 -0
  1078. package/src/jobs/scheduler.ts +703 -0
  1079. package/src/jobs/tools.ts +367 -0
  1080. package/src/local-artifacts/index.ts +1372 -0
  1081. package/src/localization/actions/get-localization-preference.ts +24 -0
  1082. package/src/localization/actions/set-localization-preference.ts +32 -0
  1083. package/src/localization/default-messages.ts +1009 -0
  1084. package/src/localization/index.ts +2 -0
  1085. package/src/localization/server.ts +131 -0
  1086. package/src/localization/shared.ts +208 -0
  1087. package/src/mcp/actions/call-mcp-tool.ts +19 -0
  1088. package/src/mcp/actions/create-org-service-token.ts +87 -0
  1089. package/src/mcp/actions/list-mcp-tools.ts +18 -0
  1090. package/src/mcp/actions/list-org-service-tokens.ts +44 -0
  1091. package/src/mcp/actions/revoke-org-service-token.ts +30 -0
  1092. package/src/mcp/actions/service-token-access.ts +121 -0
  1093. package/src/mcp/ask-app-inline-tasks.ts +125 -0
  1094. package/src/mcp/build-server.ts +2356 -0
  1095. package/src/mcp/builtin-tools.ts +1506 -0
  1096. package/src/mcp/connect-route.ts +1460 -0
  1097. package/src/mcp/connect-store.ts +680 -0
  1098. package/src/mcp/embed-app.ts +2051 -0
  1099. package/src/mcp/embed-route.ts +84 -0
  1100. package/src/mcp/external-agent-policy.ts +18 -0
  1101. package/src/mcp/index.ts +47 -0
  1102. package/src/mcp/oauth-route.ts +1016 -0
  1103. package/src/mcp/oauth-store.ts +581 -0
  1104. package/src/mcp/oauth-token.ts +227 -0
  1105. package/src/mcp/org-directory.ts +343 -0
  1106. package/src/mcp/route-paths.ts +34 -0
  1107. package/src/mcp/screen-memory-stdio.ts +290 -0
  1108. package/src/mcp/server.ts +507 -0
  1109. package/src/mcp/stdio.ts +328 -0
  1110. package/src/mcp/workspace-resolve.ts +261 -0
  1111. package/src/mcp-client/app-api.ts +136 -0
  1112. package/src/mcp-client/app-result.ts +64 -0
  1113. package/src/mcp-client/builtin-capabilities.ts +146 -0
  1114. package/src/mcp-client/builtin-store.ts +93 -0
  1115. package/src/mcp-client/config.ts +281 -0
  1116. package/src/mcp-client/errors.ts +54 -0
  1117. package/src/mcp-client/hub-client.ts +172 -0
  1118. package/src/mcp-client/hub-routes.ts +198 -0
  1119. package/src/mcp-client/index.ts +504 -0
  1120. package/src/mcp-client/manager.ts +968 -0
  1121. package/src/mcp-client/oauth-client.ts +462 -0
  1122. package/src/mcp-client/oauth-routes.ts +307 -0
  1123. package/src/mcp-client/remote-store.ts +674 -0
  1124. package/src/mcp-client/remote-url.ts +97 -0
  1125. package/src/mcp-client/routes.ts +1093 -0
  1126. package/src/mcp-client/screen-memory-local.ts +461 -0
  1127. package/src/mcp-client/tool-policy.ts +182 -0
  1128. package/src/mcp-client/visibility.ts +56 -0
  1129. package/src/mcp-client/workspace-servers.ts +379 -0
  1130. package/src/navigation/index.ts +170 -0
  1131. package/src/notifications/actions.ts +151 -0
  1132. package/src/notifications/channels.ts +410 -0
  1133. package/src/notifications/index.ts +22 -0
  1134. package/src/notifications/registry.ts +216 -0
  1135. package/src/notifications/routes.ts +106 -0
  1136. package/src/notifications/store.ts +236 -0
  1137. package/src/notifications/types.ts +52 -0
  1138. package/src/oauth-tokens/google-refresh.ts +175 -0
  1139. package/src/oauth-tokens/index.ts +15 -0
  1140. package/src/oauth-tokens/store.ts +384 -0
  1141. package/src/observability/cleanup-job.ts +124 -0
  1142. package/src/observability/evals.ts +507 -0
  1143. package/src/observability/experiments.ts +359 -0
  1144. package/src/observability/feedback.ts +332 -0
  1145. package/src/observability/hosted-model-experiment.ts +118 -0
  1146. package/src/observability/index.ts +62 -0
  1147. package/src/observability/plugin.ts +31 -0
  1148. package/src/observability/routes.ts +431 -0
  1149. package/src/observability/sentiment.ts +261 -0
  1150. package/src/observability/store.ts +1347 -0
  1151. package/src/observability/traces.ts +789 -0
  1152. package/src/observability/tracing.ts +157 -0
  1153. package/src/observability/tracking-identity.ts +55 -0
  1154. package/src/observability/types.ts +211 -0
  1155. package/src/onboarding/default-steps.ts +428 -0
  1156. package/src/onboarding/index.ts +22 -0
  1157. package/src/onboarding/plugin.ts +262 -0
  1158. package/src/onboarding/registry.ts +47 -0
  1159. package/src/onboarding/types.ts +96 -0
  1160. package/src/org/accept-pending.ts +98 -0
  1161. package/src/org/auto-join-domain.ts +113 -0
  1162. package/src/org/context.ts +614 -0
  1163. package/src/org/free-email-providers.ts +124 -0
  1164. package/src/org/handlers.ts +1153 -0
  1165. package/src/org/index.ts +63 -0
  1166. package/src/org/migrations.ts +105 -0
  1167. package/src/org/permissions.ts +30 -0
  1168. package/src/org/plugin.ts +255 -0
  1169. package/src/org/schema.ts +28 -0
  1170. package/src/org/types.ts +57 -0
  1171. package/src/org-team/index.ts +1 -0
  1172. package/src/package-lifecycle/deprecated-imports.ts +179 -0
  1173. package/src/package-lifecycle/eject-manifest.ts +345 -0
  1174. package/src/package-lifecycle/index.ts +7 -0
  1175. package/src/package-lifecycle/manifest.ts +120 -0
  1176. package/src/package-lifecycle/migration-manifest.ts +159 -0
  1177. package/src/package-lifecycle/migration-message.ts +6 -0
  1178. package/src/package-lifecycle/tombstone.ts +58 -0
  1179. package/src/package-lifecycle/upgrade-error.ts +37 -0
  1180. package/src/private-blob/index.ts +18 -0
  1181. package/src/private-blob/registry.ts +242 -0
  1182. package/src/private-blob/types.ts +55 -0
  1183. package/src/progress/actions.ts +179 -0
  1184. package/src/progress/index.ts +16 -0
  1185. package/src/progress/registry.ts +127 -0
  1186. package/src/progress/routes.ts +89 -0
  1187. package/src/progress/store.ts +353 -0
  1188. package/src/progress/types.ts +59 -0
  1189. package/src/provider-api/actions/custom-provider-registration.ts +197 -0
  1190. package/src/provider-api/actions/delete-staged-dataset.ts +5 -0
  1191. package/src/provider-api/actions/github-repo-files.ts +266 -0
  1192. package/src/provider-api/actions/list-staged-datasets.ts +5 -0
  1193. package/src/provider-api/actions/provider-api-audit.ts +88 -0
  1194. package/src/provider-api/actions/provider-api.ts +460 -0
  1195. package/src/provider-api/actions/query-staged-dataset.ts +5 -0
  1196. package/src/provider-api/actions/staged-datasets.ts +359 -0
  1197. package/src/provider-api/corpus-jobs-store.ts +522 -0
  1198. package/src/provider-api/corpus-jobs.ts +1817 -0
  1199. package/src/provider-api/custom-registry.ts +456 -0
  1200. package/src/provider-api/github-repo.ts +675 -0
  1201. package/src/provider-api/gong.ts +108 -0
  1202. package/src/provider-api/index.ts +5444 -0
  1203. package/src/provider-api/quota-governor.ts +562 -0
  1204. package/src/provider-api/runtime.ts +1 -0
  1205. package/src/provider-api/staged-datasets-aggregate.ts +304 -0
  1206. package/src/provider-api/staged-datasets-store.ts +441 -0
  1207. package/src/provider-api/staging.ts +483 -0
  1208. package/src/resources/agents.ts +65 -0
  1209. package/src/resources/emitter.ts +54 -0
  1210. package/src/resources/handlers.ts +728 -0
  1211. package/src/resources/index.ts +4 -0
  1212. package/src/resources/metadata.ts +252 -0
  1213. package/src/resources/script-helpers.ts +160 -0
  1214. package/src/resources/store.ts +1618 -0
  1215. package/src/review/actions/consume-review-feedback.ts +48 -0
  1216. package/src/review/actions/create-review-comment.ts +108 -0
  1217. package/src/review/actions/delete-review-comment.ts +67 -0
  1218. package/src/review/actions/get-review-feedback.ts +49 -0
  1219. package/src/review/actions/list-review-comments.ts +87 -0
  1220. package/src/review/actions/reply-review-comment.ts +118 -0
  1221. package/src/review/actions/resolve-review-thread.ts +94 -0
  1222. package/src/review/actions/send-review-thread-to-agent.ts +62 -0
  1223. package/src/review/actions/set-review-status.ts +58 -0
  1224. package/src/review/identity.ts +101 -0
  1225. package/src/review/index.ts +45 -0
  1226. package/src/review/mentions.ts +44 -0
  1227. package/src/review/registry.ts +111 -0
  1228. package/src/review/store.ts +997 -0
  1229. package/src/review/types.ts +101 -0
  1230. package/src/router/index.ts +24 -0
  1231. package/src/scripts/agent-engines/list-agent-engines.ts +130 -0
  1232. package/src/scripts/agent-engines/manage-agent-engine.ts +197 -0
  1233. package/src/scripts/agent-engines/set-agent-engine.ts +84 -0
  1234. package/src/scripts/agent-engines/test-agent-engine.ts +174 -0
  1235. package/src/scripts/call-agent.ts +792 -0
  1236. package/src/scripts/chat/index.ts +8 -0
  1237. package/src/scripts/chat/open-chat.ts +56 -0
  1238. package/src/scripts/chat/search-chats.ts +121 -0
  1239. package/src/scripts/core-scripts.ts +22 -0
  1240. package/src/scripts/db/check-scoping.ts +212 -0
  1241. package/src/scripts/db/exec.ts +791 -0
  1242. package/src/scripts/db/index.ts +19 -0
  1243. package/src/scripts/db/migrate-encrypt-credentials.ts +223 -0
  1244. package/src/scripts/db/migrate-encrypt-oauth-tokens.ts +213 -0
  1245. package/src/scripts/db/migrate-user-api-keys.ts +257 -0
  1246. package/src/scripts/db/patch.ts +820 -0
  1247. package/src/scripts/db/query.ts +299 -0
  1248. package/src/scripts/db/reset-dev-owner.ts +285 -0
  1249. package/src/scripts/db/safety.ts +286 -0
  1250. package/src/scripts/db/schema.ts +364 -0
  1251. package/src/scripts/db/scoping.ts +341 -0
  1252. package/src/scripts/db/sqlite-client.ts +78 -0
  1253. package/src/scripts/db/tool-mode.ts +23 -0
  1254. package/src/scripts/db/tool-schemas.ts +31 -0
  1255. package/src/scripts/db/wipe-leaked-builder-keys.ts +201 -0
  1256. package/src/scripts/dev/index.ts +296 -0
  1257. package/src/scripts/dev/list-files.ts +119 -0
  1258. package/src/scripts/dev/read-file.ts +77 -0
  1259. package/src/scripts/dev/search-files.ts +151 -0
  1260. package/src/scripts/dev/shell.ts +111 -0
  1261. package/src/scripts/dev/write-file.ts +56 -0
  1262. package/src/scripts/dev-session.ts +96 -0
  1263. package/src/scripts/docs/index.ts +8 -0
  1264. package/src/scripts/docs/search.ts +274 -0
  1265. package/src/scripts/docs/source-search.ts +363 -0
  1266. package/src/scripts/index.ts +15 -0
  1267. package/src/scripts/manage-agent-loop-settings.ts +84 -0
  1268. package/src/scripts/parse-args.ts +46 -0
  1269. package/src/scripts/resources/delete-memory.ts +67 -0
  1270. package/src/scripts/resources/delete.ts +69 -0
  1271. package/src/scripts/resources/effective.ts +71 -0
  1272. package/src/scripts/resources/index.ts +18 -0
  1273. package/src/scripts/resources/list.ts +103 -0
  1274. package/src/scripts/resources/migrate-learnings.ts +40 -0
  1275. package/src/scripts/resources/read.ts +107 -0
  1276. package/src/scripts/resources/save-memory.ts +99 -0
  1277. package/src/scripts/resources/write.ts +158 -0
  1278. package/src/scripts/runner.ts +339 -0
  1279. package/src/scripts/utils.ts +130 -0
  1280. package/src/search/index.ts +413 -0
  1281. package/src/search-utils/index.ts +112 -0
  1282. package/src/secrets/crypto.ts +228 -0
  1283. package/src/secrets/index.ts +65 -0
  1284. package/src/secrets/onboarding.ts +101 -0
  1285. package/src/secrets/register-framework-secrets.ts +228 -0
  1286. package/src/secrets/register.ts +129 -0
  1287. package/src/secrets/routes.ts +697 -0
  1288. package/src/secrets/schema.ts +52 -0
  1289. package/src/secrets/storage.ts +561 -0
  1290. package/src/secrets/substitution.ts +305 -0
  1291. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +150 -0
  1292. package/src/server/action-change.ts +66 -0
  1293. package/src/server/action-discovery.ts +774 -0
  1294. package/src/server/action-routes.ts +608 -0
  1295. package/src/server/agent-access.ts +72 -0
  1296. package/src/server/agent-chat/action-filters-a2a.ts +339 -0
  1297. package/src/server/agent-chat/browser-team-tools.ts +510 -0
  1298. package/src/server/agent-chat/context-tools.ts +599 -0
  1299. package/src/server/agent-chat/framework-prompts.ts +467 -0
  1300. package/src/server/agent-chat/lazy-fs.ts +11 -0
  1301. package/src/server/agent-chat/mcp-glue.ts +91 -0
  1302. package/src/server/agent-chat/plugin-options.ts +379 -0
  1303. package/src/server/agent-chat/process-run-failure.ts +62 -0
  1304. package/src/server/agent-chat/prompt-resources.ts +1004 -0
  1305. package/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  1306. package/src/server/agent-chat/request-surface.ts +71 -0
  1307. package/src/server/agent-chat/run-code-tools.ts +67 -0
  1308. package/src/server/agent-chat/script-entries.ts +796 -0
  1309. package/src/server/agent-chat/shared-thread.ts +301 -0
  1310. package/src/server/agent-chat/skill-frontmatter.ts +41 -0
  1311. package/src/server/agent-chat-plugin.ts +5930 -0
  1312. package/src/server/agent-discovery.ts +706 -0
  1313. package/src/server/agent-engine-api-key-route.ts +236 -0
  1314. package/src/server/agent-run-context.ts +204 -0
  1315. package/src/server/agent-teams-run-queue.ts +344 -0
  1316. package/src/server/agent-teams.ts +2257 -0
  1317. package/src/server/agents-bundle.ts +464 -0
  1318. package/src/server/analytics.ts +105 -0
  1319. package/src/server/app-base-path.ts +79 -0
  1320. package/src/server/app-name.ts +53 -0
  1321. package/src/server/app-url.ts +184 -0
  1322. package/src/server/attachment-actions.ts +276 -0
  1323. package/src/server/attribution.ts +214 -0
  1324. package/src/server/auth-marketing.ts +260 -0
  1325. package/src/server/auth-plugin.ts +27 -0
  1326. package/src/server/auth.ts +3803 -0
  1327. package/src/server/better-auth-instance.ts +1197 -0
  1328. package/src/server/builder-browser.ts +1701 -0
  1329. package/src/server/builder-design-systems.ts +668 -0
  1330. package/src/server/builder-space.ts +176 -0
  1331. package/src/server/captcha.ts +63 -0
  1332. package/src/server/capture-error.ts +64 -0
  1333. package/src/server/cli-capture.ts +141 -0
  1334. package/src/server/collab-plugin.ts +391 -0
  1335. package/src/server/complete-text.ts +231 -0
  1336. package/src/server/cookie-namespace.ts +159 -0
  1337. package/src/server/core-routes-plugin.ts +4122 -0
  1338. package/src/server/cors-origins.ts +60 -0
  1339. package/src/server/create-server.ts +268 -0
  1340. package/src/server/credential-provider.ts +1202 -0
  1341. package/src/server/csrf.ts +229 -0
  1342. package/src/server/date-utils.ts +42 -0
  1343. package/src/server/deep-link.ts +119 -0
  1344. package/src/server/derived-secret.ts +32 -0
  1345. package/src/server/design-token-utils.ts +1032 -0
  1346. package/src/server/desktop-sso.ts +83 -0
  1347. package/src/server/edge.ts +69 -0
  1348. package/src/server/email-actions.ts +218 -0
  1349. package/src/server/email-template.ts +192 -0
  1350. package/src/server/email-templates.ts +148 -0
  1351. package/src/server/email.ts +219 -0
  1352. package/src/server/embed-route.ts +283 -0
  1353. package/src/server/embed-session.ts +805 -0
  1354. package/src/server/embedded.ts +252 -0
  1355. package/src/server/entry-server.tsx +154 -0
  1356. package/src/server/framework-request-handler.ts +848 -0
  1357. package/src/server/fusion-app.ts +447 -0
  1358. package/src/server/google-auth-mode.ts +34 -0
  1359. package/src/server/google-auth-plugin.ts +496 -0
  1360. package/src/server/google-oauth-credentials.ts +128 -0
  1361. package/src/server/google-oauth.ts +972 -0
  1362. package/src/server/google-realtime-session.ts +182 -0
  1363. package/src/server/h3-helpers.ts +174 -0
  1364. package/src/server/http-response-telemetry.ts +396 -0
  1365. package/src/server/identity-sso-store.ts +304 -0
  1366. package/src/server/identity-sso.ts +514 -0
  1367. package/src/server/index.ts +593 -0
  1368. package/src/server/missing-key.ts +36 -0
  1369. package/src/server/oauth-helpers.ts +44 -0
  1370. package/src/server/oauth-public-origin.ts +44 -0
  1371. package/src/server/oauth-return-url.ts +120 -0
  1372. package/src/server/og-fonts-data.ts +15 -0
  1373. package/src/server/og-fonts.ts +75 -0
  1374. package/src/server/onboarding-html.ts +4040 -0
  1375. package/src/server/open-route.ts +311 -0
  1376. package/src/server/org-admin.ts +28 -0
  1377. package/src/server/poll-events.ts +88 -0
  1378. package/src/server/poll.ts +1224 -0
  1379. package/src/server/prompts/framework-core-compact.ts +107 -0
  1380. package/src/server/prompts/framework-core.ts +143 -0
  1381. package/src/server/prompts/index.ts +16 -0
  1382. package/src/server/prompts/model-overlays.ts +54 -0
  1383. package/src/server/prompts/shared-rules.ts +104 -0
  1384. package/src/server/realtime-voice.ts +967 -0
  1385. package/src/server/recap-image-route.ts +242 -0
  1386. package/src/server/recap-image-store.ts +185 -0
  1387. package/src/server/request-context.ts +416 -0
  1388. package/src/server/request-origin.ts +67 -0
  1389. package/src/server/resources-plugin.ts +119 -0
  1390. package/src/server/schema-prompt.ts +429 -0
  1391. package/src/server/scoped-key-storage.ts +223 -0
  1392. package/src/server/security-headers.ts +170 -0
  1393. package/src/server/self-dispatch.ts +224 -0
  1394. package/src/server/sentry-config.ts +73 -0
  1395. package/src/server/sentry-plugin.ts +138 -0
  1396. package/src/server/sentry.ts +444 -0
  1397. package/src/server/short-lived-token.ts +170 -0
  1398. package/src/server/social-og-image.ts +454 -0
  1399. package/src/server/sse.ts +102 -0
  1400. package/src/server/ssr-handler.ts +466 -0
  1401. package/src/server/transcribe-voice.ts +1076 -0
  1402. package/src/server/voice-providers-status.ts +118 -0
  1403. package/src/server/workspace-oauth.ts +31 -0
  1404. package/src/server/workspace-provider-oauth.ts +970 -0
  1405. package/src/session-replay-iframe-protocol.ts +58 -0
  1406. package/src/settings/handlers.ts +44 -0
  1407. package/src/settings/index.ts +34 -0
  1408. package/src/settings/org-settings.ts +83 -0
  1409. package/src/settings/script-helpers.ts +24 -0
  1410. package/src/settings/store.ts +247 -0
  1411. package/src/settings/user-settings.ts +47 -0
  1412. package/src/setup-connections/index.ts +90 -0
  1413. package/src/setup-connections/onboarding.ts +47 -0
  1414. package/src/shared/agent-access.ts +112 -0
  1415. package/src/shared/agent-chat.ts +124 -0
  1416. package/src/shared/agent-env.ts +46 -0
  1417. package/src/shared/agent-readable-resource.ts +111 -0
  1418. package/src/shared/agent-sidebar-url.ts +39 -0
  1419. package/src/shared/cache-control.ts +25 -0
  1420. package/src/shared/cloudflare-globals.d.ts +34 -0
  1421. package/src/shared/context-xray.ts +172 -0
  1422. package/src/shared/embed-auth.ts +6 -0
  1423. package/src/shared/index.ts +83 -0
  1424. package/src/shared/llm-connection.ts +42 -0
  1425. package/src/shared/markdown-block-split.ts +129 -0
  1426. package/src/shared/mcp-connect-content.ts +130 -0
  1427. package/src/shared/mcp-embed-headers.ts +175 -0
  1428. package/src/shared/mcp-integration-config.ts +101 -0
  1429. package/src/shared/merge-by-id.ts +14 -0
  1430. package/src/shared/oauth-state.ts +39 -0
  1431. package/src/shared/reasoning-effort.ts +228 -0
  1432. package/src/shared/route-warmup-config.ts +128 -0
  1433. package/src/shared/runtime.ts +31 -0
  1434. package/src/shared/social-meta.ts +82 -0
  1435. package/src/shared/streaming-text-smoothing.ts +184 -0
  1436. package/src/shared/truncate.ts +13 -0
  1437. package/src/shared/workspace-app-audience.ts +177 -0
  1438. package/src/shared/workspace-app-id.ts +54 -0
  1439. package/src/sharing/access.ts +585 -0
  1440. package/src/sharing/actions/create-agent-resource-link.ts +91 -0
  1441. package/src/sharing/actions/extension-change.ts +22 -0
  1442. package/src/sharing/actions/list-resource-shares.ts +93 -0
  1443. package/src/sharing/actions/set-resource-visibility.ts +91 -0
  1444. package/src/sharing/actions/share-resource.ts +322 -0
  1445. package/src/sharing/actions/unshare-resource.ts +72 -0
  1446. package/src/sharing/index.ts +35 -0
  1447. package/src/sharing/registry.ts +201 -0
  1448. package/src/sharing/schema.ts +99 -0
  1449. package/src/styles/agent-conversation.css +766 -0
  1450. package/src/styles/agent-native.css +938 -0
  1451. package/src/styles/blocks.css +1717 -0
  1452. package/src/styles/chat-history-list.css +1 -0
  1453. package/src/styles/rich-markdown-editor.css +1 -0
  1454. package/src/tailwind.preset.ts +140 -0
  1455. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1456. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1457. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1458. package/src/templates/chat/AGENTS.md +3 -2
  1459. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1460. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1461. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1462. package/src/templates/default/AGENTS.md +6 -5
  1463. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1464. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1465. package/src/templates/headless/AGENTS.md +5 -4
  1466. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1467. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  1468. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1469. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1470. package/src/templates/workspace-core/AGENTS.md +4 -4
  1471. package/src/templates/workspace-root/AGENTS.md +4 -4
  1472. package/src/terminal/cli-registry.ts +57 -0
  1473. package/src/terminal/index.ts +22 -0
  1474. package/src/terminal/pty-server.ts +389 -0
  1475. package/src/terminal/terminal-plugin.ts +265 -0
  1476. package/src/testing.ts +23 -0
  1477. package/src/tracking/index.ts +10 -0
  1478. package/src/tracking/providers.ts +422 -0
  1479. package/src/tracking/registry.ts +102 -0
  1480. package/src/tracking/route.ts +108 -0
  1481. package/src/tracking/types.ts +16 -0
  1482. package/src/transcription/builder-transcription.ts +118 -0
  1483. package/src/triggers/actions/list-automations.ts +99 -0
  1484. package/src/triggers/actions/manage-automation.ts +78 -0
  1485. package/src/triggers/actions.ts +333 -0
  1486. package/src/triggers/condition-evaluator.ts +163 -0
  1487. package/src/triggers/dispatcher.ts +536 -0
  1488. package/src/triggers/index.ts +13 -0
  1489. package/src/triggers/routes.ts +322 -0
  1490. package/src/triggers/types.ts +42 -0
  1491. package/src/types/pglite.d.ts +26 -0
  1492. package/src/usage/store.ts +698 -0
  1493. package/src/vite/action-types-plugin.ts +481 -0
  1494. package/src/vite/agent-web-plugin.ts +78 -0
  1495. package/src/vite/agents-bundle-plugin.ts +185 -0
  1496. package/src/vite/client.ts +3039 -0
  1497. package/src/vite/index.ts +21 -0
  1498. package/src/voice/index.ts +18 -0
  1499. package/src/voice/voice-cleanup-prompt.ts +38 -0
  1500. package/src/voice/voice-context.ts +217 -0
  1501. package/src/voice/voice-replacements.ts +75 -0
  1502. package/src/workspace-connections/credentials.ts +603 -0
  1503. package/src/workspace-connections/index.ts +72 -0
  1504. package/src/workspace-connections/lifecycle.ts +43 -0
  1505. package/src/workspace-connections/store.ts +1943 -0
  1506. package/src/workspace-files/index.ts +18 -0
  1507. package/src/workspace-files/store.ts +339 -0
  1508. package/src/workspace-files/tool.ts +266 -0
@@ -0,0 +1,1584 @@
1
+ import type { ActionChatUIConfig } from "../action-ui.js";
2
+ import {
3
+ isCredentialGapCodeAgentEvent,
4
+ normalizeCodeAgentTranscript,
5
+ type CodeAgentTranscriptEvent as CoreCodeAgentTranscriptEvent,
6
+ type NormalizedCodeAgentStatusEvent,
7
+ type NormalizedCodeAgentThinkingEvent,
8
+ type NormalizedCodeAgentToolEvent,
9
+ type NormalizedCodeAgentTranscriptItem,
10
+ } from "../code-agents/transcript-normalizer.js";
11
+ import type { AgentMcpAppPayload } from "../mcp-client/app-result.js";
12
+ import type { EngineMessage } from "./engine/types.js";
13
+ import type { AgentChatAttachment, RunEvent } from "./types.js";
14
+
15
+ interface ContentPart {
16
+ type: string;
17
+ text?: string;
18
+ toolCallId?: string;
19
+ toolName?: string;
20
+ argsText?: string;
21
+ args?: Record<string, string>;
22
+ result?: string;
23
+ isError?: boolean;
24
+ completedSideEffect?: boolean;
25
+ mcpApp?: AgentMcpAppPayload;
26
+ chatUI?: ActionChatUIConfig;
27
+ }
28
+
29
+ interface BuildAssistantMessageOptions {
30
+ suppressInternalContinuation?: boolean;
31
+ /**
32
+ * Logical-turn identity. When set it is stamped onto the message metadata so
33
+ * continuation runs of the same turn can be folded onto a single durable
34
+ * assistant message (see foldAssistantTurn) instead of each run dropping or
35
+ * overwriting the others.
36
+ */
37
+ turnId?: string;
38
+ }
39
+
40
+ type AssistantMessage = NonNullable<ReturnType<typeof buildAssistantMessage>>;
41
+ type UserMessage = ReturnType<typeof buildUserMessage>;
42
+
43
+ const INTERRUPTED_TOOL_RESULT =
44
+ "Interrupted before this tool returned a result.";
45
+
46
+ const MAX_STORED_ATTACHMENT_CHARS = 60_000;
47
+ /**
48
+ * When no file-upload provider is configured we fall back to storing base64
49
+ * directly in the SQL thread_data column. Cap the raw base64 per attachment to
50
+ * avoid unbounded row growth. Attachments larger than this get a '[truncated]'
51
+ * marker so the transcript still renders but the column stays sane.
52
+ */
53
+ const MAX_STORED_BASE64_BYTES = 2 * 1024 * 1024; // 2 MB per attachment
54
+
55
+ function isInternalContinuationError(event: {
56
+ error: string;
57
+ errorCode?: string;
58
+ recoverable?: boolean;
59
+ }): boolean {
60
+ const code = String(event.errorCode ?? "").toLowerCase();
61
+ const msg = event.error.toLowerCase();
62
+ if (code === "builder_gateway_error") return false;
63
+ return (
64
+ event.recoverable === true ||
65
+ code === "builder_gateway_timeout" ||
66
+ code === "stale_run" ||
67
+ code === "timeout" ||
68
+ code === "timeout_error" ||
69
+ code === "http_408" ||
70
+ code === "http_429" ||
71
+ code === "http_500" ||
72
+ code === "http_502" ||
73
+ code === "http_503" ||
74
+ code === "http_504" ||
75
+ code === "rate_limited" ||
76
+ code === "too_many_concurrent_requests" ||
77
+ code === "overloaded_error" ||
78
+ msg.includes("timeout") ||
79
+ msg.includes("gateway timeout") ||
80
+ msg.includes("inactivity timeout") ||
81
+ msg.includes("stream ended") ||
82
+ msg.includes("stream closed") ||
83
+ msg.includes("temporarily unavailable") ||
84
+ msg.includes("502") ||
85
+ msg.includes("503") ||
86
+ msg.includes("504") ||
87
+ msg.includes("529")
88
+ );
89
+ }
90
+
91
+ /**
92
+ * Reconstruct an assistant-ui message from raw agent run events.
93
+ * Mirrors the client-side processEvent logic so the server can persist
94
+ * the assistant's response even if the frontend is disconnected.
95
+ */
96
+ export function buildAssistantMessage(
97
+ events: RunEvent[],
98
+ runId?: string,
99
+ options: BuildAssistantMessageOptions = {},
100
+ ): {
101
+ id: string;
102
+ createdAt: Date;
103
+ role: "assistant";
104
+ content: ContentPart[];
105
+ status:
106
+ | { type: "complete"; reason: "stop" }
107
+ | { type: "incomplete"; reason: "error" };
108
+ metadata: Record<string, unknown>;
109
+ } | null {
110
+ const content: ContentPart[] = [];
111
+ let toolCallCounter = 0;
112
+ let runError: {
113
+ message: string;
114
+ errorCode?: string;
115
+ details?: string;
116
+ recoverable?: boolean;
117
+ } | null = null;
118
+ let endedAtInternalContinuationBoundary = false;
119
+
120
+ const appendText = (text: string) => {
121
+ const last = content[content.length - 1];
122
+ if (last && last.type === "text") {
123
+ last.text = (last.text ?? "") + text;
124
+ } else {
125
+ content.push({ type: "text", text });
126
+ }
127
+ };
128
+
129
+ const appendReasoning = (text: string) => {
130
+ const last = content[content.length - 1];
131
+ if (last && last.type === "reasoning") {
132
+ last.text = (last.text ?? "") + text;
133
+ } else {
134
+ content.push({ type: "reasoning", text });
135
+ }
136
+ };
137
+
138
+ for (const { event } of events) {
139
+ if (event.type === "clear") {
140
+ clearAssistantDraftContent(content);
141
+ continue;
142
+ }
143
+
144
+ if (event.type === "text") {
145
+ appendText(event.text ?? "");
146
+ continue;
147
+ }
148
+
149
+ if (event.type === "thinking") {
150
+ appendReasoning(event.text ?? "");
151
+ continue;
152
+ }
153
+
154
+ if (event.type === "tool_start") {
155
+ toolCallCounter += 1;
156
+ const toolCallId =
157
+ event.id?.trim() ||
158
+ (runId ? `${runId}:tc_${toolCallCounter}` : `tc_${toolCallCounter}`);
159
+ const args = (event.input ?? {}) as Record<string, string>;
160
+ content.push({
161
+ type: "tool-call",
162
+ toolCallId,
163
+ toolName: event.tool ?? "unknown",
164
+ argsText: JSON.stringify(args),
165
+ args,
166
+ });
167
+ continue;
168
+ }
169
+
170
+ if (event.type === "tool_done") {
171
+ const eventToolCallId = event.id?.trim();
172
+ let matchingIndex = -1;
173
+
174
+ if (eventToolCallId) {
175
+ for (let i = content.length - 1; i >= 0; i--) {
176
+ const part = content[i];
177
+ if (
178
+ part.type === "tool-call" &&
179
+ part.toolCallId === eventToolCallId &&
180
+ part.result === undefined
181
+ ) {
182
+ matchingIndex = i;
183
+ break;
184
+ }
185
+ }
186
+ }
187
+
188
+ if (matchingIndex === -1) {
189
+ for (let i = content.length - 1; i >= 0; i--) {
190
+ const part = content[i];
191
+ if (
192
+ part.type === "tool-call" &&
193
+ part.toolName === event.tool &&
194
+ part.result === undefined
195
+ ) {
196
+ matchingIndex = i;
197
+ break;
198
+ }
199
+ }
200
+ }
201
+
202
+ const part = content[matchingIndex];
203
+ if (part?.type === "tool-call") {
204
+ part.result = event.result ?? "";
205
+ if (event.isError !== undefined) part.isError = event.isError;
206
+ if (event.completedSideEffect !== undefined) {
207
+ part.completedSideEffect = event.completedSideEffect;
208
+ }
209
+ if (event.mcpApp) part.mcpApp = event.mcpApp;
210
+ if (event.chatUI) part.chatUI = event.chatUI;
211
+ }
212
+ continue;
213
+ }
214
+
215
+ if (event.type === "loop_limit") {
216
+ // Older servers emitted this as a user-visible terminal event. Treat it
217
+ // as an internal continuation boundary when rebuilding persisted turns.
218
+ if (options.suppressInternalContinuation) {
219
+ endedAtInternalContinuationBoundary = true;
220
+ }
221
+ continue;
222
+ }
223
+
224
+ if (event.type === "auto_continue") {
225
+ if (options.suppressInternalContinuation) {
226
+ endedAtInternalContinuationBoundary = true;
227
+ }
228
+ continue;
229
+ }
230
+
231
+ if (event.type === "error") {
232
+ if (
233
+ options.suppressInternalContinuation &&
234
+ isInternalContinuationError(event)
235
+ ) {
236
+ endedAtInternalContinuationBoundary = true;
237
+ continue;
238
+ }
239
+ if (event.errorCode === "run_timeout" && event.recoverable) {
240
+ continue;
241
+ }
242
+ runError = {
243
+ message: event.error,
244
+ ...(event.errorCode ? { errorCode: event.errorCode } : {}),
245
+ ...(event.details ? { details: event.details } : {}),
246
+ ...(event.recoverable ? { recoverable: event.recoverable } : {}),
247
+ };
248
+ appendText(`${content.length > 0 ? "\n\n" : ""}Error: ${event.error}`);
249
+ continue;
250
+ }
251
+
252
+ // done, missing_api_key — terminal signals, not content
253
+ }
254
+
255
+ // Only a truly empty turn produces nothing to persist. A turn that ended at
256
+ // an internal continuation boundary (soft-timeout auto_continue, a
257
+ // recoverable gateway error, suppressed loop_limit) DID stream real content
258
+ // — persist it as a partial so the continuation run can fold the next chunk
259
+ // onto it (foldAssistantTurn) instead of the earlier text being dropped.
260
+ if (content.length === 0) return null;
261
+
262
+ const continued = endedAtInternalContinuationBoundary;
263
+ if (!continued) {
264
+ settleInterruptedToolCalls(content);
265
+ }
266
+
267
+ const custom: Record<string, unknown> = {};
268
+ if (options.turnId) custom.turnId = options.turnId;
269
+ if (runId) custom.foldedRunIds = [runId];
270
+ if (continued) custom.continued = true;
271
+ if (runError) {
272
+ custom.runError = {
273
+ ...runError,
274
+ ...(runId ? { runId } : {}),
275
+ };
276
+ }
277
+
278
+ const metadata: Record<string, unknown> = {};
279
+ if (runId) metadata.runId = runId;
280
+ if (Object.keys(custom).length > 0) metadata.custom = custom;
281
+
282
+ return {
283
+ id: `server-${runId ?? Date.now()}`,
284
+ createdAt: new Date(),
285
+ role: "assistant",
286
+ content,
287
+ status: runError
288
+ ? { type: "incomplete" as const, reason: "error" as const }
289
+ : { type: "complete" as const, reason: "stop" as const },
290
+ metadata,
291
+ };
292
+ }
293
+
294
+ function clearAssistantDraftContent(content: ContentPart[]): void {
295
+ for (let index = content.length - 1; index >= 0; index--) {
296
+ const part = content[index];
297
+ if (!part) continue;
298
+ if (part.type === "text" || part.type === "reasoning") {
299
+ content.splice(index, 1);
300
+ continue;
301
+ }
302
+ if (part.type === "tool-call" && part.result === undefined) {
303
+ // Keep materialized in-flight tool cards across retry clears so persisted
304
+ // thread rebuilds match the live SSE processor and avoid hide→show flicker.
305
+ const isEphemeral =
306
+ (part as { activity?: boolean }).activity === true ||
307
+ part.argsText === "" ||
308
+ Object.keys(part.args ?? {}).length === 0;
309
+ if (isEphemeral) content.splice(index, 1);
310
+ }
311
+ }
312
+ }
313
+
314
+ function getStoredMessage(entry: any): any {
315
+ return entry?.message ?? entry;
316
+ }
317
+
318
+ function getStoredParentId(entry: any): string | null | undefined {
319
+ return typeof entry?.parentId === "string" || entry?.parentId === null
320
+ ? entry.parentId
321
+ : undefined;
322
+ }
323
+
324
+ function getStoredRunConfig(entry: any): any {
325
+ return entry && typeof entry === "object" && "runConfig" in entry
326
+ ? entry.runConfig
327
+ : undefined;
328
+ }
329
+
330
+ function messageId(message: any): string | undefined {
331
+ return typeof message?.id === "string" && message.id ? message.id : undefined;
332
+ }
333
+
334
+ function getMessageRunId(message: any): string | undefined {
335
+ const meta = message?.metadata;
336
+ const direct = meta?.runId;
337
+ const custom = meta?.custom?.runId;
338
+ const errorRun = meta?.custom?.runError?.runId ?? meta?.runError?.runId;
339
+ if (typeof direct === "string") return direct;
340
+ if (typeof custom === "string") return custom;
341
+ if (typeof errorRun === "string") return errorRun;
342
+ return undefined;
343
+ }
344
+
345
+ function messageContentIsEmpty(content: unknown): boolean {
346
+ if (typeof content === "string") return content.trim().length === 0;
347
+ if (Array.isArray(content)) {
348
+ return !content.some((part: any) => {
349
+ if (!part || typeof part !== "object") return false;
350
+ if (part.type === "text") {
351
+ return typeof part.text === "string" && part.text.trim().length > 0;
352
+ }
353
+ return true;
354
+ });
355
+ }
356
+ return content == null;
357
+ }
358
+
359
+ function messageText(content: unknown): string {
360
+ if (typeof content === "string") return content;
361
+ if (!Array.isArray(content)) return "";
362
+ return content
363
+ .filter(
364
+ (part: any) => part?.type === "text" && typeof part.text === "string",
365
+ )
366
+ .map((part: any) => part.text)
367
+ .join("");
368
+ }
369
+
370
+ function settleInterruptedToolCalls(content: ContentPart[]): void {
371
+ for (const part of content) {
372
+ if (part.type === "tool-call" && part.result === undefined) {
373
+ part.result = INTERRUPTED_TOOL_RESULT;
374
+ }
375
+ }
376
+ }
377
+
378
+ function isTerminalAssistantStatus(status: unknown): boolean {
379
+ const type = (status as { type?: unknown } | undefined)?.type;
380
+ return type === "complete" || type === "incomplete";
381
+ }
382
+
383
+ function normalizeAttachmentIdentity(attachments: unknown): unknown {
384
+ if (!Array.isArray(attachments) || attachments.length === 0) return undefined;
385
+ return attachments.map((att: any) => ({
386
+ type: att?.type,
387
+ name: att?.name,
388
+ contentType: att?.contentType,
389
+ }));
390
+ }
391
+
392
+ // Strip the render-only `toolCallId` before fingerprinting. The id is generated
393
+ // differently depending on who built the message — the server now scopes it by
394
+ // run (`${runId}:tc_1`) while the client's live stream uses a bare counter
395
+ // (`tc_1`) — so the client export and the server fold of the SAME tool-call turn
396
+ // would otherwise hash to different fingerprints and fail to dedupe, leaving the
397
+ // turn rendered twice. The id never participates in message identity (history
398
+ // replay regenerates its own ids), so hashing content without it is the correct
399
+ // notion of "same message".
400
+ function normalizeContentForFingerprint(content: unknown): unknown {
401
+ if (!Array.isArray(content)) return content;
402
+ return content.map((part: any) =>
403
+ part && typeof part === "object" && part.type === "tool-call"
404
+ ? { ...part, toolCallId: undefined }
405
+ : part,
406
+ );
407
+ }
408
+
409
+ function messageIdentityKeys(message: any): string[] {
410
+ const keys: string[] = [];
411
+ if (typeof message?.id === "string" && message.id) {
412
+ keys.push(`id:${message.id}`);
413
+ }
414
+ const runId = getMessageRunId(message);
415
+ if (runId) keys.push(`run:${runId}`);
416
+ // A logical turn is ONE durable assistant message even though it may span
417
+ // several continuation runs, so two messages sharing a turnId (e.g. the
418
+ // client export and the server fold of the same answer) must dedupe to one.
419
+ const turnId = turnIdOf(message);
420
+ if (turnId) keys.push(`turn:${turnId}`);
421
+
422
+ // Normalize attachments through `normalizeAttachmentIdentity` so an
423
+ // explicit empty `[]` (assistant-ui's default for messages with no
424
+ // attachments) and an omitted/undefined `attachments` field hash to the
425
+ // same fingerprint. Without this, every user message ended up duplicated
426
+ // in `chat_threads`: one copy from `saveThreadData` (runtime export
427
+ // includes `attachments: []`) and one from `persistSubmittedUserMessage`
428
+ // → `buildUserMessage` (omits the field entirely). The merge couldn't
429
+ // dedupe them because their fingerprints differed by exactly one
430
+ // `[]` vs `undefined`. (Repro on slides prod: every user turn produced
431
+ // a `client_user → assistant → server_user` triple instead of a
432
+ // `user → assistant` pair.)
433
+ try {
434
+ keys.push(
435
+ `fingerprint:${JSON.stringify({
436
+ role: message?.role,
437
+ content: normalizeContentForFingerprint(message?.content),
438
+ attachments: normalizeAttachmentIdentity(message?.attachments),
439
+ })}`,
440
+ );
441
+ } catch {
442
+ // Best effort. id/runId usually exist for persisted assistant-ui rows.
443
+ }
444
+ if (message?.role === "user") {
445
+ try {
446
+ keys.push(
447
+ `user-fingerprint:${JSON.stringify({
448
+ role: message.role,
449
+ content: normalizeContentForFingerprint(message.content),
450
+ attachments: normalizeAttachmentIdentity(message.attachments),
451
+ })}`,
452
+ );
453
+ } catch {
454
+ // Same best-effort behavior as the full fingerprint.
455
+ }
456
+ }
457
+ return keys;
458
+ }
459
+
460
+ function messagesMatch(a: any, b: any): boolean {
461
+ const bKeys = new Set(messageIdentityKeys(b));
462
+ return messageIdentityKeys(a).some((key) => bKeys.has(key));
463
+ }
464
+
465
+ function chooseMergedMessageEntry(existingEntry: any, incomingEntry: any): any {
466
+ const existing = getStoredMessage(existingEntry);
467
+ const incoming = getStoredMessage(incomingEntry);
468
+ // Same logical turn (client export vs server fold of one accumulating
469
+ // answer): never shrink — keep whichever side accumulated more content, so a
470
+ // stale/lossy export can't overwrite the richer folded turn. Ties prefer the
471
+ // terminal copy.
472
+ const existingTurn = turnIdOf(existing);
473
+ const incomingTurn = turnIdOf(incoming);
474
+ if (
475
+ existing?.role === "assistant" &&
476
+ incoming?.role === "assistant" &&
477
+ existingTurn &&
478
+ existingTurn === incomingTurn
479
+ ) {
480
+ const existingWeight = assistantContentWeight(existing.content);
481
+ const incomingWeight = assistantContentWeight(incoming.content);
482
+ if (existingWeight > incomingWeight) return existingEntry;
483
+ if (incomingWeight > existingWeight) return incomingEntry;
484
+ return isTerminalAssistantStatus(existing?.status) &&
485
+ !isTerminalAssistantStatus(incoming?.status)
486
+ ? existingEntry
487
+ : incomingEntry;
488
+ }
489
+ if (
490
+ existing?.role === "assistant" &&
491
+ incoming?.role === "assistant" &&
492
+ isTerminalAssistantStatus(existing?.status) &&
493
+ !isTerminalAssistantStatus(incoming?.status)
494
+ ) {
495
+ return existingEntry;
496
+ }
497
+ return incomingEntry;
498
+ }
499
+
500
+ function normalizeMessageEntry(
501
+ entry: any,
502
+ parentId: string | null,
503
+ ): { message: any; parentId: string | null; runConfig?: any } | null {
504
+ const message = getStoredMessage(entry);
505
+ if (!messageId(message)) return null;
506
+ const normalizedMessage = normalizeAssistantToolCallIds(message);
507
+ const runConfig = getStoredRunConfig(entry);
508
+ return {
509
+ message: normalizedMessage,
510
+ parentId,
511
+ ...(runConfig !== undefined ? { runConfig } : {}),
512
+ };
513
+ }
514
+
515
+ function uniqueToolCallId(toolCallId: string, seen: Set<string>): string {
516
+ if (!seen.has(toolCallId)) return toolCallId;
517
+ let suffix = 2;
518
+ let candidate = `${toolCallId}__dedup_${suffix}`;
519
+ while (seen.has(candidate)) {
520
+ suffix += 1;
521
+ candidate = `${toolCallId}__dedup_${suffix}`;
522
+ }
523
+ return candidate;
524
+ }
525
+
526
+ function normalizeAssistantToolCallIds(message: any): any {
527
+ if (message?.role !== "assistant" || !Array.isArray(message.content)) {
528
+ return message;
529
+ }
530
+
531
+ const seen = new Set<string>();
532
+ let changed = false;
533
+ const content = message.content.map((part: any) => {
534
+ if (
535
+ part?.type !== "tool-call" ||
536
+ typeof part.toolCallId !== "string" ||
537
+ part.toolCallId.length === 0
538
+ ) {
539
+ return part;
540
+ }
541
+
542
+ const nextToolCallId = uniqueToolCallId(part.toolCallId, seen);
543
+ seen.add(nextToolCallId);
544
+ if (nextToolCallId === part.toolCallId) return part;
545
+ changed = true;
546
+ return { ...part, toolCallId: nextToolCallId };
547
+ });
548
+
549
+ return changed ? { ...message, content } : message;
550
+ }
551
+
552
+ /**
553
+ * Convert legacy/partially merged thread data into assistant-ui's exported
554
+ * repository shape and repair parent links so `threadRuntime.import()` cannot
555
+ * fail with "Parent message not found".
556
+ */
557
+ export function normalizeThreadRepository(repo: any): any {
558
+ const normalized = repo && typeof repo === "object" ? { ...repo } : {};
559
+ const sourceMessages: any[] = Array.isArray(repo?.messages)
560
+ ? repo.messages
561
+ : [];
562
+ const firstIndexById = new Map<string, number>();
563
+ const lastEntryById = new Map<string, any>();
564
+ sourceMessages.forEach((entry, index) => {
565
+ const id = messageId(getStoredMessage(entry));
566
+ if (!id) return;
567
+ if (!firstIndexById.has(id)) firstIndexById.set(id, index);
568
+ lastEntryById.set(id, entry);
569
+ });
570
+ const uniqueSourceMessages = sourceMessages
571
+ .filter((entry, index) => {
572
+ const id = messageId(getStoredMessage(entry));
573
+ return id && firstIndexById.get(id) === index;
574
+ })
575
+ .map((entry) => {
576
+ const id = messageId(getStoredMessage(entry));
577
+ return (id && lastEntryById.get(id)) || entry;
578
+ });
579
+ const messages: Array<{
580
+ message: any;
581
+ parentId: string | null;
582
+ runConfig?: any;
583
+ }> = [];
584
+ const seenIds = new Set<string>();
585
+ let previousId: string | null = null;
586
+
587
+ for (const entry of uniqueSourceMessages) {
588
+ const message = getStoredMessage(entry);
589
+ const id = messageId(message);
590
+ if (!id) continue;
591
+
592
+ const requestedParentId = getStoredParentId(entry);
593
+ const parentId =
594
+ requestedParentId === null
595
+ ? null
596
+ : requestedParentId && seenIds.has(requestedParentId)
597
+ ? requestedParentId
598
+ : previousId;
599
+
600
+ const normalizedEntry = normalizeMessageEntry(entry, parentId);
601
+ if (!normalizedEntry) continue;
602
+
603
+ messages.push(normalizedEntry);
604
+ seenIds.add(id);
605
+ previousId = id;
606
+ }
607
+
608
+ normalized.messages = messages;
609
+ const headId = typeof repo?.headId === "string" ? repo.headId : undefined;
610
+ normalized.headId =
611
+ headId && seenIds.has(headId) ? headId : (previousId ?? null);
612
+ return normalized;
613
+ }
614
+
615
+ /**
616
+ * Rebuild a flat `EngineMessage[]` from persisted thread_data (the
617
+ * assistant-ui ExportedMessageRepository shape). Text-only — tool calls/results
618
+ * are flattened to their text so a continuation run gets the conversation
619
+ * prefix as plain context (Anthropic's prompt cache makes the resume cheap).
620
+ *
621
+ * Used to resume a background sub-agent in a fresh function invocation (the
622
+ * server-side analog of the browser re-POSTing history for the main chat).
623
+ * Originally inlined in `integrations/webhook-handler.ts`.
624
+ */
625
+ export function threadDataToEngineMessages(
626
+ threadData: string | Record<string, unknown> | null | undefined,
627
+ ): EngineMessage[] {
628
+ const messages: EngineMessage[] = [];
629
+ if (!threadData) return messages;
630
+ let data: any;
631
+ try {
632
+ data = typeof threadData === "string" ? JSON.parse(threadData) : threadData;
633
+ } catch {
634
+ return messages;
635
+ }
636
+ if (!Array.isArray(data?.messages)) return messages;
637
+ for (const entry of data.messages) {
638
+ const m = entry?.message ?? entry;
639
+ if (!m || (m.role !== "user" && m.role !== "assistant")) continue;
640
+ const text = threadMessageTextForEngine(m);
641
+ if (!text.trim()) continue;
642
+ messages.push({ role: m.role, content: [{ type: "text", text }] });
643
+ }
644
+ return messages;
645
+ }
646
+
647
+ const MAX_INTEGRATION_ARTIFACTS_IN_CONTEXT = 12;
648
+ const MAX_INTEGRATION_ARTIFACT_FIELD_CHARS = 500;
649
+
650
+ function boundedString(value: unknown): string | undefined {
651
+ if (typeof value !== "string") return undefined;
652
+ const trimmed = value.trim();
653
+ return trimmed
654
+ ? trimmed.slice(0, MAX_INTEGRATION_ARTIFACT_FIELD_CHARS)
655
+ : undefined;
656
+ }
657
+
658
+ function promptSafeJson(value: unknown): string {
659
+ return JSON.stringify(value)
660
+ .replaceAll("&", "\\u0026")
661
+ .replaceAll("<", "\\u003c")
662
+ .replaceAll(">", "\\u003e");
663
+ }
664
+
665
+ function messageTextContent(message: any): string {
666
+ if (typeof message?.content === "string") return message.content;
667
+ if (!Array.isArray(message?.content)) return "";
668
+ return message.content
669
+ .filter(
670
+ (part: any) => part?.type === "text" && typeof part.text === "string",
671
+ )
672
+ .map((part: any) => part.text)
673
+ .join("\n");
674
+ }
675
+
676
+ /**
677
+ * Select the participant-visible delivery for integration turns while keeping
678
+ * a compact, trusted resource ledger available to the agent. Raw tool results
679
+ * remain in thread_data for UI/audit use but are not replayed into the prompt.
680
+ */
681
+ export function threadMessageTextForEngine(message: any): string {
682
+ const delivery = message?.metadata?.integrationDelivery;
683
+ const deliveryAttempted =
684
+ message?.metadata?.integrationDeliveryAttempted === true;
685
+ const deliveredText =
686
+ message?.role === "assistant" &&
687
+ delivery?.status === "delivered" &&
688
+ typeof delivery.text === "string" &&
689
+ delivery.text.trim()
690
+ ? delivery.text
691
+ : undefined;
692
+ let text =
693
+ deliveredText ??
694
+ (message?.role === "assistant" && deliveryAttempted
695
+ ? ""
696
+ : messageTextContent(message));
697
+
698
+ if (message?.role !== "assistant") return text;
699
+ const storedArtifacts = message?.metadata?.integrationArtifacts;
700
+ if (!Array.isArray(storedArtifacts)) return text;
701
+
702
+ const artifacts = storedArtifacts
703
+ .slice(0, MAX_INTEGRATION_ARTIFACTS_IN_CONTEXT)
704
+ .map((artifact: any) => ({
705
+ resourceType: boundedString(artifact?.resourceType),
706
+ id: boundedString(artifact?.id),
707
+ sourceAction: boundedString(artifact?.sourceAction),
708
+ titleAtAction: boundedString(artifact?.titleAtAction),
709
+ url: boundedString(artifact?.url),
710
+ }))
711
+ .filter(
712
+ (artifact: {
713
+ resourceType?: string;
714
+ id?: string;
715
+ sourceAction?: string;
716
+ }) => artifact.resourceType && artifact.id && artifact.sourceAction,
717
+ );
718
+ if (artifacts.length === 0) return text;
719
+
720
+ const context = [
721
+ "<integration_artifact_context>",
722
+ "Trusted action history for this conversation. Resource IDs remain stable if participants rename the resource. Fields such as titleAtAction are historical aliases from the time of that action, not current resource state. Use stable IDs to locate an earlier artifact, read its current state before changing it, and omit fields the user did not explicitly ask to change while still deciding whether to update, add, supersede, or create.",
723
+ promptSafeJson(artifacts),
724
+ "</integration_artifact_context>",
725
+ ].join("\n");
726
+ text = text.trim() ? `${text.trim()}\n\n${context}` : context;
727
+ return text;
728
+ }
729
+
730
+ export interface CodeAgentThreadTranscriptEvent {
731
+ id: string;
732
+ runId: string;
733
+ kind?: CoreCodeAgentTranscriptEvent["kind"];
734
+ type?: CoreCodeAgentTranscriptEvent["kind"] | "note";
735
+ message?: string;
736
+ text?: string;
737
+ createdAt: string;
738
+ metadata?: Record<string, unknown>;
739
+ artifactPath?: string;
740
+ artifactUrl?: string;
741
+ signal?: CoreCodeAgentTranscriptEvent["signal"];
742
+ }
743
+
744
+ export interface BuildRepositoryFromCodeAgentTranscriptOptions {
745
+ hideCredentialMessages?: boolean;
746
+ }
747
+
748
+ export function buildRepositoryFromCodeAgentTranscript(
749
+ events: readonly CodeAgentThreadTranscriptEvent[],
750
+ options: BuildRepositoryFromCodeAgentTranscriptOptions = {},
751
+ ): any {
752
+ const normalized = normalizeCodeAgentTranscript(
753
+ events.map(toCoreCodeAgentTranscriptEvent),
754
+ );
755
+ const repo: {
756
+ headId: string | null;
757
+ messages: Array<{ message: any; parentId: string | null }>;
758
+ } = {
759
+ headId: null,
760
+ messages: [],
761
+ };
762
+
763
+ let headId: string | null = null;
764
+ let assistantTurn: {
765
+ turnIndex: number;
766
+ id: string;
767
+ createdAt: string;
768
+ updatedAt: string;
769
+ runId?: string;
770
+ content: ContentPart[];
771
+ eventIds: string[];
772
+ } | null = null;
773
+
774
+ const flushAssistant = () => {
775
+ if (!assistantTurn || assistantTurn.content.length === 0) {
776
+ assistantTurn = null;
777
+ return;
778
+ }
779
+ const message = {
780
+ id: assistantTurn.id,
781
+ createdAt: new Date(assistantTurn.createdAt),
782
+ role: "assistant" as const,
783
+ content: assistantTurn.content,
784
+ status: { type: "complete" as const, reason: "stop" as const },
785
+ metadata: {
786
+ ...(assistantTurn.runId ? { runId: assistantTurn.runId } : {}),
787
+ custom: {
788
+ codeAgentTranscriptEventIds: assistantTurn.eventIds,
789
+ },
790
+ },
791
+ };
792
+ repo.messages.push({ message, parentId: headId });
793
+ headId = message.id;
794
+ repo.headId = headId;
795
+ assistantTurn = null;
796
+ };
797
+
798
+ for (const item of normalized.items) {
799
+ if (item.type === "user") {
800
+ flushAssistant();
801
+ const runId = item.events[0]?.runId;
802
+ const userMessage = buildUserMessage({
803
+ text: item.text,
804
+ attachments: codeAgentAttachmentsFromEvents(item.events),
805
+ runId: runId ? `${runId}-${item.id}` : item.id,
806
+ createdAt: new Date(item.createdAt),
807
+ });
808
+ userMessage.id = `code-user-${item.id}`;
809
+ const existingCustom =
810
+ userMessage.metadata.custom &&
811
+ typeof userMessage.metadata.custom === "object"
812
+ ? (userMessage.metadata.custom as Record<string, unknown>)
813
+ : {};
814
+ userMessage.metadata = {
815
+ ...userMessage.metadata,
816
+ custom: {
817
+ ...existingCustom,
818
+ submittedRunId: runId,
819
+ codeAgentTranscriptEventIds: item.eventIds,
820
+ },
821
+ };
822
+ repo.messages.push({ message: userMessage, parentId: headId });
823
+ headId = userMessage.id;
824
+ repo.headId = headId;
825
+ continue;
826
+ }
827
+
828
+ const content = contentPartForCodeAgentTranscriptItem(item, options);
829
+ if (!content) continue;
830
+
831
+ if (!assistantTurn || assistantTurn.turnIndex !== item.turnIndex) {
832
+ flushAssistant();
833
+ assistantTurn = {
834
+ turnIndex: item.turnIndex,
835
+ id: `code-assistant-${item.turnIndex}-${item.id}`,
836
+ createdAt: item.createdAt,
837
+ updatedAt: item.updatedAt,
838
+ runId: item.events[0]?.runId,
839
+ content: [],
840
+ eventIds: [],
841
+ };
842
+ }
843
+ assistantTurn.updatedAt = item.updatedAt;
844
+ assistantTurn.eventIds.push(...item.eventIds);
845
+ if (content.type === "text") {
846
+ const last = assistantTurn.content.at(-1);
847
+ if (last?.type === "text") {
848
+ last.text = `${last.text}${last.text ? "\n\n" : ""}${content.text}`;
849
+ } else {
850
+ assistantTurn.content.push(content);
851
+ }
852
+ } else {
853
+ assistantTurn.content.push(content);
854
+ }
855
+ }
856
+
857
+ flushAssistant();
858
+ return normalizeThreadRepository(repo);
859
+ }
860
+
861
+ function rewriteEntryParentId(
862
+ entry: any,
863
+ idRewrites: Map<string, string>,
864
+ ): any {
865
+ const parentId = getStoredParentId(entry);
866
+ if (!parentId) return entry;
867
+ const rewritten = idRewrites.get(parentId);
868
+ if (!rewritten) return entry;
869
+ return { ...entry, parentId: rewritten };
870
+ }
871
+
872
+ /**
873
+ * Merge an incoming client-side full-thread save over the current SQL copy.
874
+ *
875
+ * The browser exports and PUTs the whole assistant-ui repository. If a server
876
+ * completion save lands first, an older browser export can otherwise replace
877
+ * `thread_data` wholesale and delete the assistant message the server just
878
+ * reconstructed from run events. Preserve server-only messages while still
879
+ * accepting client-only messages and metadata.
880
+ */
881
+ export interface MergeThreadDataOptions {
882
+ preserveExistingQueuedMessages?: boolean;
883
+ preserveExistingTopLevelKeys?: boolean;
884
+ }
885
+
886
+ export function mergeThreadDataForClientSave(
887
+ existingRepo: any,
888
+ incomingRepo: any,
889
+ options: MergeThreadDataOptions = {},
890
+ ) {
891
+ const preserveExistingQueuedMessages =
892
+ options.preserveExistingQueuedMessages ?? true;
893
+ const preserveExistingTopLevelKeys =
894
+ options.preserveExistingTopLevelKeys ?? true;
895
+ const existingNormalized = normalizeThreadRepository(existingRepo);
896
+ const incomingNormalized = normalizeThreadRepository(incomingRepo);
897
+ const merged =
898
+ incomingNormalized && typeof incomingNormalized === "object"
899
+ ? { ...incomingNormalized }
900
+ : {};
901
+ if (
902
+ preserveExistingTopLevelKeys &&
903
+ existingNormalized &&
904
+ typeof existingNormalized === "object"
905
+ ) {
906
+ for (const [key, value] of Object.entries(existingNormalized)) {
907
+ if (key === "messages" || key === "headId") continue;
908
+ if (key === "queuedMessages" && !preserveExistingQueuedMessages) {
909
+ continue;
910
+ }
911
+ if (!(key in merged)) {
912
+ merged[key] = value;
913
+ }
914
+ }
915
+ } else if (
916
+ preserveExistingQueuedMessages &&
917
+ existingNormalized &&
918
+ typeof existingNormalized === "object" &&
919
+ existingNormalized.queuedMessages !== undefined &&
920
+ merged.queuedMessages === undefined
921
+ ) {
922
+ merged.queuedMessages = existingNormalized.queuedMessages;
923
+ }
924
+
925
+ const existingMessages = Array.isArray(existingNormalized?.messages)
926
+ ? existingNormalized.messages
927
+ : null;
928
+ const incomingMessages = Array.isArray(merged.messages)
929
+ ? merged.messages
930
+ : null;
931
+ if (!existingMessages || !incomingMessages) return merged;
932
+
933
+ const incomingKeySets: Set<string>[] = incomingMessages.map(
934
+ (entry: unknown) => new Set(messageIdentityKeys(getStoredMessage(entry))),
935
+ );
936
+ const usedIncoming = new Set<number>();
937
+ const nextMessages: any[] = [];
938
+ const idRewrites = new Map<string, string>();
939
+
940
+ for (const existingEntry of existingMessages) {
941
+ const existingMessage = getStoredMessage(existingEntry);
942
+ if (
943
+ existingMessage?.role === "assistant" &&
944
+ messageContentIsEmpty(existingMessage.content)
945
+ ) {
946
+ continue;
947
+ }
948
+
949
+ const existingKeys = messageIdentityKeys(existingMessage);
950
+ const incomingIndex = incomingKeySets.findIndex(
951
+ (keys: Set<string>, index: number) =>
952
+ !usedIncoming.has(index) && existingKeys.some((key) => keys.has(key)),
953
+ );
954
+
955
+ if (incomingIndex === -1) {
956
+ nextMessages.push(existingEntry);
957
+ continue;
958
+ }
959
+
960
+ usedIncoming.add(incomingIndex);
961
+ const incomingEntry = incomingMessages[incomingIndex];
962
+ const chosen = chooseMergedMessageEntry(existingEntry, incomingEntry);
963
+ const existingId = messageId(getStoredMessage(existingEntry));
964
+ const chosenId = messageId(getStoredMessage(chosen));
965
+ if (existingId && chosenId && existingId !== chosenId) {
966
+ idRewrites.set(existingId, chosenId);
967
+ }
968
+ nextMessages.push(chosen);
969
+ }
970
+
971
+ for (let index = 0; index < incomingMessages.length; index++) {
972
+ if (usedIncoming.has(index)) continue;
973
+ const incomingMessage = getStoredMessage(incomingMessages[index]);
974
+ if (
975
+ incomingMessage?.role === "assistant" &&
976
+ messageContentIsEmpty(incomingMessage.content)
977
+ ) {
978
+ continue;
979
+ }
980
+ nextMessages.push(incomingMessages[index]);
981
+ }
982
+
983
+ merged.messages = nextMessages.map((entry) =>
984
+ rewriteEntryParentId(entry, idRewrites),
985
+ );
986
+ return normalizeThreadRepository(merged);
987
+ }
988
+
989
+ function escapeAttachmentAttribute(value: string): string {
990
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;");
991
+ }
992
+
993
+ function unwrapTextAttachmentEnvelope(text: string): string {
994
+ const match = text.match(
995
+ /^<attachment\b[^>]*>\n?([\s\S]*?)\n?<\/attachment>$/,
996
+ );
997
+ return match ? match[1] : text;
998
+ }
999
+
1000
+ function truncateStoredAttachment(text: string): string {
1001
+ const unwrapped = unwrapTextAttachmentEnvelope(text);
1002
+ if (unwrapped.length <= MAX_STORED_ATTACHMENT_CHARS) return unwrapped;
1003
+ const omitted = unwrapped.length - MAX_STORED_ATTACHMENT_CHARS;
1004
+ return `${unwrapped.slice(0, MAX_STORED_ATTACHMENT_CHARS)}\n\n[Attachment truncated after ${MAX_STORED_ATTACHMENT_CHARS.toLocaleString()} characters; ${omitted.toLocaleString()} characters omitted from persisted chat history.]`;
1005
+ }
1006
+
1007
+ function textAttachmentEnvelope(
1008
+ att: AgentChatAttachment,
1009
+ text: string,
1010
+ ): string {
1011
+ const attrs = [
1012
+ `name="${escapeAttachmentAttribute(att.name || "attachment")}"`,
1013
+ att.contentType
1014
+ ? `contentType="${escapeAttachmentAttribute(att.contentType)}"`
1015
+ : null,
1016
+ att.type ? `type="${escapeAttachmentAttribute(att.type)}"` : null,
1017
+ ].filter(Boolean);
1018
+ return `<attachment ${attrs.join(" ")}>\n${truncateStoredAttachment(text)}\n</attachment>`;
1019
+ }
1020
+
1021
+ /**
1022
+ * Cap a base64 data-URL string for storage. When the encoded string is over
1023
+ * the limit we replace the base64 payload with a truncation marker so the
1024
+ * transcript still renders the attachment chip but doesn't bloat SQL.
1025
+ */
1026
+ function capBase64DataUrl(dataUrl: string): string {
1027
+ const commaIdx = dataUrl.indexOf(",");
1028
+ if (commaIdx === -1) return dataUrl;
1029
+ const header = dataUrl.slice(0, commaIdx + 1);
1030
+ const b64 = dataUrl.slice(commaIdx + 1);
1031
+ // Each base64 char encodes 6 bits; 4 chars = 3 bytes.
1032
+ const approxBytes = Math.floor((b64.length * 3) / 4);
1033
+ if (approxBytes <= MAX_STORED_BASE64_BYTES) return dataUrl;
1034
+ return `${header}[base64 truncated — ${approxBytes.toLocaleString()} bytes exceeds storage limit]`;
1035
+ }
1036
+
1037
+ function buildStoredAttachments(
1038
+ attachments: AgentChatAttachment[] | undefined,
1039
+ runId: string | undefined,
1040
+ ): any[] {
1041
+ return (attachments ?? [])
1042
+ .map((att, index) => {
1043
+ const id = `server-${runId ?? Date.now()}-attachment-${index}`;
1044
+ // When the attachment was successfully pre-uploaded, store only the URL
1045
+ // reference. This keeps the SQL thread_data row compact regardless of
1046
+ // file size, and lets the transcript render from the hosted URL instead
1047
+ // of re-shipping megabytes of base64 on every poll save.
1048
+ const uploadedUrl = (att as any).url as string | undefined;
1049
+ if (uploadedUrl) {
1050
+ const referenceOnly = (att as any).referenceOnly === true;
1051
+ const storedAsImage = att.type === "image" && !referenceOnly;
1052
+ return {
1053
+ id,
1054
+ type: storedAsImage ? "image" : "file",
1055
+ name: att.name,
1056
+ contentType: att.contentType,
1057
+ status: { type: "complete" },
1058
+ // URL reference shape — content[0] uses the hosted URL.
1059
+ content: storedAsImage
1060
+ ? [{ type: "image", image: uploadedUrl }]
1061
+ : [
1062
+ {
1063
+ type: "file",
1064
+ url: uploadedUrl,
1065
+ mimeType: att.contentType,
1066
+ filename: att.name,
1067
+ },
1068
+ ],
1069
+ // Keep the reference metadata for tooling / read-attachment.
1070
+ metadata: {
1071
+ uploadUrl: uploadedUrl,
1072
+ uploadProvider: (att as any).uploadProvider as string | undefined,
1073
+ ...(referenceOnly
1074
+ ? {
1075
+ referenceOnly: true,
1076
+ securityNote: (att as any).securityNote as string | undefined,
1077
+ }
1078
+ : {}),
1079
+ },
1080
+ };
1081
+ }
1082
+
1083
+ if (att.type === "image" && att.data) {
1084
+ return {
1085
+ id,
1086
+ type: "image",
1087
+ name: att.name,
1088
+ contentType: att.contentType,
1089
+ status: { type: "complete" },
1090
+ content: [{ type: "image", image: capBase64DataUrl(att.data) }],
1091
+ };
1092
+ }
1093
+ if (att.data) {
1094
+ return {
1095
+ id,
1096
+ type: "file",
1097
+ name: att.name,
1098
+ contentType: att.contentType,
1099
+ status: { type: "complete" },
1100
+ content: [
1101
+ {
1102
+ type: "file",
1103
+ data: capBase64DataUrl(att.data),
1104
+ mimeType: att.contentType,
1105
+ filename: att.name,
1106
+ },
1107
+ ],
1108
+ };
1109
+ }
1110
+ if (typeof att.text === "string" && att.text.length > 0) {
1111
+ return {
1112
+ id,
1113
+ type: "file",
1114
+ name: att.name,
1115
+ contentType: att.contentType,
1116
+ status: { type: "complete" },
1117
+ content: [
1118
+ { type: "text", text: textAttachmentEnvelope(att, att.text) },
1119
+ ],
1120
+ };
1121
+ }
1122
+ return null;
1123
+ })
1124
+ .filter(Boolean);
1125
+ }
1126
+
1127
+ export function buildUserMessage(opts: {
1128
+ text: string;
1129
+ attachments?: AgentChatAttachment[];
1130
+ runId?: string;
1131
+ createdAt?: Date;
1132
+ }): {
1133
+ id: string;
1134
+ createdAt: Date;
1135
+ role: "user";
1136
+ content: ContentPart[];
1137
+ attachments?: any[];
1138
+ metadata: Record<string, unknown>;
1139
+ } {
1140
+ const attachments = buildStoredAttachments(opts.attachments, opts.runId);
1141
+ return {
1142
+ id: `server-user-${opts.runId ?? Date.now()}`,
1143
+ createdAt: opts.createdAt ?? new Date(),
1144
+ role: "user",
1145
+ content: [{ type: "text", text: opts.text }],
1146
+ ...(attachments.length > 0 ? { attachments } : {}),
1147
+ metadata: {
1148
+ custom: {
1149
+ submittedRunId: opts.runId,
1150
+ },
1151
+ },
1152
+ };
1153
+ }
1154
+
1155
+ function toCoreCodeAgentTranscriptEvent(
1156
+ event: CodeAgentThreadTranscriptEvent,
1157
+ ): CoreCodeAgentTranscriptEvent {
1158
+ return {
1159
+ schemaVersion: 1,
1160
+ id: event.id,
1161
+ runId: event.runId,
1162
+ kind: (event.kind ??
1163
+ event.type ??
1164
+ "status") as CoreCodeAgentTranscriptEvent["kind"],
1165
+ message: event.message ?? event.text ?? "",
1166
+ createdAt: event.createdAt,
1167
+ metadata: {
1168
+ ...(event.metadata ?? {}),
1169
+ ...(event.artifactPath ? { artifactPath: event.artifactPath } : {}),
1170
+ ...(event.artifactUrl ? { artifactUrl: event.artifactUrl } : {}),
1171
+ },
1172
+ ...(event.signal ? { signal: event.signal } : {}),
1173
+ };
1174
+ }
1175
+
1176
+ function contentPartForCodeAgentTranscriptItem(
1177
+ item: NormalizedCodeAgentTranscriptItem,
1178
+ options: BuildRepositoryFromCodeAgentTranscriptOptions,
1179
+ ): ContentPart | null {
1180
+ if (item.type === "assistant") {
1181
+ return item.text.trim() ? { type: "text", text: item.text } : null;
1182
+ }
1183
+ if (item.type === "tool") {
1184
+ return toolContentPartForCodeAgentTranscriptItem(item);
1185
+ }
1186
+ if (item.type === "thinking") {
1187
+ return thinkingContentPartForCodeAgentTranscriptItem(item);
1188
+ }
1189
+ if (item.type === "status") {
1190
+ const text = statusTextForCodeAgentTranscriptItem(item, options);
1191
+ return text ? { type: "text", text } : null;
1192
+ }
1193
+ return null;
1194
+ }
1195
+
1196
+ function thinkingContentPartForCodeAgentTranscriptItem(
1197
+ item: NormalizedCodeAgentThinkingEvent,
1198
+ ): ContentPart | null {
1199
+ const text = item.text.trim();
1200
+ return text ? { type: "reasoning", text } : null;
1201
+ }
1202
+
1203
+ function toolContentPartForCodeAgentTranscriptItem(
1204
+ item: NormalizedCodeAgentToolEvent,
1205
+ ): ContentPart {
1206
+ return {
1207
+ type: "tool-call",
1208
+ toolCallId: `code-tool-${item.id}`,
1209
+ toolName: item.tool ?? item.label ?? "code-agent",
1210
+ argsText: previewCodeAgentTranscriptValue(item.input) ?? "",
1211
+ args: recordArgsForCodeAgentTool(item.input),
1212
+ ...(item.result !== undefined
1213
+ ? { result: previewCodeAgentTranscriptValue(item.result) ?? "" }
1214
+ : {}),
1215
+ ...(item.structuredMeta ? { structuredMeta: item.structuredMeta } : {}),
1216
+ ...(item.pendingApprovalKey
1217
+ ? { approval: { approvalKey: item.pendingApprovalKey } }
1218
+ : {}),
1219
+ };
1220
+ }
1221
+
1222
+ function statusTextForCodeAgentTranscriptItem(
1223
+ item: NormalizedCodeAgentStatusEvent,
1224
+ options: BuildRepositoryFromCodeAgentTranscriptOptions,
1225
+ ): string | null {
1226
+ if (options.hideCredentialMessages && isCredentialGapCodeAgentEvent(item)) {
1227
+ return null;
1228
+ }
1229
+ if (item.statusKind === "artifact") {
1230
+ const event = item.events[0];
1231
+ const path =
1232
+ stringRecordValue(event?.metadata, "artifactPath") ??
1233
+ stringRecordValue(event?.metadata, "path");
1234
+ const url = stringRecordValue(event?.metadata, "artifactUrl");
1235
+ const target = url ?? path;
1236
+ return target
1237
+ ? `Artifact: ${item.text}\n${target}`
1238
+ : `Artifact: ${item.text}`;
1239
+ }
1240
+ if (item.level === "info" && item.statusKind !== "note") return null;
1241
+ return item.text;
1242
+ }
1243
+
1244
+ function codeAgentAttachmentsFromEvents(
1245
+ events: readonly CoreCodeAgentTranscriptEvent[],
1246
+ ): AgentChatAttachment[] {
1247
+ for (const event of events) {
1248
+ const raw = event.metadata?.attachments;
1249
+ if (!Array.isArray(raw) || raw.length === 0) continue;
1250
+ const attachments: AgentChatAttachment[] = [];
1251
+ for (const item of raw) {
1252
+ if (!item || typeof item !== "object") continue;
1253
+ const record = item as Record<string, unknown>;
1254
+ const name = stringRecordValue(record, "name");
1255
+ if (!name) continue;
1256
+ const contentType = stringRecordValue(record, "type");
1257
+ const text = stringRecordValue(record, "text");
1258
+ const dataUrl = stringRecordValue(record, "dataUrl");
1259
+ attachments.push({
1260
+ type: dataUrl ? "image" : "file",
1261
+ name,
1262
+ ...(contentType ? { contentType } : {}),
1263
+ ...(text ? { text } : {}),
1264
+ ...(dataUrl ? { data: dataUrl } : {}),
1265
+ });
1266
+ }
1267
+ if (attachments.length > 0) return attachments;
1268
+ }
1269
+ return [];
1270
+ }
1271
+
1272
+ function recordArgsForCodeAgentTool(value: unknown): Record<string, string> {
1273
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
1274
+ const result: Record<string, string> = {};
1275
+ for (const [key, entry] of Object.entries(value)) {
1276
+ result[key] =
1277
+ typeof entry === "string"
1278
+ ? entry
1279
+ : (previewCodeAgentTranscriptValue(entry) ?? "");
1280
+ }
1281
+ return result;
1282
+ }
1283
+
1284
+ function previewCodeAgentTranscriptValue(value: unknown): string | undefined {
1285
+ if (value === undefined || value === null) return undefined;
1286
+ const text =
1287
+ typeof value === "string" ? value : (JSON.stringify(value, null, 2) ?? "");
1288
+ const trimmed = text.trim();
1289
+ if (!trimmed) return undefined;
1290
+ return trimmed.length > 4000 ? `${trimmed.slice(0, 4000)}\n...` : trimmed;
1291
+ }
1292
+
1293
+ function stringRecordValue(
1294
+ record: Record<string, unknown> | undefined,
1295
+ key: string,
1296
+ ): string | undefined {
1297
+ const value = record?.[key];
1298
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
1299
+ }
1300
+
1301
+ export function upsertUserMessage(repo: any, userMsg: UserMessage): any {
1302
+ const nextRepo = normalizeThreadRepository(repo);
1303
+
1304
+ const lastIndex = nextRepo.messages.length - 1;
1305
+ const lastEntry = lastIndex >= 0 ? nextRepo.messages[lastIndex] : undefined;
1306
+ const lastMsg = getStoredMessage(lastEntry);
1307
+ if (lastMsg?.role === "user" && messagesMatch(lastMsg, userMsg)) {
1308
+ return nextRepo;
1309
+ }
1310
+
1311
+ const parentId =
1312
+ lastIndex >= 0 ? (messageId(getStoredMessage(lastEntry)) ?? null) : null;
1313
+ nextRepo.messages.push({ message: userMsg, parentId });
1314
+ nextRepo.headId = userMsg.id;
1315
+ return nextRepo;
1316
+ }
1317
+
1318
+ function shouldReplaceLastAssistant(
1319
+ lastMessage: any,
1320
+ assistantMsg: AssistantMessage,
1321
+ ): boolean {
1322
+ const lastContent = lastMessage?.content;
1323
+ if (messageContentIsEmpty(lastContent)) return true;
1324
+
1325
+ const lastRunId = getMessageRunId(lastMessage);
1326
+ const nextRunId = getMessageRunId(assistantMsg);
1327
+ if (lastRunId && nextRunId && lastRunId === nextRunId) return true;
1328
+ if (lastRunId && nextRunId && lastRunId !== nextRunId) return false;
1329
+
1330
+ const lastStatus = lastMessage?.status;
1331
+ if (lastStatus && !isTerminalAssistantStatus(lastStatus)) return true;
1332
+
1333
+ try {
1334
+ if (JSON.stringify(lastContent) === JSON.stringify(assistantMsg.content)) {
1335
+ return true;
1336
+ }
1337
+ } catch {
1338
+ // Fall through to the text-prefix check.
1339
+ }
1340
+
1341
+ const lastText = messageText(lastContent).trim();
1342
+ const nextText = messageText(assistantMsg.content).trim();
1343
+ if (isTerminalAssistantStatus(lastStatus)) return false;
1344
+ return Boolean(lastText && nextText && nextText.startsWith(lastText));
1345
+ }
1346
+
1347
+ /**
1348
+ * Merge the server-reconstructed assistant message into persisted
1349
+ * assistant-ui thread data.
1350
+ *
1351
+ * The browser periodically saves thread data while a run is still streaming.
1352
+ * That can leave the last assistant message non-empty but partial/pending.
1353
+ * Completion must replace that same-run partial message instead of treating
1354
+ * any assistant content as proof that the frontend already saved the final
1355
+ * turn.
1356
+ */
1357
+ export function upsertAssistantMessage(
1358
+ repo: any,
1359
+ assistantMsg: AssistantMessage,
1360
+ ): any {
1361
+ const nextRepo = normalizeThreadRepository(repo);
1362
+
1363
+ const lastIndex = nextRepo.messages.length - 1;
1364
+ const lastEntry = lastIndex >= 0 ? nextRepo.messages[lastIndex] : undefined;
1365
+ const lastMsg = getStoredMessage(lastEntry);
1366
+ const lastRole = lastMsg?.role;
1367
+
1368
+ if (
1369
+ lastRole === "assistant" &&
1370
+ shouldReplaceLastAssistant(lastMsg, assistantMsg)
1371
+ ) {
1372
+ nextRepo.messages[lastIndex] = { ...lastEntry, message: assistantMsg };
1373
+ nextRepo.headId = assistantMsg.id;
1374
+ return nextRepo;
1375
+ }
1376
+
1377
+ const parentId =
1378
+ nextRepo.messages.length > 0
1379
+ ? (messageId(
1380
+ getStoredMessage(nextRepo.messages[nextRepo.messages.length - 1]),
1381
+ ) ?? null)
1382
+ : null;
1383
+ nextRepo.messages.push({ message: assistantMsg, parentId });
1384
+ nextRepo.headId = assistantMsg.id;
1385
+ return nextRepo;
1386
+ }
1387
+
1388
+ function turnIdOf(message: any): string | undefined {
1389
+ const t = message?.metadata?.custom?.turnId;
1390
+ return typeof t === "string" && t ? t : undefined;
1391
+ }
1392
+
1393
+ function foldedRunIdsOf(message: any): string[] {
1394
+ const ids = message?.metadata?.custom?.foldedRunIds;
1395
+ return Array.isArray(ids)
1396
+ ? ids.filter((x: unknown): x is string => typeof x === "string")
1397
+ : [];
1398
+ }
1399
+
1400
+ /** Rough size of an assistant message's content, used only to pick the larger
1401
+ * of two representations of the same chunk so a fold can never shrink. */
1402
+ function assistantContentWeight(content: unknown): number {
1403
+ if (!Array.isArray(content)) return 0;
1404
+ let weight = 0;
1405
+ for (const part of content) {
1406
+ if (part?.type === "text" && typeof part.text === "string") {
1407
+ weight += part.text.length;
1408
+ } else {
1409
+ weight += 1;
1410
+ }
1411
+ }
1412
+ return weight;
1413
+ }
1414
+
1415
+ /** Concatenate continuation content onto the accumulated turn, merging a
1416
+ * trailing+leading text run so the resumed answer reads as one flowing
1417
+ * message rather than two stacked fragments. */
1418
+ function appendFoldedContent(existing: any[], incoming: any[]): any[] {
1419
+ const merged = existing.map((p) => ({ ...p }));
1420
+ for (const part of incoming) {
1421
+ const last = merged[merged.length - 1];
1422
+ if (
1423
+ part?.type === "text" &&
1424
+ typeof part.text === "string" &&
1425
+ last?.type === "text" &&
1426
+ typeof last.text === "string"
1427
+ ) {
1428
+ last.text = `${last.text}${part.text}`;
1429
+ } else {
1430
+ merged.push({ ...part });
1431
+ }
1432
+ }
1433
+ return normalizeAssistantToolCallIds({
1434
+ role: "assistant",
1435
+ content: merged,
1436
+ }).content;
1437
+ }
1438
+
1439
+ /**
1440
+ * Fold a continuation run's assistant message onto the single durable message
1441
+ * for its logical turn (identified by `turnId`), so a turn that spans several
1442
+ * continuation runs accumulates into ONE message that only ever grows. This is
1443
+ * the server-side analog of an append-only rollout: the durable transcript is
1444
+ * a monotonic fold over every run in the turn, never a per-run snapshot that
1445
+ * drops the earlier chunks.
1446
+ *
1447
+ * Idempotent and never-shrinking, so it is safe to run alongside the client's
1448
+ * full-thread export (which may write the same turn from the other side):
1449
+ * - First chunk of a turn → appended as a fresh message.
1450
+ * - A run whose content is already represented (already folded, or the client
1451
+ * saved it) → kept as-is, choosing whichever copy has more content.
1452
+ * - A new chunk → appended onto the accumulated turn.
1453
+ * Falls back to per-run upsert when no `turnId` is available (turn == run).
1454
+ */
1455
+ export function foldAssistantTurn(
1456
+ repo: any,
1457
+ assistantMsg: AssistantMessage,
1458
+ options: { turnId?: string; runId?: string },
1459
+ ): any {
1460
+ const turnId = options.turnId;
1461
+ const runId = options.runId;
1462
+ if (!turnId) return upsertAssistantMessage(repo, assistantMsg);
1463
+
1464
+ const nextRepo = normalizeThreadRepository(repo);
1465
+ const lastIndex = nextRepo.messages.length - 1;
1466
+ const lastEntry = lastIndex >= 0 ? nextRepo.messages[lastIndex] : undefined;
1467
+ const lastMsg = getStoredMessage(lastEntry);
1468
+
1469
+ const sameTurn =
1470
+ lastMsg?.role === "assistant" &&
1471
+ (turnIdOf(lastMsg) === turnId ||
1472
+ // A message the client wrote for one of this turn's runs before it
1473
+ // carried a turnId stamp.
1474
+ (!!runId && getMessageRunId(lastMsg) === runId));
1475
+
1476
+ if (!sameTurn) {
1477
+ // First chunk of this turn (or the previous assistant belongs to an
1478
+ // earlier turn) — append as a fresh message; buildAssistantMessage already
1479
+ // stamped turnId + foldedRunIds onto it.
1480
+ return upsertAssistantMessage(repo, assistantMsg);
1481
+ }
1482
+
1483
+ const existingContent = Array.isArray(lastMsg.content) ? lastMsg.content : [];
1484
+ const incomingContent = Array.isArray(assistantMsg.content)
1485
+ ? assistantMsg.content
1486
+ : [];
1487
+ const existingFolded = foldedRunIdsOf(lastMsg);
1488
+ const runAlreadyFolded =
1489
+ !!runId &&
1490
+ (existingFolded.includes(runId) || getMessageRunId(lastMsg) === runId);
1491
+
1492
+ // If this run's chunk is already represented in the turn (the client saved
1493
+ // it, or we already folded it), do not re-append — keep the larger copy so
1494
+ // the turn never shrinks. Otherwise fold this chunk onto the accumulated turn.
1495
+ const mergedContent = runAlreadyFolded
1496
+ ? assistantContentWeight(incomingContent) >
1497
+ assistantContentWeight(existingContent)
1498
+ ? incomingContent
1499
+ : existingContent
1500
+ : appendFoldedContent(existingContent, incomingContent);
1501
+
1502
+ const mergedFolded = Array.from(
1503
+ new Set([...existingFolded, ...(runId ? [runId] : [])]),
1504
+ );
1505
+
1506
+ const existingCustom =
1507
+ lastMsg.metadata?.custom && typeof lastMsg.metadata.custom === "object"
1508
+ ? (lastMsg.metadata.custom as Record<string, unknown>)
1509
+ : {};
1510
+ const incomingCustom =
1511
+ assistantMsg.metadata?.custom &&
1512
+ typeof assistantMsg.metadata.custom === "object"
1513
+ ? (assistantMsg.metadata.custom as Record<string, unknown>)
1514
+ : {};
1515
+
1516
+ const mergedCustom: Record<string, unknown> = {
1517
+ ...existingCustom,
1518
+ ...incomingCustom,
1519
+ turnId,
1520
+ foldedRunIds: mergedFolded,
1521
+ };
1522
+ // Only the freshest chunk decides whether the turn is still continuing.
1523
+ if (incomingCustom.continued !== true) delete mergedCustom.continued;
1524
+
1525
+ const mergedMessage = {
1526
+ ...lastMsg,
1527
+ content: normalizeAssistantToolCallIds({
1528
+ role: "assistant",
1529
+ content: mergedContent,
1530
+ }).content,
1531
+ // The freshest chunk's status wins: a clean done supersedes a prior
1532
+ // partial; a real error supersedes a partial.
1533
+ status: assistantMsg.status ?? lastMsg.status,
1534
+ metadata: {
1535
+ ...lastMsg.metadata,
1536
+ runId: runId ?? lastMsg.metadata?.runId,
1537
+ custom: mergedCustom,
1538
+ },
1539
+ };
1540
+
1541
+ nextRepo.messages[lastIndex] = { ...lastEntry, message: mergedMessage };
1542
+ nextRepo.headId = mergedMessage.id ?? nextRepo.headId;
1543
+ return nextRepo;
1544
+ }
1545
+
1546
+ export function normalizeThreadTitle(value: unknown): string {
1547
+ if (typeof value !== "string") return "";
1548
+ return value.replace(/\s+/g, " ").trim().slice(0, 160);
1549
+ }
1550
+
1551
+ /**
1552
+ * Extract title and preview from a thread runtime export.
1553
+ * Isomorphic — works on both server and client.
1554
+ */
1555
+ export function extractThreadMeta(repo: any): {
1556
+ title: string;
1557
+ preview: string;
1558
+ } {
1559
+ const titleOverride = normalizeThreadTitle(repo?._titleOverride);
1560
+ const msgs = repo?.messages;
1561
+ if (!Array.isArray(msgs) || msgs.length === 0)
1562
+ return { title: titleOverride, preview: "" };
1563
+
1564
+ let title = "";
1565
+ let preview = "";
1566
+ for (const entry of msgs) {
1567
+ // Support both wrapped ({ message: { role, content } }) and flat ({ role, content }) formats
1568
+ const msg = entry?.message ?? entry;
1569
+ if (msg.role !== "user") continue;
1570
+ const textParts = Array.isArray(msg.content)
1571
+ ? msg.content
1572
+ .filter((p: any) => p.type === "text")
1573
+ .map((p: any) => p.text)
1574
+ .join(" ")
1575
+ : typeof msg.content === "string"
1576
+ ? msg.content
1577
+ : "";
1578
+ if (textParts.trim()) {
1579
+ if (!title) title = textParts.trim().slice(0, 80);
1580
+ preview = textParts.trim().slice(0, 120);
1581
+ }
1582
+ }
1583
+ return { title: titleOverride || title, preview };
1584
+ }