@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,1347 @@
1
+ import { randomUUID } from "node:crypto";
2
+
3
+ import { and, eq, gte, isNull } from "drizzle-orm";
4
+
5
+ import { appStatePut } from "../application-state/store.js";
6
+ import { getDbExec, isPostgres, retryOnDdlRace } from "../db/client.js";
7
+ import { createGetDb } from "../db/create-get-db.js";
8
+ import {
9
+ ensureTableExists,
10
+ ensureColumnExists,
11
+ ensureIndexExists,
12
+ } from "../db/ddl-guard.js";
13
+ import { recordChange } from "../server/poll.js";
14
+ import {
15
+ getRequestUserEmail,
16
+ getRequestOrgId,
17
+ } from "../server/request-context.js";
18
+ import {
19
+ accessFilter,
20
+ assertAccess,
21
+ resolveAccess,
22
+ ForbiddenError,
23
+ } from "../sharing/access.js";
24
+ import { registerShareableResource } from "../sharing/registry.js";
25
+ import {
26
+ EXTENSION_CHANGE_MARKER_KEY,
27
+ extensionChangeMarkerSession,
28
+ extensionChangeMarkerValue,
29
+ type ExtensionChangeTarget,
30
+ } from "./change-marker.js";
31
+ import {
32
+ applyExtensionContentUpdate,
33
+ ExtensionContentEditError,
34
+ type ExtensionContentEdit,
35
+ type ExtensionLegacyPatch,
36
+ } from "./content-patch.js";
37
+ import {
38
+ extensions,
39
+ extensionHides,
40
+ extensionShares,
41
+ extensionHistory,
42
+ EXTENSIONS_CREATE_SQL,
43
+ EXTENSIONS_CREATE_SQL_PG,
44
+ EXTENSION_SHARES_CREATE_SQL,
45
+ EXTENSION_SHARES_CREATE_SQL_PG,
46
+ EXTENSION_DATA_CREATE_SQL,
47
+ EXTENSION_DATA_CREATE_SQL_PG,
48
+ EXTENSION_DATA_ITEM_INDEX_SQL,
49
+ EXTENSION_DATA_ITEM_INDEX_SQL_PG,
50
+ EXTENSION_DATA_DROP_OLD_INDEX_SQL,
51
+ EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG,
52
+ EXTENSIONS_OWNER_INDEX_SQL,
53
+ EXTENSIONS_ORG_INDEX_SQL,
54
+ EXTENSIONS_UPDATED_INDEX_SQL,
55
+ EXTENSIONS_HIDDEN_AT_COLUMN_SQL,
56
+ EXTENSIONS_HIDDEN_BY_COLUMN_SQL,
57
+ EXTENSIONS_HIDDEN_AT_INDEX_SQL,
58
+ EXTENSION_SHARES_RESOURCE_INDEX_SQL,
59
+ EXTENSION_HIDES_CREATE_SQL,
60
+ EXTENSION_HIDES_CREATE_SQL_PG,
61
+ EXTENSION_HIDES_UNIQUE_INDEX_SQL,
62
+ EXTENSION_HIDES_OWNER_INDEX_SQL,
63
+ EXTENSION_HISTORY_CREATE_SQL,
64
+ EXTENSION_HISTORY_CREATE_SQL_PG,
65
+ EXTENSION_HISTORY_VERSION_INDEX_SQL,
66
+ EXTENSION_HISTORY_CREATED_INDEX_SQL,
67
+ EXTENSION_CONSENTS_CREATE_SQL,
68
+ EXTENSION_CONSENTS_CREATE_SQL_PG,
69
+ EXTENSION_CONSENTS_VIEWER_INDEX_SQL,
70
+ } from "./schema.js";
71
+
72
+ const getDb = createGetDb({
73
+ extensions,
74
+ extensionShares,
75
+ extensionHides,
76
+ extensionHistory,
77
+ });
78
+
79
+ let _initPromise: Promise<void> | undefined;
80
+
81
+ export async function ensureExtensionsTables(): Promise<void> {
82
+ if (!_initPromise) {
83
+ _initPromise = (async () => {
84
+ const client = getDbExec();
85
+ const pg = isPostgres();
86
+ if (pg) {
87
+ // PG guard: probe via information_schema, only issue DDL if missing, bounded lock_timeout
88
+ await ensureTableExists("tools", EXTENSIONS_CREATE_SQL_PG);
89
+ await migrateMisnamedExtensionsTable(client, pg); // data migration, not DDL — unchanged
90
+ await ensureTableExists("tool_shares", EXTENSION_SHARES_CREATE_SQL_PG);
91
+ await ensureTableExists("tool_data", EXTENSION_DATA_CREATE_SQL_PG);
92
+ await ensureExtensionDataItemId(client, pg); // ADD COLUMN — guarded inside
93
+ await ensureExtensionDataScope(client, pg); // ADD COLUMN — guarded inside
94
+ // DROP INDEX (for old index) — safe DDL, runs via client.execute; keep on both paths
95
+ await client.execute(EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG);
96
+ await ensureIndexExists(
97
+ "tool_data_scoped_item_idx",
98
+ EXTENSION_DATA_ITEM_INDEX_SQL_PG,
99
+ );
100
+ await ensureIndexExists("tools_owner_idx", EXTENSIONS_OWNER_INDEX_SQL);
101
+ await ensureIndexExists("tools_org_idx", EXTENSIONS_ORG_INDEX_SQL);
102
+ await ensureIndexExists(
103
+ "tools_updated_at_idx",
104
+ EXTENSIONS_UPDATED_INDEX_SQL,
105
+ );
106
+ await ensureExtensionsGlobalHideColumns(client, pg); // ADD COLUMN — guarded inside
107
+ await ensureIndexExists(
108
+ "tools_hidden_at_idx",
109
+ EXTENSIONS_HIDDEN_AT_INDEX_SQL,
110
+ );
111
+ await ensureIndexExists(
112
+ "tool_shares_resource_idx",
113
+ EXTENSION_SHARES_RESOURCE_INDEX_SQL,
114
+ );
115
+ await ensureTableExists(
116
+ "tool_hidden_extensions",
117
+ EXTENSION_HIDES_CREATE_SQL_PG,
118
+ );
119
+ await ensureIndexExists(
120
+ "tool_hidden_extensions_user_tool_idx",
121
+ EXTENSION_HIDES_UNIQUE_INDEX_SQL,
122
+ );
123
+ await ensureIndexExists(
124
+ "tool_hidden_extensions_owner_idx",
125
+ EXTENSION_HIDES_OWNER_INDEX_SQL,
126
+ );
127
+ await ensureTableExists(
128
+ "tool_history",
129
+ EXTENSION_HISTORY_CREATE_SQL_PG,
130
+ );
131
+ await ensureIndexExists(
132
+ "tool_history_tool_version_idx",
133
+ EXTENSION_HISTORY_VERSION_INDEX_SQL,
134
+ );
135
+ await ensureIndexExists(
136
+ "tool_history_tool_created_idx",
137
+ EXTENSION_HISTORY_CREATED_INDEX_SQL,
138
+ );
139
+ await ensureTableExists(
140
+ "tool_consents",
141
+ EXTENSION_CONSENTS_CREATE_SQL_PG,
142
+ );
143
+ await ensureIndexExists(
144
+ "tool_consents_viewer_idx",
145
+ EXTENSION_CONSENTS_VIEWER_INDEX_SQL,
146
+ );
147
+ return;
148
+ }
149
+ // SQLite (local dev): keep existing behavior
150
+ await retryOnDdlRace(() =>
151
+ client.execute(pg ? EXTENSIONS_CREATE_SQL_PG : EXTENSIONS_CREATE_SQL),
152
+ );
153
+ await migrateMisnamedExtensionsTable(client, pg);
154
+ await retryOnDdlRace(() =>
155
+ client.execute(
156
+ pg ? EXTENSION_SHARES_CREATE_SQL_PG : EXTENSION_SHARES_CREATE_SQL,
157
+ ),
158
+ );
159
+ await retryOnDdlRace(() =>
160
+ client.execute(
161
+ pg ? EXTENSION_DATA_CREATE_SQL_PG : EXTENSION_DATA_CREATE_SQL,
162
+ ),
163
+ );
164
+ await ensureExtensionDataItemId(client, pg);
165
+ await ensureExtensionDataScope(client, pg);
166
+ await client.execute(
167
+ pg
168
+ ? EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG
169
+ : EXTENSION_DATA_DROP_OLD_INDEX_SQL,
170
+ );
171
+ await retryOnDdlRace(() =>
172
+ client.execute(
173
+ pg ? EXTENSION_DATA_ITEM_INDEX_SQL_PG : EXTENSION_DATA_ITEM_INDEX_SQL,
174
+ ),
175
+ );
176
+ await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));
177
+ await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));
178
+ await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));
179
+ await ensureExtensionsGlobalHideColumns(client, pg);
180
+ await retryOnDdlRace(() =>
181
+ client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL),
182
+ );
183
+ await retryOnDdlRace(() =>
184
+ client.execute(EXTENSION_SHARES_RESOURCE_INDEX_SQL),
185
+ );
186
+ await retryOnDdlRace(() =>
187
+ client.execute(
188
+ pg ? EXTENSION_HIDES_CREATE_SQL_PG : EXTENSION_HIDES_CREATE_SQL,
189
+ ),
190
+ );
191
+ await retryOnDdlRace(() =>
192
+ client.execute(EXTENSION_HIDES_UNIQUE_INDEX_SQL),
193
+ );
194
+ await retryOnDdlRace(() =>
195
+ client.execute(EXTENSION_HIDES_OWNER_INDEX_SQL),
196
+ );
197
+ await retryOnDdlRace(() =>
198
+ client.execute(
199
+ pg ? EXTENSION_HISTORY_CREATE_SQL_PG : EXTENSION_HISTORY_CREATE_SQL,
200
+ ),
201
+ );
202
+ await retryOnDdlRace(() =>
203
+ client.execute(EXTENSION_HISTORY_VERSION_INDEX_SQL),
204
+ );
205
+ await retryOnDdlRace(() =>
206
+ client.execute(EXTENSION_HISTORY_CREATED_INDEX_SQL),
207
+ );
208
+ // tool_consents was introduced for an audit-C1 per-viewer consent
209
+ // gate that we removed once we settled on intra-org trust as the
210
+ // baseline. The table is kept (additive — never drop) so deploys
211
+ // that already created it stay healthy; the runtime consent code
212
+ // is gone. Idempotent CREATE IF NOT EXISTS for fresh schemas.
213
+ await retryOnDdlRace(() =>
214
+ client.execute(
215
+ pg ? EXTENSION_CONSENTS_CREATE_SQL_PG : EXTENSION_CONSENTS_CREATE_SQL,
216
+ ),
217
+ );
218
+ await retryOnDdlRace(() =>
219
+ client.execute(EXTENSION_CONSENTS_VIEWER_INDEX_SQL),
220
+ );
221
+ })();
222
+ }
223
+
224
+ try {
225
+ await _initPromise;
226
+ } catch (err) {
227
+ _initPromise = undefined;
228
+ throw err;
229
+ }
230
+ }
231
+
232
+ async function migrateMisnamedExtensionsTable(
233
+ client: ReturnType<typeof getDbExec>,
234
+ pg: boolean,
235
+ ): Promise<void> {
236
+ const sql = pg
237
+ ? `INSERT INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)
238
+ SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility
239
+ FROM extensions
240
+ ON CONFLICT (id) DO NOTHING`
241
+ : `INSERT OR IGNORE INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)
242
+ SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility
243
+ FROM extensions`;
244
+
245
+ try {
246
+ await client.execute(sql);
247
+ } catch (err: any) {
248
+ const message = String(err?.message ?? err).toLowerCase();
249
+ if (
250
+ message.includes("no such table: extensions") ||
251
+ message.includes('relation "extensions" does not exist') ||
252
+ message.includes("relation extensions does not exist")
253
+ ) {
254
+ return;
255
+ }
256
+ throw err;
257
+ }
258
+ }
259
+
260
+ async function ensureExtensionDataItemId(
261
+ client: ReturnType<typeof getDbExec>,
262
+ pg: boolean,
263
+ ): Promise<void> {
264
+ if (pg) {
265
+ await ensureColumnExists(
266
+ "tool_data",
267
+ "item_id",
268
+ `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS item_id TEXT`,
269
+ );
270
+ return;
271
+ }
272
+
273
+ // Keep this additive: legacy rows with item_id=id are still read correctly
274
+ // through COALESCE(item_id, id), so SQLite never needs a table rebuild here.
275
+ try {
276
+ await client.execute(`ALTER TABLE tool_data ADD COLUMN item_id TEXT`);
277
+ } catch (err: any) {
278
+ if (
279
+ !String(err?.message ?? err)
280
+ .toLowerCase()
281
+ .includes("duplicate")
282
+ ) {
283
+ throw err;
284
+ }
285
+ }
286
+ }
287
+
288
+ async function ensureExtensionDataScope(
289
+ client: ReturnType<typeof getDbExec>,
290
+ pg: boolean,
291
+ ): Promise<void> {
292
+ const addCol = (name: string, def: string) => {
293
+ if (pg) {
294
+ return ensureColumnExists(
295
+ "tool_data",
296
+ name,
297
+ `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS ${name} ${def}`,
298
+ );
299
+ }
300
+ return client
301
+ .execute(`ALTER TABLE tool_data ADD COLUMN ${name} ${def}`)
302
+ .catch((err: any) => {
303
+ if (
304
+ !String(err?.message ?? err)
305
+ .toLowerCase()
306
+ .includes("duplicate")
307
+ )
308
+ throw err;
309
+ });
310
+ };
311
+ await addCol("scope", "TEXT NOT NULL DEFAULT 'user'");
312
+ await addCol("org_id", "TEXT");
313
+ await addCol("scope_key", "TEXT NOT NULL DEFAULT 'local@localhost'");
314
+ // One-time backfill migration: replaces the dev-mode DEFAULT scope_key
315
+ // with each row's real owner_email. Not a per-request fallback.
316
+ await client.execute(
317
+ // guard:allow-localhost-fallback — one-time backfill migration replacing dev-mode default scope_key with the row's real owner_email
318
+ `UPDATE tool_data SET scope_key = owner_email WHERE scope_key = 'local@localhost' AND owner_email != 'local@localhost'`,
319
+ );
320
+ }
321
+
322
+ async function ensureExtensionsGlobalHideColumns(
323
+ client: ReturnType<typeof getDbExec>,
324
+ pg: boolean,
325
+ ): Promise<void> {
326
+ // Global (admin) hide columns on the `tools` row, distinct from the
327
+ // per-user `tool_hidden_extensions` table. Additive — keep this idempotent
328
+ // for both dialects. Postgres supports `ADD COLUMN IF NOT EXISTS`; SQLite
329
+ // does not, so we drop the clause and swallow the duplicate-column error.
330
+ const addCol = (pgSql: string, name: string, def: string) => {
331
+ if (pg) {
332
+ return ensureColumnExists("tools", name, pgSql);
333
+ }
334
+ return client
335
+ .execute(`ALTER TABLE tools ADD COLUMN ${name} ${def}`)
336
+ .catch((err: any) => {
337
+ if (
338
+ !String(err?.message ?? err)
339
+ .toLowerCase()
340
+ .includes("duplicate")
341
+ )
342
+ throw err;
343
+ });
344
+ };
345
+ await addCol(EXTENSIONS_HIDDEN_AT_COLUMN_SQL, "hidden_at", "TEXT");
346
+ await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, "hidden_by", "TEXT");
347
+ }
348
+
349
+ export function registerExtensionsShareable() {
350
+ registerShareableResource({
351
+ type: "extension",
352
+ resourceTable: extensions,
353
+ sharesTable: extensionShares,
354
+ displayName: "Extension",
355
+ titleColumn: "name",
356
+ getDb: () => getDb(),
357
+ // Extension HTML executes inside an iframe and calls actions / SQL / the
358
+ // secrets-injecting proxy as the *viewer*. A public extension would let a
359
+ // random authenticated user run code with the viewer's credentials — and
360
+ // a malicious shared extension could re-share itself wider. Lock both:
361
+ // no public visibility, and individual user shares must already be (or
362
+ // be invited to) the org.
363
+ allowPublic: false,
364
+ requireOrgMemberForUserShares: true,
365
+ });
366
+ }
367
+
368
+ export interface ExtensionRow {
369
+ id: string;
370
+ name: string;
371
+ description: string;
372
+ content: string;
373
+ icon: string | null;
374
+ createdAt: string;
375
+ updatedAt: string;
376
+ hiddenAt: string | null;
377
+ hiddenBy: string | null;
378
+ ownerEmail: string;
379
+ orgId: string | null;
380
+ visibility: "private" | "org" | "public";
381
+ }
382
+
383
+ export type ExtensionHistoryOperation =
384
+ | "create"
385
+ | "baseline"
386
+ | "metadata-update"
387
+ | "content-update"
388
+ | "restore";
389
+
390
+ export interface ExtensionHistoryEntry {
391
+ id: string;
392
+ extensionId: string;
393
+ version: number;
394
+ operation: ExtensionHistoryOperation | string;
395
+ summary: string;
396
+ name: string;
397
+ description: string;
398
+ content?: string;
399
+ icon: string | null;
400
+ actorEmail: string | null;
401
+ ownerEmail: string;
402
+ orgId: string | null;
403
+ visibility: "private" | "org" | "public";
404
+ createdAt: string;
405
+ persisted: boolean;
406
+ contentLength: number;
407
+ }
408
+
409
+ export interface ExtensionHistoryDiffLine {
410
+ type: "equal" | "insert" | "delete";
411
+ text: string;
412
+ }
413
+
414
+ export interface ExtensionHistoryDetail {
415
+ entry: ExtensionHistoryEntry;
416
+ previous: ExtensionHistoryEntry | null;
417
+ diff: ExtensionHistoryDiffLine[];
418
+ stats: {
419
+ addedLines: number;
420
+ deletedLines: number;
421
+ changed: boolean;
422
+ };
423
+ }
424
+
425
+ interface RawExtensionHistoryRow {
426
+ id: string;
427
+ tool_id?: string;
428
+ extensionId?: string;
429
+ version: number | string;
430
+ operation: string;
431
+ summary?: string | null;
432
+ name: string;
433
+ description?: string | null;
434
+ content?: string | null;
435
+ icon?: string | null;
436
+ actor_email?: string | null;
437
+ actorEmail?: string | null;
438
+ owner_email?: string | null;
439
+ ownerEmail?: string | null;
440
+ org_id?: string | null;
441
+ orgId?: string | null;
442
+ visibility?: string | null;
443
+ created_at?: string;
444
+ createdAt?: string;
445
+ }
446
+
447
+ function targetKey(target: ExtensionChangeTarget): string | null {
448
+ if (target.owner) return `owner:${target.owner}`;
449
+ if (target.orgId) return `org:${target.orgId}`;
450
+ return null;
451
+ }
452
+
453
+ function addExtensionChangeTarget(
454
+ targets: Map<string, ExtensionChangeTarget>,
455
+ target: ExtensionChangeTarget,
456
+ ): void {
457
+ const key = targetKey(target);
458
+ if (key) targets.set(key, target);
459
+ }
460
+
461
+ async function extensionChangeTargetsForRow(
462
+ row: ExtensionRow,
463
+ ): Promise<ExtensionChangeTarget[]> {
464
+ const targets = new Map<string, ExtensionChangeTarget>();
465
+ addExtensionChangeTarget(targets, { owner: row.ownerEmail });
466
+ if (row.visibility === "org" && row.orgId) {
467
+ addExtensionChangeTarget(targets, { orgId: row.orgId });
468
+ }
469
+
470
+ const db = getDb();
471
+ const shares = (await db
472
+ .select({
473
+ principalType: extensionShares.principalType,
474
+ principalId: extensionShares.principalId,
475
+ })
476
+ .from(extensionShares)
477
+ .where(eq(extensionShares.resourceId, row.id))) as Array<{
478
+ principalType: "user" | "org";
479
+ principalId: string;
480
+ }>;
481
+
482
+ for (const share of shares) {
483
+ if (share.principalType === "user") {
484
+ addExtensionChangeTarget(targets, { owner: share.principalId });
485
+ } else if (share.principalType === "org") {
486
+ addExtensionChangeTarget(targets, { orgId: share.principalId });
487
+ }
488
+ }
489
+
490
+ return Array.from(targets.values());
491
+ }
492
+
493
+ async function extensionChangeTargetsForId(
494
+ id: string,
495
+ ): Promise<ExtensionChangeTarget[]> {
496
+ const db = getDb();
497
+ const rows = await db.select().from(extensions).where(eq(extensions.id, id));
498
+ const row = rows[0] as ExtensionRow | undefined;
499
+ return row ? extensionChangeTargetsForRow(row) : [];
500
+ }
501
+
502
+ export async function getExtensionChangeTargets(
503
+ id: string,
504
+ ): Promise<ExtensionChangeTarget[]> {
505
+ await ensureExtensionsTables();
506
+ return extensionChangeTargetsForId(id);
507
+ }
508
+
509
+ function dedupeExtensionChangeTargets(
510
+ targets: ExtensionChangeTarget[],
511
+ ): ExtensionChangeTarget[] {
512
+ const unique = new Map<string, ExtensionChangeTarget>();
513
+ for (const target of targets) {
514
+ const key = targetKey(target);
515
+ if (key) unique.set(key, target);
516
+ }
517
+ return Array.from(unique.values());
518
+ }
519
+
520
+ async function notifyExtensionChanged(
521
+ targets: ExtensionChangeTarget[],
522
+ ): Promise<void> {
523
+ const uniqueTargets = dedupeExtensionChangeTargets(targets);
524
+ if (uniqueTargets.length === 0) return;
525
+
526
+ for (const target of uniqueTargets) {
527
+ recordChange({
528
+ source: "extensions",
529
+ type: "change",
530
+ key: "*",
531
+ ...(target.owner ? { owner: target.owner } : {}),
532
+ ...(target.orgId ? { orgId: target.orgId } : {}),
533
+ });
534
+ }
535
+
536
+ await Promise.all(
537
+ uniqueTargets.map(async (target) => {
538
+ const sessionId = extensionChangeMarkerSession(target);
539
+ if (!sessionId) return;
540
+ await appStatePut(
541
+ sessionId,
542
+ EXTENSION_CHANGE_MARKER_KEY,
543
+ extensionChangeMarkerValue(target),
544
+ );
545
+ }),
546
+ );
547
+ }
548
+
549
+ export async function notifyExtensionChangeForResource(
550
+ id: string,
551
+ beforeTargets: ExtensionChangeTarget[] = [],
552
+ ): Promise<void> {
553
+ await ensureExtensionsTables();
554
+ await notifyExtensionChanged([
555
+ ...beforeTargets,
556
+ ...(await extensionChangeTargetsForId(id)),
557
+ ]);
558
+ }
559
+
560
+ function extensionHistoryEntryFromRaw(
561
+ row: RawExtensionHistoryRow,
562
+ includeContent: boolean,
563
+ ): ExtensionHistoryEntry {
564
+ const content = row.content ?? "";
565
+ const visibility = normalizeVisibility(row.visibility);
566
+ return {
567
+ id: row.id,
568
+ extensionId: String(row.tool_id ?? row.extensionId ?? ""),
569
+ version: Number(row.version) || 1,
570
+ operation: row.operation,
571
+ summary: row.summary ?? "",
572
+ name: row.name,
573
+ description: row.description ?? "",
574
+ ...(includeContent ? { content } : {}),
575
+ icon: row.icon ?? null,
576
+ actorEmail: row.actor_email ?? row.actorEmail ?? null,
577
+ ownerEmail: row.owner_email ?? row.ownerEmail ?? "",
578
+ orgId: row.org_id ?? row.orgId ?? null,
579
+ visibility,
580
+ createdAt: row.created_at ?? row.createdAt ?? new Date(0).toISOString(),
581
+ persisted: true,
582
+ contentLength: content.length,
583
+ };
584
+ }
585
+
586
+ function extensionHistoryEntryFromExtension(
587
+ row: ExtensionRow,
588
+ includeContent: boolean,
589
+ ): ExtensionHistoryEntry {
590
+ return {
591
+ id: `current:${row.id}`,
592
+ extensionId: row.id,
593
+ version: 1,
594
+ operation: "baseline",
595
+ summary: "Current version",
596
+ name: row.name,
597
+ description: row.description,
598
+ ...(includeContent ? { content: row.content } : {}),
599
+ icon: row.icon,
600
+ actorEmail: null,
601
+ ownerEmail: row.ownerEmail,
602
+ orgId: row.orgId,
603
+ visibility: row.visibility,
604
+ createdAt: row.updatedAt,
605
+ persisted: false,
606
+ contentLength: row.content.length,
607
+ };
608
+ }
609
+
610
+ function normalizeVisibility(value: unknown): "private" | "org" | "public" {
611
+ return value === "org" || value === "public" ? value : "private";
612
+ }
613
+
614
+ function currentActorEmail(): string | null {
615
+ return getRequestUserEmail() ?? null;
616
+ }
617
+
618
+ function clampHistoryLimit(value: unknown): number {
619
+ const limit = Number(value ?? 50);
620
+ if (!Number.isFinite(limit)) return 50;
621
+ return Math.min(Math.max(1, Math.floor(limit)), 100);
622
+ }
623
+
624
+ async function historyVersionCount(extensionId: string): Promise<number> {
625
+ const result = await getDbExec().execute({
626
+ sql: `SELECT MAX(version) AS version FROM tool_history WHERE tool_id = ?`,
627
+ args: [extensionId],
628
+ });
629
+ const value = (result.rows?.[0] as any)?.version;
630
+ const version = Number(value ?? 0);
631
+ return Number.isFinite(version) ? version : 0;
632
+ }
633
+
634
+ async function hasExtensionHistory(extensionId: string): Promise<boolean> {
635
+ const result = await getDbExec().execute({
636
+ sql: `SELECT id FROM tool_history WHERE tool_id = ? LIMIT 1`,
637
+ args: [extensionId],
638
+ });
639
+ return (result.rows?.length ?? 0) > 0;
640
+ }
641
+
642
+ async function recordExtensionHistorySnapshot(
643
+ row: ExtensionRow,
644
+ operation: ExtensionHistoryOperation,
645
+ summary: string,
646
+ ): Promise<ExtensionHistoryEntry> {
647
+ const version = (await historyVersionCount(row.id)) + 1;
648
+ const now = new Date().toISOString();
649
+ const historyId = randomUUID();
650
+ await getDbExec().execute({
651
+ sql: `INSERT INTO tool_history (
652
+ id, tool_id, version, operation, summary, name, description, content,
653
+ icon, actor_email, owner_email, org_id, visibility, created_at
654
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
655
+ args: [
656
+ historyId,
657
+ row.id,
658
+ version,
659
+ operation,
660
+ summary,
661
+ row.name,
662
+ row.description,
663
+ row.content,
664
+ row.icon,
665
+ currentActorEmail(),
666
+ row.ownerEmail,
667
+ row.orgId,
668
+ row.visibility,
669
+ now,
670
+ ],
671
+ });
672
+
673
+ return {
674
+ id: historyId,
675
+ extensionId: row.id,
676
+ version,
677
+ operation,
678
+ summary,
679
+ name: row.name,
680
+ description: row.description,
681
+ content: row.content,
682
+ icon: row.icon,
683
+ actorEmail: currentActorEmail(),
684
+ ownerEmail: row.ownerEmail,
685
+ orgId: row.orgId,
686
+ visibility: row.visibility,
687
+ createdAt: now,
688
+ persisted: true,
689
+ contentLength: row.content.length,
690
+ };
691
+ }
692
+
693
+ async function ensureExtensionHistoryBaseline(
694
+ row: ExtensionRow,
695
+ ): Promise<void> {
696
+ if (await hasExtensionHistory(row.id)) return;
697
+ await recordExtensionHistorySnapshot(
698
+ row,
699
+ "baseline",
700
+ "Saved starting version",
701
+ );
702
+ }
703
+
704
+ function summarizeMetadataChange(
705
+ before: ExtensionRow,
706
+ after: ExtensionRow,
707
+ ): string {
708
+ const changes: string[] = [];
709
+ if (before.name !== after.name) {
710
+ changes.push(`Renamed from "${before.name}" to "${after.name}"`);
711
+ }
712
+ if (before.description !== after.description) {
713
+ changes.push("Updated description");
714
+ }
715
+ if (before.icon !== after.icon) {
716
+ changes.push("Updated icon");
717
+ }
718
+ if (before.visibility !== after.visibility) {
719
+ changes.push(`Changed visibility to ${after.visibility}`);
720
+ }
721
+ return changes.join("; ") || "Updated details";
722
+ }
723
+
724
+ function summarizeContentChange(
725
+ beforeContent: string,
726
+ afterContent: string,
727
+ ): string {
728
+ const stats = diffStats(createLineDiff(beforeContent, afterContent));
729
+ if (!stats.changed) return "Saved content";
730
+ return `Updated content (+${stats.addedLines} -${stats.deletedLines} lines)`;
731
+ }
732
+
733
+ function parseHistoryVersion(version: unknown): number | null {
734
+ const parsed = Number(version);
735
+ if (!Number.isInteger(parsed) || parsed < 1) return null;
736
+ return parsed;
737
+ }
738
+
739
+ async function getPersistedHistoryEntry(
740
+ extensionId: string,
741
+ version: number,
742
+ includeContent: boolean,
743
+ ): Promise<ExtensionHistoryEntry | null> {
744
+ const result = await getDbExec().execute({
745
+ sql: `SELECT id, tool_id, version, operation, summary, name, description,
746
+ content, icon, actor_email, owner_email, org_id, visibility, created_at
747
+ FROM tool_history
748
+ WHERE tool_id = ? AND version = ?
749
+ LIMIT 1`,
750
+ args: [extensionId, version],
751
+ });
752
+ const row = result.rows?.[0] as RawExtensionHistoryRow | undefined;
753
+ return row ? extensionHistoryEntryFromRaw(row, includeContent) : null;
754
+ }
755
+
756
+ function splitLines(text: string): string[] {
757
+ if (!text) return [];
758
+ const parts = text.split("\n");
759
+ return parts
760
+ .map((line, index) => (index < parts.length - 1 ? `${line}\n` : line))
761
+ .filter((line) => line.length > 0);
762
+ }
763
+
764
+ function createLineDiff(
765
+ beforeText: string,
766
+ afterText: string,
767
+ ): ExtensionHistoryDiffLine[] {
768
+ const before = splitLines(beforeText);
769
+ const after = splitLines(afterText);
770
+ if (before.length === 0 && after.length === 0) return [];
771
+
772
+ const cells = before.length * after.length;
773
+ if (cells > 40_000) return createBoundaryDiff(before, after);
774
+
775
+ const dp = Array.from({ length: before.length + 1 }, () =>
776
+ Array(after.length + 1).fill(0),
777
+ );
778
+ for (let i = before.length - 1; i >= 0; i -= 1) {
779
+ for (let j = after.length - 1; j >= 0; j -= 1) {
780
+ dp[i][j] =
781
+ before[i] === after[j]
782
+ ? dp[i + 1][j + 1] + 1
783
+ : Math.max(dp[i + 1][j], dp[i][j + 1]);
784
+ }
785
+ }
786
+
787
+ const diff: ExtensionHistoryDiffLine[] = [];
788
+ let i = 0;
789
+ let j = 0;
790
+ while (i < before.length && j < after.length) {
791
+ if (before[i] === after[j]) {
792
+ diff.push({ type: "equal", text: before[i] });
793
+ i += 1;
794
+ j += 1;
795
+ } else if (dp[i + 1][j] >= dp[i][j + 1]) {
796
+ diff.push({ type: "delete", text: before[i] });
797
+ i += 1;
798
+ } else {
799
+ diff.push({ type: "insert", text: after[j] });
800
+ j += 1;
801
+ }
802
+ }
803
+ while (i < before.length) {
804
+ diff.push({ type: "delete", text: before[i] });
805
+ i += 1;
806
+ }
807
+ while (j < after.length) {
808
+ diff.push({ type: "insert", text: after[j] });
809
+ j += 1;
810
+ }
811
+ return diff;
812
+ }
813
+
814
+ function createBoundaryDiff(
815
+ before: string[],
816
+ after: string[],
817
+ ): ExtensionHistoryDiffLine[] {
818
+ let prefix = 0;
819
+ while (
820
+ prefix < before.length &&
821
+ prefix < after.length &&
822
+ before[prefix] === after[prefix]
823
+ ) {
824
+ prefix += 1;
825
+ }
826
+
827
+ let suffix = 0;
828
+ while (
829
+ suffix + prefix < before.length &&
830
+ suffix + prefix < after.length &&
831
+ before[before.length - 1 - suffix] === after[after.length - 1 - suffix]
832
+ ) {
833
+ suffix += 1;
834
+ }
835
+
836
+ return [
837
+ ...before
838
+ .slice(0, prefix)
839
+ .map((text) => ({ type: "equal" as const, text })),
840
+ ...before
841
+ .slice(prefix, before.length - suffix)
842
+ .map((text) => ({ type: "delete" as const, text })),
843
+ ...after
844
+ .slice(prefix, after.length - suffix)
845
+ .map((text) => ({ type: "insert" as const, text })),
846
+ ...before
847
+ .slice(before.length - suffix)
848
+ .map((text) => ({ type: "equal" as const, text })),
849
+ ];
850
+ }
851
+
852
+ function diffStats(diff: ExtensionHistoryDiffLine[]): {
853
+ addedLines: number;
854
+ deletedLines: number;
855
+ changed: boolean;
856
+ } {
857
+ const addedLines = diff.filter((line) => line.type === "insert").length;
858
+ const deletedLines = diff.filter((line) => line.type === "delete").length;
859
+ return {
860
+ addedLines,
861
+ deletedLines,
862
+ changed: addedLines > 0 || deletedLines > 0,
863
+ };
864
+ }
865
+
866
+ export interface ListExtensionsOptions {
867
+ includeHidden?: boolean;
868
+ /**
869
+ * Include extensions an admin/owner has globally hidden via `hidden_at`.
870
+ * Off by default so globally-hidden extensions disappear for everyone.
871
+ */
872
+ includeGloballyHidden?: boolean;
873
+ }
874
+
875
+ export async function listExtensions(
876
+ options: ListExtensionsOptions = {},
877
+ ): Promise<ExtensionRow[]> {
878
+ await ensureExtensionsTables();
879
+ const db = getDb();
880
+ // Build the WHERE with a single `and()` — drizzle replaces (not ANDs)
881
+ // on repeated `.where()` calls, so combine the access filter and the
882
+ // global-hidden filter into one condition.
883
+ const base = accessFilter(extensions, extensionShares);
884
+ const where = options.includeGloballyHidden
885
+ ? base
886
+ : and(base, isNull(extensions.hiddenAt));
887
+ const rows = (await db
888
+ .select()
889
+ .from(extensions)
890
+ .where(where)) as ExtensionRow[];
891
+
892
+ if (options.includeHidden) return rows;
893
+
894
+ const hiddenIds = await getHiddenExtensionIdsForCurrentUser();
895
+ if (hiddenIds.size === 0) return rows;
896
+ return rows.filter((row) => !hiddenIds.has(row.id));
897
+ }
898
+
899
+ export async function getExtension(id: string): Promise<ExtensionRow | null> {
900
+ await ensureExtensionsTables();
901
+ const access = await resolveAccess("extension", id);
902
+ return (access?.resource as ExtensionRow | undefined) ?? null;
903
+ }
904
+
905
+ export interface ListExtensionHistoryOptions {
906
+ limit?: number;
907
+ includeContent?: boolean;
908
+ }
909
+
910
+ export async function listExtensionHistory(
911
+ id: string,
912
+ options: ListExtensionHistoryOptions = {},
913
+ ): Promise<ExtensionHistoryEntry[]> {
914
+ await ensureExtensionsTables();
915
+ const extension = await getExtension(id);
916
+ if (!extension) return [];
917
+
918
+ const includeContent = options.includeContent === true;
919
+ const limit = clampHistoryLimit(options.limit);
920
+ const result = await getDbExec().execute({
921
+ sql: `SELECT id, tool_id, version, operation, summary, name, description,
922
+ content, icon, actor_email, owner_email, org_id, visibility, created_at
923
+ FROM tool_history
924
+ WHERE tool_id = ?
925
+ ORDER BY version DESC
926
+ LIMIT ?`,
927
+ args: [id, limit],
928
+ });
929
+
930
+ const entries = (result.rows ?? []).map((row) =>
931
+ extensionHistoryEntryFromRaw(row as RawExtensionHistoryRow, includeContent),
932
+ );
933
+
934
+ if (entries.length > 0) return entries;
935
+ return [extensionHistoryEntryFromExtension(extension, includeContent)];
936
+ }
937
+
938
+ export async function getExtensionHistoryVersion(
939
+ id: string,
940
+ versionValue: number | string,
941
+ ): Promise<ExtensionHistoryDetail | null> {
942
+ await ensureExtensionsTables();
943
+ const extension = await getExtension(id);
944
+ if (!extension) return null;
945
+
946
+ const version = parseHistoryVersion(versionValue);
947
+ if (!version) return null;
948
+
949
+ const persisted = await getPersistedHistoryEntry(id, version, true);
950
+ const entry =
951
+ persisted ??
952
+ (!(await hasExtensionHistory(id)) && version === 1
953
+ ? extensionHistoryEntryFromExtension(extension, true)
954
+ : null);
955
+ if (!entry) return null;
956
+
957
+ const previous =
958
+ version > 1 ? await getPersistedHistoryEntry(id, version - 1, true) : null;
959
+ const previousContent = previous?.content ?? "";
960
+ const currentContent = entry.content ?? "";
961
+ const diff = createLineDiff(previousContent, currentContent);
962
+
963
+ return {
964
+ entry,
965
+ previous,
966
+ diff,
967
+ stats: diffStats(diff),
968
+ };
969
+ }
970
+
971
+ export async function restoreExtensionHistoryVersion(
972
+ id: string,
973
+ versionValue: number | string,
974
+ ): Promise<ExtensionRow | null> {
975
+ await ensureExtensionsTables();
976
+ await assertAccess("extension", id, "editor");
977
+
978
+ const version = parseHistoryVersion(versionValue);
979
+ if (!version) return null;
980
+
981
+ const existingRows = await getDb()
982
+ .select()
983
+ .from(extensions)
984
+ .where(eq(extensions.id, id));
985
+ const existing = existingRows[0] as ExtensionRow | undefined;
986
+ if (!existing) return null;
987
+
988
+ await ensureExtensionHistoryBaseline(existing);
989
+ const target = await getPersistedHistoryEntry(id, version, true);
990
+ if (!target) return null;
991
+
992
+ const beforeTargets = await extensionChangeTargetsForId(id);
993
+ await getDb()
994
+ .update(extensions)
995
+ .set({
996
+ name: target.name,
997
+ description: target.description,
998
+ content: target.content ?? "",
999
+ icon: target.icon,
1000
+ updatedAt: new Date().toISOString(),
1001
+ })
1002
+ .where(eq(extensions.id, id));
1003
+
1004
+ const rows = await getDb()
1005
+ .select()
1006
+ .from(extensions)
1007
+ .where(eq(extensions.id, id));
1008
+ const row = (rows[0] as ExtensionRow) ?? null;
1009
+ if (row) {
1010
+ await recordExtensionHistorySnapshot(
1011
+ row,
1012
+ "restore",
1013
+ `Restored version ${version}`,
1014
+ );
1015
+ await notifyExtensionChanged([
1016
+ ...beforeTargets,
1017
+ ...(await extensionChangeTargetsForRow(row)),
1018
+ ]);
1019
+ }
1020
+ return row;
1021
+ }
1022
+
1023
+ export interface CreateExtensionData {
1024
+ name: string;
1025
+ description?: string;
1026
+ content?: string;
1027
+ icon?: string;
1028
+ }
1029
+
1030
+ export async function createExtension(
1031
+ data: CreateExtensionData,
1032
+ ): Promise<ExtensionRow> {
1033
+ await ensureExtensionsTables();
1034
+ const db = getDb();
1035
+ const userEmail = getRequestUserEmail();
1036
+ if (!userEmail) throw new Error("no authenticated user");
1037
+ const orgId = getRequestOrgId();
1038
+ const id = randomUUID();
1039
+ const now = new Date().toISOString();
1040
+ const row: ExtensionRow = {
1041
+ id,
1042
+ name: data.name,
1043
+ description: data.description ?? "",
1044
+ content: data.content ?? "",
1045
+ icon: data.icon ?? null,
1046
+ createdAt: now,
1047
+ updatedAt: now,
1048
+ hiddenAt: null,
1049
+ hiddenBy: null,
1050
+ ownerEmail: userEmail,
1051
+ orgId: orgId ?? null,
1052
+ visibility: "private",
1053
+ };
1054
+ await db.insert(extensions).values(row);
1055
+ await recordExtensionHistorySnapshot(row, "create", "Created extension");
1056
+ await notifyExtensionChanged([{ owner: row.ownerEmail }]);
1057
+ return row;
1058
+ }
1059
+
1060
+ /**
1061
+ * Returns an extension with the exact same name and content created by the
1062
+ * current user — in the current org/workspace scope — in the last 5 minutes,
1063
+ * or null if none exists. Used to make create-extension idempotent when a
1064
+ * connection drop causes the agent to retry the same tool call.
1065
+ *
1066
+ * Scoped by `orgId` the same way `createExtension` stamps it, so the same
1067
+ * `ownerEmail` working in two different orgs can create identically-named,
1068
+ * identical-content extensions without this lookup cross-matching and skipping
1069
+ * the second insert. Keyed on the FULL create inputs (name + content +
1070
+ * description + icon, normalized exactly as `createExtension` stores them), so
1071
+ * two creates that differ in any of them are treated as distinct — only a
1072
+ * byte-identical re-create (the connection-retry case) recovers the prior row,
1073
+ * and no intentional second create silently loses its metadata.
1074
+ */
1075
+ export async function findRecentDuplicateExtension(data: {
1076
+ name: string;
1077
+ content: string;
1078
+ description?: string;
1079
+ icon?: string;
1080
+ }): Promise<ExtensionRow | null> {
1081
+ await ensureExtensionsTables();
1082
+ const db = getDb();
1083
+ const userEmail = getRequestUserEmail();
1084
+ if (!userEmail) return null;
1085
+ const orgId = getRequestOrgId() ?? null;
1086
+ const description = data.description ?? "";
1087
+ const icon = data.icon ?? null;
1088
+ const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();
1089
+ const rows = await db
1090
+ .select()
1091
+ .from(extensions)
1092
+ .where(
1093
+ and(
1094
+ eq(extensions.ownerEmail, userEmail),
1095
+ orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId),
1096
+ eq(extensions.name, data.name),
1097
+ eq(extensions.content, data.content),
1098
+ eq(extensions.description, description),
1099
+ icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon),
1100
+ gte(extensions.createdAt, fiveMinutesAgo),
1101
+ isNull(extensions.hiddenAt),
1102
+ ),
1103
+ )
1104
+ .limit(1);
1105
+ return rows[0] ?? null;
1106
+ }
1107
+
1108
+ export interface UpdateExtensionData {
1109
+ name?: string;
1110
+ description?: string;
1111
+ icon?: string;
1112
+ /**
1113
+ * Extensions cannot be public — `set-resource-visibility` and this store
1114
+ * helper both reject `"public"`. The type lists it so the framework's
1115
+ * generic share UI compiles, not because it's allowed at runtime.
1116
+ */
1117
+ visibility?: "private" | "org" | "public";
1118
+ }
1119
+
1120
+ export async function updateExtension(
1121
+ id: string,
1122
+ data: UpdateExtensionData,
1123
+ ): Promise<ExtensionRow | null> {
1124
+ await ensureExtensionsTables();
1125
+ await assertAccess("extension", id, "editor");
1126
+ if (data.visibility === "public") {
1127
+ // Defense in depth — `registerExtensionsShareable` sets
1128
+ // `allowPublic: false`, so `set-resource-visibility` already rejects
1129
+ // this. Block direct callers too (HTTP `PUT /extensions/:id`, internal
1130
+ // refactors) so the rule holds regardless of entry point.
1131
+ throw new ForbiddenError(
1132
+ "Extensions cannot be made public — share with specific people or your organization instead.",
1133
+ );
1134
+ }
1135
+ const db = getDb();
1136
+ const beforeTargets = await extensionChangeTargetsForId(id);
1137
+ const updates: Record<string, unknown> = {
1138
+ updatedAt: new Date().toISOString(),
1139
+ };
1140
+ if (data.name !== undefined) updates.name = data.name;
1141
+ if (data.description !== undefined) updates.description = data.description;
1142
+ if (data.icon !== undefined) updates.icon = data.icon;
1143
+ if (data.visibility !== undefined) updates.visibility = data.visibility;
1144
+ const existingRows = await db
1145
+ .select()
1146
+ .from(extensions)
1147
+ .where(eq(extensions.id, id));
1148
+ const existing = existingRows[0] as ExtensionRow | undefined;
1149
+ if (!existing) return null;
1150
+ await ensureExtensionHistoryBaseline(existing);
1151
+ await db.update(extensions).set(updates).where(eq(extensions.id, id));
1152
+ const rows = await db.select().from(extensions).where(eq(extensions.id, id));
1153
+ const row = (rows[0] as ExtensionRow) ?? null;
1154
+ if (row) {
1155
+ await recordExtensionHistorySnapshot(
1156
+ row,
1157
+ "metadata-update",
1158
+ summarizeMetadataChange(existing, row),
1159
+ );
1160
+ await notifyExtensionChanged([
1161
+ ...beforeTargets,
1162
+ ...(await extensionChangeTargetsForRow(row)),
1163
+ ]);
1164
+ }
1165
+ return row;
1166
+ }
1167
+
1168
+ export interface UpdateExtensionContentOpts {
1169
+ content?: string;
1170
+ allowFullReplacement?: boolean;
1171
+ patches?: ExtensionLegacyPatch[];
1172
+ edits?: ExtensionContentEdit[];
1173
+ format?: boolean;
1174
+ }
1175
+
1176
+ export async function updateExtensionContent(
1177
+ id: string,
1178
+ opts: UpdateExtensionContentOpts,
1179
+ ): Promise<ExtensionRow | null> {
1180
+ await ensureExtensionsTables();
1181
+ await assertAccess("extension", id, "editor");
1182
+ const db = getDb();
1183
+
1184
+ if (
1185
+ opts.content === undefined &&
1186
+ opts.patches === undefined &&
1187
+ opts.edits === undefined &&
1188
+ !opts.format
1189
+ ) {
1190
+ return null;
1191
+ }
1192
+
1193
+ if (opts.content !== undefined && opts.allowFullReplacement !== true) {
1194
+ throw new ExtensionContentEditError(
1195
+ "Full extension-body replacement requires allowFullReplacement=true. No changes were applied. Use patches or edits for a targeted data-only repair, or set allowFullReplacement=true for a user-requested broad visual rewrite.",
1196
+ );
1197
+ }
1198
+
1199
+ const existingRows = await db
1200
+ .select()
1201
+ .from(extensions)
1202
+ .where(eq(extensions.id, id));
1203
+ if (!existingRows[0]) return null;
1204
+ const existing = existingRows[0] as ExtensionRow;
1205
+ const existingContent = existing.content;
1206
+ await ensureExtensionHistoryBaseline(existing);
1207
+ const update = await applyExtensionContentUpdate(existingContent, opts);
1208
+
1209
+ const beforeTargets = await extensionChangeTargetsForId(id);
1210
+ await db
1211
+ .update(extensions)
1212
+ .set({ content: update.content, updatedAt: new Date().toISOString() })
1213
+ .where(eq(extensions.id, id));
1214
+ const rows = await db.select().from(extensions).where(eq(extensions.id, id));
1215
+ const row = (rows[0] as ExtensionRow) ?? null;
1216
+ if (row) {
1217
+ await recordExtensionHistorySnapshot(
1218
+ row,
1219
+ "content-update",
1220
+ summarizeContentChange(existingContent, row.content),
1221
+ );
1222
+ await notifyExtensionChanged([
1223
+ ...beforeTargets,
1224
+ ...(await extensionChangeTargetsForRow(row)),
1225
+ ]);
1226
+ }
1227
+ return row;
1228
+ }
1229
+
1230
+ export async function deleteExtension(id: string): Promise<boolean> {
1231
+ await ensureExtensionsTables();
1232
+ await assertAccess("extension", id, "admin");
1233
+ const db = getDb();
1234
+ const rows = await db.select().from(extensions).where(eq(extensions.id, id));
1235
+ const row = rows[0] as ExtensionRow | undefined;
1236
+ if (!row) return false;
1237
+ const targets = await extensionChangeTargetsForRow(row);
1238
+ await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));
1239
+ await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));
1240
+ await getDbExec().execute({
1241
+ sql: `DELETE FROM tool_data WHERE tool_id = ?`,
1242
+ args: [id],
1243
+ });
1244
+ await getDbExec().execute({
1245
+ sql: `DELETE FROM tool_history WHERE tool_id = ?`,
1246
+ args: [id],
1247
+ });
1248
+ const { cascadeDeleteExtensionSlots } = await import("./slots/store.js");
1249
+ await cascadeDeleteExtensionSlots(id);
1250
+ await db.delete(extensions).where(eq(extensions.id, id));
1251
+ await notifyExtensionChanged(targets);
1252
+ return true;
1253
+ }
1254
+
1255
+ export async function getHiddenExtensionIdsForCurrentUser(): Promise<
1256
+ Set<string>
1257
+ > {
1258
+ await ensureExtensionsTables();
1259
+ const userEmail = getRequestUserEmail();
1260
+ if (!userEmail) return new Set();
1261
+
1262
+ const db = getDb();
1263
+ const rows = await db
1264
+ .select({ extensionId: extensionHides.extensionId })
1265
+ .from(extensionHides)
1266
+ .where(eq(extensionHides.ownerEmail, userEmail));
1267
+ return new Set(rows.map((row) => row.extensionId));
1268
+ }
1269
+
1270
+ export async function hideExtension(id: string): Promise<boolean> {
1271
+ await ensureExtensionsTables();
1272
+ await assertAccess("extension", id, "viewer");
1273
+ const userEmail = getRequestUserEmail();
1274
+ if (!userEmail) throw new Error("no authenticated user");
1275
+
1276
+ const now = new Date().toISOString();
1277
+ await getDbExec().execute({
1278
+ sql: `INSERT INTO tool_hidden_extensions (id, tool_id, owner_email, created_at)
1279
+ VALUES (?, ?, ?, ?)
1280
+ ON CONFLICT (owner_email, tool_id) DO NOTHING`,
1281
+ args: [randomUUID(), id, userEmail, now],
1282
+ });
1283
+ await notifyExtensionChanged([{ owner: userEmail }]);
1284
+ return true;
1285
+ }
1286
+
1287
+ export async function unhideExtension(id: string): Promise<boolean> {
1288
+ await ensureExtensionsTables();
1289
+ const userEmail = getRequestUserEmail();
1290
+ if (!userEmail) throw new Error("no authenticated user");
1291
+
1292
+ await getDbExec().execute({
1293
+ sql: `DELETE FROM tool_hidden_extensions WHERE tool_id = ? AND owner_email = ?`,
1294
+ args: [id, userEmail],
1295
+ });
1296
+ await notifyExtensionChanged([{ owner: userEmail }]);
1297
+ return true;
1298
+ }
1299
+
1300
+ /**
1301
+ * Globally hide an extension from EVERYONE's list by stamping `hidden_at` /
1302
+ * `hidden_by` on the `tools` row. Distinct from the per-user `hideExtension`
1303
+ * (`tool_hidden_extensions`) — this affects all viewers. Requires admin/owner
1304
+ * access. The extension is not deleted and stays accessible by id; pass
1305
+ * `includeGloballyHidden: true` to `listExtensions` to surface it again.
1306
+ */
1307
+ export async function globalHideExtension(id: string): Promise<boolean> {
1308
+ await ensureExtensionsTables();
1309
+ await assertAccess("extension", id, "admin");
1310
+ const userEmail = getRequestUserEmail();
1311
+ if (!userEmail) throw new Error("no authenticated user");
1312
+
1313
+ const beforeTargets = await extensionChangeTargetsForId(id);
1314
+ const now = new Date().toISOString();
1315
+ await getDbExec().execute({
1316
+ sql: `UPDATE tools SET hidden_at = ?, hidden_by = ?, updated_at = ? WHERE id = ?`,
1317
+ args: [now, userEmail, now, id],
1318
+ });
1319
+ await notifyExtensionChanged([
1320
+ ...beforeTargets,
1321
+ ...(await extensionChangeTargetsForId(id)),
1322
+ ]);
1323
+ return true;
1324
+ }
1325
+
1326
+ /**
1327
+ * Clear a global hide so the extension reappears in everyone's list. Requires
1328
+ * admin/owner access. Mirrors `globalHideExtension`.
1329
+ */
1330
+ export async function globalUnhideExtension(id: string): Promise<boolean> {
1331
+ await ensureExtensionsTables();
1332
+ await assertAccess("extension", id, "admin");
1333
+ const userEmail = getRequestUserEmail();
1334
+ if (!userEmail) throw new Error("no authenticated user");
1335
+
1336
+ const beforeTargets = await extensionChangeTargetsForId(id);
1337
+ const now = new Date().toISOString();
1338
+ await getDbExec().execute({
1339
+ sql: `UPDATE tools SET hidden_at = NULL, hidden_by = NULL, updated_at = ? WHERE id = ?`,
1340
+ args: [now, id],
1341
+ });
1342
+ await notifyExtensionChanged([
1343
+ ...beforeTargets,
1344
+ ...(await extensionChangeTargetsForId(id)),
1345
+ ]);
1346
+ return true;
1347
+ }