@agent-native/core 0.113.0 → 0.114.1

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 (1638) hide show
  1. package/agent-native.eject.json +164 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +20 -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/build-compatibility.ts +77 -0
  12. package/corpus/core/src/client/index.ts +4 -0
  13. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +8 -2
  14. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +7 -2
  15. package/corpus/core/src/client/resources/ResourcesPanel.tsx +17 -3
  16. package/corpus/core/src/client/resources/index.ts +19 -0
  17. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +9 -1
  18. package/corpus/core/src/client/resources/runtime.ts +1 -0
  19. package/corpus/core/src/client/route-chunk-recovery/index.ts +1 -0
  20. package/corpus/core/src/client/setup-connections/catalog.ts +6 -0
  21. package/corpus/core/src/client/setup-connections/index.ts +1 -0
  22. package/corpus/core/src/client/setup-connections/runtime.ts +1 -0
  23. package/corpus/core/src/client/use-action.ts +32 -1
  24. package/corpus/core/src/connections/catalog.ts +41 -24
  25. package/corpus/core/src/connections/index.ts +1 -0
  26. package/corpus/core/src/connections/runtime.ts +1 -0
  27. package/corpus/core/src/deploy/build.ts +4 -1
  28. package/corpus/core/src/eject/provider-api-definitions.ts +193 -0
  29. package/corpus/core/src/eject/remote-mcp-presets.ts +137 -0
  30. package/corpus/core/src/eject/setup-readiness-ui.tsx +29 -0
  31. package/corpus/core/src/eject/workspace-connections.ts +92 -0
  32. package/corpus/core/src/index.ts +1 -0
  33. package/corpus/core/src/integrations/adapter-overrides.ts +12 -0
  34. package/corpus/core/src/integrations/eject/messaging-adapters.ts +85 -0
  35. package/corpus/core/src/integrations/index.ts +5 -1
  36. package/corpus/core/src/integrations/plugin.ts +34 -12
  37. package/corpus/core/src/integrations/runtime.ts +1 -0
  38. package/corpus/core/src/integrations/types.ts +3 -1
  39. package/corpus/core/src/org/context.ts +56 -30
  40. package/corpus/core/src/package-lifecycle/eject-manifest.ts +345 -0
  41. package/corpus/core/src/package-lifecycle/index.ts +1 -0
  42. package/corpus/core/src/provider-api/index.ts +46 -12
  43. package/corpus/core/src/provider-api/runtime.ts +1 -0
  44. package/corpus/core/src/server/action-routes.ts +52 -2
  45. package/corpus/core/src/server/auth-plugin.ts +9 -4
  46. package/corpus/core/src/server/better-auth-instance.ts +5 -1
  47. package/corpus/core/src/setup-connections/index.ts +1 -0
  48. package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
  49. package/corpus/core/src/shared/merge-by-id.ts +14 -0
  50. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  51. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  52. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  53. package/corpus/core/src/templates/default/AGENTS.md +6 -5
  54. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  55. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  56. package/corpus/core/src/templates/headless/AGENTS.md +5 -4
  57. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  58. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  59. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  60. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  61. package/corpus/core/src/templates/workspace-core/AGENTS.md +4 -4
  62. package/corpus/core/src/templates/workspace-root/AGENTS.md +4 -4
  63. package/corpus/core/src/vite/client.ts +42 -2
  64. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  65. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +9 -6
  66. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  67. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +9 -6
  68. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  69. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +9 -6
  70. package/corpus/templates/brain/actions/remediate-legacy-capture-audiences.ts +167 -0
  71. package/corpus/templates/brain/app/lib/brain-chat-readiness.ts +6 -0
  72. package/corpus/templates/brain/app/routes/_index.tsx +8 -0
  73. package/corpus/templates/brain/app/routes.ts +1 -0
  74. package/corpus/templates/brain/changelog/2026-07-19-ask-starts-immediately-when-builder-s-managed-ai-connection-.md +6 -0
  75. package/corpus/templates/brain/changelog/2026-07-19-slack-and-granola-backfills-now-process-captures-concurrentl.md +6 -0
  76. package/corpus/templates/brain/changelog/2026-07-19-source-review-settings-now-control-knowledge-approval.md +6 -0
  77. package/corpus/templates/brain/changelog/2026-07-19-the-manage-agent-page-now-opens-correctly-from-brain-navigat.md +6 -0
  78. package/corpus/templates/brain/server/db/schema.ts +3 -0
  79. package/corpus/templates/brain/server/lib/brain.ts +41 -2
  80. package/corpus/templates/brain/server/lib/connectors.ts +379 -113
  81. package/corpus/templates/brain/server/lib/meeting-audience.ts +38 -0
  82. package/corpus/templates/brain/server/plugins/db.ts +10 -0
  83. package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +6 -4
  84. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  85. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +9 -6
  86. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  87. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  88. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  89. package/corpus/templates/chat/AGENTS.md +3 -2
  90. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  91. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +9 -6
  92. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  93. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +9 -6
  94. package/corpus/templates/content/AGENTS.md +2 -0
  95. package/corpus/templates/content/actions/_content-database-personal-view.ts +49 -5
  96. package/corpus/templates/content/actions/_content-document-access.ts +21 -0
  97. package/corpus/templates/content/actions/_content-favorites.ts +91 -0
  98. package/corpus/templates/content/actions/_content-files.ts +79 -23
  99. package/corpus/templates/content/actions/_content-sidebar-state.ts +24 -0
  100. package/corpus/templates/content/actions/_content-space-access.ts +15 -17
  101. package/corpus/templates/content/actions/_content-space-catalog-guards.ts +20 -0
  102. package/corpus/templates/content/actions/_content-spaces.ts +364 -167
  103. package/corpus/templates/content/actions/_database-source-utils.ts +8 -0
  104. package/corpus/templates/content/actions/_database-utils.ts +249 -15
  105. package/corpus/templates/content/actions/_delete-content-space.ts +84 -0
  106. package/corpus/templates/content/actions/_files-system-properties.ts +499 -0
  107. package/corpus/templates/content/actions/_local-file-documents.ts +0 -1
  108. package/corpus/templates/content/actions/_property-utils.ts +18 -9
  109. package/corpus/templates/content/actions/bind-content-database-source-field.ts +3 -0
  110. package/corpus/templates/content/actions/configure-document-property.ts +3 -0
  111. package/corpus/templates/content/actions/create-content-database.ts +2 -2
  112. package/corpus/templates/content/actions/create-content-space.ts +34 -0
  113. package/corpus/templates/content/actions/create-document.ts +4 -1
  114. package/corpus/templates/content/actions/delete-content-space.ts +19 -0
  115. package/corpus/templates/content/actions/delete-database-items.ts +28 -1
  116. package/corpus/templates/content/actions/delete-document-property.ts +3 -0
  117. package/corpus/templates/content/actions/delete-document.ts +39 -2
  118. package/corpus/templates/content/actions/duplicate-database-item.ts +6 -0
  119. package/corpus/templates/content/actions/duplicate-database-items.ts +6 -0
  120. package/corpus/templates/content/actions/duplicate-document-property.ts +3 -0
  121. package/corpus/templates/content/actions/get-content-database.ts +11 -2
  122. package/corpus/templates/content/actions/get-content-sidebar-state.ts +23 -0
  123. package/corpus/templates/content/actions/get-document.ts +32 -7
  124. package/corpus/templates/content/actions/import-content-source.ts +33 -1
  125. package/corpus/templates/content/actions/list-content-spaces.ts +34 -2
  126. package/corpus/templates/content/actions/list-documents.ts +39 -7
  127. package/corpus/templates/content/actions/reorder-document-property.ts +9 -0
  128. package/corpus/templates/content/actions/set-document-property.ts +41 -23
  129. package/corpus/templates/content/actions/share-local-file-document.ts +15 -0
  130. package/corpus/templates/content/actions/submit-content-database-form.ts +7 -0
  131. package/corpus/templates/content/actions/sync-local-folder-source.ts +14 -0
  132. package/corpus/templates/content/actions/update-content-database-view.ts +1 -0
  133. package/corpus/templates/content/actions/update-content-sidebar-state.ts +27 -0
  134. package/corpus/templates/content/actions/update-document.ts +158 -66
  135. package/corpus/templates/content/app/components/EmptyState.tsx +4 -57
  136. package/corpus/templates/content/app/components/editor/CommentsSidebar.tsx +8 -1
  137. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +519 -178
  138. package/corpus/templates/content/app/components/editor/DocumentInfoPanel.tsx +39 -0
  139. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +1 -1
  140. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +266 -7
  141. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +430 -152
  142. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +467 -66
  143. package/corpus/templates/content/app/components/editor/database/view-config.ts +9 -3
  144. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +720 -196
  145. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +173 -1
  146. package/corpus/templates/content/app/components/sidebar/document-sidebar-sections.ts +1 -1
  147. package/corpus/templates/content/app/components/sidebar/select-content-space.ts +91 -16
  148. package/corpus/templates/content/app/entry.client.tsx +5 -1
  149. package/corpus/templates/content/app/hooks/use-content-database.ts +84 -3
  150. package/corpus/templates/content/app/hooks/use-content-spaces.ts +60 -2
  151. package/corpus/templates/content/app/hooks/use-create-page.ts +30 -0
  152. package/corpus/templates/content/app/hooks/use-documents.ts +270 -19
  153. package/corpus/templates/content/app/i18n-data.ts +243 -20
  154. package/corpus/templates/content/app/lib/local-folder-picker-safety.ts +54 -0
  155. package/corpus/templates/content/app/lib/local-folder-picker-support.ts +18 -0
  156. package/corpus/templates/content/app/routes/_app.favorites.tsx +30 -0
  157. package/corpus/templates/content/app/routes/_app.local-files.tsx +18 -6
  158. package/corpus/templates/content/changelog/2026-07-17-workspace-files-now-stay-in-a-loading-state-until-automatic-.md +6 -0
  159. package/corpus/templates/content/changelog/2026-07-17-workspace-switching-now-opens-the-selected-files-database-pr.md +6 -0
  160. package/corpus/templates/content/changelog/2026-07-17-workspaces-now-expand-above-their-own-files-list-without-dup.md +6 -0
  161. package/corpus/templates/content/changelog/2026-07-18-create-named-workspaces-each-with-its-own-private-files-data.md +6 -0
  162. package/corpus/templates/content/changelog/2026-07-18-favorites-align-with-workspace-and-file-rows-in-the-sidebar.md +6 -0
  163. package/corpus/templates/content/changelog/2026-07-18-local-folder-selection-no-longer-invokes-the-unsafe-native-p.md +6 -0
  164. package/corpus/templates/content/changelog/2026-07-18-made-content-workspaces-independently-expandable-restored-or.md +6 -0
  165. package/corpus/templates/content/changelog/2026-07-18-page-details-now-live-in-a-shared-info-and-comments-rail-dat.md +6 -0
  166. package/corpus/templates/content/changelog/2026-07-18-workspace-database-views-now-control-sidebar-workspace-navig.md +6 -0
  167. package/corpus/templates/content/changelog/2026-07-18-workspace-navigation-now-aligns-favorites-with-workspace-pag.md +6 -0
  168. package/corpus/templates/content/changelog/2026-07-19-favorites-now-open-as-a-table-and-compact-breadcrumbs-make-w.md +6 -0
  169. package/corpus/templates/content/changelog/2026-07-19-files-databases-now-start-unfiltered-sidebar-rows-exactly-fo.md +6 -0
  170. package/corpus/templates/content/changelog/2026-07-19-sidebar-page-trees-now-open-only-when-expanded-remember-thei.md +6 -0
  171. package/corpus/templates/content/changelog/2026-07-19-workspace-file-databases-now-use-the-workspace-name-open-as-.md +6 -0
  172. package/corpus/templates/content/changelog/2026-07-19-workspace-navigation-now-stays-stable-on-hover-uses-folder-i.md +6 -0
  173. package/corpus/templates/content/changelog/2026-07-19-workspace-rows-now-use-folder-icons-and-deleting-a-user-crea.md +6 -0
  174. package/corpus/templates/content/changelog/2026-07-19-workspaces-can-be-created-without-leaving-the-workspaces-dat.md +6 -0
  175. package/corpus/templates/content/e2e/global-setup.ts +3 -2
  176. package/corpus/templates/content/parity/matrix.md +28 -28
  177. package/corpus/templates/content/parity/matrix.ts +8 -2
  178. package/corpus/templates/content/server/db/index.ts +1 -0
  179. package/corpus/templates/content/server/db/schema.ts +10 -0
  180. package/corpus/templates/content/server/lib/documents.ts +12 -7
  181. package/corpus/templates/content/server/plugins/db.ts +17 -0
  182. package/corpus/templates/content/shared/api.ts +9 -0
  183. package/corpus/templates/content/shared/database-form.ts +11 -2
  184. package/corpus/templates/content/vite.config.ts +1 -0
  185. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  186. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +9 -6
  187. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  188. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +9 -6
  189. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  190. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +9 -6
  191. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  192. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  193. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +9 -6
  194. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  195. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +9 -6
  196. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  197. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +9 -6
  198. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +15 -13
  199. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  200. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +9 -6
  201. package/corpus/toolkit/CHANGELOG.md +6 -0
  202. package/corpus/toolkit/agent-native.eject.json +411 -0
  203. package/corpus/toolkit/package.json +5 -2
  204. package/dist/cli/eject.d.ts +21 -0
  205. package/dist/cli/eject.d.ts.map +1 -0
  206. package/dist/cli/eject.js +1145 -0
  207. package/dist/cli/eject.js.map +1 -0
  208. package/dist/cli/index.js +15 -0
  209. package/dist/cli/index.js.map +1 -1
  210. package/dist/client/build-compatibility.d.ts +11 -0
  211. package/dist/client/build-compatibility.d.ts.map +1 -0
  212. package/dist/client/build-compatibility.js +56 -0
  213. package/dist/client/build-compatibility.js.map +1 -0
  214. package/dist/client/index.d.ts +1 -1
  215. package/dist/client/index.d.ts.map +1 -1
  216. package/dist/client/index.js +1 -1
  217. package/dist/client/index.js.map +1 -1
  218. package/dist/client/resources/McpConnectionSuggestion.d.ts +4 -3
  219. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  220. package/dist/client/resources/McpConnectionSuggestion.js +3 -3
  221. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  222. package/dist/client/resources/McpIntegrationDialog.d.ts +4 -3
  223. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  224. package/dist/client/resources/McpIntegrationDialog.js +2 -2
  225. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  226. package/dist/client/resources/ResourcesPanel.d.ts +4 -1
  227. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  228. package/dist/client/resources/ResourcesPanel.js +9 -7
  229. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  230. package/dist/client/resources/index.d.ts +3 -0
  231. package/dist/client/resources/index.d.ts.map +1 -1
  232. package/dist/client/resources/index.js +3 -0
  233. package/dist/client/resources/index.js.map +1 -1
  234. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -1
  235. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  236. package/dist/client/resources/mcp-integration-catalog.js +6 -2
  237. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  238. package/dist/client/resources/runtime.d.ts +2 -0
  239. package/dist/client/resources/runtime.d.ts.map +1 -0
  240. package/dist/client/resources/runtime.js +2 -0
  241. package/dist/client/resources/runtime.js.map +1 -0
  242. package/dist/client/route-chunk-recovery/index.d.ts +1 -0
  243. package/dist/client/route-chunk-recovery/index.d.ts.map +1 -1
  244. package/dist/client/route-chunk-recovery/index.js +1 -0
  245. package/dist/client/route-chunk-recovery/index.js.map +1 -1
  246. package/dist/client/setup-connections/catalog.d.ts +2 -0
  247. package/dist/client/setup-connections/catalog.d.ts.map +1 -0
  248. package/dist/client/setup-connections/catalog.js +7 -0
  249. package/dist/client/setup-connections/catalog.js.map +1 -0
  250. package/dist/client/setup-connections/index.d.ts +1 -0
  251. package/dist/client/setup-connections/index.d.ts.map +1 -1
  252. package/dist/client/setup-connections/index.js +1 -0
  253. package/dist/client/setup-connections/index.js.map +1 -1
  254. package/dist/client/setup-connections/runtime.d.ts +2 -0
  255. package/dist/client/setup-connections/runtime.d.ts.map +1 -0
  256. package/dist/client/setup-connections/runtime.js +2 -0
  257. package/dist/client/setup-connections/runtime.js.map +1 -0
  258. package/dist/client/use-action.d.ts.map +1 -1
  259. package/dist/client/use-action.js +19 -1
  260. package/dist/client/use-action.js.map +1 -1
  261. package/dist/collab/awareness.d.ts +2 -2
  262. package/dist/collab/awareness.d.ts.map +1 -1
  263. package/dist/collab/struct-routes.d.ts +1 -1
  264. package/dist/connections/catalog.d.ts +5 -3
  265. package/dist/connections/catalog.d.ts.map +1 -1
  266. package/dist/connections/catalog.js +16 -8
  267. package/dist/connections/catalog.js.map +1 -1
  268. package/dist/connections/index.d.ts +1 -1
  269. package/dist/connections/index.d.ts.map +1 -1
  270. package/dist/connections/index.js +1 -1
  271. package/dist/connections/index.js.map +1 -1
  272. package/dist/connections/runtime.d.ts +2 -0
  273. package/dist/connections/runtime.d.ts.map +1 -0
  274. package/dist/connections/runtime.js +2 -0
  275. package/dist/connections/runtime.js.map +1 -0
  276. package/dist/deploy/build.js +2 -1
  277. package/dist/deploy/build.js.map +1 -1
  278. package/dist/eject/provider-api-definitions.d.ts +34 -0
  279. package/dist/eject/provider-api-definitions.d.ts.map +1 -0
  280. package/dist/eject/provider-api-definitions.js +88 -0
  281. package/dist/eject/provider-api-definitions.js.map +1 -0
  282. package/dist/eject/remote-mcp-presets.d.ts +17 -0
  283. package/dist/eject/remote-mcp-presets.d.ts.map +1 -0
  284. package/dist/eject/remote-mcp-presets.js +81 -0
  285. package/dist/eject/remote-mcp-presets.js.map +1 -0
  286. package/dist/eject/setup-readiness-ui.d.ts +7 -0
  287. package/dist/eject/setup-readiness-ui.d.ts.map +1 -0
  288. package/dist/eject/setup-readiness-ui.js +13 -0
  289. package/dist/eject/setup-readiness-ui.js.map +1 -0
  290. package/dist/eject/workspace-connections.d.ts +11 -0
  291. package/dist/eject/workspace-connections.d.ts.map +1 -0
  292. package/dist/eject/workspace-connections.js +47 -0
  293. package/dist/eject/workspace-connections.js.map +1 -0
  294. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  295. package/dist/index.d.ts +1 -1
  296. package/dist/index.d.ts.map +1 -1
  297. package/dist/index.js +1 -1
  298. package/dist/index.js.map +1 -1
  299. package/dist/integrations/adapter-overrides.d.ts +3 -0
  300. package/dist/integrations/adapter-overrides.d.ts.map +1 -0
  301. package/dist/integrations/adapter-overrides.js +7 -0
  302. package/dist/integrations/adapter-overrides.js.map +1 -0
  303. package/dist/integrations/eject/messaging-adapters.d.ts +12 -0
  304. package/dist/integrations/eject/messaging-adapters.d.ts.map +1 -0
  305. package/dist/integrations/eject/messaging-adapters.js +49 -0
  306. package/dist/integrations/eject/messaging-adapters.js.map +1 -0
  307. package/dist/integrations/index.d.ts +3 -2
  308. package/dist/integrations/index.d.ts.map +1 -1
  309. package/dist/integrations/index.js +2 -1
  310. package/dist/integrations/index.js.map +1 -1
  311. package/dist/integrations/plugin.d.ts +32 -1
  312. package/dist/integrations/plugin.d.ts.map +1 -1
  313. package/dist/integrations/plugin.js +19 -12
  314. package/dist/integrations/plugin.js.map +1 -1
  315. package/dist/integrations/runtime.d.ts +2 -0
  316. package/dist/integrations/runtime.d.ts.map +1 -0
  317. package/dist/integrations/runtime.js +2 -0
  318. package/dist/integrations/runtime.js.map +1 -0
  319. package/dist/integrations/types.d.ts +3 -1
  320. package/dist/integrations/types.d.ts.map +1 -1
  321. package/dist/integrations/types.js.map +1 -1
  322. package/dist/notifications/routes.d.ts +2 -2
  323. package/dist/observability/routes.d.ts +5 -5
  324. package/dist/org/context.d.ts +4 -2
  325. package/dist/org/context.d.ts.map +1 -1
  326. package/dist/org/context.js +44 -22
  327. package/dist/org/context.js.map +1 -1
  328. package/dist/package-lifecycle/eject-manifest.d.ts +43 -0
  329. package/dist/package-lifecycle/eject-manifest.d.ts.map +1 -0
  330. package/dist/package-lifecycle/eject-manifest.js +219 -0
  331. package/dist/package-lifecycle/eject-manifest.js.map +1 -0
  332. package/dist/package-lifecycle/index.d.ts +1 -0
  333. package/dist/package-lifecycle/index.d.ts.map +1 -1
  334. package/dist/package-lifecycle/index.js +1 -0
  335. package/dist/package-lifecycle/index.js.map +1 -1
  336. package/dist/provider-api/actions/custom-provider-registration.d.ts +11 -11
  337. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  338. package/dist/provider-api/index.d.ts +6 -2
  339. package/dist/provider-api/index.d.ts.map +1 -1
  340. package/dist/provider-api/index.js +25 -12
  341. package/dist/provider-api/index.js.map +1 -1
  342. package/dist/provider-api/runtime.d.ts +2 -0
  343. package/dist/provider-api/runtime.d.ts.map +1 -0
  344. package/dist/provider-api/runtime.js +2 -0
  345. package/dist/provider-api/runtime.js.map +1 -0
  346. package/dist/resources/handlers.d.ts +1 -1
  347. package/dist/server/action-routes.d.ts.map +1 -1
  348. package/dist/server/action-routes.js +32 -2
  349. package/dist/server/action-routes.js.map +1 -1
  350. package/dist/server/auth-plugin.d.ts.map +1 -1
  351. package/dist/server/auth-plugin.js +9 -5
  352. package/dist/server/auth-plugin.js.map +1 -1
  353. package/dist/server/better-auth-instance.d.ts.map +1 -1
  354. package/dist/server/better-auth-instance.js +4 -1
  355. package/dist/server/better-auth-instance.js.map +1 -1
  356. package/dist/setup-connections/index.d.ts +1 -1
  357. package/dist/setup-connections/index.d.ts.map +1 -1
  358. package/dist/setup-connections/index.js +1 -1
  359. package/dist/setup-connections/index.js.map +1 -1
  360. package/dist/shared/mcp-embed-headers.d.ts +1 -1
  361. package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
  362. package/dist/shared/mcp-embed-headers.js +1 -1
  363. package/dist/shared/mcp-embed-headers.js.map +1 -1
  364. package/dist/shared/merge-by-id.d.ts +5 -0
  365. package/dist/shared/merge-by-id.d.ts.map +1 -0
  366. package/dist/shared/merge-by-id.js +7 -0
  367. package/dist/shared/merge-by-id.js.map +1 -0
  368. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  369. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  370. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  371. package/dist/templates/chat/AGENTS.md +3 -2
  372. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  373. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  374. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  375. package/dist/templates/default/AGENTS.md +6 -5
  376. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  377. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  378. package/dist/templates/headless/AGENTS.md +5 -4
  379. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  380. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  381. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  382. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  383. package/dist/templates/workspace-core/AGENTS.md +4 -4
  384. package/dist/templates/workspace-root/AGENTS.md +4 -4
  385. package/dist/vite/client.d.ts +6 -0
  386. package/dist/vite/client.d.ts.map +1 -1
  387. package/dist/vite/client.js +30 -2
  388. package/dist/vite/client.js.map +1 -1
  389. package/docs/content/agent-native-toolkit.mdx +38 -0
  390. package/docs/content/package-lifecycle.mdx +54 -4
  391. package/package.json +15 -2
  392. package/src/a2a/agent-card.ts +83 -0
  393. package/src/a2a/artifact-response.ts +1648 -0
  394. package/src/a2a/auth-policy.ts +66 -0
  395. package/src/a2a/caller-auth.ts +102 -0
  396. package/src/a2a/client.ts +876 -0
  397. package/src/a2a/correlation.ts +50 -0
  398. package/src/a2a/handlers.ts +1285 -0
  399. package/src/a2a/index.ts +50 -0
  400. package/src/a2a/invoke.ts +348 -0
  401. package/src/a2a/response-text.ts +53 -0
  402. package/src/a2a/server.ts +586 -0
  403. package/src/a2a/task-store.ts +917 -0
  404. package/src/a2a/types.ts +221 -0
  405. package/src/a2a-claims.ts +52 -0
  406. package/src/action-change-marker.ts +74 -0
  407. package/src/action-ui.ts +38 -0
  408. package/src/action.ts +1406 -0
  409. package/src/adapters/cli/index.ts +6 -0
  410. package/src/adapters/cli/registry.ts +73 -0
  411. package/src/adapters/cli/shell-adapter.ts +92 -0
  412. package/src/adapters/cli/types.ts +27 -0
  413. package/src/agent/action-continuation-guidance.ts +38 -0
  414. package/src/agent/app-model-defaults.ts +201 -0
  415. package/src/agent/context-xray/actions/context-evict.ts +56 -0
  416. package/src/agent/context-xray/actions/context-manifest-get.ts +75 -0
  417. package/src/agent/context-xray/actions/context-pin.ts +56 -0
  418. package/src/agent/context-xray/actions/context-preview-get.ts +134 -0
  419. package/src/agent/context-xray/actions/context-report.ts +75 -0
  420. package/src/agent/context-xray/actions/context-restore.ts +51 -0
  421. package/src/agent/context-xray/actions/errors.ts +40 -0
  422. package/src/agent/context-xray/apply-directives.ts +137 -0
  423. package/src/agent/context-xray/directives-store.ts +178 -0
  424. package/src/agent/context-xray/identity.ts +37 -0
  425. package/src/agent/context-xray/manifest.ts +284 -0
  426. package/src/agent/context-xray/migrations.ts +32 -0
  427. package/src/agent/context-xray/plugin.ts +23 -0
  428. package/src/agent/context-xray/schema.ts +17 -0
  429. package/src/agent/context-xray/segments.ts +194 -0
  430. package/src/agent/context-xray/tokenize.ts +93 -0
  431. package/src/agent/default-model.ts +5 -0
  432. package/src/agent/durable-background.ts +547 -0
  433. package/src/agent/engine/ai-sdk-engine.ts +565 -0
  434. package/src/agent/engine/anthropic-engine.ts +320 -0
  435. package/src/agent/engine/builder-engine.ts +1110 -0
  436. package/src/agent/engine/builder-gateway-headers.ts +44 -0
  437. package/src/agent/engine/builtin.ts +122 -0
  438. package/src/agent/engine/context-directives-transform.ts +73 -0
  439. package/src/agent/engine/continuation-dispatch-retry.ts +168 -0
  440. package/src/agent/engine/credential-errors.ts +69 -0
  441. package/src/agent/engine/index.ts +54 -0
  442. package/src/agent/engine/openai-compatible-endpoint.ts +25 -0
  443. package/src/agent/engine/output-tokens.ts +181 -0
  444. package/src/agent/engine/provider-env-vars.ts +69 -0
  445. package/src/agent/engine/registry.ts +853 -0
  446. package/src/agent/engine/tool-call-journal-seed.ts +85 -0
  447. package/src/agent/engine/translate-ai-sdk.ts +407 -0
  448. package/src/agent/engine/translate-anthropic.ts +611 -0
  449. package/src/agent/engine/types.ts +310 -0
  450. package/src/agent/harness/acp-adapter.ts +893 -0
  451. package/src/agent/harness/acp-builtin.ts +70 -0
  452. package/src/agent/harness/ai-sdk-adapter.ts +509 -0
  453. package/src/agent/harness/background.ts +365 -0
  454. package/src/agent/harness/builtin.ts +50 -0
  455. package/src/agent/harness/index.ts +86 -0
  456. package/src/agent/harness/lifecycle.ts +498 -0
  457. package/src/agent/harness/registry.ts +97 -0
  458. package/src/agent/harness/runner.ts +182 -0
  459. package/src/agent/harness/store.ts +466 -0
  460. package/src/agent/harness/translate.ts +130 -0
  461. package/src/agent/harness/types.ts +129 -0
  462. package/src/agent/index.ts +32 -0
  463. package/src/agent/loop-settings.ts +186 -0
  464. package/src/agent/model-config.ts +363 -0
  465. package/src/agent/observational-memory/compactor.ts +78 -0
  466. package/src/agent/observational-memory/config.ts +78 -0
  467. package/src/agent/observational-memory/index.ts +79 -0
  468. package/src/agent/observational-memory/internal-run.ts +89 -0
  469. package/src/agent/observational-memory/message-text.ts +49 -0
  470. package/src/agent/observational-memory/migrations.ts +44 -0
  471. package/src/agent/observational-memory/observer.ts +128 -0
  472. package/src/agent/observational-memory/plugin.ts +35 -0
  473. package/src/agent/observational-memory/prompts.ts +53 -0
  474. package/src/agent/observational-memory/read.ts +131 -0
  475. package/src/agent/observational-memory/reflector.ts +119 -0
  476. package/src/agent/observational-memory/schema.ts +48 -0
  477. package/src/agent/observational-memory/store.ts +275 -0
  478. package/src/agent/observational-memory/types.ts +65 -0
  479. package/src/agent/processors.ts +209 -0
  480. package/src/agent/production-agent.ts +8254 -0
  481. package/src/agent/run-loop-with-resume.ts +394 -0
  482. package/src/agent/run-manager.ts +1825 -0
  483. package/src/agent/run-ownership.ts +75 -0
  484. package/src/agent/run-store.ts +2601 -0
  485. package/src/agent/runtime-context.ts +169 -0
  486. package/src/agent/thread-data-builder.ts +1584 -0
  487. package/src/agent/tool-call-journal.ts +368 -0
  488. package/src/agent/tool-error-redaction.ts +52 -0
  489. package/src/agent/tool-result-images.ts +178 -0
  490. package/src/agent/tool-search.ts +376 -0
  491. package/src/agent/types.ts +372 -0
  492. package/src/agent-native/index.ts +198 -0
  493. package/src/agent-web/config.ts +253 -0
  494. package/src/agent-web/generator.ts +382 -0
  495. package/src/agent-web/index.ts +36 -0
  496. package/src/appearance/actions/change-appearance.ts +35 -0
  497. package/src/application-state/emitter.ts +81 -0
  498. package/src/application-state/handlers.ts +121 -0
  499. package/src/application-state/index.ts +44 -0
  500. package/src/application-state/script-helpers.ts +155 -0
  501. package/src/application-state/store.ts +274 -0
  502. package/src/assets/branding/agent-native.icon/Assets/background.svg +3 -0
  503. package/src/assets/branding/agent-native.icon/Assets/foreground.svg +12 -0
  504. package/src/assets/branding/agent-native.icon/icon.json +49 -0
  505. package/src/assets/branding/favicon.png +0 -0
  506. package/src/assets/branding/favicon.svg +1 -0
  507. package/src/assets/branding/icon-on-dark.svg +10 -0
  508. package/src/assets/branding/icon-on-light.svg +10 -0
  509. package/src/assets/branding/mac-app-icon.svg +1 -0
  510. package/src/assets/branding/slack-bot/agent-native-1024.png +0 -0
  511. package/src/assets/branding/slack-bot/agent-native-512.png +0 -0
  512. package/src/assets/branding/tray-icon.svg +6 -0
  513. package/src/assets/branding/wordmark-on-dark.svg +21 -0
  514. package/src/assets/branding/wordmark-on-light.svg +21 -0
  515. package/src/assets/fonts/LICENSE_LIBERATION +96 -0
  516. package/src/assets/fonts/LICENSE_NOTO_NASKH_ARABIC +93 -0
  517. package/src/assets/fonts/LiberationSans-Bold.ttf +0 -0
  518. package/src/assets/fonts/LiberationSans-Regular.ttf +0 -0
  519. package/src/assets/fonts/NotoNaskhArabic-Variable.ttf +0 -0
  520. package/src/audit/actions/export-audit-events.ts +162 -0
  521. package/src/audit/actions/get-audit-event.ts +24 -0
  522. package/src/audit/actions/list-audit-events.ts +66 -0
  523. package/src/audit/cleanup-job.ts +100 -0
  524. package/src/audit/config.ts +90 -0
  525. package/src/audit/index.ts +43 -0
  526. package/src/audit/record.ts +180 -0
  527. package/src/audit/redact.ts +109 -0
  528. package/src/audit/store.ts +346 -0
  529. package/src/audit/types.ts +141 -0
  530. package/src/automation/index.ts +802 -0
  531. package/src/brand-kit/brand-signals.ts +124 -0
  532. package/src/brand-kit/fig/index.ts +64 -0
  533. package/src/brand-kit/index.ts +72 -0
  534. package/src/brand-kit/types.ts +113 -0
  535. package/src/browser-sessions/actions.ts +302 -0
  536. package/src/browser-sessions/routes.ts +234 -0
  537. package/src/browser-sessions/store.ts +679 -0
  538. package/src/browser-sessions/types.ts +84 -0
  539. package/src/changelog/parse.ts +328 -0
  540. package/src/chat-threads/emitter.ts +22 -0
  541. package/src/chat-threads/schema.ts +43 -0
  542. package/src/chat-threads/store.ts +1311 -0
  543. package/src/checkpoints/index.ts +15 -0
  544. package/src/checkpoints/service.ts +142 -0
  545. package/src/checkpoints/store.ts +153 -0
  546. package/src/cli/add.ts +425 -0
  547. package/src/cli/agent.ts +424 -0
  548. package/src/cli/agents.ts +122 -0
  549. package/src/cli/app-skill.ts +1455 -0
  550. package/src/cli/atomic-json-file.ts +324 -0
  551. package/src/cli/audit-agent-web.ts +324 -0
  552. package/src/cli/changelog.ts +199 -0
  553. package/src/cli/claude-code-participant.ts +515 -0
  554. package/src/cli/code-agent-commands.ts +270 -0
  555. package/src/cli/code-agent-connector.ts +1109 -0
  556. package/src/cli/code-agent-executor.ts +1970 -0
  557. package/src/cli/code-agent-output-smoother.ts +140 -0
  558. package/src/cli/code-agent-runs.concurrent-worker.ts +33 -0
  559. package/src/cli/code-agent-runs.ts +548 -0
  560. package/src/cli/code.ts +1805 -0
  561. package/src/cli/codex-cli-participant.ts +496 -0
  562. package/src/cli/connect.ts +2714 -0
  563. package/src/cli/content-local.ts +442 -0
  564. package/src/cli/context-xray-local.ts +2193 -0
  565. package/src/cli/create-workspace.ts +30 -0
  566. package/src/cli/create.ts +2247 -0
  567. package/src/cli/deploy-build.ts +50 -0
  568. package/src/cli/design-connect.ts +3187 -0
  569. package/src/cli/doctor.ts +472 -0
  570. package/src/cli/eject.ts +1594 -0
  571. package/src/cli/eval.ts +134 -0
  572. package/src/cli/gateway-helpers.ts +70 -0
  573. package/src/cli/index.ts +1217 -0
  574. package/src/cli/info.ts +105 -0
  575. package/src/cli/invoke.ts +288 -0
  576. package/src/cli/mcp-config-writers.ts +857 -0
  577. package/src/cli/mcp.ts +594 -0
  578. package/src/cli/migrate.ts +1813 -0
  579. package/src/cli/migration-codemod.ts +646 -0
  580. package/src/cli/multi-frontier-runs.ts +1952 -0
  581. package/src/cli/package-lifecycle.ts +823 -0
  582. package/src/cli/plan-blocks.ts +143 -0
  583. package/src/cli/plan-local.ts +3189 -0
  584. package/src/cli/plan-publish-store.ts +138 -0
  585. package/src/cli/pr-visual-recap-workflow.ts +2 -0
  586. package/src/cli/recap.ts +5 -0
  587. package/src/cli/setup-agents.ts +120 -0
  588. package/src/cli/skills-content/assets-skill.ts +83 -0
  589. package/src/cli/skills-content/canvas.ts +153 -0
  590. package/src/cli/skills-content/connection.ts +52 -0
  591. package/src/cli/skills-content/content-skill.ts +120 -0
  592. package/src/cli/skills-content/design-exploration-skill.ts +118 -0
  593. package/src/cli/skills-content/design-visual-edit-skill.ts +228 -0
  594. package/src/cli/skills-content/document-quality.ts +196 -0
  595. package/src/cli/skills-content/exemplar.ts +69 -0
  596. package/src/cli/skills-content/help.ts +77 -0
  597. package/src/cli/skills-content/index.ts +22 -0
  598. package/src/cli/skills-content/local-files.ts +100 -0
  599. package/src/cli/skills-content/plan-setup-auth.ts +80 -0
  600. package/src/cli/skills-content/visual-plan-skill.ts +493 -0
  601. package/src/cli/skills-content/visual-recap-skill.ts +553 -0
  602. package/src/cli/skills-content/visualize-repo-skill.ts +93 -0
  603. package/src/cli/skills-content/wireframe.ts +349 -0
  604. package/src/cli/skills.ts +4340 -0
  605. package/src/cli/sync-builder-starter-manifest.ts +631 -0
  606. package/src/cli/telemetry.ts +136 -0
  607. package/src/cli/templates-meta.ts +269 -0
  608. package/src/cli/upgrade.ts +956 -0
  609. package/src/cli/visualize-repo.ts +715 -0
  610. package/src/cli/workspace-dev.ts +1486 -0
  611. package/src/cli/workspacify.ts +258 -0
  612. package/src/client/AgentAskPopover.tsx +89 -0
  613. package/src/client/AgentChatHome.tsx +66 -0
  614. package/src/client/AgentNative.tsx +161 -0
  615. package/src/client/AgentNativeEmbedded.tsx +288 -0
  616. package/src/client/AgentNativeFrame.tsx +151 -0
  617. package/src/client/AgentPanel.tsx +3437 -0
  618. package/src/client/AgentTaskCard.tsx +273 -0
  619. package/src/client/AppearancePicker.tsx +79 -0
  620. package/src/client/AssistantChat.tsx +5793 -0
  621. package/src/client/ClientOnly.tsx +22 -0
  622. package/src/client/CommandMenu.tsx +726 -0
  623. package/src/client/ConnectBuilderCard.tsx +390 -0
  624. package/src/client/DefaultSpinner.tsx +47 -0
  625. package/src/client/ErrorBoundary.tsx +359 -0
  626. package/src/client/ErrorReportActions.tsx +69 -0
  627. package/src/client/FeedbackButton.tsx +553 -0
  628. package/src/client/HighlightedCodeBlock.tsx +173 -0
  629. package/src/client/IframeEmbed.tsx +151 -0
  630. package/src/client/KeepTabOpenNotice.tsx +181 -0
  631. package/src/client/MultiTabAssistantChat.tsx +2576 -0
  632. package/src/client/NewWorkspaceAppFlow.tsx +525 -0
  633. package/src/client/PoweredByBadge.tsx +284 -0
  634. package/src/client/RunStuckBanner.tsx +431 -0
  635. package/src/client/StarfieldBackground.tsx +466 -0
  636. package/src/client/Turnstile.tsx +125 -0
  637. package/src/client/active-run-state.ts +139 -0
  638. package/src/client/agent-chat/index.ts +279 -0
  639. package/src/client/agent-chat-adapter.ts +3692 -0
  640. package/src/client/agent-chat.ts +1233 -0
  641. package/src/client/agent-engine-key.ts +122 -0
  642. package/src/client/agent-page/AgentContextTab.tsx +487 -0
  643. package/src/client/agent-page/AgentEmptyState.tsx +44 -0
  644. package/src/client/agent-page/AgentJobsTab.tsx +441 -0
  645. package/src/client/agent-page/AgentTabFrame.tsx +39 -0
  646. package/src/client/agent-page/AgentTabsPage.tsx +1096 -0
  647. package/src/client/agent-page/types.ts +18 -0
  648. package/src/client/agent-page/use-jobs.ts +150 -0
  649. package/src/client/agent-sidebar-state.ts +166 -0
  650. package/src/client/analytics/index.ts +40 -0
  651. package/src/client/analytics-session.ts +70 -0
  652. package/src/client/analytics.ts +1757 -0
  653. package/src/client/api-path.ts +124 -0
  654. package/src/client/app-providers.tsx +230 -0
  655. package/src/client/appearance.ts +130 -0
  656. package/src/client/application-state.ts +154 -0
  657. package/src/client/assistant-ui-recovery.tsx +205 -0
  658. package/src/client/automation/index.ts +4 -0
  659. package/src/client/automation.ts +22 -0
  660. package/src/client/blocks/AiEditableField.tsx +30 -0
  661. package/src/client/blocks/BlockView.tsx +145 -0
  662. package/src/client/blocks/RegistryBlockDataProvider.tsx +121 -0
  663. package/src/client/blocks/SchemaBlockEditor.tsx +457 -0
  664. package/src/client/blocks/agent.ts +95 -0
  665. package/src/client/blocks/code-block-direction.ts +21 -0
  666. package/src/client/blocks/index.ts +308 -0
  667. package/src/client/blocks/library/AnnotatedCodeBlock.tsx +710 -0
  668. package/src/client/blocks/library/ApiEndpointBlock.tsx +1120 -0
  669. package/src/client/blocks/library/DataModelBlock.tsx +775 -0
  670. package/src/client/blocks/library/DiffBlock.tsx +1854 -0
  671. package/src/client/blocks/library/FileTreeBlock.tsx +868 -0
  672. package/src/client/blocks/library/HighlightedCode.tsx +260 -0
  673. package/src/client/blocks/library/JsonExplorerBlock.tsx +608 -0
  674. package/src/client/blocks/library/MermaidBlock.tsx +362 -0
  675. package/src/client/blocks/library/OpenApiSpecBlock.tsx +998 -0
  676. package/src/client/blocks/library/annotated-code.config.ts +101 -0
  677. package/src/client/blocks/library/annotation-rail.tsx +1020 -0
  678. package/src/client/blocks/library/api-endpoint.config.ts +207 -0
  679. package/src/client/blocks/library/block-copy.ts +399 -0
  680. package/src/client/blocks/library/callout.config.ts +57 -0
  681. package/src/client/blocks/library/callout.tsx +149 -0
  682. package/src/client/blocks/library/checklist.config.ts +56 -0
  683. package/src/client/blocks/library/checklist.tsx +208 -0
  684. package/src/client/blocks/library/code-filename-label.tsx +59 -0
  685. package/src/client/blocks/library/code-highlight.tsx +178 -0
  686. package/src/client/blocks/library/code-tabs.config.ts +70 -0
  687. package/src/client/blocks/library/code-tabs.tsx +606 -0
  688. package/src/client/blocks/library/code.config.ts +69 -0
  689. package/src/client/blocks/library/code.tsx +440 -0
  690. package/src/client/blocks/library/columns.config.ts +85 -0
  691. package/src/client/blocks/library/columns.tsx +334 -0
  692. package/src/client/blocks/library/data-model.config.ts +152 -0
  693. package/src/client/blocks/library/dev-doc-ui.tsx +191 -0
  694. package/src/client/blocks/library/diagram.config.ts +222 -0
  695. package/src/client/blocks/library/diagram.tsx +958 -0
  696. package/src/client/blocks/library/diff.config.ts +115 -0
  697. package/src/client/blocks/library/file-tree.config.ts +92 -0
  698. package/src/client/blocks/library/html.config.ts +79 -0
  699. package/src/client/blocks/library/html.tsx +258 -0
  700. package/src/client/blocks/library/json-explorer.config.ts +74 -0
  701. package/src/client/blocks/library/mermaid.config.ts +49 -0
  702. package/src/client/blocks/library/narrow-container.tsx +37 -0
  703. package/src/client/blocks/library/openapi-spec.config.ts +66 -0
  704. package/src/client/blocks/library/question-form.config.ts +127 -0
  705. package/src/client/blocks/library/question-form.tsx +944 -0
  706. package/src/client/blocks/library/sanitize-html.ts +343 -0
  707. package/src/client/blocks/library/server-specs.ts +338 -0
  708. package/src/client/blocks/library/specs.tsx +308 -0
  709. package/src/client/blocks/library/table.config.ts +61 -0
  710. package/src/client/blocks/library/table.tsx +449 -0
  711. package/src/client/blocks/library/tabs.config.ts +96 -0
  712. package/src/client/blocks/library/tabs.tsx +665 -0
  713. package/src/client/blocks/library/wireframe-icons.ts +210 -0
  714. package/src/client/blocks/library/wireframe-kit.tsx +1850 -0
  715. package/src/client/blocks/library/wireframe.config.ts +539 -0
  716. package/src/client/blocks/library/wireframe.tsx +535 -0
  717. package/src/client/blocks/mdx.ts +364 -0
  718. package/src/client/blocks/provider.tsx +51 -0
  719. package/src/client/blocks/registry.ts +83 -0
  720. package/src/client/blocks/schema-form/introspect.ts +201 -0
  721. package/src/client/blocks/server.ts +170 -0
  722. package/src/client/blocks/types.ts +415 -0
  723. package/src/client/browser-session-bridge.ts +548 -0
  724. package/src/client/browser-tab-id.ts +36 -0
  725. package/src/client/build-compatibility.ts +77 -0
  726. package/src/client/builder-frame.ts +194 -0
  727. package/src/client/builder-mark.tsx +21 -0
  728. package/src/client/changelog/Changelog.tsx +333 -0
  729. package/src/client/changelog/index.ts +1 -0
  730. package/src/client/chat/ChatHistoryList.tsx +7 -0
  731. package/src/client/chat/attachment-adapters.ts +426 -0
  732. package/src/client/chat/connectors.ts +1579 -0
  733. package/src/client/chat/index.ts +160 -0
  734. package/src/client/chat/markdown-renderer.tsx +693 -0
  735. package/src/client/chat/message-components.tsx +1326 -0
  736. package/src/client/chat/repo-helpers.ts +281 -0
  737. package/src/client/chat/run-recovery.tsx +994 -0
  738. package/src/client/chat/runtime.ts +1810 -0
  739. package/src/client/chat/tool-call-display.tsx +1270 -0
  740. package/src/client/chat/tool-render-registry.tsx +144 -0
  741. package/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  742. package/src/client/chat/use-reconnect-reader-owner.ts +28 -0
  743. package/src/client/chat/widgets/DataChartRenderer.tsx +242 -0
  744. package/src/client/chat/widgets/DataChartWidget.tsx +51 -0
  745. package/src/client/chat/widgets/DataInsightsWidget.tsx +59 -0
  746. package/src/client/chat/widgets/DataTableWidget.tsx +240 -0
  747. package/src/client/chat/widgets/InlineExtensionWidget.tsx +60 -0
  748. package/src/client/chat/widgets/builtin-tool-renderers.tsx +213 -0
  749. package/src/client/chat/widgets/data-widget-types.ts +1 -0
  750. package/src/client/chat/widgets/inline-extension-result.ts +86 -0
  751. package/src/client/chat-model-groups.ts +171 -0
  752. package/src/client/chat-thread-url.ts +11 -0
  753. package/src/client/chat-view-transition.ts +213 -0
  754. package/src/client/client-action.ts +21 -0
  755. package/src/client/client-bootstrap.ts +7 -0
  756. package/src/client/client-surface.ts +41 -0
  757. package/src/client/clipboard.ts +89 -0
  758. package/src/client/code-agent-chat-adapter.ts +537 -0
  759. package/src/client/collab/index.ts +60 -0
  760. package/src/client/command-navigation/index.ts +15 -0
  761. package/src/client/comments-review/index.ts +1 -0
  762. package/src/client/components/AgentPresenceChip.tsx +4 -0
  763. package/src/client/components/ApiKeySettings.tsx +309 -0
  764. package/src/client/components/CodeAgentIndicator.tsx +59 -0
  765. package/src/client/components/CodeRequiredDialog.tsx +470 -0
  766. package/src/client/components/LiveCursorOverlay.tsx +5 -0
  767. package/src/client/components/MissingKeyCard.tsx +61 -0
  768. package/src/client/components/PresenceBar.tsx +4 -0
  769. package/src/client/components/RecentEditHighlights.tsx +4 -0
  770. package/src/client/components/RemoteSelectionRings.tsx +5 -0
  771. package/src/client/components/icons/AgentNativeIcon.tsx +46 -0
  772. package/src/client/components/ui/dialog.tsx +1 -0
  773. package/src/client/components/ui/dropdown-menu.tsx +1 -0
  774. package/src/client/components/ui/hover-card.tsx +1 -0
  775. package/src/client/components/ui/message-scroller.tsx +131 -0
  776. package/src/client/components/ui/popover.tsx +1 -0
  777. package/src/client/components/ui/sheet.tsx +1 -0
  778. package/src/client/components/ui/tooltip.tsx +1 -0
  779. package/src/client/composer/index.ts +11 -0
  780. package/src/client/composer/runtime-adapters.tsx +123 -0
  781. package/src/client/composer/use-mention-search.ts +7 -0
  782. package/src/client/composer/wired-components.tsx +53 -0
  783. package/src/client/context-xray/ContextMeter.tsx +124 -0
  784. package/src/client/context-xray/ContextSegmentRow.tsx +27 -0
  785. package/src/client/context-xray/ContextTreemap.tsx +24 -0
  786. package/src/client/context-xray/ContextXRayPanel.tsx +59 -0
  787. package/src/client/context-xray/SegmentProvenancePopover.tsx +18 -0
  788. package/src/client/context-xray/format.ts +27 -0
  789. package/src/client/conversation/AgentConversation.tsx +555 -0
  790. package/src/client/conversation/code-agent-transcript.ts +283 -0
  791. package/src/client/conversation/index.ts +22 -0
  792. package/src/client/conversation/types.ts +85 -0
  793. package/src/client/conversation/use-near-bottom-autoscroll.ts +278 -0
  794. package/src/client/create-query-client.ts +86 -0
  795. package/src/client/db-admin/DataGrid.tsx +551 -0
  796. package/src/client/db-admin/DbAdminPage.tsx +218 -0
  797. package/src/client/db-admin/DevDatabaseLink.tsx +16 -0
  798. package/src/client/db-admin/EditableCell.tsx +451 -0
  799. package/src/client/db-admin/FilterBar.tsx +203 -0
  800. package/src/client/db-admin/ResultsGrid.tsx +114 -0
  801. package/src/client/db-admin/RowSidePanel.tsx +337 -0
  802. package/src/client/db-admin/SqlEditor.tsx +840 -0
  803. package/src/client/db-admin/TableBrowser.tsx +212 -0
  804. package/src/client/db-admin/TableEditor.tsx +760 -0
  805. package/src/client/db-admin/cell-format.ts +246 -0
  806. package/src/client/db-admin/changeset.ts +296 -0
  807. package/src/client/db-admin/export-utils.ts +78 -0
  808. package/src/client/db-admin/index.ts +33 -0
  809. package/src/client/db-admin/sql-storage.ts +134 -0
  810. package/src/client/db-admin/storage.ts +68 -0
  811. package/src/client/db-admin/useAgentSync.ts +226 -0
  812. package/src/client/db-admin/useDbAdmin.ts +294 -0
  813. package/src/client/dev-overlay/DevOverlay.tsx +576 -0
  814. package/src/client/dev-overlay/builtins.ts +40 -0
  815. package/src/client/dev-overlay/index.ts +23 -0
  816. package/src/client/dev-overlay/registry.ts +67 -0
  817. package/src/client/dev-overlay/types.ts +64 -0
  818. package/src/client/dev-overlay/use-dev-option.ts +78 -0
  819. package/src/client/dev-overlay/use-dev-overlay-shortcut.ts +31 -0
  820. package/src/client/dynamic-suggestions.ts +455 -0
  821. package/src/client/embed-auth.ts +544 -0
  822. package/src/client/embed.ts +54 -0
  823. package/src/client/error-capture.ts +690 -0
  824. package/src/client/error-format.ts +211 -0
  825. package/src/client/error-reporting.ts +100 -0
  826. package/src/client/extensions/AgentNativeExtensionFrame.e2e-host.tsx +136 -0
  827. package/src/client/extensions/AgentNativeExtensionFrame.tsx +708 -0
  828. package/src/client/extensions/EmbeddedExtension.tsx +604 -0
  829. package/src/client/extensions/ExtensionEditor.tsx +450 -0
  830. package/src/client/extensions/ExtensionQueryErrorState.tsx +47 -0
  831. package/src/client/extensions/ExtensionSlot.tsx +345 -0
  832. package/src/client/extensions/ExtensionViewer.tsx +1502 -0
  833. package/src/client/extensions/ExtensionViewerPage.tsx +32 -0
  834. package/src/client/extensions/ExtensionsListPage.tsx +432 -0
  835. package/src/client/extensions/ExtensionsSidebarSection.tsx +1259 -0
  836. package/src/client/extensions/InlineExtensionFrame.tsx +660 -0
  837. package/src/client/extensions/agent-native-extension-runtime.ts +495 -0
  838. package/src/client/extensions/delete-extension.ts +76 -0
  839. package/src/client/extensions/extension-load-error.ts +26 -0
  840. package/src/client/extensions/extension-order.ts +49 -0
  841. package/src/client/extensions/extension-popularity.ts +61 -0
  842. package/src/client/extensions/iframe-bridge.ts +377 -0
  843. package/src/client/extensions/index.ts +84 -0
  844. package/src/client/extensions/portable-extension.ts +712 -0
  845. package/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  846. package/src/client/feature-flags/helpers.ts +77 -0
  847. package/src/client/feature-flags/index.ts +13 -0
  848. package/src/client/feature-flags/types.ts +29 -0
  849. package/src/client/feature-flags/use-feature-flag.ts +26 -0
  850. package/src/client/feedback-context.ts +90 -0
  851. package/src/client/frame-protocol.ts +168 -0
  852. package/src/client/frame.ts +329 -0
  853. package/src/client/guided-questions.tsx +1152 -0
  854. package/src/client/history/VersionHistoryPanel.tsx +175 -0
  855. package/src/client/history/index.ts +21 -0
  856. package/src/client/history/use-history.ts +114 -0
  857. package/src/client/hooks/index.ts +46 -0
  858. package/src/client/host/index.ts +170 -0
  859. package/src/client/host-bridge.ts +1272 -0
  860. package/src/client/host-tools.ts +190 -0
  861. package/src/client/i18n.tsx +798 -0
  862. package/src/client/index.ts +370 -0
  863. package/src/client/integrations/IntegrationCard.tsx +186 -0
  864. package/src/client/integrations/IntegrationsPanel.tsx +633 -0
  865. package/src/client/integrations/api.ts +295 -0
  866. package/src/client/integrations/index.ts +29 -0
  867. package/src/client/integrations/useIntegrationStatus.ts +52 -0
  868. package/src/client/mcp-app-host.ts +720 -0
  869. package/src/client/mcp-apps/McpAppRenderer.tsx +760 -0
  870. package/src/client/navigation/index.ts +54 -0
  871. package/src/client/notifications/NotificationsBell.tsx +383 -0
  872. package/src/client/notifications/index.ts +1 -0
  873. package/src/client/observability/ObservabilityDashboard.tsx +890 -0
  874. package/src/client/observability/ThumbsFeedback.tsx +160 -0
  875. package/src/client/observability/index.ts +20 -0
  876. package/src/client/observability/useObservability.ts +266 -0
  877. package/src/client/onboarding/OnboardingBanner.tsx +73 -0
  878. package/src/client/onboarding/OnboardingPanel.tsx +1036 -0
  879. package/src/client/onboarding/SetupButton.tsx +64 -0
  880. package/src/client/onboarding/index.ts +25 -0
  881. package/src/client/onboarding/use-onboarding.ts +164 -0
  882. package/src/client/onboarding/use-preview-mode.ts +40 -0
  883. package/src/client/org/InvitationBanner.tsx +148 -0
  884. package/src/client/org/OrgSwitcher.tsx +754 -0
  885. package/src/client/org/RequireActiveOrg.tsx +337 -0
  886. package/src/client/org/TeamPage.tsx +1432 -0
  887. package/src/client/org/hooks.ts +359 -0
  888. package/src/client/org/index.ts +70 -0
  889. package/src/client/org/workspace-app-links.ts +367 -0
  890. package/src/client/org-team/index.ts +1 -0
  891. package/src/client/progress/RunsTray.tsx +680 -0
  892. package/src/client/progress/index.ts +1 -0
  893. package/src/client/require-session.tsx +142 -0
  894. package/src/client/resources/BuiltinCapabilityDetail.tsx +258 -0
  895. package/src/client/resources/McpConnectionSuggestion.tsx +276 -0
  896. package/src/client/resources/McpIntegrationDialog.tsx +808 -0
  897. package/src/client/resources/McpServerDetail.tsx +230 -0
  898. package/src/client/resources/ResourceEditor.tsx +872 -0
  899. package/src/client/resources/ResourceTree.tsx +860 -0
  900. package/src/client/resources/ResourcesPanel.tsx +1960 -0
  901. package/src/client/resources/index.ts +25 -0
  902. package/src/client/resources/mcp-integration-catalog.ts +771 -0
  903. package/src/client/resources/mcp-integration-logos.ts +108 -0
  904. package/src/client/resources/runtime.ts +1 -0
  905. package/src/client/resources/use-builtin-capabilities.ts +113 -0
  906. package/src/client/resources/use-mcp-servers.ts +217 -0
  907. package/src/client/resources/use-resources.ts +402 -0
  908. package/src/client/review/ReviewCommentComposer.tsx +123 -0
  909. package/src/client/review/ReviewStatusBadge.tsx +39 -0
  910. package/src/client/review/ReviewThreadPanel.tsx +625 -0
  911. package/src/client/review/index.ts +38 -0
  912. package/src/client/review/use-review.ts +186 -0
  913. package/src/client/route-chunk-recovery/index.ts +2 -0
  914. package/src/client/route-chunk-recovery.ts +331 -0
  915. package/src/client/route-state.ts +455 -0
  916. package/src/client/route-warmup.tsx +543 -0
  917. package/src/client/session-replay-iframe.e2e-host.tsx +100 -0
  918. package/src/client/session-replay.ts +3417 -0
  919. package/src/client/settings/AgentsSection.tsx +441 -0
  920. package/src/client/settings/AutomationsSection.tsx +516 -0
  921. package/src/client/settings/BackgroundAgentSection.tsx +189 -0
  922. package/src/client/settings/BrowserSection.tsx +110 -0
  923. package/src/client/settings/DemoModeSection.tsx +48 -0
  924. package/src/client/settings/SecretsSection.tsx +875 -0
  925. package/src/client/settings/SettingsPanel.tsx +3162 -0
  926. package/src/client/settings/SettingsSection.tsx +283 -0
  927. package/src/client/settings/SettingsTabsPage.tsx +592 -0
  928. package/src/client/settings/UsageSection.tsx +401 -0
  929. package/src/client/settings/VoiceTranscriptionSection.tsx +960 -0
  930. package/src/client/settings/agent-settings-search.ts +220 -0
  931. package/src/client/settings/index.ts +27 -0
  932. package/src/client/settings/useBuilderStatus.ts +1055 -0
  933. package/src/client/setup-connections/BuilderConnectCard.tsx +89 -0
  934. package/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
  935. package/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
  936. package/src/client/setup-connections/catalog.ts +6 -0
  937. package/src/client/setup-connections/index.ts +47 -0
  938. package/src/client/setup-connections/runtime.ts +1 -0
  939. package/src/client/sharing/ShareButton.tsx +1748 -0
  940. package/src/client/sharing/ShareDialog.tsx +846 -0
  941. package/src/client/sharing/VisibilityBadge.tsx +4 -0
  942. package/src/client/sharing/index.ts +2 -0
  943. package/src/client/sse-event-processor.ts +2002 -0
  944. package/src/client/terminal/AgentTerminal.tsx +488 -0
  945. package/src/client/terminal/index.ts +7 -0
  946. package/src/client/theme.ts +27 -0
  947. package/src/client/tombstone/agent-presence-chip.ts +17 -0
  948. package/src/client/tombstone/editor.ts +265 -0
  949. package/src/client/tombstone/live-cursor-overlay.ts +21 -0
  950. package/src/client/tombstone/presence-bar.ts +17 -0
  951. package/src/client/tombstone/recent-edit-highlights.ts +17 -0
  952. package/src/client/tombstone/remote-selection-rings.ts +21 -0
  953. package/src/client/tombstone/rich-markdown-editor.ts +265 -0
  954. package/src/client/tombstone/ui-dialog.ts +49 -0
  955. package/src/client/tombstone/ui-dropdown-menu.ts +69 -0
  956. package/src/client/tombstone/ui-hover-card.ts +21 -0
  957. package/src/client/tombstone/ui-popover.ts +25 -0
  958. package/src/client/tombstone/ui-sheet.ts +49 -0
  959. package/src/client/tombstone/ui-tooltip.ts +29 -0
  960. package/src/client/tombstone/visual-style-controls.ts +61 -0
  961. package/src/client/tool-cells/BashCell.tsx +164 -0
  962. package/src/client/tool-cells/EditCell.tsx +303 -0
  963. package/src/client/tool-cells/FilesChangedSummary.tsx +208 -0
  964. package/src/client/tool-cells/WriteCell.tsx +145 -0
  965. package/src/client/tool-cells/index.ts +7 -0
  966. package/src/client/tool-display.ts +41 -0
  967. package/src/client/track.ts +57 -0
  968. package/src/client/transcription/BuilderTranscriptionCta.tsx +120 -0
  969. package/src/client/transcription/use-live-transcription.ts +292 -0
  970. package/src/client/ui/index.ts +55 -0
  971. package/src/client/uploads/index.ts +6 -0
  972. package/src/client/uploads/upload-editor-image.ts +79 -0
  973. package/src/client/uploads/use-upload-resource.ts +24 -0
  974. package/src/client/url-scrub.ts +51 -0
  975. package/src/client/use-action.ts +797 -0
  976. package/src/client/use-agent-chat-context.ts +63 -0
  977. package/src/client/use-agent-chat-home-handoff.ts +207 -0
  978. package/src/client/use-agent-chat.ts +53 -0
  979. package/src/client/use-agent-engine-configured.ts +211 -0
  980. package/src/client/use-avatar.ts +127 -0
  981. package/src/client/use-change-version.ts +150 -0
  982. package/src/client/use-chat-models.ts +252 -0
  983. package/src/client/use-chat-threads.ts +1262 -0
  984. package/src/client/use-db-sync.ts +1112 -0
  985. package/src/client/use-demo-mode-status.ts +30 -0
  986. package/src/client/use-dev-mode.ts +177 -0
  987. package/src/client/use-external-value.ts +40 -0
  988. package/src/client/use-pausing-interval.ts +65 -0
  989. package/src/client/use-pinch-zoom.ts +202 -0
  990. package/src/client/use-run-stuck-detection.ts +427 -0
  991. package/src/client/use-send-to-agent-chat.ts +85 -0
  992. package/src/client/use-session.ts +114 -0
  993. package/src/client/utils.ts +7 -0
  994. package/src/client/visual-style-controls.tsx +1 -0
  995. package/src/client/vite-dev-recovery-script.ts +226 -0
  996. package/src/client/voice-provider-status.ts +44 -0
  997. package/src/client/widgets/index.ts +41 -0
  998. package/src/code-agents/background-controller.ts +398 -0
  999. package/src/code-agents/background-run.ts +156 -0
  1000. package/src/code-agents/index.ts +95 -0
  1001. package/src/code-agents/prompt-attachments.ts +39 -0
  1002. package/src/code-agents/transcript-normalizer.ts +750 -0
  1003. package/src/code-agents/transcript-order.ts +73 -0
  1004. package/src/coding-tools/index.ts +742 -0
  1005. package/src/coding-tools/run-code.ts +1662 -0
  1006. package/src/coding-tools/sandbox/adapter.ts +82 -0
  1007. package/src/coding-tools/sandbox/background.ts +406 -0
  1008. package/src/coding-tools/sandbox/executions-store.ts +517 -0
  1009. package/src/coding-tools/sandbox/index.ts +132 -0
  1010. package/src/coding-tools/sandbox/local-child-process-adapter.ts +217 -0
  1011. package/src/collab/agent-identity.ts +5 -0
  1012. package/src/collab/agent-presence.ts +341 -0
  1013. package/src/collab/awareness-store.ts +196 -0
  1014. package/src/collab/awareness.ts +317 -0
  1015. package/src/collab/client-struct.ts +366 -0
  1016. package/src/collab/client.ts +1205 -0
  1017. package/src/collab/emitter.ts +31 -0
  1018. package/src/collab/follow-mode.ts +107 -0
  1019. package/src/collab/index.ts +151 -0
  1020. package/src/collab/json-to-yjs.ts +504 -0
  1021. package/src/collab/presence.ts +207 -0
  1022. package/src/collab/recent-edits.ts +215 -0
  1023. package/src/collab/routes.ts +191 -0
  1024. package/src/collab/storage.ts +228 -0
  1025. package/src/collab/struct-routes.ts +133 -0
  1026. package/src/collab/text-to-yjs.ts +79 -0
  1027. package/src/collab/undo.ts +432 -0
  1028. package/src/collab/xml-ops.ts +68 -0
  1029. package/src/collab/ydoc-manager.ts +544 -0
  1030. package/src/command-navigation/actions.ts +100 -0
  1031. package/src/command-navigation/index.ts +12 -0
  1032. package/src/comments-review/index.ts +1 -0
  1033. package/src/connections/catalog.ts +451 -0
  1034. package/src/connections/index.ts +48 -0
  1035. package/src/connections/reader.ts +911 -0
  1036. package/src/connections/runtime.ts +1 -0
  1037. package/src/credentials/index.ts +187 -0
  1038. package/src/data-programs/actions.ts +335 -0
  1039. package/src/data-programs/contract.ts +284 -0
  1040. package/src/data-programs/execute.ts +693 -0
  1041. package/src/data-programs/index.ts +72 -0
  1042. package/src/data-programs/schema.ts +148 -0
  1043. package/src/data-programs/store.ts +755 -0
  1044. package/src/data-widgets/index.ts +376 -0
  1045. package/src/db/client.ts +1627 -0
  1046. package/src/db/create-get-db.ts +579 -0
  1047. package/src/db/ddl-guard.ts +302 -0
  1048. package/src/db/drizzle-config.ts +190 -0
  1049. package/src/db/ensure-additive-columns.ts +430 -0
  1050. package/src/db/index.ts +57 -0
  1051. package/src/db/migrations.ts +691 -0
  1052. package/src/db/request-telemetry.ts +154 -0
  1053. package/src/db/runtime-diagnostics.ts +331 -0
  1054. package/src/db/schema.ts +121 -0
  1055. package/src/db/widen-columns.ts +75 -0
  1056. package/src/db-admin/agent-tools.ts +202 -0
  1057. package/src/db-admin/index.ts +26 -0
  1058. package/src/db-admin/operations.ts +803 -0
  1059. package/src/db-admin/routes.ts +174 -0
  1060. package/src/db-admin/types.ts +110 -0
  1061. package/src/demo/browser-state.ts +47 -0
  1062. package/src/demo/fetch-interceptor.ts +175 -0
  1063. package/src/demo/redact.ts +575 -0
  1064. package/src/deploy/build.ts +3938 -0
  1065. package/src/deploy/immutable-assets.ts +65 -0
  1066. package/src/deploy/route-discovery.ts +458 -0
  1067. package/src/deploy/workspace-core.ts +282 -0
  1068. package/src/deploy/workspace-deploy.ts +1488 -0
  1069. package/src/eject/provider-api-definitions.ts +193 -0
  1070. package/src/eject/remote-mcp-presets.ts +137 -0
  1071. package/src/eject/setup-readiness-ui.tsx +29 -0
  1072. package/src/eject/workspace-connections.ts +92 -0
  1073. package/src/embedding/agent.ts +159 -0
  1074. package/src/embedding/bridge.ts +297 -0
  1075. package/src/embedding/index.ts +43 -0
  1076. package/src/embedding/protocol.ts +185 -0
  1077. package/src/embedding/react.tsx +319 -0
  1078. package/src/embeddings/index.ts +233 -0
  1079. package/src/eval/agent-runner.ts +210 -0
  1080. package/src/eval/define-eval.ts +55 -0
  1081. package/src/eval/index.ts +49 -0
  1082. package/src/eval/report.ts +75 -0
  1083. package/src/eval/runner.ts +369 -0
  1084. package/src/eval/scorer.ts +244 -0
  1085. package/src/eval/types.ts +188 -0
  1086. package/src/event-bus/bus.ts +140 -0
  1087. package/src/event-bus/index.ts +3 -0
  1088. package/src/event-bus/registry.ts +79 -0
  1089. package/src/event-bus/types.ts +29 -0
  1090. package/src/extensions/actions.ts +1636 -0
  1091. package/src/extensions/change-marker.ts +54 -0
  1092. package/src/extensions/content-patch.ts +468 -0
  1093. package/src/extensions/fetch-tool.ts +461 -0
  1094. package/src/extensions/html-shell.ts +803 -0
  1095. package/src/extensions/local.ts +462 -0
  1096. package/src/extensions/path.ts +40 -0
  1097. package/src/extensions/proxy-security.ts +171 -0
  1098. package/src/extensions/routes.ts +1080 -0
  1099. package/src/extensions/schema.ts +269 -0
  1100. package/src/extensions/session-replay-iframe.ts +131 -0
  1101. package/src/extensions/slots/routes.ts +126 -0
  1102. package/src/extensions/slots/schema.ts +87 -0
  1103. package/src/extensions/slots/store.ts +450 -0
  1104. package/src/extensions/store.ts +1347 -0
  1105. package/src/extensions/theme.ts +114 -0
  1106. package/src/extensions/url-safety.ts +316 -0
  1107. package/src/extensions/web-content.ts +663 -0
  1108. package/src/extensions/web-search-tool.ts +437 -0
  1109. package/src/feature-flags/a2a-action-route.ts +56 -0
  1110. package/src/feature-flags/actions/get-feature-flags.ts +24 -0
  1111. package/src/feature-flags/actions/list-feature-flags.ts +69 -0
  1112. package/src/feature-flags/actions/set-feature-flag.ts +89 -0
  1113. package/src/feature-flags/index.ts +21 -0
  1114. package/src/feature-flags/permissions.ts +53 -0
  1115. package/src/feature-flags/plugin.ts +44 -0
  1116. package/src/feature-flags/registry.ts +96 -0
  1117. package/src/feature-flags/store.ts +176 -0
  1118. package/src/file-upload/actions/upload-image.ts +213 -0
  1119. package/src/file-upload/builder.ts +431 -0
  1120. package/src/file-upload/index.ts +24 -0
  1121. package/src/file-upload/pre-upload-attachments.ts +305 -0
  1122. package/src/file-upload/registry.ts +125 -0
  1123. package/src/file-upload/types.ts +89 -0
  1124. package/src/guards/db-tool-scoping.ts +129 -0
  1125. package/src/guards/index.ts +23 -0
  1126. package/src/guards/no-drizzle-push.ts +116 -0
  1127. package/src/guards/no-env-credentials.ts +229 -0
  1128. package/src/guards/no-env-mutation.ts +114 -0
  1129. package/src/guards/no-localhost-fallback.ts +124 -0
  1130. package/src/guards/no-unscoped-credentials.ts +227 -0
  1131. package/src/guards/no-unscoped-queries.ts +834 -0
  1132. package/src/guards/scan-utils.ts +105 -0
  1133. package/src/guards/types.ts +30 -0
  1134. package/src/history/actions/create-resource-version.ts +92 -0
  1135. package/src/history/actions/get-resource-version.ts +60 -0
  1136. package/src/history/actions/list-resource-history.ts +53 -0
  1137. package/src/history/actions/list-resource-versions.ts +43 -0
  1138. package/src/history/actions/restore-resource-version.ts +96 -0
  1139. package/src/history/index.ts +26 -0
  1140. package/src/history/registry.ts +111 -0
  1141. package/src/history/store.ts +379 -0
  1142. package/src/history/types.ts +69 -0
  1143. package/src/index.browser.ts +155 -0
  1144. package/src/index.ts +408 -0
  1145. package/src/ingestion/docx.ts +158 -0
  1146. package/src/ingestion/figma-node-to-html.ts +1860 -0
  1147. package/src/ingestion/figma.ts +548 -0
  1148. package/src/ingestion/index.ts +107 -0
  1149. package/src/ingestion/media.ts +264 -0
  1150. package/src/ingestion/notion.ts +121 -0
  1151. package/src/ingestion/office.ts +213 -0
  1152. package/src/ingestion/orchestration.ts +160 -0
  1153. package/src/ingestion/pptx.ts +331 -0
  1154. package/src/ingestion/selection.ts +81 -0
  1155. package/src/ingestion/website.ts +151 -0
  1156. package/src/integrations/a2a-continuation-marker.ts +2 -0
  1157. package/src/integrations/a2a-continuation-processor.ts +888 -0
  1158. package/src/integrations/a2a-continuations-store.ts +643 -0
  1159. package/src/integrations/adapter-overrides.ts +12 -0
  1160. package/src/integrations/adapters/discord.ts +364 -0
  1161. package/src/integrations/adapters/email.ts +1164 -0
  1162. package/src/integrations/adapters/google-docs.ts +371 -0
  1163. package/src/integrations/adapters/index.ts +29 -0
  1164. package/src/integrations/adapters/microsoft-teams.ts +413 -0
  1165. package/src/integrations/adapters/slack.ts +1914 -0
  1166. package/src/integrations/adapters/telegram.ts +386 -0
  1167. package/src/integrations/adapters/whatsapp.ts +358 -0
  1168. package/src/integrations/awaiting-input-store.ts +130 -0
  1169. package/src/integrations/catalog.ts +571 -0
  1170. package/src/integrations/computer-supervision-store.ts +423 -0
  1171. package/src/integrations/computer-supervision.ts +213 -0
  1172. package/src/integrations/config-store.ts +131 -0
  1173. package/src/integrations/controls-store.ts +187 -0
  1174. package/src/integrations/eject/messaging-adapters.ts +85 -0
  1175. package/src/integrations/google-docs-poller.ts +671 -0
  1176. package/src/integrations/identity-links-store.ts +210 -0
  1177. package/src/integrations/identity.ts +196 -0
  1178. package/src/integrations/index.ts +220 -0
  1179. package/src/integrations/installations-store.ts +677 -0
  1180. package/src/integrations/integration-memory.ts +187 -0
  1181. package/src/integrations/internal-token.ts +106 -0
  1182. package/src/integrations/pending-tasks-retry-job.ts +286 -0
  1183. package/src/integrations/pending-tasks-store.ts +468 -0
  1184. package/src/integrations/plugin.ts +3048 -0
  1185. package/src/integrations/remote-commands-store.ts +690 -0
  1186. package/src/integrations/remote-devices-store.ts +492 -0
  1187. package/src/integrations/remote-json-safety.ts +127 -0
  1188. package/src/integrations/remote-push-delivery-job.ts +48 -0
  1189. package/src/integrations/remote-push-delivery.ts +370 -0
  1190. package/src/integrations/remote-push-store.ts +664 -0
  1191. package/src/integrations/remote-retry-job.ts +55 -0
  1192. package/src/integrations/remote-run-events-store.ts +222 -0
  1193. package/src/integrations/remote-types.ts +186 -0
  1194. package/src/integrations/runtime.ts +1 -0
  1195. package/src/integrations/scope-store.ts +498 -0
  1196. package/src/integrations/slack-manifest.ts +78 -0
  1197. package/src/integrations/slack-oauth.ts +344 -0
  1198. package/src/integrations/task-queue-stats.ts +144 -0
  1199. package/src/integrations/thread-mapping-store.ts +134 -0
  1200. package/src/integrations/types.ts +485 -0
  1201. package/src/integrations/usage-budget-store.ts +906 -0
  1202. package/src/integrations/webhook-delivery.ts +55 -0
  1203. package/src/integrations/webhook-handler.ts +1939 -0
  1204. package/src/jobs/actions/list-recurring-jobs.ts +105 -0
  1205. package/src/jobs/actions/manage-recurring-job.ts +85 -0
  1206. package/src/jobs/cron.ts +126 -0
  1207. package/src/jobs/index.ts +9 -0
  1208. package/src/jobs/scheduler.ts +703 -0
  1209. package/src/jobs/tools.ts +367 -0
  1210. package/src/local-artifacts/index.ts +1372 -0
  1211. package/src/localization/actions/get-localization-preference.ts +24 -0
  1212. package/src/localization/actions/set-localization-preference.ts +32 -0
  1213. package/src/localization/default-messages.ts +1009 -0
  1214. package/src/localization/index.ts +2 -0
  1215. package/src/localization/server.ts +131 -0
  1216. package/src/localization/shared.ts +208 -0
  1217. package/src/mcp/actions/call-mcp-tool.ts +19 -0
  1218. package/src/mcp/actions/create-org-service-token.ts +87 -0
  1219. package/src/mcp/actions/list-mcp-tools.ts +18 -0
  1220. package/src/mcp/actions/list-org-service-tokens.ts +44 -0
  1221. package/src/mcp/actions/revoke-org-service-token.ts +30 -0
  1222. package/src/mcp/actions/service-token-access.ts +121 -0
  1223. package/src/mcp/ask-app-inline-tasks.ts +125 -0
  1224. package/src/mcp/build-server.ts +2356 -0
  1225. package/src/mcp/builtin-tools.ts +1506 -0
  1226. package/src/mcp/connect-route.ts +1460 -0
  1227. package/src/mcp/connect-store.ts +680 -0
  1228. package/src/mcp/embed-app.ts +2051 -0
  1229. package/src/mcp/embed-route.ts +84 -0
  1230. package/src/mcp/external-agent-policy.ts +18 -0
  1231. package/src/mcp/index.ts +47 -0
  1232. package/src/mcp/oauth-route.ts +1016 -0
  1233. package/src/mcp/oauth-store.ts +581 -0
  1234. package/src/mcp/oauth-token.ts +227 -0
  1235. package/src/mcp/org-directory.ts +343 -0
  1236. package/src/mcp/route-paths.ts +34 -0
  1237. package/src/mcp/screen-memory-stdio.ts +290 -0
  1238. package/src/mcp/server.ts +507 -0
  1239. package/src/mcp/stdio.ts +328 -0
  1240. package/src/mcp/workspace-resolve.ts +261 -0
  1241. package/src/mcp-client/app-api.ts +136 -0
  1242. package/src/mcp-client/app-result.ts +64 -0
  1243. package/src/mcp-client/builtin-capabilities.ts +146 -0
  1244. package/src/mcp-client/builtin-store.ts +93 -0
  1245. package/src/mcp-client/config.ts +281 -0
  1246. package/src/mcp-client/errors.ts +54 -0
  1247. package/src/mcp-client/hub-client.ts +172 -0
  1248. package/src/mcp-client/hub-routes.ts +198 -0
  1249. package/src/mcp-client/index.ts +504 -0
  1250. package/src/mcp-client/manager.ts +968 -0
  1251. package/src/mcp-client/oauth-client.ts +462 -0
  1252. package/src/mcp-client/oauth-routes.ts +307 -0
  1253. package/src/mcp-client/remote-store.ts +674 -0
  1254. package/src/mcp-client/remote-url.ts +97 -0
  1255. package/src/mcp-client/routes.ts +1093 -0
  1256. package/src/mcp-client/screen-memory-local.ts +461 -0
  1257. package/src/mcp-client/tool-policy.ts +182 -0
  1258. package/src/mcp-client/visibility.ts +56 -0
  1259. package/src/mcp-client/workspace-servers.ts +379 -0
  1260. package/src/navigation/index.ts +170 -0
  1261. package/src/notifications/actions.ts +151 -0
  1262. package/src/notifications/channels.ts +410 -0
  1263. package/src/notifications/index.ts +22 -0
  1264. package/src/notifications/registry.ts +216 -0
  1265. package/src/notifications/routes.ts +106 -0
  1266. package/src/notifications/store.ts +236 -0
  1267. package/src/notifications/types.ts +52 -0
  1268. package/src/oauth-tokens/google-refresh.ts +175 -0
  1269. package/src/oauth-tokens/index.ts +15 -0
  1270. package/src/oauth-tokens/store.ts +384 -0
  1271. package/src/observability/cleanup-job.ts +124 -0
  1272. package/src/observability/evals.ts +507 -0
  1273. package/src/observability/experiments.ts +359 -0
  1274. package/src/observability/feedback.ts +332 -0
  1275. package/src/observability/hosted-model-experiment.ts +118 -0
  1276. package/src/observability/index.ts +62 -0
  1277. package/src/observability/plugin.ts +31 -0
  1278. package/src/observability/routes.ts +431 -0
  1279. package/src/observability/sentiment.ts +261 -0
  1280. package/src/observability/store.ts +1347 -0
  1281. package/src/observability/traces.ts +789 -0
  1282. package/src/observability/tracing.ts +157 -0
  1283. package/src/observability/tracking-identity.ts +55 -0
  1284. package/src/observability/types.ts +211 -0
  1285. package/src/onboarding/default-steps.ts +428 -0
  1286. package/src/onboarding/index.ts +22 -0
  1287. package/src/onboarding/plugin.ts +262 -0
  1288. package/src/onboarding/registry.ts +47 -0
  1289. package/src/onboarding/types.ts +96 -0
  1290. package/src/org/accept-pending.ts +98 -0
  1291. package/src/org/auto-join-domain.ts +113 -0
  1292. package/src/org/context.ts +640 -0
  1293. package/src/org/free-email-providers.ts +124 -0
  1294. package/src/org/handlers.ts +1153 -0
  1295. package/src/org/index.ts +63 -0
  1296. package/src/org/migrations.ts +105 -0
  1297. package/src/org/permissions.ts +30 -0
  1298. package/src/org/plugin.ts +255 -0
  1299. package/src/org/schema.ts +28 -0
  1300. package/src/org/types.ts +57 -0
  1301. package/src/org-team/index.ts +1 -0
  1302. package/src/package-lifecycle/deprecated-imports.ts +179 -0
  1303. package/src/package-lifecycle/eject-manifest.ts +345 -0
  1304. package/src/package-lifecycle/index.ts +7 -0
  1305. package/src/package-lifecycle/manifest.ts +120 -0
  1306. package/src/package-lifecycle/migration-manifest.ts +159 -0
  1307. package/src/package-lifecycle/migration-message.ts +6 -0
  1308. package/src/package-lifecycle/tombstone.ts +58 -0
  1309. package/src/package-lifecycle/upgrade-error.ts +37 -0
  1310. package/src/private-blob/index.ts +18 -0
  1311. package/src/private-blob/registry.ts +242 -0
  1312. package/src/private-blob/types.ts +55 -0
  1313. package/src/progress/actions.ts +179 -0
  1314. package/src/progress/index.ts +16 -0
  1315. package/src/progress/registry.ts +127 -0
  1316. package/src/progress/routes.ts +89 -0
  1317. package/src/progress/store.ts +353 -0
  1318. package/src/progress/types.ts +59 -0
  1319. package/src/provider-api/actions/custom-provider-registration.ts +197 -0
  1320. package/src/provider-api/actions/delete-staged-dataset.ts +5 -0
  1321. package/src/provider-api/actions/github-repo-files.ts +266 -0
  1322. package/src/provider-api/actions/list-staged-datasets.ts +5 -0
  1323. package/src/provider-api/actions/provider-api-audit.ts +88 -0
  1324. package/src/provider-api/actions/provider-api.ts +460 -0
  1325. package/src/provider-api/actions/query-staged-dataset.ts +5 -0
  1326. package/src/provider-api/actions/staged-datasets.ts +359 -0
  1327. package/src/provider-api/corpus-jobs-store.ts +522 -0
  1328. package/src/provider-api/corpus-jobs.ts +1817 -0
  1329. package/src/provider-api/custom-registry.ts +456 -0
  1330. package/src/provider-api/github-repo.ts +675 -0
  1331. package/src/provider-api/gong.ts +108 -0
  1332. package/src/provider-api/index.ts +5444 -0
  1333. package/src/provider-api/quota-governor.ts +562 -0
  1334. package/src/provider-api/runtime.ts +1 -0
  1335. package/src/provider-api/staged-datasets-aggregate.ts +304 -0
  1336. package/src/provider-api/staged-datasets-store.ts +441 -0
  1337. package/src/provider-api/staging.ts +483 -0
  1338. package/src/resources/agents.ts +65 -0
  1339. package/src/resources/emitter.ts +54 -0
  1340. package/src/resources/handlers.ts +728 -0
  1341. package/src/resources/index.ts +4 -0
  1342. package/src/resources/metadata.ts +252 -0
  1343. package/src/resources/script-helpers.ts +160 -0
  1344. package/src/resources/store.ts +1618 -0
  1345. package/src/review/actions/consume-review-feedback.ts +48 -0
  1346. package/src/review/actions/create-review-comment.ts +108 -0
  1347. package/src/review/actions/delete-review-comment.ts +67 -0
  1348. package/src/review/actions/get-review-feedback.ts +49 -0
  1349. package/src/review/actions/list-review-comments.ts +87 -0
  1350. package/src/review/actions/reply-review-comment.ts +118 -0
  1351. package/src/review/actions/resolve-review-thread.ts +94 -0
  1352. package/src/review/actions/send-review-thread-to-agent.ts +62 -0
  1353. package/src/review/actions/set-review-status.ts +58 -0
  1354. package/src/review/identity.ts +101 -0
  1355. package/src/review/index.ts +45 -0
  1356. package/src/review/mentions.ts +44 -0
  1357. package/src/review/registry.ts +111 -0
  1358. package/src/review/store.ts +997 -0
  1359. package/src/review/types.ts +101 -0
  1360. package/src/router/index.ts +24 -0
  1361. package/src/scripts/agent-engines/list-agent-engines.ts +130 -0
  1362. package/src/scripts/agent-engines/manage-agent-engine.ts +197 -0
  1363. package/src/scripts/agent-engines/set-agent-engine.ts +84 -0
  1364. package/src/scripts/agent-engines/test-agent-engine.ts +174 -0
  1365. package/src/scripts/call-agent.ts +792 -0
  1366. package/src/scripts/chat/index.ts +8 -0
  1367. package/src/scripts/chat/open-chat.ts +56 -0
  1368. package/src/scripts/chat/search-chats.ts +121 -0
  1369. package/src/scripts/core-scripts.ts +22 -0
  1370. package/src/scripts/db/check-scoping.ts +212 -0
  1371. package/src/scripts/db/exec.ts +791 -0
  1372. package/src/scripts/db/index.ts +19 -0
  1373. package/src/scripts/db/migrate-encrypt-credentials.ts +223 -0
  1374. package/src/scripts/db/migrate-encrypt-oauth-tokens.ts +213 -0
  1375. package/src/scripts/db/migrate-user-api-keys.ts +257 -0
  1376. package/src/scripts/db/patch.ts +820 -0
  1377. package/src/scripts/db/query.ts +299 -0
  1378. package/src/scripts/db/reset-dev-owner.ts +285 -0
  1379. package/src/scripts/db/safety.ts +286 -0
  1380. package/src/scripts/db/schema.ts +364 -0
  1381. package/src/scripts/db/scoping.ts +341 -0
  1382. package/src/scripts/db/sqlite-client.ts +78 -0
  1383. package/src/scripts/db/tool-mode.ts +23 -0
  1384. package/src/scripts/db/tool-schemas.ts +31 -0
  1385. package/src/scripts/db/wipe-leaked-builder-keys.ts +201 -0
  1386. package/src/scripts/dev/index.ts +296 -0
  1387. package/src/scripts/dev/list-files.ts +119 -0
  1388. package/src/scripts/dev/read-file.ts +77 -0
  1389. package/src/scripts/dev/search-files.ts +151 -0
  1390. package/src/scripts/dev/shell.ts +111 -0
  1391. package/src/scripts/dev/write-file.ts +56 -0
  1392. package/src/scripts/dev-session.ts +96 -0
  1393. package/src/scripts/docs/index.ts +8 -0
  1394. package/src/scripts/docs/search.ts +274 -0
  1395. package/src/scripts/docs/source-search.ts +363 -0
  1396. package/src/scripts/index.ts +15 -0
  1397. package/src/scripts/manage-agent-loop-settings.ts +84 -0
  1398. package/src/scripts/parse-args.ts +46 -0
  1399. package/src/scripts/resources/delete-memory.ts +67 -0
  1400. package/src/scripts/resources/delete.ts +69 -0
  1401. package/src/scripts/resources/effective.ts +71 -0
  1402. package/src/scripts/resources/index.ts +18 -0
  1403. package/src/scripts/resources/list.ts +103 -0
  1404. package/src/scripts/resources/migrate-learnings.ts +40 -0
  1405. package/src/scripts/resources/read.ts +107 -0
  1406. package/src/scripts/resources/save-memory.ts +99 -0
  1407. package/src/scripts/resources/write.ts +158 -0
  1408. package/src/scripts/runner.ts +339 -0
  1409. package/src/scripts/utils.ts +130 -0
  1410. package/src/search/index.ts +413 -0
  1411. package/src/search-utils/index.ts +112 -0
  1412. package/src/secrets/crypto.ts +228 -0
  1413. package/src/secrets/index.ts +65 -0
  1414. package/src/secrets/onboarding.ts +101 -0
  1415. package/src/secrets/register-framework-secrets.ts +228 -0
  1416. package/src/secrets/register.ts +129 -0
  1417. package/src/secrets/routes.ts +697 -0
  1418. package/src/secrets/schema.ts +52 -0
  1419. package/src/secrets/storage.ts +561 -0
  1420. package/src/secrets/substitution.ts +305 -0
  1421. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +150 -0
  1422. package/src/server/action-change.ts +66 -0
  1423. package/src/server/action-discovery.ts +774 -0
  1424. package/src/server/action-routes.ts +658 -0
  1425. package/src/server/agent-access.ts +72 -0
  1426. package/src/server/agent-chat/action-filters-a2a.ts +339 -0
  1427. package/src/server/agent-chat/browser-team-tools.ts +510 -0
  1428. package/src/server/agent-chat/context-tools.ts +599 -0
  1429. package/src/server/agent-chat/framework-prompts.ts +467 -0
  1430. package/src/server/agent-chat/lazy-fs.ts +11 -0
  1431. package/src/server/agent-chat/mcp-glue.ts +91 -0
  1432. package/src/server/agent-chat/plugin-options.ts +379 -0
  1433. package/src/server/agent-chat/process-run-failure.ts +62 -0
  1434. package/src/server/agent-chat/prompt-resources.ts +1004 -0
  1435. package/src/server/agent-chat/recurring-jobs-runtime.ts +80 -0
  1436. package/src/server/agent-chat/request-surface.ts +71 -0
  1437. package/src/server/agent-chat/run-code-tools.ts +67 -0
  1438. package/src/server/agent-chat/script-entries.ts +796 -0
  1439. package/src/server/agent-chat/shared-thread.ts +301 -0
  1440. package/src/server/agent-chat/skill-frontmatter.ts +41 -0
  1441. package/src/server/agent-chat-plugin.ts +5930 -0
  1442. package/src/server/agent-discovery.ts +706 -0
  1443. package/src/server/agent-engine-api-key-route.ts +236 -0
  1444. package/src/server/agent-run-context.ts +204 -0
  1445. package/src/server/agent-teams-run-queue.ts +344 -0
  1446. package/src/server/agent-teams.ts +2257 -0
  1447. package/src/server/agents-bundle.ts +464 -0
  1448. package/src/server/analytics.ts +105 -0
  1449. package/src/server/app-base-path.ts +79 -0
  1450. package/src/server/app-name.ts +53 -0
  1451. package/src/server/app-url.ts +184 -0
  1452. package/src/server/attachment-actions.ts +276 -0
  1453. package/src/server/attribution.ts +214 -0
  1454. package/src/server/auth-marketing.ts +260 -0
  1455. package/src/server/auth-plugin.ts +32 -0
  1456. package/src/server/auth.ts +3803 -0
  1457. package/src/server/better-auth-instance.ts +1201 -0
  1458. package/src/server/builder-browser.ts +1701 -0
  1459. package/src/server/builder-design-systems.ts +668 -0
  1460. package/src/server/builder-space.ts +176 -0
  1461. package/src/server/captcha.ts +63 -0
  1462. package/src/server/capture-error.ts +64 -0
  1463. package/src/server/cli-capture.ts +141 -0
  1464. package/src/server/collab-plugin.ts +391 -0
  1465. package/src/server/complete-text.ts +231 -0
  1466. package/src/server/cookie-namespace.ts +159 -0
  1467. package/src/server/core-routes-plugin.ts +4122 -0
  1468. package/src/server/cors-origins.ts +60 -0
  1469. package/src/server/create-server.ts +268 -0
  1470. package/src/server/credential-provider.ts +1202 -0
  1471. package/src/server/csrf.ts +229 -0
  1472. package/src/server/date-utils.ts +42 -0
  1473. package/src/server/deep-link.ts +119 -0
  1474. package/src/server/derived-secret.ts +32 -0
  1475. package/src/server/design-token-utils.ts +1032 -0
  1476. package/src/server/desktop-sso.ts +83 -0
  1477. package/src/server/edge.ts +69 -0
  1478. package/src/server/email-actions.ts +218 -0
  1479. package/src/server/email-template.ts +192 -0
  1480. package/src/server/email-templates.ts +148 -0
  1481. package/src/server/email.ts +219 -0
  1482. package/src/server/embed-route.ts +283 -0
  1483. package/src/server/embed-session.ts +805 -0
  1484. package/src/server/embedded.ts +252 -0
  1485. package/src/server/entry-server.tsx +154 -0
  1486. package/src/server/framework-request-handler.ts +848 -0
  1487. package/src/server/fusion-app.ts +447 -0
  1488. package/src/server/google-auth-mode.ts +34 -0
  1489. package/src/server/google-auth-plugin.ts +496 -0
  1490. package/src/server/google-oauth-credentials.ts +128 -0
  1491. package/src/server/google-oauth.ts +972 -0
  1492. package/src/server/google-realtime-session.ts +182 -0
  1493. package/src/server/h3-helpers.ts +174 -0
  1494. package/src/server/http-response-telemetry.ts +396 -0
  1495. package/src/server/identity-sso-store.ts +304 -0
  1496. package/src/server/identity-sso.ts +514 -0
  1497. package/src/server/index.ts +593 -0
  1498. package/src/server/missing-key.ts +36 -0
  1499. package/src/server/oauth-helpers.ts +44 -0
  1500. package/src/server/oauth-public-origin.ts +44 -0
  1501. package/src/server/oauth-return-url.ts +120 -0
  1502. package/src/server/og-fonts-data.ts +15 -0
  1503. package/src/server/og-fonts.ts +75 -0
  1504. package/src/server/onboarding-html.ts +4040 -0
  1505. package/src/server/open-route.ts +311 -0
  1506. package/src/server/org-admin.ts +28 -0
  1507. package/src/server/poll-events.ts +88 -0
  1508. package/src/server/poll.ts +1224 -0
  1509. package/src/server/prompts/framework-core-compact.ts +107 -0
  1510. package/src/server/prompts/framework-core.ts +143 -0
  1511. package/src/server/prompts/index.ts +16 -0
  1512. package/src/server/prompts/model-overlays.ts +54 -0
  1513. package/src/server/prompts/shared-rules.ts +104 -0
  1514. package/src/server/realtime-voice.ts +967 -0
  1515. package/src/server/recap-image-route.ts +242 -0
  1516. package/src/server/recap-image-store.ts +185 -0
  1517. package/src/server/request-context.ts +416 -0
  1518. package/src/server/request-origin.ts +67 -0
  1519. package/src/server/resources-plugin.ts +119 -0
  1520. package/src/server/schema-prompt.ts +429 -0
  1521. package/src/server/scoped-key-storage.ts +223 -0
  1522. package/src/server/security-headers.ts +170 -0
  1523. package/src/server/self-dispatch.ts +224 -0
  1524. package/src/server/sentry-config.ts +73 -0
  1525. package/src/server/sentry-plugin.ts +138 -0
  1526. package/src/server/sentry.ts +444 -0
  1527. package/src/server/short-lived-token.ts +170 -0
  1528. package/src/server/social-og-image.ts +454 -0
  1529. package/src/server/sse.ts +102 -0
  1530. package/src/server/ssr-handler.ts +466 -0
  1531. package/src/server/transcribe-voice.ts +1076 -0
  1532. package/src/server/voice-providers-status.ts +118 -0
  1533. package/src/server/workspace-oauth.ts +31 -0
  1534. package/src/server/workspace-provider-oauth.ts +970 -0
  1535. package/src/session-replay-iframe-protocol.ts +58 -0
  1536. package/src/settings/handlers.ts +44 -0
  1537. package/src/settings/index.ts +34 -0
  1538. package/src/settings/org-settings.ts +83 -0
  1539. package/src/settings/script-helpers.ts +24 -0
  1540. package/src/settings/store.ts +247 -0
  1541. package/src/settings/user-settings.ts +47 -0
  1542. package/src/setup-connections/index.ts +90 -0
  1543. package/src/setup-connections/onboarding.ts +47 -0
  1544. package/src/shared/agent-access.ts +112 -0
  1545. package/src/shared/agent-chat.ts +124 -0
  1546. package/src/shared/agent-env.ts +46 -0
  1547. package/src/shared/agent-readable-resource.ts +111 -0
  1548. package/src/shared/agent-sidebar-url.ts +39 -0
  1549. package/src/shared/cache-control.ts +25 -0
  1550. package/src/shared/cloudflare-globals.d.ts +34 -0
  1551. package/src/shared/context-xray.ts +172 -0
  1552. package/src/shared/embed-auth.ts +6 -0
  1553. package/src/shared/index.ts +83 -0
  1554. package/src/shared/llm-connection.ts +42 -0
  1555. package/src/shared/markdown-block-split.ts +129 -0
  1556. package/src/shared/mcp-connect-content.ts +130 -0
  1557. package/src/shared/mcp-embed-headers.ts +175 -0
  1558. package/src/shared/mcp-integration-config.ts +101 -0
  1559. package/src/shared/merge-by-id.ts +14 -0
  1560. package/src/shared/oauth-state.ts +39 -0
  1561. package/src/shared/reasoning-effort.ts +228 -0
  1562. package/src/shared/route-warmup-config.ts +128 -0
  1563. package/src/shared/runtime.ts +31 -0
  1564. package/src/shared/social-meta.ts +82 -0
  1565. package/src/shared/streaming-text-smoothing.ts +184 -0
  1566. package/src/shared/truncate.ts +13 -0
  1567. package/src/shared/workspace-app-audience.ts +177 -0
  1568. package/src/shared/workspace-app-id.ts +54 -0
  1569. package/src/sharing/access.ts +585 -0
  1570. package/src/sharing/actions/create-agent-resource-link.ts +91 -0
  1571. package/src/sharing/actions/extension-change.ts +22 -0
  1572. package/src/sharing/actions/list-resource-shares.ts +93 -0
  1573. package/src/sharing/actions/set-resource-visibility.ts +91 -0
  1574. package/src/sharing/actions/share-resource.ts +322 -0
  1575. package/src/sharing/actions/unshare-resource.ts +72 -0
  1576. package/src/sharing/index.ts +35 -0
  1577. package/src/sharing/registry.ts +201 -0
  1578. package/src/sharing/schema.ts +99 -0
  1579. package/src/styles/agent-conversation.css +766 -0
  1580. package/src/styles/agent-native.css +938 -0
  1581. package/src/styles/blocks.css +1717 -0
  1582. package/src/styles/chat-history-list.css +1 -0
  1583. package/src/styles/rich-markdown-editor.css +1 -0
  1584. package/src/tailwind.preset.ts +140 -0
  1585. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1586. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1587. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1588. package/src/templates/chat/AGENTS.md +3 -2
  1589. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1590. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1591. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1592. package/src/templates/default/AGENTS.md +6 -5
  1593. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1594. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1595. package/src/templates/headless/AGENTS.md +5 -4
  1596. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +15 -13
  1597. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +3 -2
  1598. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +63 -20
  1599. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +9 -6
  1600. package/src/templates/workspace-core/AGENTS.md +4 -4
  1601. package/src/templates/workspace-root/AGENTS.md +4 -4
  1602. package/src/terminal/cli-registry.ts +57 -0
  1603. package/src/terminal/index.ts +22 -0
  1604. package/src/terminal/pty-server.ts +389 -0
  1605. package/src/terminal/terminal-plugin.ts +265 -0
  1606. package/src/testing.ts +23 -0
  1607. package/src/tracking/index.ts +10 -0
  1608. package/src/tracking/providers.ts +422 -0
  1609. package/src/tracking/registry.ts +102 -0
  1610. package/src/tracking/route.ts +108 -0
  1611. package/src/tracking/types.ts +16 -0
  1612. package/src/transcription/builder-transcription.ts +118 -0
  1613. package/src/triggers/actions/list-automations.ts +99 -0
  1614. package/src/triggers/actions/manage-automation.ts +78 -0
  1615. package/src/triggers/actions.ts +333 -0
  1616. package/src/triggers/condition-evaluator.ts +163 -0
  1617. package/src/triggers/dispatcher.ts +536 -0
  1618. package/src/triggers/index.ts +13 -0
  1619. package/src/triggers/routes.ts +322 -0
  1620. package/src/triggers/types.ts +42 -0
  1621. package/src/types/pglite.d.ts +26 -0
  1622. package/src/usage/store.ts +698 -0
  1623. package/src/vite/action-types-plugin.ts +481 -0
  1624. package/src/vite/agent-web-plugin.ts +78 -0
  1625. package/src/vite/agents-bundle-plugin.ts +185 -0
  1626. package/src/vite/client.ts +3056 -0
  1627. package/src/vite/index.ts +21 -0
  1628. package/src/voice/index.ts +18 -0
  1629. package/src/voice/voice-cleanup-prompt.ts +38 -0
  1630. package/src/voice/voice-context.ts +217 -0
  1631. package/src/voice/voice-replacements.ts +75 -0
  1632. package/src/workspace-connections/credentials.ts +603 -0
  1633. package/src/workspace-connections/index.ts +72 -0
  1634. package/src/workspace-connections/lifecycle.ts +43 -0
  1635. package/src/workspace-connections/store.ts +1943 -0
  1636. package/src/workspace-files/index.ts +18 -0
  1637. package/src/workspace-files/store.ts +339 -0
  1638. package/src/workspace-files/tool.ts +266 -0
