@agent-native/core 0.117.1 → 0.118.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (815) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +40 -0
  3. package/corpus/core/docs/content/custom-design-system.mdx +445 -0
  4. package/corpus/core/docs/content/toolkit-ui.mdx +16 -0
  5. package/corpus/core/package.json +2 -1
  6. package/corpus/core/src/a2a/types.ts +1 -0
  7. package/corpus/core/src/agent/types.ts +1 -1
  8. package/corpus/core/src/cli/context-xray-local.ts +1 -1
  9. package/corpus/core/src/client/AgentPanel.tsx +90 -107
  10. package/corpus/core/src/client/AssistantChat.tsx +30 -13
  11. package/corpus/core/src/client/CommandMenu.tsx +68 -178
  12. package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
  13. package/corpus/core/src/client/app-providers.tsx +1 -1
  14. package/corpus/core/src/client/chat/message-components.tsx +116 -10
  15. package/corpus/core/src/client/chat/tool-call-display.tsx +26 -5
  16. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  17. package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
  18. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +4 -4
  19. package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  20. package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  21. package/corpus/core/src/client/extensions/delete-extension.ts +2 -2
  22. package/corpus/core/src/client/i18n.tsx +22 -0
  23. package/corpus/core/src/client/index.ts +17 -0
  24. package/corpus/core/src/client/org/OrgSwitcher.tsx +25 -1
  25. package/corpus/core/src/client/org/TeamPage.tsx +257 -153
  26. package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
  27. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  28. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
  29. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +13 -0
  30. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
  31. package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +302 -254
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
  34. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  35. package/corpus/core/src/client/settings/index.ts +7 -0
  36. package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
  37. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  38. package/corpus/core/src/client/setup-connections/index.ts +10 -0
  39. package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  40. package/corpus/core/src/client/sharing/ShareButton.tsx +71 -592
  41. package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
  42. package/corpus/core/src/client/sharing/index.ts +42 -0
  43. package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
  44. package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
  45. package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
  46. package/corpus/core/src/client/sse-event-processor.ts +23 -0
  47. package/corpus/core/src/client/tool-display.ts +71 -0
  48. package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
  49. package/corpus/core/src/client/use-chat-threads.ts +33 -12
  50. package/corpus/core/src/db/client.ts +13 -10
  51. package/corpus/core/src/extensions/actions.ts +13 -5
  52. package/corpus/core/src/extensions/local.ts +1 -0
  53. package/corpus/core/src/extensions/routes.ts +10 -5
  54. package/corpus/core/src/extensions/schema.ts +5 -0
  55. package/corpus/core/src/extensions/slots/store.ts +14 -4
  56. package/corpus/core/src/extensions/store.ts +55 -19
  57. package/corpus/core/src/extensions/theme.ts +1 -1
  58. package/corpus/core/src/file-upload/registry.ts +9 -0
  59. package/corpus/core/src/index.browser.ts +5 -0
  60. package/corpus/core/src/index.ts +1 -0
  61. package/corpus/core/src/localization/default-messages.ts +28 -6
  62. package/corpus/core/src/mcp-client/oauth-routes.ts +16 -2
  63. package/corpus/core/src/scripts/call-agent.ts +5 -1
  64. package/corpus/core/src/server/action-discovery.ts +8 -0
  65. package/corpus/core/src/server/better-auth-instance.ts +7 -2
  66. package/corpus/core/src/server/email-template.ts +18 -0
  67. package/corpus/core/src/server/email-templates.ts +3 -0
  68. package/corpus/core/src/server/email.ts +40 -4
  69. package/corpus/core/src/server/realtime-voice.ts +1 -1
  70. package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
  71. package/corpus/core/src/styles/agent-native.css +0 -24
  72. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  73. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  74. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  75. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  76. package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  77. package/corpus/core/src/templates/default/app/design-system.ts +3 -0
  78. package/corpus/core/src/templates/default/app/global.css +1 -1
  79. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
  80. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
  81. package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
  82. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
  83. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
  84. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
  85. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
  86. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
  87. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
  88. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
  89. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
  90. package/corpus/core/src/templates/default/app/root.tsx +5 -2
  91. package/corpus/core/src/templates/default/package.json +1 -0
  92. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  93. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  94. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  95. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  96. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  97. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  98. package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
  99. package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
  100. package/corpus/core/src/user-profile/index.ts +5 -0
  101. package/corpus/core/src/user-profile/shared.ts +14 -0
  102. package/corpus/core/src/user-profile/store.ts +50 -0
  103. package/corpus/core/src/vite/client.ts +39 -0
  104. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  105. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  106. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
  107. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
  108. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
  109. package/corpus/templates/analytics/app/design-system.ts +3 -0
  110. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  111. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  112. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
  113. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
  114. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
  115. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
  116. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
  117. package/corpus/templates/assets/app/design-system.ts +3 -0
  118. package/corpus/templates/assets/app/global.css +1 -1
  119. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
  120. package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  121. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  122. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  123. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
  124. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
  125. package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
  126. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
  127. package/corpus/templates/brain/app/design-system.ts +3 -0
  128. package/corpus/templates/brain/app/global.css +2 -2
  129. package/corpus/templates/brain/app/lib/brain.ts +2 -2
  130. package/corpus/templates/brain/app/root.tsx +2 -2
  131. package/corpus/templates/brain/app/routes/sources.tsx +8 -8
  132. package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  133. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  134. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  135. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
  136. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
  137. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
  138. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
  139. package/corpus/templates/calendar/app/design-system.ts +3 -0
  140. package/corpus/templates/calendar/app/global.css +1 -1
  141. package/corpus/templates/calendar/app/root.tsx +2 -2
  142. package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  143. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  144. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  145. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  146. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  147. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  148. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  149. package/corpus/templates/chat/app/design-system.ts +3 -0
  150. package/corpus/templates/chat/app/global.css +1 -1
  151. package/corpus/templates/chat/app/root.tsx +2 -2
  152. package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  153. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  154. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  155. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
  156. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
  157. package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
  158. package/corpus/templates/clips/actions/invite-member.ts +1 -0
  159. package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
  160. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
  161. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
  162. package/corpus/templates/clips/app/design-system.ts +3 -0
  163. package/corpus/templates/clips/app/global.css +1 -1
  164. package/corpus/templates/clips/app/root.tsx +7 -2
  165. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  166. package/corpus/templates/clips/app/routes/record.tsx +2 -88
  167. package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
  168. package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
  169. package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
  170. package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
  171. package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  173. package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +100 -62
  177. package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
  178. package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
  179. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
  180. package/corpus/templates/clips/desktop/src/styles.css +111 -36
  181. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
  182. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +11 -2
  183. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
  184. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
  185. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
  186. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
  187. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
  188. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
  189. package/corpus/templates/clips/server/plugins/db.ts +6 -2
  190. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  191. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  192. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
  193. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
  194. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
  195. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  196. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
  197. package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
  198. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
  199. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
  200. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
  201. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
  202. package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
  203. package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
  204. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
  205. package/corpus/templates/content/app/design-system.ts +3 -0
  206. package/corpus/templates/content/app/global.css +30 -4
  207. package/corpus/templates/content/app/root.tsx +2 -2
  208. package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  209. package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
  210. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  211. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  212. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +10 -10
  213. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +1 -6
  214. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +3 -2
  215. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +13 -12
  216. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +17 -17
  217. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +8 -8
  218. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +3 -8
  219. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +2 -1
  220. package/corpus/templates/crm/app/components/crm/Surface.tsx +3 -2
  221. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +2 -2
  222. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +7 -7
  223. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +1 -1
  224. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
  225. package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
  226. package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
  227. package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
  228. package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
  229. package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
  230. package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
  231. package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
  232. package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
  233. package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
  234. package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
  235. package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
  236. package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
  237. package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
  238. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
  239. package/corpus/templates/crm/app/design-system.ts +3 -0
  240. package/corpus/templates/crm/app/global.css +1 -1
  241. package/corpus/templates/crm/app/root.tsx +9 -6
  242. package/corpus/templates/crm/app/routes/dashboard.tsx +1 -1
  243. package/corpus/templates/crm/app/routes/proposals.tsx +13 -13
  244. package/corpus/templates/crm/app/routes/setup.tsx +9 -9
  245. package/corpus/templates/crm/app/routes/tasks.tsx +14 -14
  246. package/corpus/templates/crm/app/routes/views.tsx +16 -16
  247. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  248. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  249. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
  250. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
  251. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
  252. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
  253. package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
  254. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
  255. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
  256. package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
  257. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
  258. package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
  259. package/corpus/templates/design/app/components/ui/command.tsx +1 -0
  260. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
  261. package/corpus/templates/design/app/design-system.ts +3 -0
  262. package/corpus/templates/design/app/global.css +1 -1
  263. package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
  264. package/corpus/templates/design/app/root.tsx +2 -2
  265. package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
  266. package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
  267. package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  268. package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
  269. package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
  270. package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
  271. package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
  272. package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
  273. package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
  274. package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
  275. package/corpus/templates/design/server/db/index.ts +4 -0
  276. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  277. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  278. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
  279. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
  280. package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
  281. package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
  282. package/corpus/templates/dispatch/app/design-system.ts +3 -0
  283. package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
  284. package/corpus/templates/dispatch/app/global.css +1 -1
  285. package/corpus/templates/dispatch/app/root.tsx +12 -9
  286. package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  287. package/corpus/templates/dispatch/package.json +1 -0
  288. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  289. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  290. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
  291. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
  292. package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
  293. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  294. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
  295. package/corpus/templates/forms/app/design-system.ts +3 -0
  296. package/corpus/templates/forms/app/global.css +1 -1
  297. package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
  298. package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
  299. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
  300. package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
  301. package/corpus/templates/forms/app/root.tsx +2 -2
  302. package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
  303. package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  304. package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
  305. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  306. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  307. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
  308. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
  309. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
  310. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
  311. package/corpus/templates/macros/app/design-system.ts +3 -0
  312. package/corpus/templates/macros/app/root.tsx +2 -2
  313. package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  314. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  315. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  316. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
  317. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
  318. package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
  319. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
  320. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
  321. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
  322. package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
  323. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
  324. package/corpus/templates/mail/app/design-system.ts +3 -0
  325. package/corpus/templates/mail/app/global.css +1 -1
  326. package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
  327. package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  328. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  329. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  330. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
  331. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
  332. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
  333. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  334. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
  335. package/corpus/templates/plan/app/design-system.ts +3 -0
  336. package/corpus/templates/plan/app/global.css +1 -1
  337. package/corpus/templates/plan/app/root.tsx +2 -2
  338. package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  339. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  340. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  341. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
  342. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
  343. package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
  344. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
  345. package/corpus/templates/slides/app/design-system.ts +3 -0
  346. package/corpus/templates/slides/app/root.tsx +2 -2
  347. package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  348. package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
  349. package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
  350. package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
  351. package/corpus/templates/slides/server/plugins/db.ts +44 -17
  352. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  353. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  354. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
  355. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
  356. package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
  357. package/corpus/templates/tasks/app/design-system.ts +3 -0
  358. package/corpus/templates/tasks/app/global.css +1 -1
  359. package/corpus/templates/tasks/app/root.tsx +5 -2
  360. package/corpus/toolkit/CHANGELOG.md +14 -0
  361. package/corpus/toolkit/agent-native.eject.json +71 -0
  362. package/corpus/toolkit/package.json +31 -1
  363. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
  364. package/corpus/toolkit/src/chat-history/index.ts +9 -0
  365. package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
  366. package/corpus/toolkit/src/chat-history.css +2 -0
  367. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
  368. package/corpus/toolkit/src/composer/PromptComposer.tsx +27 -6
  369. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +107 -22
  370. package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  371. package/corpus/toolkit/src/conformance/index.ts +3 -0
  372. package/corpus/toolkit/src/conformance/runner.tsx +710 -0
  373. package/corpus/toolkit/src/conformance/types.ts +45 -0
  374. package/corpus/toolkit/src/conformance/version.ts +22 -0
  375. package/corpus/toolkit/src/design-system/components.tsx +146 -0
  376. package/corpus/toolkit/src/design-system/context.tsx +31 -0
  377. package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
  378. package/corpus/toolkit/src/design-system/definition.ts +14 -0
  379. package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
  380. package/corpus/toolkit/src/design-system/index.ts +7 -0
  381. package/corpus/toolkit/src/design-system/theme.ts +145 -0
  382. package/corpus/toolkit/src/design-system/types.ts +363 -0
  383. package/corpus/toolkit/src/provider.tsx +98 -5
  384. package/corpus/toolkit/src/ui/button.tsx +95 -6
  385. package/corpus/toolkit/src/ui/dialog.tsx +48 -23
  386. package/corpus/toolkit/src/ui/popover.tsx +16 -2
  387. package/corpus/toolkit/src/ui/select.tsx +7 -3
  388. package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
  389. package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
  390. package/dist/a2a/types.d.ts +1 -1
  391. package/dist/a2a/types.d.ts.map +1 -1
  392. package/dist/a2a/types.js.map +1 -1
  393. package/dist/agent/types.d.ts +1 -1
  394. package/dist/agent/types.d.ts.map +1 -1
  395. package/dist/agent/types.js.map +1 -1
  396. package/dist/cli/context-xray-local.js +1 -1
  397. package/dist/cli/context-xray-local.js.map +1 -1
  398. package/dist/client/AgentPanel.d.ts.map +1 -1
  399. package/dist/client/AgentPanel.js +14 -14
  400. package/dist/client/AgentPanel.js.map +1 -1
  401. package/dist/client/AssistantChat.d.ts.map +1 -1
  402. package/dist/client/AssistantChat.js +26 -15
  403. package/dist/client/AssistantChat.js.map +1 -1
  404. package/dist/client/CommandMenu.d.ts.map +1 -1
  405. package/dist/client/CommandMenu.js +18 -106
  406. package/dist/client/CommandMenu.js.map +1 -1
  407. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  408. package/dist/client/agent-chat-adapter.js +2 -1
  409. package/dist/client/agent-chat-adapter.js.map +1 -1
  410. package/dist/client/app-providers.d.ts.map +1 -1
  411. package/dist/client/app-providers.js +1 -1
  412. package/dist/client/app-providers.js.map +1 -1
  413. package/dist/client/chat/message-components.d.ts +9 -1
  414. package/dist/client/chat/message-components.d.ts.map +1 -1
  415. package/dist/client/chat/message-components.js +62 -7
  416. package/dist/client/chat/message-components.js.map +1 -1
  417. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  418. package/dist/client/chat/tool-call-display.js +20 -5
  419. package/dist/client/chat/tool-call-display.js.map +1 -1
  420. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  421. package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
  422. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  423. package/dist/client/components/ui/message-scroller.d.ts +1 -1
  424. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  425. package/dist/client/components/ui/message-scroller.js +4 -3
  426. package/dist/client/components/ui/message-scroller.js.map +1 -1
  427. package/dist/client/extensions/ExtensionViewer.js +2 -2
  428. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  429. package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
  430. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
  431. package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
  432. package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
  433. package/dist/client/extensions/delete-extension.d.ts +1 -1
  434. package/dist/client/extensions/delete-extension.d.ts.map +1 -1
  435. package/dist/client/extensions/delete-extension.js +1 -1
  436. package/dist/client/extensions/delete-extension.js.map +1 -1
  437. package/dist/client/i18n.d.ts.map +1 -1
  438. package/dist/client/i18n.js +9 -0
  439. package/dist/client/i18n.js.map +1 -1
  440. package/dist/client/index.d.ts +2 -2
  441. package/dist/client/index.d.ts.map +1 -1
  442. package/dist/client/index.js +2 -2
  443. package/dist/client/index.js.map +1 -1
  444. package/dist/client/org/OrgSwitcher.d.ts +3 -1
  445. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  446. package/dist/client/org/OrgSwitcher.js +12 -4
  447. package/dist/client/org/OrgSwitcher.js.map +1 -1
  448. package/dist/client/org/TeamPage.d.ts.map +1 -1
  449. package/dist/client/org/TeamPage.js +41 -33
  450. package/dist/client/org/TeamPage.js.map +1 -1
  451. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  452. package/dist/client/progress/RunsTray.js +9 -10
  453. package/dist/client/progress/RunsTray.js.map +1 -1
  454. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  455. package/dist/client/resources/McpConnectionSuggestion.js +5 -4
  456. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  457. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  458. package/dist/client/resources/McpIntegrationDialog.js +10 -8
  459. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  460. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  461. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  462. package/dist/client/resources/mcp-integration-catalog.js +13 -0
  463. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  464. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  465. package/dist/client/settings/DemoModeSection.js +2 -5
  466. package/dist/client/settings/DemoModeSection.js.map +1 -1
  467. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  468. package/dist/client/settings/SecretsSection.js +18 -6
  469. package/dist/client/settings/SecretsSection.js.map +1 -1
  470. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  471. package/dist/client/settings/SettingsPanel.js +87 -119
  472. package/dist/client/settings/SettingsPanel.js.map +1 -1
  473. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  474. package/dist/client/settings/SettingsTabsPage.js +16 -1
  475. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  476. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  477. package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
  478. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  479. package/dist/client/settings/index.d.ts +1 -0
  480. package/dist/client/settings/index.d.ts.map +1 -1
  481. package/dist/client/settings/index.js +1 -0
  482. package/dist/client/settings/index.js.map +1 -1
  483. package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
  484. package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
  485. package/dist/client/settings/useSettingsPanelController.js +103 -0
  486. package/dist/client/settings/useSettingsPanelController.js.map +1 -0
  487. package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
  488. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  489. package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
  490. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  491. package/dist/client/setup-connections/index.d.ts +2 -1
  492. package/dist/client/setup-connections/index.d.ts.map +1 -1
  493. package/dist/client/setup-connections/index.js +2 -1
  494. package/dist/client/setup-connections/index.js.map +1 -1
  495. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
  496. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
  497. package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
  498. package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
  499. package/dist/client/sharing/ShareButton.d.ts +5 -5
  500. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  501. package/dist/client/sharing/ShareButton.js +19 -464
  502. package/dist/client/sharing/ShareButton.js.map +1 -1
  503. package/dist/client/sharing/ShareDialog.d.ts +6 -6
  504. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  505. package/dist/client/sharing/ShareDialog.js +69 -283
  506. package/dist/client/sharing/ShareDialog.js.map +1 -1
  507. package/dist/client/sharing/index.d.ts +3 -0
  508. package/dist/client/sharing/index.d.ts.map +1 -1
  509. package/dist/client/sharing/index.js +3 -0
  510. package/dist/client/sharing/index.js.map +1 -1
  511. package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
  512. package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
  513. package/dist/client/sharing/share-controller-helpers.js +224 -0
  514. package/dist/client/sharing/share-controller-helpers.js.map +1 -0
  515. package/dist/client/sharing/useShareButtonController.d.ts +91 -0
  516. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
  517. package/dist/client/sharing/useShareButtonController.js +397 -0
  518. package/dist/client/sharing/useShareButtonController.js.map +1 -0
  519. package/dist/client/sharing/useShareDialogController.d.ts +109 -0
  520. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
  521. package/dist/client/sharing/useShareDialogController.js +348 -0
  522. package/dist/client/sharing/useShareDialogController.js.map +1 -0
  523. package/dist/client/sse-event-processor.d.ts.map +1 -1
  524. package/dist/client/sse-event-processor.js +21 -0
  525. package/dist/client/sse-event-processor.js.map +1 -1
  526. package/dist/client/tool-display.d.ts +16 -0
  527. package/dist/client/tool-display.d.ts.map +1 -1
  528. package/dist/client/tool-display.js +52 -0
  529. package/dist/client/tool-display.js.map +1 -1
  530. package/dist/client/use-agent-engine-configured.d.ts +3 -2
  531. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  532. package/dist/client/use-agent-engine-configured.js +7 -19
  533. package/dist/client/use-agent-engine-configured.js.map +1 -1
  534. package/dist/client/use-chat-threads.d.ts.map +1 -1
  535. package/dist/client/use-chat-threads.js +21 -8
  536. package/dist/client/use-chat-threads.js.map +1 -1
  537. package/dist/collab/awareness.d.ts +2 -2
  538. package/dist/collab/awareness.d.ts.map +1 -1
  539. package/dist/db/client.d.ts +7 -7
  540. package/dist/db/client.d.ts.map +1 -1
  541. package/dist/db/client.js +13 -10
  542. package/dist/db/client.js.map +1 -1
  543. package/dist/extensions/actions.d.ts.map +1 -1
  544. package/dist/extensions/actions.js +8 -5
  545. package/dist/extensions/actions.js.map +1 -1
  546. package/dist/extensions/local.d.ts.map +1 -1
  547. package/dist/extensions/local.js +1 -0
  548. package/dist/extensions/local.js.map +1 -1
  549. package/dist/extensions/routes.d.ts.map +1 -1
  550. package/dist/extensions/routes.js +9 -4
  551. package/dist/extensions/routes.js.map +1 -1
  552. package/dist/extensions/schema.d.ts +23 -2
  553. package/dist/extensions/schema.d.ts.map +1 -1
  554. package/dist/extensions/schema.js +5 -0
  555. package/dist/extensions/schema.js.map +1 -1
  556. package/dist/extensions/slots/store.d.ts +1 -1
  557. package/dist/extensions/slots/store.d.ts.map +1 -1
  558. package/dist/extensions/slots/store.js +4 -4
  559. package/dist/extensions/slots/store.js.map +1 -1
  560. package/dist/extensions/store.d.ts +1 -0
  561. package/dist/extensions/store.d.ts.map +1 -1
  562. package/dist/extensions/store.js +38 -21
  563. package/dist/extensions/store.js.map +1 -1
  564. package/dist/extensions/theme.js +1 -1
  565. package/dist/extensions/theme.js.map +1 -1
  566. package/dist/file-upload/registry.d.ts.map +1 -1
  567. package/dist/file-upload/registry.js +9 -0
  568. package/dist/file-upload/registry.js.map +1 -1
  569. package/dist/index.browser.d.ts +1 -0
  570. package/dist/index.browser.d.ts.map +1 -1
  571. package/dist/index.browser.js +1 -0
  572. package/dist/index.browser.js.map +1 -1
  573. package/dist/index.d.ts +1 -0
  574. package/dist/index.d.ts.map +1 -1
  575. package/dist/index.js +1 -0
  576. package/dist/index.js.map +1 -1
  577. package/dist/localization/default-messages.d.ts +20 -0
  578. package/dist/localization/default-messages.d.ts.map +1 -1
  579. package/dist/localization/default-messages.js +26 -6
  580. package/dist/localization/default-messages.js.map +1 -1
  581. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  582. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  583. package/dist/mcp-client/oauth-routes.js +12 -2
  584. package/dist/mcp-client/oauth-routes.js.map +1 -1
  585. package/dist/observability/routes.d.ts +3 -3
  586. package/dist/provider-api/actions/custom-provider-registration.d.ts +3 -3
  587. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  588. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  589. package/dist/scripts/call-agent.d.ts.map +1 -1
  590. package/dist/scripts/call-agent.js +5 -1
  591. package/dist/scripts/call-agent.js.map +1 -1
  592. package/dist/secrets/routes.d.ts +6 -6
  593. package/dist/server/action-discovery.d.ts.map +1 -1
  594. package/dist/server/action-discovery.js +8 -0
  595. package/dist/server/action-discovery.js.map +1 -1
  596. package/dist/server/better-auth-instance.d.ts +7 -2
  597. package/dist/server/better-auth-instance.d.ts.map +1 -1
  598. package/dist/server/better-auth-instance.js.map +1 -1
  599. package/dist/server/email-template.d.ts +3 -0
  600. package/dist/server/email-template.d.ts.map +1 -1
  601. package/dist/server/email-template.js +13 -0
  602. package/dist/server/email-template.js.map +1 -1
  603. package/dist/server/email-templates.d.ts.map +1 -1
  604. package/dist/server/email-templates.js +3 -0
  605. package/dist/server/email-templates.js.map +1 -1
  606. package/dist/server/email.d.ts.map +1 -1
  607. package/dist/server/email.js +27 -4
  608. package/dist/server/email.js.map +1 -1
  609. package/dist/server/realtime-voice.js +1 -1
  610. package/dist/server/realtime-voice.js.map +1 -1
  611. package/dist/server/transcribe-voice.d.ts +1 -1
  612. package/dist/sharing/actions/share-resource.js +1 -0
  613. package/dist/sharing/actions/share-resource.js.map +1 -1
  614. package/dist/styles/agent-native.css +0 -24
  615. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  616. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  617. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  618. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  619. package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  620. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  621. package/dist/templates/chat/app/design-system.ts +3 -0
  622. package/dist/templates/chat/app/global.css +1 -1
  623. package/dist/templates/chat/app/root.tsx +2 -2
  624. package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  625. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  626. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  627. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  628. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  629. package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  630. package/dist/templates/default/app/design-system.ts +3 -0
  631. package/dist/templates/default/app/global.css +1 -1
  632. package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
  633. package/dist/templates/default/app/i18n/de-DE.ts +6 -6
  634. package/dist/templates/default/app/i18n/en-US.ts +6 -6
  635. package/dist/templates/default/app/i18n/es-ES.ts +6 -6
  636. package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
  637. package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
  638. package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
  639. package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
  640. package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
  641. package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
  642. package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
  643. package/dist/templates/default/app/root.tsx +5 -2
  644. package/dist/templates/default/package.json +1 -0
  645. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  646. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  647. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  648. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  649. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  650. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  651. package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
  652. package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
  653. package/dist/user-profile/actions/get-user-profile.js +14 -0
  654. package/dist/user-profile/actions/get-user-profile.js.map +1 -0
  655. package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
  656. package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
  657. package/dist/user-profile/actions/update-user-profile.js +20 -0
  658. package/dist/user-profile/actions/update-user-profile.js.map +1 -0
  659. package/dist/user-profile/index.d.ts +2 -0
  660. package/dist/user-profile/index.d.ts.map +1 -0
  661. package/dist/user-profile/index.js +2 -0
  662. package/dist/user-profile/index.js.map +1 -0
  663. package/dist/user-profile/shared.d.ts +7 -0
  664. package/dist/user-profile/shared.d.ts.map +1 -0
  665. package/dist/user-profile/shared.js +6 -0
  666. package/dist/user-profile/shared.js.map +1 -0
  667. package/dist/user-profile/store.d.ts +4 -0
  668. package/dist/user-profile/store.d.ts.map +1 -0
  669. package/dist/user-profile/store.js +38 -0
  670. package/dist/user-profile/store.js.map +1 -0
  671. package/dist/vite/client.d.ts +3 -0
  672. package/dist/vite/client.d.ts.map +1 -1
  673. package/dist/vite/client.js +31 -0
  674. package/dist/vite/client.js.map +1 -1
  675. package/docs/content/custom-design-system.mdx +445 -0
  676. package/docs/content/toolkit-ui.mdx +16 -0
  677. package/package.json +3 -2
  678. package/src/a2a/types.ts +1 -0
  679. package/src/agent/types.ts +1 -1
  680. package/src/cli/context-xray-local.ts +1 -1
  681. package/src/client/AgentPanel.tsx +90 -107
  682. package/src/client/AssistantChat.tsx +30 -13
  683. package/src/client/CommandMenu.tsx +68 -178
  684. package/src/client/agent-chat-adapter.ts +3 -1
  685. package/src/client/app-providers.tsx +1 -1
  686. package/src/client/chat/message-components.tsx +116 -10
  687. package/src/client/chat/tool-call-display.tsx +26 -5
  688. package/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
  689. package/src/client/components/ui/message-scroller.tsx +15 -1
  690. package/src/client/extensions/ExtensionViewer.tsx +4 -4
  691. package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
  692. package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
  693. package/src/client/extensions/delete-extension.ts +2 -2
  694. package/src/client/i18n.tsx +22 -0
  695. package/src/client/index.ts +17 -0
  696. package/src/client/org/OrgSwitcher.tsx +25 -1
  697. package/src/client/org/TeamPage.tsx +257 -153
  698. package/src/client/progress/RunsTray.tsx +89 -88
  699. package/src/client/resources/McpConnectionSuggestion.tsx +5 -2
  700. package/src/client/resources/McpIntegrationDialog.tsx +34 -13
  701. package/src/client/resources/mcp-integration-catalog.ts +13 -0
  702. package/src/client/settings/DemoModeSection.tsx +6 -18
  703. package/src/client/settings/SecretsSection.tsx +97 -52
  704. package/src/client/settings/SettingsPanel.tsx +302 -254
  705. package/src/client/settings/SettingsTabsPage.tsx +23 -2
  706. package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  707. package/src/client/settings/index.ts +7 -0
  708. package/src/client/settings/useSettingsPanelController.ts +155 -0
  709. package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  710. package/src/client/setup-connections/index.ts +10 -0
  711. package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  712. package/src/client/sharing/ShareButton.tsx +71 -592
  713. package/src/client/sharing/ShareDialog.tsx +299 -633
  714. package/src/client/sharing/index.ts +42 -0
  715. package/src/client/sharing/share-controller-helpers.ts +318 -0
  716. package/src/client/sharing/useShareButtonController.ts +600 -0
  717. package/src/client/sharing/useShareDialogController.ts +559 -0
  718. package/src/client/sse-event-processor.ts +23 -0
  719. package/src/client/tool-display.ts +71 -0
  720. package/src/client/use-agent-engine-configured.ts +12 -19
  721. package/src/client/use-chat-threads.ts +33 -12
  722. package/src/db/client.ts +13 -10
  723. package/src/extensions/actions.ts +13 -5
  724. package/src/extensions/local.ts +1 -0
  725. package/src/extensions/routes.ts +10 -5
  726. package/src/extensions/schema.ts +5 -0
  727. package/src/extensions/slots/store.ts +14 -4
  728. package/src/extensions/store.ts +55 -19
  729. package/src/extensions/theme.ts +1 -1
  730. package/src/file-upload/registry.ts +9 -0
  731. package/src/index.browser.ts +5 -0
  732. package/src/index.ts +1 -0
  733. package/src/localization/default-messages.ts +28 -6
  734. package/src/mcp-client/oauth-routes.ts +16 -2
  735. package/src/scripts/call-agent.ts +5 -1
  736. package/src/server/action-discovery.ts +8 -0
  737. package/src/server/better-auth-instance.ts +7 -2
  738. package/src/server/email-template.ts +18 -0
  739. package/src/server/email-templates.ts +3 -0
  740. package/src/server/email.ts +40 -4
  741. package/src/server/realtime-voice.ts +1 -1
  742. package/src/sharing/actions/share-resource.ts +1 -0
  743. package/src/styles/agent-native.css +0 -24
  744. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  745. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  746. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  747. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  748. package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
  749. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  750. package/src/templates/chat/app/design-system.ts +3 -0
  751. package/src/templates/chat/app/global.css +1 -1
  752. package/src/templates/chat/app/root.tsx +2 -2
  753. package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
  754. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  755. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  756. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  757. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  758. package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  759. package/src/templates/default/app/design-system.ts +3 -0
  760. package/src/templates/default/app/global.css +1 -1
  761. package/src/templates/default/app/i18n/ar-SA.ts +6 -6
  762. package/src/templates/default/app/i18n/de-DE.ts +6 -6
  763. package/src/templates/default/app/i18n/en-US.ts +6 -6
  764. package/src/templates/default/app/i18n/es-ES.ts +6 -6
  765. package/src/templates/default/app/i18n/fr-FR.ts +6 -6
  766. package/src/templates/default/app/i18n/hi-IN.ts +6 -6
  767. package/src/templates/default/app/i18n/ja-JP.ts +6 -6
  768. package/src/templates/default/app/i18n/ko-KR.ts +6 -6
  769. package/src/templates/default/app/i18n/pt-BR.ts +6 -6
  770. package/src/templates/default/app/i18n/zh-CN.ts +7 -7
  771. package/src/templates/default/app/i18n/zh-TW.ts +7 -7
  772. package/src/templates/default/app/root.tsx +5 -2
  773. package/src/templates/default/package.json +1 -0
  774. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  775. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  776. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
  777. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  778. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  779. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  780. package/src/user-profile/actions/get-user-profile.ts +16 -0
  781. package/src/user-profile/actions/update-user-profile.ts +24 -0
  782. package/src/user-profile/index.ts +5 -0
  783. package/src/user-profile/shared.ts +14 -0
  784. package/src/user-profile/store.ts +50 -0
  785. package/src/vite/client.ts +39 -0
  786. package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
  787. package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
  788. package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
  789. package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
  790. package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
  791. package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
  792. package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
  793. package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
  794. package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
  795. package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
  796. package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
  797. package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
  798. package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
  799. package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
  800. package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
  801. package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
  802. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
  803. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
  804. package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
  805. package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
  806. package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
  807. package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
  808. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
  809. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
  810. package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
  811. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
  812. package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
  813. package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
  814. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
  815. package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/extensions/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/extensions/schema.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ export const extensions = table("tools", {
25
25
  icon: text("icon"),
26
26
  createdAt: text("created_at").notNull().default(now()),
27
27
  updatedAt: text("updated_at").notNull().default(now()),
28
+ archivedAt: text("archived_at"),
28
29
  hiddenAt: text("hidden_at"),
29
30
  hiddenBy: text("hidden_by"),
30
31
  ...ownableColumns(),
@@ -60,6 +61,7 @@ export const EXTENSIONS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tools (
60
61
  icon TEXT,
61
62
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
62
63
  updated_at TEXT NOT NULL DEFAULT (datetime('now')),
64
+ archived_at TEXT,
63
65
  hidden_at TEXT,
64
66
  hidden_by TEXT,
65
67
  owner_email TEXT NOT NULL DEFAULT 'local@localhost',
@@ -74,6 +76,7 @@ export const EXTENSIONS_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tools (
74
76
  icon TEXT,
75
77
  created_at TEXT NOT NULL DEFAULT now(),
76
78
  updated_at TEXT NOT NULL DEFAULT now(),
79
+ archived_at TEXT,
77
80
  hidden_at TEXT,
78
81
  hidden_by TEXT,
79
82
  owner_email TEXT NOT NULL DEFAULT 'local@localhost',
@@ -146,6 +149,8 @@ export const EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG = `DROP INDEX IF EXISTS tool_d
146
149
  export const EXTENSIONS_OWNER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_owner_idx ON tools (owner_email)`;
147
150
  export const EXTENSIONS_ORG_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_org_idx ON tools (org_id)`;
148
151
  export const EXTENSIONS_UPDATED_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_updated_at_idx ON tools (updated_at)`;
152
+ export const EXTENSIONS_ARCHIVED_AT_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS archived_at TEXT`;
153
+ export const EXTENSIONS_ARCHIVED_AT_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_archived_at_idx ON tools (archived_at)`;
149
154
  // Global (admin) hide: when set, the extension row is hidden from EVERYONE's
150
155
  // list, distinct from the per-user `tool_hidden_extensions` table. Additive
151
156
  // columns — see ensureExtensionsTables() for the idempotent ADD COLUMN run.
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/extensions/schema.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Drizzle schema for the framework extensions system.\n *\n * Extensions are mini Alpine.js apps that run inside sandboxed iframes. They\n * can call external APIs via a server-side proxy that resolves `${keys.NAME}`\n * secret references. Extensions use the standard sharing model (private by\n * default, shareable with org/others).\n *\n * The tables are auto-created at server boot via `ensureTable()` in store.ts,\n * following the same pattern as `app_secrets`.\n *\n * NOTE: physical SQL table/column names stay as `tools`, `tool_data`,\n * `tool_shares`, `tool_consents`, `tool_id`, etc. — additive-only schema\n * policy means we never rename DB-level identifiers. The JS/TS surface is\n * renamed to `extensions`/`extension*`; the DB-side names stay so existing\n * deployed rows remain readable.\n */\n\nimport { table, text, integer, now } from \"../db/schema.js\";\nimport { ownableColumns, createSharesTable } from \"../sharing/schema.js\";\n\nexport const extensions = table(\"tools\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n description: text(\"description\").notNull().default(\"\"),\n content: text(\"content\").notNull().default(\"\"),\n icon: text(\"icon\"),\n createdAt: text(\"created_at\").notNull().default(now()),\n updatedAt: text(\"updated_at\").notNull().default(now()),\n hiddenAt: text(\"hidden_at\"),\n hiddenBy: text(\"hidden_by\"),\n ...ownableColumns(),\n});\n\nexport const extensionShares = createSharesTable(\"tool_shares\");\n\nexport const extensionHides = table(\"tool_hidden_extensions\", {\n id: text(\"id\").primaryKey(),\n extensionId: text(\"tool_id\").notNull(),\n ownerEmail: text(\"owner_email\").notNull(),\n createdAt: text(\"created_at\").notNull().default(now()),\n});\n\nexport const extensionHistory = table(\"tool_history\", {\n id: text(\"id\").primaryKey(),\n extensionId: text(\"tool_id\").notNull(),\n version: integer(\"version\").notNull(),\n operation: text(\"operation\").notNull(),\n summary: text(\"summary\").notNull().default(\"\"),\n name: text(\"name\").notNull(),\n description: text(\"description\").notNull().default(\"\"),\n content: text(\"content\").notNull().default(\"\"),\n icon: text(\"icon\"),\n actorEmail: text(\"actor_email\"),\n ownerEmail: text(\"owner_email\").notNull().default(\"local@localhost\"),\n orgId: text(\"org_id\"),\n visibility: text(\"visibility\").notNull().default(\"private\"),\n createdAt: text(\"created_at\").notNull().default(now()),\n});\n\nexport const EXTENSIONS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tools (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n hidden_at TEXT,\n hidden_by TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private'\n)`;\n\nexport const EXTENSIONS_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tools (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n created_at TEXT NOT NULL DEFAULT now(),\n updated_at TEXT NOT NULL DEFAULT now(),\n hidden_at TEXT,\n hidden_by TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private'\n)`;\n\nexport const EXTENSION_SHARES_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_shares (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n principal_type TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'viewer',\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_SHARES_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_shares (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n principal_type TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'viewer',\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const extensionData = table(\"tool_data\", {\n id: text(\"id\").primaryKey(),\n extensionId: text(\"tool_id\").notNull(),\n collection: text(\"collection\").notNull(),\n itemId: text(\"item_id\"),\n data: text(\"data\").notNull(),\n ownerEmail: text(\"owner_email\").notNull().default(\"local@localhost\"),\n scope: text(\"scope\").notNull().default(\"user\"),\n orgId: text(\"org_id\"),\n scopeKey: text(\"scope_key\").notNull().default(\"local@localhost\"),\n createdAt: text(\"created_at\").notNull().default(now()),\n updatedAt: text(\"updated_at\").notNull().default(now()),\n});\n\nexport const EXTENSION_DATA_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_data (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n collection TEXT NOT NULL,\n item_id TEXT,\n data TEXT NOT NULL,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n scope TEXT NOT NULL DEFAULT 'user',\n org_id TEXT,\n scope_key TEXT NOT NULL DEFAULT 'local@localhost',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_DATA_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_data (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n collection TEXT NOT NULL,\n item_id TEXT,\n data TEXT NOT NULL,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n scope TEXT NOT NULL DEFAULT 'user',\n org_id TEXT,\n scope_key TEXT NOT NULL DEFAULT 'local@localhost',\n created_at TEXT NOT NULL DEFAULT now(),\n updated_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const EXTENSION_DATA_ITEM_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS tool_data_scoped_item_idx\n ON tool_data (tool_id, collection, scope_key, item_id)`;\n\nexport const EXTENSION_DATA_ITEM_INDEX_SQL_PG = `CREATE UNIQUE INDEX IF NOT EXISTS tool_data_scoped_item_idx\n ON tool_data (tool_id, collection, scope_key, item_id)`;\n\nexport const EXTENSION_DATA_DROP_OLD_INDEX_SQL = `DROP INDEX IF EXISTS tool_data_scope_item_idx`;\nexport const EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG = `DROP INDEX IF EXISTS tool_data_scope_item_idx`;\n\nexport const EXTENSIONS_OWNER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_owner_idx ON tools (owner_email)`;\nexport const EXTENSIONS_ORG_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_org_idx ON tools (org_id)`;\nexport const EXTENSIONS_UPDATED_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_updated_at_idx ON tools (updated_at)`;\n\n// Global (admin) hide: when set, the extension row is hidden from EVERYONE's\n// list, distinct from the per-user `tool_hidden_extensions` table. Additive\n// columns — see ensureExtensionsTables() for the idempotent ADD COLUMN run.\nexport const EXTENSIONS_HIDDEN_AT_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS hidden_at TEXT`;\nexport const EXTENSIONS_HIDDEN_BY_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS hidden_by TEXT`;\nexport const EXTENSIONS_HIDDEN_AT_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_hidden_at_idx ON tools (hidden_at)`;\nexport const EXTENSION_SHARES_RESOURCE_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_shares_resource_idx ON tool_shares (resource_id)`;\n\nexport const EXTENSION_HIDES_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_hidden_extensions (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n owner_email TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_HIDES_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_hidden_extensions (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n owner_email TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const EXTENSION_HIDES_UNIQUE_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS tool_hidden_extensions_user_tool_idx\n ON tool_hidden_extensions (owner_email, tool_id)`;\n\nexport const EXTENSION_HIDES_OWNER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_hidden_extensions_owner_idx\n ON tool_hidden_extensions (owner_email)`;\n\nexport const EXTENSION_HISTORY_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_history (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n version INTEGER NOT NULL,\n operation TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n actor_email TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private',\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_HISTORY_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_history (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n version INTEGER NOT NULL,\n operation TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n actor_email TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private',\n created_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const EXTENSION_HISTORY_VERSION_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS tool_history_tool_version_idx\n ON tool_history (tool_id, version)`;\n\nexport const EXTENSION_HISTORY_CREATED_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_history_tool_created_idx\n ON tool_history (tool_id, created_at)`;\n\n// ---------------------------------------------------------------------------\n// extension_consents — vestigial, kept for additive-schema compliance\n// ---------------------------------------------------------------------------\n//\n// Originally added for an audit-C1 per-(viewer, extension, content_hash)\n// consent gate that prompted viewers to \"Run anyway\" before non-author\n// extensions could execute. We removed the runtime gate after settling on\n// intra-org trust (extensions are shared between trusted teammates; the\n// org-level access controls are sufficient). The table is kept here so\n// deploys that already ran the migration stay healthy — additive-only schema\n// policy means we never drop. Physical name stays `tool_consents`.\n\nexport const extensionConsents = table(\"tool_consents\", {\n viewerEmail: text(\"viewer_email\").notNull(),\n extensionId: text(\"tool_id\").notNull(),\n contentHash: text(\"content_hash\").notNull(),\n grantedAt: text(\"granted_at\").notNull().default(now()),\n});\n\nexport const EXTENSION_CONSENTS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_consents (\n viewer_email TEXT NOT NULL,\n tool_id TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n granted_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (viewer_email, tool_id, content_hash)\n)`;\n\nexport const EXTENSION_CONSENTS_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_consents (\n viewer_email TEXT NOT NULL,\n tool_id TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n granted_at TEXT NOT NULL DEFAULT now(),\n PRIMARY KEY (viewer_email, tool_id, content_hash)\n)`;\n\nexport const EXTENSION_CONSENTS_VIEWER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_consents_viewer_idx ON tool_consents (viewer_email, tool_id)`;\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/extensions/schema.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Drizzle schema for the framework extensions system.\n *\n * Extensions are mini Alpine.js apps that run inside sandboxed iframes. They\n * can call external APIs via a server-side proxy that resolves `${keys.NAME}`\n * secret references. Extensions use the standard sharing model (private by\n * default, shareable with org/others).\n *\n * The tables are auto-created at server boot via `ensureTable()` in store.ts,\n * following the same pattern as `app_secrets`.\n *\n * NOTE: physical SQL table/column names stay as `tools`, `tool_data`,\n * `tool_shares`, `tool_consents`, `tool_id`, etc. — additive-only schema\n * policy means we never rename DB-level identifiers. The JS/TS surface is\n * renamed to `extensions`/`extension*`; the DB-side names stay so existing\n * deployed rows remain readable.\n */\n\nimport { table, text, integer, now } from \"../db/schema.js\";\nimport { ownableColumns, createSharesTable } from \"../sharing/schema.js\";\n\nexport const extensions = table(\"tools\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n description: text(\"description\").notNull().default(\"\"),\n content: text(\"content\").notNull().default(\"\"),\n icon: text(\"icon\"),\n createdAt: text(\"created_at\").notNull().default(now()),\n updatedAt: text(\"updated_at\").notNull().default(now()),\n archivedAt: text(\"archived_at\"),\n hiddenAt: text(\"hidden_at\"),\n hiddenBy: text(\"hidden_by\"),\n ...ownableColumns(),\n});\n\nexport const extensionShares = createSharesTable(\"tool_shares\");\n\nexport const extensionHides = table(\"tool_hidden_extensions\", {\n id: text(\"id\").primaryKey(),\n extensionId: text(\"tool_id\").notNull(),\n ownerEmail: text(\"owner_email\").notNull(),\n createdAt: text(\"created_at\").notNull().default(now()),\n});\n\nexport const extensionHistory = table(\"tool_history\", {\n id: text(\"id\").primaryKey(),\n extensionId: text(\"tool_id\").notNull(),\n version: integer(\"version\").notNull(),\n operation: text(\"operation\").notNull(),\n summary: text(\"summary\").notNull().default(\"\"),\n name: text(\"name\").notNull(),\n description: text(\"description\").notNull().default(\"\"),\n content: text(\"content\").notNull().default(\"\"),\n icon: text(\"icon\"),\n actorEmail: text(\"actor_email\"),\n ownerEmail: text(\"owner_email\").notNull().default(\"local@localhost\"),\n orgId: text(\"org_id\"),\n visibility: text(\"visibility\").notNull().default(\"private\"),\n createdAt: text(\"created_at\").notNull().default(now()),\n});\n\nexport const EXTENSIONS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tools (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n archived_at TEXT,\n hidden_at TEXT,\n hidden_by TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private'\n)`;\n\nexport const EXTENSIONS_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tools (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n created_at TEXT NOT NULL DEFAULT now(),\n updated_at TEXT NOT NULL DEFAULT now(),\n archived_at TEXT,\n hidden_at TEXT,\n hidden_by TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private'\n)`;\n\nexport const EXTENSION_SHARES_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_shares (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n principal_type TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'viewer',\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_SHARES_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_shares (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n principal_type TEXT NOT NULL,\n principal_id TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'viewer',\n created_by TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const extensionData = table(\"tool_data\", {\n id: text(\"id\").primaryKey(),\n extensionId: text(\"tool_id\").notNull(),\n collection: text(\"collection\").notNull(),\n itemId: text(\"item_id\"),\n data: text(\"data\").notNull(),\n ownerEmail: text(\"owner_email\").notNull().default(\"local@localhost\"),\n scope: text(\"scope\").notNull().default(\"user\"),\n orgId: text(\"org_id\"),\n scopeKey: text(\"scope_key\").notNull().default(\"local@localhost\"),\n createdAt: text(\"created_at\").notNull().default(now()),\n updatedAt: text(\"updated_at\").notNull().default(now()),\n});\n\nexport const EXTENSION_DATA_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_data (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n collection TEXT NOT NULL,\n item_id TEXT,\n data TEXT NOT NULL,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n scope TEXT NOT NULL DEFAULT 'user',\n org_id TEXT,\n scope_key TEXT NOT NULL DEFAULT 'local@localhost',\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_DATA_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_data (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n collection TEXT NOT NULL,\n item_id TEXT,\n data TEXT NOT NULL,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n scope TEXT NOT NULL DEFAULT 'user',\n org_id TEXT,\n scope_key TEXT NOT NULL DEFAULT 'local@localhost',\n created_at TEXT NOT NULL DEFAULT now(),\n updated_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const EXTENSION_DATA_ITEM_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS tool_data_scoped_item_idx\n ON tool_data (tool_id, collection, scope_key, item_id)`;\n\nexport const EXTENSION_DATA_ITEM_INDEX_SQL_PG = `CREATE UNIQUE INDEX IF NOT EXISTS tool_data_scoped_item_idx\n ON tool_data (tool_id, collection, scope_key, item_id)`;\n\nexport const EXTENSION_DATA_DROP_OLD_INDEX_SQL = `DROP INDEX IF EXISTS tool_data_scope_item_idx`;\nexport const EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG = `DROP INDEX IF EXISTS tool_data_scope_item_idx`;\n\nexport const EXTENSIONS_OWNER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_owner_idx ON tools (owner_email)`;\nexport const EXTENSIONS_ORG_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_org_idx ON tools (org_id)`;\nexport const EXTENSIONS_UPDATED_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_updated_at_idx ON tools (updated_at)`;\nexport const EXTENSIONS_ARCHIVED_AT_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS archived_at TEXT`;\nexport const EXTENSIONS_ARCHIVED_AT_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_archived_at_idx ON tools (archived_at)`;\n\n// Global (admin) hide: when set, the extension row is hidden from EVERYONE's\n// list, distinct from the per-user `tool_hidden_extensions` table. Additive\n// columns — see ensureExtensionsTables() for the idempotent ADD COLUMN run.\nexport const EXTENSIONS_HIDDEN_AT_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS hidden_at TEXT`;\nexport const EXTENSIONS_HIDDEN_BY_COLUMN_SQL = `ALTER TABLE tools ADD COLUMN IF NOT EXISTS hidden_by TEXT`;\nexport const EXTENSIONS_HIDDEN_AT_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tools_hidden_at_idx ON tools (hidden_at)`;\nexport const EXTENSION_SHARES_RESOURCE_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_shares_resource_idx ON tool_shares (resource_id)`;\n\nexport const EXTENSION_HIDES_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_hidden_extensions (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n owner_email TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_HIDES_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_hidden_extensions (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n owner_email TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const EXTENSION_HIDES_UNIQUE_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS tool_hidden_extensions_user_tool_idx\n ON tool_hidden_extensions (owner_email, tool_id)`;\n\nexport const EXTENSION_HIDES_OWNER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_hidden_extensions_owner_idx\n ON tool_hidden_extensions (owner_email)`;\n\nexport const EXTENSION_HISTORY_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_history (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n version INTEGER NOT NULL,\n operation TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n actor_email TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private',\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n)`;\n\nexport const EXTENSION_HISTORY_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_history (\n id TEXT PRIMARY KEY,\n tool_id TEXT NOT NULL,\n version INTEGER NOT NULL,\n operation TEXT NOT NULL,\n summary TEXT NOT NULL DEFAULT '',\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n icon TEXT,\n actor_email TEXT,\n owner_email TEXT NOT NULL DEFAULT 'local@localhost',\n org_id TEXT,\n visibility TEXT NOT NULL DEFAULT 'private',\n created_at TEXT NOT NULL DEFAULT now()\n)`;\n\nexport const EXTENSION_HISTORY_VERSION_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS tool_history_tool_version_idx\n ON tool_history (tool_id, version)`;\n\nexport const EXTENSION_HISTORY_CREATED_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_history_tool_created_idx\n ON tool_history (tool_id, created_at)`;\n\n// ---------------------------------------------------------------------------\n// extension_consents — vestigial, kept for additive-schema compliance\n// ---------------------------------------------------------------------------\n//\n// Originally added for an audit-C1 per-(viewer, extension, content_hash)\n// consent gate that prompted viewers to \"Run anyway\" before non-author\n// extensions could execute. We removed the runtime gate after settling on\n// intra-org trust (extensions are shared between trusted teammates; the\n// org-level access controls are sufficient). The table is kept here so\n// deploys that already ran the migration stay healthy — additive-only schema\n// policy means we never drop. Physical name stays `tool_consents`.\n\nexport const extensionConsents = table(\"tool_consents\", {\n viewerEmail: text(\"viewer_email\").notNull(),\n extensionId: text(\"tool_id\").notNull(),\n contentHash: text(\"content_hash\").notNull(),\n grantedAt: text(\"granted_at\").notNull().default(now()),\n});\n\nexport const EXTENSION_CONSENTS_CREATE_SQL = `CREATE TABLE IF NOT EXISTS tool_consents (\n viewer_email TEXT NOT NULL,\n tool_id TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n granted_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (viewer_email, tool_id, content_hash)\n)`;\n\nexport const EXTENSION_CONSENTS_CREATE_SQL_PG = `CREATE TABLE IF NOT EXISTS tool_consents (\n viewer_email TEXT NOT NULL,\n tool_id TEXT NOT NULL,\n content_hash TEXT NOT NULL,\n granted_at TEXT NOT NULL DEFAULT now(),\n PRIMARY KEY (viewer_email, tool_id, content_hash)\n)`;\n\nexport const EXTENSION_CONSENTS_VIEWER_INDEX_SQL = `CREATE INDEX IF NOT EXISTS tool_consents_viewer_idx ON tool_consents (viewer_email, tool_id)`;\n"]}
@@ -61,6 +61,6 @@ export declare function listSlotInstallsForUser(slotId: string): Promise<Array<{
61
61
  position: number;
62
62
  config: string | null;
63
63
  }>>;
64
- /** Delete every slot/install row referencing a extension. Called from deleteExtension. */
64
+ /** Delete every slot/install row referencing an extension for maintenance. */
65
65
  export declare function cascadeDeleteExtensionSlots(extensionId: string): Promise<void>;
66
66
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/extensions/slots/store.ts"],"names":[],"mappings":"AAoCA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBtD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAyC3B;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAClE,KAAK,CAAC;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CACH,CA8CA;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,uBAAuB,CAAC,CAqElC;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CACpE,KAAK,CAAC;IACJ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CACH,CAyDA;AAED,0FAA0F;AAC1F,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CASf"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/extensions/slots/store.ts"],"names":[],"mappings":"AAoCA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBtD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAyC3B;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoB7B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAClE,KAAK,CAAC;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CACH,CAmDA;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,uBAAuB,CAAC,CAqElC;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CACpE,KAAK,CAAC;IACJ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CACH,CA8DA;AAED,8EAA8E;AAC9E,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { and, eq, inArray, sql } from "drizzle-orm";
2
+ import { and, eq, inArray, isNull, sql } from "drizzle-orm";
3
3
  import { getDbExec, isPostgres } from "../../db/client.js";
4
4
  import { createGetDb } from "../../db/create-get-db.js";
5
5
  import { getRequestUserEmail, getRequestOrgId, } from "../../server/request-context.js";
@@ -123,7 +123,7 @@ export async function listExtensionsForSlot(slotId) {
123
123
  icon: extensions.icon,
124
124
  })
