@agent-native/core 0.117.2 → 0.118.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 (776) hide show
  1. package/corpus/README.md +3 -3
  2. package/corpus/core/CHANGELOG.md +51 -0
  3. package/corpus/core/docs/content/custom-design-system.mdx +445 -0
  4. package/corpus/core/docs/content/toolkit-ui.mdx +16 -0
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/a2a/client.ts +32 -10
  7. package/corpus/core/src/a2a/types.ts +1 -0
  8. package/corpus/core/src/agent/types.ts +1 -1
  9. package/corpus/core/src/cli/index.ts +18 -10
  10. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  11. package/corpus/core/src/cli/templates-meta.ts +0 -12
  12. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  13. package/corpus/core/src/client/AgentPanel.tsx +99 -108
  14. package/corpus/core/src/client/AssistantChat.tsx +30 -13
  15. package/corpus/core/src/client/CommandMenu.tsx +68 -178
  16. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  17. package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
  18. package/corpus/core/src/client/app-providers.tsx +1 -1
  19. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  20. package/corpus/core/src/client/chat/message-components.tsx +169 -18
  21. package/corpus/core/src/client/chat/tool-call-display.tsx +50 -14
  22. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +13 -40
  23. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  24. package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
  25. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  26. package/corpus/core/src/client/error-capture.ts +2 -6
  27. package/corpus/core/src/client/i18n.tsx +22 -0
  28. package/corpus/core/src/client/index.ts +17 -0
  29. package/corpus/core/src/client/org/TeamPage.tsx +257 -153
  30. package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
  31. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +25 -16
  32. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
  33. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  34. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +20 -17
  35. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  36. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  37. package/corpus/core/src/client/session-replay.ts +3 -3
  38. package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
  39. package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
  40. package/corpus/core/src/client/settings/SettingsPanel.tsx +217 -252
  41. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
  42. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  43. package/corpus/core/src/client/settings/index.ts +7 -0
  44. package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
  45. package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  46. package/corpus/core/src/client/setup-connections/index.ts +10 -0
  47. package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  48. package/corpus/core/src/client/sharing/ShareButton.tsx +64 -586
  49. package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
  50. package/corpus/core/src/client/sharing/index.ts +42 -0
  51. package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
  52. package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
  53. package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
  54. package/corpus/core/src/client/sse-event-processor.ts +23 -0
  55. package/corpus/core/src/client/tool-display.ts +71 -0
  56. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  57. package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
  58. package/corpus/core/src/client/use-chat-threads.ts +33 -12
  59. package/corpus/core/src/deploy/build.ts +2 -1
  60. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  61. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  62. package/corpus/core/src/integrations/index.ts +5 -1
  63. package/corpus/core/src/localization/default-messages.ts +6 -1
  64. package/corpus/core/src/mcp-client/oauth-routes.ts +61 -14
  65. package/corpus/core/src/scripts/call-agent.ts +5 -1
  66. package/corpus/core/src/server/realtime-voice.ts +5 -2
  67. package/corpus/core/src/styles/agent-native.css +0 -24
  68. package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  69. package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  70. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  71. package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  72. package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  73. package/corpus/core/src/templates/default/app/design-system.ts +3 -0
  74. package/corpus/core/src/templates/default/app/root.tsx +5 -2
  75. package/corpus/core/src/templates/default/package.json +1 -0
  76. package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  77. package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  78. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  79. package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  80. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  81. package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  82. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  83. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  84. package/corpus/core/src/vite/client.ts +205 -1
  85. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  86. package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  87. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
  88. package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
  89. package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
  90. package/corpus/templates/analytics/app/design-system.ts +3 -0
  91. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  92. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  93. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  94. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  95. package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  96. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
  97. package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
  98. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
  99. package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
  100. package/corpus/templates/assets/app/design-system.ts +3 -0
  101. package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
  102. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  103. package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  104. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
  105. package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
  106. package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
  107. package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
  108. package/corpus/templates/brain/app/design-system.ts +3 -0
  109. package/corpus/templates/brain/app/routes/sources.tsx +189 -122
  110. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  111. package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  112. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
  113. package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
  114. package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
  115. package/corpus/templates/calendar/app/design-system.ts +3 -0
  116. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  117. package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  118. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  119. package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  120. package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  121. package/corpus/templates/chat/app/design-system.ts +3 -0
  122. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  123. package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  124. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
  125. package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
  126. package/corpus/templates/clips/AGENTS.md +8 -6
  127. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  128. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  129. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  130. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  131. package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
  132. package/corpus/templates/clips/app/design-system.ts +3 -0
  133. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  134. package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
  135. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  136. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  138. package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
  141. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  142. package/corpus/templates/clips/desktop/src/app.tsx +86 -82
  143. package/corpus/templates/clips/desktop/src/styles.css +13 -0
  144. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +10 -1
  145. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
  146. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
  147. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  148. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  149. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  150. package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  151. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
  152. package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
  153. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
  154. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  155. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  156. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
  157. package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
  158. package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
  159. package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
  160. package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
  161. package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
  162. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  163. package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
  164. package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
  165. package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
  166. package/corpus/templates/content/app/design-system.ts +3 -0
  167. package/corpus/templates/content/app/global.css +29 -3
  168. package/corpus/templates/content/app/i18n-data.ts +10 -0
  169. package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
  170. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  171. package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  172. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
  173. package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
  174. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
  175. package/corpus/templates/design/app/components/ui/command.tsx +1 -0
  176. package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
  177. package/corpus/templates/design/app/design-system.ts +3 -0
  178. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  179. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  180. package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  181. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
  182. package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
  183. package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
  184. package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
  185. package/corpus/templates/dispatch/app/design-system.ts +3 -0
  186. package/corpus/templates/dispatch/app/root.tsx +10 -7
  187. package/corpus/templates/dispatch/package.json +1 -0
  188. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  189. package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  190. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
  191. package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
  192. package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
  193. package/corpus/templates/forms/app/design-system.ts +3 -0
  194. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  195. package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  196. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
  197. package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
  198. package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
  199. package/corpus/templates/macros/app/design-system.ts +3 -0
  200. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  201. package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  202. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
  203. package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
  204. package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
  205. package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
  206. package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
  207. package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
  208. package/corpus/templates/mail/app/design-system.ts +3 -0
  209. package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
  210. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  211. package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  212. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
  213. package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
  214. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
  215. package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
  216. package/corpus/templates/plan/app/design-system.ts +3 -0
  217. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  218. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  219. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  220. package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  221. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
  222. package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
  223. package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
  224. package/corpus/templates/slides/app/design-system.ts +3 -0
  225. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  226. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  227. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  228. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  229. package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  230. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
  231. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
  232. package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
  233. package/corpus/templates/tasks/app/design-system.ts +3 -0
  234. package/corpus/templates/tasks/app/root.tsx +5 -2
  235. package/corpus/toolkit/CHANGELOG.md +23 -0
  236. package/corpus/toolkit/agent-native.eject.json +71 -0
  237. package/corpus/toolkit/package.json +31 -1
  238. package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
  239. package/corpus/toolkit/src/chat-history/index.ts +9 -0
  240. package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
  241. package/corpus/toolkit/src/chat-history.css +2 -0
  242. package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
  243. package/corpus/toolkit/src/composer/PromptComposer.tsx +32 -7
  244. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  245. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +124 -9
  246. package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
  247. package/corpus/toolkit/src/conformance/index.ts +3 -0
  248. package/corpus/toolkit/src/conformance/runner.tsx +862 -0
  249. package/corpus/toolkit/src/conformance/types.ts +45 -0
  250. package/corpus/toolkit/src/conformance/version.ts +22 -0
  251. package/corpus/toolkit/src/design-system/components.tsx +146 -0
  252. package/corpus/toolkit/src/design-system/context.tsx +31 -0
  253. package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
  254. package/corpus/toolkit/src/design-system/definition.ts +14 -0
  255. package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
  256. package/corpus/toolkit/src/design-system/index.ts +7 -0
  257. package/corpus/toolkit/src/design-system/theme.ts +145 -0
  258. package/corpus/toolkit/src/design-system/types.ts +363 -0
  259. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  260. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  261. package/corpus/toolkit/src/editor/index.ts +2 -0
  262. package/corpus/toolkit/src/provider.tsx +98 -5
  263. package/corpus/toolkit/src/styles.css +52 -23
  264. package/corpus/toolkit/src/ui/button.tsx +95 -6
  265. package/corpus/toolkit/src/ui/dialog.tsx +48 -23
  266. package/corpus/toolkit/src/ui/popover.tsx +16 -2
  267. package/corpus/toolkit/src/ui/select.tsx +7 -3
  268. package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
  269. package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
  270. package/dist/a2a/client.d.ts +3 -1
  271. package/dist/a2a/client.d.ts.map +1 -1
  272. package/dist/a2a/client.js +17 -12
  273. package/dist/a2a/client.js.map +1 -1
  274. package/dist/a2a/types.d.ts +1 -1
  275. package/dist/a2a/types.d.ts.map +1 -1
  276. package/dist/a2a/types.js.map +1 -1
  277. package/dist/agent/types.d.ts +1 -1
  278. package/dist/agent/types.d.ts.map +1 -1
  279. package/dist/agent/types.js.map +1 -1
  280. package/dist/cli/index.js +18 -8
  281. package/dist/cli/index.js.map +1 -1
  282. package/dist/cli/multi-frontier-runs.js +3 -3
  283. package/dist/cli/multi-frontier-runs.js.map +1 -1
  284. package/dist/cli/templates-meta.d.ts.map +1 -1
  285. package/dist/cli/templates-meta.js +0 -12
  286. package/dist/cli/templates-meta.js.map +1 -1
  287. package/dist/cli/workspace-dev.js +1 -1
  288. package/dist/cli/workspace-dev.js.map +1 -1
  289. package/dist/client/AgentPanel.d.ts.map +1 -1
  290. package/dist/client/AgentPanel.js +18 -15
  291. package/dist/client/AgentPanel.js.map +1 -1
  292. package/dist/client/AssistantChat.d.ts.map +1 -1
  293. package/dist/client/AssistantChat.js +26 -15
  294. package/dist/client/AssistantChat.js.map +1 -1
  295. package/dist/client/CommandMenu.d.ts.map +1 -1
  296. package/dist/client/CommandMenu.js +18 -106
  297. package/dist/client/CommandMenu.js.map +1 -1
  298. package/dist/client/RunStuckBanner.d.ts +3 -5
  299. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  300. package/dist/client/RunStuckBanner.js +17 -18
  301. package/dist/client/RunStuckBanner.js.map +1 -1
  302. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  303. package/dist/client/agent-chat-adapter.js +2 -1
  304. package/dist/client/agent-chat-adapter.js.map +1 -1
  305. package/dist/client/app-providers.d.ts.map +1 -1
  306. package/dist/client/app-providers.js +1 -1
  307. package/dist/client/app-providers.js.map +1 -1
  308. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  309. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  310. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  311. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  312. package/dist/client/chat/message-components.d.ts +12 -1
  313. package/dist/client/chat/message-components.d.ts.map +1 -1
  314. package/dist/client/chat/message-components.js +102 -14
  315. package/dist/client/chat/message-components.js.map +1 -1
  316. package/dist/client/chat/tool-call-display.d.ts +3 -1
  317. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  318. package/dist/client/chat/tool-call-display.js +33 -14
  319. package/dist/client/chat/tool-call-display.js.map +1 -1
  320. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  321. package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
  322. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  323. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  324. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  325. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  326. package/dist/client/components/ui/message-scroller.d.ts +1 -1
  327. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  328. package/dist/client/components/ui/message-scroller.js +4 -3
  329. package/dist/client/components/ui/message-scroller.js.map +1 -1
  330. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  331. package/dist/client/conversation/AgentConversation.js +3 -2
  332. package/dist/client/conversation/AgentConversation.js.map +1 -1
  333. package/dist/client/error-capture.d.ts.map +1 -1
  334. package/dist/client/error-capture.js +2 -2
  335. package/dist/client/error-capture.js.map +1 -1
  336. package/dist/client/i18n.d.ts.map +1 -1
  337. package/dist/client/i18n.js +9 -0
  338. package/dist/client/i18n.js.map +1 -1
  339. package/dist/client/index.d.ts +2 -2
  340. package/dist/client/index.d.ts.map +1 -1
  341. package/dist/client/index.js +2 -2
  342. package/dist/client/index.js.map +1 -1
  343. package/dist/client/org/TeamPage.d.ts.map +1 -1
  344. package/dist/client/org/TeamPage.js +41 -33
  345. package/dist/client/org/TeamPage.js.map +1 -1
  346. package/dist/client/progress/RunsTray.d.ts.map +1 -1
  347. package/dist/client/progress/RunsTray.js +9 -10
  348. package/dist/client/progress/RunsTray.js.map +1 -1
  349. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  350. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  351. package/dist/client/resources/McpConnectionSuggestion.js +14 -12
  352. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  353. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  354. package/dist/client/resources/McpIntegrationDialog.js +10 -8
  355. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  356. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  357. package/dist/client/resources/ResourcesPanel.js +3 -1
  358. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  359. package/dist/client/resources/mcp-integration-catalog.d.ts +2 -0
  360. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  361. package/dist/client/resources/mcp-integration-catalog.js +17 -17
  362. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  363. package/dist/client/resources/mcp-integration-logos.js +2 -2
  364. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  365. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  366. package/dist/client/route-chunk-recovery.js +5 -3
  367. package/dist/client/route-chunk-recovery.js.map +1 -1
  368. package/dist/client/session-replay.js +3 -3
  369. package/dist/client/session-replay.js.map +1 -1
  370. package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
  371. package/dist/client/settings/DemoModeSection.js +2 -5
  372. package/dist/client/settings/DemoModeSection.js.map +1 -1
  373. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  374. package/dist/client/settings/SecretsSection.js +18 -6
  375. package/dist/client/settings/SecretsSection.js.map +1 -1
  376. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  377. package/dist/client/settings/SettingsPanel.js +53 -118
  378. package/dist/client/settings/SettingsPanel.js.map +1 -1
  379. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  380. package/dist/client/settings/SettingsTabsPage.js +16 -1
  381. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  382. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  383. package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
  384. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  385. package/dist/client/settings/index.d.ts +1 -0
  386. package/dist/client/settings/index.d.ts.map +1 -1
  387. package/dist/client/settings/index.js +1 -0
  388. package/dist/client/settings/index.js.map +1 -1
  389. package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
  390. package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
  391. package/dist/client/settings/useSettingsPanelController.js +103 -0
  392. package/dist/client/settings/useSettingsPanelController.js.map +1 -0
  393. package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
  394. package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
  395. package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
  396. package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
  397. package/dist/client/setup-connections/index.d.ts +2 -1
  398. package/dist/client/setup-connections/index.d.ts.map +1 -1
  399. package/dist/client/setup-connections/index.js +2 -1
  400. package/dist/client/setup-connections/index.js.map +1 -1
  401. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
  402. package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
  403. package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
  404. package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
  405. package/dist/client/sharing/ShareButton.d.ts +2 -1
  406. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  407. package/dist/client/sharing/ShareButton.js +17 -463
  408. package/dist/client/sharing/ShareButton.js.map +1 -1
  409. package/dist/client/sharing/ShareDialog.d.ts +6 -6
  410. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  411. package/dist/client/sharing/ShareDialog.js +69 -283
  412. package/dist/client/sharing/ShareDialog.js.map +1 -1
  413. package/dist/client/sharing/index.d.ts +3 -0
  414. package/dist/client/sharing/index.d.ts.map +1 -1
  415. package/dist/client/sharing/index.js +3 -0
  416. package/dist/client/sharing/index.js.map +1 -1
  417. package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
  418. package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
  419. package/dist/client/sharing/share-controller-helpers.js +224 -0
  420. package/dist/client/sharing/share-controller-helpers.js.map +1 -0
  421. package/dist/client/sharing/useShareButtonController.d.ts +91 -0
  422. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
  423. package/dist/client/sharing/useShareButtonController.js +397 -0
  424. package/dist/client/sharing/useShareButtonController.js.map +1 -0
  425. package/dist/client/sharing/useShareDialogController.d.ts +109 -0
  426. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
  427. package/dist/client/sharing/useShareDialogController.js +348 -0
  428. package/dist/client/sharing/useShareDialogController.js.map +1 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +21 -0
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/client/tool-display.d.ts +16 -0
  433. package/dist/client/tool-display.d.ts.map +1 -1
  434. package/dist/client/tool-display.js +52 -0
  435. package/dist/client/tool-display.js.map +1 -1
  436. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  437. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  438. package/dist/client/transcription/use-live-transcription.js +22 -11
  439. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  440. package/dist/client/use-agent-engine-configured.d.ts +3 -2
  441. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  442. package/dist/client/use-agent-engine-configured.js +7 -19
  443. package/dist/client/use-agent-engine-configured.js.map +1 -1
  444. package/dist/client/use-chat-threads.d.ts.map +1 -1
  445. package/dist/client/use-chat-threads.js +21 -8
  446. package/dist/client/use-chat-threads.js.map +1 -1
  447. package/dist/collab/routes.d.ts +1 -1
  448. package/dist/collab/struct-routes.d.ts +1 -1
  449. package/dist/deploy/build.d.ts.map +1 -1
  450. package/dist/deploy/build.js +1 -1
  451. package/dist/deploy/build.js.map +1 -1
  452. package/dist/guards/db-tool-scoping.js +1 -1
  453. package/dist/guards/db-tool-scoping.js.map +1 -1
  454. package/dist/integrations/adapters/slack.d.ts +1 -0
  455. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  456. package/dist/integrations/adapters/slack.js +61 -5
  457. package/dist/integrations/adapters/slack.js.map +1 -1
  458. package/dist/integrations/index.d.ts +1 -1
  459. package/dist/integrations/index.d.ts.map +1 -1
  460. package/dist/integrations/index.js +1 -1
  461. package/dist/integrations/index.js.map +1 -1
  462. package/dist/localization/default-messages.d.ts +4 -0
  463. package/dist/localization/default-messages.d.ts.map +1 -1
  464. package/dist/localization/default-messages.js +5 -1
  465. package/dist/localization/default-messages.js.map +1 -1
  466. package/dist/mcp-client/oauth-routes.d.ts +5 -0
  467. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  468. package/dist/mcp-client/oauth-routes.js +53 -14
  469. package/dist/mcp-client/oauth-routes.js.map +1 -1
  470. package/dist/notifications/routes.d.ts +2 -2
  471. package/dist/observability/routes.d.ts +1 -1
  472. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  473. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  474. package/dist/scripts/call-agent.d.ts.map +1 -1
  475. package/dist/scripts/call-agent.js +5 -1
  476. package/dist/scripts/call-agent.js.map +1 -1
  477. package/dist/secrets/routes.d.ts +6 -6
  478. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  479. package/dist/server/realtime-voice.d.ts.map +1 -1
  480. package/dist/server/realtime-voice.js +2 -2
  481. package/dist/server/realtime-voice.js.map +1 -1
  482. package/dist/styles/agent-native.css +0 -24
  483. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  484. package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  485. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  486. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  487. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  488. package/dist/templates/chat/app/design-system.ts +3 -0
  489. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  490. package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  491. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  492. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  493. package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  494. package/dist/templates/default/app/design-system.ts +3 -0
  495. package/dist/templates/default/app/root.tsx +5 -2
  496. package/dist/templates/default/package.json +1 -0
  497. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  498. package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  499. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  500. package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  501. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  502. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  503. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  504. package/dist/terminal/cli-registry.js +1 -1
  505. package/dist/terminal/cli-registry.js.map +1 -1
  506. package/dist/vite/client.d.ts +11 -1
  507. package/dist/vite/client.d.ts.map +1 -1
  508. package/dist/vite/client.js +144 -2
  509. package/dist/vite/client.js.map +1 -1
  510. package/docs/content/custom-design-system.mdx +445 -0
  511. package/docs/content/toolkit-ui.mdx +16 -0
  512. package/package.json +2 -2
  513. package/src/a2a/client.ts +32 -10
  514. package/src/a2a/types.ts +1 -0
  515. package/src/agent/types.ts +1 -1
  516. package/src/cli/index.ts +18 -10
  517. package/src/cli/multi-frontier-runs.ts +5 -3
  518. package/src/cli/templates-meta.ts +0 -12
  519. package/src/cli/workspace-dev.ts +1 -1
  520. package/src/client/AgentPanel.tsx +99 -108
  521. package/src/client/AssistantChat.tsx +30 -13
  522. package/src/client/CommandMenu.tsx +68 -178
  523. package/src/client/RunStuckBanner.tsx +39 -47
  524. package/src/client/agent-chat-adapter.ts +3 -1
  525. package/src/client/app-providers.tsx +1 -1
  526. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  527. package/src/client/chat/message-components.tsx +169 -18
  528. package/src/client/chat/tool-call-display.tsx +50 -14
  529. package/src/client/chat/widgets/InlineExtensionWidget.tsx +13 -40
  530. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  531. package/src/client/components/ui/message-scroller.tsx +15 -1
  532. package/src/client/conversation/AgentConversation.tsx +12 -1
  533. package/src/client/error-capture.ts +2 -6
  534. package/src/client/i18n.tsx +22 -0
  535. package/src/client/index.ts +17 -0
  536. package/src/client/org/TeamPage.tsx +257 -153
  537. package/src/client/progress/RunsTray.tsx +89 -88
  538. package/src/client/resources/McpConnectionSuggestion.tsx +25 -16
  539. package/src/client/resources/McpIntegrationDialog.tsx +34 -13
  540. package/src/client/resources/ResourcesPanel.tsx +5 -1
  541. package/src/client/resources/mcp-integration-catalog.ts +20 -17
  542. package/src/client/resources/mcp-integration-logos.ts +2 -2
  543. package/src/client/route-chunk-recovery.ts +5 -3
  544. package/src/client/session-replay.ts +3 -3
  545. package/src/client/settings/DemoModeSection.tsx +6 -18
  546. package/src/client/settings/SecretsSection.tsx +97 -52
  547. package/src/client/settings/SettingsPanel.tsx +217 -252
  548. package/src/client/settings/SettingsTabsPage.tsx +23 -2
  549. package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
  550. package/src/client/settings/index.ts +7 -0
  551. package/src/client/settings/useSettingsPanelController.ts +155 -0
  552. package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
  553. package/src/client/setup-connections/index.ts +10 -0
  554. package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
  555. package/src/client/sharing/ShareButton.tsx +64 -586
  556. package/src/client/sharing/ShareDialog.tsx +299 -633
  557. package/src/client/sharing/index.ts +42 -0
  558. package/src/client/sharing/share-controller-helpers.ts +318 -0
  559. package/src/client/sharing/useShareButtonController.ts +600 -0
  560. package/src/client/sharing/useShareDialogController.ts +559 -0
  561. package/src/client/sse-event-processor.ts +23 -0
  562. package/src/client/tool-display.ts +71 -0
  563. package/src/client/transcription/use-live-transcription.ts +64 -45
  564. package/src/client/use-agent-engine-configured.ts +12 -19
  565. package/src/client/use-chat-threads.ts +33 -12
  566. package/src/deploy/build.ts +2 -1
  567. package/src/guards/db-tool-scoping.ts +1 -1
  568. package/src/integrations/adapters/slack.ts +84 -5
  569. package/src/integrations/index.ts +5 -1
  570. package/src/localization/default-messages.ts +6 -1
  571. package/src/mcp-client/oauth-routes.ts +61 -14
  572. package/src/scripts/call-agent.ts +5 -1
  573. package/src/server/realtime-voice.ts +5 -2
  574. package/src/styles/agent-native.css +0 -24
  575. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  576. package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  577. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
  578. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
  579. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
  580. package/src/templates/chat/app/design-system.ts +3 -0
  581. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  582. package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  583. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
  584. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
  585. package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
  586. package/src/templates/default/app/design-system.ts +3 -0
  587. package/src/templates/default/app/root.tsx +5 -2
  588. package/src/templates/default/package.json +1 -0
  589. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  590. package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  591. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +37 -2
  592. package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
  593. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
  594. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
  595. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  596. package/src/terminal/cli-registry.ts +1 -1
  597. package/src/vite/client.ts +205 -1
  598. package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
  599. package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
  600. package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
  601. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  602. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -142
  603. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  604. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -145
  605. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  606. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  607. package/corpus/templates/crm/.env.example +0 -5
  608. package/corpus/templates/crm/AGENTS.md +0 -120
  609. package/corpus/templates/crm/CHANGELOG.md +0 -1
  610. package/corpus/templates/crm/DEVELOPING.md +0 -66
  611. package/corpus/templates/crm/README.md +0 -106
  612. package/corpus/templates/crm/_gitignore +0 -12
  613. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  614. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  615. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  616. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  617. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  618. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  619. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  620. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  621. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  622. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  623. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  624. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  625. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  626. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  627. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  628. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  629. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  630. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  631. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  632. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  633. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  634. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  635. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  636. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  637. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  638. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  639. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  640. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  641. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  642. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  643. package/corpus/templates/crm/actions/navigate.ts +0 -63
  644. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  645. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  646. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  647. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  648. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  649. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  650. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  651. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  652. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  653. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  654. package/corpus/templates/crm/actions/run.ts +0 -7
  655. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  656. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  657. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  658. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  659. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  660. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  661. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  662. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -83
  663. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -225
  664. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -413
  665. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  666. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  667. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -367
  668. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -92
  669. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -96
  670. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  671. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  672. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  673. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  674. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  675. package/corpus/templates/crm/app/global.css +0 -167
  676. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  677. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  678. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  679. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  680. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  681. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  682. package/corpus/templates/crm/app/lib/types.ts +0 -172
  683. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  684. package/corpus/templates/crm/app/root.tsx +0 -88
  685. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  686. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  687. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  688. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  689. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  690. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  691. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  692. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  693. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  694. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  695. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  696. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  697. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  698. package/corpus/templates/crm/app/routes.ts +0 -17
  699. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  700. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  701. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  702. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  703. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  704. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  705. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  706. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  707. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  708. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  709. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  710. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  711. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  712. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  713. package/corpus/templates/crm/components.json +0 -20
  714. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  715. package/corpus/templates/crm/learnings.defaults.md +0 -5
  716. package/corpus/templates/crm/package.json +0 -59
  717. package/corpus/templates/crm/public/favicon.svg +0 -1
  718. package/corpus/templates/crm/public/icon-180.svg +0 -1
  719. package/corpus/templates/crm/public/manifest.json +0 -11
  720. package/corpus/templates/crm/react-router.config.ts +0 -7
  721. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  722. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  723. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  724. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  725. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  726. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  727. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  728. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  729. package/corpus/templates/crm/server/db/index.ts +0 -169
  730. package/corpus/templates/crm/server/db/schema.ts +0 -441
  731. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  732. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  733. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  734. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  735. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  736. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  737. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  738. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  739. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  740. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  741. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  742. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  743. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  744. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  745. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  746. package/corpus/templates/crm/ssr-entry.ts +0 -11
  747. package/corpus/templates/crm/tsconfig.json +0 -24
  748. package/corpus/templates/crm/vite.config.ts +0 -15
  749. package/corpus/templates/crm/vitest.config.ts +0 -5
  750. package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
  751. package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
  752. package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
  753. package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
  754. package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
  755. package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
  756. package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
  757. package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
  758. package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
  759. package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
  760. package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
  761. package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
  762. package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
  763. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
  764. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
  765. package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
  766. package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
  767. package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
  768. package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
  769. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
  770. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
  771. package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
  772. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
  773. package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
  774. package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
  775. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
  776. package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
