@agent-native/core 0.92.0 → 0.92.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +14 -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/client/AssistantChat.tsx +27 -14
  6. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  7. package/corpus/core/src/client/agent-chat-adapter.ts +37 -10
  8. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  9. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  10. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  11. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  12. package/corpus/core/src/client/error-capture.ts +69 -7
  13. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  14. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  15. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  16. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  17. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  18. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  19. package/corpus/core/src/client/settings/SettingsPanel.tsx +205 -52
  20. package/corpus/core/src/client/settings/SettingsSection.tsx +8 -1
  21. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  22. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  23. package/corpus/core/src/db-admin/operations.ts +116 -4
  24. package/corpus/core/src/db-admin/routes.ts +1 -0
  25. package/corpus/core/src/db-admin/types.ts +4 -0
  26. package/corpus/core/src/extensions/html-shell.ts +5 -4
  27. package/corpus/core/src/extensions/routes.ts +10 -0
  28. package/corpus/core/src/navigation/index.ts +1 -1
  29. package/corpus/core/src/resources/handlers.ts +10 -8
  30. package/corpus/core/src/server/poll.ts +293 -8
  31. package/corpus/core/src/styles/agent-native.css +27 -0
  32. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  33. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  34. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  35. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  36. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  37. package/corpus/core/src/templates/default/AGENTS.md +4 -2
  38. package/corpus/core/src/templates/headless/AGENTS.md +4 -0
  39. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  40. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  41. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  42. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  43. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  44. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  45. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  47. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  48. package/corpus/core/src/templates/workspace-root/AGENTS.md +7 -1
  49. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  50. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  51. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  52. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  53. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  54. package/corpus/templates/analytics/AGENTS.md +33 -14
  55. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  56. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  57. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  58. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  59. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  60. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  61. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  62. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  63. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  64. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  65. package/corpus/templates/analytics/actions/save-monitor.ts +1 -1
  66. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  67. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  68. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  69. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  70. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  71. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  72. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  73. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  74. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  75. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  76. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  77. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  78. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  79. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  80. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  82. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  83. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  84. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  85. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  86. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  87. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  88. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +6 -3
  89. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +26 -30
  90. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  91. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  92. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  93. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  98. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  99. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  100. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  101. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  102. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  103. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  104. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  105. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  106. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  107. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  108. package/corpus/templates/analytics/server/db/schema-monitoring.ts +1 -1
  109. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  110. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  111. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  112. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  113. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  114. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +5 -4
  115. package/corpus/templates/analytics/server/plugins/db.ts +112 -2
  116. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  117. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  118. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  119. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  120. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  121. package/corpus/templates/assets/AGENTS.md +4 -0
  122. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  123. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  124. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  125. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  126. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  127. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  128. package/corpus/templates/brain/AGENTS.md +4 -0
  129. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  130. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  131. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  132. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  133. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  134. package/corpus/templates/calendar/AGENTS.md +4 -0
  135. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  136. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  137. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  138. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  139. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  140. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  141. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  142. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  143. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  144. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  145. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  146. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  147. package/corpus/templates/chat/AGENTS.md +4 -0
  148. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  149. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  150. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  151. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  152. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  153. package/corpus/templates/clips/AGENTS.md +4 -0
  154. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  155. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  156. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  157. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  158. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  159. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  160. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  161. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  162. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  163. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  164. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  165. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  166. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  167. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  168. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  169. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  170. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  171. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  172. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  173. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  175. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  176. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  177. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  178. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  179. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  180. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  181. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  182. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  183. package/corpus/templates/content/AGENTS.md +4 -0
  184. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  185. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  186. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  187. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  188. package/corpus/templates/design/AGENTS.md +4 -0
  189. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  190. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  191. package/corpus/templates/design/app/routes/team.tsx +1 -1
  192. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  193. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  194. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  195. package/corpus/templates/dispatch/AGENTS.md +4 -0
  196. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  197. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  198. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  199. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  200. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  201. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  203. package/corpus/templates/forms/AGENTS.md +4 -0
  204. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  205. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  206. package/corpus/templates/forms/shared/navigation.ts +1 -1
  207. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  208. package/corpus/templates/macros/AGENTS.md +4 -0
  209. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  210. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  211. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  212. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  213. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  214. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  215. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  216. package/corpus/templates/mail/AGENTS.md +4 -0
  217. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  218. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  219. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  220. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  221. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  222. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  223. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  224. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  225. package/corpus/templates/plan/AGENTS.md +4 -0
  226. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  227. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  228. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  229. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  230. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  231. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  232. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  233. package/corpus/templates/slides/AGENTS.md +4 -0
  234. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  235. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  236. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  237. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  238. package/corpus/templates/slides/shared/api.ts +1 -1
  239. package/dist/application-state/store.d.ts.map +1 -1
  240. package/dist/application-state/store.js +8 -2
  241. package/dist/application-state/store.js.map +1 -1
  242. package/dist/client/AssistantChat.d.ts.map +1 -1
  243. package/dist/client/AssistantChat.js +24 -13
  244. package/dist/client/AssistantChat.js.map +1 -1
  245. package/dist/client/PoweredByBadge.d.ts +1 -1
  246. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  247. package/dist/client/PoweredByBadge.js +3 -9
  248. package/dist/client/PoweredByBadge.js.map +1 -1
  249. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  250. package/dist/client/agent-chat-adapter.js +28 -9
  251. package/dist/client/agent-chat-adapter.js.map +1 -1
  252. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  253. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  254. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  255. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  256. package/dist/client/db-admin/TableEditor.js +19 -2
  257. package/dist/client/db-admin/TableEditor.js.map +1 -1
  258. package/dist/client/db-admin/export-utils.d.ts +2 -0
  259. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  260. package/dist/client/db-admin/export-utils.js +11 -3
  261. package/dist/client/db-admin/export-utils.js.map +1 -1
  262. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  263. package/dist/client/db-admin/useAgentSync.js +63 -0
  264. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  265. package/dist/client/error-capture.d.ts.map +1 -1
  266. package/dist/client/error-capture.js +41 -7
  267. package/dist/client/error-capture.js.map +1 -1
  268. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  269. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  270. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  271. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  272. package/dist/client/extensions/ExtensionViewer.js +32 -5
  273. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  274. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  275. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  276. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  277. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  278. package/dist/client/extensions/portable-extension.js +1 -0
  279. package/dist/client/extensions/portable-extension.js.map +1 -1
  280. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  281. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  282. package/dist/client/org/OrgSwitcher.js +11 -6
  283. package/dist/client/org/OrgSwitcher.js.map +1 -1
  284. package/dist/client/org/TeamPage.d.ts.map +1 -1
  285. package/dist/client/org/TeamPage.js +5 -5
  286. package/dist/client/org/TeamPage.js.map +1 -1
  287. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  288. package/dist/client/settings/SettingsPanel.js +37 -14
  289. package/dist/client/settings/SettingsPanel.js.map +1 -1
  290. package/dist/client/settings/SettingsSection.js +1 -1
  291. package/dist/client/settings/SettingsSection.js.map +1 -1
  292. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  293. package/dist/client/settings/SettingsTabsPage.js +21 -10
  294. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  295. package/dist/collab/routes.d.ts +1 -1
  296. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  297. package/dist/db-admin/agent-tools.js +7 -2
  298. package/dist/db-admin/agent-tools.js.map +1 -1
  299. package/dist/db-admin/operations.d.ts.map +1 -1
  300. package/dist/db-admin/operations.js +90 -4
  301. package/dist/db-admin/operations.js.map +1 -1
  302. package/dist/db-admin/routes.d.ts.map +1 -1
  303. package/dist/db-admin/routes.js +1 -0
  304. package/dist/db-admin/routes.js.map +1 -1
  305. package/dist/db-admin/types.d.ts +4 -0
  306. package/dist/db-admin/types.d.ts.map +1 -1
  307. package/dist/db-admin/types.js.map +1 -1
  308. package/dist/extensions/html-shell.d.ts +5 -4
  309. package/dist/extensions/html-shell.d.ts.map +1 -1
  310. package/dist/extensions/html-shell.js.map +1 -1
  311. package/dist/extensions/routes.d.ts.map +1 -1
  312. package/dist/extensions/routes.js +8 -0
  313. package/dist/extensions/routes.js.map +1 -1
  314. package/dist/navigation/index.d.ts +1 -1
  315. package/dist/navigation/index.d.ts.map +1 -1
  316. package/dist/navigation/index.js +1 -1
  317. package/dist/navigation/index.js.map +1 -1
  318. package/dist/notifications/routes.d.ts +1 -1
  319. package/dist/observability/routes.d.ts +1 -1
  320. package/dist/resources/handlers.d.ts +6 -1
  321. package/dist/resources/handlers.d.ts.map +1 -1
  322. package/dist/resources/handlers.js +9 -8
  323. package/dist/resources/handlers.js.map +1 -1
  324. package/dist/server/poll.d.ts +12 -4
  325. package/dist/server/poll.d.ts.map +1 -1
  326. package/dist/server/poll.js +236 -9
  327. package/dist/server/poll.js.map +1 -1
  328. package/dist/styles/agent-native.css +27 -0
  329. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  330. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  331. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  332. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  333. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  334. package/dist/templates/default/AGENTS.md +4 -2
  335. package/dist/templates/headless/AGENTS.md +4 -0
  336. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  337. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  338. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  339. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  340. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  341. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  342. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  343. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  344. package/dist/templates/workspace-core/AGENTS.md +7 -1
  345. package/dist/templates/workspace-root/AGENTS.md +7 -1
  346. package/package.json +1 -1
  347. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  348. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  349. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  350. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  351. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  352. package/src/templates/default/AGENTS.md +4 -2
  353. package/src/templates/headless/AGENTS.md +4 -0
  354. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  355. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  356. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  357. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  358. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  359. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  360. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  361. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  362. package/src/templates/workspace-core/AGENTS.md +7 -1
  363. package/src/templates/workspace-root/AGENTS.md +7 -1