@@ -0,0 +1,1960 @@
1
+ import {
2
+ IconPlus,
3
+ IconUpload,
4
+ IconArrowLeft,
5
+ IconPencil,
6
+ IconBulb,
7
+ IconBolt,
8
+ IconTrash,
9
+ IconEye,
10
+ IconCode,
11
+ IconClock,
12
+ IconHierarchy2,
13
+ IconExternalLink,
14
+ IconHelp,
15
+ IconPlugConnected,
16
+ } from "@tabler/icons-react";
17
+ import React, {
18
+ useState,
19
+ useRef,
20
+ useCallback,
21
+ useEffect,
22
+ useMemo,
23
+ } from "react";
24
+
25
+ import {
26
+ CLAUDE_SONNET_MODEL_ID,
27
+ CLAUDE_SONNET_MODEL_LABEL,
28
+ } from "../../agent/model-config.js";
29
+ import { serializeFrontmatter } from "../../resources/metadata.js";
30
+ import { sendToAgentChat } from "../agent-chat.js";
31
+ import { agentNativePath } from "../api-path.js";
32
+ import {
33
+ Popover,
34
+ PopoverContent,
35
+ PopoverTrigger,
36
+ } from "../components/ui/popover.js";
37
+ import {
38
+ Tooltip,
39
+ TooltipContent,
40
+ TooltipProvider,
41
+ TooltipTrigger,
42
+ } from "../components/ui/tooltip.js";
43
+ import { PromptComposer } from "../composer/index.js";
44
+ import { useT } from "../i18n.js";
45
+ import { useOrg } from "../org/hooks.js";
46
+ import { useUploadResource } from "../uploads/use-upload-resource.js";
47
+ import { cn } from "../utils.js";
48
+ import { BuiltinCapabilityDetail } from "./BuiltinCapabilityDetail.js";
49
+ import {
50
+ isMcpIntegrationCatalogAvailable,
51
+ type DefaultMcpIntegration,
52
+ } from "./mcp-integration-catalog.js";
53
+ import { McpIntegrationDialog } from "./McpIntegrationDialog.js";
54
+ import { McpServerDetail } from "./McpServerDetail.js";
55
+ import { ResourceEditor } from "./ResourceEditor.js";
56
+ import { ResourceTree } from "./ResourceTree.js";
57
+ import {
58
+ parseMcpBuiltinVirtualId,
59
+ useBuiltinCapabilities,
60
+ } from "./use-builtin-capabilities.js";
61
+ import {
62
+ useMcpServers,
63
+ useCreateMcpServer,
64
+ useDeleteMcpServer,
65
+ parseMcpVirtualId,
66
+ type McpServerScope,
67
+ } from "./use-mcp-servers.js";
68
+ import {
69
+ useResourceTree,
70
+ useResource,
71
+ useCreateResource,
72
+ useUpdateResource,
73
+ useDeleteResource,
74
+ withMcpServersFolder,
75
+ withAgentScratchFolder,
76
+ type ResourceScope,
77
+ type ResourceMeta,
78
+ type Resource,
79
+ type TreeNode,
80
+ } from "./use-resources.js";
81
+
82
+ const WORKSPACE_DOCS_URL = "https://agent-native.com/docs/workspace";
83
+ const LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE = "local-workspace-resource";
84
+
85
+ export type ResourceView =
86
+ | "files"
87
+ | "instructions"
88
+ | "agents"
89
+ | "memory"
90
+ | "skills"
91
+ | "learnings"
92
+ | "remote-agents";
93
+
94
+ export type ResourceTreeVariant = "tree" | "collection";
95
+
96
+ const SPECIAL_RESOURCE_ROOTS = new Set([
97
+ "agents",
98
+ "agent-scratch",
99
+ "jobs",
100
+ "memory",
101
+ "remote-agents",
102
+ "skills",
103
+ ]);
104
+ const SPECIAL_RESOURCE_FILES = new Set(["agents.md", "learnings.md"]);
105
+
106
+ function normalizedResourcePath(path: string): string {
107
+ return path.replace(/^\/+/, "").toLowerCase();
108
+ }
109
+
110
+ function resourceMatchesView(node: TreeNode, view: ResourceView): boolean {
111
+ const path = normalizedResourcePath(node.path);
112
+ switch (view) {
113
+ case "files":
114
+ return (
115
+ !SPECIAL_RESOURCE_ROOTS.has(path.split("/", 1)[0]) &&
116
+ !SPECIAL_RESOURCE_FILES.has(path.split("/").pop() ?? "")
117
+ );
118
+ case "instructions":
119
+ return path.split("/").pop() === "agents.md";
120
+ case "agents":
121
+ return node.kind === "agent";
122
+ case "memory":
123
+ return path === "memory" || path.startsWith("memory/");
124
+ case "skills":
125
+ return node.kind === "skill";
126
+ case "learnings":
127
+ return path.split("/").pop() === "learnings.md";
128
+ case "remote-agents":
129
+ return node.kind === "remote-agent";
130
+ }
131
+ }
132
+
133
+ export function filterResourceTree(
134
+ tree: TreeNode[],
135
+ view: ResourceView | undefined,
136
+ ): TreeNode[] {
137
+ if (!view) return tree;
138
+ return tree.flatMap((node) => {
139
+ if (node.type === "folder") {
140
+ if (
141
+ view === "files" &&
142
+ (SPECIAL_RESOURCE_ROOTS.has(
143
+ normalizedResourcePath(node.path).split("/", 1)[0],
144
+ ) ||
145
+ SPECIAL_RESOURCE_FILES.has(
146
+ normalizedResourcePath(node.path).split("/").pop() ?? "",
147
+ ))
148
+ ) {
149
+ return [];
150
+ }
151
+ const children = filterResourceTree(node.children ?? [], view);
152
+ return children.length > 0 ? [{ ...node, children }] : [];
153
+ }
154
+ return resourceMatchesView(node, view) ? [node] : [];
155
+ });
156
+ }
157
+
158
+ // ─── Create Menu (unified + button) ────────────────────────────────────────
159
+
160
+ type CreateMenuView =
161
+ | "menu"
162
+ | "file"
163
+ | "skill"
164
+ | "skill-upload"
165
+ | "job"
166
+ | "agent-mode"
167
+ | "agent-prompt"
168
+ | "agent-form";
169
+
170
+ const AGENT_MODEL_OPTIONS = [
171
+ { value: "inherit", label: "Default model" },
172
+ { value: "claude-fable-5", label: "Claude Fable 5" },
173
+ { value: "claude-opus-4-8", label: "Claude Opus 4.8" },
174
+ { value: CLAUDE_SONNET_MODEL_ID, label: CLAUDE_SONNET_MODEL_LABEL },
175
+ { value: "claude-haiku-4-5-20251001", label: "Claude Haiku 4.5" },
176
+ ] as const;
177
+
178
+ function slugifyName(value: string): string {
179
+ return (
180
+ value
181
+ .toLowerCase()
182
+ .replace(/[^a-z0-9]+/g, "-")
183
+ .replace(/^-+|-+$/g, "") || "agent"
184
+ );
185
+ }
186
+
187
+ function isLocalWorkspaceResource(resource: Resource | null | undefined) {
188
+ if (!resource?.metadata) return false;
189
+ try {
190
+ const metadata = JSON.parse(resource.metadata) as { source?: unknown };
191
+ return metadata.source === LOCAL_WORKSPACE_RESOURCE_METADATA_SOURCE;
192
+ } catch {
193
+ return false;
194
+ }
195
+ }
196
+
197
+ function buildAgentResourceContent({
198
+ name,
199
+ description,
200
+ model,
201
+ tools,
202
+ body,
203
+ }: {
204
+ name: string;
205
+ description: string;
206
+ model: string;
207
+ tools: string;
208
+ body: string;
209
+ }): string {
210
+ const fields = [
211
+ { key: "name", value: name },
212
+ { key: "description", value: description },
213
+ { key: "model", value: model },
214
+ { key: "tools", value: tools },
215
+ { key: "delegate-default", value: "false" },
216
+ ];
217
+ return serializeFrontmatter(fields) + body.trim() + "\n";
218
+ }
219
+
220
+ function CreateMenu({
221
+ scope,
222
+ resourceFilter,
223
+ onCreateFile,
224
+ onCreateResource,
225
+ onCreateMcpServer,
226
+ canCreateOrgMcp,
227
+ hasOrg,
228
+ onCreated,
229
+ showToast,
230
+ mcpIntegrations,
231
+ }: {
232
+ scope: ResourceScope;
233
+ resourceFilter?: ResourceView;
234
+ onCreateFile: (name: string) => void;
235
+ onCreateResource: (
236
+ path: string,
237
+ content: string,
238
+ mimeType?: string,
239
+ opts?: {
240
+ onSuccess?: (resource: ResourceMeta) => void;
241
+ onError?: (err: unknown) => void;
242
+ },
243
+ ) => void;
244
+ onCreateMcpServer: (args: {
245
+ scope: McpServerScope;
246
+ name: string;
247
+ url: string;
248
+ headers?: Record<string, string>;
249
+ description?: string;
250
+ }) => Promise<void>;
251
+ canCreateOrgMcp: boolean;
252
+ hasOrg: boolean;
253
+ onCreated?: () => void;
254
+ mcpIntegrations?: DefaultMcpIntegration[];
255
+ showToast?: (
256
+ kind: "ok" | "err",
257
+ message: string,
258
+ opts?: { resourceId?: string; durationMs?: number },
259
+ ) => void;
260
+ }) {
261
+ const t = useT();
262
+ const [open, setOpen] = useState(false);
263
+ const [mcpDialogOpen, setMcpDialogOpen] = useState(false);
264
+ const [view, setView] = useState<CreateMenuView>("menu");
265
+ const showMcpIntegrations = useMemo(
266
+ () =>
267
+ mcpIntegrations
268
+ ? mcpIntegrations.length > 0
269
+ : isMcpIntegrationCatalogAvailable(),
270
+ [mcpIntegrations],
271
+ );
272
+ const [value, setValue] = useState("");
273
+ const [agentName, setAgentName] = useState("");
274
+ const [agentDescription, setAgentDescription] = useState("");
275
+ const [agentModel, setAgentModel] = useState<string>("inherit");
276
+ const [agentInstructions, setAgentInstructions] = useState(
277
+ `# Role\n\nDefine how this agent should work.\n\n## Focus\n\n- What kinds of tasks it should handle\n- What tone or approach it should use\n- Important constraints or preferences\n`,
278
+ );
279
+ const defaultMcpScope: McpServerScope =
280
+ scope === "shared" && canCreateOrgMcp ? "org" : "user";
281
+ const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);
282
+ const skillFileInputRef = useRef<HTMLInputElement>(null);
283
+ const skillHoverTimerRef = useRef<number | null>(null);
284
+ const [skillFlyoutOpen, setSkillFlyoutOpen] = useState(false);
285
+ const [skillFlyoutSide, setSkillFlyoutSide] = useState<"right" | "left">(
286
+ "right",
287
+ );
288
+ const skillFlyoutCloseTimerRef = useRef<number | null>(null);
289
+ const openSkillFlyout = (rowEl?: HTMLElement | null) => {
290
+ if (skillFlyoutCloseTimerRef.current) {
291
+ window.clearTimeout(skillFlyoutCloseTimerRef.current);
292
+ skillFlyoutCloseTimerRef.current = null;
293
+ }
294
+ if (rowEl && typeof window !== "undefined") {
295
+ const rect = rowEl.getBoundingClientRect();
296
+ const FLYOUT_WIDTH = 248;
297
+ setSkillFlyoutSide(
298
+ window.innerWidth - rect.right < FLYOUT_WIDTH ? "left" : "right",
299
+ );
300
+ }
301
+ setSkillFlyoutOpen(true);
302
+ };
303
+ const scheduleSkillFlyoutClose = () => {
304
+ if (skillFlyoutCloseTimerRef.current)
305
+ window.clearTimeout(skillFlyoutCloseTimerRef.current);
306
+ skillFlyoutCloseTimerRef.current = window.setTimeout(() => {
307
+ setSkillFlyoutOpen(false);
308
+ }, 160);
309
+ };
310
+ const [skillUploadSlug, setSkillUploadSlug] = useState("");
311
+ const [skillUploadContent, setSkillUploadContent] = useState("");
312
+ const [skillUploadFileName, setSkillUploadFileName] = useState("");
313
+
314
+ useEffect(() => {
315
+ if (open) {
316
+ setView("menu");
317
+ setValue("");
318
+ setAgentName("");
319
+ setAgentDescription("");
320
+ setAgentModel("inherit");
321
+ setAgentInstructions(
322
+ `# Role\n\nDefine how this agent should work.\n\n## Focus\n\n- What kinds of tasks it should handle\n- What tone or approach it should use\n- Important constraints or preferences\n`,
323
+ );
324
+ setSkillUploadSlug("");
325
+ setSkillUploadContent("");
326
+ setSkillUploadFileName("");
327
+ setSkillFlyoutOpen(false);
328
+ }
329
+ }, [open]);
330
+
331
+ useEffect(() => {
332
+ if (view !== "menu" && view !== "agent-form") {
333
+ setValue("");
334
+ const t = setTimeout(() => inputRef.current?.focus(), 50);
335
+ return () => clearTimeout(t);
336
+ }
337
+ }, [view]);
338
+
339
+ const submitFile = () => {
340
+ const trimmed = value.trim();
341
+ if (trimmed) {
342
+ onCreateFile(trimmed);
343
+ setOpen(false);
344
+ }
345
+ };
346
+
347
+ const submitSkill = (text: string = value) => {
348
+ const trimmed = text.trim();
349
+ if (!trimmed) return;
350
+
351
+ sendToAgentChat({
352
+ message: `Create a skill: ${trimmed}`,
353
+ newTab: true,
354
+ context: `The user wants to create an agent skill. Their description: "${trimmed}"
355
+
356
+ Follow the create-skill pattern to build this. Before writing:
357
+
358
+ 1. **Determine the skill name** — derive a hyphen-case name from the description (e.g. "code review" → "code-review")
359
+ 2. **Determine the skill type** — Pattern (architectural rule), Workflow (step-by-step), or Generator (scaffolding)
360
+ 3. **Write the skill** as a ${scope} resource at path "skills/<name>/SKILL.md" using the \`resources\` tool with \`action: "write"\`
361
+
362
+ The skill file MUST have YAML frontmatter with name and description (under 40 words), then markdown with:
363
+ - Clear rule/purpose statement
364
+ - Why this skill exists
365
+ - How to follow it (with code examples where helpful)
366
+ - Common violations to avoid
367
+ - Related skills
368
+
369
+ Template for a Pattern skill:
370
+ \`\`\`markdown
371
+ ---
372
+ name: <hyphen-case-name>
373
+ description: >-
374
+ <Under 40 words. When should this trigger?>
375
+ ---
376
+
377
+ # <Skill Name>
378
+
379
+ ## Rule
380
+ <One sentence: what must be true>
381
+
382
+ ## Why
383
+ <Why this rule exists>
384
+
385
+ ## How
386
+ <How to follow it, with code examples>
387
+
388
+ ## Don't
389
+ <Common violations>
390
+ \`\`\`
391
+
392
+ Template for a Workflow skill:
393
+ \`\`\`markdown
394
+ ---
395
+ name: <hyphen-case-name>
396
+ description: >-
397
+ <Under 40 words. When should this trigger?>
398
+ ---
399
+
400
+ # <Workflow Name>
401
+
402
+ ## Prerequisites
403
+ <What must be in place>
404
+
405
+ ## Steps
406
+ <Numbered steps with code examples>
407
+
408
+ ## Verification
409
+ <How to confirm it worked>
410
+ \`\`\`
411
+
412
+ After creating, update the shared AGENTS.md resource to reference the new skill in its skills table.
413
+
414
+ Keep the skill concise (under 500 lines) and actionable.`,
415
+ submit: true,
416
+ });
417
+
418
+ setOpen(false);
419
+ onCreated?.();
420
+ };
421
+
422
+ const handleUploadSkillFiles = async (files: FileList | null) => {
423
+ if (!files || files.length === 0) return;
424
+ const file = files[0];
425
+ const text = await file.text();
426
+ const baseName = file.name.replace(/\.[^./]+$/, "");
427
+ const slug = slugifyName(
428
+ baseName.toLowerCase() === "skill" ? "uploaded-skill" : baseName,
429
+ );
430
+ setSkillUploadSlug(slug);
431
+ setSkillUploadContent(text);
432
+ setSkillUploadFileName(file.name);
433
+ setView("skill-upload");
434
+ };
435
+
436
+ const saveUploadedSkill = () => {
437
+ const slug = slugifyName(skillUploadSlug || "uploaded-skill");
438
+ const path = `skills/${slug}/SKILL.md`;
439
+ const fileLabel = skillUploadFileName || `${slug}/SKILL.md`;
440
+ onCreateResource(path, skillUploadContent, "text/markdown", {
441
+ onSuccess: (resource) => {
442
+ showToast?.("ok", `Skill "${fileLabel}" added`, {
443
+ resourceId: resource.id,
444
+ });
445
+ },
446
+ onError: (err) => {
447
+ const msg =
448
+ err instanceof Error && err.message
449
+ ? err.message
450
+ : "Failed to save skill file";
451
+ showToast?.("err", msg);
452
+ },
453
+ });
454
+ setOpen(false);
455
+ onCreated?.();
456
+ };
457
+
458
+ const submitJob = (text: string = value) => {
459
+ const trimmed = text.trim();
460
+ if (!trimmed) return;
461
+
462
+ sendToAgentChat({
463
+ message: `Create a recurring job: ${trimmed}`,
464
+ newTab: true,
465
+ context: `The user wants to create a recurring job. Their description: "${trimmed}"
466
+
467
+ Use the manage-jobs tool with action "create" to create this. You need to:
468
+ 1. Derive a hyphen-case name from the description
469
+ 2. Convert the schedule to a cron expression (e.g., "every weekday at 9am" → "0 9 * * 1-5")
470
+ 3. Write clear, self-contained instructions for what the agent should do each time the job runs
471
+ 4. Create it in ${scope} scope
472
+
473
+ The job will run automatically on the schedule. Make the instructions specific — include which actions to call and what to do with results.`,
474
+ submit: true,
475
+ });
476
+
477
+ setOpen(false);
478
+ };
479
+
480
+ const submitAgentPrompt = (text: string = value) => {
481
+ const trimmed = text.trim();
482
+ if (!trimmed) return;
483
+
484
+ sendToAgentChat({
485
+ message: `Create a custom agent: ${trimmed}`,
486
+ newTab: true,
487
+ context: `The user wants a reusable custom sub-agent profile for the workspace. Their description: "${trimmed}"
488
+
489
+ Create it as a ${scope} resource under "agents/<name>.md" using the \`resources\` tool with \`action: "write"\`.
490
+
491
+ Requirements:
492
+ 1. Derive a hyphen-case file name from the intent
493
+ 2. Use YAML frontmatter with:
494
+ - name
495
+ - description
496
+ - model (use "inherit" unless the request clearly needs a different model)
497
+ - tools (set to "inherit")
498
+ - delegate-default (set to false)
499
+ 3. Put the main operating instructions in the markdown body
500
+ 4. Keep it concise and directive, similar to a Claude Code-style custom agent
501
+
502
+ Template:
503
+ \`\`\`markdown
504
+ ---
505
+ name: Design
506
+ description: >-
507
+ Helps with product and interface design decisions.
508
+ model: inherit
509
+ tools: inherit
510
+ delegate-default: false
511
+ ---
512
+
513
+ # Role
514
+
515
+ You are a focused design agent.
516
+
517
+ ## Responsibilities
518
+
519
+ - ...
520
+
521
+ ## Approach
522
+
523
+ - ...
524
+ \`\`\`
525
+
526
+ The result should be a reusable agent profile, not a one-off task response.`,
527
+ submit: true,
528
+ });
529
+
530
+ setOpen(false);
531
+ onCreated?.();
532
+ };
533
+
534
+ const submitAgentManual = () => {
535
+ const trimmedName = agentName.trim();
536
+ const trimmedDescription = agentDescription.trim();
537
+ const trimmedInstructions = agentInstructions.trim();
538
+ if (!trimmedName || !trimmedDescription || !trimmedInstructions) return;
539
+
540
+ const slug = slugifyName(trimmedName);
541
+ onCreateResource(
542
+ `agents/${slug}.md`,
543
+ buildAgentResourceContent({
544
+ name: trimmedName,
545
+ description: trimmedDescription,
546
+ model: agentModel,
547
+ tools: "inherit",
548
+ body: trimmedInstructions,
549
+ }),
550
+ "text/markdown",
551
+ );
552
+ setOpen(false);
553
+ onCreated?.();
554
+ };
555
+
556
+ const menuItems: {
557
+ icon: React.ReactNode;
558
+ label: string;
559
+ desc: string;
560
+ action: () => void;
561
+ hoverAction?: () => void;
562
+ }[] = [
563
+ {
564
+ icon: <IconPlus className="h-3.5 w-3.5" />,
565
+ label: "Create File",
566
+ desc: "Add a new file at a path",
567
+ action: () => setView("file"),
568
+ },
569
+ {
570
+ icon: <IconBulb className="h-3.5 w-3.5" />,
571
+ label: "Create Skill",
572
+ desc: "Teach the agent a new ability",
573
+ action: openSkillFlyout,
574
+ hoverAction: openSkillFlyout,
575
+ },
576
+ {
577
+ icon: <IconClock className="h-3.5 w-3.5" />,
578
+ label: "Schedule Task",
579
+ desc: "Run something on a schedule",
580
+ action: () => setView("job"),
581
+ },
582
+ {
583
+ icon: <IconHierarchy2 className="h-3.5 w-3.5" />,
584
+ label: "Create Custom Agent",
585
+ desc: "Add a reusable sub-agent profile",
586
+ action: () => setView("agent-mode"),
587
+ },
588
+ {
589
+ icon: <IconBolt className="h-3.5 w-3.5" />,
590
+ label: "Create Automation",
591
+ desc: "Set up a when-X-do-Y rule",
592
+ action: () => {
593
+ setOpen(false);
594
+ window.dispatchEvent(
595
+ new CustomEvent("agent-panel:set-mode", {
596
+ detail: { mode: "chat" },
597
+ }),
598
+ );
599
+ sendToAgentChat({
600
+ message:
601
+ "Help me create a new automation. Ask me what I want to automate.",
602
+ context: `The user wants to create a new automation. Scope: personal. Use manage-automations with action=define to create it. Ask clarifying questions if needed about what event to trigger on, conditions, and what actions to take.`,
603
+ submit: true,
604
+ newTab: true,
605
+ });
606
+ onCreated?.();
607
+ },
608
+ },
609
+ ...(showMcpIntegrations
610
+ ? [
611
+ {
612
+ icon: <IconPlugConnected className="h-3.5 w-3.5" />,
613
+ label: t("mcpIntegrations.menuLabel"),
614
+ desc: t("mcpIntegrations.menuDescription"),
615
+ action: () => {
616
+ setOpen(false);
617
+ setMcpDialogOpen(true);
618
+ },
619
+ },
620
+ ]
621
+ : []),
622
+ ];
623
+ const visibleMenuItems = menuItems.filter((item) => {
624
+ if (!resourceFilter || resourceFilter === "files") return true;
625
+ if (resourceFilter === "agents")
626
+ return item.label === "Create Custom Agent";
627
+ if (resourceFilter === "skills") return item.label === "Create Skill";
628
+ return false;
629
+ });
630
+
631
+ return (
632
+ <>
633
+ <Popover open={open} onOpenChange={setOpen}>
634
+ <input
635
+ ref={skillFileInputRef}
636
+ type="file"
637
+ accept=".md,text/markdown"
638
+ multiple
639
+ className="hidden"
640
+ onChange={(e) => {
641
+ handleUploadSkillFiles(e.target.files);
642
+ e.target.value = "";
643
+ }}
644
+ />
645
+ <Tooltip>
646
+ <TooltipTrigger asChild>
647
+ <PopoverTrigger asChild>
648
+ <button
649
+ type="button"
650
+ className={cn(
651
+ "flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50",
652
+ open && "bg-accent/50 text-foreground",
653
+ )}
654
+ >
655
+ <IconPlus className="h-3.5 w-3.5" />
656
+ </button>
657
+ </PopoverTrigger>
658
+ </TooltipTrigger>
659
+ <TooltipContent>Create new...</TooltipContent>
660
+ </Tooltip>
661
+ <PopoverContent
662
+ align="end"
663
+ sideOffset={6}
664
+ collisionPadding={8}
665
+ className={cn(
666
+ "z-[260] p-0 text-[13px] leading-normal",
667
+ view === "menu" || view === "file"
668
+ ? "w-[260px]"
669
+ : "max-h-[70vh] w-[calc(100vw-24px)] max-w-[380px] overflow-y-auto",
670
+ )}
671
+ >
672
+ {view === "menu" && (
673
+ <div className="py-1">
674
+ {visibleMenuItems.map((item) => {
675
+ const isSkill = item.label === "Create Skill";
676
+ return (
677
+ <div
678
+ key={item.label}
679
+ className="relative"
680
+ onMouseEnter={(e) => {
681
+ if (isSkill) {
682
+ openSkillFlyout(e.currentTarget);
683
+ return;
684
+ }
685
+ if (!item.hoverAction) return;
686
+ if (skillHoverTimerRef.current)
687
+ window.clearTimeout(skillHoverTimerRef.current);
688
+ skillHoverTimerRef.current = window.setTimeout(() => {
689
+ item.hoverAction?.();
690
+ }, 180);
691
+ }}
692
+ onMouseLeave={() => {
693
+ if (isSkill) {
694
+ scheduleSkillFlyoutClose();
695
+ return;
696
+ }
697
+ if (skillHoverTimerRef.current) {
698
+ window.clearTimeout(skillHoverTimerRef.current);
699
+ skillHoverTimerRef.current = null;
700
+ }
701
+ }}
702
+ >
703
+ <button
704
+ type="button"
705
+ onClick={item.action}
706
+ className={cn(
707
+ "flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50",
708
+ isSkill && skillFlyoutOpen && "bg-accent/50",
709
+ )}
710
+ >
711
+ <span className="text-muted-foreground">{item.icon}</span>
712
+ <div className="min-w-0 flex-1">
713
+ <div className="text-[12px] font-medium text-foreground">
714
+ {item.label}
715
+ </div>
716
+ <div className="mt-0.5 text-[10px] text-muted-foreground/60">
717
+ {item.desc}
718
+ </div>
719
+ </div>
720
+ {isSkill && (
721
+ <span className="ml-auto text-muted-foreground/60">
722
+
723
+ </span>
724
+ )}
725
+ </button>
726
+ {isSkill && skillFlyoutOpen && (
727
+ <div
728
+ role="menu"
729
+ onMouseEnter={() => openSkillFlyout()}
730
+ onMouseLeave={scheduleSkillFlyoutClose}
731
+ className={cn(
732
+ "absolute top-0 z-20 w-[240px] rounded-lg border border-border bg-popover py-1 shadow-md",
733
+ skillFlyoutSide === "right"
734
+ ? "left-full ml-1"
735
+ : "right-full mr-1",
736
+ )}
737
+ >
738
+ <button
739
+ type="button"
740
+ onClick={() => {
741
+ setSkillFlyoutOpen(false);
742
+ setView("skill");
743
+ }}
744
+ className="flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50"
745
+ >
746
+ <span className="text-muted-foreground">
747
+ <IconBulb className="h-3.5 w-3.5" />
748
+ </span>
749
+ <div className="min-w-0">
750
+ <div className="text-[12px] font-medium text-foreground">
751
+ Create new skill
752
+ </div>
753
+ <div className="mt-0.5 text-[10px] text-muted-foreground/60">
754
+ Describe a skill and let the agent draft it
755
+ </div>
756
+ </div>
757
+ </button>
758
+ <button
759
+ type="button"
760
+ onClick={() => {
761
+ setSkillFlyoutOpen(false);
762
+ skillFileInputRef.current?.click();
763
+ }}
764
+ className="flex w-full items-center gap-2.5 px-3 py-2 text-left hover:bg-accent/50"
765
+ >
766
+ <span className="text-muted-foreground">
767
+ <IconUpload className="h-3.5 w-3.5" />
768
+ </span>
769
+ <div className="min-w-0">
770
+ <div className="text-[12px] font-medium text-foreground">
771
+ Upload skill file
772
+ </div>
773
+ <div className="mt-0.5 text-[10px] text-muted-foreground/60">
774
+ Import an existing SKILL.md file
775
+ </div>
776
+ </div>
777
+ </button>
778
+ </div>
779
+ )}
780
+ </div>
781
+ );
782
+ })}
783
+ </div>
784
+ )}
785
+
786
+ {view === "file" && (
787
+ <div className="p-3">
788
+ <label className="mb-1.5 block text-[11px] font-medium text-muted-foreground">
789
+ File path
790
+ </label>
791
+ <input
792
+ ref={inputRef as React.RefObject<HTMLInputElement>}
793
+ value={value}
794
+ onChange={(e) => setValue(e.target.value)}
795
+ onKeyDown={(e) => {
796
+ if (e.key === "Enter") submitFile();
797
+ if (e.key === "Escape") {
798
+ e.stopPropagation();
799
+ setView("menu");
800
+ }
801
+ }}
802
+ className="w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
803
+ placeholder="notes/ideas.md"
804
+ />
805
+ <div className="mt-2.5 flex justify-end">
806
+ <button
807
+ onClick={submitFile}
808
+ disabled={!value.trim()}
809
+ className="rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none"
810
+ >
811
+ Create
812
+ </button>
813
+ </div>
814
+ </div>
815
+ )}
816
+
817
+ {view === "skill" && (
818
+ <div className="p-3">
819
+ <label className="mb-1 block text-[11px] font-semibold text-foreground">
820
+ Create Skill
821
+ </label>
822
+ <p className="mb-2 text-[10px] text-muted-foreground/60 leading-relaxed">
823
+ Describe what kind of skill you want and the agent will create
824
+ it.
825
+ </p>
826
+ <PromptComposer
827
+ autoFocus
828
+ placeholder="e.g. A skill that reviews PRs for security issues and OWASP top 10 vulnerabilities"
829
+ draftScope="resources:create-skill"
830
+ onSubmit={(text) => submitSkill(text)}
831
+ />
832
+ </div>
833
+ )}
834
+
835
+ {view === "skill-upload" && (
836
+ <div className="p-3">
837
+ <label className="mb-1 block text-[11px] font-semibold text-foreground">
838
+ Upload skill file
839
+ </label>
840
+ <p className="mb-2 text-[10px] text-muted-foreground/60 leading-relaxed">
841
+ Review the content from{" "}
842
+ <span className="font-mono">
843
+ {skillUploadFileName || "the selected file"}
844
+ </span>{" "}
845
+ before saving.
846
+ </p>
847
+ <label className="mb-1 block text-[10px] font-medium text-muted-foreground">
848
+ Skill name
849
+ </label>
850
+ <input
851
+ value={skillUploadSlug}
852
+ onChange={(e) => setSkillUploadSlug(e.target.value)}
853
+ className="mb-2 w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
854
+ placeholder="my-skill"
855
+ />
856
+ <p className="mb-2 text-[10px] text-muted-foreground/60">
857
+ Will be saved at{" "}
858
+ <span className="font-mono">
859
+ skills/{slugifyName(skillUploadSlug || "uploaded-skill")}
860
+ /SKILL.md
861
+ </span>
862
+ </p>
863
+ <label className="mb-1 block text-[10px] font-medium text-muted-foreground">
864
+ Content
865
+ </label>
866
+ <textarea
867
+ value={skillUploadContent}
868
+ onChange={(e) => setSkillUploadContent(e.target.value)}
869
+ rows={14}
870
+ className="w-full rounded-md border border-border bg-background px-2.5 py-1.5 font-mono text-[11px] leading-relaxed text-foreground outline-none focus:ring-1 focus:ring-accent"
871
+ />
872
+ <div className="mt-2.5 flex justify-end gap-2">
873
+ <button
874
+ onClick={() => setView("menu")}
875
+ className="rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground hover:bg-accent/40"
876
+ >
877
+ Back
878
+ </button>
879
+ <button
880
+ onClick={saveUploadedSkill}
881
+ disabled={
882
+ !skillUploadContent.trim() || !skillUploadSlug.trim()
883
+ }
884
+ className="rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none"
885
+ >
886
+ Save
887
+ </button>
888
+ </div>
889
+ </div>
890
+ )}
891
+
892
+ {view === "job" && (
893
+ <div className="p-3">
894
+ <label className="mb-1 block text-[11px] font-semibold text-foreground">
895
+ Schedule Task
896
+ </label>
897
+ <p className="mb-2 text-[10px] text-muted-foreground/60 leading-relaxed">
898
+ Describe what should happen and when.
899
+ </p>
900
+ <PromptComposer
901
+ autoFocus
902
+ placeholder="e.g. Every weekday at 9am, check for overdue scorecards and send a Slack update"
903
+ draftScope="resources:create-job"
904
+ onSubmit={(text) => submitJob(text)}
905
+ />
906
+ </div>
907
+ )}
908
+
909
+ {view === "agent-mode" && (
910
+ <div className="p-3">
911
+ <label className="mb-1 block text-[11px] font-semibold text-foreground">
912
+ Create Agent
913
+ </label>
914
+ <p className="mb-2 text-[10px] leading-relaxed text-muted-foreground/60">
915
+ Build a reusable sub-agent profile for this workspace.
916
+ </p>
917
+ <div className="space-y-2">
918
+ <button
919
+ onClick={() => setView("agent-prompt")}
920
+ className="flex w-full items-start gap-2 rounded-md border border-border px-3 py-2 text-left hover:bg-accent/40"
921
+ >
922
+ <IconPencil className="mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground" />
923
+ <div>
924
+ <div className="text-[12px] font-medium text-foreground">
925
+ Describe It
926
+ </div>
927
+ <div className="text-[10px] text-muted-foreground/60">
928
+ Let the agent draft the profile from a prompt.
929
+ </div>
930
+ </div>
931
+ </button>
932
+ <button
933
+ onClick={() => setView("agent-form")}
934
+ className="flex w-full items-start gap-2 rounded-md border border-border px-3 py-2 text-left hover:bg-accent/40"
935
+ >
936
+ <IconHierarchy2 className="mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground" />
937
+ <div>
938
+ <div className="text-[12px] font-medium text-foreground">
939
+ Fill Form
940
+ </div>
941
+ <div className="text-[10px] text-muted-foreground/60">
942
+ Set the fields manually and start with a markdown
943
+ template.
944
+ </div>
945
+ </div>
946
+ </button>
947
+ </div>
948
+ </div>
949
+ )}
950
+
951
+ {view === "agent-prompt" && (
952
+ <div className="p-3">
953
+ <label className="mb-1 block text-[11px] font-semibold text-foreground">
954
+ Create Agent From Prompt
955
+ </label>
956
+ <p className="mb-2 text-[10px] text-muted-foreground/60 leading-relaxed">
957
+ Describe the agent you want. It will be saved under{" "}
958
+ <code>agents/</code>.
959
+ </p>
960
+ <PromptComposer
961
+ autoFocus
962
+ placeholder="e.g. A design agent that critiques layouts, suggests UI direction, and prefers concise product reasoning"
963
+ draftScope="resources:create-agent"
964
+ onSubmit={(text) => submitAgentPrompt(text)}
965
+ />
966
+ </div>
967
+ )}
968
+
969
+ {view === "agent-form" && (
970
+ <div className="p-3">
971
+ <label className="mb-2 block text-[11px] font-semibold text-foreground">
972
+ Create Agent Manually
973
+ </label>
974
+ <div className="space-y-2">
975
+ <input
976
+ value={agentName}
977
+ onChange={(e) => setAgentName(e.target.value)}
978
+ className="w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
979
+ placeholder="Agent name"
980
+ />
981
+ <input
982
+ value={agentDescription}
983
+ onChange={(e) => setAgentDescription(e.target.value)}
984
+ className="w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
985
+ placeholder="Short description"
986
+ />
987
+ <label className="block text-[11px] font-medium text-muted-foreground">
988
+ Model
989
+ </label>
990
+ <select
991
+ value={agentModel}
992
+ onChange={(e) => setAgentModel(e.target.value)}
993
+ className="w-full rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none focus:ring-1 focus:ring-accent"
994
+ >
995
+ {AGENT_MODEL_OPTIONS.map((option) => (
996
+ <option key={option.value} value={option.value}>
997
+ {option.label}
998
+ </option>
999
+ ))}
1000
+ </select>
1001
+ <label className="block text-[11px] font-medium text-muted-foreground">
1002
+ Instructions
1003
+ </label>
1004
+ <textarea
1005
+ value={agentInstructions}
1006
+ onChange={(e) => setAgentInstructions(e.target.value)}
1007
+ rows={8}
1008
+ className="w-full resize-y rounded-md border border-border bg-background px-2.5 py-1.5 text-[13px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent"
1009
+ style={{
1010
+ fontFamily:
1011
+ 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace',
1012
+ lineHeight: 1.5,
1013
+ }}
1014
+ />
1015
+ </div>
1016
+ <div className="mt-2.5 flex justify-end">
1017
+ <button
1018
+ onClick={submitAgentManual}
1019
+ disabled={
1020
+ !agentName.trim() ||
1021
+ !agentDescription.trim() ||
1022
+ !agentInstructions.trim()
1023
+ }
1024
+ className="rounded-md bg-accent px-3 py-1.5 text-[12px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40 disabled:pointer-events-none"
1025
+ >
1026
+ Create
1027
+ </button>
1028
+ </div>
1029
+ </div>
1030
+ )}
1031
+ </PopoverContent>
1032
+ </Popover>
1033
+ <McpIntegrationDialog
1034
+ open={mcpDialogOpen}
1035
+ onOpenChange={setMcpDialogOpen}
1036
+ defaultScope={defaultMcpScope}
1037
+ canCreateOrgMcp={canCreateOrgMcp}
1038
+ hasOrg={hasOrg}
1039
+ onCreateMcpServer={onCreateMcpServer}
1040
+ onCreated={onCreated}
1041
+ integrations={mcpIntegrations}
1042
+ />
1043
+ </>
1044
+ );
1045
+ }
1046
+
1047
+ // ─── PathBreadcrumb ─────────────────────────────────────────────────────────
1048
+
1049
+ function PathBreadcrumb({ path }: { path: string }) {
1050
+ const parts = path.split("/").filter(Boolean);
1051
+ return (
1052
+ <div className="flex items-center gap-0.5 text-[11px] text-muted-foreground/60 overflow-hidden">
1053
+ {parts.map((part, i) => (
1054
+ <React.Fragment key={i}>
1055
+ {i > 0 && <span className="shrink-0">/</span>}
1056
+ <span
1057
+ className={cn(
1058
+ "truncate",
1059
+ i === parts.length - 1 && "text-muted-foreground",
1060
+ )}
1061
+ >
1062
+ {part}
1063
+ </span>
1064
+ </React.Fragment>
1065
+ ))}
1066
+ </div>
1067
+ );
1068
+ }
1069
+
1070
+ // ─── ResourcesPanel ─────────────────────────────────────────────────────────
1071
+
1072
+ const DEFAULT_AGENTS_MD_CLIENT = `# Agent Instructions
1073
+
1074
+ This file customizes how the AI agent behaves in this app. Edit it to add your own instructions, preferences, and context.
1075
+
1076
+ ## What to put here
1077
+
1078
+ - **Preferences** — Tone, style, verbosity, response format
1079
+ - **Context** — Domain knowledge, terminology, team conventions
1080
+ - **Rules** — Things the agent should always/never do
1081
+ - **Skills** — Reference skill files for specialized tasks (create them in the \`skills/\` folder)
1082
+
1083
+ ## Skills
1084
+
1085
+ Create skill files under \`skills/<name>/SKILL.md\` to give the agent specialized knowledge. Reference them here:
1086
+
1087
+ | Skill | Path | Description |
1088
+ |-------|------|-------------|
1089
+ | *(use the skill button to create one)* | \`skills/example/SKILL.md\` | |
1090
+
1091
+ ## Workspace files
1092
+
1093
+ Workspace resources are for files users intentionally add, edit, or manage. Agents may create hidden \`agent_scratch\` resources for temporary working notes, scripts, or intermediate results; only promote those files into workspace visibility when a user explicitly asks to keep them.
1094
+ `;
1095
+
1096
+ const WORKSPACE_RESOURCE_OWNER = "__workspace__";
1097
+ const SHARED_RESOURCE_OWNER = "__shared__";
1098
+
1099
+ export interface ResourcesPanelProps {
1100
+ /** Hide the virtual MCP folder when Files is hosted by the Agent page. */
1101
+ showMcpServers?: boolean;
1102
+ /** Optional page-level scope to mirror in the resource toolbar. */
1103
+ scope?: ResourceScope;
1104
+ /** When set, show only the requested scope instead of both scope sections. */
1105
+ showOnlyRequestedScope?: boolean;
1106
+ /** Limit the tree to one agent-native resource collection. */
1107
+ resourceFilter?: ResourceView;
1108
+ /** Render special collections as cards instead of a nested file tree. */
1109
+ resourceTreeVariant?: ResourceTreeVariant;
1110
+ /** Optional app-owned remote MCP catalog. */
1111
+ mcpIntegrations?: DefaultMcpIntegration[];
1112
+ }
1113
+
1114
+ export function resolveInitialResourceScope(
1115
+ requestedScope: ResourceScope | undefined,
1116
+ canEditOrg: boolean,
1117
+ ): ResourceScope {
1118
+ if (requestedScope === "shared") return "shared";
1119
+ if (requestedScope === "personal") return "personal";
1120
+ return canEditOrg ? "shared" : "personal";
1121
+ }
1122
+
1123
+ export function ResourcesPanel({
1124
+ showMcpServers = true,
1125
+ scope: requestedScope,
1126
+ showOnlyRequestedScope = false,
1127
+ resourceFilter,
1128
+ resourceTreeVariant = "tree",
1129
+ mcpIntegrations,
1130
+ }: ResourcesPanelProps = {}) {
1131
+ const { data: org } = useOrg();
1132
+ // Non-admin org members get read-only access to organization resources.
1133
+ // Solo deployments (no orgId) behave as owner — users can edit their own.
1134
+ const canEditOrg =
1135
+ !org?.orgId || org.role === "owner" || org.role === "admin";
1136
+
1137
+ const [activeScope, setActiveScope] = useState<ResourceScope>(() =>
1138
+ resolveInitialResourceScope(requestedScope, canEditOrg),
1139
+ );
1140
+ const [selectedResourceId, setSelectedResourceId] = useState<string | null>(
1141
+ null,
1142
+ );
1143
+ const [toolbarDeleteConfirmId, setToolbarDeleteConfirmId] = useState<
1144
+ string | null
1145
+ >(null);
1146
+ const [dragOver, setDragOver] = useState(false);
1147
+ const [toast, setToast] = useState<{
1148
+ kind: "ok" | "err";
1149
+ message: string;
1150
+ resourceId?: string;
1151
+ } | null>(null);
1152
+ const toastTimerRef = useRef<number | null>(null);
1153
+ const showToast = useCallback(
1154
+ (
1155
+ kind: "ok" | "err",
1156
+ message: string,
1157
+ opts?: { resourceId?: string; durationMs?: number },
1158
+ ) => {
1159
+ setToast({ kind, message, resourceId: opts?.resourceId });
1160
+ if (toastTimerRef.current) window.clearTimeout(toastTimerRef.current);
1161
+ toastTimerRef.current = window.setTimeout(
1162
+ () => setToast(null),
1163
+ opts?.durationMs ?? 5000,
1164
+ );
1165
+ },
1166
+ [],
1167
+ );
1168
+ const [editorView, setEditorView] = useState<"visual" | "code">(() => {
1169
+ try {
1170
+ const v = localStorage.getItem("resource-editor-view");
1171
+ if (v === "code") return "code";
1172
+ } catch {}
1173
+ return "visual";
1174
+ });
1175
+ const [showAgentScratch, setShowAgentScratch] = useState(false);
1176
+
1177
+ useEffect(() => {
1178
+ setToolbarDeleteConfirmId(null);
1179
+ }, [selectedResourceId]);
1180
+ const fileInputRef = useRef<HTMLInputElement>(null);
1181
+
1182
+ const sharedTreeQuery = useResourceTree("shared", {
1183
+ includeAgentScratch: showAgentScratch,
1184
+ });
1185
+ const personalTreeQuery = useResourceTree("personal", {
1186
+ includeAgentScratch: showAgentScratch,
1187
+ });
1188
+ const workspaceTreeQuery = useResourceTree("workspace");
1189
+ const mcpServersQuery = useMcpServers();
1190
+ const builtinCapabilitiesQuery = useBuiltinCapabilities();
1191
+ const createMcpServer = useCreateMcpServer();
1192
+ const deleteMcpServer = useDeleteMcpServer();
1193
+
1194
+ // Merge MCP servers into each scope's tree as a virtual `mcp-servers/`
1195
+ // folder. The servers live in the settings store, not the resources
1196
+ // table — the virtual ids carry the `mcp:<scope>:<id>` prefix that
1197
+ // `handleSelect` and `handleDelete` below recognize to route back to
1198
+ // the MCP endpoints.
1199
+ const personalTree = withAgentScratchFolder(
1200
+ showMcpServers
1201
+ ? withMcpServersFolder(
1202
+ personalTreeQuery.data ?? [],
1203
+ mcpServersQuery.data?.user ?? [],
1204
+ {
1205
+ builtins: (builtinCapabilitiesQuery.data?.capabilities ?? []).map(
1206
+ (capability) => ({ capability, scope: "user" as const }),
1207
+ ),
1208
+ },
1209
+ )
1210
+ : (personalTreeQuery.data ?? []),
1211
+ { show: showAgentScratch },
1212
+ );
1213
+ const sharedTree = withAgentScratchFolder(
1214
+ showMcpServers
1215
+ ? withMcpServersFolder(
1216
+ sharedTreeQuery.data ?? [],
1217
+ mcpServersQuery.data?.org ?? [],
1218
+ {
1219
+ builtins: (builtinCapabilitiesQuery.data?.capabilities ?? []).map(
1220
+ (capability) => ({ capability, scope: "org" as const }),
1221
+ ),
1222
+ },
1223
+ )
1224
+ : (sharedTreeQuery.data ?? []),
1225
+ { show: showAgentScratch },
1226
+ );
1227
+ const workspaceTree = workspaceTreeQuery.data ?? [];
1228
+ const visiblePersonalTree = useMemo(
1229
+ () => filterResourceTree(personalTree, resourceFilter),
1230
+ [personalTree, resourceFilter],
1231
+ );
1232
+ const visibleSharedTree = useMemo(
1233
+ () => filterResourceTree(sharedTree, resourceFilter),
1234
+ [resourceFilter, sharedTree],
1235
+ );
1236
+ const visibleWorkspaceTree = useMemo(
1237
+ () => filterResourceTree(workspaceTree, resourceFilter),
1238
+ [resourceFilter, workspaceTree],
1239
+ );
1240
+ const displayedPersonalTree =
1241
+ showOnlyRequestedScope && activeScope !== "personal"
1242
+ ? []
1243
+ : visiblePersonalTree;
1244
+ const displayedSharedTree =
1245
+ showOnlyRequestedScope && activeScope !== "shared" ? [] : visibleSharedTree;
1246
+ const showSharedTree = !showOnlyRequestedScope || activeScope === "shared";
1247
+ const showPersonalTree =
1248
+ !showOnlyRequestedScope || activeScope === "personal";
1249
+
1250
+ const orgRole = mcpServersQuery.data?.role ?? org?.role ?? null;
1251
+ const hasOrgForMcp = !!(mcpServersQuery.data?.orgId ?? org?.orgId);
1252
+ const canCreateOrgMcp =
1253
+ hasOrgForMcp && (orgRole === "owner" || orgRole === "admin");
1254
+
1255
+ // Virtual MCP server currently selected in the tree (or null for a real
1256
+ // resource / nothing). Resolved by scanning both trees' mcp folders for
1257
+ // a matching virtual id.
1258
+ const selectedMcpServer = React.useMemo(() => {
1259
+ const parsed = selectedResourceId
1260
+ ? parseMcpVirtualId(selectedResourceId)
1261
+ : null;
1262
+ if (!parsed) return null;
1263
+ const list =
1264
+ parsed.scope === "user"
1265
+ ? (mcpServersQuery.data?.user ?? [])
1266
+ : (mcpServersQuery.data?.org ?? []);
1267
+ return list.find((s) => s.id === parsed.serverId) ?? null;
1268
+ }, [selectedResourceId, mcpServersQuery.data]);
1269
+
1270
+ const selectedBuiltinCapability = React.useMemo(() => {
1271
+ const parsed = selectedResourceId
1272
+ ? parseMcpBuiltinVirtualId(selectedResourceId)
1273
+ : null;
1274
+ if (!parsed) return null;
1275
+ const capability = (builtinCapabilitiesQuery.data?.capabilities ?? []).find(
1276
+ (item) => item.id === parsed.capabilityId,
1277
+ );
1278
+ return capability ? { capability, scope: parsed.scope } : null;
1279
+ }, [selectedResourceId, builtinCapabilitiesQuery.data]);
1280
+
1281
+ // Sync activeScope once the org role arrives (canEditOrg is resolved async).
1282
+ useEffect(() => {
1283
+ if (!requestedScope && !canEditOrg && activeScope === "shared") {
1284
+ setActiveScope("personal");
1285
+ }
1286
+ }, [canEditOrg, activeScope, requestedScope]);
1287
+
1288
+ useEffect(() => {
1289
+ if (!requestedScope) return;
1290
+ setActiveScope(requestedScope);
1291
+ }, [requestedScope]);
1292
+ // Virtual MCP ids aren't in the resources store — skip the fetch so
1293
+ // useResource doesn't 404-flash.
1294
+ const resourceQuery = useResource(
1295
+ selectedResourceId &&
1296
+ !parseMcpVirtualId(selectedResourceId) &&
1297
+ !parseMcpBuiltinVirtualId(selectedResourceId)
1298
+ ? selectedResourceId
1299
+ : null,
1300
+ );
1301
+ const createResource = useCreateResource();
1302
+ const updateResource = useUpdateResource();
1303
+ const deleteResource = useDeleteResource();
1304
+ const uploadResource = useUploadResource();
1305
+ const selectedResourceReadOnly =
1306
+ !!resourceQuery.data &&
1307
+ ((resourceQuery.data.owner === WORKSPACE_RESOURCE_OWNER &&
1308
+ !isLocalWorkspaceResource(resourceQuery.data)) ||
1309
+ (resourceQuery.data.owner === SHARED_RESOURCE_OWNER && !canEditOrg));
1310
+
1311
+ // Ensure AGENTS.md exists in the organization scope when the panel opens.
1312
+ // The server also seeds it on table init; this is a safety net. Only attempt
1313
+ // for users who can write to organization resources — non-admins would just
1314
+ // get a 403.
1315
+ const seededRef = useRef(false);
1316
+ useEffect(() => {
1317
+ if (seededRef.current || !canEditOrg) return;
1318
+ seededRef.current = true;
1319
+ fetch(agentNativePath("/_agent-native/resources"), {
1320
+ method: "POST",
1321
+ headers: { "Content-Type": "application/json" },
1322
+ body: JSON.stringify({
1323
+ path: "AGENTS.md",
1324
+ content: DEFAULT_AGENTS_MD_CLIENT,
1325
+ shared: true,
1326
+ ifNotExists: true,
1327
+ }),
1328
+ }).catch(() => {});
1329
+ }, [canEditOrg]);
1330
+
1331
+ // Are we viewing a file (editor) or the tree?
1332
+ const isEditing = selectedResourceId !== null;
1333
+
1334
+ const handleSelect = useCallback((resource: ResourceMeta) => {
1335
+ setSelectedResourceId(resource.id);
1336
+ }, []);
1337
+
1338
+ const handleBack = useCallback(() => {
1339
+ setSelectedResourceId(null);
1340
+ }, []);
1341
+
1342
+ const handleCreateFile = useCallback(
1343
+ (parentPath: string, name: string, scope: ResourceScope) => {
1344
+ const path = parentPath ? `${parentPath}/${name}` : name;
1345
+ createResource.mutate(
1346
+ { path, content: "", shared: scope === "shared" },
1347
+ {
1348
+ onSuccess: (data) => {
1349
+ setSelectedResourceId(data.id);
1350
+ },
1351
+ },
1352
+ );
1353
+ },
1354
+ [createResource],
1355
+ );
1356
+
1357
+ const handleCreateFolder = useCallback(
1358
+ (parentPath: string, name: string, scope: ResourceScope) => {
1359
+ const path = parentPath ? `${parentPath}/${name}/.keep` : `${name}/.keep`;
1360
+ createResource.mutate({ path, content: "", shared: scope === "shared" });
1361
+ },
1362
+ [createResource],
1363
+ );
1364
+
1365
+ const handleCreateFromToolbar = useCallback(
1366
+ (targetScope: ResourceScope, name: string) => {
1367
+ createResource.mutate(
1368
+ { path: name, content: "", shared: targetScope === "shared" },
1369
+ {
1370
+ onSuccess: (data) => {
1371
+ setSelectedResourceId(data.id);
1372
+ },
1373
+ },
1374
+ );
1375
+ },
1376
+ [createResource],
1377
+ );
1378
+
1379
+ const handleCreateResourceFromToolbar = useCallback(
1380
+ (
1381
+ targetScope: ResourceScope,
1382
+ path: string,
1383
+ content: string,
1384
+ mimeType?: string,
1385
+ opts?: {
1386
+ onSuccess?: (resource: ResourceMeta) => void;
1387
+ onError?: (err: unknown) => void;
1388
+ },
1389
+ ) => {
1390
+ createResource.mutate(
1391
+ { path, content, mimeType, shared: targetScope === "shared" },
1392
+ {
1393
+ onSuccess: (data) => {
1394
+ setSelectedResourceId(data.id);
1395
+ opts?.onSuccess?.(data);
1396
+ },
1397
+ onError: (err) => {
1398
+ opts?.onError?.(err);
1399
+ },
1400
+ },
1401
+ );
1402
+ },
1403
+ [createResource],
1404
+ );
1405
+
1406
+ const handleDelete = useCallback(
1407
+ (id: string) => {
1408
+ const mcp = parseMcpVirtualId(id);
1409
+ if (mcp) {
1410
+ deleteMcpServer.mutate(
1411
+ { id: mcp.serverId, scope: mcp.scope },
1412
+ {
1413
+ onSuccess: () => {
1414
+ if (selectedResourceId === id) setSelectedResourceId(null);
1415
+ },
1416
+ },
1417
+ );
1418
+ return;
1419
+ }
1420
+ if (parseMcpBuiltinVirtualId(id)) return;
1421
+ deleteResource.mutate(id);
1422
+ if (selectedResourceId === id) {
1423
+ setSelectedResourceId(null);
1424
+ }
1425
+ },
1426
+ [deleteResource, deleteMcpServer, selectedResourceId],
1427
+ );
1428
+
1429
+ const handleCreateMcpServer = useCallback(
1430
+ async (args: {
1431
+ scope: McpServerScope;
1432
+ name: string;
1433
+ url: string;
1434
+ headers?: Record<string, string>;
1435
+ description?: string;
1436
+ }) => {
1437
+ const server = await createMcpServer.mutateAsync(args);
1438
+ // Select the newly-created virtual entry so the detail view opens.
1439
+ setSelectedResourceId(`mcp:${args.scope}:${server.id}`);
1440
+ },
1441
+ [createMcpServer],
1442
+ );
1443
+
1444
+ const handleRename = useCallback(
1445
+ (id: string, newPath: string) => {
1446
+ updateResource.mutate({ id, path: newPath });
1447
+ },
1448
+ [updateResource],
1449
+ );
1450
+
1451
+ const handleSave = useCallback(
1452
+ (content: string) => {
1453
+ if (!selectedResourceId) return;
1454
+ if (selectedResourceReadOnly) return;
1455
+ updateResource.mutate({ id: selectedResourceId, content });
1456
+ },
1457
+ [updateResource, selectedResourceId, selectedResourceReadOnly],
1458
+ );
1459
+
1460
+ const handleUploadFiles = useCallback(
1461
+ (files: FileList, targetScope: ResourceScope) => {
1462
+ for (let i = 0; i < files.length; i++) {
1463
+ const file = files[i];
1464
+ const formData = new FormData();
1465
+ formData.append("file", file);
1466
+ formData.append("shared", targetScope === "shared" ? "true" : "false");
1467
+ uploadResource.mutate(formData);
1468
+ }
1469
+ },
1470
+ [uploadResource],
1471
+ );
1472
+
1473
+ const handleDragOver = useCallback((e: React.DragEvent) => {
1474
+ e.preventDefault();
1475
+ e.stopPropagation();
1476
+ setDragOver(true);
1477
+ }, []);
1478
+
1479
+ const handleDragLeave = useCallback((e: React.DragEvent) => {
1480
+ e.preventDefault();
1481
+ e.stopPropagation();
1482
+ setDragOver(false);
1483
+ }, []);
1484
+
1485
+ const handleDrop = useCallback(
1486
+ (e: React.DragEvent) => {
1487
+ e.preventDefault();
1488
+ e.stopPropagation();
1489
+ setDragOver(false);
1490
+ if (e.dataTransfer.files.length > 0) {
1491
+ handleUploadFiles(e.dataTransfer.files, activeScope);
1492
+ }
1493
+ },
1494
+ [activeScope, handleUploadFiles],
1495
+ );
1496
+
1497
+ const renderScopeCreateMenu = (targetScope: ResourceScope) => {
1498
+ if (resourceFilter !== "agents" && resourceFilter !== "skills") {
1499
+ return null;
1500
+ }
1501
+ if (targetScope === "shared" && !canEditOrg) return null;
1502
+ return (
1503
+ <CreateMenu
1504
+ scope={targetScope}
1505
+ resourceFilter={resourceFilter}
1506
+ onCreateFile={(name) => handleCreateFromToolbar(targetScope, name)}
1507
+ onCreateResource={(path, content, mimeType, opts) =>
1508
+ handleCreateResourceFromToolbar(
1509
+ targetScope,
1510
+ path,
1511
+ content,
1512
+ mimeType,
1513
+ opts,
1514
+ )
1515
+ }
1516
+ onCreateMcpServer={handleCreateMcpServer}
1517
+ canCreateOrgMcp={canCreateOrgMcp}
1518
+ hasOrg={hasOrgForMcp}
1519
+ showToast={showToast}
1520
+ mcpIntegrations={mcpIntegrations}
1521
+ />
1522
+ );
1523
+ };
1524
+
1525
+ return (
1526
+ <div
1527
+ className={cn(
1528
+ "relative flex h-full flex-col min-h-0",
1529
+ dragOver && "ring-2 ring-inset ring-accent",
1530
+ )}
1531
+ onDragOver={handleDragOver}
1532
+ onDragLeave={handleDragLeave}
1533
+ onDrop={handleDrop}
1534
+ >
1535
+ {/* Toolbar */}
1536
+ {isEditing ? (
1537
+ <div className="flex shrink-0 items-center justify-between border-b border-border px-2 py-1.5">
1538
+ <div className="flex items-center gap-1.5 min-w-0">
1539
+ <TooltipProvider delayDuration={200}>
1540
+ <Tooltip>
1541
+ <TooltipTrigger asChild>
1542
+ <button
1543
+ onClick={handleBack}
1544
+ aria-label="Back to workspace"
1545
+ className="flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50"
1546
+ >
1547
+ <IconArrowLeft className="h-3.5 w-3.5" />
1548
+ </button>
1549
+ </TooltipTrigger>
1550
+ <TooltipContent>Back to workspace</TooltipContent>
1551
+ </Tooltip>
1552
+ </TooltipProvider>
1553
+ {selectedMcpServer ? (
1554
+ <PathBreadcrumb
1555
+ path={`mcp-servers/${selectedMcpServer.name}.json`}
1556
+ />
1557
+ ) : selectedBuiltinCapability ? (
1558
+ <PathBreadcrumb
1559
+ path={`mcp-servers/${selectedBuiltinCapability.capability.name}.json`}
1560
+ />
1561
+ ) : resourceQuery.data ? (
1562
+ <PathBreadcrumb path={resourceQuery.data.path} />
1563
+ ) : null}
1564
+ </div>
1565
+ <div className="flex items-center gap-1 shrink-0">
1566
+ {!selectedMcpServer &&
1567
+ resourceQuery.data &&
1568
+ selectedResourceReadOnly && (
1569
+ <span
1570
+ aria-live="polite"
1571
+ className="mr-1 w-16 text-right text-[11px] text-muted-foreground/60"
1572
+ >
1573
+ Read only
1574
+ </span>
1575
+ )}
1576
+ {!selectedMcpServer &&
1577
+ resourceQuery.data &&
1578
+ (resourceQuery.data.mimeType === "text/markdown" ||
1579
+ resourceQuery.data.path.endsWith(".md")) && (
1580
+ <div className="flex items-center gap-0.5 mr-1">
1581
+ <TooltipProvider delayDuration={200}>
1582
+ <Tooltip>
1583
+ <TooltipTrigger asChild>
1584
+ <button
1585
+ onClick={() => setEditorView("visual")}
1586
+ aria-label="Visual editor"
1587
+ className={cn(
1588
+ "flex h-6 w-6 items-center justify-center rounded-md",
1589
+ editorView === "visual"
1590
+ ? "bg-accent text-foreground"
1591
+ : "text-muted-foreground hover:text-foreground hover:bg-accent/50",
1592
+ )}
1593
+ >
1594
+ <IconEye className="h-3.5 w-3.5" />
1595
+ </button>
1596
+ </TooltipTrigger>
1597
+ <TooltipContent>Visual editor</TooltipContent>
1598
+ </Tooltip>
1599
+ <Tooltip>
1600
+ <TooltipTrigger asChild>
1601
+ <button
1602
+ onClick={() => setEditorView("code")}
1603
+ aria-label="Code editor"
1604
+ className={cn(
1605
+ "flex h-6 w-6 items-center justify-center rounded-md",
1606
+ editorView === "code"
1607
+ ? "bg-accent text-foreground"
1608
+ : "text-muted-foreground hover:text-foreground hover:bg-accent/50",
1609
+ )}
1610
+ >
1611
+ <IconCode className="h-3.5 w-3.5" />
1612
+ </button>
1613
+ </TooltipTrigger>
1614
+ <TooltipContent>Code editor</TooltipContent>
1615
+ </Tooltip>
1616
+ </TooltipProvider>
1617
+ </div>
1618
+ )}
1619
+ {!selectedBuiltinCapability && !selectedResourceReadOnly && (
1620
+ <TooltipProvider delayDuration={200}>
1621
+ <Tooltip>
1622
+ <TooltipTrigger asChild>
1623
+ <button
1624
+ onClick={() => {
1625
+ if (!selectedResourceId) return;
1626
+ if (toolbarDeleteConfirmId === selectedResourceId) {
1627
+ handleDelete(selectedResourceId);
1628
+ setToolbarDeleteConfirmId(null);
1629
+ } else {
1630
+ setToolbarDeleteConfirmId(selectedResourceId);
1631
+ }
1632
+ }}
1633
+ aria-label={
1634
+ toolbarDeleteConfirmId === selectedResourceId
1635
+ ? "Confirm delete resource"
1636
+ : "Delete resource"
1637
+ }
1638
+ className={cn(
1639
+ "flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-destructive hover:bg-accent/50",
1640
+ toolbarDeleteConfirmId === selectedResourceId &&
1641
+ "bg-destructive/10 text-destructive",
1642
+ )}
1643
+ >
1644
+ <IconTrash className="h-3.5 w-3.5" />
1645
+ </button>
1646
+ </TooltipTrigger>
1647
+ <TooltipContent>
1648
+ {toolbarDeleteConfirmId === selectedResourceId
1649
+ ? "Click again to delete"
1650
+ : "Delete resource"}
1651
+ </TooltipContent>
1652
+ </Tooltip>
1653
+ </TooltipProvider>
1654
+ )}
1655
+ </div>
1656
+ </div>
1657
+ ) : (
1658
+ /* Floating action buttons — absolute top-right over tree view */
1659
+ <div className="absolute top-1 right-1 z-10 flex items-center gap-1">
1660
+ {(!resourceFilter || resourceFilter === "files") && (
1661
+ <CreateMenu
1662
+ scope={activeScope}
1663
+ resourceFilter={resourceFilter}
1664
+ onCreateFile={(name) =>
1665
+ handleCreateFromToolbar(activeScope, name)
1666
+ }
1667
+ onCreateResource={(path, content, mimeType, opts) =>
1668
+ handleCreateResourceFromToolbar(
1669
+ activeScope,
1670
+ path,
1671
+ content,
1672
+ mimeType,
1673
+ opts,
1674
+ )
1675
+ }
1676
+ onCreateMcpServer={handleCreateMcpServer}
1677
+ canCreateOrgMcp={canCreateOrgMcp}
1678
+ hasOrg={hasOrgForMcp}
1679
+ showToast={showToast}
1680
+ mcpIntegrations={mcpIntegrations}
1681
+ />
1682
+ )}
1683
+ {(!resourceFilter || resourceFilter === "files") && (
1684
+ <>
1685
+ <TooltipProvider delayDuration={200}>
1686
+ <Tooltip>
1687
+ <TooltipTrigger asChild>
1688
+ <button
1689
+ onClick={() => fileInputRef.current?.click()}
1690
+ aria-label="Upload file"
1691
+ className="flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50"
1692
+ >
1693
+ <IconUpload className="h-3.5 w-3.5" />
1694
+ </button>
1695
+ </TooltipTrigger>
1696
+ <TooltipContent>Upload file</TooltipContent>
1697
+ </Tooltip>
1698
+ </TooltipProvider>
1699
+ <TooltipProvider delayDuration={200}>
1700
+ <Tooltip>
1701
+ <TooltipTrigger asChild>
1702
+ <button
1703
+ type="button"
1704
+ onClick={() => setShowAgentScratch((value) => !value)}
1705
+ aria-label={
1706
+ showAgentScratch
1707
+ ? "Hide agent scratch files"
1708
+ : "Show agent scratch files"
1709
+ }
1710
+ className={cn(
1711
+ "flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50",
1712
+ showAgentScratch && "bg-accent/50 text-foreground",
1713
+ )}
1714
+ >
1715
+ <IconEye className="h-3.5 w-3.5" />
1716
+ </button>
1717
+ </TooltipTrigger>
1718
+ <TooltipContent>
1719
+ {showAgentScratch
1720
+ ? "Hide agent scratch files"
1721
+ : "Show agent scratch files"}
1722
+ </TooltipContent>
1723
+ </Tooltip>
1724
+ </TooltipProvider>
1725
+ <TooltipProvider delayDuration={200}>
1726
+ <Tooltip>
1727
+ <TooltipTrigger asChild>
1728
+ <a
1729
+ href={WORKSPACE_DOCS_URL}
1730
+ target="_blank"
1731
+ rel="noopener noreferrer"
1732
+ aria-label="Open Resources docs"
1733
+ className="flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-accent/50"
1734
+ >
1735
+ <IconHelp className="h-3.5 w-3.5" />
1736
+ </a>
1737
+ </TooltipTrigger>
1738
+ <TooltipContent side="left" sideOffset={8}>
1739
+ Open Resources docs
1740
+ </TooltipContent>
1741
+ </Tooltip>
1742
+ </TooltipProvider>
1743
+ </>
1744
+ )}
1745
+ <input
1746
+ ref={fileInputRef}
1747
+ type="file"
1748
+ multiple
1749
+ className="hidden"
1750
+ onChange={(e) => {
1751
+ if (e.target.files && e.target.files.length > 0) {
1752
+ handleUploadFiles(e.target.files, activeScope);
1753
+ e.target.value = "";
1754
+ }
1755
+ }}
1756
+ />
1757
+ </div>
1758
+ )}
1759
+
1760
+ {/* Content: either tree OR editor (single view) */}
1761
+ <div className="flex flex-1 flex-col min-h-0 overflow-hidden">
1762
+ {isEditing ? (
1763
+ selectedMcpServer ? (
1764
+ <div className="flex-1 min-h-0 overflow-hidden">
1765
+ <McpServerDetail server={selectedMcpServer} />
1766
+ </div>
1767
+ ) : selectedBuiltinCapability ? (
1768
+ <div className="flex-1 min-h-0 overflow-hidden">
1769
+ <BuiltinCapabilityDetail
1770
+ capability={selectedBuiltinCapability.capability}
1771
+ scope={selectedBuiltinCapability.scope}
1772
+ canEditOrg={canEditOrg}
1773
+ />
1774
+ </div>
1775
+ ) : selectedResourceId && resourceQuery.data ? (
1776
+ <div className="flex flex-1 min-h-0 flex-col overflow-hidden">
1777
+ <ResourceEditor
1778
+ resource={resourceQuery.data}
1779
+ onSave={handleSave}
1780
+ view={editorView}
1781
+ onViewChange={setEditorView}
1782
+ hideToolbar
1783
+ readOnly={selectedResourceReadOnly}
1784
+ />
1785
+ </div>
1786
+ ) : resourceQuery.isError ? (
1787
+ <div className="flex flex-1 items-center justify-center text-[12px] text-destructive/70">
1788
+ Failed to load resource
1789
+ </div>
1790
+ ) : (
1791
+ <div className="flex flex-1 items-center justify-center text-[12px] text-muted-foreground/50">
1792
+ Loading...
1793
+ </div>
1794
+ )
1795
+ ) : (
1796
+ <div className="flex-1 min-h-0 overflow-y-auto">
1797
+ {!personalTreeQuery.isLoading &&
1798
+ !sharedTreeQuery.isLoading &&
1799
+ !workspaceTreeQuery.isLoading &&
1800
+ visibleWorkspaceTree.length === 0 &&
1801
+ displayedPersonalTree.length === 0 &&
1802
+ displayedSharedTree.length === 0 && (
1803
+ <div className="mx-2 mt-2 rounded-md border border-border bg-muted/30 p-2.5 text-[11px] text-muted-foreground">
1804
+ <p className="mb-1 font-medium text-foreground">
1805
+ This is your Workspace
1806
+ </p>
1807
+ <p className="mb-1.5 leading-snug">
1808
+ Files the agent reads and writes — notes, instructions,
1809
+ skills, custom agents, scheduled jobs, and inherited
1810
+ workspace context. They live in the database or, in local
1811
+ file mode, in the attached repo.
1812
+ </p>
1813
+ <p className="mb-2 leading-snug">
1814
+ <span className="text-foreground">Workspace</span> is
1815
+ inherited from Dispatch or local file mode.{" "}
1816
+ <span className="text-foreground">Organization</span> is
1817
+ visible to everyone in your organization
1818
+ {org?.orgId ? " — only admins can edit. " : ". "}
1819
+ <span className="text-foreground">Personal</span> is just
1820
+ for you.
1821
+ </p>
1822
+ <a
1823
+ href={WORKSPACE_DOCS_URL}
1824
+ target="_blank"
1825
+ rel="noopener noreferrer"
1826
+ className="inline-flex items-center gap-1 text-foreground hover:underline"
1827
+ >
1828
+ Learn more
1829
+ <IconExternalLink className="h-3 w-3" />
1830
+ </a>
1831
+ </div>
1832
+ )}
1833
+ {visibleWorkspaceTree.length > 0 && (
1834
+ <ResourceTree
1835
+ tree={visibleWorkspaceTree}
1836
+ variant={resourceTreeVariant}
1837
+ isLoading={workspaceTreeQuery.isLoading}
1838
+ deletingId={
1839
+ deleteResource.isPending
1840
+ ? (deleteResource.variables as string)
1841
+ : deleteMcpServer.isPending
1842
+ ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1843
+ : null
1844
+ }
1845
+ selectedId={selectedResourceId}
1846
+ onSelect={handleSelect}
1847
+ onCreateFile={() => {}}
1848
+ onCreateFolder={() => {}}
1849
+ onDelete={() => {}}
1850
+ onRename={() => {}}
1851
+ onDrop={() => {}}
1852
+ title="Workspace"
1853
+ titleTooltip="Global resources inherited by every app. Dispatch resources are read-only; local file mode resources can be edited here."
1854
+ readOnly
1855
+ headingHint="Inherited"
1856
+ />
1857
+ )}
1858
+ {showPersonalTree && (
1859
+ <ResourceTree
1860
+ tree={displayedPersonalTree}
1861
+ variant={resourceTreeVariant}
1862
+ isLoading={personalTreeQuery.isLoading}
1863
+ deletingId={
1864
+ deleteResource.isPending
1865
+ ? (deleteResource.variables as string)
1866
+ : deleteMcpServer.isPending
1867
+ ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1868
+ : null
1869
+ }
1870
+ selectedId={selectedResourceId}
1871
+ onSelect={handleSelect}
1872
+ onCreateFile={(parentPath, name) =>
1873
+ handleCreateFile(parentPath, name, "personal")
1874
+ }
1875
+ onCreateFolder={(parentPath, name) =>
1876
+ handleCreateFolder(parentPath, name, "personal")
1877
+ }
1878
+ onDelete={handleDelete}
1879
+ onRename={handleRename}
1880
+ onDrop={(files) => handleUploadFiles(files, "personal")}
1881
+ title="Personal"
1882
+ titleTooltip="Files visible only to you"
1883
+ sectionAction={renderScopeCreateMenu("personal")}
1884
+ />
1885
+ )}
1886
+ {showSharedTree && (
1887
+ <ResourceTree
1888
+ tree={displayedSharedTree}
1889
+ variant={resourceTreeVariant}
1890
+ isLoading={sharedTreeQuery.isLoading}
1891
+ deletingId={
1892
+ deleteResource.isPending
1893
+ ? (deleteResource.variables as string)
1894
+ : deleteMcpServer.isPending
1895
+ ? `mcp:${(deleteMcpServer.variables as { scope: string }).scope}:${(deleteMcpServer.variables as { id: string }).id}`
1896
+ : null
1897
+ }
1898
+ selectedId={selectedResourceId}
1899
+ onSelect={handleSelect}
1900
+ onCreateFile={(parentPath, name) =>
1901
+ handleCreateFile(parentPath, name, "shared")
1902
+ }
1903
+ onCreateFolder={(parentPath, name) =>
1904
+ handleCreateFolder(parentPath, name, "shared")
1905
+ }
1906
+ onDelete={handleDelete}
1907
+ onRename={handleRename}
1908
+ onDrop={(files) => handleUploadFiles(files, "shared")}
1909
+ title="Organization"
1910
+ titleTooltip={
1911
+ canEditOrg
1912
+ ? "Files visible to everyone in your organization"
1913
+ : "Files visible to everyone in your organization. Read-only — only admins can edit."
1914
+ }
1915
+ readOnly={!canEditOrg}
1916
+ headingHint={!canEditOrg ? "Read only" : undefined}
1917
+ sectionAction={renderScopeCreateMenu("shared")}
1918
+ />
1919
+ )}
1920
+ </div>
1921
+ )}
1922
+ </div>
1923
+ {toast && (
1924
+ <div className="pointer-events-none absolute bottom-3 left-1/2 z-[300] -translate-x-1/2">
1925
+ <div
1926
+ role="status"
1927
+ className={cn(
1928
+ "pointer-events-auto flex max-w-[320px] items-center gap-3 rounded-md border px-3 py-2 text-[12px] shadow-md",
1929
+ toast.kind === "ok"
1930
+ ? "border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-300"
1931
+ : "border-red-500/40 bg-red-500/10 text-red-600 dark:text-red-300",
1932
+ )}
1933
+ >
1934
+ <span className="min-w-0 flex-1 truncate">{toast.message}</span>
1935
+ {toast.kind === "ok" && toast.resourceId && (
1936
+ <button
1937
+ type="button"
1938
+ onClick={() => {
1939
+ setSelectedResourceId(toast.resourceId!);
1940
+ setToast(null);
1941
+ }}
1942
+ className="shrink-0 rounded px-1.5 py-0.5 text-[11px] font-medium underline-offset-2 hover:underline"
1943
+ >
1944
+ View
1945
+ </button>
1946
+ )}
1947
+ <button
1948
+ type="button"
1949
+ aria-label="Dismiss"
1950
+ onClick={() => setToast(null)}
1951
+ className="shrink-0 text-current/60 hover:text-current"
1952
+ >
1953
+ ×
1954
+ </button>
1955
+ </div>
1956
+ </div>
1957
+ )}
1958
+ </div>
1959
+ );
1960
+ }