@@ -1,300 +1,86 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import * as Select from "@radix-ui/react-select";
3
- import { IconX, IconTrash, IconLock, IconWorld, IconCheck, IconCopy, IconLink, IconMail, IconCode, IconChevronDown, IconUsersGroup, } from "@tabler/icons-react";
4
- import { useEffect, useState } from "react";
5
- import { createPortal } from "react-dom";
6
- import { agentNativePath } from "../api-path.js";
7
- import { writeClipboardText } from "../clipboard.js";
8
- import { useT } from "../i18n.js";
9
- import { useActionQuery, useActionMutation } from "../use-action.js";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ActionButton, Avatar as DesignSystemAvatar, Dialog as DesignSystemDialog, IconButton, Picker, Status, TextArea, TextField, } from "@agent-native/toolkit/design-system";
3
+ import { IconCheck, IconCode, IconCopy, IconLink, IconLock, IconMail, IconTrash, IconUsersGroup, IconWorld, } from "@tabler/icons-react";
10
4
  import { cn } from "../utils.js";
11
- function useOrgMembers() {
12
- const [members, setMembers] = useState([]);
13
- useEffect(() => {
14
- let cancelled = false;
15
- fetch(agentNativePath("/_agent-native/org/members"))
16
- .then((r) => (r.ok ? r.json() : null))
17
- .then((data) => {
18
- if (cancelled || !data)
19
- return;
20
- const list = Array.isArray(data?.members) ? data.members : [];
21
- setMembers(list
22
- .map((m) => ({
23
- email: typeof m?.email === "string" ? m.email : "",
24
- name: typeof m?.name === "string" ? m.name : null,
25
- }))
26
- .filter((m) => m.email));
27
- })
28
- .catch(() => { });
29
- return () => {
30
- cancelled = true;
31
- };
32
- }, []);
33
- return members;
34
- }
35
- function displayName(email, members) {
36
- const normalized = email.trim().toLowerCase();
37
- const match = members.find((m) => m.email.toLowerCase() === normalized);
38
- if (match?.name && match.name.trim())
39
- return match.name;
40
- return normalized.includes("@") ? email : "Unknown person";
41
- }
42
- const BUTTON_BASE = "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
43
- const BUTTON_OUTLINE_SM = cn(BUTTON_BASE, "h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground");
44
- const BUTTON_PRIMARY_SM = cn(BUTTON_BASE, "h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90");
45
- const BUTTON_GHOST_ICON = cn(BUTTON_BASE, "h-8 w-8 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground");
5
+ import { useShareDialogController, } from "./useShareDialogController.js";
6
+ const BUTTON_BASE = "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors active:!scale-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0";
7
+ const BUTTON_OUTLINE_SM = cn(BUTTON_BASE, "!h-9 !px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground");
8
+ const BUTTON_PRIMARY_SM = cn(BUTTON_BASE, "!h-9 !px-4 bg-primary text-primary-foreground hover:bg-primary/90");
9
+ const BUTTON_GHOST_ICON = cn(BUTTON_BASE, "!h-8 !w-8 !p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground");
46
10
  const VIS_ICONS = {
47
11
  private: IconLock,
48
12
  org: IconUsersGroup,
49
13
  public: IconWorld,
50
14
  };
