@agent-native/core 0.92.0 → 0.92.2

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 (375) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +20 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/application-state/store.ts +12 -1
  5. package/corpus/core/src/cli/sync-builder-starter-manifest.ts +29 -1
  6. package/corpus/core/src/client/AssistantChat.tsx +27 -14
  7. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  8. package/corpus/core/src/client/agent-chat-adapter.ts +37 -10
  9. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  10. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  11. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  12. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  13. package/corpus/core/src/client/error-capture.ts +69 -7
  14. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  15. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  16. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  17. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  18. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  19. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  20. package/corpus/core/src/client/settings/SettingsPanel.tsx +205 -52
  21. package/corpus/core/src/client/settings/SettingsSection.tsx +8 -1
  22. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  23. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  24. package/corpus/core/src/db-admin/operations.ts +116 -4
  25. package/corpus/core/src/db-admin/routes.ts +1 -0
  26. package/corpus/core/src/db-admin/types.ts +4 -0
  27. package/corpus/core/src/extensions/html-shell.ts +5 -4
  28. package/corpus/core/src/extensions/routes.ts +10 -0
  29. package/corpus/core/src/navigation/index.ts +1 -1
  30. package/corpus/core/src/notifications/channels.ts +1 -22
  31. package/corpus/core/src/resources/handlers.ts +10 -8
  32. package/corpus/core/src/server/poll.ts +293 -8
  33. package/corpus/core/src/styles/agent-native.css +27 -0
  34. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  35. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  36. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  37. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  38. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  39. package/corpus/core/src/templates/default/AGENTS.md +4 -2
  40. package/corpus/core/src/templates/headless/AGENTS.md +4 -0
  41. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  42. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  43. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  44. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  45. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  47. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  49. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  50. package/corpus/core/src/templates/workspace-root/AGENTS.md +7 -1
  51. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  52. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  53. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  54. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  55. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  56. package/corpus/templates/analytics/AGENTS.md +33 -14
  57. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  58. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  59. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  60. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  61. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  62. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  63. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  64. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  65. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  66. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  67. package/corpus/templates/analytics/actions/save-monitor.ts +1 -1
  68. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  69. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  70. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  71. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  72. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  73. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  74. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  75. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  76. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  77. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  78. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  79. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  80. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  81. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  82. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  83. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  84. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  85. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  86. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  87. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  88. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  89. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  90. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +6 -3
  91. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +26 -30
  92. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  93. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  94. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  95. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-08-alert-emails-now-show-the-message-without-raw-metadata-json.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  99. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  101. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  102. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  103. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  104. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  105. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  106. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  107. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  108. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  109. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  110. package/corpus/templates/analytics/changelog/2026-07-08-uptime-checks-no-longer-count-ssrf-setup-time-against-the-re.md +6 -0
  111. package/corpus/templates/analytics/changelog/2026-07-08-uptime-checks-reuse-one-keep-alive-connection-so-recorded-la.md +6 -0
  112. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-confirm-transient-timeout-failures-befor.md +6 -0
  113. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  114. package/corpus/templates/analytics/docs/uptime-monitoring.md +30 -18
  115. package/corpus/templates/analytics/server/db/schema-monitoring.ts +1 -1
  116. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  117. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  118. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  119. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  120. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  121. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +244 -33
  122. package/corpus/templates/analytics/server/plugins/db.ts +112 -2
  123. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  124. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  125. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  126. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  127. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  128. package/corpus/templates/assets/AGENTS.md +4 -0
  129. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  130. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  131. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  132. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  133. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  134. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  135. package/corpus/templates/brain/AGENTS.md +4 -0
  136. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  137. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  138. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  139. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  140. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  141. package/corpus/templates/calendar/AGENTS.md +4 -0
  142. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  143. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  144. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  145. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  146. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  147. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  148. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  149. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  150. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  151. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  152. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  153. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  154. package/corpus/templates/chat/AGENTS.md +4 -0
  155. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  156. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  157. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  158. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  159. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  160. package/corpus/templates/clips/AGENTS.md +4 -0
  161. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  162. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  163. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  164. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  165. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  166. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  167. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  168. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  169. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  170. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  171. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  172. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  173. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  174. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  175. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  176. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  177. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  178. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  182. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  183. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  184. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  185. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  186. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  187. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  188. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  189. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  190. package/corpus/templates/content/AGENTS.md +4 -0
  191. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  192. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  193. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  194. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  195. package/corpus/templates/design/AGENTS.md +4 -0
  196. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  197. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  198. package/corpus/templates/design/app/routes/team.tsx +1 -1
  199. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  200. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  201. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/dispatch/AGENTS.md +4 -0
  203. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  204. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  205. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  206. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  207. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  208. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  209. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  210. package/corpus/templates/forms/AGENTS.md +4 -0
  211. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  212. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  213. package/corpus/templates/forms/shared/navigation.ts +1 -1
  214. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  215. package/corpus/templates/macros/AGENTS.md +4 -0
  216. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  217. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  218. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  219. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  220. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  221. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  222. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  223. package/corpus/templates/mail/AGENTS.md +4 -0
  224. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  225. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  226. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  227. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  228. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  229. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  230. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  231. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  232. package/corpus/templates/plan/AGENTS.md +4 -0
  233. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  234. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  235. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  236. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  237. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  238. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  239. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  240. package/corpus/templates/slides/AGENTS.md +4 -0
  241. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  242. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  243. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  244. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  245. package/corpus/templates/slides/shared/api.ts +1 -1
  246. package/dist/application-state/store.d.ts.map +1 -1
  247. package/dist/application-state/store.js +8 -2
  248. package/dist/application-state/store.js.map +1 -1
  249. package/dist/cli/sync-builder-starter-manifest.d.ts.map +1 -1
  250. package/dist/cli/sync-builder-starter-manifest.js +24 -1
  251. package/dist/cli/sync-builder-starter-manifest.js.map +1 -1
  252. package/dist/client/AssistantChat.d.ts.map +1 -1
  253. package/dist/client/AssistantChat.js +24 -13
  254. package/dist/client/AssistantChat.js.map +1 -1
  255. package/dist/client/PoweredByBadge.d.ts +1 -1
  256. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  257. package/dist/client/PoweredByBadge.js +3 -9
  258. package/dist/client/PoweredByBadge.js.map +1 -1
  259. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  260. package/dist/client/agent-chat-adapter.js +28 -9
  261. package/dist/client/agent-chat-adapter.js.map +1 -1
  262. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  263. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  264. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  265. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  266. package/dist/client/db-admin/TableEditor.js +19 -2
  267. package/dist/client/db-admin/TableEditor.js.map +1 -1
  268. package/dist/client/db-admin/export-utils.d.ts +2 -0
  269. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  270. package/dist/client/db-admin/export-utils.js +11 -3
  271. package/dist/client/db-admin/export-utils.js.map +1 -1
  272. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  273. package/dist/client/db-admin/useAgentSync.js +63 -0
  274. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  275. package/dist/client/error-capture.d.ts.map +1 -1
  276. package/dist/client/error-capture.js +41 -7
  277. package/dist/client/error-capture.js.map +1 -1
  278. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  279. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  280. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  281. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  282. package/dist/client/extensions/ExtensionViewer.js +32 -5
  283. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  284. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  285. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  286. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  287. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  288. package/dist/client/extensions/portable-extension.js +1 -0
  289. package/dist/client/extensions/portable-extension.js.map +1 -1
  290. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  291. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  292. package/dist/client/org/OrgSwitcher.js +11 -6
  293. package/dist/client/org/OrgSwitcher.js.map +1 -1
  294. package/dist/client/org/TeamPage.d.ts.map +1 -1
  295. package/dist/client/org/TeamPage.js +5 -5
  296. package/dist/client/org/TeamPage.js.map +1 -1
  297. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  298. package/dist/client/settings/SettingsPanel.js +37 -14
  299. package/dist/client/settings/SettingsPanel.js.map +1 -1
  300. package/dist/client/settings/SettingsSection.js +1 -1
  301. package/dist/client/settings/SettingsSection.js.map +1 -1
  302. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  303. package/dist/client/settings/SettingsTabsPage.js +21 -10
  304. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  305. package/dist/collab/routes.d.ts +1 -1
  306. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  307. package/dist/db-admin/agent-tools.js +7 -2
  308. package/dist/db-admin/agent-tools.js.map +1 -1
  309. package/dist/db-admin/operations.d.ts.map +1 -1
  310. package/dist/db-admin/operations.js +90 -4
  311. package/dist/db-admin/operations.js.map +1 -1
  312. package/dist/db-admin/routes.d.ts.map +1 -1
  313. package/dist/db-admin/routes.js +1 -0
  314. package/dist/db-admin/routes.js.map +1 -1
  315. package/dist/db-admin/types.d.ts +4 -0
  316. package/dist/db-admin/types.d.ts.map +1 -1
  317. package/dist/db-admin/types.js.map +1 -1
  318. package/dist/extensions/html-shell.d.ts +5 -4
  319. package/dist/extensions/html-shell.d.ts.map +1 -1
  320. package/dist/extensions/html-shell.js.map +1 -1
  321. package/dist/extensions/routes.d.ts.map +1 -1
  322. package/dist/extensions/routes.js +8 -0
  323. package/dist/extensions/routes.js.map +1 -1
  324. package/dist/navigation/index.d.ts +1 -1
  325. package/dist/navigation/index.d.ts.map +1 -1
  326. package/dist/navigation/index.js +1 -1
  327. package/dist/navigation/index.js.map +1 -1
  328. package/dist/notifications/channels.js +1 -17
  329. package/dist/notifications/channels.js.map +1 -1
  330. package/dist/notifications/routes.d.ts +1 -1
  331. package/dist/resources/handlers.d.ts +5 -0
  332. package/dist/resources/handlers.d.ts.map +1 -1
  333. package/dist/resources/handlers.js +9 -8
  334. package/dist/resources/handlers.js.map +1 -1
  335. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  336. package/dist/server/poll.d.ts +12 -4
  337. package/dist/server/poll.d.ts.map +1 -1
  338. package/dist/server/poll.js +236 -9
  339. package/dist/server/poll.js.map +1 -1
  340. package/dist/styles/agent-native.css +27 -0
  341. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  342. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  343. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  344. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  345. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  346. package/dist/templates/default/AGENTS.md +4 -2
  347. package/dist/templates/headless/AGENTS.md +4 -0
  348. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  349. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  350. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  351. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  352. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  353. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  354. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  355. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  356. package/dist/templates/workspace-core/AGENTS.md +7 -1
  357. package/dist/templates/workspace-root/AGENTS.md +7 -1
  358. package/package.json +1 -1
  359. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  360. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  361. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  362. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  363. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  364. package/src/templates/default/AGENTS.md +4 -2
  365. package/src/templates/headless/AGENTS.md +4 -0
  366. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  367. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  368. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  369. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  370. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  371. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  372. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  373. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  374. package/src/templates/workspace-core/AGENTS.md +7 -1
  375. package/src/templates/workspace-root/AGENTS.md +7 -1
@@ -18,6 +18,7 @@ import { ShareButton } from "../sharing/ShareButton.js";
18
18
  import { deleteOrHideExtension, invalidateExtensionRemoval, } from "./delete-extension.js";
19
19
  import { extensionLoadError, extensionLoadErrorStatus, shouldRetryExtensionLoad, } from "./extension-load-error.js";
20
20
  import { isAllowedExtensionPath, sanitizeExtensionRequestOptions, checkBridgePolicy, } from "./iframe-bridge.js";