125
125
  .from(extensions)
126
- .where(accessFilter(extensions, extensionShares));
126
+ .where(and(accessFilter(extensions, extensionShares), isNull(extensions.archivedAt)));
127
127
  const localRows = (await listLocalExtensions())
128
128
  .filter((extension) => extension.source.slots.includes(slotId))
129
129
  .map((extension) => ({
@@ -263,7 +263,7 @@ export async function listSlotInstallsForUser(slotId) {
263
263
  updatedAt: extensions.updatedAt,
264
264
  })
265
265
  .from(extensions)
266
- .where(accessFilter(extensions, extensionShares));
266
+ .where(and(accessFilter(extensions, extensionShares), isNull(extensions.archivedAt)));
267
267
  const byId = new Map(accessible.map((t) => [t.id, t]));
268
268
  const sqlInstalls = installs
269
269
  .filter((i) => byId.has(i.extensionId))
@@ -283,7 +283,7 @@ export async function listSlotInstallsForUser(slotId) {
283
283
  });
284
284
  return [...localInstalls, ...sqlInstalls];
285
285
  }
286
- /** Delete every slot/install row referencing a extension. Called from deleteExtension. */
286
+ /** Delete every slot/install row referencing an extension for maintenance. */
287
287
  export async function cascadeDeleteExtensionSlots(extensionId) {
288
288
  await ensureSlotTables();
289
289
  const db = getDb();
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/slots/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { and, eq, inArray, sql } from \"drizzle-orm\";\n\nimport { getDbExec, isPostgres } from \"../../db/client.js\";\nimport { createGetDb } from \"../../db/create-get-db.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n} from \"../../server/request-context.js\";\nimport { accessFilter, assertAccess } from \"../../sharing/access.js\";\nimport { getLocalExtension, listLocalExtensions } from \"../local.js\";\nimport { extensions, extensionShares } from \"../schema.js\";\nimport {\n extensionSlots,\n extensionSlotInstalls,\n EXTENSION_SLOTS_CREATE_SQL,\n EXTENSION_SLOTS_CREATE_SQL_PG,\n EXTENSION_SLOTS_BY_SLOT_INDEX_SQL,\n EXTENSION_SLOTS_BY_EXTENSION_INDEX_SQL,\n EXTENSION_SLOTS_UNIQUE_INDEX_SQL,\n EXTENSION_SLOT_INSTALLS_CREATE_SQL,\n EXTENSION_SLOT_INSTALLS_CREATE_SQL_PG,\n EXTENSION_SLOT_INSTALLS_BY_USER_SLOT_INDEX_SQL,\n EXTENSION_SLOT_INSTALLS_UNIQUE_INDEX_SQL,\n} from \"./schema.js\";\n\nconst getDb = createGetDb({\n extensions,\n extensionShares,\n extensionSlots,\n extensionSlotInstalls,\n});\n\nlet _initPromise: Promise<void> | undefined;\n\nexport async function ensureSlotTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const pg = isPostgres();\n await client.execute(\n pg ? EXTENSION_SLOTS_CREATE_SQL_PG : EXTENSION_SLOTS_CREATE_SQL,\n );\n await client.execute(EXTENSION_SLOTS_BY_SLOT_INDEX_SQL);\n await client.execute(EXTENSION_SLOTS_BY_EXTENSION_INDEX_SQL);\n await client.execute(EXTENSION_SLOTS_UNIQUE_INDEX_SQL);\n await client.execute(\n pg\n ? EXTENSION_SLOT_INSTALLS_CREATE_SQL_PG\n : EXTENSION_SLOT_INSTALLS_CREATE_SQL,\n );\n await client.execute(EXTENSION_SLOT_INSTALLS_BY_USER_SLOT_INDEX_SQL);\n await client.execute(EXTENSION_SLOT_INSTALLS_UNIQUE_INDEX_SQL);\n })().catch((err) => {\n // Retry init on the next call after a failed startup.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nexport interface ExtensionSlotRow {\n id: string;\n extensionId: string;\n slotId: string;\n config: string | null;\n createdAt: string;\n}\n\nexport interface ExtensionSlotInstallRow {\n id: string;\n extensionId: string;\n slotId: string;\n ownerEmail: string;\n orgId: string | null;\n position: number;\n config: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Declare that a extension can render in a slot. Caller must have editor access on\n * the extension (only people who can edit a extension can change its slot targets).\n */\nexport async function addExtensionSlotTarget(\n extensionId: string,\n slotId: string,\n config?: string,\n): Promise<ExtensionSlotRow> {\n if (await getLocalExtension(extensionId)) {\n throw new Error(\n \"Local file extension slot targets are declared in extension.json.\",\n );\n }\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"editor\");\n const db = getDb();\n const id = randomUUID();\n const createdAt = new Date().toISOString();\n const row: ExtensionSlotRow = {\n id,\n extensionId,\n slotId,\n config: config ?? null,\n createdAt,\n };\n try {\n await db.insert(extensionSlots).values(row);\n } catch (err: any) {\n // Unique index hit — already declared. Treat as idempotent: return existing.\n if (\n String(err?.message ?? err)\n .toLowerCase()\n .includes(\"unique\")\n ) {\n const existing = await db\n .select()\n .from(extensionSlots)\n .where(\n and(\n eq(extensionSlots.extensionId, extensionId),\n eq(extensionSlots.slotId, slotId),\n ),\n );\n if (existing[0]) return existing[0] as ExtensionSlotRow;\n }\n throw err;\n }\n return row;\n}\n\nexport async function removeExtensionSlotTarget(\n extensionId: string,\n slotId: string,\n): Promise<boolean> {\n if (await getLocalExtension(extensionId)) {\n throw new Error(\n \"Local file extension slot targets are declared in extension.json.\",\n );\n }\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"editor\");\n const db = getDb();\n await db\n .delete(extensionSlots)\n .where(\n and(\n eq(extensionSlots.extensionId, extensionId),\n eq(extensionSlots.slotId, slotId),\n ),\n );\n return true;\n}\n\nexport async function listSlotsForExtension(\n extensionId: string,\n): Promise<ExtensionSlotRow[]> {\n const localExtension = await getLocalExtension(extensionId);\n if (localExtension) {\n return localExtension.source.slots.map((slotId) => ({\n id: localSlotDeclarationId(localExtension.id, slotId),\n extensionId: localExtension.id,\n slotId,\n config: null,\n createdAt: localExtension.createdAt,\n }));\n }\n\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"viewer\");\n const db = getDb();\n const rows = await db\n .select()\n .from(extensionSlots)\n .where(eq(extensionSlots.extensionId, extensionId));\n return rows as ExtensionSlotRow[];\n}\n\n/**\n * List extensions that declare a slot — but only extensions the current user has access\n * to. Joins through the extensions access filter.\n */\nexport async function listExtensionsForSlot(slotId: string): Promise<\n Array<{\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n config: string | null;\n }>\n> {\n await ensureSlotTables();\n const db = getDb();\n // Pull extensions the user can see, then narrow to ones declaring this slot.\n const accessible = await db\n .select({\n id: extensions.id,\n name: extensions.name,\n description: extensions.description,\n icon: extensions.icon,\n })\n .from(extensions)\n .where(accessFilter(extensions, extensionShares));\n const localRows = (await listLocalExtensions())\n .filter((extension) => extension.source.slots.includes(slotId))\n .map((extension) => ({\n extensionId: extension.id,\n name: extension.name,\n description: extension.description,\n icon: extension.icon,\n config: null,\n }));\n\n if (accessible.length === 0) return localRows;\n const ids = accessible.map((t: any) => t.id);\n const declarations = await db\n .select()\n .from(extensionSlots)\n .where(\n and(\n eq(extensionSlots.slotId, slotId),\n inArray(extensionSlots.extensionId, ids),\n ),\n );\n const byId = new Map(accessible.map((t: any) => [t.id, t]));\n const sqlRows = (declarations as ExtensionSlotRow[]).map((d) => {\n const t = byId.get(d.extensionId)!;\n return {\n extensionId: d.extensionId,\n name: t.name,\n description: t.description,\n icon: t.icon,\n config: d.config,\n };\n });\n return [...sqlRows, ...localRows];\n}\n\n/**\n * Install a extension into a slot for the current user. Verifies the user has at\n * least viewer access to the extension. Idempotent — re-installing returns the\n * existing row.\n */\nexport async function installExtensionSlot(\n extensionId: string,\n slotId: string,\n opts?: { position?: number; config?: string },\n): Promise<ExtensionSlotInstallRow> {\n const localExtension = await getLocalExtension(extensionId);\n if (localExtension) {\n if (!localExtension.source.slots.includes(slotId)) {\n throw new Error(\n `Local file extension \"${extensionId}\" does not declare slot \"${slotId}\" in extension.json.`,\n );\n }\n const userEmail = requireUserEmail();\n const now = new Date().toISOString();\n return {\n id: localSlotInstallId(localExtension.id, slotId),\n extensionId: localExtension.id,\n slotId,\n ownerEmail: userEmail,\n orgId: getRequestOrgId() ?? null,\n position: opts?.position ?? 0,\n config: opts?.config ?? null,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"viewer\");\n const userEmail = requireUserEmail();\n const orgId = getRequestOrgId();\n const db = getDb();\n const existing = await db\n .select()\n .from(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.extensionId, extensionId),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n if (existing[0]) return existing[0] as ExtensionSlotInstallRow;\n\n const id = randomUUID();\n const now = new Date().toISOString();\n let position = opts?.position;\n if (position === undefined) {\n const rows = await db\n .select({ pos: sql<number>`MAX(${extensionSlotInstalls.position})` })\n .from(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n const maxPos = Number((rows[0] as any)?.pos ?? -1);\n position = Number.isFinite(maxPos) ? maxPos + 1 : 0;\n }\n const row: ExtensionSlotInstallRow = {\n id,\n extensionId,\n slotId,\n ownerEmail: userEmail,\n orgId: orgId ?? null,\n position,\n config: opts?.config ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await db.insert(extensionSlotInstalls).values(row);\n return row;\n}\n\nexport async function uninstallExtensionSlot(\n extensionId: string,\n slotId: string,\n): Promise<boolean> {\n if (await getLocalExtension(extensionId)) {\n throw new Error(\n \"Local file extension slot installs are controlled by extension.json.\",\n );\n }\n await ensureSlotTables();\n const userEmail = requireUserEmail();\n const db = getDb();\n await db\n .delete(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.extensionId, extensionId),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n return true;\n}\n\n/**\n * List the current user's installs for a slot. Joins with `extensions` so the\n * caller gets extension name/description/icon/updatedAt without a second query.\n * Extensions the user has lost access to are silently skipped (lazy garbage\n * collection).\n */\nexport async function listSlotInstallsForUser(slotId: string): Promise<\n Array<{\n installId: string;\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n updatedAt: string;\n position: number;\n config: string | null;\n }>\n> {\n await ensureSlotTables();\n const userEmail = requireUserEmail();\n const db = getDb();\n const localInstalls = (await listLocalExtensions())\n .filter((extension) => extension.source.slots.includes(slotId))\n .map((extension, index) => ({\n installId: localSlotInstallId(extension.id, slotId),\n extensionId: extension.id,\n name: extension.name,\n description: extension.description,\n icon: extension.icon,\n updatedAt: extension.updatedAt,\n position: -1000 + index,\n config: null,\n }));\n\n const installs = await db\n .select()\n .from(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n if (installs.length === 0) return localInstalls;\n\n const accessible = await db\n .select({\n id: extensions.id,\n name: extensions.name,\n description: extensions.description,\n icon: extensions.icon,\n updatedAt: extensions.updatedAt,\n })\n .from(extensions)\n .where(accessFilter(extensions, extensionShares));\n const byId = new Map(accessible.map((t: any) => [t.id, t]));\n\n const sqlInstalls = (installs as ExtensionSlotInstallRow[])\n .filter((i) => byId.has(i.extensionId))\n .sort((a, b) => a.position - b.position)\n .map((i) => {\n const t = byId.get(i.extensionId)!;\n return {\n installId: i.id,\n extensionId: i.extensionId,\n name: t.name,\n description: t.description,\n icon: t.icon,\n updatedAt: t.updatedAt,\n position: i.position,\n config: i.config,\n };\n });\n return [...localInstalls, ...sqlInstalls];\n}\n\n/** Delete every slot/install row referencing a extension. Called from deleteExtension. */\nexport async function cascadeDeleteExtensionSlots(\n extensionId: string,\n): Promise<void> {\n await ensureSlotTables();\n const db = getDb();\n await db\n .delete(extensionSlots)\n .where(eq(extensionSlots.extensionId, extensionId));\n await db\n .delete(extensionSlotInstalls)\n .where(eq(extensionSlotInstalls.extensionId, extensionId));\n}\n\nfunction requireUserEmail(): string {\n const email = getRequestUserEmail();\n if (!email) {\n throw new Error(\"Slot operations require an authenticated user.\");\n }\n return email;\n}\n\nfunction localSlotDeclarationId(extensionId: string, slotId: string): string {\n return `local:${extensionId}:${slotId}:declaration`;\n}\n\nfunction localSlotInstallId(extensionId: string, slotId: string): string {\n return `local:${extensionId}:${slotId}:install`;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/slots/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { and, eq, inArray, isNull, sql } from \"drizzle-orm\";\n\nimport { getDbExec, isPostgres } from \"../../db/client.js\";\nimport { createGetDb } from \"../../db/create-get-db.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n} from \"../../server/request-context.js\";\nimport { accessFilter, assertAccess } from \"../../sharing/access.js\";\nimport { getLocalExtension, listLocalExtensions } from \"../local.js\";\nimport { extensions, extensionShares } from \"../schema.js\";\nimport {\n extensionSlots,\n extensionSlotInstalls,\n EXTENSION_SLOTS_CREATE_SQL,\n EXTENSION_SLOTS_CREATE_SQL_PG,\n EXTENSION_SLOTS_BY_SLOT_INDEX_SQL,\n EXTENSION_SLOTS_BY_EXTENSION_INDEX_SQL,\n EXTENSION_SLOTS_UNIQUE_INDEX_SQL,\n EXTENSION_SLOT_INSTALLS_CREATE_SQL,\n EXTENSION_SLOT_INSTALLS_CREATE_SQL_PG,\n EXTENSION_SLOT_INSTALLS_BY_USER_SLOT_INDEX_SQL,\n EXTENSION_SLOT_INSTALLS_UNIQUE_INDEX_SQL,\n} from \"./schema.js\";\n\nconst getDb = createGetDb({\n extensions,\n extensionShares,\n extensionSlots,\n extensionSlotInstalls,\n});\n\nlet _initPromise: Promise<void> | undefined;\n\nexport async function ensureSlotTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const pg = isPostgres();\n await client.execute(\n pg ? EXTENSION_SLOTS_CREATE_SQL_PG : EXTENSION_SLOTS_CREATE_SQL,\n );\n await client.execute(EXTENSION_SLOTS_BY_SLOT_INDEX_SQL);\n await client.execute(EXTENSION_SLOTS_BY_EXTENSION_INDEX_SQL);\n await client.execute(EXTENSION_SLOTS_UNIQUE_INDEX_SQL);\n await client.execute(\n pg\n ? EXTENSION_SLOT_INSTALLS_CREATE_SQL_PG\n : EXTENSION_SLOT_INSTALLS_CREATE_SQL,\n );\n await client.execute(EXTENSION_SLOT_INSTALLS_BY_USER_SLOT_INDEX_SQL);\n await client.execute(EXTENSION_SLOT_INSTALLS_UNIQUE_INDEX_SQL);\n })().catch((err) => {\n // Retry init on the next call after a failed startup.\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nexport interface ExtensionSlotRow {\n id: string;\n extensionId: string;\n slotId: string;\n config: string | null;\n createdAt: string;\n}\n\nexport interface ExtensionSlotInstallRow {\n id: string;\n extensionId: string;\n slotId: string;\n ownerEmail: string;\n orgId: string | null;\n position: number;\n config: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Declare that a extension can render in a slot. Caller must have editor access on\n * the extension (only people who can edit a extension can change its slot targets).\n */\nexport async function addExtensionSlotTarget(\n extensionId: string,\n slotId: string,\n config?: string,\n): Promise<ExtensionSlotRow> {\n if (await getLocalExtension(extensionId)) {\n throw new Error(\n \"Local file extension slot targets are declared in extension.json.\",\n );\n }\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"editor\");\n const db = getDb();\n const id = randomUUID();\n const createdAt = new Date().toISOString();\n const row: ExtensionSlotRow = {\n id,\n extensionId,\n slotId,\n config: config ?? null,\n createdAt,\n };\n try {\n await db.insert(extensionSlots).values(row);\n } catch (err: any) {\n // Unique index hit — already declared. Treat as idempotent: return existing.\n if (\n String(err?.message ?? err)\n .toLowerCase()\n .includes(\"unique\")\n ) {\n const existing = await db\n .select()\n .from(extensionSlots)\n .where(\n and(\n eq(extensionSlots.extensionId, extensionId),\n eq(extensionSlots.slotId, slotId),\n ),\n );\n if (existing[0]) return existing[0] as ExtensionSlotRow;\n }\n throw err;\n }\n return row;\n}\n\nexport async function removeExtensionSlotTarget(\n extensionId: string,\n slotId: string,\n): Promise<boolean> {\n if (await getLocalExtension(extensionId)) {\n throw new Error(\n \"Local file extension slot targets are declared in extension.json.\",\n );\n }\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"editor\");\n const db = getDb();\n await db\n .delete(extensionSlots)\n .where(\n and(\n eq(extensionSlots.extensionId, extensionId),\n eq(extensionSlots.slotId, slotId),\n ),\n );\n return true;\n}\n\nexport async function listSlotsForExtension(\n extensionId: string,\n): Promise<ExtensionSlotRow[]> {\n const localExtension = await getLocalExtension(extensionId);\n if (localExtension) {\n return localExtension.source.slots.map((slotId) => ({\n id: localSlotDeclarationId(localExtension.id, slotId),\n extensionId: localExtension.id,\n slotId,\n config: null,\n createdAt: localExtension.createdAt,\n }));\n }\n\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"viewer\");\n const db = getDb();\n const rows = await db\n .select()\n .from(extensionSlots)\n .where(eq(extensionSlots.extensionId, extensionId));\n return rows as ExtensionSlotRow[];\n}\n\n/**\n * List extensions that declare a slot — but only extensions the current user has access\n * to. Joins through the extensions access filter.\n */\nexport async function listExtensionsForSlot(slotId: string): Promise<\n Array<{\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n config: string | null;\n }>\n> {\n await ensureSlotTables();\n const db = getDb();\n // Pull extensions the user can see, then narrow to ones declaring this slot.\n const accessible = await db\n .select({\n id: extensions.id,\n name: extensions.name,\n description: extensions.description,\n icon: extensions.icon,\n })\n .from(extensions)\n .where(\n and(\n accessFilter(extensions, extensionShares),\n isNull(extensions.archivedAt),\n ),\n );\n const localRows = (await listLocalExtensions())\n .filter((extension) => extension.source.slots.includes(slotId))\n .map((extension) => ({\n extensionId: extension.id,\n name: extension.name,\n description: extension.description,\n icon: extension.icon,\n config: null,\n }));\n\n if (accessible.length === 0) return localRows;\n const ids = accessible.map((t: any) => t.id);\n const declarations = await db\n .select()\n .from(extensionSlots)\n .where(\n and(\n eq(extensionSlots.slotId, slotId),\n inArray(extensionSlots.extensionId, ids),\n ),\n );\n const byId = new Map(accessible.map((t: any) => [t.id, t]));\n const sqlRows = (declarations as ExtensionSlotRow[]).map((d) => {\n const t = byId.get(d.extensionId)!;\n return {\n extensionId: d.extensionId,\n name: t.name,\n description: t.description,\n icon: t.icon,\n config: d.config,\n };\n });\n return [...sqlRows, ...localRows];\n}\n\n/**\n * Install a extension into a slot for the current user. Verifies the user has at\n * least viewer access to the extension. Idempotent — re-installing returns the\n * existing row.\n */\nexport async function installExtensionSlot(\n extensionId: string,\n slotId: string,\n opts?: { position?: number; config?: string },\n): Promise<ExtensionSlotInstallRow> {\n const localExtension = await getLocalExtension(extensionId);\n if (localExtension) {\n if (!localExtension.source.slots.includes(slotId)) {\n throw new Error(\n `Local file extension \"${extensionId}\" does not declare slot \"${slotId}\" in extension.json.`,\n );\n }\n const userEmail = requireUserEmail();\n const now = new Date().toISOString();\n return {\n id: localSlotInstallId(localExtension.id, slotId),\n extensionId: localExtension.id,\n slotId,\n ownerEmail: userEmail,\n orgId: getRequestOrgId() ?? null,\n position: opts?.position ?? 0,\n config: opts?.config ?? null,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n await ensureSlotTables();\n await assertAccess(\"extension\", extensionId, \"viewer\");\n const userEmail = requireUserEmail();\n const orgId = getRequestOrgId();\n const db = getDb();\n const existing = await db\n .select()\n .from(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.extensionId, extensionId),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n if (existing[0]) return existing[0] as ExtensionSlotInstallRow;\n\n const id = randomUUID();\n const now = new Date().toISOString();\n let position = opts?.position;\n if (position === undefined) {\n const rows = await db\n .select({ pos: sql<number>`MAX(${extensionSlotInstalls.position})` })\n .from(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n const maxPos = Number((rows[0] as any)?.pos ?? -1);\n position = Number.isFinite(maxPos) ? maxPos + 1 : 0;\n }\n const row: ExtensionSlotInstallRow = {\n id,\n extensionId,\n slotId,\n ownerEmail: userEmail,\n orgId: orgId ?? null,\n position,\n config: opts?.config ?? null,\n createdAt: now,\n updatedAt: now,\n };\n await db.insert(extensionSlotInstalls).values(row);\n return row;\n}\n\nexport async function uninstallExtensionSlot(\n extensionId: string,\n slotId: string,\n): Promise<boolean> {\n if (await getLocalExtension(extensionId)) {\n throw new Error(\n \"Local file extension slot installs are controlled by extension.json.\",\n );\n }\n await ensureSlotTables();\n const userEmail = requireUserEmail();\n const db = getDb();\n await db\n .delete(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.extensionId, extensionId),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n return true;\n}\n\n/**\n * List the current user's installs for a slot. Joins with `extensions` so the\n * caller gets extension name/description/icon/updatedAt without a second query.\n * Extensions the user has lost access to are silently skipped (lazy garbage\n * collection).\n */\nexport async function listSlotInstallsForUser(slotId: string): Promise<\n Array<{\n installId: string;\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n updatedAt: string;\n position: number;\n config: string | null;\n }>\n> {\n await ensureSlotTables();\n const userEmail = requireUserEmail();\n const db = getDb();\n const localInstalls = (await listLocalExtensions())\n .filter((extension) => extension.source.slots.includes(slotId))\n .map((extension, index) => ({\n installId: localSlotInstallId(extension.id, slotId),\n extensionId: extension.id,\n name: extension.name,\n description: extension.description,\n icon: extension.icon,\n updatedAt: extension.updatedAt,\n position: -1000 + index,\n config: null,\n }));\n\n const installs = await db\n .select()\n .from(extensionSlotInstalls)\n .where(\n and(\n eq(extensionSlotInstalls.ownerEmail, userEmail),\n eq(extensionSlotInstalls.slotId, slotId),\n ),\n );\n if (installs.length === 0) return localInstalls;\n\n const accessible = await db\n .select({\n id: extensions.id,\n name: extensions.name,\n description: extensions.description,\n icon: extensions.icon,\n updatedAt: extensions.updatedAt,\n })\n .from(extensions)\n .where(\n and(\n accessFilter(extensions, extensionShares),\n isNull(extensions.archivedAt),\n ),\n );\n const byId = new Map(accessible.map((t: any) => [t.id, t]));\n\n const sqlInstalls = (installs as ExtensionSlotInstallRow[])\n .filter((i) => byId.has(i.extensionId))\n .sort((a, b) => a.position - b.position)\n .map((i) => {\n const t = byId.get(i.extensionId)!;\n return {\n installId: i.id,\n extensionId: i.extensionId,\n name: t.name,\n description: t.description,\n icon: t.icon,\n updatedAt: t.updatedAt,\n position: i.position,\n config: i.config,\n };\n });\n return [...localInstalls, ...sqlInstalls];\n}\n\n/** Delete every slot/install row referencing an extension for maintenance. */\nexport async function cascadeDeleteExtensionSlots(\n extensionId: string,\n): Promise<void> {\n await ensureSlotTables();\n const db = getDb();\n await db\n .delete(extensionSlots)\n .where(eq(extensionSlots.extensionId, extensionId));\n await db\n .delete(extensionSlotInstalls)\n .where(eq(extensionSlotInstalls.extensionId, extensionId));\n}\n\nfunction requireUserEmail(): string {\n const email = getRequestUserEmail();\n if (!email) {\n throw new Error(\"Slot operations require an authenticated user.\");\n }\n return email;\n}\n\nfunction localSlotDeclarationId(extensionId: string, slotId: string): string {\n return `local:${extensionId}:${slotId}:declaration`;\n}\n\nfunction localSlotInstallId(extensionId: string, slotId: string): string {\n return `local:${extensionId}:${slotId}:install`;\n}\n"]}
@@ -10,6 +10,7 @@ export interface ExtensionRow {
10
10
  icon: string | null;
11
11
  createdAt: string;
12
12
  updatedAt: string;
13
+ archivedAt: string | null;
13
14
  hiddenAt: string | null;
14
15
  hiddenBy: string | null;
15
16
  ownerEmail: string;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/extensions/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/extensions/store.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { accessFilter, assertAccess, resolveAccess, ForbiddenError, } from "../s
10
10
  import { registerShareableResource } from "../sharing/registry.js";
11
11
  import { EXTENSION_CHANGE_MARKER_KEY, extensionChangeMarkerSession, extensionChangeMarkerValue, } from "./change-marker.js";
12
12
  import { applyExtensionContentUpdate, ExtensionContentEditError, } from "./content-patch.js";
13
- import { extensions, extensionHides, extensionShares, extensionHistory, EXTENSIONS_CREATE_SQL, EXTENSIONS_CREATE_SQL_PG, EXTENSION_SHARES_CREATE_SQL, EXTENSION_SHARES_CREATE_SQL_PG, EXTENSION_DATA_CREATE_SQL, EXTENSION_DATA_CREATE_SQL_PG, EXTENSION_DATA_ITEM_INDEX_SQL, EXTENSION_DATA_ITEM_INDEX_SQL_PG, EXTENSION_DATA_DROP_OLD_INDEX_SQL, EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG, EXTENSIONS_OWNER_INDEX_SQL, EXTENSIONS_ORG_INDEX_SQL, EXTENSIONS_UPDATED_INDEX_SQL, EXTENSIONS_HIDDEN_AT_COLUMN_SQL, EXTENSIONS_HIDDEN_BY_COLUMN_SQL, EXTENSIONS_HIDDEN_AT_INDEX_SQL, EXTENSION_SHARES_RESOURCE_INDEX_SQL, EXTENSION_HIDES_CREATE_SQL, EXTENSION_HIDES_CREATE_SQL_PG, EXTENSION_HIDES_UNIQUE_INDEX_SQL, EXTENSION_HIDES_OWNER_INDEX_SQL, EXTENSION_HISTORY_CREATE_SQL, EXTENSION_HISTORY_CREATE_SQL_PG, EXTENSION_HISTORY_VERSION_INDEX_SQL, EXTENSION_HISTORY_CREATED_INDEX_SQL, EXTENSION_CONSENTS_CREATE_SQL, EXTENSION_CONSENTS_CREATE_SQL_PG, EXTENSION_CONSENTS_VIEWER_INDEX_SQL, } from "./schema.js";
13
+ import { extensions, extensionHides, extensionShares, extensionHistory, EXTENSIONS_CREATE_SQL, EXTENSIONS_CREATE_SQL_PG, EXTENSION_SHARES_CREATE_SQL, EXTENSION_SHARES_CREATE_SQL_PG, EXTENSION_DATA_CREATE_SQL, EXTENSION_DATA_CREATE_SQL_PG, EXTENSION_DATA_ITEM_INDEX_SQL, EXTENSION_DATA_ITEM_INDEX_SQL_PG, EXTENSION_DATA_DROP_OLD_INDEX_SQL, EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG, EXTENSIONS_OWNER_INDEX_SQL, EXTENSIONS_ORG_INDEX_SQL, EXTENSIONS_UPDATED_INDEX_SQL, EXTENSIONS_ARCHIVED_AT_COLUMN_SQL, EXTENSIONS_ARCHIVED_AT_INDEX_SQL, EXTENSIONS_HIDDEN_AT_COLUMN_SQL, EXTENSIONS_HIDDEN_BY_COLUMN_SQL, EXTENSIONS_HIDDEN_AT_INDEX_SQL, EXTENSION_SHARES_RESOURCE_INDEX_SQL, EXTENSION_HIDES_CREATE_SQL, EXTENSION_HIDES_CREATE_SQL_PG, EXTENSION_HIDES_UNIQUE_INDEX_SQL, EXTENSION_HIDES_OWNER_INDEX_SQL, EXTENSION_HISTORY_CREATE_SQL, EXTENSION_HISTORY_CREATE_SQL_PG, EXTENSION_HISTORY_VERSION_INDEX_SQL, EXTENSION_HISTORY_CREATED_INDEX_SQL, EXTENSION_CONSENTS_CREATE_SQL, EXTENSION_CONSENTS_CREATE_SQL_PG, EXTENSION_CONSENTS_VIEWER_INDEX_SQL, } from "./schema.js";
14
14
  const getDb = createGetDb({
15
15
  extensions,
16
16
  extensionShares,
@@ -37,6 +37,8 @@ export async function ensureExtensionsTables() {
37
37
  await ensureIndexExists("tools_owner_idx", EXTENSIONS_OWNER_INDEX_SQL);
38
38
  await ensureIndexExists("tools_org_idx", EXTENSIONS_ORG_INDEX_SQL);
39
39
  await ensureIndexExists("tools_updated_at_idx", EXTENSIONS_UPDATED_INDEX_SQL);
40
+ await ensureExtensionsArchivedColumn(client, pg);
41
+ await ensureIndexExists("tools_archived_at_idx", EXTENSIONS_ARCHIVED_AT_INDEX_SQL);
40
42
  await ensureExtensionsGlobalHideColumns(client, pg); // ADD COLUMN — guarded inside
41
43
  await ensureIndexExists("tools_hidden_at_idx", EXTENSIONS_HIDDEN_AT_INDEX_SQL);
42
44
  await ensureIndexExists("tool_shares_resource_idx", EXTENSION_SHARES_RESOURCE_INDEX_SQL);
@@ -64,6 +66,8 @@ export async function ensureExtensionsTables() {
64
66
  await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));
65
67
  await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));
66
68
  await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));