51
- function useVisibilityMeta() {
52
- const t = useT();
53
- return {
54
- private: {
55
- label: t("share.private"),
56
- description: t("share.privateDescription"),
57
- Icon: VIS_ICONS.private,
58
- },
59
- org: {
60
- label: t("share.organization"),
61
- description: t("share.organizationDescription"),
62
- Icon: VIS_ICONS.org,
63
- },
64
- public: {
65
- label: t("share.public"),
66
- description: t("share.publicDescription"),
67
- Icon: VIS_ICONS.public,
68
- },
69
- };
70
- }
71
- function useRoleOptions() {
72
- const t = useT();
73
- return [
74
- {
75
- value: "viewer",
76
- label: t("share.viewer"),
77
- description: t("share.viewerDescription"),
78
- },
79
- {
80
- value: "editor",
81
- label: t("share.editor"),
82
- description: t("share.editorDescription"),
83
- },
84
- {
85
- value: "admin",
86
- label: t("share.admin"),
87
- description: t("share.adminDescription"),
88
- },
89
- ];
90
- }
15
+ const TAB_ICONS = {
16
+ link: IconLink,
17
+ invite: IconMail,
18
+ embed: IconCode,
19
+ };
91
20
  /**
92
21
  * Framework share dialog. Drop into any template via
93
- * `<ShareDialog open onClose resourceType resourceId />`. Passing
94
- * `shareUrl` lights up a Link tab with a copy field; passing `embedUrl`
95
- * lights up an Embed tab. With neither prop, renders a single Invite +
96
- * general-access panel (Google-Docs-lite).
22
+ * `<ShareDialog open onClose resourceType resourceId />`. Passing `shareUrl`
23
+ * lights up a Link tab with a copy field; passing `embedUrl` lights up an
24
+ * Embed tab. With neither prop, renders a single Invite + general-access
25
+ * panel (Google-Docs-lite).
97
26
  */