21
+ import { normalizeAgentNativeExtensionSandbox } from "./portable-extension.js";
21
22
  const THEME_CSS_VARS = [
22
23
  "--background",
23
24
  "--foreground",
@@ -48,6 +49,7 @@ const THEME_CSS_VARS = [
48
49
  "--sidebar-border",
49
50
  "--sidebar-ring",
50
51
  ];
52
+ const EXTENSION_IFRAME_SANDBOX = normalizeAgentNativeExtensionSandbox(undefined);
51
53
  function getParentThemeVars() {
52
54
  const computed = getComputedStyle(document.documentElement);
53
55
  const vars = {};
@@ -152,6 +154,24 @@ function compactDiffLines(lines, context = 3) {
152
154
  }
153
155
  return result;
154
156
  }
157
+ function ExtensionUnavailableState({ status }) {
158
+ const sessionExpired = status === 401;
159
+ const accessDenied = status === 403;
160
+ const unavailable = status === 404;
161
+ const title = sessionExpired
162
+ ? "Session expired"
163
+ : accessDenied
164
+ ? "Extension is not shared"
165
+ : unavailable
166
+ ? "Extension is unavailable"
167
+ : "Extension not found";
168
+ const message = sessionExpired
169
+ ? "Sign in again to view this extension."
170
+ : accessDenied
171
+ ? "You do not have access to this extension. Ask the owner to share it with your organization or open a different extension."
172
+ : "This extension may not be shared with you, may have been deleted, or is not available to your account.";
173
+ return (_jsx("div", { className: "flex h-full min-h-[20rem] items-center justify-center bg-muted/20 p-6", children: _jsxs("div", { className: "w-full max-w-md rounded-lg border border-border bg-background p-6 text-center shadow-sm", children: [_jsx("p", { className: "text-sm font-semibold text-foreground", children: title }), _jsx("p", { className: "mt-2 text-sm leading-6 text-muted-foreground", children: message }), _jsx(Link, { to: "/extensions", className: "mt-4 inline-flex h-9 items-center justify-center rounded-md border border-input px-3 text-sm font-medium text-foreground hover:bg-accent hover:text-accent-foreground", children: "Back to extensions" })] }) }));
174
+ }
155
175
  function diffLineClass(line) {
156
176
  switch (line.type) {
157
177
  case "insert":
@@ -652,10 +672,13 @@ export function ExtensionViewer({ extensionId }) {
652
672
  window.addEventListener("message", handleMessage);
653
673
  return () => window.removeEventListener("message", handleMessage);
654
674
  }, [extensionId, queryClient]);
655
- const { data: extension, error: extensionError, isFetching, isLoading, } = useQuery({
675
+ const { data: extension, error: extensionError, failureReason: extensionFailureReason, isFetching, isLoading, } = useQuery({
656
676
  queryKey: ["extension", extensionId],
657
677
  queryFn: async () => {
658
678
  const res = await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`));
679
+ if (res.status === 401) {
680
+ throw extensionLoadError(401, "Session expired");
681
+ }
659
682
  if (res.status === 404) {
660
683
  throw extensionLoadError(404, "Extension not found");
661
684
  }
@@ -669,6 +692,7 @@ export function ExtensionViewer({ extensionId }) {
669
692
  },
670
693
  retry: shouldRetryExtensionLoad,
671
694
  retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 4000),
695
+ refetchOnMount: "always",
672
696
  });
673
697
  toolRef.current = extension ?? null;
674
698
  useEffect(() => {
@@ -693,6 +717,10 @@ export function ExtensionViewer({ extensionId }) {
693
717
  return undefined;
694
718
  return buildExtensionViewerSrcDoc(extension, isDark);
695
719
  }, [extension, isDark]);
720
+ const unavailableStatus = extensionLoadErrorStatus(extensionError ?? extensionFailureReason);
721
+ const latestFetchDenied = unavailableStatus === 401 ||
722
+ unavailableStatus === 403 ||
723
+ unavailableStatus === 404;
696
724
  useEffect(() => {
697
725
  setIframeReady(false);
698
726
  // Reset role to deny-by-default on every reload — the new render's
@@ -733,9 +761,8 @@ export function ExtensionViewer({ extensionId }) {
733
761
  if (isLoading || (!extension && isFetching)) {
734
762
  return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex h-12 items-center gap-2 px-3 border-b shrink-0", children: [_jsx("div", { className: "h-3.5 w-3.5 rounded bg-muted animate-pulse" }), _jsx("div", { className: "h-3.5 w-24 rounded bg-muted animate-pulse" })] }), _jsx("div", { className: "flex-1 bg-muted/20 animate-pulse" })] }));
735
763
  }
736
- if (!extension) {
737
- const status = extensionLoadErrorStatus(extensionError);
738
- return (_jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: status === 403 ? "Extension access denied" : "Extension not found" }));
764
+ if (latestFetchDenied || !extension) {
765
+ return _jsx(ExtensionUnavailableState, { status: unavailableStatus });
739
766
  }
740
767
  const isLocalExtension = extension.source?.mode === "local-files";
741
768
  return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs("div", { className: "flex h-full w-full flex-col", children: [_jsxs("div", { className: "flex h-12 shrink-0 items-center justify-between gap-3 border-b px-3", children: [_jsx("div", { className: "flex min-w-0 items-center gap-3", children: _jsxs("nav", { "aria-label": "Extension breadcrumb", className: "group/name flex min-w-0 items-center gap-1 text-sm", children: [_jsx(Link, { to: "/extensions", className: "shrink-0 text-muted-foreground hover:text-foreground", children: "Extensions" }), _jsx(IconChevronRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground/60" }), isRenaming ? (_jsx("input", { ref: renameInputRef, value: renameValue, onChange: (e) => setRenameValue(e.target.value), onBlur: submitRename, onKeyDown: (e) => {
@@ -743,7 +770,7 @@ export function ExtensionViewer({ extensionId }) {
743
770
  submitRename();
744
771
  if (e.key === "Escape")
745
772
  setIsRenaming(false);
746
- }, className: "min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary" })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate text-sm font-medium", children: extension.name }), extension.canEdit && !isLocalExtension && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: startRename, className: "shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground", children: _jsx(IconPencil, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "Rename" })] }))] }))] }) }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setRefreshKey((k) => k + 1), className: "inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer", children: _jsx(IconRefresh, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { children: "Refresh" })] }), !isLocalExtension && (_jsxs(_Fragment, { children: [_jsx(ExtensionHistoryPopover, { extensionId: extensionId, canEdit: extension.canEdit, onRestored: () => setRefreshKey((k) => k + 1), onOpenChange: onPopoverOpenChange }), extension.canEdit && (_jsx(SourceCodeDialog, { extension: extension, onSaved: () => setRefreshKey((k) => k + 1) })), _jsx(EditToolPopover, { extension: extension, onOpenChange: onPopoverOpenChange })] })), _jsx(ToolMoreMenu, { extensionId: extensionId, toolName: extension.name, canDelete: extension.canDelete, sourceMode: extension.source?.mode, onOpenChange: onPopoverOpenChange }), !isLocalExtension && (_jsx(_Fragment, { children: _jsx(ShareButton, { resourceType: "extension", resourceId: extensionId, resourceTitle: extension.name, onOpenChange: onPopoverOpenChange, accessNote: _jsx(_Fragment, { children: "Extensions can be shared inside your organization only \u2014 they run with the viewer's credentials, so cross-org access isn't supported." }) }) })), _jsx(AgentToggleButton, {})] })] }), isLocalExtension && (_jsxs("div", { className: "shrink-0 border-b bg-muted/30 px-4 py-2 text-xs text-muted-foreground", children: ["Repo-backed extension. Edit", " ", _jsx("span", { className: "font-mono text-foreground", children: extension.source?.entryPath ?? "extensions/*/index.html" }), " ", "in your workspace, then refresh this preview."] })), _jsxs("div", { className: "relative flex-1 min-h-0", children: [!iframeReady && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-background z-10", children: _jsx(IconLoader2, { className: "size-5 animate-spin text-muted-foreground", role: "status", "aria-label": "Loading" }) })), _jsx("iframe", { ref: iframeRef, src: iframeSrcDoc ? undefined : iframeSrc, srcDoc: iframeSrcDoc, className: "h-full w-full border-0", sandbox: "allow-scripts allow-forms", title: extension.name, style: {
773
+ }, className: "min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary" })) : (_jsxs(_Fragment, { children: [_jsx("span", { className: "truncate text-sm font-medium", children: extension.name }), extension.canEdit && !isLocalExtension && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: startRename, className: "shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground", children: _jsx(IconPencil, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "Rename" })] }))] }))] }) }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: () => setRefreshKey((k) => k + 1), className: "inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer", children: _jsx(IconRefresh, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { children: "Refresh" })] }), !isLocalExtension && (_jsxs(_Fragment, { children: [_jsx(ExtensionHistoryPopover, { extensionId: extensionId, canEdit: extension.canEdit, onRestored: () => setRefreshKey((k) => k + 1), onOpenChange: onPopoverOpenChange }), extension.canEdit && (_jsx(SourceCodeDialog, { extension: extension, onSaved: () => setRefreshKey((k) => k + 1) })), _jsx(EditToolPopover, { extension: extension, onOpenChange: onPopoverOpenChange })] })), _jsx(ToolMoreMenu, { extensionId: extensionId, toolName: extension.name, canDelete: extension.canDelete, sourceMode: extension.source?.mode, onOpenChange: onPopoverOpenChange }), !isLocalExtension && (_jsx(_Fragment, { children: _jsx(ShareButton, { resourceType: "extension", resourceId: extensionId, resourceTitle: extension.name, onOpenChange: onPopoverOpenChange, accessNote: _jsx(_Fragment, { children: "Extensions can be shared inside your organization only \u2014 they run with the viewer's credentials, so cross-org access isn't supported." }) }) })), _jsx(AgentToggleButton, {})] })] }), isLocalExtension && (_jsxs("div", { className: "shrink-0 border-b bg-muted/30 px-4 py-2 text-xs text-muted-foreground", children: ["Repo-backed extension. Edit", " ", _jsx("span", { className: "font-mono text-foreground", children: extension.source?.entryPath ?? "extensions/*/index.html" }), " ", "in your workspace, then refresh this preview."] })), _jsxs("div", { className: "relative flex-1 min-h-0", children: [!iframeReady && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-background z-10", children: _jsx(IconLoader2, { className: "size-5 animate-spin text-muted-foreground", role: "status", "aria-label": "Loading" }) })), _jsx("iframe", { ref: iframeRef, src: iframeSrcDoc ? undefined : iframeSrc, srcDoc: iframeSrcDoc, className: "h-full w-full border-0", sandbox: EXTENSION_IFRAME_SANDBOX, title: extension.name, style: {
747
774
  pointerEvents: openPopoverCount > 0 ? "none" : "auto",
748
775
  }, onLoad: () => {
749
776
  sendThemeToIframe();
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionViewer.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconArrowBackUp,\n IconChevronRight,\n IconCode,\n IconDotsVertical,\n IconHistory,\n IconLoader2,\n IconPencil,\n IconRefresh,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect, useRef, useCallback, useMemo } from \"react\";\nimport { Link, useLocation, useNavigate } from \"react-router\";\n\nimport { buildExtensionHtml } from \"../../extensions/html-shell.js\";\nimport { extensionPath, isExtensionPathname } from \"../../extensions/path.js\";\nimport { getThemeVars } from \"../../extensions/theme.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { agentNativePath, appPath } from \"../api-path.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"../components/ui/dialog.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport { isEmbedMcpChatBridgeActive } from \"../embed-auth.js\";\nimport { ShareButton } from \"../sharing/ShareButton.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n extensionLoadError,\n extensionLoadErrorStatus,\n shouldRetryExtensionLoad,\n} from \"./extension-load-error.js\";\nimport {\n isAllowedExtensionPath,\n sanitizeExtensionRequestOptions,\n checkBridgePolicy,\n type BridgePolicyContext,\n type ExtensionBridgeRole,\n} from \"./iframe-bridge.js\";\n\nconst THEME_CSS_VARS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--popover\",\n \"--popover-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--secondary\",\n \"--secondary-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--destructive\",\n \"--destructive-foreground\",\n \"--border\",\n \"--input\",\n \"--ring\",\n \"--radius\",\n \"--sidebar-background\",\n \"--sidebar-foreground\",\n \"--sidebar-primary\",\n \"--sidebar-primary-foreground\",\n \"--sidebar-accent\",\n \"--sidebar-accent-foreground\",\n \"--sidebar-border\",\n \"--sidebar-ring\",\n];\n\nfunction getParentThemeVars(): Record<string, string> {\n const computed = getComputedStyle(document.documentElement);\n const vars: Record<string, string> = {};\n for (const name of THEME_CSS_VARS) {\n const val = computed.getPropertyValue(name).trim();\n if (val) vars[name] = val;\n }\n return vars;\n}\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n ownerEmail?: string;\n role?: ExtensionBridgeRole | null;\n canEdit?: boolean;\n canDelete?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n entryPath?: string;\n manifestPath?: string;\n permissions?: BridgePolicyContext[\"permissions\"];\n };\n}\n\nexport interface ExtensionViewerProps {\n extensionId: string;\n}\n\nfunction readExtensionTitleSuffix(): string | null {\n const current = typeof document !== \"undefined\" ? document.title.trim() : \"\";\n const match = current.match(/^(?:Extension|Tool)s?\\s+(?:\\u2014|-)\\s+(.+)$/);\n return match?.[1]?.trim() || null;\n}\n\nfunction extensionDocumentTitle(name: string, suffix: string | null): string {\n return suffix ? `${name} \\u2014 ${suffix}` : `${name} \\u2014 Extensions`;\n}\n\nfunction extensionRole(value: unknown): ExtensionBridgeRole {\n return value === \"owner\" ||\n value === \"admin\" ||\n value === \"editor\" ||\n value === \"viewer\"\n ? value\n : \"viewer\";\n}\n\nfunction serializeChatValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction buildExtensionViewerSrcDoc(\n extension: Extension,\n isDark: boolean,\n): string {\n const role = extensionRole(extension.role);\n return buildExtensionHtml(\n extension.content ?? \"\",\n getThemeVars(isDark),\n isDark,\n extension.id,\n {\n authorEmail: extension.ownerEmail ?? \"\",\n viewerEmail: \"\",\n isAuthor: role === \"owner\",\n role,\n source: extension.source?.mode,\n permissions: extension.source?.permissions,\n },\n );\n}\n\ninterface ExtensionHistoryEntry {\n id: string;\n extensionId: string;\n version: number;\n operation: string;\n summary: string;\n name: string;\n description: 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\ninterface ExtensionHistoryDiffLine {\n type: \"equal\" | \"insert\" | \"delete\";\n text: string;\n}\n\ninterface ExtensionHistoryDetail {\n entry: ExtensionHistoryEntry & { content?: string };\n previous: (ExtensionHistoryEntry & { content?: string }) | null;\n diff: ExtensionHistoryDiffLine[];\n stats: {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n };\n}\n\ntype CompactDiffLine =\n | ExtensionHistoryDiffLine\n | { type: \"omitted\"; count: number };\n\nfunction formatHistoryTime(value: string | undefined): string {\n if (!value) return \"\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return date.toLocaleString([], {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction operationLabel(operation: string): string {\n switch (operation) {\n case \"create\":\n return \"Created\";\n case \"baseline\":\n return \"Baseline\";\n case \"metadata-update\":\n return \"Details\";\n case \"content-update\":\n return \"Content\";\n case \"restore\":\n return \"Restore\";\n default:\n return operation;\n }\n}\n\nfunction compactDiffLines(\n lines: ExtensionHistoryDiffLine[],\n context = 3,\n): CompactDiffLine[] {\n const result: CompactDiffLine[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if (line.type !== \"equal\") {\n result.push(line);\n i += 1;\n continue;\n }\n\n let end = i + 1;\n while (end < lines.length && lines[end].type === \"equal\") end += 1;\n const run = lines.slice(i, end);\n if (run.length > context * 2 + 1) {\n result.push(...run.slice(0, context));\n result.push({ type: \"omitted\", count: run.length - context * 2 });\n result.push(...run.slice(-context));\n } else {\n result.push(...run);\n }\n i = end;\n }\n return result;\n}\n\nfunction diffLineClass(line: CompactDiffLine): string {\n switch (line.type) {\n case \"insert\":\n return \"bg-primary/10 text-primary\";\n case \"delete\":\n return \"bg-destructive/10 text-destructive\";\n case \"omitted\":\n return \"bg-muted/60 text-muted-foreground\";\n default:\n return \"text-muted-foreground\";\n }\n}\n\nfunction diffLinePrefix(line: CompactDiffLine): string {\n switch (line.type) {\n case \"insert\":\n return \"+\";\n case \"delete\":\n return \"-\";\n case \"omitted\":\n return \"...\";\n default:\n return \" \";\n }\n}\n\nfunction applyCanonicalLink(path: string): () => void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return () => {};\n }\n\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"canonical\"]');\n const created = !link;\n const previousHref = link?.getAttribute(\"href\") ?? null;\n const previousMarker = link?.dataset.agentNativeExtensionCanonical;\n\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"canonical\";\n document.head.appendChild(link);\n }\n\n link.dataset.agentNativeExtensionCanonical = \"true\";\n link.href = new URL(appPath(path), window.location.origin).toString();\n\n return () => {\n if (!link) return;\n if (created) {\n link.remove();\n return;\n }\n if (previousHref === null) {\n link.removeAttribute(\"href\");\n } else {\n link.href = previousHref;\n }\n if (previousMarker === undefined) {\n delete link.dataset.agentNativeExtensionCanonical;\n } else {\n link.dataset.agentNativeExtensionCanonical = previousMarker;\n }\n };\n}\n\nfunction SourceCodeDialog({\n extension,\n onSaved,\n}: {\n extension: Extension;\n onSaved?: () => void;\n}) {\n const queryClient = useQueryClient();\n const [open, setOpen] = useState(false);\n const [code, setCode] = useState(extension.content ?? \"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Sync in when the dialog opens, or when the viewed extension changes\n // while the dialog stays mounted (e.g. re-parented to a different id).\n useEffect(() => {\n if (open) setCode(extension.content ?? \"\");\n }, [open, extension.id]);\n\n const isDirty = code !== (extension.content ?? \"\");\n\n // Block Escape / outside-click from closing while there are unsaved edits.\n const handleOpenChange = (next: boolean) => {\n if (!next && isDirty) return;\n setOpen(next);\n if (!next) setError(null);\n };\n\n const handleCancel = () => {\n setCode(extension.content ?? \"\");\n setOpen(false);\n setError(null);\n };\n\n const handleSave = async () => {\n setSaving(true);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content: code }),\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error ?? `Save failed (${res.status})`);\n }\n setOpen(false);\n queryClient.setQueryData<Extension>([\"extension\", extension.id], (old) =>\n old ? { ...old, content: code } : old,\n );\n queryClient.invalidateQueries({\n queryKey: [\"extension\", extension.id],\n });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n onSaved?.();\n } catch (err: any) {\n setError(err?.message ?? \"Save failed\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconCode className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>View / edit source</TooltipContent>\n </Tooltip>\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className=\"flex h-[85vh] w-[90vw] max-w-[900px] flex-col gap-0 overflow-hidden p-0\">\n <div className=\"flex shrink-0 items-center border-b border-border px-5 py-3 pr-12\">\n <DialogTitle className=\"truncate text-sm font-medium\">\n {extension.name} — source\n </DialogTitle>\n </div>\n <textarea\n className=\"flex-1 resize-none bg-muted/40 px-5 py-4 font-mono text-xs leading-relaxed text-foreground focus:outline-none\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n spellCheck={false}\n />\n <div className=\"flex shrink-0 items-center justify-between border-t border-border px-5 py-3\">\n {error ? (\n <p className=\"text-xs text-destructive\">{error}</p>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n Alpine.js / HTML &middot; {code.length.toLocaleString()} chars\n </span>\n )}\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md border border-input px-3 text-xs hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md bg-primary px-4 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nfunction EditToolPopover({\n extension,\n onOpenChange,\n}: {\n extension: Extension;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n // Radix's outside-click detection runs in the parent document, so a click\n // inside the extension iframe (or any other iframe) never fires it. The browser\n // does shift focus to the iframe though, which blurs the parent window — we\n // hook that to close the popover so it behaves like a normal click-outside.\n useEffect(() => {\n if (!open) return;\n const handleBlur = () => {\n // Defer until after the focus actually lands so document.activeElement\n // reflects the iframe (or whatever the user clicked on).\n setTimeout(() => {\n if (document.activeElement?.tagName === \"IFRAME\")\n setOpenAndNotify(false);\n }, 0);\n };\n window.addEventListener(\"blur\", handleBlur);\n return () => window.removeEventListener(\"blur\", handleBlur);\n }, [open]);\n\n const handleSubmit = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n sendToAgentChat({\n message: `Update extension \"${extension.name}\" (${extension.id}): ${trimmed}`,\n context: [\n `The user is viewing extension \"${extension.name}\" (id: ${extension.id}) and wants to edit it.`,\n \"This is an existing sandboxed Alpine.js extension stored in SQL. Use list-extensions/update-extension for this extension id.\",\n \"Do not call connect-builder and do not route this to a source-code change flow.\",\n ].join(\"\\n\"),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n setOpenAndNotify(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpenAndNotify}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconPencil className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={6} className=\"w-[420px] p-3\">\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n Edit extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"What would you like to change?\"\n draftScope={`extensions:edit:${extension.id}`}\n onSubmit={handleSubmit}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ExtensionHistoryPopover({\n extensionId,\n canEdit,\n onRestored,\n onOpenChange,\n}: {\n extensionId: string;\n canEdit?: boolean;\n onRestored?: () => void;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [selectedVersion, setSelectedVersion] = useState<number | null>(null);\n const [restoringVersion, setRestoringVersion] = useState<number | null>(null);\n const queryClient = useQueryClient();\n\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n const historyQuery = useQuery<{ history: ExtensionHistoryEntry[] }>({\n queryKey: [\"extension-history\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}/history`),\n { cache: \"no-store\" },\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension history\");\n return res.json();\n },\n enabled: open,\n });\n\n const history = historyQuery.data?.history ?? [];\n useEffect(() => {\n if (!open || history.length === 0) return;\n if (\n !selectedVersion ||\n !history.some((h) => h.version === selectedVersion)\n ) {\n setSelectedVersion(history[0].version);\n }\n }, [history, open, selectedVersion]);\n\n const detailQuery = useQuery<ExtensionHistoryDetail>({\n queryKey: [\"extension-history-detail\", extensionId, selectedVersion],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/history/${selectedVersion}`,\n ),\n { cache: \"no-store\" },\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension history version\");\n return res.json();\n },\n enabled: open && selectedVersion !== null,\n });\n\n const latestVersion = history[0]?.version ?? null;\n const selectedEntry =\n history.find((entry) => entry.version === selectedVersion) ?? history[0];\n const canRestoreSelected =\n !!canEdit &&\n !!selectedEntry?.persisted &&\n selectedEntry.version !== latestVersion;\n\n const restoreSelected = async () => {\n if (!selectedEntry || !canRestoreSelected) return;\n setRestoringVersion(selectedEntry.version);\n try {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/history/${selectedEntry.version}/restore`,\n ),\n { method: \"POST\" },\n );\n if (!res.ok) throw new Error(\"Failed to restore extension version\");\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] }),\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] }),\n queryClient.invalidateQueries({\n queryKey: [\"extension-history\", extensionId],\n }),\n queryClient.invalidateQueries({\n queryKey: [\"extension-history-detail\", extensionId],\n }),\n ]);\n onRestored?.();\n } finally {\n setRestoringVersion(null);\n }\n };\n\n const compactedDiff = compactDiffLines(detailQuery.data?.diff ?? []);\n\n return (\n <Popover open={open} onOpenChange={setOpenAndNotify}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label=\"History\"\n >\n <IconHistory className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[42rem] max-w-[calc(100vw-2rem)] p-0\"\n >\n <div className=\"grid max-h-[72vh] min-h-[24rem] grid-cols-1 overflow-hidden sm:grid-cols-[15rem_minmax(0,1fr)]\">\n <div className=\"border-b border-border/60 sm:border-b-0 sm:border-r\">\n <div className=\"border-b border-border/60 px-3 py-2\">\n <p className=\"text-sm font-semibold text-foreground\">History</p>\n <p className=\"text-[11px] text-muted-foreground\">\n Snapshots are saved when extensions change.\n </p>\n </div>\n <div className=\"max-h-56 overflow-y-auto p-1 sm:max-h-[calc(72vh-3.5rem)]\">\n {historyQuery.isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-3 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Loading history\n </div>\n ) : history.length === 0 ? (\n <p className=\"px-2 py-3 text-xs text-muted-foreground\">\n No history yet.\n </p>\n ) : (\n history.map((entry) => (\n <button\n key={`${entry.id}-${entry.version}`}\n type=\"button\"\n onClick={() => setSelectedVersion(entry.version)}\n className={`flex w-full flex-col gap-0.5 rounded-md px-2 py-2 text-left text-xs hover:bg-accent ${\n entry.version === selectedVersion\n ? \"bg-accent text-accent-foreground\"\n : \"text-foreground\"\n }`}\n >\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">\n Version {entry.version}\n </span>\n <span className=\"text-[10px] text-muted-foreground\">\n {operationLabel(entry.operation)}\n </span>\n </span>\n <span className=\"line-clamp-2 text-[11px] text-muted-foreground\">\n {entry.summary || \"Saved version\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground/80\">\n {formatHistoryTime(entry.createdAt)}\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-col\">\n <div className=\"flex items-start justify-between gap-3 border-b border-border/60 px-3 py-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold text-foreground\">\n {selectedEntry\n ? `Version ${selectedEntry.version}`\n : \"Select a version\"}\n </p>\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {selectedEntry?.summary ?? \"Compare saved extension content\"}\n </p>\n </div>\n <button\n type=\"button\"\n disabled={!canRestoreSelected || restoringVersion !== null}\n onClick={restoreSelected}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-md border border-border px-2 py-1 text-[11px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n >\n {restoringVersion === selectedEntry?.version ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n )}\n Restore\n </button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto bg-muted/20\">\n {detailQuery.isLoading ? (\n <div className=\"flex h-full items-center justify-center gap-2 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Loading diff\n </div>\n ) : detailQuery.isError ? (\n <div className=\"p-4 text-xs text-destructive\">\n Could not load this version.\n </div>\n ) : compactedDiff.length === 0 ? (\n <div className=\"p-4 text-xs text-muted-foreground\">\n No content changes in this version.\n </div>\n ) : (\n <pre className=\"min-w-full text-[11px] leading-5\">\n {compactedDiff.map((line, index) => (\n <div\n key={index}\n className={`grid grid-cols-[2rem_minmax(0,1fr)] px-2 ${diffLineClass(line)}`}\n >\n <span className=\"select-none text-right font-mono opacity-70\">\n {diffLinePrefix(line)}\n </span>\n <span className=\"whitespace-pre-wrap break-words pl-3 font-mono\">\n {line.type === \"omitted\"\n ? `${line.count} unchanged lines`\n : line.text}\n </span>\n </div>\n ))}\n </pre>\n )}\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function ExtensionViewer({ extensionId }: ExtensionViewerProps) {\n const location = useLocation();\n const navigate = useNavigate();\n const [isDark, setIsDark] = useState(false);\n const [iframeReady, setIframeReady] = useState(false);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const toolRef = useRef<Extension | null>(null);\n const [isRenaming, setIsRenaming] = useState(false);\n const [renameValue, setRenameValue] = useState(\"\");\n const [refreshKey, setRefreshKey] = useState(0);\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n const titleSuffixRef = useRef<string | null | undefined>(undefined);\n // Tracks how many toolbar popovers are open. Iframes capture pointer events\n // from areas they visually overlap, so when a popover opens above the iframe,\n // hover and click on the popover items get swallowed by the iframe. Disabling\n // pointer-events on the iframe while any popover is open lets the popover\n // receive its own events. Each popover increments on open / decrements on\n // close, so concurrent popovers (rare) compose correctly.\n const [openPopoverCount, setOpenPopoverCount] = useState(0);\n const onPopoverOpenChange = useCallback((open: boolean) => {\n setOpenPopoverCount((c) => Math.max(0, c + (open ? 1 : -1)));\n }, []);\n const queryClient = useQueryClient();\n // (audit H4) Role plumbed through from the iframe's render binding. Until\n // the iframe announces its role we deny non-trivial helper calls — that\n // way a malicious extension body that races the announcement can't briefly\n // operate at higher privilege than the viewer's actual role.\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: \"viewer\",\n isAuthor: false,\n });\n // (audit H4) Latch the render binding once per iframe instance; later\n // announcements are attacker-controllable and must be ignored.\n const bindingLatchedRef = useRef(false);\n\n useEffect(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const sendThemeToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark: document.documentElement.classList.contains(\"dark\"),\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n if (!iframeReady) return;\n sendThemeToIframe();\n }, [isDark, iframeReady]);\n\n useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!message) return;\n\n if (message.type === \"agent-native-extension-binding\") {\n // (audit H4) Trust only the FIRST announcement: the shell sends the\n // server-resolved binding BEFORE user-authored content runs. Later\n // announcements share the iframe realm with user code and could forge\n // an owner role, so they are ignored.\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = message.binding ?? {};\n const role: ExtensionBridgeRole =\n binding.role === \"owner\" ||\n binding.role === \"admin\" ||\n binding.role === \"editor\" ||\n binding.role === \"viewer\"\n ? binding.role\n : \"viewer\";\n bridgeContextRef.current = {\n role,\n isAuthor: !!binding.isAuthor,\n source: binding.source === \"local-files\" ? \"local-files\" : \"database\",\n permissions:\n binding && typeof binding.permissions === \"object\"\n ? binding.permissions\n : undefined,\n };\n return;\n }\n\n if (\n message.type === \"agent-native-extension-consent-granted\" ||\n message.type === \"agent-native-extension-consent-cancelled\"\n ) {\n // (audit C1) The consent stub fired; force a reload of the iframe so\n // the next render returns the extension body (granted) or stays on the\n // stub (cancelled — viewer can also navigate away).\n if (message.type === \"agent-native-extension-consent-granted\") {\n // Invalidate the cached extension record — author may have edited\n // since the cache was warmed.\n queryClient.invalidateQueries({\n queryKey: [\"extension\", extensionId],\n });\n setRefreshKey((k) => k + 1);\n }\n return;\n }\n\n if (message.type === \"agent-native-send-to-chat\") {\n const text = serializeChatValue(message.message);\n if (!text?.trim()) return;\n sendToAgentChat({\n message: text,\n context: serializeChatValue(message.context),\n submit: message.submit !== false,\n openSidebar: message.openSidebar !== false,\n });\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: message.key,\n code: message.code,\n metaKey: !!message.metaKey,\n ctrlKey: !!message.ctrlKey,\n shiftKey: !!message.shiftKey,\n altKey: !!message.altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const t = toolRef.current;\n if (!t) return;\n const errors: string[] = message.errors || [];\n const errorDetails: Array<{ message: string; stack: string }> =\n message.errorDetails || [];\n const consoleLogs: Array<{ level: string; message: string }> =\n message.consoleLogs || [];\n const networkLogs: Array<{\n path: string;\n method: string;\n ok?: boolean;\n status?: number;\n error?: string;\n }> = message.networkLogs || [];\n\n const detailedTrace = errorDetails\n .map((e) => (e.stack ? `${e.message}\\n${e.stack}` : e.message))\n .join(\"\\n\\n\");\n\n // Force a fresh read from the server. toolRef.current is bound to the\n // React Query cache, which is the same state the agent's previous\n // (broken) turn just wrote — without this, Fix-in-same-chat ends up\n // patching the agent's prior attempt from chat history instead of the\n // current DB row, which is why users had to open a new chat to\n // recover. Cache-bust so we never read a stale fetch.\n let freshContent: string | undefined;\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${t.id}`),\n { cache: \"no-store\" },\n );\n if (res.ok) {\n const fresh = (await res.json()) as Extension;\n freshContent =\n typeof fresh?.content === \"string\" ? fresh.content : undefined;\n }\n } catch {\n // Fall through with the cached value — agent can still re-read via\n // its get-extension tool.\n }\n\n const contextParts = [\n `The user is viewing extension \"${t.name}\" (id: ${t.id}) and there are runtime errors that need fixing.`,\n `\\nFull error details:\\n${detailedTrace}`,\n ];\n\n if (consoleLogs.length > 0) {\n const consoleStr = consoleLogs\n .map((l) => `[${l.level}] ${l.message}`)\n .join(\"\\n\");\n contextParts.push(`\\nRecent console output:\\n${consoleStr}`);\n }\n\n if (networkLogs.length > 0) {\n const netStr = networkLogs\n .map(\n (l) =>\n `${l.method} ${l.path} → ${l.ok ? l.status : \"FAILED: \" + (l.error || l.status)}`,\n )\n .join(\"\\n\");\n contextParts.push(`\\nRecent network requests:\\n${netStr}`);\n }\n\n if (freshContent) {\n contextParts.push(\n `\\nCurrent extension content (just re-read from the database — this is the authoritative source, not anything you may have written in a previous turn):\\n\\`\\`\\`html\\n${freshContent}\\n\\`\\`\\``,\n );\n }\n\n sendToAgentChat({\n message: `Fix runtime errors in this extension. The content snapshot below was just re-read from the database — treat it as authoritative and ignore any prior version you may have generated in this chat. If in doubt, call get-extension first.\\n\\nErrors:\\n${errors.join(\"\\n\")}`,\n context: contextParts.join(\"\\n\"),\n submit: true,\n openSidebar: true,\n });\n return;\n }\n\n if (message.type !== \"agent-native-extension-request\") return;\n\n const requestId = String(message.requestId ?? \"\");\n const path = String(message.path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-extension-response\",\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n if (!requestId || !isAllowedExtensionPath(path, extensionId)) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(message.options);\n // (audit H4) Role-aware policy gate: viewer-shared extensions can read\n // but not write. Decided here in the parent before the request\n // leaves; the server enforces a second layer.\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId,\n });\n if (!policy.ok) {\n respond({\n response: {\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n body: { error: policy.error },\n },\n });\n return;\n }\n // (audit H5) Tag every outbound bridge request with the\n // X-Agent-Native-Extension-Bridge sentinel so the action-routes layer can\n // enforce per-action `toolCallable` opt-in. The header is added by\n // the parent — it is NOT taken from the iframe-supplied options\n // (which were filtered by sanitizeExtensionRequestOptions).\n const finalHeaders = new Headers(options.headers ?? undefined);\n finalHeaders.set(\"X-Agent-Native-Extension-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Extension-Id\", extensionId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", extensionId);\n const res = await fetch(agentNativePath(path), {\n ...options,\n headers: finalHeaders,\n credentials: \"same-origin\",\n });\n const text = await res.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n respond({\n response: {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText,\n body,\n },\n });\n } catch (err: any) {\n respond({ error: err?.message ?? \"Extension host request failed\" });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [extensionId, queryClient]);\n\n const {\n data: extension,\n error: extensionError,\n isFetching,\n isLoading,\n } = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (res.status === 404) {\n throw extensionLoadError(404, \"Extension not found\");\n }\n if (res.status === 403) {\n throw extensionLoadError(403, \"Extension access denied\");\n }\n if (!res.ok) {\n throw extensionLoadError(res.status, \"Failed to fetch extension\");\n }\n return res.json();\n },\n retry: shouldRetryExtensionLoad,\n retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 4000),\n });\n\n toolRef.current = extension ?? null;\n\n useEffect(() => {\n if (!extension) return;\n const canonicalPath = extensionPath(extension.id, extension.name);\n if (titleSuffixRef.current === undefined) {\n titleSuffixRef.current = readExtensionTitleSuffix();\n }\n document.title = extensionDocumentTitle(\n extension.name,\n titleSuffixRef.current,\n );\n\n if (\n isExtensionPathname(location.pathname, extension.id) &&\n location.pathname !== canonicalPath\n ) {\n navigate(`${canonicalPath}${location.search}${location.hash}`, {\n replace: true,\n });\n }\n\n return applyCanonicalLink(canonicalPath);\n }, [extension, location.hash, location.pathname, location.search, navigate]);\n\n const iframeSrc = useMemo(\n () =>\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/render?dark=${document.documentElement.classList.contains(\"dark\")}&v=${encodeURIComponent(extension?.updatedAt ?? \"\")}&r=${refreshKey}`,\n ),\n [extensionId, extension?.updatedAt, refreshKey],\n );\n const iframeSrcDoc = useMemo(() => {\n if (!extension?.content || !isEmbedMcpChatBridgeActive()) return undefined;\n return buildExtensionViewerSrcDoc(extension, isDark);\n }, [extension, isDark]);\n\n useEffect(() => {\n setIframeReady(false);\n // Reset role to deny-by-default on every reload — the new render's\n // binding announcement re-establishes the role before any helper call.\n bridgeContextRef.current = { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n }, [extensionId, extension?.updatedAt, refreshKey]);\n\n const startRename = useCallback(() => {\n if (!extension) return;\n setRenameValue(extension.name);\n setIsRenaming(true);\n requestAnimationFrame(() => renameInputRef.current?.select());\n }, [extension]);\n\n const submitRename = useCallback(async () => {\n const trimmed = renameValue.trim();\n if (!trimmed || !extension || trimmed === extension.name) {\n setIsRenaming(false);\n return;\n }\n queryClient.setQueryData<Extension>([\"extension\", extensionId], (old) =>\n old ? { ...old, name: trimmed } : old,\n );\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).map((t) =>\n t.id === extensionId ? { ...t, name: trimmed } : t,\n ),\n );\n setIsRenaming(false);\n try {\n await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: trimmed }),\n });\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n }, [renameValue, extension, extensionId, queryClient]);\n\n if (isLoading || (!extension && isFetching)) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex h-12 items-center gap-2 px-3 border-b shrink-0\">\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n <div className=\"h-3.5 w-24 rounded bg-muted animate-pulse\" />\n </div>\n <div className=\"flex-1 bg-muted/20 animate-pulse\" />\n </div>\n );\n }\n\n if (!extension) {\n const status = extensionLoadErrorStatus(extensionError);\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {status === 403 ? \"Extension access denied\" : \"Extension not found\"}\n </div>\n );\n }\n\n const isLocalExtension = extension.source?.mode === \"local-files\";\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"flex h-12 shrink-0 items-center justify-between gap-3 border-b px-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <nav\n aria-label=\"Extension breadcrumb\"\n className=\"group/name flex min-w-0 items-center gap-1 text-sm\"\n >\n <Link\n to=\"/extensions\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n >\n Extensions\n </Link>\n <IconChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/60\" />\n {isRenaming ? (\n <input\n ref={renameInputRef}\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={submitRename}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitRename();\n if (e.key === \"Escape\") setIsRenaming(false);\n }}\n className=\"min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary\"\n />\n ) : (\n <>\n <span className=\"truncate text-sm font-medium\">\n {extension.name}\n </span>\n {extension.canEdit && !isLocalExtension && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={startRename}\n className=\"shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground\"\n >\n <IconPencil className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Rename</TooltipContent>\n </Tooltip>\n )}\n </>\n )}\n </nav>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setRefreshKey((k) => k + 1)}\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconRefresh className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Refresh</TooltipContent>\n </Tooltip>\n {!isLocalExtension && (\n <>\n <ExtensionHistoryPopover\n extensionId={extensionId}\n canEdit={extension.canEdit}\n onRestored={() => setRefreshKey((k) => k + 1)}\n onOpenChange={onPopoverOpenChange}\n />\n {extension.canEdit && (\n <SourceCodeDialog\n extension={extension}\n onSaved={() => setRefreshKey((k) => k + 1)}\n />\n )}\n <EditToolPopover\n extension={extension}\n onOpenChange={onPopoverOpenChange}\n />\n </>\n )}\n <ToolMoreMenu\n extensionId={extensionId}\n toolName={extension.name}\n canDelete={extension.canDelete}\n sourceMode={extension.source?.mode}\n onOpenChange={onPopoverOpenChange}\n />\n {!isLocalExtension && (\n <>\n <ShareButton\n resourceType=\"extension\"\n resourceId={extensionId}\n resourceTitle={extension.name}\n onOpenChange={onPopoverOpenChange}\n accessNote={\n <>\n Extensions can be shared inside your organization only —\n they run with the viewer's credentials, so cross-org\n access isn't supported.\n </>\n }\n />\n </>\n )}\n <AgentToggleButton />\n </div>\n </div>\n {isLocalExtension && (\n <div className=\"shrink-0 border-b bg-muted/30 px-4 py-2 text-xs text-muted-foreground\">\n Repo-backed extension. Edit{\" \"}\n <span className=\"font-mono text-foreground\">\n {extension.source?.entryPath ?? \"extensions/*/index.html\"}\n </span>{\" \"}\n in your workspace, then refresh this preview.\n </div>\n )}\n <div className=\"relative flex-1 min-h-0\">\n {!iframeReady && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background z-10\">\n <IconLoader2\n className=\"size-5 animate-spin text-muted-foreground\"\n role=\"status\"\n aria-label=\"Loading\"\n />\n </div>\n )}\n <iframe\n ref={iframeRef}\n key={`${extension.updatedAt}-${refreshKey}`}\n src={iframeSrcDoc ? undefined : iframeSrc}\n srcDoc={iframeSrcDoc}\n className=\"h-full w-full border-0\"\n sandbox=\"allow-scripts allow-forms\"\n title={extension.name}\n style={{\n pointerEvents: openPopoverCount > 0 ? \"none\" : \"auto\",\n }}\n onLoad={() => {\n sendThemeToIframe();\n setTimeout(() => setIframeReady(true), 150);\n }}\n />\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\ninterface SlotDeclaration {\n id: string;\n extensionId: string;\n slotId: string;\n}\n\nfunction ToolMoreMenu({\n extensionId,\n toolName,\n canDelete,\n sourceMode,\n onOpenChange,\n}: {\n extensionId: string;\n toolName: string;\n canDelete?: boolean;\n sourceMode?: \"database\" | \"local-files\";\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const queryClient = useQueryClient();\n const navigate = useNavigate();\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n const { data: slots = [] } = useQuery<SlotDeclaration[]>({\n queryKey: [\"extension-slots\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/slots/extension/${extensionId}`),\n );\n if (!res.ok) return [];\n return res.json();\n },\n enabled: open,\n });\n\n const closeMenu = () => {\n setOpenAndNotify(false);\n setConfirmingDelete(false);\n };\n\n const removeFromSlot = async (slotId: string) => {\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const deleteExtension = async () => {\n closeMenu();\n try {\n await deleteOrHideExtension({ id: extensionId, canDelete });\n invalidateExtensionRemoval(queryClient, extensionId);\n slots.forEach((s) =>\n queryClient.invalidateQueries({\n queryKey: [\"slot-installs\", s.slotId],\n }),\n );\n navigate(\"/extensions\");\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n }\n };\n const isLocalExtension = sourceMode === \"local-files\";\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpenAndNotify(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label=\"More options\"\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>More options</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-72 p-0\">\n {!confirmingDelete ? (\n <>\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">Appears in</p>\n {slots.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n Not installed in any widget areas. Ask the agent to add it\n somewhere.\n </p>\n ) : (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n This extension can render in {slots.length} widget area\n {slots.length === 1 ? \"\" : \"s\"}.\n </p>\n )}\n </div>\n {slots.length > 0 && (\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {slots.map((s) => (\n <div\n key={s.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-[12px]\"\n >\n <span className=\"flex-1 truncate font-mono text-[11px] text-muted-foreground\">\n {s.slotId}\n </span>\n {!isLocalExtension && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => removeFromSlot(s.slotId)}\n className=\"rounded p-1 text-muted-foreground/60 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label=\"Remove from this widget area\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Remove from this widget area (for me)\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n ))}\n </div>\n )}\n {isLocalExtension ? (\n <div className=\"border-t border-border/40 px-3 py-2 text-[11px] text-muted-foreground\">\n Slot targets and source edits are controlled by this extension's\n files.\n </div>\n ) : (\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>\n {canDelete === false\n ? \"Remove from my list...\"\n : \"Delete extension...\"}\n </span>\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex flex-col gap-2 p-3\">\n <p className=\"text-[12px]\">\n {canDelete === false ? \"Remove \" : \"Delete \"}\n <span className=\"font-medium\">{toolName}</span>?\n {canDelete === false\n ? \" This hides it from your Extensions list without deleting it for anyone else.\"\n : \" This removes the extension everywhere, for everyone it's shared with.\"}\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={deleteExtension}\n className=\"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\"\n >\n {canDelete === false ? \"Remove\" : \"Delete\"}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
1
+ {"version":3,"file":"ExtensionViewer.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconArrowBackUp,\n IconChevronRight,\n IconCode,\n IconDotsVertical,\n IconHistory,\n IconLoader2,\n IconPencil,\n IconRefresh,\n IconTrash,\n IconX,\n} from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState, useEffect, useRef, useCallback, useMemo } from \"react\";\nimport { Link, useLocation, useNavigate } from \"react-router\";\n\nimport { buildExtensionHtml } from \"../../extensions/html-shell.js\";\nimport { extensionPath, isExtensionPathname } from \"../../extensions/path.js\";\nimport { getThemeVars } from \"../../extensions/theme.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { AgentToggleButton } from \"../AgentPanel.js\";\nimport { agentNativePath, appPath } from \"../api-path.js\";\nimport { Dialog, DialogContent, DialogTitle } from \"../components/ui/dialog.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { PromptComposer } from \"../composer/PromptComposer.js\";\nimport { isEmbedMcpChatBridgeActive } from \"../embed-auth.js\";\nimport { ShareButton } from \"../sharing/ShareButton.js\";\nimport {\n deleteOrHideExtension,\n invalidateExtensionRemoval,\n} from \"./delete-extension.js\";\nimport {\n extensionLoadError,\n extensionLoadErrorStatus,\n shouldRetryExtensionLoad,\n} from \"./extension-load-error.js\";\nimport {\n isAllowedExtensionPath,\n sanitizeExtensionRequestOptions,\n checkBridgePolicy,\n type BridgePolicyContext,\n type ExtensionBridgeRole,\n} from \"./iframe-bridge.js\";\nimport { normalizeAgentNativeExtensionSandbox } from \"./portable-extension.js\";\n\nconst THEME_CSS_VARS = [\n \"--background\",\n \"--foreground\",\n \"--card\",\n \"--card-foreground\",\n \"--popover\",\n \"--popover-foreground\",\n \"--primary\",\n \"--primary-foreground\",\n \"--secondary\",\n \"--secondary-foreground\",\n \"--muted\",\n \"--muted-foreground\",\n \"--accent\",\n \"--accent-foreground\",\n \"--destructive\",\n \"--destructive-foreground\",\n \"--border\",\n \"--input\",\n \"--ring\",\n \"--radius\",\n \"--sidebar-background\",\n \"--sidebar-foreground\",\n \"--sidebar-primary\",\n \"--sidebar-primary-foreground\",\n \"--sidebar-accent\",\n \"--sidebar-accent-foreground\",\n \"--sidebar-border\",\n \"--sidebar-ring\",\n];\n\nconst EXTENSION_IFRAME_SANDBOX =\n normalizeAgentNativeExtensionSandbox(undefined);\n\nfunction getParentThemeVars(): Record<string, string> {\n const computed = getComputedStyle(document.documentElement);\n const vars: Record<string, string> = {};\n for (const name of THEME_CSS_VARS) {\n const val = computed.getPropertyValue(name).trim();\n if (val) vars[name] = val;\n }\n return vars;\n}\n\ninterface Extension {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n ownerEmail?: string;\n role?: ExtensionBridgeRole | null;\n canEdit?: boolean;\n canDelete?: boolean;\n source?: {\n mode?: \"database\" | \"local-files\";\n entryPath?: string;\n manifestPath?: string;\n permissions?: BridgePolicyContext[\"permissions\"];\n };\n}\n\nexport interface ExtensionViewerProps {\n extensionId: string;\n}\n\nfunction readExtensionTitleSuffix(): string | null {\n const current = typeof document !== \"undefined\" ? document.title.trim() : \"\";\n const match = current.match(/^(?:Extension|Tool)s?\\s+(?:\\u2014|-)\\s+(.+)$/);\n return match?.[1]?.trim() || null;\n}\n\nfunction extensionDocumentTitle(name: string, suffix: string | null): string {\n return suffix ? `${name} \\u2014 ${suffix}` : `${name} \\u2014 Extensions`;\n}\n\nfunction extensionRole(value: unknown): ExtensionBridgeRole {\n return value === \"owner\" ||\n value === \"admin\" ||\n value === \"editor\" ||\n value === \"viewer\"\n ? value\n : \"viewer\";\n}\n\nfunction serializeChatValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction buildExtensionViewerSrcDoc(\n extension: Extension,\n isDark: boolean,\n): string {\n const role = extensionRole(extension.role);\n return buildExtensionHtml(\n extension.content ?? \"\",\n getThemeVars(isDark),\n isDark,\n extension.id,\n {\n authorEmail: extension.ownerEmail ?? \"\",\n viewerEmail: \"\",\n isAuthor: role === \"owner\",\n role,\n source: extension.source?.mode,\n permissions: extension.source?.permissions,\n },\n );\n}\n\ninterface ExtensionHistoryEntry {\n id: string;\n extensionId: string;\n version: number;\n operation: string;\n summary: string;\n name: string;\n description: 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\ninterface ExtensionHistoryDiffLine {\n type: \"equal\" | \"insert\" | \"delete\";\n text: string;\n}\n\ninterface ExtensionHistoryDetail {\n entry: ExtensionHistoryEntry & { content?: string };\n previous: (ExtensionHistoryEntry & { content?: string }) | null;\n diff: ExtensionHistoryDiffLine[];\n stats: {\n addedLines: number;\n deletedLines: number;\n changed: boolean;\n };\n}\n\ntype CompactDiffLine =\n | ExtensionHistoryDiffLine\n | { type: \"omitted\"; count: number };\n\nfunction formatHistoryTime(value: string | undefined): string {\n if (!value) return \"\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return date.toLocaleString([], {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nfunction operationLabel(operation: string): string {\n switch (operation) {\n case \"create\":\n return \"Created\";\n case \"baseline\":\n return \"Baseline\";\n case \"metadata-update\":\n return \"Details\";\n case \"content-update\":\n return \"Content\";\n case \"restore\":\n return \"Restore\";\n default:\n return operation;\n }\n}\n\nfunction compactDiffLines(\n lines: ExtensionHistoryDiffLine[],\n context = 3,\n): CompactDiffLine[] {\n const result: CompactDiffLine[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if (line.type !== \"equal\") {\n result.push(line);\n i += 1;\n continue;\n }\n\n let end = i + 1;\n while (end < lines.length && lines[end].type === \"equal\") end += 1;\n const run = lines.slice(i, end);\n if (run.length > context * 2 + 1) {\n result.push(...run.slice(0, context));\n result.push({ type: \"omitted\", count: run.length - context * 2 });\n result.push(...run.slice(-context));\n } else {\n result.push(...run);\n }\n i = end;\n }\n return result;\n}\n\nfunction ExtensionUnavailableState({ status }: { status?: number }) {\n const sessionExpired = status === 401;\n const accessDenied = status === 403;\n const unavailable = status === 404;\n const title = sessionExpired\n ? \"Session expired\"\n : accessDenied\n ? \"Extension is not shared\"\n : unavailable\n ? \"Extension is unavailable\"\n : \"Extension not found\";\n const message = sessionExpired\n ? \"Sign in again to view this extension.\"\n : accessDenied\n ? \"You do not have access to this extension. Ask the owner to share it with your organization or open a different extension.\"\n : \"This extension may not be shared with you, may have been deleted, or is not available to your account.\";\n return (\n <div className=\"flex h-full min-h-[20rem] items-center justify-center bg-muted/20 p-6\">\n <div className=\"w-full max-w-md rounded-lg border border-border bg-background p-6 text-center shadow-sm\">\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n <p className=\"mt-2 text-sm leading-6 text-muted-foreground\">\n {message}\n </p>\n <Link\n to=\"/extensions\"\n className=\"mt-4 inline-flex h-9 items-center justify-center rounded-md border border-input px-3 text-sm font-medium text-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n Back to extensions\n </Link>\n </div>\n </div>\n );\n}\n\nfunction diffLineClass(line: CompactDiffLine): string {\n switch (line.type) {\n case \"insert\":\n return \"bg-primary/10 text-primary\";\n case \"delete\":\n return \"bg-destructive/10 text-destructive\";\n case \"omitted\":\n return \"bg-muted/60 text-muted-foreground\";\n default:\n return \"text-muted-foreground\";\n }\n}\n\nfunction diffLinePrefix(line: CompactDiffLine): string {\n switch (line.type) {\n case \"insert\":\n return \"+\";\n case \"delete\":\n return \"-\";\n case \"omitted\":\n return \"...\";\n default:\n return \" \";\n }\n}\n\nfunction applyCanonicalLink(path: string): () => void {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return () => {};\n }\n\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"canonical\"]');\n const created = !link;\n const previousHref = link?.getAttribute(\"href\") ?? null;\n const previousMarker = link?.dataset.agentNativeExtensionCanonical;\n\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"canonical\";\n document.head.appendChild(link);\n }\n\n link.dataset.agentNativeExtensionCanonical = \"true\";\n link.href = new URL(appPath(path), window.location.origin).toString();\n\n return () => {\n if (!link) return;\n if (created) {\n link.remove();\n return;\n }\n if (previousHref === null) {\n link.removeAttribute(\"href\");\n } else {\n link.href = previousHref;\n }\n if (previousMarker === undefined) {\n delete link.dataset.agentNativeExtensionCanonical;\n } else {\n link.dataset.agentNativeExtensionCanonical = previousMarker;\n }\n };\n}\n\nfunction SourceCodeDialog({\n extension,\n onSaved,\n}: {\n extension: Extension;\n onSaved?: () => void;\n}) {\n const queryClient = useQueryClient();\n const [open, setOpen] = useState(false);\n const [code, setCode] = useState(extension.content ?? \"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Sync in when the dialog opens, or when the viewed extension changes\n // while the dialog stays mounted (e.g. re-parented to a different id).\n useEffect(() => {\n if (open) setCode(extension.content ?? \"\");\n }, [open, extension.id]);\n\n const isDirty = code !== (extension.content ?? \"\");\n\n // Block Escape / outside-click from closing while there are unsaved edits.\n const handleOpenChange = (next: boolean) => {\n if (!next && isDirty) return;\n setOpen(next);\n if (!next) setError(null);\n };\n\n const handleCancel = () => {\n setCode(extension.content ?? \"\");\n setOpen(false);\n setError(null);\n };\n\n const handleSave = async () => {\n setSaving(true);\n setError(null);\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extension.id}`),\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ content: code }),\n },\n );\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error ?? `Save failed (${res.status})`);\n }\n setOpen(false);\n queryClient.setQueryData<Extension>([\"extension\", extension.id], (old) =>\n old ? { ...old, content: code } : old,\n );\n queryClient.invalidateQueries({\n queryKey: [\"extension\", extension.id],\n });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n onSaved?.();\n } catch (err: any) {\n setError(err?.message ?? \"Save failed\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconCode className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>View / edit source</TooltipContent>\n </Tooltip>\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent className=\"flex h-[85vh] w-[90vw] max-w-[900px] flex-col gap-0 overflow-hidden p-0\">\n <div className=\"flex shrink-0 items-center border-b border-border px-5 py-3 pr-12\">\n <DialogTitle className=\"truncate text-sm font-medium\">\n {extension.name} — source\n </DialogTitle>\n </div>\n <textarea\n className=\"flex-1 resize-none bg-muted/40 px-5 py-4 font-mono text-xs leading-relaxed text-foreground focus:outline-none\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n spellCheck={false}\n />\n <div className=\"flex shrink-0 items-center justify-between border-t border-border px-5 py-3\">\n {error ? (\n <p className=\"text-xs text-destructive\">{error}</p>\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n Alpine.js / HTML &middot; {code.length.toLocaleString()} chars\n </span>\n )}\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md border border-input px-3 text-xs hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className=\"inline-flex h-8 cursor-pointer items-center rounded-md bg-primary px-4 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n\nfunction EditToolPopover({\n extension,\n onOpenChange,\n}: {\n extension: Extension;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n // Radix's outside-click detection runs in the parent document, so a click\n // inside the extension iframe (or any other iframe) never fires it. The browser\n // does shift focus to the iframe though, which blurs the parent window — we\n // hook that to close the popover so it behaves like a normal click-outside.\n useEffect(() => {\n if (!open) return;\n const handleBlur = () => {\n // Defer until after the focus actually lands so document.activeElement\n // reflects the iframe (or whatever the user clicked on).\n setTimeout(() => {\n if (document.activeElement?.tagName === \"IFRAME\")\n setOpenAndNotify(false);\n }, 0);\n };\n window.addEventListener(\"blur\", handleBlur);\n return () => window.removeEventListener(\"blur\", handleBlur);\n }, [open]);\n\n const handleSubmit = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n sendToAgentChat({\n message: `Update extension \"${extension.name}\" (${extension.id}): ${trimmed}`,\n context: [\n `The user is viewing extension \"${extension.name}\" (id: ${extension.id}) and wants to edit it.`,\n \"This is an existing sandboxed Alpine.js extension stored in SQL. Use list-extensions/update-extension for this extension id.\",\n \"Do not call connect-builder and do not route this to a source-code change flow.\",\n ].join(\"\\n\"),\n submit: true,\n openSidebar: true,\n newTab: true,\n });\n setOpenAndNotify(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpenAndNotify}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconPencil className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>Edit</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={6} className=\"w-[420px] p-3\">\n <p className=\"px-1 pb-2 text-sm font-semibold text-foreground\">\n Edit extension\n </p>\n <PromptComposer\n autoFocus\n placeholder=\"What would you like to change?\"\n draftScope={`extensions:edit:${extension.id}`}\n onSubmit={handleSubmit}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ExtensionHistoryPopover({\n extensionId,\n canEdit,\n onRestored,\n onOpenChange,\n}: {\n extensionId: string;\n canEdit?: boolean;\n onRestored?: () => void;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [selectedVersion, setSelectedVersion] = useState<number | null>(null);\n const [restoringVersion, setRestoringVersion] = useState<number | null>(null);\n const queryClient = useQueryClient();\n\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n const historyQuery = useQuery<{ history: ExtensionHistoryEntry[] }>({\n queryKey: [\"extension-history\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}/history`),\n { cache: \"no-store\" },\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension history\");\n return res.json();\n },\n enabled: open,\n });\n\n const history = historyQuery.data?.history ?? [];\n useEffect(() => {\n if (!open || history.length === 0) return;\n if (\n !selectedVersion ||\n !history.some((h) => h.version === selectedVersion)\n ) {\n setSelectedVersion(history[0].version);\n }\n }, [history, open, selectedVersion]);\n\n const detailQuery = useQuery<ExtensionHistoryDetail>({\n queryKey: [\"extension-history-detail\", extensionId, selectedVersion],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/history/${selectedVersion}`,\n ),\n { cache: \"no-store\" },\n );\n if (!res.ok) throw new Error(\"Failed to fetch extension history version\");\n return res.json();\n },\n enabled: open && selectedVersion !== null,\n });\n\n const latestVersion = history[0]?.version ?? null;\n const selectedEntry =\n history.find((entry) => entry.version === selectedVersion) ?? history[0];\n const canRestoreSelected =\n !!canEdit &&\n !!selectedEntry?.persisted &&\n selectedEntry.version !== latestVersion;\n\n const restoreSelected = async () => {\n if (!selectedEntry || !canRestoreSelected) return;\n setRestoringVersion(selectedEntry.version);\n try {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/history/${selectedEntry.version}/restore`,\n ),\n { method: \"POST\" },\n );\n if (!res.ok) throw new Error(\"Failed to restore extension version\");\n await Promise.all([\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] }),\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] }),\n queryClient.invalidateQueries({\n queryKey: [\"extension-history\", extensionId],\n }),\n queryClient.invalidateQueries({\n queryKey: [\"extension-history-detail\", extensionId],\n }),\n ]);\n onRestored?.();\n } finally {\n setRestoringVersion(null);\n }\n };\n\n const compactedDiff = compactDiffLines(detailQuery.data?.diff ?? []);\n\n return (\n <Popover open={open} onOpenChange={setOpenAndNotify}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label=\"History\"\n >\n <IconHistory className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>History</TooltipContent>\n </Tooltip>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className=\"w-[42rem] max-w-[calc(100vw-2rem)] p-0\"\n >\n <div className=\"grid max-h-[72vh] min-h-[24rem] grid-cols-1 overflow-hidden sm:grid-cols-[15rem_minmax(0,1fr)]\">\n <div className=\"border-b border-border/60 sm:border-b-0 sm:border-r\">\n <div className=\"border-b border-border/60 px-3 py-2\">\n <p className=\"text-sm font-semibold text-foreground\">History</p>\n <p className=\"text-[11px] text-muted-foreground\">\n Snapshots are saved when extensions change.\n </p>\n </div>\n <div className=\"max-h-56 overflow-y-auto p-1 sm:max-h-[calc(72vh-3.5rem)]\">\n {historyQuery.isLoading ? (\n <div className=\"flex items-center gap-2 px-2 py-3 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Loading history\n </div>\n ) : history.length === 0 ? (\n <p className=\"px-2 py-3 text-xs text-muted-foreground\">\n No history yet.\n </p>\n ) : (\n history.map((entry) => (\n <button\n key={`${entry.id}-${entry.version}`}\n type=\"button\"\n onClick={() => setSelectedVersion(entry.version)}\n className={`flex w-full flex-col gap-0.5 rounded-md px-2 py-2 text-left text-xs hover:bg-accent ${\n entry.version === selectedVersion\n ? \"bg-accent text-accent-foreground\"\n : \"text-foreground\"\n }`}\n >\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">\n Version {entry.version}\n </span>\n <span className=\"text-[10px] text-muted-foreground\">\n {operationLabel(entry.operation)}\n </span>\n </span>\n <span className=\"line-clamp-2 text-[11px] text-muted-foreground\">\n {entry.summary || \"Saved version\"}\n </span>\n <span className=\"text-[10px] text-muted-foreground/80\">\n {formatHistoryTime(entry.createdAt)}\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n\n <div className=\"flex min-h-0 flex-col\">\n <div className=\"flex items-start justify-between gap-3 border-b border-border/60 px-3 py-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold text-foreground\">\n {selectedEntry\n ? `Version ${selectedEntry.version}`\n : \"Select a version\"}\n </p>\n <p className=\"truncate text-[11px] text-muted-foreground\">\n {selectedEntry?.summary ?? \"Compare saved extension content\"}\n </p>\n </div>\n <button\n type=\"button\"\n disabled={!canRestoreSelected || restoringVersion !== null}\n onClick={restoreSelected}\n className=\"inline-flex shrink-0 items-center gap-1.5 rounded-md border border-border px-2 py-1 text-[11px] font-medium text-foreground hover:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n >\n {restoringVersion === selectedEntry?.version ? (\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n )}\n Restore\n </button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto bg-muted/20\">\n {detailQuery.isLoading ? (\n <div className=\"flex h-full items-center justify-center gap-2 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Loading diff\n </div>\n ) : detailQuery.isError ? (\n <div className=\"p-4 text-xs text-destructive\">\n Could not load this version.\n </div>\n ) : compactedDiff.length === 0 ? (\n <div className=\"p-4 text-xs text-muted-foreground\">\n No content changes in this version.\n </div>\n ) : (\n <pre className=\"min-w-full text-[11px] leading-5\">\n {compactedDiff.map((line, index) => (\n <div\n key={index}\n className={`grid grid-cols-[2rem_minmax(0,1fr)] px-2 ${diffLineClass(line)}`}\n >\n <span className=\"select-none text-right font-mono opacity-70\">\n {diffLinePrefix(line)}\n </span>\n <span className=\"whitespace-pre-wrap break-words pl-3 font-mono\">\n {line.type === \"omitted\"\n ? `${line.count} unchanged lines`\n : line.text}\n </span>\n </div>\n ))}\n </pre>\n )}\n </div>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function ExtensionViewer({ extensionId }: ExtensionViewerProps) {\n const location = useLocation();\n const navigate = useNavigate();\n const [isDark, setIsDark] = useState(false);\n const [iframeReady, setIframeReady] = useState(false);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const toolRef = useRef<Extension | null>(null);\n const [isRenaming, setIsRenaming] = useState(false);\n const [renameValue, setRenameValue] = useState(\"\");\n const [refreshKey, setRefreshKey] = useState(0);\n const renameInputRef = useRef<HTMLInputElement | null>(null);\n const titleSuffixRef = useRef<string | null | undefined>(undefined);\n // Tracks how many toolbar popovers are open. Iframes capture pointer events\n // from areas they visually overlap, so when a popover opens above the iframe,\n // hover and click on the popover items get swallowed by the iframe. Disabling\n // pointer-events on the iframe while any popover is open lets the popover\n // receive its own events. Each popover increments on open / decrements on\n // close, so concurrent popovers (rare) compose correctly.\n const [openPopoverCount, setOpenPopoverCount] = useState(0);\n const onPopoverOpenChange = useCallback((open: boolean) => {\n setOpenPopoverCount((c) => Math.max(0, c + (open ? 1 : -1)));\n }, []);\n const queryClient = useQueryClient();\n // (audit H4) Role plumbed through from the iframe's render binding. Until\n // the iframe announces its role we deny non-trivial helper calls — that\n // way a malicious extension body that races the announcement can't briefly\n // operate at higher privilege than the viewer's actual role.\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: \"viewer\",\n isAuthor: false,\n });\n // (audit H4) Latch the render binding once per iframe instance; later\n // announcements are attacker-controllable and must be ignored.\n const bindingLatchedRef = useRef(false);\n\n useEffect(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n\n const observer = new MutationObserver(() => {\n setIsDark(document.documentElement.classList.contains(\"dark\"));\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const sendThemeToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n {\n type: \"agent-native-theme-update\",\n isDark: document.documentElement.classList.contains(\"dark\"),\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n if (!iframeReady) return;\n sendThemeToIframe();\n }, [isDark, iframeReady]);\n\n useEffect(() => {\n const handleMessage = async (event: MessageEvent) => {\n if (event.source !== iframeRef.current?.contentWindow) return;\n const message = event.data;\n if (!message) return;\n\n if (message.type === \"agent-native-extension-binding\") {\n // (audit H4) Trust only the FIRST announcement: the shell sends the\n // server-resolved binding BEFORE user-authored content runs. Later\n // announcements share the iframe realm with user code and could forge\n // an owner role, so they are ignored.\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = message.binding ?? {};\n const role: ExtensionBridgeRole =\n binding.role === \"owner\" ||\n binding.role === \"admin\" ||\n binding.role === \"editor\" ||\n binding.role === \"viewer\"\n ? binding.role\n : \"viewer\";\n bridgeContextRef.current = {\n role,\n isAuthor: !!binding.isAuthor,\n source: binding.source === \"local-files\" ? \"local-files\" : \"database\",\n permissions:\n binding && typeof binding.permissions === \"object\"\n ? binding.permissions\n : undefined,\n };\n return;\n }\n\n if (\n message.type === \"agent-native-extension-consent-granted\" ||\n message.type === \"agent-native-extension-consent-cancelled\"\n ) {\n // (audit C1) The consent stub fired; force a reload of the iframe so\n // the next render returns the extension body (granted) or stays on the\n // stub (cancelled — viewer can also navigate away).\n if (message.type === \"agent-native-extension-consent-granted\") {\n // Invalidate the cached extension record — author may have edited\n // since the cache was warmed.\n queryClient.invalidateQueries({\n queryKey: [\"extension\", extensionId],\n });\n setRefreshKey((k) => k + 1);\n }\n return;\n }\n\n if (message.type === \"agent-native-send-to-chat\") {\n const text = serializeChatValue(message.message);\n if (!text?.trim()) return;\n sendToAgentChat({\n message: text,\n context: serializeChatValue(message.context),\n submit: message.submit !== false,\n openSidebar: message.openSidebar !== false,\n });\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: message.key,\n code: message.code,\n metaKey: !!message.metaKey,\n ctrlKey: !!message.ctrlKey,\n shiftKey: !!message.shiftKey,\n altKey: !!message.altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const t = toolRef.current;\n if (!t) return;\n const errors: string[] = message.errors || [];\n const errorDetails: Array<{ message: string; stack: string }> =\n message.errorDetails || [];\n const consoleLogs: Array<{ level: string; message: string }> =\n message.consoleLogs || [];\n const networkLogs: Array<{\n path: string;\n method: string;\n ok?: boolean;\n status?: number;\n error?: string;\n }> = message.networkLogs || [];\n\n const detailedTrace = errorDetails\n .map((e) => (e.stack ? `${e.message}\\n${e.stack}` : e.message))\n .join(\"\\n\\n\");\n\n // Force a fresh read from the server. toolRef.current is bound to the\n // React Query cache, which is the same state the agent's previous\n // (broken) turn just wrote — without this, Fix-in-same-chat ends up\n // patching the agent's prior attempt from chat history instead of the\n // current DB row, which is why users had to open a new chat to\n // recover. Cache-bust so we never read a stale fetch.\n let freshContent: string | undefined;\n try {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${t.id}`),\n { cache: \"no-store\" },\n );\n if (res.ok) {\n const fresh = (await res.json()) as Extension;\n freshContent =\n typeof fresh?.content === \"string\" ? fresh.content : undefined;\n }\n } catch {\n // Fall through with the cached value — agent can still re-read via\n // its get-extension tool.\n }\n\n const contextParts = [\n `The user is viewing extension \"${t.name}\" (id: ${t.id}) and there are runtime errors that need fixing.`,\n `\\nFull error details:\\n${detailedTrace}`,\n ];\n\n if (consoleLogs.length > 0) {\n const consoleStr = consoleLogs\n .map((l) => `[${l.level}] ${l.message}`)\n .join(\"\\n\");\n contextParts.push(`\\nRecent console output:\\n${consoleStr}`);\n }\n\n if (networkLogs.length > 0) {\n const netStr = networkLogs\n .map(\n (l) =>\n `${l.method} ${l.path} → ${l.ok ? l.status : \"FAILED: \" + (l.error || l.status)}`,\n )\n .join(\"\\n\");\n contextParts.push(`\\nRecent network requests:\\n${netStr}`);\n }\n\n if (freshContent) {\n contextParts.push(\n `\\nCurrent extension content (just re-read from the database — this is the authoritative source, not anything you may have written in a previous turn):\\n\\`\\`\\`html\\n${freshContent}\\n\\`\\`\\``,\n );\n }\n\n sendToAgentChat({\n message: `Fix runtime errors in this extension. The content snapshot below was just re-read from the database — treat it as authoritative and ignore any prior version you may have generated in this chat. If in doubt, call get-extension first.\\n\\nErrors:\\n${errors.join(\"\\n\")}`,\n context: contextParts.join(\"\\n\"),\n submit: true,\n openSidebar: true,\n });\n return;\n }\n\n if (message.type !== \"agent-native-extension-request\") return;\n\n const requestId = String(message.requestId ?? \"\");\n const path = String(message.path ?? \"\");\n const respond = (payload: Record<string, unknown>) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n type: \"agent-native-extension-response\",\n requestId,\n ...payload,\n },\n \"*\",\n );\n };\n\n if (!requestId || !isAllowedExtensionPath(path, extensionId)) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(message.options);\n // (audit H4) Role-aware policy gate: viewer-shared extensions can read\n // but not write. Decided here in the parent before the request\n // leaves; the server enforces a second layer.\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId,\n });\n if (!policy.ok) {\n respond({\n response: {\n ok: false,\n status: 403,\n statusText: \"Forbidden\",\n body: { error: policy.error },\n },\n });\n return;\n }\n // (audit H5) Tag every outbound bridge request with the\n // X-Agent-Native-Extension-Bridge sentinel so the action-routes layer can\n // enforce per-action `toolCallable` opt-in. The header is added by\n // the parent — it is NOT taken from the iframe-supplied options\n // (which were filtered by sanitizeExtensionRequestOptions).\n const finalHeaders = new Headers(options.headers ?? undefined);\n finalHeaders.set(\"X-Agent-Native-Extension-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Extension-Id\", extensionId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", extensionId);\n const res = await fetch(agentNativePath(path), {\n ...options,\n headers: finalHeaders,\n credentials: \"same-origin\",\n });\n const text = await res.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n respond({\n response: {\n ok: res.ok,\n status: res.status,\n statusText: res.statusText,\n body,\n },\n });\n } catch (err: any) {\n respond({ error: err?.message ?? \"Extension host request failed\" });\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [extensionId, queryClient]);\n\n const {\n data: extension,\n error: extensionError,\n failureReason: extensionFailureReason,\n isFetching,\n isLoading,\n } = useQuery<Extension>({\n queryKey: [\"extension\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/extensions/${extensionId}`),\n );\n if (res.status === 401) {\n throw extensionLoadError(401, \"Session expired\");\n }\n if (res.status === 404) {\n throw extensionLoadError(404, \"Extension not found\");\n }\n if (res.status === 403) {\n throw extensionLoadError(403, \"Extension access denied\");\n }\n if (!res.ok) {\n throw extensionLoadError(res.status, \"Failed to fetch extension\");\n }\n return res.json();\n },\n retry: shouldRetryExtensionLoad,\n retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 4000),\n refetchOnMount: \"always\",\n });\n\n toolRef.current = extension ?? null;\n\n useEffect(() => {\n if (!extension) return;\n const canonicalPath = extensionPath(extension.id, extension.name);\n if (titleSuffixRef.current === undefined) {\n titleSuffixRef.current = readExtensionTitleSuffix();\n }\n document.title = extensionDocumentTitle(\n extension.name,\n titleSuffixRef.current,\n );\n\n if (\n isExtensionPathname(location.pathname, extension.id) &&\n location.pathname !== canonicalPath\n ) {\n navigate(`${canonicalPath}${location.search}${location.hash}`, {\n replace: true,\n });\n }\n\n return applyCanonicalLink(canonicalPath);\n }, [extension, location.hash, location.pathname, location.search, navigate]);\n\n const iframeSrc = useMemo(\n () =>\n agentNativePath(\n `/_agent-native/extensions/${extensionId}/render?dark=${document.documentElement.classList.contains(\"dark\")}&v=${encodeURIComponent(extension?.updatedAt ?? \"\")}&r=${refreshKey}`,\n ),\n [extensionId, extension?.updatedAt, refreshKey],\n );\n const iframeSrcDoc = useMemo(() => {\n if (!extension?.content || !isEmbedMcpChatBridgeActive()) return undefined;\n return buildExtensionViewerSrcDoc(extension, isDark);\n }, [extension, isDark]);\n const unavailableStatus = extensionLoadErrorStatus(\n extensionError ?? extensionFailureReason,\n );\n const latestFetchDenied =\n unavailableStatus === 401 ||\n unavailableStatus === 403 ||\n unavailableStatus === 404;\n\n useEffect(() => {\n setIframeReady(false);\n // Reset role to deny-by-default on every reload — the new render's\n // binding announcement re-establishes the role before any helper call.\n bridgeContextRef.current = { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n }, [extensionId, extension?.updatedAt, refreshKey]);\n\n const startRename = useCallback(() => {\n if (!extension) return;\n setRenameValue(extension.name);\n setIsRenaming(true);\n requestAnimationFrame(() => renameInputRef.current?.select());\n }, [extension]);\n\n const submitRename = useCallback(async () => {\n const trimmed = renameValue.trim();\n if (!trimmed || !extension || trimmed === extension.name) {\n setIsRenaming(false);\n return;\n }\n queryClient.setQueryData<Extension>([\"extension\", extensionId], (old) =>\n old ? { ...old, name: trimmed } : old,\n );\n queryClient.setQueryData<Extension[]>([\"extensions\"], (old) =>\n (old ?? []).map((t) =>\n t.id === extensionId ? { ...t, name: trimmed } : t,\n ),\n );\n setIsRenaming(false);\n try {\n await fetch(agentNativePath(`/_agent-native/extensions/${extensionId}`), {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name: trimmed }),\n });\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n queryClient.invalidateQueries({ queryKey: [\"extensions\"] });\n }\n }, [renameValue, extension, extensionId, queryClient]);\n\n if (isLoading || (!extension && isFetching)) {\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex h-12 items-center gap-2 px-3 border-b shrink-0\">\n <div className=\"h-3.5 w-3.5 rounded bg-muted animate-pulse\" />\n <div className=\"h-3.5 w-24 rounded bg-muted animate-pulse\" />\n </div>\n <div className=\"flex-1 bg-muted/20 animate-pulse\" />\n </div>\n );\n }\n\n if (latestFetchDenied || !extension) {\n return <ExtensionUnavailableState status={unavailableStatus} />;\n }\n\n const isLocalExtension = extension.source?.mode === \"local-files\";\n\n return (\n <TooltipProvider delayDuration={200}>\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"flex h-12 shrink-0 items-center justify-between gap-3 border-b px-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n <nav\n aria-label=\"Extension breadcrumb\"\n className=\"group/name flex min-w-0 items-center gap-1 text-sm\"\n >\n <Link\n to=\"/extensions\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n >\n Extensions\n </Link>\n <IconChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/60\" />\n {isRenaming ? (\n <input\n ref={renameInputRef}\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={submitRename}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") submitRename();\n if (e.key === \"Escape\") setIsRenaming(false);\n }}\n className=\"min-w-0 bg-transparent px-0 py-0 text-sm font-medium outline-none border-b border-primary\"\n />\n ) : (\n <>\n <span className=\"truncate text-sm font-medium\">\n {extension.name}\n </span>\n {extension.canEdit && !isLocalExtension && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={startRename}\n className=\"shrink-0 cursor-pointer rounded p-0.5 text-muted-foreground/40 opacity-0 group-hover/name:opacity-100 hover:text-foreground\"\n >\n <IconPencil className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Rename</TooltipContent>\n </Tooltip>\n )}\n </>\n )}\n </nav>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setRefreshKey((k) => k + 1)}\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n <IconRefresh className=\"h-4 w-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>Refresh</TooltipContent>\n </Tooltip>\n {!isLocalExtension && (\n <>\n <ExtensionHistoryPopover\n extensionId={extensionId}\n canEdit={extension.canEdit}\n onRestored={() => setRefreshKey((k) => k + 1)}\n onOpenChange={onPopoverOpenChange}\n />\n {extension.canEdit && (\n <SourceCodeDialog\n extension={extension}\n onSaved={() => setRefreshKey((k) => k + 1)}\n />\n )}\n <EditToolPopover\n extension={extension}\n onOpenChange={onPopoverOpenChange}\n />\n </>\n )}\n <ToolMoreMenu\n extensionId={extensionId}\n toolName={extension.name}\n canDelete={extension.canDelete}\n sourceMode={extension.source?.mode}\n onOpenChange={onPopoverOpenChange}\n />\n {!isLocalExtension && (\n <>\n <ShareButton\n resourceType=\"extension\"\n resourceId={extensionId}\n resourceTitle={extension.name}\n onOpenChange={onPopoverOpenChange}\n accessNote={\n <>\n Extensions can be shared inside your organization only —\n they run with the viewer's credentials, so cross-org\n access isn't supported.\n </>\n }\n />\n </>\n )}\n <AgentToggleButton />\n </div>\n </div>\n {isLocalExtension && (\n <div className=\"shrink-0 border-b bg-muted/30 px-4 py-2 text-xs text-muted-foreground\">\n Repo-backed extension. Edit{\" \"}\n <span className=\"font-mono text-foreground\">\n {extension.source?.entryPath ?? \"extensions/*/index.html\"}\n </span>{\" \"}\n in your workspace, then refresh this preview.\n </div>\n )}\n <div className=\"relative flex-1 min-h-0\">\n {!iframeReady && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-background z-10\">\n <IconLoader2\n className=\"size-5 animate-spin text-muted-foreground\"\n role=\"status\"\n aria-label=\"Loading\"\n />\n </div>\n )}\n <iframe\n ref={iframeRef}\n key={`${extension.updatedAt}-${refreshKey}`}\n src={iframeSrcDoc ? undefined : iframeSrc}\n srcDoc={iframeSrcDoc}\n className=\"h-full w-full border-0\"\n sandbox={EXTENSION_IFRAME_SANDBOX}\n title={extension.name}\n style={{\n pointerEvents: openPopoverCount > 0 ? \"none\" : \"auto\",\n }}\n onLoad={() => {\n sendThemeToIframe();\n setTimeout(() => setIframeReady(true), 150);\n }}\n />\n </div>\n </div>\n </TooltipProvider>\n );\n}\n\ninterface SlotDeclaration {\n id: string;\n extensionId: string;\n slotId: string;\n}\n\nfunction ToolMoreMenu({\n extensionId,\n toolName,\n canDelete,\n sourceMode,\n onOpenChange,\n}: {\n extensionId: string;\n toolName: string;\n canDelete?: boolean;\n sourceMode?: \"database\" | \"local-files\";\n onOpenChange?: (open: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const queryClient = useQueryClient();\n const navigate = useNavigate();\n const setOpenAndNotify = (v: boolean) => {\n setOpen(v);\n onOpenChange?.(v);\n };\n\n const { data: slots = [] } = useQuery<SlotDeclaration[]>({\n queryKey: [\"extension-slots\", extensionId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(`/_agent-native/slots/extension/${extensionId}`),\n );\n if (!res.ok) return [];\n return res.json();\n },\n enabled: open,\n });\n\n const closeMenu = () => {\n setOpenAndNotify(false);\n setConfirmingDelete(false);\n };\n\n const removeFromSlot = async (slotId: string) => {\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install/${encodeURIComponent(extensionId)}`,\n ),\n { method: \"DELETE\" },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const deleteExtension = async () => {\n closeMenu();\n try {\n await deleteOrHideExtension({ id: extensionId, canDelete });\n invalidateExtensionRemoval(queryClient, extensionId);\n slots.forEach((s) =>\n queryClient.invalidateQueries({\n queryKey: [\"slot-installs\", s.slotId],\n }),\n );\n navigate(\"/extensions\");\n } catch {\n queryClient.invalidateQueries({ queryKey: [\"extension\", extensionId] });\n }\n };\n const isLocalExtension = sourceMode === \"local-files\";\n\n return (\n <Popover\n open={open}\n onOpenChange={(o) => {\n setOpenAndNotify(o);\n if (!o) setConfirmingDelete(false);\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center rounded-md h-8 w-8 text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n aria-label=\"More options\"\n >\n <IconDotsVertical className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>More options</TooltipContent>\n </Tooltip>\n <PopoverContent align=\"end\" sideOffset={4} className=\"w-72 p-0\">\n {!confirmingDelete ? (\n <>\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">Appears in</p>\n {slots.length === 0 ? (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n Not installed in any widget areas. Ask the agent to add it\n somewhere.\n </p>\n ) : (\n <p className=\"text-[11px] text-muted-foreground/70 mt-0.5\">\n This extension can render in {slots.length} widget area\n {slots.length === 1 ? \"\" : \"s\"}.\n </p>\n )}\n </div>\n {slots.length > 0 && (\n <div className=\"max-h-48 overflow-y-auto py-1\">\n {slots.map((s) => (\n <div\n key={s.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-[12px]\"\n >\n <span className=\"flex-1 truncate font-mono text-[11px] text-muted-foreground\">\n {s.slotId}\n </span>\n {!isLocalExtension && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => removeFromSlot(s.slotId)}\n className=\"rounded p-1 text-muted-foreground/60 hover:bg-accent hover:text-foreground cursor-pointer\"\n aria-label=\"Remove from this widget area\"\n >\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n Remove from this widget area (for me)\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n ))}\n </div>\n )}\n {isLocalExtension ? (\n <div className=\"border-t border-border/40 px-3 py-2 text-[11px] text-muted-foreground\">\n Slot targets and source edits are controlled by this extension's\n files.\n </div>\n ) : (\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(true)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-[12px] text-destructive hover:bg-destructive/10 cursor-pointer text-left\"\n >\n <IconTrash className=\"h-3.5 w-3.5\" />\n <span>\n {canDelete === false\n ? \"Remove from my list...\"\n : \"Delete extension...\"}\n </span>\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"flex flex-col gap-2 p-3\">\n <p className=\"text-[12px]\">\n {canDelete === false ? \"Remove \" : \"Delete \"}\n <span className=\"font-medium\">{toolName}</span>?\n {canDelete === false\n ? \" This hides it from your Extensions list without deleting it for anyone else.\"\n : \" This removes the extension everywhere, for everyone it's shared with.\"}\n </p>\n <div className=\"flex justify-end gap-1\">\n <button\n type=\"button\"\n onClick={() => setConfirmingDelete(false)}\n className=\"rounded-md px-2 py-1 text-[12px] hover:bg-accent cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={deleteExtension}\n className=\"rounded-md bg-destructive px-2 py-1 text-[12px] text-destructive-foreground hover:bg-destructive/90 cursor-pointer\"\n >\n {canDelete === false ? \"Remove\" : \"Delete\"}\n </button>\n </div>\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"InlineExtensionFrame.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/InlineExtensionFrame.tsx"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,oBAAoB,CAAC;AAiC5B,UAAU,qBAAqB;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAClC,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACjC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAmPD,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,SAAS,EAAE,iBAAiB,EAC5B,MAA4B,EAC5B,OAAO,EACP,SAAS,EACT,aAAmB,GACpB,EAAE,yBAAyB,sCAgV3B"}
1
+ {"version":3,"file":"InlineExtensionFrame.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/InlineExtensionFrame.tsx"],"names":[],"mappings":"AAMA,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,oBAAoB,CAAC;AAqC5B,UAAU,qBAAqB;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAClC,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;IACjC,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAmPD,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,SAAS,EAAE,iBAAiB,EAC5B,MAA4B,EAC5B,OAAO,EACP,SAAS,EACT,aAAmB,GACpB,EAAE,yBAAyB,sCAgV3B"}