69
+ await ensureExtensionsArchivedColumn(client, pg);
70
+ await retryOnDdlRace(() => client.execute(EXTENSIONS_ARCHIVED_AT_INDEX_SQL));
67
71
  await ensureExtensionsGlobalHideColumns(client, pg);
68
72
  await retryOnDdlRace(() => client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL));
69
73
  await retryOnDdlRace(() => client.execute(EXTENSION_SHARES_RESOURCE_INDEX_SQL));
@@ -174,6 +178,21 @@ async function ensureExtensionsGlobalHideColumns(client, pg) {
174
178
  await addCol(EXTENSIONS_HIDDEN_AT_COLUMN_SQL, "hidden_at", "TEXT");
175
179
  await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, "hidden_by", "TEXT");
176
180
  }
181
+ async function ensureExtensionsArchivedColumn(client, pg) {
182
+ if (pg) {
183
+ await ensureColumnExists("tools", "archived_at", EXTENSIONS_ARCHIVED_AT_COLUMN_SQL);
184
+ return;
185
+ }
186
+ await client
187
+ .execute("ALTER TABLE tools ADD COLUMN archived_at TEXT")
188
+ .catch((err) => {
189
+ if (!String(err?.message ?? err)
190
+ .toLowerCase()
191
+ .includes("duplicate")) {
192
+ throw err;
193
+ }
194
+ });
195
+ }
177
196
  export function registerExtensionsShareable() {
178
197
  registerShareableResource({
179
198
  type: "extension",
@@ -531,9 +550,10 @@ export async function listExtensions(options = {}) {
531
550
  // on repeated `.where()` calls, so combine the access filter and the
532
551
  // global-hidden filter into one condition.
533
552
  const base = accessFilter(extensions, extensionShares);
553
+ const visible = and(base, isNull(extensions.archivedAt));
534
554
  const where = options.includeGloballyHidden
535
- ? base
536
- : and(base, isNull(extensions.hiddenAt));
555
+ ? visible
556
+ : and(visible, isNull(extensions.hiddenAt));
537
557
  const rows = (await db
538
558
  .select()
539
559
  .from(extensions)
@@ -548,7 +568,8 @@ export async function listExtensions(options = {}) {
548
568
  export async function getExtension(id) {
549
569
  await ensureExtensionsTables();
550
570
  const access = await resolveAccess("extension", id);
551
- return access?.resource ?? null;
571
+ const resource = access?.resource;
572
+ return resource?.archivedAt ? null : (resource ?? null);
552
573
  }
553
574
  export async function listExtensionHistory(id, options = {}) {
554
575
  await ensureExtensionsTables();
@@ -608,7 +629,7 @@ export async function restoreExtensionHistoryVersion(id, versionValue) {
608
629
  .from(extensions)
609
630
  .where(eq(extensions.id, id));
610
631
  const existing = existingRows[0];
611
- if (!existing)
632
+ if (!existing || existing.archivedAt)
612
633
  return null;
613
634
  await ensureExtensionHistoryBaseline(existing);
614
635
  const target = await getPersistedHistoryEntry(id, version, true);
@@ -656,6 +677,7 @@ export async function createExtension(data) {
656
677
  icon: data.icon ?? null,
657
678
  createdAt: now,
658
679
  updatedAt: now,
680
+ archivedAt: null,
659
681
  hiddenAt: null,
660
682
  hiddenBy: null,
661
683
  ownerEmail: userEmail,
@@ -695,7 +717,7 @@ export async function findRecentDuplicateExtension(data) {
695
717
  const rows = await db
696
718
  .select()
697
719
  .from(extensions)
698
- .where(and(eq(extensions.ownerEmail, userEmail), orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId), eq(extensions.name, data.name), eq(extensions.content, data.content), eq(extensions.description, description), icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon), gte(extensions.createdAt, fiveMinutesAgo), isNull(extensions.hiddenAt)))
720
+ .where(and(eq(extensions.ownerEmail, userEmail), orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId), eq(extensions.name, data.name), eq(extensions.content, data.content), eq(extensions.description, description), icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon), gte(extensions.createdAt, fiveMinutesAgo), isNull(extensions.archivedAt), isNull(extensions.hiddenAt)))
699
721
  .limit(1);
700
722
  return rows[0] ?? null;
701
723
  }
@@ -727,7 +749,7 @@ export async function updateExtension(id, data) {
727
749
  .from(extensions)
728
750
  .where(eq(extensions.id, id));
729
751
  const existing = existingRows[0];
730
- if (!existing)
752
+ if (!existing || existing.archivedAt)
731
753
  return null;
732
754
  await ensureExtensionHistoryBaseline(existing);
733
755
  await db.update(extensions).set(updates).where(eq(extensions.id, id));
@@ -759,8 +781,9 @@ export async function updateExtensionContent(id, opts) {
759
781
  .select()
760
782
  .from(extensions)
761
783
  .where(eq(extensions.id, id));
762
- if (!existingRows[0])
784
+ if (!existingRows[0] || existingRows[0].archivedAt) {
763
785
  return null;
786
+ }
764
787
  const existing = existingRows[0];
765
788
  const existingContent = existing.content;
766
789
  await ensureExtensionHistoryBaseline(existing);
@@ -789,20 +812,14 @@ export async function deleteExtension(id) {
789
812
  const row = rows[0];
790
813
  if (!row)
791
814
  return false;
815
+ if (row.archivedAt)
816
+ return true;
792
817
  const targets = await extensionChangeTargetsForRow(row);
793
- await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));
794
- await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));
795
- await getDbExec().execute({
796
- sql: `DELETE FROM tool_data WHERE tool_id = ?`,
797
- args: [id],
798
- });
799
- await getDbExec().execute({
800
- sql: `DELETE FROM tool_history WHERE tool_id = ?`,
801
- args: [id],
802
- });
803
- const { cascadeDeleteExtensionSlots } = await import("./slots/store.js");
804
- await cascadeDeleteExtensionSlots(id);
805
- await db.delete(extensions).where(eq(extensions.id, id));
818
+ const archivedAt = new Date().toISOString();
819
+ await db
820
+ .update(extensions)
821
+ .set({ archivedAt, updatedAt: archivedAt })
822
+ .where(eq(extensions.id, id));
806
823
  await notifyExtensionChanged(targets);
807
824
  return true;
808
825
  }