98
- export function ShareDialog(props) {
99
- const { open, onClose, resourceType, resourceId, resourceTitle, shareUrl, embedUrl, embedTabContent, linkTabExtras, } = props;
100
- const t = useT();
101
- const sharesQuery = useActionQuery("list-resource-shares", {
27
+ export function ShareDialog({ open, onClose, resourceType, resourceId, resourceTitle, shareUrl, embedUrl, embedTabContent, linkTabExtras, }) {
28
+ const controller = useShareDialogController({
29
+ open,
30
+ onClose,
102
31
  resourceType,
103
32
  resourceId,
33
+ resourceTitle,
34
+ shareUrl,
35
+ embedUrl,
104
36
  });
105
- const orgMembers = useOrgMembers();
106
- const hasLinkTab = Boolean(shareUrl);
107
- const hasEmbedTab = Boolean(embedUrl);
108
- const tabsEnabled = hasLinkTab || hasEmbedTab;
109
- const [tab, setTab] = useState(hasLinkTab ? "link" : "invite");
110
- useEffect(() => {
111
- if (!open)
112
- return;
113
- setTab(hasLinkTab ? "link" : "invite");
114
- }, [open, hasLinkTab]);
115
- useEffect(() => {
116
- if (!open)
117
- return;
118
- const onKey = (e) => {
119
- if (e.key === "Escape")
120
- onClose();
121
- };
122
- window.addEventListener("keydown", onKey);
123
- return () => window.removeEventListener("keydown", onKey);
124
- }, [open, onClose]);
125
37
  if (!open)
126
38
  return null;
127
- const titleText = resourceTitle
128
- ? t("share.titleWithResource", { title: resourceTitle })
129
- : t("share.titleWithType", { type: resourceType });
130
- return createPortal(_jsx("div", { className: "fixed inset-0 z-[2000] flex items-start justify-center bg-black/40 p-4 sm:items-center", onClick: onClose, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": titleText, className: "w-full max-w-lg rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl outline-none", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-start justify-between gap-3 px-5 pt-4 pb-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-base font-semibold", title: titleText, children: titleText }), sharesQuery.data?.ownerEmail ? (_jsx("div", { className: "mt-0.5 truncate text-xs text-muted-foreground", children: t("share.owner", {
131
- name: displayName(sharesQuery.data.ownerEmail, orgMembers),
132
- }) })) : null] }), _jsx("button", { type: "button", "aria-label": t("share.close"), onClick: onClose, className: BUTTON_GHOST_ICON, children: _jsx(IconX, { size: 16 }) })] }), tabsEnabled ? (_jsxs("div", { role: "tablist", "aria-label": t("share.shareOptions"), className: "mx-5 mt-1 flex gap-1 border-b border-border", children: [hasLinkTab ? (_jsx(TabTrigger, { active: tab === "link", onClick: () => setTab("link"), icon: _jsx(IconLink, { size: 14, strokeWidth: 1.75 }), label: t("share.link") })) : null, _jsx(TabTrigger, { active: tab === "invite", onClick: () => setTab("invite"), icon: _jsx(IconMail, { size: 14, strokeWidth: 1.75 }), label: t("share.invite") }), hasEmbedTab ? (_jsx(TabTrigger, { active: tab === "embed", onClick: () => setTab("embed"), icon: _jsx(IconCode, { size: 14, strokeWidth: 1.75 }), label: t("share.embed") })) : null] })) : null, _jsxs("div", { className: "px-5 py-4", children: [tabsEnabled && tab === "link" && hasLinkTab ? (_jsx(LinkTab, { resourceType: resourceType, resourceId: resourceId, shareUrl: shareUrl, sharesQuery: sharesQuery, extras: linkTabExtras })) : null, !tabsEnabled || tab === "invite" ? (_jsx(InviteTab, { resourceType: resourceType, resourceId: resourceId, shareUrl: shareUrl, sharesQuery: sharesQuery, showVisibility: !tabsEnabled, orgMembers: orgMembers })) : null, tabsEnabled && tab === "embed" && hasEmbedTab
133
- ? (embedTabContent ?? _jsx(DefaultEmbedBody, { embedUrl: embedUrl }))
134
- : null] }), _jsx("div", { className: "flex justify-end border-t border-border px-5 py-3", children: _jsx("button", { type: "button", onClick: onClose, className: BUTTON_PRIMARY_SM, children: t("share.done") }) })] }) }), document.body);
135
- }
136
- // ---------------------------------------------------------------------------
137
- // Tabs
138
- // ---------------------------------------------------------------------------
139
- function TabTrigger(props) {
140
- return (_jsxs("button", { type: "button", role: "tab", "aria-selected": props.active, onClick: props.onClick, className: cn("inline-flex items-center gap-1.5 border-b-2 px-3 py-2 text-sm font-medium transition-colors", props.active
39
+ return (_jsxs(DesignSystemDialog, { open: controller.open, onOpenChange: controller.onOpenChange, title: _jsx("span", { className: "truncate !text-base !leading-normal !tracking-normal !text-inherit", title: controller.title, children: controller.title }), closeLabel: controller.labels.close, size: "large", className: "!top-4 !z-[2010] !block !max-h-none !w-[calc(100vw-2rem)] !max-w-lg !translate-y-0 !gap-0 !overflow-visible !rounded-xl !border-border !bg-popover !p-0 !text-popover-foreground !shadow-2xl sm:!top-1/2 sm:!-translate-y-1/2", "aria-label": controller.title, children: [_jsx("div", { className: "px-5 pt-0 pb-3", children: controller.ownerLabel ? (_jsx("div", { className: "truncate text-xs text-muted-foreground", children: controller.ownerLabel })) : null }), controller.tabsEnabled ? (_jsx("div", { role: "tablist", "aria-label": controller.labels.shareOptions, className: "mx-5 mt-1 flex gap-1 border-b border-border", children: controller.tabs.map((tab) => {
40
+ const Icon = TAB_ICONS[tab.value];
41
+ return (_jsx(TabTrigger, { active: controller.activeTab === tab.value, onClick: () => controller.setActiveTab(tab.value), icon: _jsx(Icon, { size: 14, strokeWidth: 1.75 }), label: tab.label }, tab.value));
42
+ }) })) : null, _jsxs("div", { className: "px-5 py-4", children: [controller.tabsEnabled && controller.activeTab === "link" ? (_jsx(LinkTab, { controller: controller, extras: linkTabExtras })) : null, !controller.tabsEnabled || controller.activeTab === "invite" ? (_jsx(InviteTab, { controller: controller, showVisibility: !controller.tabsEnabled })) : null, controller.tabsEnabled && controller.activeTab === "embed"
43
+ ? (embedTabContent ?? _jsx(DefaultEmbedBody, { controller: controller }))
44
+ : null] }), _jsx("div", { className: "flex justify-end border-t border-border px-5 py-3", children: _jsx(ActionButton, { type: "button", intent: "primary", emphasis: "solid", onPress: controller.close, className: BUTTON_PRIMARY_SM, children: controller.labels.done }) })] }));
45
+ }
46
+ function TabTrigger({ active, onClick, icon, label, }) {
47
+ return (_jsxs(ActionButton, { type: "button", emphasis: "ghost", "aria-pressed": active, onPress: onClick, className: cn("inline-flex !h-auto items-center gap-1.5 !rounded-none border-b-2 !px-3 !py-2 text-sm font-medium transition-colors hover:!bg-transparent active:!scale-100 focus-visible:!ring-0 focus-visible:!ring-offset-0 [&_svg]:!size-auto", active
141
48
  ? "border-foreground text-foreground"
142
- : "border-transparent text-muted-foreground hover:text-foreground"), children: [props.icon, props.label] }));
143
- }
144
- // ---------------------------------------------------------------------------
145
- // Link tab visibility picker + copy-link field + optional extras
146
- // ---------------------------------------------------------------------------
147
- function LinkTab(props) {
148
- const { resourceType, resourceId, shareUrl, sharesQuery, extras } = props;
149
- const t = useT();
150
- const visibilityMeta = useVisibilityMeta();
151
- const setVisibility = useActionMutation("set-resource-visibility");
152
- const data = sharesQuery.data;
153
- const visibility = data?.visibility ?? "private";
154
- const canManage = data?.role === "owner" || data?.role === "admin";
155
- const meta = visibilityMeta[visibility];
156
- const handleVisibility = (next) => {
157
- if (next === visibility)
158
- return;
159
- if (!canManage)
160
- return;
161
- setVisibility.mutate({ resourceType, resourceId, visibility: next }, { onSuccess: () => sharesQuery.refetch() });
162
- };
163
- return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("div", { className: "mb-2 text-sm font-semibold", children: t("share.generalAccess") }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: meta.description })] })] })] }), _jsx(CopyField, { label: t("share.shareLink"), value: shareUrl }), extras] }));
164
- }
165
- // ---------------------------------------------------------------------------
166
- // Invite tab invite-by-email + shares list + (optional) visibility
167
- // ---------------------------------------------------------------------------
168
- function InviteTab(props) {
169
- const { resourceType, resourceId, shareUrl, sharesQuery, showVisibility, orgMembers, } = props;
170
- const t = useT();
171
- const visibilityMeta = useVisibilityMeta();
172
- const share = useActionMutation("share-resource");
173
- const unshare = useActionMutation("unshare-resource");
174
- const setVisibility = useActionMutation("set-resource-visibility");
175
- const [email, setEmail] = useState("");
176
- const [role, setRole] = useState("viewer");
177
- const [notifyPeople, setNotifyPeople] = useState(true);
178
- const hasInviteEmail = email.trim().length > 0;
179
- const data = sharesQuery.data;
180
- const shares = data?.shares ?? [];
181
- const visibility = data?.visibility ?? "private";
182
- const canManage = data?.role === "owner" || data?.role === "admin";
183
- const meta = visibilityMeta[visibility];
184
- const handleAdd = () => {
185
- const trimmed = email.trim();
186
- if (!trimmed)
187
- return;
188
- share.mutate({
189
- resourceType,
190
- resourceId,
191
- principalType: "user",
192
- principalId: trimmed,
193
- role,
194
- notify: notifyPeople,
195
- resourceUrl: getNotificationUrl(shareUrl),
196
- }, {
197
- onSuccess: () => {
198
- setEmail("");
199
- sharesQuery.refetch();
200
- },
201
- });
202
- };
203
- const handleRemove = (s) => {
204
- unshare.mutate({
205
- resourceType,
206
- resourceId,
207
- principalType: s.principalType,
208
- principalId: s.principalId,
209
- }, { onSuccess: () => sharesQuery.refetch() });
210
- };
211
- const handleVisibility = (next) => {
212
- if (next === visibility)
213
- return;
214
- if (!canManage)
215
- return;
216
- setVisibility.mutate({ resourceType, resourceId, visibility: next }, { onSuccess: () => sharesQuery.refetch() });
217
- };
218
- return (_jsxs("div", { className: "space-y-4", children: [canManage ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-stretch gap-2", children: [_jsx("input", { type: "email", placeholder: t("share.addPeopleByEmail"), value: email, onChange: (e) => setEmail(e.target.value), onKeyDown: (e) => {
219
- if (e.key === "Enter")
220
- handleAdd();
221
- }, autoComplete: "off", className: "flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" }), _jsx(RoleSelect, { value: role, onChange: setRole })] }), hasInviteEmail ? (_jsxs("label", { className: "inline-flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx("input", { type: "checkbox", checked: notifyPeople, onChange: (e) => setNotifyPeople(e.target.checked), className: "h-4 w-4 rounded border-input accent-primary" }), t("share.notifyPeople")] })) : null] })) : null, _jsxs("div", { children: [_jsx("div", { className: "mb-2 text-sm font-semibold", children: t("share.peopleWithAccess") }), _jsxs("ul", { className: "flex flex-col gap-1 list-none p-0 m-0", children: [data?.ownerEmail ? (_jsxs("li", { className: "flex items-center gap-3 px-1 py-1.5 text-sm", children: [_jsx(Avatar, { label: displayName(data.ownerEmail, orgMembers) }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: displayName(data.ownerEmail, orgMembers) }), _jsx("span", { className: "text-xs text-muted-foreground", children: t("share.ownerRole") })] })) : null, shares.map((s) => (_jsxs("li", { className: "flex items-center gap-3 px-1 py-1.5 text-sm", children: [_jsx(Avatar, { label: principalLabel(s, orgMembers), org: s.principalType === "org" }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: principalLabel(s, orgMembers) }), _jsx("span", { className: "text-xs text-muted-foreground", children: cap(s.role) }), canManage ? (_jsx("button", { type: "button", "aria-label": t("share.remove"), onClick: () => handleRemove(s), className: BUTTON_GHOST_ICON, children: _jsx(IconTrash, { size: 14 }) })) : null] }, `${s.principalType}:${s.principalId}`))), !shares.length && !data?.ownerEmail ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: t("share.noAccess") })) : null] })] }), showVisibility ? (_jsxs("div", { children: [_jsx("div", { className: "mb-2 text-sm font-semibold", children: t("share.generalAccess") }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(meta.Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { value: visibility, onChange: handleVisibility, disabled: !canManage }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: meta.description })] })] })] })) : null] }));
222
- }
223
- // ---------------------------------------------------------------------------
224
- // Default Embed body (simple responsive iframe snippet)
225
- // ---------------------------------------------------------------------------
226
- function DefaultEmbedBody({ embedUrl }) {
227
- const t = useT();
228
- const code = `<div style="position:relative;padding-bottom:56.25%;height:0"><iframe src="${embedUrl}" frameborder="0" allowfullscreen allow="autoplay; picture-in-picture" style="position:absolute;inset:0;width:100%;height:100%"></iframe></div>`;
229
- return (_jsxs("div", { className: "space-y-3", children: [_jsx(CopyField, { label: t("share.embedUrl"), value: embedUrl }), _jsx(CopyField, { label: t("share.embedCode"), value: code, multiline: true })] }));
230
- }
231
- // ---------------------------------------------------------------------------
232
- // Primitives
233
- // ---------------------------------------------------------------------------
234
- function CopyField({ label, value, multiline, }) {
235
- const [copied, setCopied] = useState(false);
236
- const t = useT();
237
- const copy = async () => {
238
- if (!(await writeClipboardText(value))) {
239
- setCopied(false);
240
- return;
241
- }
242
- setCopied(true);
243
- setTimeout(() => setCopied(false), 1400);
244
- };
245
- return (_jsxs("div", { children: [_jsx("div", { className: "mb-1 text-xs font-medium text-muted-foreground", children: label }), _jsxs("div", { className: "flex items-stretch gap-2", children: [multiline ? (_jsx("textarea", { readOnly: true, value: value, className: "flex-1 h-20 rounded-md border border-input bg-background px-3 py-2 text-xs font-mono text-foreground resize-none focus:outline-none focus:ring-2 focus:ring-ring" })) : (_jsx("input", { readOnly: true, value: value, className: "flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-xs font-mono text-foreground focus:outline-none focus:ring-2 focus:ring-ring" })), _jsx("button", { type: "button", onClick: copy, "aria-label": t("share.copy"), className: cn(BUTTON_OUTLINE_SM, "w-9 px-0"), children: copied ? _jsx(IconCheck, { size: 14 }) : _jsx(IconCopy, { size: 14 }) })] })] }));
246
- }
247
- const selectContentClass = "z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md";
248
- const selectItemClass = "relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 ps-8 pe-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50";
249
- function SelectItems({ items, }) {
250
- return (_jsx(_Fragment, { children: items.map((it) => (_jsxs(Select.Item, { value: it.value, className: selectItemClass, children: [_jsx("span", { className: "absolute start-2 top-2 flex h-4 w-4 items-center justify-center", children: _jsx(Select.ItemIndicator, { children: _jsx(IconCheck, { size: 14 }) }) }), _jsxs("span", { className: "flex flex-col", children: [_jsx(Select.ItemText, { children: it.label }), it.description ? (_jsx("span", { className: "text-xs text-muted-foreground", children: it.description })) : null] })] }, it.value))) }));
251
- }
252
- function RoleSelect(props) {
253
- const t = useT();
254
- const roleOptions = useRoleOptions();
255
- const current = roleOptions.find((o) => o.value === props.value) ?? roleOptions[0];
256
- return (_jsxs(Select.Root, { value: props.value, onValueChange: (v) => props.onChange(v), children: [_jsxs(Select.Trigger, { "aria-label": t("share.role"), className: cn(BUTTON_BASE, "h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground"), children: [_jsx(Select.Value, { children: current.label }), _jsx(Select.Icon, { children: _jsx(IconChevronDown, { size: 14 }) })] }), _jsx(Select.Portal, { children: _jsx(Select.Content, { className: selectContentClass, position: "popper", sideOffset: 4, children: _jsx(Select.Viewport, { children: _jsx(SelectItems, { items: roleOptions }) }) }) })] }));
257
- }
258
- function VisibilitySelect(props) {
259
- const t = useT();
260
- const visibilityMeta = useVisibilityMeta();
261
- const current = visibilityMeta[props.value];
262
- const allowPrivate = props.allowPrivate !== false;
263
- const allowPublic = props.allowPublic !== false;
264
- const options = Object.keys(VIS_ICONS).filter((k) => {
265
- if (k === props.value)
266
- return true;
267
- if (k === "private" && !allowPrivate)
268
- return false;
269
- if (k === "public" && !allowPublic)
270
- return false;
271
- return true;
272
- });
273
- return (_jsxs(Select.Root, { value: props.value, onValueChange: (v) => props.onChange(v), disabled: props.disabled, children: [_jsxs(Select.Trigger, { "aria-label": t("share.generalAccess"), className: cn(BUTTON_BASE, "h-7 px-1 -ms-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground"), children: [_jsx(Select.Value, { children: current.label }), _jsx(Select.Icon, { children: _jsx(IconChevronDown, { size: 14 }) })] }), _jsx(Select.Portal, { children: _jsx(Select.Content, { className: selectContentClass, position: "popper", sideOffset: 4, children: _jsx(Select.Viewport, { children: _jsx(SelectItems, { items: options.map((k) => ({
274
- value: k,
275
- label: visibilityMeta[k].label,
276
- description: visibilityMeta[k].description,
277
- })) }) }) }) })] }));
278
- }
279
- function Avatar({ label, org }) {
280
- return (_jsx("span", { "aria-hidden": true, className: "inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground", children: org ? (_jsx(IconUsersGroup, { size: 14, strokeWidth: 1.75 })) : ((label.split("@")[0]?.[0] ?? label[0] ?? "?").toUpperCase()) }));
281
- }
282
- function getNotificationUrl(explicit) {
283
- if (explicit)
284
- return explicit;
285
- if (typeof window === "undefined")
286
- return undefined;
287
- return window.location.href;
288
- }
289
- function cap(s) {
290
- return s.charAt(0).toUpperCase() + s.slice(1);
291
- }
292
- function principalLabel(share, members) {
293
- const serverLabel = share.displayName?.trim();
294
- if (serverLabel)
295
- return serverLabel;
296
- if (share.principalType === "org")
297
- return "Organization";
298
- return displayName(share.principalId, members);
49
+ : "border-transparent text-muted-foreground hover:text-foreground"), children: [icon, label] }));
50
+ }
51
+ function LinkTab({ controller, extras, }) {
52
+ const Icon = VIS_ICONS[controller.visibility.value];
53
+ return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("div", { className: "mb-2 text-sm font-semibold", children: controller.labels.generalAccess }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { controller: controller }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: controller.visibility.description })] })] })] }), _jsx(CopyField, { field: "share-link", label: controller.labels.shareLink, value: controller.shareUrl, controller: controller }), extras] }));
54
+ }
55
+ function InviteTab({ controller, showVisibility, }) {
56
+ const Icon = VIS_ICONS[controller.visibility.value];
57
+ return (_jsxs("div", { className: "space-y-4", children: [controller.canManage ? (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-stretch gap-2", children: [_jsx("input", { type: "email", placeholder: controller.labels.addPeopleByEmail, value: controller.invite.email, onChange: (event) => controller.invite.setEmail(event.currentTarget.value), onKeyDown: (event) => {
58
+ if (event.key === "Enter")
59
+ controller.invite.submit();
60
+ }, autoComplete: "off", className: "flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background" }), _jsx(RoleSelect, { controller: controller })] }), controller.invite.showNotifyPeople ? (_jsxs("label", { className: "inline-flex items-center gap-2 text-xs text-muted-foreground", children: [_jsx("input", { type: "checkbox", checked: controller.invite.notifyPeople, onChange: (event) => controller.invite.setNotifyPeople(event.currentTarget.checked), className: "h-4 w-4 rounded border-input accent-primary" }), controller.labels.notifyPeople] })) : null] })) : null, _jsxs("div", { children: [_jsx("div", { className: "mb-2 text-sm font-semibold", children: controller.labels.peopleWithAccess }), _jsxs("ul", { className: "flex flex-col gap-1 list-none p-0 m-0", children: [controller.people.map((person) => (_jsx(PersonRow, { person: person, canManage: controller.canManage, removeLabel: controller.labels.remove, onRemove: controller.removeShare }, person.key))), !controller.people.length ? (_jsx("li", { className: "px-1 py-1.5 text-sm text-muted-foreground", children: controller.labels.noAccess })) : null] })] }), showVisibility ? (_jsxs("div", { children: [_jsx("div", { className: "mb-2 text-sm font-semibold", children: controller.labels.generalAccess }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { "aria-hidden": true, className: "inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground", children: _jsx(Icon, { size: 16, strokeWidth: 1.75 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(VisibilitySelect, { controller: controller }), _jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: controller.visibility.description })] })] })] })) : null] }));
61
+ }
62
+ function PersonRow({ person, canManage, removeLabel, onRemove, }) {
63
+ return (_jsxs("li", { className: "flex items-center gap-3 px-1 py-1.5 text-sm", children: [_jsx(DesignSystemAvatar, { name: person.label, fallback: person.principalType === "org" ? (_jsx(IconUsersGroup, { size: 14, strokeWidth: 1.75 })) : (person.avatarText), size: "compact", className: "inline-flex h-7 w-7 shrink-0 text-[11px] font-semibold" }), _jsx("span", { className: "flex-1 min-w-0 truncate", children: person.label }), _jsx(Status, { tone: "neutral", size: "compact", className: "border-0 bg-transparent px-0 text-xs text-muted-foreground", children: person.roleLabel }), canManage && person.share ? (_jsx(IconButton, { intent: "danger", emphasis: "ghost", size: "compact", icon: _jsx(IconTrash, { size: 14 }), label: removeLabel, "aria-label": removeLabel, onPress: () => onRemove(person.share), className: cn(BUTTON_GHOST_ICON, "[&_svg]:!size-auto") })) : null] }));
64
+ }
65
+ function DefaultEmbedBody({ controller, }) {
66
+ return (_jsxs("div", { className: "space-y-3", children: [_jsx(CopyField, { field: "embed-url", label: controller.labels.embedUrl, value: controller.embedUrl, controller: controller }), _jsx(CopyField, { field: "embed-code", label: controller.labels.embedCode, value: controller.embedCode, controller: controller, multiline: true })] }));
67
+ }
68
+ function CopyField({ field, label, value, controller, multiline, }) {
69
+ const copied = controller.copiedField === field;
70
+ return (_jsxs("div", { children: [_jsx("div", { className: "mb-1 text-xs font-medium text-muted-foreground", children: label }), _jsxs("div", { className: "flex items-stretch gap-2", children: [multiline ? (_jsx(TextArea, { readOnly: true, value: value, onChange: () => undefined, "aria-label": label, className: "flex-1 h-20 text-xs font-mono" })) : (_jsx(TextField, { readOnly: true, value: value, onChange: () => undefined, "aria-label": label, className: "flex-1 min-w-0 text-xs font-mono" })), _jsx(IconButton, { emphasis: "outline", size: "compact", icon: copied ? _jsx(IconCheck, { size: 14 }) : _jsx(IconCopy, { size: 14 }), label: controller.labels.copy, onPress: () => void controller.copy(field, value), "aria-label": controller.labels.copy, className: cn(BUTTON_OUTLINE_SM, "!w-9 !px-0 [&_svg]:!size-auto") })] })] }));
71
+ }
72
+ function RoleSelect({ controller }) {
73
+ return (_jsx(Picker, { mode: "select", options: controller.invite.roleOptions, value: controller.invite.role, onChange: (value) => {
74
+ if (value === "viewer" || value === "editor" || value === "admin") {
75
+ controller.invite.setRole(value);
76
+ }
77
+ }, "aria-label": controller.labels.role, className: "w-auto" }));
78
+ }
79
+ function VisibilitySelect({ controller, }) {
80
+ return (_jsx(Picker, { mode: "select", options: controller.visibility.options, value: controller.visibility.value, onChange: (value) => {
81
+ if (value === "private" || value === "org" || value === "public") {
82
+ controller.visibility.set(value);
83
+ }
84
+ }, disabled: controller.visibility.disabled, "aria-label": controller.labels.generalAccess, className: "-ms-1 w-auto" }));
299
85
  }
