@agent-native/core 0.107.2 → 0.109.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 (502) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +24 -0
  3. package/corpus/core/docs/content/actions.mdx +48 -0
  4. package/corpus/core/docs/content/locales/ar-SA/actions.mdx +38 -0
  5. package/corpus/core/docs/content/locales/de-DE/actions.mdx +38 -0
  6. package/corpus/core/docs/content/locales/es-ES/actions.mdx +38 -0
  7. package/corpus/core/docs/content/locales/fr-FR/actions.mdx +38 -0
  8. package/corpus/core/docs/content/locales/hi-IN/actions.mdx +38 -0
  9. package/corpus/core/docs/content/locales/ja-JP/actions.mdx +38 -0
  10. package/corpus/core/docs/content/locales/ko-KR/actions.mdx +38 -0
  11. package/corpus/core/docs/content/locales/pt-BR/actions.mdx +38 -0
  12. package/corpus/core/docs/content/locales/zh-CN/actions.mdx +38 -0
  13. package/corpus/core/docs/content/locales/zh-TW/actions.mdx +38 -0
  14. package/corpus/core/package.json +5 -1
  15. package/corpus/core/src/a2a/client.ts +140 -17
  16. package/corpus/core/src/a2a/handlers.ts +60 -0
  17. package/corpus/core/src/a2a/index.ts +6 -1
  18. package/corpus/core/src/a2a/invoke.ts +68 -1
  19. package/corpus/core/src/a2a/server.ts +13 -1
  20. package/corpus/core/src/a2a/types.ts +16 -0
  21. package/corpus/core/src/a2a-claims.ts +52 -0
  22. package/corpus/core/src/action.ts +7 -2
  23. package/corpus/core/src/agent/production-agent.ts +10 -4
  24. package/corpus/core/src/audit/record.ts +6 -0
  25. package/corpus/core/src/client/AssistantChat.tsx +648 -603
  26. package/corpus/core/src/client/MultiTabAssistantChat.tsx +31 -4
  27. package/corpus/core/src/client/agent-chat-adapter.ts +23 -37
  28. package/corpus/core/src/client/agent-sidebar-state.ts +4 -0
  29. package/corpus/core/src/client/analytics.ts +84 -0
  30. package/corpus/core/src/client/chat/message-components.tsx +94 -22
  31. package/corpus/core/src/client/chat/tool-call-display.tsx +170 -47
  32. package/corpus/core/src/client/chat/use-agent-chat-lifecycle-tracking.ts +74 -0
  33. package/corpus/core/src/client/chat-thread-url.ts +11 -0
  34. package/corpus/core/src/client/error-capture.ts +12 -0
  35. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +37 -1
  36. package/corpus/core/src/client/feature-flags/FeatureFlagsPanel.tsx +519 -0
  37. package/corpus/core/src/client/feature-flags/helpers.ts +77 -0
  38. package/corpus/core/src/client/feature-flags/index.ts +13 -0
  39. package/corpus/core/src/client/feature-flags/types.ts +29 -0
  40. package/corpus/core/src/client/feature-flags/use-feature-flag.ts +26 -0
  41. package/corpus/core/src/client/index.ts +13 -0
  42. package/corpus/core/src/client/route-chunk-recovery.ts +20 -8
  43. package/corpus/core/src/client/session-replay.ts +31 -0
  44. package/corpus/core/src/extensions/actions.ts +2 -14
  45. package/corpus/core/src/extensions/routes.ts +1 -1
  46. package/corpus/core/src/extensions/store.ts +1 -1
  47. package/corpus/core/src/feature-flags/a2a-action-route.ts +56 -0
  48. package/corpus/core/src/feature-flags/actions/get-feature-flags.ts +24 -0
  49. package/corpus/core/src/feature-flags/actions/list-feature-flags.ts +69 -0
  50. package/corpus/core/src/feature-flags/actions/set-feature-flag.ts +89 -0
  51. package/corpus/core/src/feature-flags/index.ts +21 -0
  52. package/corpus/core/src/feature-flags/permissions.ts +53 -0
  53. package/corpus/core/src/feature-flags/plugin.ts +44 -0
  54. package/corpus/core/src/feature-flags/registry.ts +96 -0
  55. package/corpus/core/src/feature-flags/store.ts +176 -0
  56. package/corpus/core/src/index.ts +15 -0
  57. package/corpus/core/src/localization/default-messages.ts +50 -0
  58. package/corpus/core/src/mcp/build-server.ts +2 -2
  59. package/corpus/core/src/progress/actions.ts +4 -2
  60. package/corpus/core/src/provider-api/index.ts +205 -105
  61. package/corpus/core/src/scripts/call-agent.ts +137 -17
  62. package/corpus/core/src/server/action-discovery.ts +12 -0
  63. package/corpus/core/src/server/action-routes.ts +47 -5
  64. package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +40 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +31 -0
  66. package/corpus/core/src/server/index.ts +1 -0
  67. package/corpus/core/src/settings/org-settings.ts +13 -0
  68. package/corpus/core/src/settings/store.ts +57 -0
  69. package/corpus/core/src/styles/agent-conversation.css +7 -0
  70. package/corpus/core/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  71. package/corpus/core/src/templates/default/AGENTS.md +1 -0
  72. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +20 -0
  73. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +20 -0
  74. package/corpus/core/src/templates/default/app/i18n/en-US.ts +20 -0
  75. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +20 -0
  76. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  77. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +19 -0
  78. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +20 -0
  79. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +19 -0
  80. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +20 -0
  81. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +19 -0
  82. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  83. package/corpus/core/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  84. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  85. package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  86. package/corpus/core/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  87. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  88. package/corpus/core/src/templates/workspace-core/AGENTS.md +1 -1
  89. package/corpus/core/src/templates/workspace-root/AGENTS.md +1 -1
  90. package/corpus/core/src/vite/action-types-plugin.ts +12 -0
  91. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +29 -10
  92. package/corpus/templates/analytics/.agents/skills/feature-flags/SKILL.md +169 -0
  93. package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +54 -23
  94. package/corpus/templates/analytics/.builder/skills/apollo/SKILL.md +19 -41
  95. package/corpus/templates/analytics/.builder/skills/commonroom/SKILL.md +20 -35
  96. package/corpus/templates/analytics/.builder/skills/github/SKILL.md +23 -67
  97. package/corpus/templates/analytics/.builder/skills/pylon/SKILL.md +25 -43
  98. package/corpus/templates/analytics/AGENTS.md +37 -16
  99. package/corpus/templates/analytics/actions/account-deep-dive.ts +1 -0
  100. package/corpus/templates/analytics/actions/configure-gong-native-insights.ts +29 -0
  101. package/corpus/templates/analytics/actions/content-calendar-schema.ts +8 -4
  102. package/corpus/templates/analytics/actions/content-calendar.ts +12 -4
  103. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +2 -1
  104. package/corpus/templates/analytics/actions/gong-calls.ts +113 -22
  105. package/corpus/templates/analytics/actions/gong-native-insights.ts +166 -0
  106. package/corpus/templates/analytics/actions/hubspot-deals.ts +190 -46
  107. package/corpus/templates/analytics/actions/list-workspace-feature-flags.ts +15 -0
  108. package/corpus/templates/analytics/actions/navigate.ts +2 -2
  109. package/corpus/templates/analytics/actions/pylon-issues.ts +123 -0
  110. package/corpus/templates/analytics/actions/set-workspace-feature-flag.ts +45 -0
  111. package/corpus/templates/analytics/actions/slack-messages.ts +179 -27
  112. package/corpus/templates/analytics/actions/view-screen.ts +13 -0
  113. package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +243 -0
  114. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +48 -152
  115. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +11 -3
  116. package/corpus/templates/analytics/app/components/ui/chart.tsx +1 -1
  117. package/corpus/templates/analytics/app/hooks/use-chart-tooltip-flip.ts +21 -6
  118. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +3 -1
  119. package/corpus/templates/analytics/app/i18n/zh-TW.ts +30 -0
  120. package/corpus/templates/analytics/app/i18n-data.ts +385 -0
  121. package/corpus/templates/analytics/app/pages/Agents.tsx +22 -2
  122. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +181 -30
  123. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  124. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +4 -3
  125. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-editors-can-add-shared-extensions-or-opt-into-per-.md +6 -0
  126. package/corpus/templates/analytics/changelog/2026-07-17-dashboard-extensions-show-a-loading-skeleton.md +6 -0
  127. package/corpus/templates/analytics/changelog/2026-07-17-errors-now-group-repeat-failures-consistently-and-keep-priva.md +6 -0
  128. package/corpus/templates/analytics/changelog/2026-07-17-gong-transcript-reviews-now-batch-bounded-call-windows-for-f.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-17-hubspot-deal-filters-now-run-in-hubspot-before-paging-result.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-17-manage-feature-flag-rollouts-across-your-organization-s-apps.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-17-notion-content-calendars-now-discover-the-matching-database-.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-17-pylon-dashboard-reads-now-use-the-paginated-issue-search-api.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-17-slack-reads-no-longer-join-channels-and-report-pagination-coverage.md +6 -0
  134. package/corpus/templates/analytics/server/handlers/notion.ts +14 -3
  135. package/corpus/templates/analytics/server/handlers/slack.ts +182 -29
  136. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +2 -6
  137. package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +6 -2
  138. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +13 -5
  139. package/corpus/templates/analytics/server/lib/error-capture.ts +75 -8
  140. package/corpus/templates/analytics/server/lib/gong-native-policy.ts +72 -0
  141. package/corpus/templates/analytics/server/lib/gong.ts +54 -66
  142. package/corpus/templates/analytics/server/lib/hubspot.ts +40 -3
  143. package/corpus/templates/analytics/server/lib/notion.ts +83 -8
  144. package/corpus/templates/analytics/server/lib/real-data-actions.ts +4 -0
  145. package/corpus/templates/analytics/server/lib/slack.ts +242 -90
  146. package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +347 -0
  147. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -3
  148. package/corpus/templates/analytics/server/routes/api/pylon/accounts.get.ts +42 -1
  149. package/corpus/templates/analytics/server/routes/api/pylon/issues.get.ts +71 -1
  150. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +44 -4
  151. package/corpus/templates/assets/.agents/skills/feature-flags/SKILL.md +169 -0
  152. package/corpus/templates/brain/.agents/skills/feature-flags/SKILL.md +169 -0
  153. package/corpus/templates/calendar/.agents/skills/feature-flags/SKILL.md +169 -0
  154. package/corpus/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  155. package/corpus/templates/clips/.agents/skills/feature-flags/SKILL.md +169 -0
  156. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +19 -1
  157. package/corpus/templates/clips/app/components/library/create-folder-dialog.tsx +123 -0
  158. package/corpus/templates/clips/app/components/library/library-grid.tsx +42 -4
  159. package/corpus/templates/clips/app/components/library/recording-card.tsx +30 -0
  160. package/corpus/templates/clips/app/entry.client.tsx +6 -1
  161. package/corpus/templates/clips/app/i18n/ar-SA.ts +12 -1
  162. package/corpus/templates/clips/app/i18n/de-DE.ts +12 -1
  163. package/corpus/templates/clips/app/i18n/en-US.ts +12 -1
  164. package/corpus/templates/clips/app/i18n/es-ES.ts +11 -1
  165. package/corpus/templates/clips/app/i18n/fr-FR.ts +11 -1
  166. package/corpus/templates/clips/app/i18n/hi-IN.ts +10 -1
  167. package/corpus/templates/clips/app/i18n/ja-JP.ts +12 -1
  168. package/corpus/templates/clips/app/i18n/ko-KR.ts +11 -1
  169. package/corpus/templates/clips/app/i18n/pt-BR.ts +11 -1
  170. package/corpus/templates/clips/app/i18n/zh-CN.ts +11 -1
  171. package/corpus/templates/clips/app/i18n/zh-TW.ts +11 -1
  172. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +72 -1
  173. package/corpus/templates/clips/changelog/2026-07-17-choose-which-workspace-receives-new-clips-recordings-and-des.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-17-create-folders-directly-from-the-move-menu.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-17-failed-desktop-uploads-now-offer-a-direct-way-to-reopen-clip.md +6 -0
  176. package/corpus/templates/clips/desktop/src/app.tsx +1 -1
  177. package/corpus/templates/clips/server/plugins/feature-flags.ts +11 -0
  178. package/corpus/templates/clips/shared/feature-flags.ts +30 -37
  179. package/corpus/templates/content/.agents/skills/feature-flags/SKILL.md +169 -0
  180. package/corpus/templates/content/app/entry.client.tsx +6 -1
  181. package/corpus/templates/design/.agents/skills/feature-flags/SKILL.md +169 -0
  182. package/corpus/templates/design/AGENTS.md +5 -3
  183. package/corpus/templates/design/actions/add-fusion-screens.ts +4 -6
  184. package/corpus/templates/design/actions/apply-fusion-edits.ts +4 -6
  185. package/corpus/templates/design/actions/create-fusion-app.ts +5 -4
  186. package/corpus/templates/design/actions/deploy-fusion-app.ts +4 -3
  187. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +4 -6
  188. package/corpus/templates/design/actions/list-fusion-edits.ts +4 -3
  189. package/corpus/templates/design/actions/push-fusion-app.ts +4 -6
  190. package/corpus/templates/design/actions/queue-fusion-edit.ts +4 -3
  191. package/corpus/templates/design/actions/send-fusion-message.ts +4 -6
  192. package/corpus/templates/design/actions/sync-fusion-app.ts +4 -3
  193. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +1 -1
  194. package/corpus/templates/design/app/pages/Index.tsx +8 -6
  195. package/corpus/templates/design/server/plugins/feature-flags.ts +5 -0
  196. package/corpus/templates/design/shared/full-app.ts +10 -7
  197. package/corpus/templates/dispatch/.agents/skills/feature-flags/SKILL.md +169 -0
  198. package/corpus/templates/dispatch/AGENTS.md +5 -0
  199. package/corpus/templates/dispatch/changelog/2026-07-17-apps-page-links-to-other-available-apps.md +6 -0
  200. package/corpus/templates/dispatch/changelog/2026-07-17-curated-template-remixes.md +6 -0
  201. package/corpus/templates/forms/.agents/skills/feature-flags/SKILL.md +169 -0
  202. package/corpus/templates/macros/.agents/skills/feature-flags/SKILL.md +169 -0
  203. package/corpus/templates/mail/.agents/skills/feature-flags/SKILL.md +169 -0
  204. package/corpus/templates/mail/app/entry.client.tsx +6 -1
  205. package/corpus/templates/plan/.agents/skills/feature-flags/SKILL.md +169 -0
  206. package/corpus/templates/slides/.agents/skills/feature-flags/SKILL.md +169 -0
  207. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +11 -7
  208. package/corpus/templates/slides/.env.example +0 -1
  209. package/corpus/templates/slides/AGENTS.md +4 -0
  210. package/corpus/templates/slides/DEVELOPING.md +2 -2
  211. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  212. package/corpus/templates/slides/actions/logo-config.ts +6 -7
  213. package/corpus/templates/slides/actions/search-images.ts +11 -39
  214. package/corpus/templates/slides/actions/search-logos.ts +5 -52
  215. package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +1 -1
  216. package/corpus/templates/slides/app/components/editor/LogoSearchPanel.tsx +16 -26
  217. package/corpus/templates/slides/app/entry.client.tsx +6 -1
  218. package/corpus/templates/slides/server/lib/media-search-providers.ts +216 -0
  219. package/corpus/templates/slides/server/register-secrets.ts +30 -0
  220. package/corpus/templates/tasks/.agents/skills/feature-flags/SKILL.md +169 -0
  221. package/dist/a2a/client.d.ts +38 -1
  222. package/dist/a2a/client.d.ts.map +1 -1
  223. package/dist/a2a/client.js +81 -12
  224. package/dist/a2a/client.js.map +1 -1
  225. package/dist/a2a/handlers.d.ts.map +1 -1
  226. package/dist/a2a/handlers.js +47 -0
  227. package/dist/a2a/handlers.js.map +1 -1
  228. package/dist/a2a/index.d.ts +4 -4
  229. package/dist/a2a/index.d.ts.map +1 -1
  230. package/dist/a2a/index.js +2 -2
  231. package/dist/a2a/index.js.map +1 -1
  232. package/dist/a2a/invoke.d.ts +26 -2
  233. package/dist/a2a/invoke.d.ts.map +1 -1
  234. package/dist/a2a/invoke.js +30 -1
  235. package/dist/a2a/invoke.js.map +1 -1
  236. package/dist/a2a/server.d.ts.map +1 -1
  237. package/dist/a2a/server.js +14 -1
  238. package/dist/a2a/server.js.map +1 -1
  239. package/dist/a2a/types.d.ts +12 -0
  240. package/dist/a2a/types.d.ts.map +1 -1
  241. package/dist/a2a/types.js.map +1 -1
  242. package/dist/a2a-claims.d.ts +10 -0
  243. package/dist/a2a-claims.d.ts.map +1 -0
  244. package/dist/a2a-claims.js +41 -0
  245. package/dist/a2a-claims.js.map +1 -0
  246. package/dist/action.d.ts +7 -2
  247. package/dist/action.d.ts.map +1 -1
  248. package/dist/action.js.map +1 -1
  249. package/dist/agent/production-agent.d.ts +5 -0
  250. package/dist/agent/production-agent.d.ts.map +1 -1
  251. package/dist/agent/production-agent.js +5 -3
  252. package/dist/agent/production-agent.js.map +1 -1
  253. package/dist/audit/record.d.ts +3 -0
  254. package/dist/audit/record.d.ts.map +1 -1
  255. package/dist/audit/record.js +3 -0
  256. package/dist/audit/record.js.map +1 -1
  257. package/dist/client/AssistantChat.d.ts +14 -1
  258. package/dist/client/AssistantChat.d.ts.map +1 -1
  259. package/dist/client/AssistantChat.js +158 -136
  260. package/dist/client/AssistantChat.js.map +1 -1
  261. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  262. package/dist/client/MultiTabAssistantChat.js +27 -4
  263. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  264. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  265. package/dist/client/agent-chat-adapter.js +21 -39
  266. package/dist/client/agent-chat-adapter.js.map +1 -1
  267. package/dist/client/agent-sidebar-state.d.ts +1 -0
  268. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  269. package/dist/client/agent-sidebar-state.js +4 -0
  270. package/dist/client/agent-sidebar-state.js.map +1 -1
  271. package/dist/client/analytics.d.ts +14 -0
  272. package/dist/client/analytics.d.ts.map +1 -1
  273. package/dist/client/analytics.js +67 -0
  274. package/dist/client/analytics.js.map +1 -1
  275. package/dist/client/chat/message-components.d.ts +8 -0
  276. package/dist/client/chat/message-components.d.ts.map +1 -1
  277. package/dist/client/chat/message-components.js +62 -19
  278. package/dist/client/chat/message-components.js.map +1 -1
  279. package/dist/client/chat/tool-call-display.d.ts +6 -0
  280. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  281. package/dist/client/chat/tool-call-display.js +83 -14
  282. package/dist/client/chat/tool-call-display.js.map +1 -1
  283. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts +8 -0
  284. package/dist/client/chat/use-agent-chat-lifecycle-tracking.d.ts.map +1 -0
  285. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js +51 -0
  286. package/dist/client/chat/use-agent-chat-lifecycle-tracking.js.map +1 -0
  287. package/dist/client/chat-thread-url.d.ts +2 -0
  288. package/dist/client/chat-thread-url.d.ts.map +1 -0
  289. package/dist/client/chat-thread-url.js +12 -0
  290. package/dist/client/chat-thread-url.js.map +1 -0
  291. package/dist/client/error-capture.d.ts.map +1 -1
  292. package/dist/client/error-capture.js +7 -0
  293. package/dist/client/error-capture.js.map +1 -1
  294. package/dist/client/extensions/ExtensionSlot.d.ts +3 -1
  295. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -1
  296. package/dist/client/extensions/ExtensionSlot.js +28 -3
  297. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  298. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts +10 -0
  299. package/dist/client/feature-flags/FeatureFlagsPanel.d.ts.map +1 -0
  300. package/dist/client/feature-flags/FeatureFlagsPanel.js +143 -0
  301. package/dist/client/feature-flags/FeatureFlagsPanel.js.map +1 -0
  302. package/dist/client/feature-flags/helpers.d.ts +16 -0
  303. package/dist/client/feature-flags/helpers.d.ts.map +1 -0
  304. package/dist/client/feature-flags/helpers.js +50 -0
  305. package/dist/client/feature-flags/helpers.js.map +1 -0
  306. package/dist/client/feature-flags/index.d.ts +5 -0
  307. package/dist/client/feature-flags/index.d.ts.map +1 -0
  308. package/dist/client/feature-flags/index.js +4 -0
  309. package/dist/client/feature-flags/index.js.map +1 -0
  310. package/dist/client/feature-flags/types.d.ts +27 -0
  311. package/dist/client/feature-flags/types.d.ts.map +1 -0
  312. package/dist/client/feature-flags/types.js +2 -0
  313. package/dist/client/feature-flags/types.js.map +1 -0
  314. package/dist/client/feature-flags/use-feature-flag.d.ts +8 -0
  315. package/dist/client/feature-flags/use-feature-flag.d.ts.map +1 -0
  316. package/dist/client/feature-flags/use-feature-flag.js +15 -0
  317. package/dist/client/feature-flags/use-feature-flag.js.map +1 -0
  318. package/dist/client/index.d.ts +2 -1
  319. package/dist/client/index.d.ts.map +1 -1
  320. package/dist/client/index.js +2 -1
  321. package/dist/client/index.js.map +1 -1
  322. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  323. package/dist/client/route-chunk-recovery.js +14 -9
  324. package/dist/client/route-chunk-recovery.js.map +1 -1
  325. package/dist/client/session-replay.d.ts +15 -0
  326. package/dist/client/session-replay.d.ts.map +1 -1
  327. package/dist/client/session-replay.js +20 -0
  328. package/dist/client/session-replay.js.map +1 -1
  329. package/dist/collab/struct-routes.d.ts +1 -1
  330. package/dist/extensions/actions.d.ts.map +1 -1
  331. package/dist/extensions/actions.js +2 -10
  332. package/dist/extensions/actions.js.map +1 -1
  333. package/dist/extensions/routes.d.ts.map +1 -1
  334. package/dist/extensions/routes.js +1 -1
  335. package/dist/extensions/routes.js.map +1 -1
  336. package/dist/extensions/store.js +1 -1
  337. package/dist/extensions/store.js.map +1 -1
  338. package/dist/feature-flags/a2a-action-route.d.ts +14 -0
  339. package/dist/feature-flags/a2a-action-route.d.ts.map +1 -0
  340. package/dist/feature-flags/a2a-action-route.js +50 -0
  341. package/dist/feature-flags/a2a-action-route.js.map +1 -0
  342. package/dist/feature-flags/actions/get-feature-flags.d.ts +3 -0
  343. package/dist/feature-flags/actions/get-feature-flags.d.ts.map +1 -0
  344. package/dist/feature-flags/actions/get-feature-flags.js +18 -0
  345. package/dist/feature-flags/actions/get-feature-flags.js.map +1 -0
  346. package/dist/feature-flags/actions/list-feature-flags.d.ts +28 -0
  347. package/dist/feature-flags/actions/list-feature-flags.d.ts.map +1 -0
  348. package/dist/feature-flags/actions/list-feature-flags.js +60 -0
  349. package/dist/feature-flags/actions/list-feature-flags.js.map +1 -0
  350. package/dist/feature-flags/actions/set-feature-flag.d.ts +26 -0
  351. package/dist/feature-flags/actions/set-feature-flag.d.ts.map +1 -0
  352. package/dist/feature-flags/actions/set-feature-flag.js +78 -0
  353. package/dist/feature-flags/actions/set-feature-flag.js.map +1 -0
  354. package/dist/feature-flags/index.d.ts +5 -0
  355. package/dist/feature-flags/index.d.ts.map +1 -0
  356. package/dist/feature-flags/index.js +5 -0
  357. package/dist/feature-flags/index.js.map +1 -0
  358. package/dist/feature-flags/permissions.d.ts +13 -0
  359. package/dist/feature-flags/permissions.d.ts.map +1 -0
  360. package/dist/feature-flags/permissions.js +37 -0
  361. package/dist/feature-flags/permissions.js.map +1 -0
  362. package/dist/feature-flags/plugin.d.ts +17 -0
  363. package/dist/feature-flags/plugin.d.ts.map +1 -0
  364. package/dist/feature-flags/plugin.js +29 -0
  365. package/dist/feature-flags/plugin.js.map +1 -0
  366. package/dist/feature-flags/registry.d.ts +23 -0
  367. package/dist/feature-flags/registry.d.ts.map +1 -0
  368. package/dist/feature-flags/registry.js +59 -0
  369. package/dist/feature-flags/registry.js.map +1 -0
  370. package/dist/feature-flags/store.d.ts +31 -0
  371. package/dist/feature-flags/store.d.ts.map +1 -0
  372. package/dist/feature-flags/store.js +124 -0
  373. package/dist/feature-flags/store.js.map +1 -0
  374. package/dist/index.d.ts +1 -0
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/index.js +1 -0
  377. package/dist/index.js.map +1 -1
  378. package/dist/localization/default-messages.d.ts +45 -0
  379. package/dist/localization/default-messages.d.ts.map +1 -1
  380. package/dist/localization/default-messages.js +45 -0
  381. package/dist/localization/default-messages.js.map +1 -1
  382. package/dist/mcp/build-server.d.ts +2 -0
  383. package/dist/mcp/build-server.d.ts.map +1 -1
  384. package/dist/mcp/build-server.js +2 -2
  385. package/dist/mcp/build-server.js.map +1 -1
  386. package/dist/notifications/routes.d.ts +2 -2
  387. package/dist/progress/actions.d.ts.map +1 -1
  388. package/dist/progress/actions.js +3 -2
  389. package/dist/progress/actions.js.map +1 -1
  390. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  391. package/dist/provider-api/index.d.ts.map +1 -1
  392. package/dist/provider-api/index.js +91 -8
  393. package/dist/provider-api/index.js.map +1 -1
  394. package/dist/resources/handlers.d.ts +3 -3
  395. package/dist/scripts/call-agent.d.ts.map +1 -1
  396. package/dist/scripts/call-agent.js +107 -16
  397. package/dist/scripts/call-agent.js.map +1 -1
  398. package/dist/server/action-discovery.d.ts.map +1 -1
  399. package/dist/server/action-discovery.js +12 -0
  400. package/dist/server/action-discovery.js.map +1 -1
  401. package/dist/server/action-routes.d.ts +3 -0
  402. package/dist/server/action-routes.d.ts.map +1 -1
  403. package/dist/server/action-routes.js +45 -5
  404. package/dist/server/action-routes.js.map +1 -1
  405. package/dist/server/agent-chat/action-filters-a2a.d.ts +6 -0
  406. package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
  407. package/dist/server/agent-chat/action-filters-a2a.js +27 -0
  408. package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
  409. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  410. package/dist/server/agent-chat-plugin.js +27 -1
  411. package/dist/server/agent-chat-plugin.js.map +1 -1
  412. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  413. package/dist/server/index.d.ts +1 -0
  414. package/dist/server/index.d.ts.map +1 -1
  415. package/dist/server/index.js +1 -0
  416. package/dist/server/index.js.map +1 -1
  417. package/dist/server/transcribe-voice.d.ts +1 -1
  418. package/dist/settings/org-settings.d.ts +2 -0
  419. package/dist/settings/org-settings.d.ts.map +1 -1
  420. package/dist/settings/org-settings.js +5 -1
  421. package/dist/settings/org-settings.js.map +1 -1
  422. package/dist/settings/store.d.ts +8 -0
  423. package/dist/settings/store.d.ts.map +1 -1
  424. package/dist/settings/store.js +48 -0
  425. package/dist/settings/store.js.map +1 -1
  426. package/dist/styles/agent-conversation.css +7 -0
  427. package/dist/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  428. package/dist/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  429. package/dist/templates/default/AGENTS.md +1 -0
  430. package/dist/templates/default/app/i18n/ar-SA.ts +20 -0
  431. package/dist/templates/default/app/i18n/de-DE.ts +20 -0
  432. package/dist/templates/default/app/i18n/en-US.ts +20 -0
  433. package/dist/templates/default/app/i18n/es-ES.ts +20 -0
  434. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  435. package/dist/templates/default/app/i18n/hi-IN.ts +19 -0
  436. package/dist/templates/default/app/i18n/ja-JP.ts +20 -0
  437. package/dist/templates/default/app/i18n/ko-KR.ts +19 -0
  438. package/dist/templates/default/app/i18n/pt-BR.ts +20 -0
  439. package/dist/templates/default/app/i18n/zh-CN.ts +19 -0
  440. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  441. package/dist/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  442. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  443. package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  444. package/dist/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  445. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  446. package/dist/templates/workspace-core/AGENTS.md +1 -1
  447. package/dist/templates/workspace-root/AGENTS.md +1 -1
  448. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  449. package/dist/vite/action-types-plugin.js +12 -0
  450. package/dist/vite/action-types-plugin.js.map +1 -1
  451. package/docs/content/actions.mdx +48 -0
  452. package/docs/content/locales/ar-SA/actions.mdx +38 -0
  453. package/docs/content/locales/de-DE/actions.mdx +38 -0
  454. package/docs/content/locales/es-ES/actions.mdx +38 -0
  455. package/docs/content/locales/fr-FR/actions.mdx +38 -0
  456. package/docs/content/locales/hi-IN/actions.mdx +38 -0
  457. package/docs/content/locales/ja-JP/actions.mdx +38 -0
  458. package/docs/content/locales/ko-KR/actions.mdx +38 -0
  459. package/docs/content/locales/pt-BR/actions.mdx +38 -0
  460. package/docs/content/locales/zh-CN/actions.mdx +38 -0
  461. package/docs/content/locales/zh-TW/actions.mdx +38 -0
  462. package/package.json +5 -1
  463. package/src/templates/chat/.agents/skills/feature-flags/SKILL.md +169 -0
  464. package/src/templates/default/.agents/skills/feature-flags/SKILL.md +169 -0
  465. package/src/templates/default/AGENTS.md +1 -0
  466. package/src/templates/default/app/i18n/ar-SA.ts +20 -0
  467. package/src/templates/default/app/i18n/de-DE.ts +20 -0
  468. package/src/templates/default/app/i18n/en-US.ts +20 -0
  469. package/src/templates/default/app/i18n/es-ES.ts +20 -0
  470. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  471. package/src/templates/default/app/i18n/hi-IN.ts +19 -0
  472. package/src/templates/default/app/i18n/ja-JP.ts +20 -0
  473. package/src/templates/default/app/i18n/ko-KR.ts +19 -0
  474. package/src/templates/default/app/i18n/pt-BR.ts +20 -0
  475. package/src/templates/default/app/i18n/zh-CN.ts +19 -0
  476. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  477. package/src/templates/headless/.agents/skills/feature-flags/SKILL.md +169 -0
  478. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +28 -0
  479. package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +5 -0
  480. package/src/templates/workspace-core/.agents/skills/feature-flags/SKILL.md +169 -0
  481. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +13 -0
  482. package/src/templates/workspace-core/AGENTS.md +1 -1
  483. package/src/templates/workspace-root/AGENTS.md +1 -1
  484. package/corpus/templates/analytics/server/handlers/github.ts +0 -200
  485. package/corpus/templates/analytics/server/handlers/pylon.ts +0 -43
  486. package/corpus/templates/analytics/server/lib/apollo.ts +0 -167
  487. package/corpus/templates/analytics/server/lib/commonroom.ts +0 -149
  488. package/corpus/templates/analytics/server/lib/github.ts +0 -660
  489. package/corpus/templates/analytics/server/lib/mixpanel.ts +0 -156
  490. package/corpus/templates/analytics/server/lib/posthog.ts +0 -194
  491. package/corpus/templates/analytics/server/lib/pylon.ts +0 -109
  492. package/corpus/templates/analytics/server/routes/api/github/graphql.post.ts +0 -1
  493. package/corpus/templates/analytics/server/routes/api/github/issue.get.ts +0 -1
  494. package/corpus/templates/analytics/server/routes/api/github/org-prs.get.ts +0 -1
  495. package/corpus/templates/analytics/server/routes/api/github/pr.get.ts +0 -1
  496. package/corpus/templates/analytics/server/routes/api/github/prs.get.ts +0 -1
  497. package/corpus/templates/analytics/server/routes/api/github/search.get.ts +0 -1
  498. package/corpus/templates/clips/actions/get-feature-flags.ts +0 -30
  499. package/corpus/templates/slides/actions/fetch-logos.ts +0 -90
  500. package/corpus/templates/slides/actions/image-search.ts +0 -64
  501. package/corpus/templates/slides/actions/import-github.ts +0 -182
  502. package/corpus/templates/slides/actions/logo-lookup.ts +0 -113
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/extensions/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { and, eq, gte, isNull } from \"drizzle-orm\";\n\nimport { appStatePut } from \"../application-state/store.js\";\nimport { getDbExec, isPostgres, retryOnDdlRace } from \"../db/client.js\";\nimport { createGetDb } from \"../db/create-get-db.js\";\nimport {\n ensureTableExists,\n ensureColumnExists,\n ensureIndexExists,\n} from \"../db/ddl-guard.js\";\nimport { recordChange } from \"../server/poll.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n} from \"../server/request-context.js\";\nimport {\n accessFilter,\n assertAccess,\n resolveAccess,\n ForbiddenError,\n} from \"../sharing/access.js\";\nimport { registerShareableResource } from \"../sharing/registry.js\";\nimport {\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerSession,\n extensionChangeMarkerValue,\n type ExtensionChangeTarget,\n} from \"./change-marker.js\";\nimport {\n applyExtensionContentUpdate,\n ExtensionContentEditError,\n type ExtensionContentEdit,\n type ExtensionLegacyPatch,\n} from \"./content-patch.js\";\nimport {\n extensions,\n extensionHides,\n extensionShares,\n extensionHistory,\n EXTENSIONS_CREATE_SQL,\n EXTENSIONS_CREATE_SQL_PG,\n EXTENSION_SHARES_CREATE_SQL,\n EXTENSION_SHARES_CREATE_SQL_PG,\n EXTENSION_DATA_CREATE_SQL,\n EXTENSION_DATA_CREATE_SQL_PG,\n EXTENSION_DATA_ITEM_INDEX_SQL,\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG,\n EXTENSIONS_OWNER_INDEX_SQL,\n EXTENSIONS_ORG_INDEX_SQL,\n EXTENSIONS_UPDATED_INDEX_SQL,\n EXTENSIONS_HIDDEN_AT_COLUMN_SQL,\n EXTENSIONS_HIDDEN_BY_COLUMN_SQL,\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n EXTENSION_HIDES_CREATE_SQL,\n EXTENSION_HIDES_CREATE_SQL_PG,\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n EXTENSION_HISTORY_CREATE_SQL,\n EXTENSION_HISTORY_CREATE_SQL_PG,\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n EXTENSION_CONSENTS_CREATE_SQL,\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n} from \"./schema.js\";\n\nconst getDb = createGetDb({\n extensions,\n extensionShares,\n extensionHides,\n extensionHistory,\n});\n\nlet _initPromise: Promise<void> | undefined;\n\nexport async function ensureExtensionsTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const pg = isPostgres();\n if (pg) {\n // PG guard: probe via information_schema, only issue DDL if missing, bounded lock_timeout\n await ensureTableExists(\"tools\", EXTENSIONS_CREATE_SQL_PG);\n await migrateMisnamedExtensionsTable(client, pg); // data migration, not DDL — unchanged\n await ensureTableExists(\"tool_shares\", EXTENSION_SHARES_CREATE_SQL_PG);\n await ensureTableExists(\"tool_data\", EXTENSION_DATA_CREATE_SQL_PG);\n await ensureExtensionDataItemId(client, pg); // ADD COLUMN — guarded inside\n await ensureExtensionDataScope(client, pg); // ADD COLUMN — guarded inside\n // DROP INDEX (for old index) — safe DDL, runs via client.execute; keep on both paths\n await client.execute(EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG);\n await ensureIndexExists(\n \"tool_data_scoped_item_idx\",\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n );\n await ensureIndexExists(\"tools_owner_idx\", EXTENSIONS_OWNER_INDEX_SQL);\n await ensureIndexExists(\"tools_org_idx\", EXTENSIONS_ORG_INDEX_SQL);\n await ensureIndexExists(\n \"tools_updated_at_idx\",\n EXTENSIONS_UPDATED_INDEX_SQL,\n );\n await ensureExtensionsGlobalHideColumns(client, pg); // ADD COLUMN — guarded inside\n await ensureIndexExists(\n \"tools_hidden_at_idx\",\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_shares_resource_idx\",\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_hidden_extensions\",\n EXTENSION_HIDES_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_hidden_extensions_user_tool_idx\",\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_hidden_extensions_owner_idx\",\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_history\",\n EXTENSION_HISTORY_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_history_tool_version_idx\",\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_history_tool_created_idx\",\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_consents\",\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_consents_viewer_idx\",\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n );\n return;\n }\n // SQLite (local dev): keep existing behavior\n await retryOnDdlRace(() =>\n client.execute(pg ? EXTENSIONS_CREATE_SQL_PG : EXTENSIONS_CREATE_SQL),\n );\n await migrateMisnamedExtensionsTable(client, pg);\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_SHARES_CREATE_SQL_PG : EXTENSION_SHARES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_CREATE_SQL_PG : EXTENSION_DATA_CREATE_SQL,\n ),\n );\n await ensureExtensionDataItemId(client, pg);\n await ensureExtensionDataScope(client, pg);\n await client.execute(\n pg\n ? EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG\n : EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_ITEM_INDEX_SQL_PG : EXTENSION_DATA_ITEM_INDEX_SQL,\n ),\n );\n await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));\n await ensureExtensionsGlobalHideColumns(client, pg);\n await retryOnDdlRace(() =>\n client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_SHARES_RESOURCE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HIDES_CREATE_SQL_PG : EXTENSION_HIDES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_UNIQUE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_OWNER_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HISTORY_CREATE_SQL_PG : EXTENSION_HISTORY_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_VERSION_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_CREATED_INDEX_SQL),\n );\n // tool_consents was introduced for an audit-C1 per-viewer consent\n // gate that we removed once we settled on intra-org trust as the\n // baseline. The table is kept (additive — never drop) so deploys\n // that already created it stay healthy; the runtime consent code\n // is gone. Idempotent CREATE IF NOT EXISTS for fresh schemas.\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_CONSENTS_CREATE_SQL_PG : EXTENSION_CONSENTS_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_CONSENTS_VIEWER_INDEX_SQL),\n );\n })();\n }\n\n try {\n await _initPromise;\n } catch (err) {\n _initPromise = undefined;\n throw err;\n }\n}\n\nasync function migrateMisnamedExtensionsTable(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const sql = pg\n ? `INSERT INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions\n ON CONFLICT (id) DO NOTHING`\n : `INSERT OR IGNORE INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions`;\n\n try {\n await client.execute(sql);\n } catch (err: any) {\n const message = String(err?.message ?? err).toLowerCase();\n if (\n message.includes(\"no such table: extensions\") ||\n message.includes('relation \"extensions\" does not exist') ||\n message.includes(\"relation extensions does not exist\")\n ) {\n return;\n }\n throw err;\n }\n}\n\nasync function ensureExtensionDataItemId(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n if (pg) {\n await ensureColumnExists(\n \"tool_data\",\n \"item_id\",\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS item_id TEXT`,\n );\n return;\n }\n\n // Keep this additive: legacy rows with item_id=id are still read correctly\n // through COALESCE(item_id, id), so SQLite never needs a table rebuild here.\n try {\n await client.execute(`ALTER TABLE tool_data ADD COLUMN item_id TEXT`);\n } catch (err: any) {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n ) {\n throw err;\n }\n }\n}\n\nasync function ensureExtensionDataScope(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const addCol = (name: string, def: string) => {\n if (pg) {\n return ensureColumnExists(\n \"tool_data\",\n name,\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS ${name} ${def}`,\n );\n }\n return client\n .execute(`ALTER TABLE tool_data ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(\"scope\", \"TEXT NOT NULL DEFAULT 'user'\");\n await addCol(\"org_id\", \"TEXT\");\n await addCol(\"scope_key\", \"TEXT NOT NULL DEFAULT 'local@localhost'\");\n // One-time backfill migration: replaces the dev-mode DEFAULT scope_key\n // with each row's real owner_email. Not a per-request fallback.\n await client.execute(\n // guard:allow-localhost-fallback — one-time backfill migration replacing dev-mode default scope_key with the row's real owner_email\n `UPDATE tool_data SET scope_key = owner_email WHERE scope_key = 'local@localhost' AND owner_email != 'local@localhost'`,\n );\n}\n\nasync function ensureExtensionsGlobalHideColumns(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n // Global (admin) hide columns on the `tools` row, distinct from the\n // per-user `tool_hidden_extensions` table. Additive — keep this idempotent\n // for both dialects. Postgres supports `ADD COLUMN IF NOT EXISTS`; SQLite\n // does not, so we drop the clause and swallow the duplicate-column error.\n const addCol = (pgSql: string, name: string, def: string) => {\n if (pg) {\n return ensureColumnExists(\"tools\", name, pgSql);\n }\n return client\n .execute(`ALTER TABLE tools ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(EXTENSIONS_HIDDEN_AT_COLUMN_SQL, \"hidden_at\", \"TEXT\");\n await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, \"hidden_by\", \"TEXT\");\n}\n\nexport function registerExtensionsShareable() {\n registerShareableResource({\n type: \"extension\",\n resourceTable: extensions,\n sharesTable: extensionShares,\n displayName: \"Extension\",\n titleColumn: \"name\",\n getDb: () => getDb(),\n // Extension HTML executes inside an iframe and calls actions / SQL / the\n // secrets-injecting proxy as the *viewer*. A public extension would let a\n // random authenticated user run code with the viewer's credentials — and\n // a malicious shared extension could re-share itself wider. Lock both:\n // no public visibility, and individual user shares must already be (or\n // be invited to) the org.\n allowPublic: false,\n requireOrgMemberForUserShares: true,\n });\n}\n\nexport interface ExtensionRow {\n id: string;\n name: string;\n description: string;\n content: string;\n icon: string | null;\n createdAt: string;\n updatedAt: string;\n hiddenAt: string | null;\n hiddenBy: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n}\n\nexport type ExtensionHistoryOperation =\n | \"create\"\n | \"baseline\"\n | \"metadata-update\"\n | \"content-update\"\n | \"restore\";\n\nexport interface ExtensionHistoryEntry {\n id: string;\n extensionId: string;\n version: number;\n operation: ExtensionHistoryOperation | string;\n summary: string;\n name: string;\n description: string;\n content?: string;\n icon: string | null;\n actorEmail: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n createdAt: string;\n persisted: boolean;\n contentLength: number;\n}\n\nexport interface ExtensionHistoryDiffLine {\n type: \"equal\" | \"insert\" | \"delete\";\n text: string;\n}\n\nexport interface ExtensionHistoryDetail {\n entry: ExtensionHistoryEntry;\n previous: ExtensionHistoryEntry | null;\n diff: ExtensionHistoryDiffLine[];\n stats: {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n };\n}\n\ninterface RawExtensionHistoryRow {\n id: string;\n tool_id?: string;\n extensionId?: string;\n version: number | string;\n operation: string;\n summary?: string | null;\n name: string;\n description?: string | null;\n content?: string | null;\n icon?: string | null;\n actor_email?: string | null;\n actorEmail?: string | null;\n owner_email?: string | null;\n ownerEmail?: string | null;\n org_id?: string | null;\n orgId?: string | null;\n visibility?: string | null;\n created_at?: string;\n createdAt?: string;\n}\n\nfunction targetKey(target: ExtensionChangeTarget): string | null {\n if (target.owner) return `owner:${target.owner}`;\n if (target.orgId) return `org:${target.orgId}`;\n return null;\n}\n\nfunction addExtensionChangeTarget(\n targets: Map<string, ExtensionChangeTarget>,\n target: ExtensionChangeTarget,\n): void {\n const key = targetKey(target);\n if (key) targets.set(key, target);\n}\n\nasync function extensionChangeTargetsForRow(\n row: ExtensionRow,\n): Promise<ExtensionChangeTarget[]> {\n const targets = new Map<string, ExtensionChangeTarget>();\n addExtensionChangeTarget(targets, { owner: row.ownerEmail });\n if (row.visibility === \"org\" && row.orgId) {\n addExtensionChangeTarget(targets, { orgId: row.orgId });\n }\n\n const db = getDb();\n const shares = (await db\n .select({\n principalType: extensionShares.principalType,\n principalId: extensionShares.principalId,\n })\n .from(extensionShares)\n .where(eq(extensionShares.resourceId, row.id))) as Array<{\n principalType: \"user\" | \"org\";\n principalId: string;\n }>;\n\n for (const share of shares) {\n if (share.principalType === \"user\") {\n addExtensionChangeTarget(targets, { owner: share.principalId });\n } else if (share.principalType === \"org\") {\n addExtensionChangeTarget(targets, { orgId: share.principalId });\n }\n }\n\n return Array.from(targets.values());\n}\n\nasync function extensionChangeTargetsForId(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n return row ? extensionChangeTargetsForRow(row) : [];\n}\n\nexport async function getExtensionChangeTargets(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n await ensureExtensionsTables();\n return extensionChangeTargetsForId(id);\n}\n\nfunction dedupeExtensionChangeTargets(\n targets: ExtensionChangeTarget[],\n): ExtensionChangeTarget[] {\n const unique = new Map<string, ExtensionChangeTarget>();\n for (const target of targets) {\n const key = targetKey(target);\n if (key) unique.set(key, target);\n }\n return Array.from(unique.values());\n}\n\nasync function notifyExtensionChanged(\n targets: ExtensionChangeTarget[],\n): Promise<void> {\n const uniqueTargets = dedupeExtensionChangeTargets(targets);\n if (uniqueTargets.length === 0) return;\n\n for (const target of uniqueTargets) {\n recordChange({\n source: \"extensions\",\n type: \"change\",\n key: \"*\",\n ...(target.owner ? { owner: target.owner } : {}),\n ...(target.orgId ? { orgId: target.orgId } : {}),\n });\n }\n\n await Promise.all(\n uniqueTargets.map(async (target) => {\n const sessionId = extensionChangeMarkerSession(target);\n if (!sessionId) return;\n await appStatePut(\n sessionId,\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerValue(target),\n );\n }),\n );\n}\n\nexport async function notifyExtensionChangeForResource(\n id: string,\n beforeTargets: ExtensionChangeTarget[] = [],\n): Promise<void> {\n await ensureExtensionsTables();\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n}\n\nfunction extensionHistoryEntryFromRaw(\n row: RawExtensionHistoryRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n const content = row.content ?? \"\";\n const visibility = normalizeVisibility(row.visibility);\n return {\n id: row.id,\n extensionId: String(row.tool_id ?? row.extensionId ?? \"\"),\n version: Number(row.version) || 1,\n operation: row.operation,\n summary: row.summary ?? \"\",\n name: row.name,\n description: row.description ?? \"\",\n ...(includeContent ? { content } : {}),\n icon: row.icon ?? null,\n actorEmail: row.actor_email ?? row.actorEmail ?? null,\n ownerEmail: row.owner_email ?? row.ownerEmail ?? \"\",\n orgId: row.org_id ?? row.orgId ?? null,\n visibility,\n createdAt: row.created_at ?? row.createdAt ?? new Date(0).toISOString(),\n persisted: true,\n contentLength: content.length,\n };\n}\n\nfunction extensionHistoryEntryFromExtension(\n row: ExtensionRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n return {\n id: `current:${row.id}`,\n extensionId: row.id,\n version: 1,\n operation: \"baseline\",\n summary: \"Current version\",\n name: row.name,\n description: row.description,\n ...(includeContent ? { content: row.content } : {}),\n icon: row.icon,\n actorEmail: null,\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: row.updatedAt,\n persisted: false,\n contentLength: row.content.length,\n };\n}\n\nfunction normalizeVisibility(value: unknown): \"private\" | \"org\" | \"public\" {\n return value === \"org\" || value === \"public\" ? value : \"private\";\n}\n\nfunction currentActorEmail(): string | null {\n return getRequestUserEmail() ?? null;\n}\n\nfunction clampHistoryLimit(value: unknown): number {\n const limit = Number(value ?? 50);\n if (!Number.isFinite(limit)) return 50;\n return Math.min(Math.max(1, Math.floor(limit)), 100);\n}\n\nasync function historyVersionCount(extensionId: string): Promise<number> {\n const result = await getDbExec().execute({\n sql: `SELECT MAX(version) AS version FROM tool_history WHERE tool_id = ?`,\n args: [extensionId],\n });\n const value = (result.rows?.[0] as any)?.version;\n const version = Number(value ?? 0);\n return Number.isFinite(version) ? version : 0;\n}\n\nasync function hasExtensionHistory(extensionId: string): Promise<boolean> {\n const result = await getDbExec().execute({\n sql: `SELECT id FROM tool_history WHERE tool_id = ? LIMIT 1`,\n args: [extensionId],\n });\n return (result.rows?.length ?? 0) > 0;\n}\n\nasync function recordExtensionHistorySnapshot(\n row: ExtensionRow,\n operation: ExtensionHistoryOperation,\n summary: string,\n): Promise<ExtensionHistoryEntry> {\n const version = (await historyVersionCount(row.id)) + 1;\n const now = new Date().toISOString();\n const historyId = randomUUID();\n await getDbExec().execute({\n sql: `INSERT INTO tool_history (\n id, tool_id, version, operation, summary, name, description, content,\n icon, actor_email, owner_email, org_id, visibility, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n historyId,\n row.id,\n version,\n operation,\n summary,\n row.name,\n row.description,\n row.content,\n row.icon,\n currentActorEmail(),\n row.ownerEmail,\n row.orgId,\n row.visibility,\n now,\n ],\n });\n\n return {\n id: historyId,\n extensionId: row.id,\n version,\n operation,\n summary,\n name: row.name,\n description: row.description,\n content: row.content,\n icon: row.icon,\n actorEmail: currentActorEmail(),\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: now,\n persisted: true,\n contentLength: row.content.length,\n };\n}\n\nasync function ensureExtensionHistoryBaseline(\n row: ExtensionRow,\n): Promise<void> {\n if (await hasExtensionHistory(row.id)) return;\n await recordExtensionHistorySnapshot(\n row,\n \"baseline\",\n \"Saved starting version\",\n );\n}\n\nfunction summarizeMetadataChange(\n before: ExtensionRow,\n after: ExtensionRow,\n): string {\n const changes: string[] = [];\n if (before.name !== after.name) {\n changes.push(`Renamed from \"${before.name}\" to \"${after.name}\"`);\n }\n if (before.description !== after.description) {\n changes.push(\"Updated description\");\n }\n if (before.icon !== after.icon) {\n changes.push(\"Updated icon\");\n }\n if (before.visibility !== after.visibility) {\n changes.push(`Changed visibility to ${after.visibility}`);\n }\n return changes.join(\"; \") || \"Updated details\";\n}\n\nfunction summarizeContentChange(\n beforeContent: string,\n afterContent: string,\n): string {\n const stats = diffStats(createLineDiff(beforeContent, afterContent));\n if (!stats.changed) return \"Saved content\";\n return `Updated content (+${stats.addedLines} -${stats.deletedLines} lines)`;\n}\n\nfunction parseHistoryVersion(version: unknown): number | null {\n const parsed = Number(version);\n if (!Number.isInteger(parsed) || parsed < 1) return null;\n return parsed;\n}\n\nasync function getPersistedHistoryEntry(\n extensionId: string,\n version: number,\n includeContent: boolean,\n): Promise<ExtensionHistoryEntry | null> {\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ? AND version = ?\n LIMIT 1`,\n args: [extensionId, version],\n });\n const row = result.rows?.[0] as RawExtensionHistoryRow | undefined;\n return row ? extensionHistoryEntryFromRaw(row, includeContent) : null;\n}\n\nfunction splitLines(text: string): string[] {\n if (!text) return [];\n const parts = text.split(\"\\n\");\n return parts\n .map((line, index) => (index < parts.length - 1 ? `${line}\\n` : line))\n .filter((line) => line.length > 0);\n}\n\nfunction createLineDiff(\n beforeText: string,\n afterText: string,\n): ExtensionHistoryDiffLine[] {\n const before = splitLines(beforeText);\n const after = splitLines(afterText);\n if (before.length === 0 && after.length === 0) return [];\n\n const cells = before.length * after.length;\n if (cells > 40_000) return createBoundaryDiff(before, after);\n\n const dp = Array.from({ length: before.length + 1 }, () =>\n Array(after.length + 1).fill(0),\n );\n for (let i = before.length - 1; i >= 0; i -= 1) {\n for (let j = after.length - 1; j >= 0; j -= 1) {\n dp[i][j] =\n before[i] === after[j]\n ? dp[i + 1][j + 1] + 1\n : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n\n const diff: ExtensionHistoryDiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < before.length && j < after.length) {\n if (before[i] === after[j]) {\n diff.push({ type: \"equal\", text: before[i] });\n i += 1;\n j += 1;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n } else {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n }\n while (i < before.length) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n }\n while (j < after.length) {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n return diff;\n}\n\nfunction createBoundaryDiff(\n before: string[],\n after: string[],\n): ExtensionHistoryDiffLine[] {\n let prefix = 0;\n while (\n prefix < before.length &&\n prefix < after.length &&\n before[prefix] === after[prefix]\n ) {\n prefix += 1;\n }\n\n let suffix = 0;\n while (\n suffix + prefix < before.length &&\n suffix + prefix < after.length &&\n before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n\n return [\n ...before\n .slice(0, prefix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ...before\n .slice(prefix, before.length - suffix)\n .map((text) => ({ type: \"delete\" as const, text })),\n ...after\n .slice(prefix, after.length - suffix)\n .map((text) => ({ type: \"insert\" as const, text })),\n ...before\n .slice(before.length - suffix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ];\n}\n\nfunction diffStats(diff: ExtensionHistoryDiffLine[]): {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n} {\n const addedLines = diff.filter((line) => line.type === \"insert\").length;\n const deletedLines = diff.filter((line) => line.type === \"delete\").length;\n return {\n addedLines,\n deletedLines,\n changed: addedLines > 0 || deletedLines > 0,\n };\n}\n\nexport interface ListExtensionsOptions {\n includeHidden?: boolean;\n /**\n * Include extensions an admin/owner has globally hidden via `hidden_at`.\n * Off by default so globally-hidden extensions disappear for everyone.\n */\n includeGloballyHidden?: boolean;\n}\n\nexport async function listExtensions(\n options: ListExtensionsOptions = {},\n): Promise<ExtensionRow[]> {\n await ensureExtensionsTables();\n const db = getDb();\n // Build the WHERE with a single `and()` — drizzle replaces (not ANDs)\n // on repeated `.where()` calls, so combine the access filter and the\n // global-hidden filter into one condition.\n const base = accessFilter(extensions, extensionShares);\n const where = options.includeGloballyHidden\n ? base\n : and(base, isNull(extensions.hiddenAt));\n const rows = (await db\n .select()\n .from(extensions)\n .where(where)) as ExtensionRow[];\n\n if (options.includeHidden) return rows;\n\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n if (hiddenIds.size === 0) return rows;\n return rows.filter((row) => !hiddenIds.has(row.id));\n}\n\nexport async function getExtension(id: string): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", id);\n return (access?.resource as ExtensionRow | undefined) ?? null;\n}\n\nexport interface ListExtensionHistoryOptions {\n limit?: number;\n includeContent?: boolean;\n}\n\nexport async function listExtensionHistory(\n id: string,\n options: ListExtensionHistoryOptions = {},\n): Promise<ExtensionHistoryEntry[]> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return [];\n\n const includeContent = options.includeContent === true;\n const limit = clampHistoryLimit(options.limit);\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ?\n ORDER BY version DESC\n LIMIT ?`,\n args: [id, limit],\n });\n\n const entries = (result.rows ?? []).map((row) =>\n extensionHistoryEntryFromRaw(row as RawExtensionHistoryRow, includeContent),\n );\n\n if (entries.length > 0) return entries;\n return [extensionHistoryEntryFromExtension(extension, includeContent)];\n}\n\nexport async function getExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionHistoryDetail | null> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return null;\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const persisted = await getPersistedHistoryEntry(id, version, true);\n const entry =\n persisted ??\n (!(await hasExtensionHistory(id)) && version === 1\n ? extensionHistoryEntryFromExtension(extension, true)\n : null);\n if (!entry) return null;\n\n const previous =\n version > 1 ? await getPersistedHistoryEntry(id, version - 1, true) : null;\n const previousContent = previous?.content ?? \"\";\n const currentContent = entry.content ?? \"\";\n const diff = createLineDiff(previousContent, currentContent);\n\n return {\n entry,\n previous,\n diff,\n stats: diffStats(diff),\n };\n}\n\nexport async function restoreExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const existingRows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n\n await ensureExtensionHistoryBaseline(existing);\n const target = await getPersistedHistoryEntry(id, version, true);\n if (!target) return null;\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await getDb()\n .update(extensions)\n .set({\n name: target.name,\n description: target.description,\n content: target.content ?? \"\",\n icon: target.icon,\n updatedAt: new Date().toISOString(),\n })\n .where(eq(extensions.id, id));\n\n const rows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"restore\",\n `Restored version ${version}`,\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface CreateExtensionData {\n name: string;\n description?: string;\n content?: string;\n icon?: string;\n}\n\nexport async function createExtension(\n data: CreateExtensionData,\n): Promise<ExtensionRow> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n const orgId = getRequestOrgId();\n const id = randomUUID();\n const now = new Date().toISOString();\n const row: ExtensionRow = {\n id,\n name: data.name,\n description: data.description ?? \"\",\n content: data.content ?? \"\",\n icon: data.icon ?? null,\n createdAt: now,\n updatedAt: now,\n hiddenAt: null,\n hiddenBy: null,\n ownerEmail: userEmail,\n orgId: orgId ?? null,\n visibility: \"private\",\n };\n await db.insert(extensions).values(row);\n await recordExtensionHistorySnapshot(row, \"create\", \"Created extension\");\n await notifyExtensionChanged([{ owner: row.ownerEmail }]);\n return row;\n}\n\n/**\n * Returns an extension with the exact same name and content created by the\n * current user — in the current org/workspace scope — in the last 5 minutes,\n * or null if none exists. Used to make create-extension idempotent when a\n * connection drop causes the agent to retry the same tool call.\n *\n * Scoped by `orgId` the same way `createExtension` stamps it, so the same\n * `ownerEmail` working in two different orgs can create identically-named,\n * identical-content extensions without this lookup cross-matching and skipping\n * the second insert. Keyed on the FULL create inputs (name + content +\n * description + icon, normalized exactly as `createExtension` stores them), so\n * two creates that differ in any of them are treated as distinct — only a\n * byte-identical re-create (the connection-retry case) recovers the prior row,\n * and no intentional second create silently loses its metadata.\n */\nexport async function findRecentDuplicateExtension(data: {\n name: string;\n content: string;\n description?: string;\n icon?: string;\n}): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return null;\n const orgId = getRequestOrgId() ?? null;\n const description = data.description ?? \"\";\n const icon = data.icon ?? null;\n const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();\n const rows = await db\n .select()\n .from(extensions)\n .where(\n and(\n eq(extensions.ownerEmail, userEmail),\n orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId),\n eq(extensions.name, data.name),\n eq(extensions.content, data.content),\n eq(extensions.description, description),\n icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon),\n gte(extensions.createdAt, fiveMinutesAgo),\n isNull(extensions.hiddenAt),\n ),\n )\n .limit(1);\n return rows[0] ?? null;\n}\n\nexport interface UpdateExtensionData {\n name?: string;\n description?: string;\n icon?: string;\n /**\n * Extensions cannot be public — `set-resource-visibility` and this store\n * helper both reject `\"public\"`. The type lists it so the framework's\n * generic share UI compiles, not because it's allowed at runtime.\n */\n visibility?: \"private\" | \"org\" | \"public\";\n}\n\nexport async function updateExtension(\n id: string,\n data: UpdateExtensionData,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n if (data.visibility === \"public\") {\n // Defense in depth — `registerExtensionsShareable` sets\n // `allowPublic: false`, so `set-resource-visibility` already rejects\n // this. Block direct callers too (HTTP `PUT /extensions/:id`, internal\n // refactors) so the rule holds regardless of entry point.\n throw new ForbiddenError(\n \"Extensions cannot be made public — share with specific people or your organization instead.\",\n );\n }\n const db = getDb();\n const beforeTargets = await extensionChangeTargetsForId(id);\n const updates: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n if (data.name !== undefined) updates.name = data.name;\n if (data.description !== undefined) updates.description = data.description;\n if (data.icon !== undefined) updates.icon = data.icon;\n if (data.visibility !== undefined) updates.visibility = data.visibility;\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n await ensureExtensionHistoryBaseline(existing);\n await db.update(extensions).set(updates).where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"metadata-update\",\n summarizeMetadataChange(existing, row),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface UpdateExtensionContentOpts {\n content?: string;\n allowFullReplacement?: boolean;\n patches?: ExtensionLegacyPatch[];\n edits?: ExtensionContentEdit[];\n format?: boolean;\n}\n\nexport async function updateExtensionContent(\n id: string,\n opts: UpdateExtensionContentOpts,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n const db = getDb();\n\n if (\n opts.content === undefined &&\n opts.patches === undefined &&\n opts.edits === undefined &&\n !opts.format\n ) {\n return null;\n }\n\n if (opts.content !== undefined && opts.allowFullReplacement !== true) {\n throw new ExtensionContentEditError(\n \"Full extension-body replacement requires explicit allowFullReplacement=true. Use patches or edits for a targeted data-only repair so the existing design is preserved.\",\n );\n }\n\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n if (!existingRows[0]) return null;\n const existing = existingRows[0] as ExtensionRow;\n const existingContent = existing.content;\n await ensureExtensionHistoryBaseline(existing);\n const update = await applyExtensionContentUpdate(existingContent, opts);\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await db\n .update(extensions)\n .set({ content: update.content, updatedAt: new Date().toISOString() })\n .where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"content-update\",\n summarizeContentChange(existingContent, row.content),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport async function deleteExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n if (!row) return false;\n const targets = await extensionChangeTargetsForRow(row);\n await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));\n await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));\n await getDbExec().execute({\n sql: `DELETE FROM tool_data WHERE tool_id = ?`,\n args: [id],\n });\n await getDbExec().execute({\n sql: `DELETE FROM tool_history WHERE tool_id = ?`,\n args: [id],\n });\n const { cascadeDeleteExtensionSlots } = await import(\"./slots/store.js\");\n await cascadeDeleteExtensionSlots(id);\n await db.delete(extensions).where(eq(extensions.id, id));\n await notifyExtensionChanged(targets);\n return true;\n}\n\nexport async function getHiddenExtensionIdsForCurrentUser(): Promise<\n Set<string>\n> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return new Set();\n\n const db = getDb();\n const rows = await db\n .select({ extensionId: extensionHides.extensionId })\n .from(extensionHides)\n .where(eq(extensionHides.ownerEmail, userEmail));\n return new Set(rows.map((row) => row.extensionId));\n}\n\nexport async function hideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"viewer\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `INSERT INTO tool_hidden_extensions (id, tool_id, owner_email, created_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT (owner_email, tool_id) DO NOTHING`,\n args: [randomUUID(), id, userEmail, now],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\nexport async function unhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n await getDbExec().execute({\n sql: `DELETE FROM tool_hidden_extensions WHERE tool_id = ? AND owner_email = ?`,\n args: [id, userEmail],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\n/**\n * Globally hide an extension from EVERYONE's list by stamping `hidden_at` /\n * `hidden_by` on the `tools` row. Distinct from the per-user `hideExtension`\n * (`tool_hidden_extensions`) — this affects all viewers. Requires admin/owner\n * access. The extension is not deleted and stays accessible by id; pass\n * `includeGloballyHidden: true` to `listExtensions` to surface it again.\n */\nexport async function globalHideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = ?, hidden_by = ?, updated_at = ? WHERE id = ?`,\n args: [now, userEmail, now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n\n/**\n * Clear a global hide so the extension reappears in everyone's list. Requires\n * admin/owner access. Mirrors `globalHideExtension`.\n */\nexport async function globalUnhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = NULL, hidden_by = NULL, updated_at = ? WHERE id = ?`,\n args: [now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/extensions/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport { and, eq, gte, isNull } from \"drizzle-orm\";\n\nimport { appStatePut } from \"../application-state/store.js\";\nimport { getDbExec, isPostgres, retryOnDdlRace } from \"../db/client.js\";\nimport { createGetDb } from \"../db/create-get-db.js\";\nimport {\n ensureTableExists,\n ensureColumnExists,\n ensureIndexExists,\n} from \"../db/ddl-guard.js\";\nimport { recordChange } from \"../server/poll.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n} from \"../server/request-context.js\";\nimport {\n accessFilter,\n assertAccess,\n resolveAccess,\n ForbiddenError,\n} from \"../sharing/access.js\";\nimport { registerShareableResource } from \"../sharing/registry.js\";\nimport {\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerSession,\n extensionChangeMarkerValue,\n type ExtensionChangeTarget,\n} from \"./change-marker.js\";\nimport {\n applyExtensionContentUpdate,\n ExtensionContentEditError,\n type ExtensionContentEdit,\n type ExtensionLegacyPatch,\n} from \"./content-patch.js\";\nimport {\n extensions,\n extensionHides,\n extensionShares,\n extensionHistory,\n EXTENSIONS_CREATE_SQL,\n EXTENSIONS_CREATE_SQL_PG,\n EXTENSION_SHARES_CREATE_SQL,\n EXTENSION_SHARES_CREATE_SQL_PG,\n EXTENSION_DATA_CREATE_SQL,\n EXTENSION_DATA_CREATE_SQL_PG,\n EXTENSION_DATA_ITEM_INDEX_SQL,\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG,\n EXTENSIONS_OWNER_INDEX_SQL,\n EXTENSIONS_ORG_INDEX_SQL,\n EXTENSIONS_UPDATED_INDEX_SQL,\n EXTENSIONS_HIDDEN_AT_COLUMN_SQL,\n EXTENSIONS_HIDDEN_BY_COLUMN_SQL,\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n EXTENSION_HIDES_CREATE_SQL,\n EXTENSION_HIDES_CREATE_SQL_PG,\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n EXTENSION_HISTORY_CREATE_SQL,\n EXTENSION_HISTORY_CREATE_SQL_PG,\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n EXTENSION_CONSENTS_CREATE_SQL,\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n} from \"./schema.js\";\n\nconst getDb = createGetDb({\n extensions,\n extensionShares,\n extensionHides,\n extensionHistory,\n});\n\nlet _initPromise: Promise<void> | undefined;\n\nexport async function ensureExtensionsTables(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const pg = isPostgres();\n if (pg) {\n // PG guard: probe via information_schema, only issue DDL if missing, bounded lock_timeout\n await ensureTableExists(\"tools\", EXTENSIONS_CREATE_SQL_PG);\n await migrateMisnamedExtensionsTable(client, pg); // data migration, not DDL — unchanged\n await ensureTableExists(\"tool_shares\", EXTENSION_SHARES_CREATE_SQL_PG);\n await ensureTableExists(\"tool_data\", EXTENSION_DATA_CREATE_SQL_PG);\n await ensureExtensionDataItemId(client, pg); // ADD COLUMN — guarded inside\n await ensureExtensionDataScope(client, pg); // ADD COLUMN — guarded inside\n // DROP INDEX (for old index) — safe DDL, runs via client.execute; keep on both paths\n await client.execute(EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG);\n await ensureIndexExists(\n \"tool_data_scoped_item_idx\",\n EXTENSION_DATA_ITEM_INDEX_SQL_PG,\n );\n await ensureIndexExists(\"tools_owner_idx\", EXTENSIONS_OWNER_INDEX_SQL);\n await ensureIndexExists(\"tools_org_idx\", EXTENSIONS_ORG_INDEX_SQL);\n await ensureIndexExists(\n \"tools_updated_at_idx\",\n EXTENSIONS_UPDATED_INDEX_SQL,\n );\n await ensureExtensionsGlobalHideColumns(client, pg); // ADD COLUMN — guarded inside\n await ensureIndexExists(\n \"tools_hidden_at_idx\",\n EXTENSIONS_HIDDEN_AT_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_shares_resource_idx\",\n EXTENSION_SHARES_RESOURCE_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_hidden_extensions\",\n EXTENSION_HIDES_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_hidden_extensions_user_tool_idx\",\n EXTENSION_HIDES_UNIQUE_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_hidden_extensions_owner_idx\",\n EXTENSION_HIDES_OWNER_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_history\",\n EXTENSION_HISTORY_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_history_tool_version_idx\",\n EXTENSION_HISTORY_VERSION_INDEX_SQL,\n );\n await ensureIndexExists(\n \"tool_history_tool_created_idx\",\n EXTENSION_HISTORY_CREATED_INDEX_SQL,\n );\n await ensureTableExists(\n \"tool_consents\",\n EXTENSION_CONSENTS_CREATE_SQL_PG,\n );\n await ensureIndexExists(\n \"tool_consents_viewer_idx\",\n EXTENSION_CONSENTS_VIEWER_INDEX_SQL,\n );\n return;\n }\n // SQLite (local dev): keep existing behavior\n await retryOnDdlRace(() =>\n client.execute(pg ? EXTENSIONS_CREATE_SQL_PG : EXTENSIONS_CREATE_SQL),\n );\n await migrateMisnamedExtensionsTable(client, pg);\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_SHARES_CREATE_SQL_PG : EXTENSION_SHARES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_CREATE_SQL_PG : EXTENSION_DATA_CREATE_SQL,\n ),\n );\n await ensureExtensionDataItemId(client, pg);\n await ensureExtensionDataScope(client, pg);\n await client.execute(\n pg\n ? EXTENSION_DATA_DROP_OLD_INDEX_SQL_PG\n : EXTENSION_DATA_DROP_OLD_INDEX_SQL,\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_DATA_ITEM_INDEX_SQL_PG : EXTENSION_DATA_ITEM_INDEX_SQL,\n ),\n );\n await retryOnDdlRace(() => client.execute(EXTENSIONS_OWNER_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_ORG_INDEX_SQL));\n await retryOnDdlRace(() => client.execute(EXTENSIONS_UPDATED_INDEX_SQL));\n await ensureExtensionsGlobalHideColumns(client, pg);\n await retryOnDdlRace(() =>\n client.execute(EXTENSIONS_HIDDEN_AT_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_SHARES_RESOURCE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HIDES_CREATE_SQL_PG : EXTENSION_HIDES_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_UNIQUE_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HIDES_OWNER_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_HISTORY_CREATE_SQL_PG : EXTENSION_HISTORY_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_VERSION_INDEX_SQL),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_HISTORY_CREATED_INDEX_SQL),\n );\n // tool_consents was introduced for an audit-C1 per-viewer consent\n // gate that we removed once we settled on intra-org trust as the\n // baseline. The table is kept (additive — never drop) so deploys\n // that already created it stay healthy; the runtime consent code\n // is gone. Idempotent CREATE IF NOT EXISTS for fresh schemas.\n await retryOnDdlRace(() =>\n client.execute(\n pg ? EXTENSION_CONSENTS_CREATE_SQL_PG : EXTENSION_CONSENTS_CREATE_SQL,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(EXTENSION_CONSENTS_VIEWER_INDEX_SQL),\n );\n })();\n }\n\n try {\n await _initPromise;\n } catch (err) {\n _initPromise = undefined;\n throw err;\n }\n}\n\nasync function migrateMisnamedExtensionsTable(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const sql = pg\n ? `INSERT INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions\n ON CONFLICT (id) DO NOTHING`\n : `INSERT OR IGNORE INTO tools (id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility)\n SELECT id, name, description, content, icon, created_at, updated_at, owner_email, org_id, visibility\n FROM extensions`;\n\n try {\n await client.execute(sql);\n } catch (err: any) {\n const message = String(err?.message ?? err).toLowerCase();\n if (\n message.includes(\"no such table: extensions\") ||\n message.includes('relation \"extensions\" does not exist') ||\n message.includes(\"relation extensions does not exist\")\n ) {\n return;\n }\n throw err;\n }\n}\n\nasync function ensureExtensionDataItemId(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n if (pg) {\n await ensureColumnExists(\n \"tool_data\",\n \"item_id\",\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS item_id TEXT`,\n );\n return;\n }\n\n // Keep this additive: legacy rows with item_id=id are still read correctly\n // through COALESCE(item_id, id), so SQLite never needs a table rebuild here.\n try {\n await client.execute(`ALTER TABLE tool_data ADD COLUMN item_id TEXT`);\n } catch (err: any) {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n ) {\n throw err;\n }\n }\n}\n\nasync function ensureExtensionDataScope(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n const addCol = (name: string, def: string) => {\n if (pg) {\n return ensureColumnExists(\n \"tool_data\",\n name,\n `ALTER TABLE tool_data ADD COLUMN IF NOT EXISTS ${name} ${def}`,\n );\n }\n return client\n .execute(`ALTER TABLE tool_data ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(\"scope\", \"TEXT NOT NULL DEFAULT 'user'\");\n await addCol(\"org_id\", \"TEXT\");\n await addCol(\"scope_key\", \"TEXT NOT NULL DEFAULT 'local@localhost'\");\n // One-time backfill migration: replaces the dev-mode DEFAULT scope_key\n // with each row's real owner_email. Not a per-request fallback.\n await client.execute(\n // guard:allow-localhost-fallback — one-time backfill migration replacing dev-mode default scope_key with the row's real owner_email\n `UPDATE tool_data SET scope_key = owner_email WHERE scope_key = 'local@localhost' AND owner_email != 'local@localhost'`,\n );\n}\n\nasync function ensureExtensionsGlobalHideColumns(\n client: ReturnType<typeof getDbExec>,\n pg: boolean,\n): Promise<void> {\n // Global (admin) hide columns on the `tools` row, distinct from the\n // per-user `tool_hidden_extensions` table. Additive — keep this idempotent\n // for both dialects. Postgres supports `ADD COLUMN IF NOT EXISTS`; SQLite\n // does not, so we drop the clause and swallow the duplicate-column error.\n const addCol = (pgSql: string, name: string, def: string) => {\n if (pg) {\n return ensureColumnExists(\"tools\", name, pgSql);\n }\n return client\n .execute(`ALTER TABLE tools ADD COLUMN ${name} ${def}`)\n .catch((err: any) => {\n if (\n !String(err?.message ?? err)\n .toLowerCase()\n .includes(\"duplicate\")\n )\n throw err;\n });\n };\n await addCol(EXTENSIONS_HIDDEN_AT_COLUMN_SQL, \"hidden_at\", \"TEXT\");\n await addCol(EXTENSIONS_HIDDEN_BY_COLUMN_SQL, \"hidden_by\", \"TEXT\");\n}\n\nexport function registerExtensionsShareable() {\n registerShareableResource({\n type: \"extension\",\n resourceTable: extensions,\n sharesTable: extensionShares,\n displayName: \"Extension\",\n titleColumn: \"name\",\n getDb: () => getDb(),\n // Extension HTML executes inside an iframe and calls actions / SQL / the\n // secrets-injecting proxy as the *viewer*. A public extension would let a\n // random authenticated user run code with the viewer's credentials — and\n // a malicious shared extension could re-share itself wider. Lock both:\n // no public visibility, and individual user shares must already be (or\n // be invited to) the org.\n allowPublic: false,\n requireOrgMemberForUserShares: true,\n });\n}\n\nexport interface ExtensionRow {\n id: string;\n name: string;\n description: string;\n content: string;\n icon: string | null;\n createdAt: string;\n updatedAt: string;\n hiddenAt: string | null;\n hiddenBy: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n}\n\nexport type ExtensionHistoryOperation =\n | \"create\"\n | \"baseline\"\n | \"metadata-update\"\n | \"content-update\"\n | \"restore\";\n\nexport interface ExtensionHistoryEntry {\n id: string;\n extensionId: string;\n version: number;\n operation: ExtensionHistoryOperation | string;\n summary: string;\n name: string;\n description: string;\n content?: string;\n icon: string | null;\n actorEmail: string | null;\n ownerEmail: string;\n orgId: string | null;\n visibility: \"private\" | \"org\" | \"public\";\n createdAt: string;\n persisted: boolean;\n contentLength: number;\n}\n\nexport interface ExtensionHistoryDiffLine {\n type: \"equal\" | \"insert\" | \"delete\";\n text: string;\n}\n\nexport interface ExtensionHistoryDetail {\n entry: ExtensionHistoryEntry;\n previous: ExtensionHistoryEntry | null;\n diff: ExtensionHistoryDiffLine[];\n stats: {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n };\n}\n\ninterface RawExtensionHistoryRow {\n id: string;\n tool_id?: string;\n extensionId?: string;\n version: number | string;\n operation: string;\n summary?: string | null;\n name: string;\n description?: string | null;\n content?: string | null;\n icon?: string | null;\n actor_email?: string | null;\n actorEmail?: string | null;\n owner_email?: string | null;\n ownerEmail?: string | null;\n org_id?: string | null;\n orgId?: string | null;\n visibility?: string | null;\n created_at?: string;\n createdAt?: string;\n}\n\nfunction targetKey(target: ExtensionChangeTarget): string | null {\n if (target.owner) return `owner:${target.owner}`;\n if (target.orgId) return `org:${target.orgId}`;\n return null;\n}\n\nfunction addExtensionChangeTarget(\n targets: Map<string, ExtensionChangeTarget>,\n target: ExtensionChangeTarget,\n): void {\n const key = targetKey(target);\n if (key) targets.set(key, target);\n}\n\nasync function extensionChangeTargetsForRow(\n row: ExtensionRow,\n): Promise<ExtensionChangeTarget[]> {\n const targets = new Map<string, ExtensionChangeTarget>();\n addExtensionChangeTarget(targets, { owner: row.ownerEmail });\n if (row.visibility === \"org\" && row.orgId) {\n addExtensionChangeTarget(targets, { orgId: row.orgId });\n }\n\n const db = getDb();\n const shares = (await db\n .select({\n principalType: extensionShares.principalType,\n principalId: extensionShares.principalId,\n })\n .from(extensionShares)\n .where(eq(extensionShares.resourceId, row.id))) as Array<{\n principalType: \"user\" | \"org\";\n principalId: string;\n }>;\n\n for (const share of shares) {\n if (share.principalType === \"user\") {\n addExtensionChangeTarget(targets, { owner: share.principalId });\n } else if (share.principalType === \"org\") {\n addExtensionChangeTarget(targets, { orgId: share.principalId });\n }\n }\n\n return Array.from(targets.values());\n}\n\nasync function extensionChangeTargetsForId(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n return row ? extensionChangeTargetsForRow(row) : [];\n}\n\nexport async function getExtensionChangeTargets(\n id: string,\n): Promise<ExtensionChangeTarget[]> {\n await ensureExtensionsTables();\n return extensionChangeTargetsForId(id);\n}\n\nfunction dedupeExtensionChangeTargets(\n targets: ExtensionChangeTarget[],\n): ExtensionChangeTarget[] {\n const unique = new Map<string, ExtensionChangeTarget>();\n for (const target of targets) {\n const key = targetKey(target);\n if (key) unique.set(key, target);\n }\n return Array.from(unique.values());\n}\n\nasync function notifyExtensionChanged(\n targets: ExtensionChangeTarget[],\n): Promise<void> {\n const uniqueTargets = dedupeExtensionChangeTargets(targets);\n if (uniqueTargets.length === 0) return;\n\n for (const target of uniqueTargets) {\n recordChange({\n source: \"extensions\",\n type: \"change\",\n key: \"*\",\n ...(target.owner ? { owner: target.owner } : {}),\n ...(target.orgId ? { orgId: target.orgId } : {}),\n });\n }\n\n await Promise.all(\n uniqueTargets.map(async (target) => {\n const sessionId = extensionChangeMarkerSession(target);\n if (!sessionId) return;\n await appStatePut(\n sessionId,\n EXTENSION_CHANGE_MARKER_KEY,\n extensionChangeMarkerValue(target),\n );\n }),\n );\n}\n\nexport async function notifyExtensionChangeForResource(\n id: string,\n beforeTargets: ExtensionChangeTarget[] = [],\n): Promise<void> {\n await ensureExtensionsTables();\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n}\n\nfunction extensionHistoryEntryFromRaw(\n row: RawExtensionHistoryRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n const content = row.content ?? \"\";\n const visibility = normalizeVisibility(row.visibility);\n return {\n id: row.id,\n extensionId: String(row.tool_id ?? row.extensionId ?? \"\"),\n version: Number(row.version) || 1,\n operation: row.operation,\n summary: row.summary ?? \"\",\n name: row.name,\n description: row.description ?? \"\",\n ...(includeContent ? { content } : {}),\n icon: row.icon ?? null,\n actorEmail: row.actor_email ?? row.actorEmail ?? null,\n ownerEmail: row.owner_email ?? row.ownerEmail ?? \"\",\n orgId: row.org_id ?? row.orgId ?? null,\n visibility,\n createdAt: row.created_at ?? row.createdAt ?? new Date(0).toISOString(),\n persisted: true,\n contentLength: content.length,\n };\n}\n\nfunction extensionHistoryEntryFromExtension(\n row: ExtensionRow,\n includeContent: boolean,\n): ExtensionHistoryEntry {\n return {\n id: `current:${row.id}`,\n extensionId: row.id,\n version: 1,\n operation: \"baseline\",\n summary: \"Current version\",\n name: row.name,\n description: row.description,\n ...(includeContent ? { content: row.content } : {}),\n icon: row.icon,\n actorEmail: null,\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: row.updatedAt,\n persisted: false,\n contentLength: row.content.length,\n };\n}\n\nfunction normalizeVisibility(value: unknown): \"private\" | \"org\" | \"public\" {\n return value === \"org\" || value === \"public\" ? value : \"private\";\n}\n\nfunction currentActorEmail(): string | null {\n return getRequestUserEmail() ?? null;\n}\n\nfunction clampHistoryLimit(value: unknown): number {\n const limit = Number(value ?? 50);\n if (!Number.isFinite(limit)) return 50;\n return Math.min(Math.max(1, Math.floor(limit)), 100);\n}\n\nasync function historyVersionCount(extensionId: string): Promise<number> {\n const result = await getDbExec().execute({\n sql: `SELECT MAX(version) AS version FROM tool_history WHERE tool_id = ?`,\n args: [extensionId],\n });\n const value = (result.rows?.[0] as any)?.version;\n const version = Number(value ?? 0);\n return Number.isFinite(version) ? version : 0;\n}\n\nasync function hasExtensionHistory(extensionId: string): Promise<boolean> {\n const result = await getDbExec().execute({\n sql: `SELECT id FROM tool_history WHERE tool_id = ? LIMIT 1`,\n args: [extensionId],\n });\n return (result.rows?.length ?? 0) > 0;\n}\n\nasync function recordExtensionHistorySnapshot(\n row: ExtensionRow,\n operation: ExtensionHistoryOperation,\n summary: string,\n): Promise<ExtensionHistoryEntry> {\n const version = (await historyVersionCount(row.id)) + 1;\n const now = new Date().toISOString();\n const historyId = randomUUID();\n await getDbExec().execute({\n sql: `INSERT INTO tool_history (\n id, tool_id, version, operation, summary, name, description, content,\n icon, actor_email, owner_email, org_id, visibility, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n historyId,\n row.id,\n version,\n operation,\n summary,\n row.name,\n row.description,\n row.content,\n row.icon,\n currentActorEmail(),\n row.ownerEmail,\n row.orgId,\n row.visibility,\n now,\n ],\n });\n\n return {\n id: historyId,\n extensionId: row.id,\n version,\n operation,\n summary,\n name: row.name,\n description: row.description,\n content: row.content,\n icon: row.icon,\n actorEmail: currentActorEmail(),\n ownerEmail: row.ownerEmail,\n orgId: row.orgId,\n visibility: row.visibility,\n createdAt: now,\n persisted: true,\n contentLength: row.content.length,\n };\n}\n\nasync function ensureExtensionHistoryBaseline(\n row: ExtensionRow,\n): Promise<void> {\n if (await hasExtensionHistory(row.id)) return;\n await recordExtensionHistorySnapshot(\n row,\n \"baseline\",\n \"Saved starting version\",\n );\n}\n\nfunction summarizeMetadataChange(\n before: ExtensionRow,\n after: ExtensionRow,\n): string {\n const changes: string[] = [];\n if (before.name !== after.name) {\n changes.push(`Renamed from \"${before.name}\" to \"${after.name}\"`);\n }\n if (before.description !== after.description) {\n changes.push(\"Updated description\");\n }\n if (before.icon !== after.icon) {\n changes.push(\"Updated icon\");\n }\n if (before.visibility !== after.visibility) {\n changes.push(`Changed visibility to ${after.visibility}`);\n }\n return changes.join(\"; \") || \"Updated details\";\n}\n\nfunction summarizeContentChange(\n beforeContent: string,\n afterContent: string,\n): string {\n const stats = diffStats(createLineDiff(beforeContent, afterContent));\n if (!stats.changed) return \"Saved content\";\n return `Updated content (+${stats.addedLines} -${stats.deletedLines} lines)`;\n}\n\nfunction parseHistoryVersion(version: unknown): number | null {\n const parsed = Number(version);\n if (!Number.isInteger(parsed) || parsed < 1) return null;\n return parsed;\n}\n\nasync function getPersistedHistoryEntry(\n extensionId: string,\n version: number,\n includeContent: boolean,\n): Promise<ExtensionHistoryEntry | null> {\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ? AND version = ?\n LIMIT 1`,\n args: [extensionId, version],\n });\n const row = result.rows?.[0] as RawExtensionHistoryRow | undefined;\n return row ? extensionHistoryEntryFromRaw(row, includeContent) : null;\n}\n\nfunction splitLines(text: string): string[] {\n if (!text) return [];\n const parts = text.split(\"\\n\");\n return parts\n .map((line, index) => (index < parts.length - 1 ? `${line}\\n` : line))\n .filter((line) => line.length > 0);\n}\n\nfunction createLineDiff(\n beforeText: string,\n afterText: string,\n): ExtensionHistoryDiffLine[] {\n const before = splitLines(beforeText);\n const after = splitLines(afterText);\n if (before.length === 0 && after.length === 0) return [];\n\n const cells = before.length * after.length;\n if (cells > 40_000) return createBoundaryDiff(before, after);\n\n const dp = Array.from({ length: before.length + 1 }, () =>\n Array(after.length + 1).fill(0),\n );\n for (let i = before.length - 1; i >= 0; i -= 1) {\n for (let j = after.length - 1; j >= 0; j -= 1) {\n dp[i][j] =\n before[i] === after[j]\n ? dp[i + 1][j + 1] + 1\n : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n\n const diff: ExtensionHistoryDiffLine[] = [];\n let i = 0;\n let j = 0;\n while (i < before.length && j < after.length) {\n if (before[i] === after[j]) {\n diff.push({ type: \"equal\", text: before[i] });\n i += 1;\n j += 1;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n } else {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n }\n while (i < before.length) {\n diff.push({ type: \"delete\", text: before[i] });\n i += 1;\n }\n while (j < after.length) {\n diff.push({ type: \"insert\", text: after[j] });\n j += 1;\n }\n return diff;\n}\n\nfunction createBoundaryDiff(\n before: string[],\n after: string[],\n): ExtensionHistoryDiffLine[] {\n let prefix = 0;\n while (\n prefix < before.length &&\n prefix < after.length &&\n before[prefix] === after[prefix]\n ) {\n prefix += 1;\n }\n\n let suffix = 0;\n while (\n suffix + prefix < before.length &&\n suffix + prefix < after.length &&\n before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n ) {\n suffix += 1;\n }\n\n return [\n ...before\n .slice(0, prefix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ...before\n .slice(prefix, before.length - suffix)\n .map((text) => ({ type: \"delete\" as const, text })),\n ...after\n .slice(prefix, after.length - suffix)\n .map((text) => ({ type: \"insert\" as const, text })),\n ...before\n .slice(before.length - suffix)\n .map((text) => ({ type: \"equal\" as const, text })),\n ];\n}\n\nfunction diffStats(diff: ExtensionHistoryDiffLine[]): {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n} {\n const addedLines = diff.filter((line) => line.type === \"insert\").length;\n const deletedLines = diff.filter((line) => line.type === \"delete\").length;\n return {\n addedLines,\n deletedLines,\n changed: addedLines > 0 || deletedLines > 0,\n };\n}\n\nexport interface ListExtensionsOptions {\n includeHidden?: boolean;\n /**\n * Include extensions an admin/owner has globally hidden via `hidden_at`.\n * Off by default so globally-hidden extensions disappear for everyone.\n */\n includeGloballyHidden?: boolean;\n}\n\nexport async function listExtensions(\n options: ListExtensionsOptions = {},\n): Promise<ExtensionRow[]> {\n await ensureExtensionsTables();\n const db = getDb();\n // Build the WHERE with a single `and()` — drizzle replaces (not ANDs)\n // on repeated `.where()` calls, so combine the access filter and the\n // global-hidden filter into one condition.\n const base = accessFilter(extensions, extensionShares);\n const where = options.includeGloballyHidden\n ? base\n : and(base, isNull(extensions.hiddenAt));\n const rows = (await db\n .select()\n .from(extensions)\n .where(where)) as ExtensionRow[];\n\n if (options.includeHidden) return rows;\n\n const hiddenIds = await getHiddenExtensionIdsForCurrentUser();\n if (hiddenIds.size === 0) return rows;\n return rows.filter((row) => !hiddenIds.has(row.id));\n}\n\nexport async function getExtension(id: string): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const access = await resolveAccess(\"extension\", id);\n return (access?.resource as ExtensionRow | undefined) ?? null;\n}\n\nexport interface ListExtensionHistoryOptions {\n limit?: number;\n includeContent?: boolean;\n}\n\nexport async function listExtensionHistory(\n id: string,\n options: ListExtensionHistoryOptions = {},\n): Promise<ExtensionHistoryEntry[]> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return [];\n\n const includeContent = options.includeContent === true;\n const limit = clampHistoryLimit(options.limit);\n const result = await getDbExec().execute({\n sql: `SELECT id, tool_id, version, operation, summary, name, description,\n content, icon, actor_email, owner_email, org_id, visibility, created_at\n FROM tool_history\n WHERE tool_id = ?\n ORDER BY version DESC\n LIMIT ?`,\n args: [id, limit],\n });\n\n const entries = (result.rows ?? []).map((row) =>\n extensionHistoryEntryFromRaw(row as RawExtensionHistoryRow, includeContent),\n );\n\n if (entries.length > 0) return entries;\n return [extensionHistoryEntryFromExtension(extension, includeContent)];\n}\n\nexport async function getExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionHistoryDetail | null> {\n await ensureExtensionsTables();\n const extension = await getExtension(id);\n if (!extension) return null;\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const persisted = await getPersistedHistoryEntry(id, version, true);\n const entry =\n persisted ??\n (!(await hasExtensionHistory(id)) && version === 1\n ? extensionHistoryEntryFromExtension(extension, true)\n : null);\n if (!entry) return null;\n\n const previous =\n version > 1 ? await getPersistedHistoryEntry(id, version - 1, true) : null;\n const previousContent = previous?.content ?? \"\";\n const currentContent = entry.content ?? \"\";\n const diff = createLineDiff(previousContent, currentContent);\n\n return {\n entry,\n previous,\n diff,\n stats: diffStats(diff),\n };\n}\n\nexport async function restoreExtensionHistoryVersion(\n id: string,\n versionValue: number | string,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n\n const version = parseHistoryVersion(versionValue);\n if (!version) return null;\n\n const existingRows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n\n await ensureExtensionHistoryBaseline(existing);\n const target = await getPersistedHistoryEntry(id, version, true);\n if (!target) return null;\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await getDb()\n .update(extensions)\n .set({\n name: target.name,\n description: target.description,\n content: target.content ?? \"\",\n icon: target.icon,\n updatedAt: new Date().toISOString(),\n })\n .where(eq(extensions.id, id));\n\n const rows = await getDb()\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"restore\",\n `Restored version ${version}`,\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface CreateExtensionData {\n name: string;\n description?: string;\n content?: string;\n icon?: string;\n}\n\nexport async function createExtension(\n data: CreateExtensionData,\n): Promise<ExtensionRow> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n const orgId = getRequestOrgId();\n const id = randomUUID();\n const now = new Date().toISOString();\n const row: ExtensionRow = {\n id,\n name: data.name,\n description: data.description ?? \"\",\n content: data.content ?? \"\",\n icon: data.icon ?? null,\n createdAt: now,\n updatedAt: now,\n hiddenAt: null,\n hiddenBy: null,\n ownerEmail: userEmail,\n orgId: orgId ?? null,\n visibility: \"private\",\n };\n await db.insert(extensions).values(row);\n await recordExtensionHistorySnapshot(row, \"create\", \"Created extension\");\n await notifyExtensionChanged([{ owner: row.ownerEmail }]);\n return row;\n}\n\n/**\n * Returns an extension with the exact same name and content created by the\n * current user — in the current org/workspace scope — in the last 5 minutes,\n * or null if none exists. Used to make create-extension idempotent when a\n * connection drop causes the agent to retry the same tool call.\n *\n * Scoped by `orgId` the same way `createExtension` stamps it, so the same\n * `ownerEmail` working in two different orgs can create identically-named,\n * identical-content extensions without this lookup cross-matching and skipping\n * the second insert. Keyed on the FULL create inputs (name + content +\n * description + icon, normalized exactly as `createExtension` stores them), so\n * two creates that differ in any of them are treated as distinct — only a\n * byte-identical re-create (the connection-retry case) recovers the prior row,\n * and no intentional second create silently loses its metadata.\n */\nexport async function findRecentDuplicateExtension(data: {\n name: string;\n content: string;\n description?: string;\n icon?: string;\n}): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n const db = getDb();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return null;\n const orgId = getRequestOrgId() ?? null;\n const description = data.description ?? \"\";\n const icon = data.icon ?? null;\n const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();\n const rows = await db\n .select()\n .from(extensions)\n .where(\n and(\n eq(extensions.ownerEmail, userEmail),\n orgId === null ? isNull(extensions.orgId) : eq(extensions.orgId, orgId),\n eq(extensions.name, data.name),\n eq(extensions.content, data.content),\n eq(extensions.description, description),\n icon === null ? isNull(extensions.icon) : eq(extensions.icon, icon),\n gte(extensions.createdAt, fiveMinutesAgo),\n isNull(extensions.hiddenAt),\n ),\n )\n .limit(1);\n return rows[0] ?? null;\n}\n\nexport interface UpdateExtensionData {\n name?: string;\n description?: string;\n icon?: string;\n /**\n * Extensions cannot be public — `set-resource-visibility` and this store\n * helper both reject `\"public\"`. The type lists it so the framework's\n * generic share UI compiles, not because it's allowed at runtime.\n */\n visibility?: \"private\" | \"org\" | \"public\";\n}\n\nexport async function updateExtension(\n id: string,\n data: UpdateExtensionData,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n if (data.visibility === \"public\") {\n // Defense in depth — `registerExtensionsShareable` sets\n // `allowPublic: false`, so `set-resource-visibility` already rejects\n // this. Block direct callers too (HTTP `PUT /extensions/:id`, internal\n // refactors) so the rule holds regardless of entry point.\n throw new ForbiddenError(\n \"Extensions cannot be made public — share with specific people or your organization instead.\",\n );\n }\n const db = getDb();\n const beforeTargets = await extensionChangeTargetsForId(id);\n const updates: Record<string, unknown> = {\n updatedAt: new Date().toISOString(),\n };\n if (data.name !== undefined) updates.name = data.name;\n if (data.description !== undefined) updates.description = data.description;\n if (data.icon !== undefined) updates.icon = data.icon;\n if (data.visibility !== undefined) updates.visibility = data.visibility;\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n const existing = existingRows[0] as ExtensionRow | undefined;\n if (!existing) return null;\n await ensureExtensionHistoryBaseline(existing);\n await db.update(extensions).set(updates).where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"metadata-update\",\n summarizeMetadataChange(existing, row),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport interface UpdateExtensionContentOpts {\n content?: string;\n allowFullReplacement?: boolean;\n patches?: ExtensionLegacyPatch[];\n edits?: ExtensionContentEdit[];\n format?: boolean;\n}\n\nexport async function updateExtensionContent(\n id: string,\n opts: UpdateExtensionContentOpts,\n): Promise<ExtensionRow | null> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"editor\");\n const db = getDb();\n\n if (\n opts.content === undefined &&\n opts.patches === undefined &&\n opts.edits === undefined &&\n !opts.format\n ) {\n return null;\n }\n\n if (opts.content !== undefined && opts.allowFullReplacement !== true) {\n throw new ExtensionContentEditError(\n \"Full extension-body replacement requires allowFullReplacement=true. No changes were applied. Use patches or edits for a targeted data-only repair, or set allowFullReplacement=true for a user-requested broad visual rewrite.\",\n );\n }\n\n const existingRows = await db\n .select()\n .from(extensions)\n .where(eq(extensions.id, id));\n if (!existingRows[0]) return null;\n const existing = existingRows[0] as ExtensionRow;\n const existingContent = existing.content;\n await ensureExtensionHistoryBaseline(existing);\n const update = await applyExtensionContentUpdate(existingContent, opts);\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n await db\n .update(extensions)\n .set({ content: update.content, updatedAt: new Date().toISOString() })\n .where(eq(extensions.id, id));\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = (rows[0] as ExtensionRow) ?? null;\n if (row) {\n await recordExtensionHistorySnapshot(\n row,\n \"content-update\",\n summarizeContentChange(existingContent, row.content),\n );\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForRow(row)),\n ]);\n }\n return row;\n}\n\nexport async function deleteExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const db = getDb();\n const rows = await db.select().from(extensions).where(eq(extensions.id, id));\n const row = rows[0] as ExtensionRow | undefined;\n if (!row) return false;\n const targets = await extensionChangeTargetsForRow(row);\n await db.delete(extensionShares).where(eq(extensionShares.resourceId, id));\n await db.delete(extensionHides).where(eq(extensionHides.extensionId, id));\n await getDbExec().execute({\n sql: `DELETE FROM tool_data WHERE tool_id = ?`,\n args: [id],\n });\n await getDbExec().execute({\n sql: `DELETE FROM tool_history WHERE tool_id = ?`,\n args: [id],\n });\n const { cascadeDeleteExtensionSlots } = await import(\"./slots/store.js\");\n await cascadeDeleteExtensionSlots(id);\n await db.delete(extensions).where(eq(extensions.id, id));\n await notifyExtensionChanged(targets);\n return true;\n}\n\nexport async function getHiddenExtensionIdsForCurrentUser(): Promise<\n Set<string>\n> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) return new Set();\n\n const db = getDb();\n const rows = await db\n .select({ extensionId: extensionHides.extensionId })\n .from(extensionHides)\n .where(eq(extensionHides.ownerEmail, userEmail));\n return new Set(rows.map((row) => row.extensionId));\n}\n\nexport async function hideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"viewer\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `INSERT INTO tool_hidden_extensions (id, tool_id, owner_email, created_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT (owner_email, tool_id) DO NOTHING`,\n args: [randomUUID(), id, userEmail, now],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\nexport async function unhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n await getDbExec().execute({\n sql: `DELETE FROM tool_hidden_extensions WHERE tool_id = ? AND owner_email = ?`,\n args: [id, userEmail],\n });\n await notifyExtensionChanged([{ owner: userEmail }]);\n return true;\n}\n\n/**\n * Globally hide an extension from EVERYONE's list by stamping `hidden_at` /\n * `hidden_by` on the `tools` row. Distinct from the per-user `hideExtension`\n * (`tool_hidden_extensions`) — this affects all viewers. Requires admin/owner\n * access. The extension is not deleted and stays accessible by id; pass\n * `includeGloballyHidden: true` to `listExtensions` to surface it again.\n */\nexport async function globalHideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = ?, hidden_by = ?, updated_at = ? WHERE id = ?`,\n args: [now, userEmail, now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n\n/**\n * Clear a global hide so the extension reappears in everyone's list. Requires\n * admin/owner access. Mirrors `globalHideExtension`.\n */\nexport async function globalUnhideExtension(id: string): Promise<boolean> {\n await ensureExtensionsTables();\n await assertAccess(\"extension\", id, \"admin\");\n const userEmail = getRequestUserEmail();\n if (!userEmail) throw new Error(\"no authenticated user\");\n\n const beforeTargets = await extensionChangeTargetsForId(id);\n const now = new Date().toISOString();\n await getDbExec().execute({\n sql: `UPDATE tools SET hidden_at = NULL, hidden_by = NULL, updated_at = ? WHERE id = ?`,\n args: [now, id],\n });\n await notifyExtensionChanged([\n ...beforeTargets,\n ...(await extensionChangeTargetsForId(id)),\n ]);\n return true;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import type { ActionRouteAuthAdapter } from "../server/action-routes.js";
2
+ declare const FLAG_ACTION_SCOPES: {
3
+ readonly "list-feature-flags": "flags:read";
4
+ readonly "set-feature-flag": "flags:write";
5
+ };
6
+ export declare function declaresFeatureFlagDelegation(token: string): boolean;
7
+ /**
8
+ * Narrow opt-in adapter for fleet flag control. It owns Bearer credentials only
9
+ * for these two actions; malformed owned bearers reject rather than falling
10
+ * back to a browser cookie.
11
+ */
12
+ export declare function createFeatureFlagA2AActionRouteAuth(actionName: keyof typeof FLAG_ACTION_SCOPES): ActionRouteAuthAdapter;
13
+ export {};
14
+ //# sourceMappingURL=a2a-action-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-action-route.d.ts","sourceRoot":"","sources":["../../src/feature-flags/a2a-action-route.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,QAAA,MAAM,kBAAkB;aACtB,oBAAoB,EAAE,YAAY;aAClC,kBAAkB,EAAE,aAAa;CACzB,CAAC;AAEX,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAepE;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,MAAM,OAAO,kBAAkB,GAC1C,sBAAsB,CAoBxB"}
@@ -0,0 +1,50 @@
1
+ import { getHeader } from "h3";
2
+ import * as jose from "jose";
3
+ import { verifyA2ATokenWithClaims } from "../a2a-claims.js";
4
+ const FLAG_ACTION_SCOPES = {
5
+ "list-feature-flags": "flags:read",
6
+ "set-feature-flag": "flags:write",
7
+ };
8
+ export function declaresFeatureFlagDelegation(token) {
9
+ try {
10
+ const raw = jose.decodeJwt(token);
11
+ const scopes = typeof raw.scope === "string"
12
+ ? raw.scope.split(/\s+/)
13
+ : Array.isArray(raw.scope)
14
+ ? raw.scope.filter((scope) => typeof scope === "string")
15
+ : [];
16
+ return scopes.some((scope) => scope.startsWith("flags:"));
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /**
23
+ * Narrow opt-in adapter for fleet flag control. It owns Bearer credentials only
24
+ * for these two actions; malformed owned bearers reject rather than falling
25
+ * back to a browser cookie.
26
+ */
27
+ export function createFeatureFlagA2AActionRouteAuth(actionName) {
28
+ return {
29
+ async resolveCaller(event) {
30
+ const header = getHeader(event, "authorization");
31
+ if (!header?.startsWith("Bearer "))
32
+ return null;
33
+ const token = header.slice(7);
34
+ if (!declaresFeatureFlagDelegation(token))
35
+ return null;
36
+ const claims = await verifyA2ATokenWithClaims(token, event);
37
+ if (!claims || !claims.scope.includes(FLAG_ACTION_SCOPES[actionName])) {
38
+ throw new Error("Invalid feature flag delegation");
39
+ }
40
+ return {
41
+ owner: claims.email,
42
+ orgId: claims.orgId,
43
+ anonymous: false,
44
+ delegationJti: claims.jti,
45
+ delegationIssuer: claims.issuer,
46
+ };
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=a2a-action-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-action-route.js","sourceRoot":"","sources":["../../src/feature-flags/a2a-action-route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,kBAAkB,GAAG;IACzB,oBAAoB,EAAE,YAAY;IAClC,kBAAkB,EAAE,aAAa;CACzB,CAAC;AAEX,MAAM,UAAU,6BAA6B,CAAC,KAAa;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GACV,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;YAC3B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACxB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CACd,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CACtD;gBACH,CAAC,CAAC,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mCAAmC,CACjD,UAA2C;IAE3C,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,KAAK;YACvB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,KAAK;gBAChB,aAAa,EAAE,MAAM,CAAC,GAAG;gBACzB,gBAAgB,EAAE,MAAM,CAAC,MAAM;aAChC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { getHeader } from \"h3\";\nimport * as jose from \"jose\";\n\nimport { verifyA2ATokenWithClaims } from \"../a2a-claims.js\";\nimport type { ActionRouteAuthAdapter } from \"../server/action-routes.js\";\n\nconst FLAG_ACTION_SCOPES = {\n \"list-feature-flags\": \"flags:read\",\n \"set-feature-flag\": \"flags:write\",\n} as const;\n\nexport function declaresFeatureFlagDelegation(token: string): boolean {\n try {\n const raw = jose.decodeJwt(token);\n const scopes =\n typeof raw.scope === \"string\"\n ? raw.scope.split(/\\s+/)\n : Array.isArray(raw.scope)\n ? raw.scope.filter(\n (scope): scope is string => typeof scope === \"string\",\n )\n : [];\n return scopes.some((scope) => scope.startsWith(\"flags:\"));\n } catch {\n return false;\n }\n}\n\n/**\n * Narrow opt-in adapter for fleet flag control. It owns Bearer credentials only\n * for these two actions; malformed owned bearers reject rather than falling\n * back to a browser cookie.\n */\nexport function createFeatureFlagA2AActionRouteAuth(\n actionName: keyof typeof FLAG_ACTION_SCOPES,\n): ActionRouteAuthAdapter {\n return {\n async resolveCaller(event) {\n const header = getHeader(event, \"authorization\");\n if (!header?.startsWith(\"Bearer \")) return null;\n const token = header.slice(7);\n if (!declaresFeatureFlagDelegation(token)) return null;\n const claims = await verifyA2ATokenWithClaims(token, event);\n if (!claims || !claims.scope.includes(FLAG_ACTION_SCOPES[actionName])) {\n throw new Error(\"Invalid feature flag delegation\");\n }\n return {\n owner: claims.email,\n orgId: claims.orgId,\n anonymous: false,\n delegationJti: claims.jti,\n delegationIssuer: claims.issuer,\n };\n },\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("../../action.js").ActionDefinition<Record<string, never>, any>;
2
+ export default _default;
3
+ //# sourceMappingURL=get-feature-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-feature-flags.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/actions/get-feature-flags.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ import { defineAction } from "../../action.js";
3
+ import { listFeatureFlags } from "../registry.js";
4
+ import { evaluateFeatureFlag } from "../store.js";
5
+ export default defineAction({
6
+ description: "Return the boolean values of every feature flag registered by this app for the current caller. Unknown or unconfigured flags always evaluate to false.",
7
+ schema: z.object({}),
8
+ http: { method: "GET" },
9
+ run: async (_args, ctx) => {
10
+ const scope = { userEmail: ctx?.userEmail, orgId: ctx?.orgId };
11
+ const values = Object.fromEntries(await Promise.all(listFeatureFlags().map(async ({ key }) => [
12
+ key,
13
+ await evaluateFeatureFlag(key, scope).catch(() => false),
14
+ ])));
15
+ return values;
16
+ },
17
+ });
18
+ //# sourceMappingURL=get-feature-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-feature-flags.js","sourceRoot":"","sources":["../../../src/feature-flags/actions/get-feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,wJAAwJ;IAC1J,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,OAAO,CAAC,GAAG,CACf,gBAAgB,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;YACxC,GAAG;YACH,MAAM,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;SACzD,CAAC,CACH,CACF,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../../action.js\";\nimport { listFeatureFlags } from \"../registry.js\";\nimport { evaluateFeatureFlag } from \"../store.js\";\n\nexport default defineAction({\n description:\n \"Return the boolean values of every feature flag registered by this app for the current caller. Unknown or unconfigured flags always evaluate to false.\",\n schema: z.object({}),\n http: { method: \"GET\" },\n run: async (_args, ctx) => {\n const scope = { userEmail: ctx?.userEmail, orgId: ctx?.orgId };\n const values = Object.fromEntries(\n await Promise.all(\n listFeatureFlags().map(async ({ key }) => [\n key,\n await evaluateFeatureFlag(key, scope).catch(() => false),\n ]),\n ),\n );\n return values;\n },\n});\n"]}
@@ -0,0 +1,28 @@
1
+ declare const _default: import("../../action.js").ActionDefinition<Record<string, never>, {
2
+ contractVersion: number;
3
+ status: "forbidden";
4
+ reason: "forbidden";
5
+ flags: any[];
6
+ canManage: boolean;
7
+ } | {
8
+ contractVersion: number;
9
+ status: "no-definitions";
10
+ reason: "no-definitions";
11
+ flags: any[];
12
+ canManage: boolean;
13
+ } | {
14
+ contractVersion: number;
15
+ status: "ready";
16
+ reason: "ready";
17
+ flags: {
18
+ key: string;
19
+ defaultValue?: false;
20
+ displayName?: string;
21
+ description?: string;
22
+ rules: import("../store.js").FeatureFlagRules;
23
+ enabledForCurrentUser: boolean;
24
+ }[];
25
+ canManage: boolean;
26
+ }>;
27
+ export default _default;
28
+ //# sourceMappingURL=list-feature-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-feature-flags.d.ts","sourceRoot":"","sources":["../../../src/feature-flags/actions/list-feature-flags.ts"],"names":[],"mappings":";;YA0BkB,WAAW;YACX,WAAW;;;;;YAUb,gBAAgB;YAChB,gBAAgB;;;;;YAwBlB,OAAO;YACP,OAAO"}
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ import { defineAction } from "../../action.js";
3
+ import { requireFeatureFlagManager } from "../permissions.js";
4
+ import { listFeatureFlags } from "../registry.js";
5
+ import { evaluateFeatureFlagRules, getFeatureFlagRules } from "../store.js";
6
+ export default defineAction({
7
+ description: "List this app's registered feature flags and their current rules. Organization owner/admin only (or the explicit no-org administrator).",
8
+ schema: z.object({}),
9
+ http: { method: "GET" },
10
+ toolCallable: false,
11
+ run: async (_args, ctx) => {
12
+ const definitions = listFeatureFlags();
13
+ let manager;
14
+ try {
15
+ manager = await requireFeatureFlagManager(ctx ?? {});
16
+ }
17
+ catch (error) {
18
+ if (error instanceof Error &&
19
+ "statusCode" in error &&
20
+ error.statusCode === 403) {
21
+ return {
22
+ contractVersion: 1,
23
+ status: "forbidden",
24
+ reason: "forbidden",
25
+ flags: [],
26
+ canManage: false,
27
+ };
28
+ }
29
+ throw error;
30
+ }
31
+ if (definitions.length === 0)
32
+ return {
33
+ contractVersion: 1,
34
+ status: "no-definitions",
35
+ reason: "no-definitions",
36
+ flags: [],
37
+ canManage: true,
38
+ };
39
+ const flags = await Promise.all(definitions.map(async (definition) => {
40
+ const rules = await getFeatureFlagRules(definition.key, manager);
41
+ return {
42
+ ...definition,
43
+ rules,
44
+ enabledForCurrentUser: evaluateFeatureFlagRules(definition.key, rules, {
45
+ userEmail: manager.email,
46
+ userKey: manager.email,
47
+ orgId: manager.orgId,
48
+ }),
49
+ };
50
+ }));
51
+ return {
52
+ contractVersion: 1,
53
+ status: "ready",
54
+ reason: "ready",
55
+ flags,
56
+ canManage: true,
57
+ };
58
+ },
59
+ });
60
+ //# sourceMappingURL=list-feature-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-feature-flags.js","sourceRoot":"","sources":["../../../src/feature-flags/actions/list-feature-flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE5E,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,yIAAyI;IAC3I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,YAAY,EAAE,KAAK;IACnB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,yBAAyB,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK,YAAY,KAAK;gBACtB,YAAY,IAAI,KAAK;gBACpB,KAAiC,CAAC,UAAU,KAAK,GAAG,EACrD,CAAC;gBACD,OAAO;oBACL,eAAe,EAAE,CAAC;oBAClB,MAAM,EAAE,WAAoB;oBAC5B,MAAM,EAAE,WAAoB;oBAC5B,KAAK,EAAE,EAAE;oBACT,SAAS,EAAE,KAAK;iBACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAC1B,OAAO;gBACL,eAAe,EAAE,CAAC;gBAClB,MAAM,EAAE,gBAAyB;gBACjC,MAAM,EAAE,gBAAyB;gBACjC,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjE,OAAO;gBACL,GAAG,UAAU;gBACb,KAAK;gBACL,qBAAqB,EAAE,wBAAwB,CAC7C,UAAU,CAAC,GAAG,EACd,KAAK,EACL;oBACE,SAAS,EAAE,OAAO,CAAC,KAAK;oBACxB,OAAO,EAAE,OAAO,CAAC,KAAK;oBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CACF;aACF,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QACF,OAAO;YACL,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,OAAgB;YACxB,MAAM,EAAE,OAAgB;YACxB,KAAK;YACL,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../../action.js\";\nimport { requireFeatureFlagManager } from \"../permissions.js\";\nimport { listFeatureFlags } from \"../registry.js\";\nimport { evaluateFeatureFlagRules, getFeatureFlagRules } from \"../store.js\";\n\nexport default defineAction({\n description:\n \"List this app's registered feature flags and their current rules. Organization owner/admin only (or the explicit no-org administrator).\",\n schema: z.object({}),\n http: { method: \"GET\" },\n toolCallable: false,\n run: async (_args, ctx) => {\n const definitions = listFeatureFlags();\n let manager;\n try {\n manager = await requireFeatureFlagManager(ctx ?? {});\n } catch (error) {\n if (\n error instanceof Error &&\n \"statusCode\" in error &&\n (error as { statusCode?: number }).statusCode === 403\n ) {\n return {\n contractVersion: 1,\n status: \"forbidden\" as const,\n reason: \"forbidden\" as const,\n flags: [],\n canManage: false,\n };\n }\n throw error;\n }\n if (definitions.length === 0)\n return {\n contractVersion: 1,\n status: \"no-definitions\" as const,\n reason: \"no-definitions\" as const,\n flags: [],\n canManage: true,\n };\n const flags = await Promise.all(\n definitions.map(async (definition) => {\n const rules = await getFeatureFlagRules(definition.key, manager);\n return {\n ...definition,\n rules,\n enabledForCurrentUser: evaluateFeatureFlagRules(\n definition.key,\n rules,\n {\n userEmail: manager.email,\n userKey: manager.email,\n orgId: manager.orgId,\n },\n ),\n };\n }),\n );\n return {\n contractVersion: 1,\n status: \"ready\" as const,\n reason: \"ready\" as const,\n flags,\n canManage: true,\n };\n },\n});\n"]}