@@ -5,6 +5,7 @@ import { getThemeVars } from "../../extensions/theme.js";
5
5
  import { sendToAgentChat } from "../agent-chat.js";
6
6
  import { agentNativePath } from "../api-path.js";
7
7
  import { isAllowedExtensionPath, sanitizeExtensionRequestOptions, checkBridgePolicy, } from "./iframe-bridge.js";
8
+ import { normalizeAgentNativeExtensionSandbox } from "./portable-extension.js";
8
9
  const THEME_CSS_VARS = [
9
10
  "--background",
10
11
  "--foreground",
@@ -35,6 +36,7 @@ const THEME_CSS_VARS = [
35
36
  "--sidebar-border",
36
37
  "--sidebar-ring",
37
38
  ];
39
+ const EXTENSION_IFRAME_SANDBOX = normalizeAgentNativeExtensionSandbox(undefined);
38
40
  function getParentThemeVars() {
39
41
  if (typeof document === "undefined")
40
42
  return {};
@@ -480,7 +482,7 @@ export function InlineExtensionFrame({ extensionId, extension: providedExtension
480
482
  return null;
481
483
  return (_jsx("div", { className: className, style: { height: initialHeight }, "aria-busy": "true" }));
482
484
  }
483
- return (_jsx("div", { className: `relative ${className ?? ""}`, children: _jsx("iframe", { ref: iframeRef, src: iframeSrc, srcDoc: srcDoc, title: extension.name, sandbox: "allow-scripts allow-forms", style: { width: "100%", border: 0, height, display: "block" }, onLoad: () => {
485
+ return (_jsx("div", { className: `relative ${className ?? ""}`, children: _jsx("iframe", { ref: iframeRef, src: iframeSrc, srcDoc: srcDoc, title: extension.name, sandbox: EXTENSION_IFRAME_SANDBOX, style: { width: "100%", border: 0, height, display: "block" }, onLoad: () => {
484
486
  sendThemeToIframe();
485
487
  sendContextToIframe();
486
488
  } }, `${resolvedId}-${extension.updatedAt ?? "inline"}-${isTransient ? "transient" : "persisted"}`) }));
@@ -1 +1 @@
1
- {"version":3,"file":"InlineExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/InlineExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { buildExtensionHtml } from \"../../extensions/html-shell.js\";\nimport { getThemeVars } from \"../../extensions/theme.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.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\ninterface InlineExtensionSource {\n mode?: \"database\" | \"local-files\";\n permissions?: BridgePolicyContext[\"permissions\"];\n}\n\nexport interface InlineExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n mode?: \"transient\" | \"persisted\";\n source?: InlineExtensionSource;\n}\n\nexport interface InlineExtensionFrameProps {\n extensionId?: string;\n extension?: InlineExtensionDefinition;\n slotId?: string;\n context?: Record<string, unknown> | null;\n className?: string;\n initialHeight?: number;\n}\n\nfunction getParentThemeVars(): Record<string, string> {\n if (typeof document === \"undefined\") return {};\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\nfunction normalizeRole(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 transientDataKey(\n extensionId: string,\n collection: string,\n scope: string,\n): string {\n return `agent-native:inline-extension-data:${extensionId}:${scope}:${collection}`;\n}\n\ninterface TransientDataRow {\n id: string;\n extensionId: string;\n toolId: string;\n collection: string;\n data: string;\n ownerEmail: string;\n scope: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction readTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n): TransientDataRow[] {\n if (typeof localStorage === \"undefined\") return [];\n try {\n const parsed = JSON.parse(\n localStorage.getItem(transientDataKey(extensionId, collection, scope)) ??\n \"[]\",\n );\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction writeTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n rows: TransientDataRow[],\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n transientDataKey(extensionId, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction parseTransientDataPath(\n extensionId: string,\n path: string,\n): { collection: string; itemId?: string; scope: string } | null {\n try {\n const url = new URL(path, \"http://agent-native.local\");\n const parts = url.pathname.split(\"/\");\n if (\n parts.length < 6 ||\n parts.length > 7 ||\n parts[1] !== \"_agent-native\" ||\n parts[2] !== \"extensions\" ||\n parts[3] !== \"data\" ||\n decodeURIComponent(parts[4]) !== extensionId\n ) {\n return null;\n }\n return {\n collection: decodeURIComponent(parts[5] ?? \"\"),\n itemId: parts[6] ? decodeURIComponent(parts[6]) : undefined,\n scope: url.searchParams.get(\"scope\") || \"user\",\n };\n } catch {\n return null;\n }\n}\n\nasync function handleTransientExtensionData(\n extensionId: string,\n path: string,\n options: RequestInit,\n): Promise<Record<string, unknown> | null> {\n const parsed = parseTransientDataPath(extensionId, path);\n if (!parsed?.collection) return null;\n\n const method = String(options.method ?? \"GET\").toUpperCase();\n if (method === \"GET\" || method === \"HEAD\") {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: rows,\n },\n };\n }\n\n if (method === \"POST\") {\n const bodyText = typeof options.body === \"string\" ? options.body : \"{}\";\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(bodyText);\n } catch {\n body = {};\n }\n if (body.data === undefined) {\n return {\n response: {\n ok: false,\n status: 400,\n statusText: \"Bad Request\",\n body: { error: \"data is required\" },\n },\n };\n }\n const itemId =\n typeof body.id === \"string\" && body.id.trim()\n ? body.id.trim()\n : `item-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n const requestedScope =\n body.scope === \"org\" || parsed.scope === \"org\" ? \"org\" : \"user\";\n const now = new Date().toISOString();\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n requestedScope,\n );\n const existing = rows.find((row) => row.id === itemId);\n const row: TransientDataRow = {\n id: itemId,\n extensionId,\n toolId: extensionId,\n collection: parsed.collection,\n data:\n typeof body.data === \"string\" ? body.data : JSON.stringify(body.data),\n ownerEmail: \"\",\n scope: requestedScope,\n orgId: requestedScope === \"org\" ? \"inline\" : null,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n writeTransientRows(extensionId, parsed.collection, requestedScope, [\n row,\n ...rows.filter((item) => item.id !== itemId),\n ]);\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: row,\n },\n };\n }\n\n if (method === \"DELETE\" && parsed.itemId) {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n writeTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n rows.filter((row) => row.id !== parsed.itemId),\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: { ok: true },\n },\n };\n }\n\n return {\n response: {\n ok: false,\n status: 405,\n statusText: \"Method Not Allowed\",\n body: { error: \"Unsupported transient extensionData request\" },\n },\n };\n}\n\nfunction buildTransientSrcDoc(\n extension: InlineExtensionDefinition,\n isDark: boolean,\n): string {\n return buildExtensionHtml(\n extension.content ?? \"\",\n getThemeVars(isDark),\n isDark,\n extension.id,\n {\n authorEmail: \"\",\n viewerEmail: \"\",\n isAuthor: true,\n role: \"owner\",\n },\n );\n}\n\nexport function InlineExtensionFrame({\n extensionId,\n extension: providedExtension,\n slotId = \"agent-chat.inline\",\n context,\n className,\n initialHeight = 260,\n}: InlineExtensionFrameProps) {\n const providedId = providedExtension?.id ?? extensionId ?? \"\";\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const [height, setHeight] = useState<number>(initialHeight);\n const [isDark, setIsDark] = useState(() =>\n typeof document === \"undefined\"\n ? false\n : document.documentElement.classList.contains(\"dark\"),\n );\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: providedExtension?.content ? \"owner\" : \"viewer\",\n isAuthor: !!providedExtension?.content,\n });\n const bindingLatchedRef = useRef(false);\n const [fetchedExtension, setFetchedExtension] =\n useState<InlineExtensionDefinition | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setIsDark(document.documentElement.classList.contains(\"dark\"));\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 useEffect(() => {\n if (!providedId || providedExtension) {\n setFetchedExtension(null);\n setIsLoading(false);\n return;\n }\n let cancelled = false;\n setIsLoading(true);\n fetch(agentNativePath(`/_agent-native/extensions/${providedId}`))\n .then(async (res) => {\n if (!res.ok) return null;\n return (await res.json()) as InlineExtensionDefinition;\n })\n .then((row) => {\n if (!cancelled) setFetchedExtension(row);\n })\n .catch(() => {\n if (!cancelled) setFetchedExtension(null);\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [providedExtension, providedId]);\n\n const extension = providedExtension ?? fetchedExtension ?? null;\n const resolvedId = extension?.id ?? providedId;\n const isTransient =\n extension?.mode === \"transient\" ||\n (!!extension?.content && !extensionId && extension?.mode !== \"persisted\");\n\n const initialDarkRef = useRef(isDark);\n const iframeSrc = useMemo(() => {\n if (!resolvedId || isTransient) return undefined;\n const v = encodeURIComponent(extension?.updatedAt ?? \"\");\n return agentNativePath(\n `/_agent-native/extensions/${resolvedId}/render?slot=${encodeURIComponent(slotId)}&dark=${initialDarkRef.current}&v=${v}`,\n );\n }, [extension?.updatedAt, isTransient, resolvedId, slotId]);\n\n const srcDoc = useMemo(() => {\n if (!extension || !isTransient) return undefined;\n return buildTransientSrcDoc(extension, initialDarkRef.current);\n }, [extension, isTransient]);\n\n useEffect(() => {\n bridgeContextRef.current = isTransient\n ? { role: \"owner\", isAuthor: true }\n : { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n setHeight(initialHeight);\n }, [initialHeight, isTransient, resolvedId, extension?.updatedAt]);\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,\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendThemeToIframe();\n }, [isDark, srcDoc, iframeSrc]);\n\n const contextJson = JSON.stringify(context ?? {});\n const sendContextToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { type: \"agent-native-slot-context\", context: context ?? {} },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendContextToIframe();\n }, [contextJson, srcDoc, iframeSrc]);\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 || typeof message !== \"object\") return;\n\n if (message.type === \"agent-native-extension-binding\") {\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = (message as any).binding ?? {};\n const role = normalizeRole(binding.role);\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 (message.type === \"agent-native-extension-resize\") {\n const h = Number((message as any).height);\n if (Number.isFinite(h) && h > 0) {\n setHeight(Math.ceil(Math.min(Math.max(h, 96), 1000)));\n }\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: (message as any).key,\n code: (message as any).code,\n metaKey: !!(message as any).metaKey,\n ctrlKey: !!(message as any).ctrlKey,\n shiftKey: !!(message as any).shiftKey,\n altKey: !!(message as any).altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-send-to-chat\") {\n const text = serializeChatValue((message as any).message);\n if (!text?.trim()) return;\n sendToAgentChat({\n message: text,\n context: serializeChatValue((message as any).context),\n submit: (message as any).submit !== false,\n openSidebar: (message as any).openSidebar !== false,\n });\n return;\n }\n\n if (message.type === \"agent-native-ui-output\") {\n window.dispatchEvent(\n new CustomEvent(\"agentNative.inlineUiOutput\", {\n detail: {\n extensionId: resolvedId,\n key:\n typeof (message as any).key === \"string\"\n ? (message as any).key\n : undefined,\n value: (message as any).value,\n output: (message as any).output,\n },\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const errors: string[] = Array.isArray((message as any).errors)\n ? (message as any).errors\n : [];\n sendToAgentChat({\n message: `Fix runtime errors in the inline extension \"${extension?.name ?? resolvedId}\".\\n\\nErrors:\\n${errors.join(\"\\n\")}`,\n context: [\n `The user is viewing an inline generated extension named \"${extension?.name ?? resolvedId}\".`,\n isTransient\n ? \"This is a transient chat-only extension. Re-render it with render-inline-extension instead of update-extension.\"\n : `This is saved as extension id ${resolvedId}. Use get-extension/update-extension for durable edits.`,\n extension?.content\n ? `\\nCurrent inline content:\\n\\`\\`\\`html\\n${extension.content}\\n\\`\\`\\``\n : \"\",\n ]\n .filter(Boolean)\n .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 as any).requestId ?? \"\");\n const path = String((message as any).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 (\n !requestId ||\n !resolvedId ||\n !isAllowedExtensionPath(path, resolvedId)\n ) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(\n (message as any).options,\n );\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId: resolvedId,\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\n if (isTransient) {\n const localData = await handleTransientExtensionData(\n resolvedId,\n path,\n options,\n );\n if (localData) {\n respond(localData);\n return;\n }\n }\n\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\", resolvedId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", resolvedId);\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 }, [extension, isTransient, resolvedId]);\n\n if (!extension) {\n if (!isLoading) return null;\n return (\n <div\n className={className}\n style={{ height: initialHeight }}\n aria-busy=\"true\"\n />\n );\n }\n\n return (\n <div className={`relative ${className ?? \"\"}`}>\n <iframe\n ref={iframeRef}\n key={`${resolvedId}-${extension.updatedAt ?? \"inline\"}-${isTransient ? \"transient\" : \"persisted\"}`}\n src={iframeSrc}\n srcDoc={srcDoc}\n title={extension.name}\n sandbox=\"allow-scripts allow-forms\"\n style={{ width: \"100%\", border: 0, height, display: \"block\" }}\n onLoad={() => {\n sendThemeToIframe();\n sendContextToIframe();\n }}\n />\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"InlineExtensionFrame.js","sourceRoot":"","sources":["../../../src/client/extensions/InlineExtensionFrame.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { buildExtensionHtml } from \"../../extensions/html-shell.js\";\nimport { getThemeVars } from \"../../extensions/theme.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.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\ninterface InlineExtensionSource {\n mode?: \"database\" | \"local-files\";\n permissions?: BridgePolicyContext[\"permissions\"];\n}\n\nexport interface InlineExtensionDefinition {\n id: string;\n name: string;\n description?: string;\n content?: string;\n updatedAt?: string;\n mode?: \"transient\" | \"persisted\";\n source?: InlineExtensionSource;\n}\n\nexport interface InlineExtensionFrameProps {\n extensionId?: string;\n extension?: InlineExtensionDefinition;\n slotId?: string;\n context?: Record<string, unknown> | null;\n className?: string;\n initialHeight?: number;\n}\n\nfunction getParentThemeVars(): Record<string, string> {\n if (typeof document === \"undefined\") return {};\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\nfunction normalizeRole(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 transientDataKey(\n extensionId: string,\n collection: string,\n scope: string,\n): string {\n return `agent-native:inline-extension-data:${extensionId}:${scope}:${collection}`;\n}\n\ninterface TransientDataRow {\n id: string;\n extensionId: string;\n toolId: string;\n collection: string;\n data: string;\n ownerEmail: string;\n scope: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nfunction readTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n): TransientDataRow[] {\n if (typeof localStorage === \"undefined\") return [];\n try {\n const parsed = JSON.parse(\n localStorage.getItem(transientDataKey(extensionId, collection, scope)) ??\n \"[]\",\n );\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction writeTransientRows(\n extensionId: string,\n collection: string,\n scope: string,\n rows: TransientDataRow[],\n): void {\n if (typeof localStorage === \"undefined\") return;\n localStorage.setItem(\n transientDataKey(extensionId, collection, scope),\n JSON.stringify(rows),\n );\n}\n\nfunction parseTransientDataPath(\n extensionId: string,\n path: string,\n): { collection: string; itemId?: string; scope: string } | null {\n try {\n const url = new URL(path, \"http://agent-native.local\");\n const parts = url.pathname.split(\"/\");\n if (\n parts.length < 6 ||\n parts.length > 7 ||\n parts[1] !== \"_agent-native\" ||\n parts[2] !== \"extensions\" ||\n parts[3] !== \"data\" ||\n decodeURIComponent(parts[4]) !== extensionId\n ) {\n return null;\n }\n return {\n collection: decodeURIComponent(parts[5] ?? \"\"),\n itemId: parts[6] ? decodeURIComponent(parts[6]) : undefined,\n scope: url.searchParams.get(\"scope\") || \"user\",\n };\n } catch {\n return null;\n }\n}\n\nasync function handleTransientExtensionData(\n extensionId: string,\n path: string,\n options: RequestInit,\n): Promise<Record<string, unknown> | null> {\n const parsed = parseTransientDataPath(extensionId, path);\n if (!parsed?.collection) return null;\n\n const method = String(options.method ?? \"GET\").toUpperCase();\n if (method === \"GET\" || method === \"HEAD\") {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: rows,\n },\n };\n }\n\n if (method === \"POST\") {\n const bodyText = typeof options.body === \"string\" ? options.body : \"{}\";\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(bodyText);\n } catch {\n body = {};\n }\n if (body.data === undefined) {\n return {\n response: {\n ok: false,\n status: 400,\n statusText: \"Bad Request\",\n body: { error: \"data is required\" },\n },\n };\n }\n const itemId =\n typeof body.id === \"string\" && body.id.trim()\n ? body.id.trim()\n : `item-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n const requestedScope =\n body.scope === \"org\" || parsed.scope === \"org\" ? \"org\" : \"user\";\n const now = new Date().toISOString();\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n requestedScope,\n );\n const existing = rows.find((row) => row.id === itemId);\n const row: TransientDataRow = {\n id: itemId,\n extensionId,\n toolId: extensionId,\n collection: parsed.collection,\n data:\n typeof body.data === \"string\" ? body.data : JSON.stringify(body.data),\n ownerEmail: \"\",\n scope: requestedScope,\n orgId: requestedScope === \"org\" ? \"inline\" : null,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n };\n writeTransientRows(extensionId, parsed.collection, requestedScope, [\n row,\n ...rows.filter((item) => item.id !== itemId),\n ]);\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: row,\n },\n };\n }\n\n if (method === \"DELETE\" && parsed.itemId) {\n const rows = readTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n );\n writeTransientRows(\n extensionId,\n parsed.collection,\n parsed.scope,\n rows.filter((row) => row.id !== parsed.itemId),\n );\n return {\n response: {\n ok: true,\n status: 200,\n statusText: \"OK\",\n body: { ok: true },\n },\n };\n }\n\n return {\n response: {\n ok: false,\n status: 405,\n statusText: \"Method Not Allowed\",\n body: { error: \"Unsupported transient extensionData request\" },\n },\n };\n}\n\nfunction buildTransientSrcDoc(\n extension: InlineExtensionDefinition,\n isDark: boolean,\n): string {\n return buildExtensionHtml(\n extension.content ?? \"\",\n getThemeVars(isDark),\n isDark,\n extension.id,\n {\n authorEmail: \"\",\n viewerEmail: \"\",\n isAuthor: true,\n role: \"owner\",\n },\n );\n}\n\nexport function InlineExtensionFrame({\n extensionId,\n extension: providedExtension,\n slotId = \"agent-chat.inline\",\n context,\n className,\n initialHeight = 260,\n}: InlineExtensionFrameProps) {\n const providedId = providedExtension?.id ?? extensionId ?? \"\";\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const [height, setHeight] = useState<number>(initialHeight);\n const [isDark, setIsDark] = useState(() =>\n typeof document === \"undefined\"\n ? false\n : document.documentElement.classList.contains(\"dark\"),\n );\n const bridgeContextRef = useRef<BridgePolicyContext>({\n role: providedExtension?.content ? \"owner\" : \"viewer\",\n isAuthor: !!providedExtension?.content,\n });\n const bindingLatchedRef = useRef(false);\n const [fetchedExtension, setFetchedExtension] =\n useState<InlineExtensionDefinition | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setIsDark(document.documentElement.classList.contains(\"dark\"));\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 useEffect(() => {\n if (!providedId || providedExtension) {\n setFetchedExtension(null);\n setIsLoading(false);\n return;\n }\n let cancelled = false;\n setIsLoading(true);\n fetch(agentNativePath(`/_agent-native/extensions/${providedId}`))\n .then(async (res) => {\n if (!res.ok) return null;\n return (await res.json()) as InlineExtensionDefinition;\n })\n .then((row) => {\n if (!cancelled) setFetchedExtension(row);\n })\n .catch(() => {\n if (!cancelled) setFetchedExtension(null);\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [providedExtension, providedId]);\n\n const extension = providedExtension ?? fetchedExtension ?? null;\n const resolvedId = extension?.id ?? providedId;\n const isTransient =\n extension?.mode === \"transient\" ||\n (!!extension?.content && !extensionId && extension?.mode !== \"persisted\");\n\n const initialDarkRef = useRef(isDark);\n const iframeSrc = useMemo(() => {\n if (!resolvedId || isTransient) return undefined;\n const v = encodeURIComponent(extension?.updatedAt ?? \"\");\n return agentNativePath(\n `/_agent-native/extensions/${resolvedId}/render?slot=${encodeURIComponent(slotId)}&dark=${initialDarkRef.current}&v=${v}`,\n );\n }, [extension?.updatedAt, isTransient, resolvedId, slotId]);\n\n const srcDoc = useMemo(() => {\n if (!extension || !isTransient) return undefined;\n return buildTransientSrcDoc(extension, initialDarkRef.current);\n }, [extension, isTransient]);\n\n useEffect(() => {\n bridgeContextRef.current = isTransient\n ? { role: \"owner\", isAuthor: true }\n : { role: \"viewer\", isAuthor: false };\n bindingLatchedRef.current = false;\n setHeight(initialHeight);\n }, [initialHeight, isTransient, resolvedId, extension?.updatedAt]);\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,\n vars: getParentThemeVars(),\n },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendThemeToIframe();\n }, [isDark, srcDoc, iframeSrc]);\n\n const contextJson = JSON.stringify(context ?? {});\n const sendContextToIframe = () => {\n const win = iframeRef.current?.contentWindow;\n if (!win) return;\n win.postMessage(\n { type: \"agent-native-slot-context\", context: context ?? {} },\n \"*\",\n );\n };\n\n useEffect(() => {\n sendContextToIframe();\n }, [contextJson, srcDoc, iframeSrc]);\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 || typeof message !== \"object\") return;\n\n if (message.type === \"agent-native-extension-binding\") {\n if (bindingLatchedRef.current) return;\n bindingLatchedRef.current = true;\n const binding = (message as any).binding ?? {};\n const role = normalizeRole(binding.role);\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 (message.type === \"agent-native-extension-resize\") {\n const h = Number((message as any).height);\n if (Number.isFinite(h) && h > 0) {\n setHeight(Math.ceil(Math.min(Math.max(h, 96), 1000)));\n }\n return;\n }\n\n if (message.type === \"agent-native-extension-keydown\") {\n document.dispatchEvent(\n new KeyboardEvent(\"keydown\", {\n key: (message as any).key,\n code: (message as any).code,\n metaKey: !!(message as any).metaKey,\n ctrlKey: !!(message as any).ctrlKey,\n shiftKey: !!(message as any).shiftKey,\n altKey: !!(message as any).altKey,\n bubbles: true,\n cancelable: true,\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-send-to-chat\") {\n const text = serializeChatValue((message as any).message);\n if (!text?.trim()) return;\n sendToAgentChat({\n message: text,\n context: serializeChatValue((message as any).context),\n submit: (message as any).submit !== false,\n openSidebar: (message as any).openSidebar !== false,\n });\n return;\n }\n\n if (message.type === \"agent-native-ui-output\") {\n window.dispatchEvent(\n new CustomEvent(\"agentNative.inlineUiOutput\", {\n detail: {\n extensionId: resolvedId,\n key:\n typeof (message as any).key === \"string\"\n ? (message as any).key\n : undefined,\n value: (message as any).value,\n output: (message as any).output,\n },\n }),\n );\n return;\n }\n\n if (message.type === \"agent-native-extension-error-fix\") {\n const errors: string[] = Array.isArray((message as any).errors)\n ? (message as any).errors\n : [];\n sendToAgentChat({\n message: `Fix runtime errors in the inline extension \"${extension?.name ?? resolvedId}\".\\n\\nErrors:\\n${errors.join(\"\\n\")}`,\n context: [\n `The user is viewing an inline generated extension named \"${extension?.name ?? resolvedId}\".`,\n isTransient\n ? \"This is a transient chat-only extension. Re-render it with render-inline-extension instead of update-extension.\"\n : `This is saved as extension id ${resolvedId}. Use get-extension/update-extension for durable edits.`,\n extension?.content\n ? `\\nCurrent inline content:\\n\\`\\`\\`html\\n${extension.content}\\n\\`\\`\\``\n : \"\",\n ]\n .filter(Boolean)\n .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 as any).requestId ?? \"\");\n const path = String((message as any).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 (\n !requestId ||\n !resolvedId ||\n !isAllowedExtensionPath(path, resolvedId)\n ) {\n respond({ error: \"Extension request path is not allowed\" });\n return;\n }\n\n try {\n const options = sanitizeExtensionRequestOptions(\n (message as any).options,\n );\n const policy = checkBridgePolicy(path, options.method ?? \"GET\", {\n ...bridgeContextRef.current,\n extensionId: resolvedId,\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\n if (isTransient) {\n const localData = await handleTransientExtensionData(\n resolvedId,\n path,\n options,\n );\n if (localData) {\n respond(localData);\n return;\n }\n }\n\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\", resolvedId);\n finalHeaders.set(\"X-Agent-Native-Tool-Bridge\", \"1\");\n finalHeaders.set(\"X-Agent-Native-Tool-Id\", resolvedId);\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 }, [extension, isTransient, resolvedId]);\n\n if (!extension) {\n if (!isLoading) return null;\n return (\n <div\n className={className}\n style={{ height: initialHeight }}\n aria-busy=\"true\"\n />\n );\n }\n\n return (\n <div className={`relative ${className ?? \"\"}`}>\n <iframe\n ref={iframeRef}\n key={`${resolvedId}-${extension.updatedAt ?? \"inline\"}-${isTransient ? \"transient\" : \"persisted\"}`}\n src={iframeSrc}\n srcDoc={srcDoc}\n title={extension.name}\n sandbox={EXTENSION_IFRAME_SANDBOX}\n style={{ width: \"100%\", border: 0, height, display: \"block\" }}\n onLoad={() => {\n sendThemeToIframe();\n sendContextToIframe();\n }}\n />\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"portable-extension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"portable-extension.d.ts","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"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"}
@@ -227,6 +227,7 @@ export function normalizeAgentNativeExtensionSandbox(sandbox) {
227
227
  .filter(Boolean));
228
228
  tokens.delete("allow-same-origin");
229
229
  tokens.add("allow-scripts");
230
+ tokens.add("allow-downloads");
230
231
  return Array.from(tokens).join(" ");
231
232
  }
232
233
  export function buildAgentNativeExtensionHtml({ extensionId, content, title, slotId, slotContext, themeCss = "", isDark = false, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"portable-extension.js","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\nimport { AGENT_NATIVE_HOST_MESSAGE_TYPES } from \"../host-bridge.js\";\n\nexport const AGENT_NATIVE_EXTENSION_MESSAGE_TYPES = {\n STORAGE_REQUEST: \"agentNative.extension.storage\",\n STORAGE_RESPONSE: \"agentNative.extension.storageResult\",\n RESIZE: \"agentNative.extension.resize\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n} as const;\n\nexport type AgentNativeExtensionMessageType =\n (typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES)[keyof typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES];\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\" | \"all\" | string;\n\nexport interface AgentNativeExtensionManifest {\n /** Slot IDs this extension may render into. Omit to let the host decide. */\n slots?: readonly string[];\n /** Host action names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedActions?: readonly string[];\n /** Host command names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedCommands?: readonly string[];\n /** Storage scopes this extension is allowed to use. Omit to inherit the slot policy. */\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n}\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n content: string;\n description?: string;\n updatedAt?: string;\n manifest?: AgentNativeExtensionManifest;\n slots?: readonly string[];\n requestedActions?: readonly string[];\n requestedCommands?: readonly string[];\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageOptions {\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n scope?: Exclude<AgentNativeExtensionStorageScope, \"all\">;\n userId?: string;\n organizationId?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageRow<TData = unknown> {\n id: string;\n extensionId: string;\n collection: string;\n data: TData;\n scope: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow[]\n | Promise<AgentNativeExtensionStorageRow[]>;\n get(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow\n | null\n | Promise<AgentNativeExtensionStorageRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): AgentNativeExtensionStorageRow | Promise<AgentNativeExtensionStorageRow>;\n remove(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): { removed: boolean } | Promise<{ removed: boolean }>;\n}\n\nexport interface CreateHttpAgentNativeExtensionStorageOptions {\n /** Endpoint that receives storage operation POSTs. */\n endpoint: string;\n fetch?: typeof fetch;\n headers?:\n | HeadersInit\n | ((\n context: AgentNativeExtensionStorageContext,\n ) => HeadersInit | Promise<HeadersInit>);\n credentials?: RequestCredentials;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n themeCss?: string;\n isDark?: boolean;\n}\n\nfunction firstList<T>(\n ...values: Array<readonly T[] | undefined>\n): readonly T[] | undefined {\n return values.find((value) => Array.isArray(value));\n}\n\nexport function getAgentNativeExtensionManifest(\n extension: AgentNativeExtensionDefinition,\n): AgentNativeExtensionManifest {\n return {\n slots: firstList(extension.manifest?.slots, extension.slots),\n requestedActions: firstList(\n extension.manifest?.requestedActions,\n extension.requestedActions,\n ),\n requestedCommands: firstList(\n extension.manifest?.requestedCommands,\n extension.requestedCommands,\n ),\n storageScopes: firstList(\n extension.manifest?.storageScopes,\n extension.storageScopes,\n ),\n };\n}\n\nexport function isAgentNativeExtensionAllowedInSlot(\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n): boolean {\n if (!slotId) return true;\n const slots = getAgentNativeExtensionManifest(extension).slots;\n if (!slots) return true;\n return slots.includes(slotId);\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction safeJson(value: unknown): string {\n try {\n const json = JSON.stringify(value);\n return typeof json === \"string\" ? json.replace(/</g, \"\\\\u003c\") : \"null\";\n } catch {\n return \"null\";\n }\n}\n\nfunction encodedSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction storageScope(\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n): string {\n const scope = options?.scope ?? context.scope ?? \"user\";\n return typeof scope === \"string\" && scope ? scope : \"user\";\n}\n\nfunction localStorageRef(): Storage {\n if (typeof window === \"undefined\" || !window.localStorage) {\n throw new Error(\"Extension localStorage is not available\");\n }\n return window.localStorage;\n}\n\nfunction bucketKey(\n namespace: string,\n extensionId: string,\n scope: string,\n collection: string,\n): string {\n return [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n encodedSegment(scope),\n encodedSegment(collection),\n ].join(\":\");\n}\n\nfunction readBucket(\n storage: Storage,\n key: string,\n): Record<string, AgentNativeExtensionStorageRow> {\n const raw = storage.getItem(key);\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, AgentNativeExtensionStorageRow>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction writeBucket(\n storage: Storage,\n key: string,\n value: Record<string, AgentNativeExtensionStorageRow>,\n) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nfunction listLocalStorageBuckets(\n storage: Storage,\n namespace: string,\n extensionId: string,\n collection: string,\n): string[] {\n const prefix = [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n \"\",\n ].join(\":\");\n const suffix = `:${encodedSegment(collection)}`;\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (key?.startsWith(prefix) && key.endsWith(suffix)) keys.push(key);\n }\n return keys;\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n list(collection, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n const keys =\n scope === \"all\"\n ? listLocalStorageBuckets(\n storage,\n namespace,\n context.extensionId,\n collection,\n )\n : [bucketKey(namespace, context.extensionId, scope, collection)];\n const rows = keys.flatMap((key) =>\n Object.values(readBucket(storage, key)),\n );\n const limit = options?.limit ?? 100;\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, Math.max(0, limit));\n },\n get(collection, id, options, context) {\n const rows = this.list(collection, options, context);\n if (rows instanceof Promise) {\n return rows.then(\n (resolved) => resolved.find((row) => row.id === id) ?? null,\n );\n }\n return rows.find((row) => row.id === id) ?? null;\n },\n set(collection, id, data, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data writes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const now = new Date().toISOString();\n const row: AgentNativeExtensionStorageRow = {\n id,\n extensionId: context.extensionId,\n collection,\n data,\n scope,\n createdAt: bucket[id]?.createdAt ?? now,\n updatedAt: now,\n };\n bucket[id] = row;\n writeBucket(storage, key, bucket);\n return row;\n },\n remove(collection, id, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data deletes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const removed = Boolean(bucket[id]);\n delete bucket[id];\n writeBucket(storage, key, bucket);\n return { removed };\n },\n };\n}\n\nasync function resolveHttpStorageHeaders(\n headers: CreateHttpAgentNativeExtensionStorageOptions[\"headers\"],\n context: AgentNativeExtensionStorageContext,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(context) : headers;\n}\n\nasync function readHttpStorageResponse<TResult>(\n response: Response,\n): Promise<TResult> {\n const text = await response.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body\n ? String((body as { error: unknown }).error)\n : `Extension storage request failed: ${response.status}`;\n throw new Error(message);\n }\n\n if (body && typeof body === \"object\" && \"result\" in body) {\n return (body as { result: TResult }).result;\n }\n return body as TResult;\n}\n\nexport function createHttpAgentNativeExtensionStorage({\n endpoint,\n fetch: fetchImpl,\n headers,\n credentials = \"same-origin\",\n}: CreateHttpAgentNativeExtensionStorageOptions): AgentNativeExtensionStorage {\n const run = async <TResult>(\n operation: \"list\" | \"get\" | \"set\" | \"remove\",\n collection: string,\n context: AgentNativeExtensionStorageContext,\n options?: AgentNativeExtensionStorageOptions,\n id?: string,\n data?: unknown,\n ): Promise<TResult> => {\n const requestFetch = fetchImpl ?? fetch;\n if (typeof requestFetch !== \"function\") {\n throw new Error(\"fetch is not available for extension storage\");\n }\n const resolvedHeaders = new Headers(\n await resolveHttpStorageHeaders(headers, context),\n );\n resolvedHeaders.set(\"Content-Type\", \"application/json\");\n\n const response = await requestFetch(endpoint, {\n method: \"POST\",\n credentials,\n headers: resolvedHeaders,\n body: JSON.stringify({\n operation,\n extensionId: context.extensionId,\n slotId: context.slotId,\n collection,\n id,\n data,\n options: options ?? {},\n context,\n }),\n });\n return readHttpStorageResponse<TResult>(response);\n };\n\n return {\n list(collection, options, context) {\n return run<AgentNativeExtensionStorageRow[]>(\n \"list\",\n collection,\n context,\n options,\n );\n },\n get(collection, id, options, context) {\n return run<AgentNativeExtensionStorageRow | null>(\n \"get\",\n collection,\n context,\n options,\n id,\n );\n },\n set(collection, id, data, options, context) {\n return run<AgentNativeExtensionStorageRow>(\n \"set\",\n collection,\n context,\n options,\n id,\n data,\n );\n },\n remove(collection, id, options, context) {\n return run<{ removed: boolean }>(\n \"remove\",\n collection,\n context,\n options,\n id,\n );\n },\n };\n}\n\nexport function normalizeAgentNativeExtensionSandbox(\n sandbox: string | undefined,\n): string {\n const tokens = new Set(\n (sandbox ?? \"allow-scripts allow-forms allow-popups allow-downloads\")\n .split(/\\s+/)\n .filter(Boolean),\n );\n tokens.delete(\"allow-same-origin\");\n tokens.add(\"allow-scripts\");\n return Array.from(tokens).join(\" \");\n}\n\nexport function buildAgentNativeExtensionHtml({\n extensionId,\n content,\n title,\n slotId,\n slotContext,\n themeCss = \"\",\n isDark = false,\n}: BuildAgentNativeExtensionHtmlOptions): string {\n const extensionIdJson = safeJson(extensionId);\n const slotIdJson = safeJson(slotId ?? \"\");\n const slotContextJson = safeJson(slotContext ?? {});\n const messageTypesJson = safeJson({\n host: AGENT_NATIVE_HOST_MESSAGE_TYPES,\n extension: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n });\n const titleText = title ?? \"Agent Native extension\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\"${isDark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${escapeHtmlAttribute(EXTENSION_IFRAME_META_CSP)}\" />\n <title>${escapeHtmlAttribute(titleText)}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-border: hsl(var(--border, 214 32% 91%));\n --color-background: hsl(var(--background, 0 0% 100%));\n --color-foreground: hsl(var(--foreground, 222 47% 11%));\n --color-primary: hsl(var(--primary, 222 47% 11%));\n --color-primary-foreground: hsl(var(--primary-foreground, 210 40% 98%));\n --color-muted: hsl(var(--muted, 210 40% 96%));\n --color-muted-foreground: hsl(var(--muted-foreground, 215 16% 47%));\n --color-card: hsl(var(--card, 0 0% 100%));\n --color-card-foreground: hsl(var(--card-foreground, 222 47% 11%));\n --radius-lg: var(--radius, .5rem);\n --radius-md: calc(var(--radius, .5rem) - 2px);\n --radius-sm: calc(var(--radius, .5rem) - 4px);\n }\n </style>\n <style>\n *, *::before, *::after { box-sizing: border-box; border-color: hsl(var(--border, 214 32% 91%)); }\n html, body { margin: 0; min-height: 100%; background: transparent; color: hsl(var(--foreground, 222 47% 11%)); }\n body {\n --agent-native-extension-padding: clamp(12px, 2vw, 20px);\n font-family: Inter, ui-sans-serif, system-ui, sans-serif;\n padding: var(--agent-native-extension-padding);\n }\n body:has(> [data-extension-layout=\"full-bleed\"]),\n body:has(> [data-extension-padding=\"none\"]),\n body:has(> .agent-native-extension-bleed) {\n padding: 0;\n }\n </style>\n <script>\n (function() {\n var messageTypes = ${messageTypesJson};\n var extensionId = ${extensionIdJson};\n var slotId = ${slotIdJson};\n var slotContext = ${slotContextJson};\n var requestSeq = 0;\n var pending = {};\n\n function nextRequestId(prefix) {\n requestSeq += 1;\n return prefix + '-' + Date.now() + '-' + requestSeq;\n }\n\n function failMessage(message, fallback) {\n return typeof message.error === 'string' ? message.error : fallback;\n }\n\n function requestParent(message, responseType, timeoutMs) {\n timeoutMs = timeoutMs || 30000;\n return new Promise(function(resolve, reject) {\n var requestId = message.requestId || nextRequestId('extension');\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error('Timed out waiting for host response'));\n }, timeoutMs);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer,\n };\n window.parent.postMessage(Object.assign({}, message, { requestId: requestId }), '*');\n });\n }\n\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n\n if (message.type === messageTypes.host.INIT) {\n agentNative.init = message;\n agentNative.contextSnapshot = message.context || null;\n agentNative.actionsSnapshot = message.actions || [];\n window.dispatchEvent(new CustomEvent('agentNative:init', { detail: message }));\n return;\n }\n\n if (message.type === messageTypes.extension.SLOT_CONTEXT) {\n slotContext = message.context || {};\n agentNative.slotContext = slotContext;\n window.slotContext = slotContext;\n window.dispatchEvent(new CustomEvent('agentNative:slot-context', { detail: slotContext }));\n return;\n }\n\n var entry = pending[message.requestId];\n if (!entry || message.type !== entry.responseType) return;\n delete pending[message.requestId];\n clearTimeout(entry.timer);\n if (message.ok === false) {\n entry.reject(new Error(failMessage(message, 'Host request failed')));\n } else {\n entry.resolve(message);\n }\n });\n\n function hostContext() {\n return requestParent(\n { type: messageTypes.host.GET_CONTEXT },\n messageTypes.host.CONTEXT,\n ).then(function(message) { return message.context || {}; });\n }\n\n function hostActions() {\n return requestParent(\n { type: messageTypes.host.LIST_ACTIONS },\n messageTypes.host.ACTIONS,\n ).then(function(message) { return message.actions || []; });\n }\n\n function hostAction(name, args) {\n return requestParent(\n { type: messageTypes.host.RUN_ACTION, name: name, args: args || {} },\n messageTypes.host.ACTION_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function hostCommand(command, payload) {\n return requestParent(\n { type: messageTypes.host.COMMAND, command: command, payload: payload },\n messageTypes.host.COMMAND_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function storageRequest(op, collection, id, data, options) {\n return requestParent(\n {\n type: messageTypes.extension.STORAGE_REQUEST,\n op: op,\n collection: collection,\n id: id,\n data: data,\n options: options || {},\n },\n messageTypes.extension.STORAGE_RESPONSE,\n ).then(function(message) { return message.result; });\n }\n\n var extensionData = {\n list: function(collection, options) {\n return storageRequest('list', collection, undefined, undefined, options);\n },\n get: function(collection, id, options) {\n return storageRequest('get', collection, id, undefined, options);\n },\n set: function(collection, id, data, options) {\n return storageRequest('set', collection, id, data, options);\n },\n remove: function(collection, id, options) {\n return storageRequest('remove', collection, id, undefined, options);\n },\n };\n\n var agentNative = {\n version: '0.1.0',\n extensionId: extensionId,\n slotId: slotId,\n slotContext: slotContext,\n contextSnapshot: null,\n actionsSnapshot: [],\n init: null,\n context: hostContext,\n listActions: hostActions,\n action: hostAction,\n command: hostCommand,\n refresh: function(payload) { return hostCommand('refreshData', payload); },\n data: extensionData,\n };\n\n window.agentNative = agentNative;\n window.appAction = hostAction;\n window.extensionData = extensionData;\n window.toolData = extensionData;\n window.extensionId = extensionId;\n window.toolId = extensionId;\n window.slotContext = slotContext;\n\n function reportHeight() {\n try {\n var doc = document.documentElement;\n var body = document.body;\n var height = Math.max(\n doc ? doc.scrollHeight : 0,\n doc ? doc.offsetHeight : 0,\n body ? body.scrollHeight : 0,\n body ? body.offsetHeight : 0,\n );\n window.parent.postMessage({\n type: messageTypes.extension.RESIZE,\n extensionId: extensionId,\n slotId: slotId,\n height: height,\n }, '*');\n } catch (_) {}\n }\n\n window.addEventListener('load', reportHeight);\n if (typeof ResizeObserver !== 'undefined') {\n new ResizeObserver(reportHeight).observe(document.documentElement);\n } else {\n setInterval(reportHeight, 1000);\n }\n\n window.parent.postMessage({\n type: messageTypes.host.READY,\n requestId: nextRequestId('ready'),\n }, '*');\n })();\n </script>\n</head>\n<body>\n${content}\n</body>\n</html>`;\n}\n"]}
1
+ {"version":3,"file":"portable-extension.js","sourceRoot":"","sources":["../../../src/client/extensions/portable-extension.ts"],"names":[],"mappings":"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","sourcesContent":["import { EXTENSION_IFRAME_META_CSP } from \"../../extensions/html-shell.js\";\nimport { AGENT_NATIVE_HOST_MESSAGE_TYPES } from \"../host-bridge.js\";\n\nexport const AGENT_NATIVE_EXTENSION_MESSAGE_TYPES = {\n STORAGE_REQUEST: \"agentNative.extension.storage\",\n STORAGE_RESPONSE: \"agentNative.extension.storageResult\",\n RESIZE: \"agentNative.extension.resize\",\n SLOT_CONTEXT: \"agentNative.extension.slotContext\",\n} as const;\n\nexport type AgentNativeExtensionMessageType =\n (typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES)[keyof typeof AGENT_NATIVE_EXTENSION_MESSAGE_TYPES];\n\nexport type AgentNativeExtensionStorageScope = \"user\" | \"org\" | \"all\" | string;\n\nexport interface AgentNativeExtensionManifest {\n /** Slot IDs this extension may render into. Omit to let the host decide. */\n slots?: readonly string[];\n /** Host action names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedActions?: readonly string[];\n /** Host command names this extension is allowed to call. Omit to inherit the slot policy. */\n requestedCommands?: readonly string[];\n /** Storage scopes this extension is allowed to use. Omit to inherit the slot policy. */\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n}\n\nexport interface AgentNativeExtensionDefinition {\n id: string;\n name: string;\n content: string;\n description?: string;\n updatedAt?: string;\n manifest?: AgentNativeExtensionManifest;\n slots?: readonly string[];\n requestedActions?: readonly string[];\n requestedCommands?: readonly string[];\n storageScopes?: readonly AgentNativeExtensionStorageScope[];\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageOptions {\n scope?: AgentNativeExtensionStorageScope;\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageContext {\n extensionId: string;\n slotId?: string;\n scope?: Exclude<AgentNativeExtensionStorageScope, \"all\">;\n userId?: string;\n organizationId?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentNativeExtensionStorageRow<TData = unknown> {\n id: string;\n extensionId: string;\n collection: string;\n data: TData;\n scope: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentNativeExtensionStorage {\n list(\n collection: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow[]\n | Promise<AgentNativeExtensionStorageRow[]>;\n get(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ):\n | AgentNativeExtensionStorageRow\n | null\n | Promise<AgentNativeExtensionStorageRow | null>;\n set(\n collection: string,\n id: string,\n data: unknown,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): AgentNativeExtensionStorageRow | Promise<AgentNativeExtensionStorageRow>;\n remove(\n collection: string,\n id: string,\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n ): { removed: boolean } | Promise<{ removed: boolean }>;\n}\n\nexport interface CreateHttpAgentNativeExtensionStorageOptions {\n /** Endpoint that receives storage operation POSTs. */\n endpoint: string;\n fetch?: typeof fetch;\n headers?:\n | HeadersInit\n | ((\n context: AgentNativeExtensionStorageContext,\n ) => HeadersInit | Promise<HeadersInit>);\n credentials?: RequestCredentials;\n}\n\nexport interface BuildAgentNativeExtensionHtmlOptions {\n extensionId: string;\n content: string;\n title?: string;\n slotId?: string;\n slotContext?: Record<string, unknown> | null;\n themeCss?: string;\n isDark?: boolean;\n}\n\nfunction firstList<T>(\n ...values: Array<readonly T[] | undefined>\n): readonly T[] | undefined {\n return values.find((value) => Array.isArray(value));\n}\n\nexport function getAgentNativeExtensionManifest(\n extension: AgentNativeExtensionDefinition,\n): AgentNativeExtensionManifest {\n return {\n slots: firstList(extension.manifest?.slots, extension.slots),\n requestedActions: firstList(\n extension.manifest?.requestedActions,\n extension.requestedActions,\n ),\n requestedCommands: firstList(\n extension.manifest?.requestedCommands,\n extension.requestedCommands,\n ),\n storageScopes: firstList(\n extension.manifest?.storageScopes,\n extension.storageScopes,\n ),\n };\n}\n\nexport function isAgentNativeExtensionAllowedInSlot(\n extension: AgentNativeExtensionDefinition,\n slotId: string | undefined,\n): boolean {\n if (!slotId) return true;\n const slots = getAgentNativeExtensionManifest(extension).slots;\n if (!slots) return true;\n return slots.includes(slotId);\n}\n\nfunction escapeHtmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction safeJson(value: unknown): string {\n try {\n const json = JSON.stringify(value);\n return typeof json === \"string\" ? json.replace(/</g, \"\\\\u003c\") : \"null\";\n } catch {\n return \"null\";\n }\n}\n\nfunction encodedSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction storageScope(\n options: AgentNativeExtensionStorageOptions | undefined,\n context: AgentNativeExtensionStorageContext,\n): string {\n const scope = options?.scope ?? context.scope ?? \"user\";\n return typeof scope === \"string\" && scope ? scope : \"user\";\n}\n\nfunction localStorageRef(): Storage {\n if (typeof window === \"undefined\" || !window.localStorage) {\n throw new Error(\"Extension localStorage is not available\");\n }\n return window.localStorage;\n}\n\nfunction bucketKey(\n namespace: string,\n extensionId: string,\n scope: string,\n collection: string,\n): string {\n return [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n encodedSegment(scope),\n encodedSegment(collection),\n ].join(\":\");\n}\n\nfunction readBucket(\n storage: Storage,\n key: string,\n): Record<string, AgentNativeExtensionStorageRow> {\n const raw = storage.getItem(key);\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, AgentNativeExtensionStorageRow>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction writeBucket(\n storage: Storage,\n key: string,\n value: Record<string, AgentNativeExtensionStorageRow>,\n) {\n storage.setItem(key, JSON.stringify(value));\n}\n\nfunction listLocalStorageBuckets(\n storage: Storage,\n namespace: string,\n extensionId: string,\n collection: string,\n): string[] {\n const prefix = [\n \"agent-native\",\n \"extension-data\",\n encodedSegment(namespace),\n encodedSegment(extensionId),\n \"\",\n ].join(\":\");\n const suffix = `:${encodedSegment(collection)}`;\n const keys: string[] = [];\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (key?.startsWith(prefix) && key.endsWith(suffix)) keys.push(key);\n }\n return keys;\n}\n\nexport function createLocalStorageAgentNativeExtensionStorage(\n namespace = \"default\",\n): AgentNativeExtensionStorage {\n return {\n list(collection, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n const keys =\n scope === \"all\"\n ? listLocalStorageBuckets(\n storage,\n namespace,\n context.extensionId,\n collection,\n )\n : [bucketKey(namespace, context.extensionId, scope, collection)];\n const rows = keys.flatMap((key) =>\n Object.values(readBucket(storage, key)),\n );\n const limit = options?.limit ?? 100;\n return rows\n .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n .slice(0, Math.max(0, limit));\n },\n get(collection, id, options, context) {\n const rows = this.list(collection, options, context);\n if (rows instanceof Promise) {\n return rows.then(\n (resolved) => resolved.find((row) => row.id === id) ?? null,\n );\n }\n return rows.find((row) => row.id === id) ?? null;\n },\n set(collection, id, data, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data writes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const now = new Date().toISOString();\n const row: AgentNativeExtensionStorageRow = {\n id,\n extensionId: context.extensionId,\n collection,\n data,\n scope,\n createdAt: bucket[id]?.createdAt ?? now,\n updatedAt: now,\n };\n bucket[id] = row;\n writeBucket(storage, key, bucket);\n return row;\n },\n remove(collection, id, options, context) {\n const storage = localStorageRef();\n const scope = storageScope(options, context);\n if (scope === \"all\") {\n throw new Error('Extension data deletes cannot use scope \"all\"');\n }\n const key = bucketKey(namespace, context.extensionId, scope, collection);\n const bucket = readBucket(storage, key);\n const removed = Boolean(bucket[id]);\n delete bucket[id];\n writeBucket(storage, key, bucket);\n return { removed };\n },\n };\n}\n\nasync function resolveHttpStorageHeaders(\n headers: CreateHttpAgentNativeExtensionStorageOptions[\"headers\"],\n context: AgentNativeExtensionStorageContext,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(context) : headers;\n}\n\nasync function readHttpStorageResponse<TResult>(\n response: Response,\n): Promise<TResult> {\n const text = await response.text();\n let body: unknown = text;\n if (text) {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n\n if (!response.ok) {\n const message =\n body && typeof body === \"object\" && \"error\" in body\n ? String((body as { error: unknown }).error)\n : `Extension storage request failed: ${response.status}`;\n throw new Error(message);\n }\n\n if (body && typeof body === \"object\" && \"result\" in body) {\n return (body as { result: TResult }).result;\n }\n return body as TResult;\n}\n\nexport function createHttpAgentNativeExtensionStorage({\n endpoint,\n fetch: fetchImpl,\n headers,\n credentials = \"same-origin\",\n}: CreateHttpAgentNativeExtensionStorageOptions): AgentNativeExtensionStorage {\n const run = async <TResult>(\n operation: \"list\" | \"get\" | \"set\" | \"remove\",\n collection: string,\n context: AgentNativeExtensionStorageContext,\n options?: AgentNativeExtensionStorageOptions,\n id?: string,\n data?: unknown,\n ): Promise<TResult> => {\n const requestFetch = fetchImpl ?? fetch;\n if (typeof requestFetch !== \"function\") {\n throw new Error(\"fetch is not available for extension storage\");\n }\n const resolvedHeaders = new Headers(\n await resolveHttpStorageHeaders(headers, context),\n );\n resolvedHeaders.set(\"Content-Type\", \"application/json\");\n\n const response = await requestFetch(endpoint, {\n method: \"POST\",\n credentials,\n headers: resolvedHeaders,\n body: JSON.stringify({\n operation,\n extensionId: context.extensionId,\n slotId: context.slotId,\n collection,\n id,\n data,\n options: options ?? {},\n context,\n }),\n });\n return readHttpStorageResponse<TResult>(response);\n };\n\n return {\n list(collection, options, context) {\n return run<AgentNativeExtensionStorageRow[]>(\n \"list\",\n collection,\n context,\n options,\n );\n },\n get(collection, id, options, context) {\n return run<AgentNativeExtensionStorageRow | null>(\n \"get\",\n collection,\n context,\n options,\n id,\n );\n },\n set(collection, id, data, options, context) {\n return run<AgentNativeExtensionStorageRow>(\n \"set\",\n collection,\n context,\n options,\n id,\n data,\n );\n },\n remove(collection, id, options, context) {\n return run<{ removed: boolean }>(\n \"remove\",\n collection,\n context,\n options,\n id,\n );\n },\n };\n}\n\nexport function normalizeAgentNativeExtensionSandbox(\n sandbox: string | undefined,\n): string {\n const tokens = new Set(\n (sandbox ?? \"allow-scripts allow-forms allow-popups allow-downloads\")\n .split(/\\s+/)\n .filter(Boolean),\n );\n tokens.delete(\"allow-same-origin\");\n tokens.add(\"allow-scripts\");\n tokens.add(\"allow-downloads\");\n return Array.from(tokens).join(\" \");\n}\n\nexport function buildAgentNativeExtensionHtml({\n extensionId,\n content,\n title,\n slotId,\n slotContext,\n themeCss = \"\",\n isDark = false,\n}: BuildAgentNativeExtensionHtmlOptions): string {\n const extensionIdJson = safeJson(extensionId);\n const slotIdJson = safeJson(slotId ?? \"\");\n const slotContextJson = safeJson(slotContext ?? {});\n const messageTypesJson = safeJson({\n host: AGENT_NATIVE_HOST_MESSAGE_TYPES,\n extension: AGENT_NATIVE_EXTENSION_MESSAGE_TYPES,\n });\n const titleText = title ?? \"Agent Native extension\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\"${isDark ? ' class=\"dark\"' : \"\"}>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${escapeHtmlAttribute(EXTENSION_IFRAME_META_CSP)}\" />\n <title>${escapeHtmlAttribute(titleText)}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@300..700&display=swap\" rel=\"stylesheet\" />\n <script\n src=\"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4.2.4\"\n integrity=\"sha384-yNSZBFvuOWcmww494a9+1zNuvgUGEXoWkein7cxP8wHUTi3iXCU4vJ7hr3tzBCml\"\n crossorigin=\"anonymous\"\n ></script>\n <script\n defer\n src=\"https://cdn.jsdelivr.net/npm/alpinejs@3.15.11/dist/cdn.min.js\"\n integrity=\"sha384-WPtu0YHhJ3arcykfnv1JgUffWDSKRnqnDeTpJUbOc2os2moEmLkIdaeR0trPN4be\"\n crossorigin=\"anonymous\"\n ></script>\n <style>${themeCss}</style>\n <style type=\"text/tailwindcss\">\n @custom-variant dark (&:where(.dark, .dark *));\n @theme {\n --color-border: hsl(var(--border, 214 32% 91%));\n --color-background: hsl(var(--background, 0 0% 100%));\n --color-foreground: hsl(var(--foreground, 222 47% 11%));\n --color-primary: hsl(var(--primary, 222 47% 11%));\n --color-primary-foreground: hsl(var(--primary-foreground, 210 40% 98%));\n --color-muted: hsl(var(--muted, 210 40% 96%));\n --color-muted-foreground: hsl(var(--muted-foreground, 215 16% 47%));\n --color-card: hsl(var(--card, 0 0% 100%));\n --color-card-foreground: hsl(var(--card-foreground, 222 47% 11%));\n --radius-lg: var(--radius, .5rem);\n --radius-md: calc(var(--radius, .5rem) - 2px);\n --radius-sm: calc(var(--radius, .5rem) - 4px);\n }\n </style>\n <style>\n *, *::before, *::after { box-sizing: border-box; border-color: hsl(var(--border, 214 32% 91%)); }\n html, body { margin: 0; min-height: 100%; background: transparent; color: hsl(var(--foreground, 222 47% 11%)); }\n body {\n --agent-native-extension-padding: clamp(12px, 2vw, 20px);\n font-family: Inter, ui-sans-serif, system-ui, sans-serif;\n padding: var(--agent-native-extension-padding);\n }\n body:has(> [data-extension-layout=\"full-bleed\"]),\n body:has(> [data-extension-padding=\"none\"]),\n body:has(> .agent-native-extension-bleed) {\n padding: 0;\n }\n </style>\n <script>\n (function() {\n var messageTypes = ${messageTypesJson};\n var extensionId = ${extensionIdJson};\n var slotId = ${slotIdJson};\n var slotContext = ${slotContextJson};\n var requestSeq = 0;\n var pending = {};\n\n function nextRequestId(prefix) {\n requestSeq += 1;\n return prefix + '-' + Date.now() + '-' + requestSeq;\n }\n\n function failMessage(message, fallback) {\n return typeof message.error === 'string' ? message.error : fallback;\n }\n\n function requestParent(message, responseType, timeoutMs) {\n timeoutMs = timeoutMs || 30000;\n return new Promise(function(resolve, reject) {\n var requestId = message.requestId || nextRequestId('extension');\n var timer = setTimeout(function() {\n delete pending[requestId];\n reject(new Error('Timed out waiting for host response'));\n }, timeoutMs);\n pending[requestId] = {\n responseType: responseType,\n resolve: resolve,\n reject: reject,\n timer: timer,\n };\n window.parent.postMessage(Object.assign({}, message, { requestId: requestId }), '*');\n });\n }\n\n window.addEventListener('message', function(event) {\n if (event.source !== window.parent) return;\n var message = event.data || {};\n\n if (message.type === messageTypes.host.INIT) {\n agentNative.init = message;\n agentNative.contextSnapshot = message.context || null;\n agentNative.actionsSnapshot = message.actions || [];\n window.dispatchEvent(new CustomEvent('agentNative:init', { detail: message }));\n return;\n }\n\n if (message.type === messageTypes.extension.SLOT_CONTEXT) {\n slotContext = message.context || {};\n agentNative.slotContext = slotContext;\n window.slotContext = slotContext;\n window.dispatchEvent(new CustomEvent('agentNative:slot-context', { detail: slotContext }));\n return;\n }\n\n var entry = pending[message.requestId];\n if (!entry || message.type !== entry.responseType) return;\n delete pending[message.requestId];\n clearTimeout(entry.timer);\n if (message.ok === false) {\n entry.reject(new Error(failMessage(message, 'Host request failed')));\n } else {\n entry.resolve(message);\n }\n });\n\n function hostContext() {\n return requestParent(\n { type: messageTypes.host.GET_CONTEXT },\n messageTypes.host.CONTEXT,\n ).then(function(message) { return message.context || {}; });\n }\n\n function hostActions() {\n return requestParent(\n { type: messageTypes.host.LIST_ACTIONS },\n messageTypes.host.ACTIONS,\n ).then(function(message) { return message.actions || []; });\n }\n\n function hostAction(name, args) {\n return requestParent(\n { type: messageTypes.host.RUN_ACTION, name: name, args: args || {} },\n messageTypes.host.ACTION_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function hostCommand(command, payload) {\n return requestParent(\n { type: messageTypes.host.COMMAND, command: command, payload: payload },\n messageTypes.host.COMMAND_RESULT,\n ).then(function(message) { return message.result; });\n }\n\n function storageRequest(op, collection, id, data, options) {\n return requestParent(\n {\n type: messageTypes.extension.STORAGE_REQUEST,\n op: op,\n collection: collection,\n id: id,\n data: data,\n options: options || {},\n },\n messageTypes.extension.STORAGE_RESPONSE,\n ).then(function(message) { return message.result; });\n }\n\n var extensionData = {\n list: function(collection, options) {\n return storageRequest('list', collection, undefined, undefined, options);\n },\n get: function(collection, id, options) {\n return storageRequest('get', collection, id, undefined, options);\n },\n set: function(collection, id, data, options) {\n return storageRequest('set', collection, id, data, options);\n },\n remove: function(collection, id, options) {\n return storageRequest('remove', collection, id, undefined, options);\n },\n };\n\n var agentNative = {\n version: '0.1.0',\n extensionId: extensionId,\n slotId: slotId,\n slotContext: slotContext,\n contextSnapshot: null,\n actionsSnapshot: [],\n init: null,\n context: hostContext,\n listActions: hostActions,\n action: hostAction,\n command: hostCommand,\n refresh: function(payload) { return hostCommand('refreshData', payload); },\n data: extensionData,\n };\n\n window.agentNative = agentNative;\n window.appAction = hostAction;\n window.extensionData = extensionData;\n window.toolData = extensionData;\n window.extensionId = extensionId;\n window.toolId = extensionId;\n window.slotContext = slotContext;\n\n function reportHeight() {\n try {\n var doc = document.documentElement;\n var body = document.body;\n var height = Math.max(\n doc ? doc.scrollHeight : 0,\n doc ? doc.offsetHeight : 0,\n body ? body.scrollHeight : 0,\n body ? body.offsetHeight : 0,\n );\n window.parent.postMessage({\n type: messageTypes.extension.RESIZE,\n extensionId: extensionId,\n slotId: slotId,\n height: height,\n }, '*');\n } catch (_) {}\n }\n\n window.addEventListener('load', reportHeight);\n if (typeof ResizeObserver !== 'undefined') {\n new ResizeObserver(reportHeight).observe(document.documentElement);\n } else {\n setInterval(reportHeight, 1000);\n }\n\n window.parent.postMessage({\n type: messageTypes.host.READY,\n requestId: nextRequestId('ready'),\n }, '*');\n })();\n </script>\n</head>\n<body>\n${content}\n</body>\n</html>`;\n}\n"]}
@@ -6,7 +6,7 @@ export interface OrgSwitcherProps {
6
6
  reserveSpace?: boolean;
7
7
  /**
8
8
  * Path to navigate to when the user clicks "Organization settings".
9
- * Defaults to the standard Team tab inside Settings. Templates with an
9
+ * Defaults to the Organization tab inside Settings. Templates with an
10
10
  * established org surface can pass their own path; pass `null` to only open
11
11
  * the in-sidebar settings panel.
12
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAwDA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAiOD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAiD,GAClD,EAAE,gBAAgB,sCA2blB"}
1
+ {"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAwDA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAmOD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAiD,GAClD,EAAE,gBAAgB,sCA4blB"}
@@ -24,7 +24,7 @@ const ITEM_CLASS = "flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-fo
24
24
  const SECTION_LABEL_CLASS = "px-2.5 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground";
25
25
  const APP_SUBMENU_CONTENT_CLASS = "z-50 w-72 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2";
26
26
  const SWITCHER_BUTTON_CLASS = "flex w-full items-center gap-2 rounded-md border border-border/70 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-60 cursor-pointer";
27
- const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/settings#team";
27
+ const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/settings#organization";
28
28
  const APP_ICON_MAP = {
29
29
  Mail: IconMail,
30
30
  CalendarDays: IconCalendar,
@@ -54,7 +54,10 @@ function appMenuIcon(app) {
54
54
  return app.isDispatch ? IconMessageCircle : IconStack2;
55
55
  }
56
56
  function organizationSettingsPath(path) {
57
- return path.includes("#") ? path : `${path}#team`;
57
+ if (path.includes("#"))
58
+ return path;
59
+ const pathname = path.split("?")[0]?.replace(/\/+$/, "");
60
+ return pathname === "/settings" ? `${path}#organization` : path;
58
61
  }
59
62
  function AppMenuLink({ app, onNavigate, }) {
60
63
  const Icon = appMenuIcon(app);
@@ -202,13 +205,15 @@ export function OrgSwitcher({ className, hideWhenSingle, reserveSpace, settingsP
202
205
  }, disabled: joinByDomain.isPending, className: "rounded px-1.5 py-0.5 text-[11px] font-medium text-primary hover:bg-primary/10 disabled:opacity-50 cursor-pointer", children: isJoining ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : ("Join") })] }, match.orgId));
203
206
  })] })), _jsx("div", { className: "my-1 h-px bg-border" }), _jsx(AppsSubmenu, { apps: appLinks.apps, isWorkspace: appLinks.isWorkspace, isLoading: appLinks.isLoading, dispatchHref: appLinks.dispatchHref, dispatchAllAppsHref: appLinks.dispatchAllAppsHref, onNavigate: () => setOpen(false) }), inOrg && (_jsxs("button", { type: "button", onClick: () => {
204
207
  setOpen(false);
205
- window.dispatchEvent(new CustomEvent("agent-panel:open"));
206
- window.dispatchEvent(new CustomEvent("agent-panel:open-settings", {
207
- detail: { section: "workspace-settings" },
208
- }));
209
208
  if (organizationSettingsHref) {
210
209
  navigate(organizationSettingsHref);
211
210
  }
211
+ else {
212
+ window.dispatchEvent(new CustomEvent("agent-panel:open"));
213
+ window.dispatchEvent(new CustomEvent("agent-panel:open-settings", {
214
+ detail: { section: "workspace-settings" },
215
+ }));
216
+ }
212
217
  }, className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconSettings, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-start", children: "Organization settings" })] })), _jsxs("button", { type: "button", onClick: () => {
213
218
  // Clear any leftover input from a prior session — otherwise
214
219
  // the create form re-opens prefilled with the just-created