300
86
  //# sourceMappingURL=ShareDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShareDialog.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as Select from \"@radix-ui/react-select\";\nimport {\n IconX,\n IconTrash,\n IconLock,\n IconWorld,\n IconCheck,\n IconCopy,\n IconLink,\n IconMail,\n IconCode,\n IconChevronDown,\n IconUsersGroup,\n} from \"@tabler/icons-react\";\nimport { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport { useT } from \"../i18n.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\n\nexport interface ShareDialogProps {\n open: boolean;\n onClose: () => void;\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /**\n * When provided, enables the \"Link\" tab with a copy-link field.\n * Pass the user-facing share URL (e.g. `https://…/share/<id>`).\n */\n shareUrl?: string;\n /**\n * When provided, enables the \"Embed\" tab with a default iframe snippet.\n * For richer per-resource controls (autoplay, start time, responsive /\n * fixed size), pass `embedTabContent` instead (or in addition) — it\n * replaces the default embed body.\n */\n embedUrl?: string;\n /** Advanced: fully custom Embed tab body. Requires `embedUrl` to enable the tab. */\n embedTabContent?: ReactNode;\n /** Extra content appended to the bottom of the Link tab (e.g. download buttons). */\n linkTabExtras?: ReactNode;\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n displayName?: string | null;\n role: Role;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const normalized = email.trim().toLowerCase();\n const match = members.find((m) => m.email.toLowerCase() === normalized);\n if (match?.name && match.name.trim()) return match.name;\n return normalized.includes(\"@\") ? email : \"Unknown person\";\n}\n\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-8 w-8 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\n\nconst VIS_ICONS: Record<Visibility, typeof IconLock> = {\n private: IconLock,\n org: IconUsersGroup,\n public: IconWorld,\n};\n\nfunction useVisibilityMeta() {\n const t = useT();\n return {\n private: {\n label: t(\"share.private\"),\n description: t(\"share.privateDescription\"),\n Icon: VIS_ICONS.private,\n },\n org: {\n label: t(\"share.organization\"),\n description: t(\"share.organizationDescription\"),\n Icon: VIS_ICONS.org,\n },\n public: {\n label: t(\"share.public\"),\n description: t(\"share.publicDescription\"),\n Icon: VIS_ICONS.public,\n },\n } satisfies Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n >;\n}\n\nfunction useRoleOptions() {\n const t = useT();\n return [\n {\n value: \"viewer\",\n label: t(\"share.viewer\"),\n description: t(\"share.viewerDescription\"),\n },\n {\n value: \"editor\",\n label: t(\"share.editor\"),\n description: t(\"share.editorDescription\"),\n },\n {\n value: \"admin\",\n label: t(\"share.admin\"),\n description: t(\"share.adminDescription\"),\n },\n ] satisfies Array<{ value: Role; label: string; description: string }>;\n}\n\n/**\n * Framework share dialog. Drop into any template via\n * `<ShareDialog open onClose resourceType resourceId />`. Passing\n * `shareUrl` lights up a Link tab with a copy field; passing `embedUrl`\n * lights up an Embed tab. With neither prop, renders a single Invite +\n * general-access panel (Google-Docs-lite).\n */\nexport function ShareDialog(props: ShareDialogProps) {\n const {\n open,\n onClose,\n resourceType,\n resourceId,\n resourceTitle,\n shareUrl,\n embedUrl,\n embedTabContent,\n linkTabExtras,\n } = props;\n const t = useT();\n\n const sharesQuery = useActionQuery<SharesResponse>(\"list-resource-shares\", {\n resourceType,\n resourceId,\n });\n const orgMembers = useOrgMembers();\n\n const hasLinkTab = Boolean(shareUrl);\n const hasEmbedTab = Boolean(embedUrl);\n const tabsEnabled = hasLinkTab || hasEmbedTab;\n\n const [tab, setTab] = useState<\"link\" | \"invite\" | \"embed\">(\n hasLinkTab ? \"link\" : \"invite\",\n );\n\n useEffect(() => {\n if (!open) return;\n setTab(hasLinkTab ? \"link\" : \"invite\");\n }, [open, hasLinkTab]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n const titleText = resourceTitle\n ? t(\"share.titleWithResource\", { title: resourceTitle })\n : t(\"share.titleWithType\", { type: resourceType });\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[2000] flex items-start justify-center bg-black/40 p-4 sm:items-center\"\n onClick={onClose}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={titleText}\n className=\"w-full max-w-lg rounded-xl border border-border bg-popover text-popover-foreground shadow-2xl outline-none\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-start justify-between gap-3 px-5 pt-4 pb-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n {sharesQuery.data?.ownerEmail ? (\n <div className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {t(\"share.owner\", {\n name: displayName(sharesQuery.data.ownerEmail, orgMembers),\n })}\n </div>\n ) : null}\n </div>\n <button\n type=\"button\"\n aria-label={t(\"share.close\")}\n onClick={onClose}\n className={BUTTON_GHOST_ICON}\n >\n <IconX size={16} />\n </button>\n </div>\n\n {tabsEnabled ? (\n <div\n role=\"tablist\"\n aria-label={t(\"share.shareOptions\")}\n className=\"mx-5 mt-1 flex gap-1 border-b border-border\"\n >\n {hasLinkTab ? (\n <TabTrigger\n active={tab === \"link\"}\n onClick={() => setTab(\"link\")}\n icon={<IconLink size={14} strokeWidth={1.75} />}\n label={t(\"share.link\")}\n />\n ) : null}\n <TabTrigger\n active={tab === \"invite\"}\n onClick={() => setTab(\"invite\")}\n icon={<IconMail size={14} strokeWidth={1.75} />}\n label={t(\"share.invite\")}\n />\n {hasEmbedTab ? (\n <TabTrigger\n active={tab === \"embed\"}\n onClick={() => setTab(\"embed\")}\n icon={<IconCode size={14} strokeWidth={1.75} />}\n label={t(\"share.embed\")}\n />\n ) : null}\n </div>\n ) : null}\n\n <div className=\"px-5 py-4\">\n {tabsEnabled && tab === \"link\" && hasLinkTab ? (\n <LinkTab\n resourceType={resourceType}\n resourceId={resourceId}\n shareUrl={shareUrl!}\n sharesQuery={sharesQuery}\n extras={linkTabExtras}\n />\n ) : null}\n {!tabsEnabled || tab === \"invite\" ? (\n <InviteTab\n resourceType={resourceType}\n resourceId={resourceId}\n shareUrl={shareUrl}\n sharesQuery={sharesQuery}\n showVisibility={!tabsEnabled}\n orgMembers={orgMembers}\n />\n ) : null}\n {tabsEnabled && tab === \"embed\" && hasEmbedTab\n ? (embedTabContent ?? <DefaultEmbedBody embedUrl={embedUrl!} />)\n : null}\n </div>\n\n <div className=\"flex justify-end border-t border-border px-5 py-3\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n {t(\"share.done\")}\n </button>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\nfunction TabTrigger(props: {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={props.active}\n onClick={props.onClick}\n className={cn(\n \"inline-flex items-center gap-1.5 border-b-2 px-3 py-2 text-sm font-medium transition-colors\",\n props.active\n ? \"border-foreground text-foreground\"\n : \"border-transparent text-muted-foreground hover:text-foreground\",\n )}\n >\n {props.icon}\n {props.label}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Link tab — visibility picker + copy-link field + optional extras\n// ---------------------------------------------------------------------------\n\nfunction LinkTab(props: {\n resourceType: string;\n resourceId: string;\n shareUrl: string;\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n extras?: ReactNode;\n}) {\n const { resourceType, resourceId, shareUrl, sharesQuery, extras } = props;\n const t = useT();\n const visibilityMeta = useVisibilityMeta();\n\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const data = sharesQuery.data;\n const visibility: Visibility =\n (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta[visibility];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n if (!canManage) return;\n setVisibility.mutate(\n { resourceType, resourceId, visibility: next } as any,\n { onSuccess: () => sharesQuery.refetch() },\n );\n };\n\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"mb-2 text-sm font-semibold\">\n {t(\"share.generalAccess\")}\n </div>\n <div className=\"flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n </div>\n\n <CopyField label={t(\"share.shareLink\")} value={shareUrl} />\n\n {extras}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Invite tab — invite-by-email + shares list + (optional) visibility\n// ---------------------------------------------------------------------------\n\nfunction InviteTab(props: {\n resourceType: string;\n resourceId: string;\n shareUrl?: string;\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n showVisibility: boolean;\n orgMembers: OrgMember[];\n}) {\n const {\n resourceType,\n resourceId,\n shareUrl,\n sharesQuery,\n showVisibility,\n orgMembers,\n } = props;\n const t = useT();\n const visibilityMeta = useVisibilityMeta();\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const hasInviteEmail = email.trim().length > 0;\n\n const data = sharesQuery.data;\n const shares = data?.shares ?? [];\n const visibility: Visibility =\n (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta[visibility];\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(shareUrl),\n } as any,\n {\n onSuccess: () => {\n setEmail(\"\");\n sharesQuery.refetch();\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n { onSuccess: () => sharesQuery.refetch() },\n );\n };\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n if (!canManage) return;\n setVisibility.mutate(\n { resourceType, resourceId, visibility: next } as any,\n { onSuccess: () => sharesQuery.refetch() },\n );\n };\n\n return (\n <div className=\"space-y-4\">\n {canManage ? (\n <div className=\"space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder={t(\"share.addPeopleByEmail\")}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n {t(\"share.notifyPeople\")}\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div>\n <div className=\"mb-2 text-sm font-semibold\">\n {t(\"share.peopleWithAccess\")}\n </div>\n <ul className=\"flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {t(\"share.ownerRole\")}\n </span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={`${s.principalType}:${s.principalId}`}\n className=\"flex items-center gap-3 px-1 py-1.5 text-sm\"\n >\n <Avatar\n label={principalLabel(s, orgMembers)}\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {principalLabel(s, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n {canManage ? (\n <button\n type=\"button\"\n aria-label={t(\"share.remove\")}\n onClick={() => handleRemove(s)}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n {t(\"share.noAccess\")}\n </li>\n ) : null}\n </ul>\n </div>\n\n {showVisibility ? (\n <div>\n <div className=\"mb-2 text-sm font-semibold\">\n {t(\"share.generalAccess\")}\n </div>\n <div className=\"flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Default Embed body (simple responsive iframe snippet)\n// ---------------------------------------------------------------------------\n\nfunction DefaultEmbedBody({ embedUrl }: { embedUrl: string }) {\n const t = useT();\n const code = `<div style=\"position:relative;padding-bottom:56.25%;height:0\"><iframe src=\"${embedUrl}\" frameborder=\"0\" allowfullscreen allow=\"autoplay; picture-in-picture\" style=\"position:absolute;inset:0;width:100%;height:100%\"></iframe></div>`;\n return (\n <div className=\"space-y-3\">\n <CopyField label={t(\"share.embedUrl\")} value={embedUrl} />\n <CopyField label={t(\"share.embedCode\")} value={code} multiline />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Primitives\n// ---------------------------------------------------------------------------\n\nfunction CopyField({\n label,\n value,\n multiline,\n}: {\n label: string;\n value: string;\n multiline?: boolean;\n}) {\n const [copied, setCopied] = useState(false);\n const t = useT();\n const copy = async () => {\n if (!(await writeClipboardText(value))) {\n setCopied(false);\n return;\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 1400);\n };\n return (\n <div>\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n {label}\n </div>\n <div className=\"flex items-stretch gap-2\">\n {multiline ? (\n <textarea\n readOnly\n value={value}\n className=\"flex-1 h-20 rounded-md border border-input bg-background px-3 py-2 text-xs font-mono text-foreground resize-none focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <input\n readOnly\n value={value}\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-xs font-mono text-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n <button\n type=\"button\"\n onClick={copy}\n aria-label={t(\"share.copy\")}\n className={cn(BUTTON_OUTLINE_SM, \"w-9 px-0\")}\n >\n {copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n </button>\n </div>\n </div>\n );\n}\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 ps-8 pe-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\nfunction SelectItems({\n items,\n}: {\n items: Array<{ value: string; label: string; description?: string }>;\n}) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute start-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: { value: Role; onChange: (v: Role) => void }) {\n const t = useT();\n const roleOptions = useRoleOptions();\n const current =\n roleOptions.find((o) => o.value === props.value) ?? roleOptions[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n >\n <Select.Trigger\n aria-label={t(\"share.role\")}\n className={cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={roleOptions} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n allowPrivate?: boolean;\n allowPublic?: boolean;\n}) {\n const t = useT();\n const visibilityMeta = useVisibilityMeta();\n const current = visibilityMeta[props.value];\n const allowPrivate = props.allowPrivate !== false;\n const allowPublic = props.allowPublic !== false;\n const options = (Object.keys(VIS_ICONS) as Visibility[]).filter((k) => {\n if (k === props.value) return true;\n if (k === \"private\" && !allowPrivate) return false;\n if (k === \"public\" && !allowPublic) return false;\n return true;\n });\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n aria-label={t(\"share.generalAccess\")}\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ms-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={options.map((k) => ({\n value: k,\n label: visibilityMeta[k].label,\n description: visibilityMeta[k].description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? (\n <IconUsersGroup size={14} strokeWidth={1.75} />\n ) : (\n (label.split(\"@\")[0]?.[0] ?? label[0] ?? \"?\").toUpperCase()\n )}\n </span>\n );\n}\n\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\n\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction principalLabel(share: Share, members: OrgMember[]): string {\n const serverLabel = share.displayName?.trim();\n if (serverLabel) return serverLabel;\n if (share.principalType === \"org\") return \"Organization\";\n return displayName(share.principalId, members);\n}\n"]}
1
+ {"version":3,"file":"ShareDialog.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareDialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n ActionButton,\n Avatar as DesignSystemAvatar,\n Dialog as DesignSystemDialog,\n IconButton,\n Picker,\n Status,\n TextArea,\n TextField,\n} from \"@agent-native/toolkit/design-system\";\nimport {\n IconCheck,\n IconCode,\n IconCopy,\n IconLink,\n IconLock,\n IconMail,\n IconTrash,\n IconUsersGroup,\n IconWorld,\n} from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../utils.js\";\nimport {\n useShareDialogController,\n type ResourceShare,\n type ShareDialogController,\n type ShareDialogPerson,\n type ShareDialogTab,\n type ShareVisibility,\n} from \"./useShareDialogController.js\";\n\nexport interface ShareDialogProps {\n open: boolean;\n onClose: () => void;\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /**\n * When provided, enables the \"Link\" tab with a copy-link field.\n * Pass the user-facing share URL (e.g. `https://…/share/<id>`).\n */\n shareUrl?: string;\n /**\n * When provided, enables the \"Embed\" tab with a default iframe snippet.\n * For richer per-resource controls (autoplay, start time, responsive /\n * fixed size), pass `embedTabContent` instead (or in addition) — it\n * replaces the default embed body.\n */\n embedUrl?: string;\n /** Advanced: fully custom Embed tab body. Requires `embedUrl` to enable the tab. */\n embedTabContent?: ReactNode;\n /** Extra content appended to the bottom of the Link tab (e.g. download buttons). */\n linkTabExtras?: ReactNode;\n}\n\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors active:!scale-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"!h-9 !px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"!h-9 !px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"!h-8 !w-8 !p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\n\nconst VIS_ICONS: Record<ShareVisibility, typeof IconLock> = {\n private: IconLock,\n org: IconUsersGroup,\n public: IconWorld,\n};\n\nconst TAB_ICONS: Record<ShareDialogTab, typeof IconLink> = {\n link: IconLink,\n invite: IconMail,\n embed: IconCode,\n};\n\n/**\n * Framework share dialog. Drop into any template via\n * `<ShareDialog open onClose resourceType resourceId />`. Passing `shareUrl`\n * lights up a Link tab with a copy field; passing `embedUrl` lights up an\n * Embed tab. With neither prop, renders a single Invite + general-access\n * panel (Google-Docs-lite).\n */\nexport function ShareDialog({\n open,\n onClose,\n resourceType,\n resourceId,\n resourceTitle,\n shareUrl,\n embedUrl,\n embedTabContent,\n linkTabExtras,\n}: ShareDialogProps) {\n const controller = useShareDialogController({\n open,\n onClose,\n resourceType,\n resourceId,\n resourceTitle,\n shareUrl,\n embedUrl,\n });\n if (!open) return null;\n\n return (\n <DesignSystemDialog\n open={controller.open}\n onOpenChange={controller.onOpenChange}\n title={\n <span\n className=\"truncate !text-base !leading-normal !tracking-normal !text-inherit\"\n title={controller.title}\n >\n {controller.title}\n </span>\n }\n closeLabel={controller.labels.close}\n size=\"large\"\n className=\"!top-4 !z-[2010] !block !max-h-none !w-[calc(100vw-2rem)] !max-w-lg !translate-y-0 !gap-0 !overflow-visible !rounded-xl !border-border !bg-popover !p-0 !text-popover-foreground !shadow-2xl sm:!top-1/2 sm:!-translate-y-1/2\"\n aria-label={controller.title}\n >\n <div className=\"px-5 pt-0 pb-3\">\n {controller.ownerLabel ? (\n <div className=\"truncate text-xs text-muted-foreground\">\n {controller.ownerLabel}\n </div>\n ) : null}\n </div>\n\n {controller.tabsEnabled ? (\n <div\n role=\"tablist\"\n aria-label={controller.labels.shareOptions}\n className=\"mx-5 mt-1 flex gap-1 border-b border-border\"\n >\n {controller.tabs.map((tab) => {\n const Icon = TAB_ICONS[tab.value];\n return (\n <TabTrigger\n key={tab.value}\n active={controller.activeTab === tab.value}\n onClick={() => controller.setActiveTab(tab.value)}\n icon={<Icon size={14} strokeWidth={1.75} />}\n label={tab.label}\n />\n );\n })}\n </div>\n ) : null}\n\n <div className=\"px-5 py-4\">\n {controller.tabsEnabled && controller.activeTab === \"link\" ? (\n <LinkTab controller={controller} extras={linkTabExtras} />\n ) : null}\n {!controller.tabsEnabled || controller.activeTab === \"invite\" ? (\n <InviteTab\n controller={controller}\n showVisibility={!controller.tabsEnabled}\n />\n ) : null}\n {controller.tabsEnabled && controller.activeTab === \"embed\"\n ? (embedTabContent ?? <DefaultEmbedBody controller={controller} />)\n : null}\n </div>\n\n <div className=\"flex justify-end border-t border-border px-5 py-3\">\n <ActionButton\n type=\"button\"\n intent=\"primary\"\n emphasis=\"solid\"\n onPress={controller.close}\n className={BUTTON_PRIMARY_SM}\n >\n {controller.labels.done}\n </ActionButton>\n </div>\n </DesignSystemDialog>\n );\n}\n\nfunction TabTrigger({\n active,\n onClick,\n icon,\n label,\n}: {\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n label: string;\n}) {\n return (\n <ActionButton\n type=\"button\"\n emphasis=\"ghost\"\n aria-pressed={active}\n onPress={onClick}\n className={cn(\n \"inline-flex !h-auto items-center gap-1.5 !rounded-none border-b-2 !px-3 !py-2 text-sm font-medium transition-colors hover:!bg-transparent active:!scale-100 focus-visible:!ring-0 focus-visible:!ring-offset-0 [&_svg]:!size-auto\",\n active\n ? \"border-foreground text-foreground\"\n : \"border-transparent text-muted-foreground hover:text-foreground\",\n )}\n >\n {icon}\n {label}\n </ActionButton>\n );\n}\n\nfunction LinkTab({\n controller,\n extras,\n}: {\n controller: ShareDialogController;\n extras?: ReactNode;\n}) {\n const Icon = VIS_ICONS[controller.visibility.value];\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"mb-2 text-sm font-semibold\">\n {controller.labels.generalAccess}\n </div>\n <div className=\"flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect controller={controller} />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {controller.visibility.description}\n </div>\n </div>\n </div>\n </div>\n <CopyField\n field=\"share-link\"\n label={controller.labels.shareLink}\n value={controller.shareUrl!}\n controller={controller}\n />\n {extras}\n </div>\n );\n}\n\nfunction InviteTab({\n controller,\n showVisibility,\n}: {\n controller: ShareDialogController;\n showVisibility: boolean;\n}) {\n const Icon = VIS_ICONS[controller.visibility.value];\n return (\n <div className=\"space-y-4\">\n {controller.canManage ? (\n <div className=\"space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder={controller.labels.addPeopleByEmail}\n value={controller.invite.email}\n onChange={(event) =>\n controller.invite.setEmail(event.currentTarget.value)\n }\n onKeyDown={(event) => {\n if (event.key === \"Enter\") controller.invite.submit();\n }}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n <RoleSelect controller={controller} />\n </div>\n {controller.invite.showNotifyPeople ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={controller.invite.notifyPeople}\n onChange={(event) =>\n controller.invite.setNotifyPeople(event.currentTarget.checked)\n }\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n {controller.labels.notifyPeople}\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div>\n <div className=\"mb-2 text-sm font-semibold\">\n {controller.labels.peopleWithAccess}\n </div>\n <ul className=\"flex flex-col gap-1 list-none p-0 m-0\">\n {controller.people.map((person) => (\n <PersonRow\n key={person.key}\n person={person}\n canManage={controller.canManage}\n removeLabel={controller.labels.remove}\n onRemove={controller.removeShare}\n />\n ))}\n {!controller.people.length ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n {controller.labels.noAccess}\n </li>\n ) : null}\n </ul>\n </div>\n\n {showVisibility ? (\n <div>\n <div className=\"mb-2 text-sm font-semibold\">\n {controller.labels.generalAccess}\n </div>\n <div className=\"flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect controller={controller} />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {controller.visibility.description}\n </div>\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction PersonRow({\n person,\n canManage,\n removeLabel,\n onRemove,\n}: {\n person: ShareDialogPerson;\n canManage: boolean;\n removeLabel: string;\n onRemove: (share: ResourceShare) => void;\n}) {\n return (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <DesignSystemAvatar\n name={person.label}\n fallback={\n person.principalType === \"org\" ? (\n <IconUsersGroup size={14} strokeWidth={1.75} />\n ) : (\n person.avatarText\n )\n }\n size=\"compact\"\n className=\"inline-flex h-7 w-7 shrink-0 text-[11px] font-semibold\"\n />\n <span className=\"flex-1 min-w-0 truncate\">{person.label}</span>\n <Status\n tone=\"neutral\"\n size=\"compact\"\n className=\"border-0 bg-transparent px-0 text-xs text-muted-foreground\"\n >\n {person.roleLabel}\n </Status>\n {canManage && person.share ? (\n <IconButton\n intent=\"danger\"\n emphasis=\"ghost\"\n size=\"compact\"\n icon={<IconTrash size={14} />}\n label={removeLabel}\n aria-label={removeLabel}\n onPress={() => onRemove(person.share!)}\n className={cn(BUTTON_GHOST_ICON, \"[&_svg]:!size-auto\")}\n />\n ) : null}\n </li>\n );\n}\n\nfunction DefaultEmbedBody({\n controller,\n}: {\n controller: ShareDialogController;\n}) {\n return (\n <div className=\"space-y-3\">\n <CopyField\n field=\"embed-url\"\n label={controller.labels.embedUrl}\n value={controller.embedUrl!}\n controller={controller}\n />\n <CopyField\n field=\"embed-code\"\n label={controller.labels.embedCode}\n value={controller.embedCode!}\n controller={controller}\n multiline\n />\n </div>\n );\n}\n\nfunction CopyField({\n field,\n label,\n value,\n controller,\n multiline,\n}: {\n field: string;\n label: string;\n value: string;\n controller: ShareDialogController;\n multiline?: boolean;\n}) {\n const copied = controller.copiedField === field;\n return (\n <div>\n <div className=\"mb-1 text-xs font-medium text-muted-foreground\">\n {label}\n </div>\n <div className=\"flex items-stretch gap-2\">\n {multiline ? (\n <TextArea\n readOnly\n value={value}\n onChange={() => undefined}\n aria-label={label}\n className=\"flex-1 h-20 text-xs font-mono\"\n />\n ) : (\n <TextField\n readOnly\n value={value}\n onChange={() => undefined}\n aria-label={label}\n className=\"flex-1 min-w-0 text-xs font-mono\"\n />\n )}\n <IconButton\n emphasis=\"outline\"\n size=\"compact\"\n icon={copied ? <IconCheck size={14} /> : <IconCopy size={14} />}\n label={controller.labels.copy}\n onPress={() => void controller.copy(field, value)}\n aria-label={controller.labels.copy}\n className={cn(BUTTON_OUTLINE_SM, \"!w-9 !px-0 [&_svg]:!size-auto\")}\n />\n </div>\n </div>\n );\n}\n\nfunction RoleSelect({ controller }: { controller: ShareDialogController }) {\n return (\n <Picker\n mode=\"select\"\n options={controller.invite.roleOptions}\n value={controller.invite.role}\n onChange={(value) => {\n if (value === \"viewer\" || value === \"editor\" || value === \"admin\") {\n controller.invite.setRole(value);\n }\n }}\n aria-label={controller.labels.role}\n className=\"w-auto\"\n />\n );\n}\n\nfunction VisibilitySelect({\n controller,\n}: {\n controller: ShareDialogController;\n}) {\n return (\n <Picker\n mode=\"select\"\n options={controller.visibility.options}\n value={controller.visibility.value}\n onChange={(value) => {\n if (value === \"private\" || value === \"org\" || value === \"public\") {\n controller.visibility.set(value);\n }\n }}\n disabled={controller.visibility.disabled}\n aria-label={controller.labels.generalAccess}\n className=\"-ms-1 w-auto\"\n />\n );\n}\n"]}
@@ -1,3 +1,6 @@
1
1
  export { ShareDialog, type ShareDialogProps } from "./ShareDialog.js";
2
2
  export { ShareButton, type ShareButtonProps } from "./ShareButton.js";
3
+ export { useShareButtonController, type ShareButtonController, type ShareButtonControllerOptions, type ShareButtonOrgMember, type ShareButtonOrgMemberSearch, type ShareButtonRole, type ShareButtonShare, type ShareButtonSharesResponse, type ShareButtonVisibility, } from "./useShareButtonController.js";
4
+ export { useShareDialogController, type ResourceShare, type ResourceSharesResponse, type ShareDialogController, type ShareDialogControllerOptions, type ShareDialogPerson, type ShareDialogTab, type ShareOption, type ShareRole, type ShareVisibility, } from "./useShareDialogController.js";
5
+ export { createShareQueryKey, createShareQueryParams, extractShareErrorMessage, fetchOrgMemberPage, mergeOrgMembers, normalizeOrgMembers, optimisticallyUpdateShareCache, rollbackShareCache, useShareMutationGuard, useShareMutations, useShareOrgMemberSearch, useShareQuery, type OrgMemberPage, type ShareOrgMember, type ShareOrgMemberSearchResult, type ShareQueryKey, type ShareQueryParams, } from "./share-controller-helpers.js";
3
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/sharing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/sharing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,8BAA8B,EAC9B,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,+BAA+B,CAAC"}
@@ -1,3 +1,6 @@
1
1
  export { ShareDialog } from "./ShareDialog.js";
2
2
  export { ShareButton } from "./ShareButton.js";
3
+ export { useShareButtonController, } from "./useShareButtonController.js";
4
+ export { useShareDialogController, } from "./useShareDialogController.js";
5
+ export { createShareQueryKey, createShareQueryParams, extractShareErrorMessage, fetchOrgMemberPage, mergeOrgMembers, normalizeOrgMembers, optimisticallyUpdateShareCache, rollbackShareCache, useShareMutationGuard, useShareMutations, useShareOrgMemberSearch, useShareQuery, } from "./share-controller-helpers.js";
3
6
  //# sourceMappingURL=index.js.map