@agent-native/core 0.14.8 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  3. package/dist/agent/engine/builder-engine.js +30 -9
  4. package/dist/agent/engine/builder-engine.js.map +1 -1
  5. package/dist/agent/engine/registry.d.ts.map +1 -1
  6. package/dist/agent/engine/registry.js +14 -4
  7. package/dist/agent/engine/registry.js.map +1 -1
  8. package/dist/agent/production-agent.d.ts.map +1 -1
  9. package/dist/agent/production-agent.js +71 -4
  10. package/dist/agent/production-agent.js.map +1 -1
  11. package/dist/agent/types.d.ts +9 -0
  12. package/dist/agent/types.d.ts.map +1 -1
  13. package/dist/agent/types.js.map +1 -1
  14. package/dist/appearance/actions/change-appearance.d.ts +3 -0
  15. package/dist/appearance/actions/change-appearance.d.ts.map +1 -0
  16. package/dist/appearance/actions/change-appearance.js +29 -0
  17. package/dist/appearance/actions/change-appearance.js.map +1 -0
  18. package/dist/chat-threads/store.d.ts +53 -2
  19. package/dist/chat-threads/store.d.ts.map +1 -1
  20. package/dist/chat-threads/store.js +172 -12
  21. package/dist/chat-threads/store.js.map +1 -1
  22. package/dist/cli/create.d.ts.map +1 -1
  23. package/dist/cli/create.js +114 -37
  24. package/dist/cli/create.js.map +1 -1
  25. package/dist/cli/index.js +30 -4
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/cli/workspace-dev.d.ts +25 -1
  28. package/dist/cli/workspace-dev.d.ts.map +1 -1
  29. package/dist/cli/workspace-dev.js +275 -49
  30. package/dist/cli/workspace-dev.js.map +1 -1
  31. package/dist/client/AgentPanel.d.ts +23 -4
  32. package/dist/client/AgentPanel.d.ts.map +1 -1
  33. package/dist/client/AgentPanel.js +276 -53
  34. package/dist/client/AgentPanel.js.map +1 -1
  35. package/dist/client/AppearancePicker.d.ts +11 -0
  36. package/dist/client/AppearancePicker.d.ts.map +1 -0
  37. package/dist/client/AppearancePicker.js +16 -0
  38. package/dist/client/AppearancePicker.js.map +1 -0
  39. package/dist/client/AssistantChat.d.ts +35 -0
  40. package/dist/client/AssistantChat.d.ts.map +1 -1
  41. package/dist/client/AssistantChat.js +315 -32
  42. package/dist/client/AssistantChat.js.map +1 -1
  43. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  44. package/dist/client/ConnectBuilderCard.js +5 -2
  45. package/dist/client/ConnectBuilderCard.js.map +1 -1
  46. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  47. package/dist/client/ErrorBoundary.js +8 -10
  48. package/dist/client/ErrorBoundary.js.map +1 -1
  49. package/dist/client/FeedbackButton.d.ts.map +1 -1
  50. package/dist/client/FeedbackButton.js +1 -1
  51. package/dist/client/FeedbackButton.js.map +1 -1
  52. package/dist/client/MultiTabAssistantChat.d.ts +13 -1
  53. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  54. package/dist/client/MultiTabAssistantChat.js +217 -38
  55. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  56. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  57. package/dist/client/NewWorkspaceAppFlow.js +37 -14
  58. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  59. package/dist/client/agent-chat-adapter.d.ts +5 -0
  60. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  61. package/dist/client/agent-chat-adapter.js +4 -0
  62. package/dist/client/agent-chat-adapter.js.map +1 -1
  63. package/dist/client/agent-sidebar-state.d.ts +12 -0
  64. package/dist/client/agent-sidebar-state.d.ts.map +1 -1
  65. package/dist/client/agent-sidebar-state.js +8 -0
  66. package/dist/client/agent-sidebar-state.js.map +1 -1
  67. package/dist/client/analytics.d.ts.map +1 -1
  68. package/dist/client/analytics.js +175 -3
  69. package/dist/client/analytics.js.map +1 -1
  70. package/dist/client/appearance.d.ts +40 -0
  71. package/dist/client/appearance.d.ts.map +1 -0
  72. package/dist/client/appearance.js +114 -0
  73. package/dist/client/appearance.js.map +1 -0
  74. package/dist/client/builder-frame.d.ts +1 -0
  75. package/dist/client/builder-frame.d.ts.map +1 -1
  76. package/dist/client/builder-frame.js +19 -9
  77. package/dist/client/builder-frame.js.map +1 -1
  78. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  79. package/dist/client/components/CodeRequiredDialog.js +10 -2
  80. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  81. package/dist/client/components/ui/dropdown-menu.js +2 -2
  82. package/dist/client/components/ui/dropdown-menu.js.map +1 -1
  83. package/dist/client/components/ui/hover-card.js +1 -1
  84. package/dist/client/components/ui/hover-card.js.map +1 -1
  85. package/dist/client/components/ui/popover.js +1 -1
  86. package/dist/client/components/ui/popover.js.map +1 -1
  87. package/dist/client/composer/PromptComposer.d.ts +7 -0
  88. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  89. package/dist/client/composer/PromptComposer.js +63 -32
  90. package/dist/client/composer/PromptComposer.js.map +1 -1
  91. package/dist/client/composer/TiptapComposer.d.ts +5 -0
  92. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  93. package/dist/client/composer/TiptapComposer.js +36 -6
  94. package/dist/client/composer/TiptapComposer.js.map +1 -1
  95. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  96. package/dist/client/composer/useVoiceDictation.js +13 -1
  97. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  98. package/dist/client/error-format.d.ts +3 -2
  99. package/dist/client/error-format.d.ts.map +1 -1
  100. package/dist/client/error-format.js +9 -2
  101. package/dist/client/error-format.js.map +1 -1
  102. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  103. package/dist/client/extensions/ExtensionViewer.js +24 -2
  104. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  105. package/dist/client/index.d.ts +8 -1
  106. package/dist/client/index.d.ts.map +1 -1
  107. package/dist/client/index.js +7 -0
  108. package/dist/client/index.js.map +1 -1
  109. package/dist/client/onboarding/OnboardingPanel.js +1 -0
  110. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  111. package/dist/client/org/InvitationBanner.d.ts.map +1 -1
  112. package/dist/client/org/InvitationBanner.js +23 -2
  113. package/dist/client/org/InvitationBanner.js.map +1 -1
  114. package/dist/client/org/OrgSwitcher.d.ts +5 -4
  115. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  116. package/dist/client/org/OrgSwitcher.js +57 -9
  117. package/dist/client/org/OrgSwitcher.js.map +1 -1
  118. package/dist/client/org/hooks.d.ts.map +1 -1
  119. package/dist/client/org/hooks.js +10 -6
  120. package/dist/client/org/hooks.js.map +1 -1
  121. package/dist/client/org/workspace-app-links.d.ts +31 -0
  122. package/dist/client/org/workspace-app-links.d.ts.map +1 -0
  123. package/dist/client/org/workspace-app-links.js +268 -0
  124. package/dist/client/org/workspace-app-links.js.map +1 -0
  125. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  126. package/dist/client/resources/ResourcesPanel.js +18 -5
  127. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  128. package/dist/client/resources/use-resources.d.ts +18 -13
  129. package/dist/client/resources/use-resources.d.ts.map +1 -1
  130. package/dist/client/resources/use-resources.js +24 -6
  131. package/dist/client/resources/use-resources.js.map +1 -1
  132. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  133. package/dist/client/settings/BackgroundAgentSection.js +9 -1
  134. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  135. package/dist/client/settings/BrowserSection.d.ts.map +1 -1
  136. package/dist/client/settings/BrowserSection.js +16 -1
  137. package/dist/client/settings/BrowserSection.js.map +1 -1
  138. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  139. package/dist/client/settings/SettingsPanel.js +4 -1
  140. package/dist/client/settings/SettingsPanel.js.map +1 -1
  141. package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  142. package/dist/client/settings/VoiceTranscriptionSection.js +5 -5
  143. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  144. package/dist/client/settings/useBuilderStatus.d.ts +8 -0
  145. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  146. package/dist/client/settings/useBuilderStatus.js +50 -13
  147. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  148. package/dist/client/settings/useBuilderStatus.spec.d.ts +2 -0
  149. package/dist/client/settings/useBuilderStatus.spec.d.ts.map +1 -0
  150. package/dist/client/settings/useBuilderStatus.spec.js +64 -0
  151. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -0
  152. package/dist/client/sharing/ShareButton.d.ts +5 -0
  153. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  154. package/dist/client/sharing/ShareButton.js +60 -6
  155. package/dist/client/sharing/ShareButton.js.map +1 -1
  156. package/dist/client/theme.js +1 -1
  157. package/dist/client/theme.js.map +1 -1
  158. package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  159. package/dist/client/transcription/BuilderTranscriptionCta.js +2 -3
  160. package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -1
  161. package/dist/client/use-change-version.d.ts +46 -0
  162. package/dist/client/use-change-version.d.ts.map +1 -0
  163. package/dist/client/use-change-version.js +135 -0
  164. package/dist/client/use-change-version.js.map +1 -0
  165. package/dist/client/use-chat-threads.d.ts +16 -2
  166. package/dist/client/use-chat-threads.d.ts.map +1 -1
  167. package/dist/client/use-chat-threads.js +87 -12
  168. package/dist/client/use-chat-threads.js.map +1 -1
  169. package/dist/client/use-chat-threads.spec.d.ts +2 -0
  170. package/dist/client/use-chat-threads.spec.d.ts.map +1 -0
  171. package/dist/client/use-chat-threads.spec.js +85 -0
  172. package/dist/client/use-chat-threads.spec.js.map +1 -0
  173. package/dist/client/use-db-sync.d.ts +5 -2
  174. package/dist/client/use-db-sync.d.ts.map +1 -1
  175. package/dist/client/use-db-sync.js +41 -16
  176. package/dist/client/use-db-sync.js.map +1 -1
  177. package/dist/client/use-pinch-zoom.d.ts +35 -0
  178. package/dist/client/use-pinch-zoom.d.ts.map +1 -0
  179. package/dist/client/use-pinch-zoom.js +105 -0
  180. package/dist/client/use-pinch-zoom.js.map +1 -0
  181. package/dist/deploy/workspace-deploy.d.ts.map +1 -1
  182. package/dist/deploy/workspace-deploy.js +99 -5
  183. package/dist/deploy/workspace-deploy.js.map +1 -1
  184. package/dist/extensions/actions.d.ts.map +1 -1
  185. package/dist/extensions/actions.js +3 -0
  186. package/dist/extensions/actions.js.map +1 -1
  187. package/dist/extensions/store.d.ts +5 -0
  188. package/dist/extensions/store.d.ts.map +1 -1
  189. package/dist/extensions/store.js +16 -1
  190. package/dist/extensions/store.js.map +1 -1
  191. package/dist/file-upload/actions/upload-image.d.ts +3 -0
  192. package/dist/file-upload/actions/upload-image.d.ts.map +1 -0
  193. package/dist/file-upload/actions/upload-image.js +145 -0
  194. package/dist/file-upload/actions/upload-image.js.map +1 -0
  195. package/dist/file-upload/builder.d.ts.map +1 -1
  196. package/dist/file-upload/builder.js +31 -11
  197. package/dist/file-upload/builder.js.map +1 -1
  198. package/dist/file-upload/index.d.ts +1 -0
  199. package/dist/file-upload/index.d.ts.map +1 -1
  200. package/dist/file-upload/index.js +1 -0
  201. package/dist/file-upload/index.js.map +1 -1
  202. package/dist/file-upload/pre-upload-attachments.d.ts +39 -0
  203. package/dist/file-upload/pre-upload-attachments.d.ts.map +1 -0
  204. package/dist/file-upload/pre-upload-attachments.js +110 -0
  205. package/dist/file-upload/pre-upload-attachments.js.map +1 -0
  206. package/dist/file-upload/registry.d.ts.map +1 -1
  207. package/dist/file-upload/registry.js +8 -7
  208. package/dist/file-upload/registry.js.map +1 -1
  209. package/dist/onboarding/default-steps.js +1 -1
  210. package/dist/onboarding/default-steps.js.map +1 -1
  211. package/dist/org/context.d.ts +15 -1
  212. package/dist/org/context.d.ts.map +1 -1
  213. package/dist/org/context.js +25 -0
  214. package/dist/org/context.js.map +1 -1
  215. package/dist/org/handlers.d.ts +2 -2
  216. package/dist/org/handlers.d.ts.map +1 -1
  217. package/dist/org/handlers.js +3 -17
  218. package/dist/org/handlers.js.map +1 -1
  219. package/dist/org/index.d.ts +1 -1
  220. package/dist/org/index.d.ts.map +1 -1
  221. package/dist/org/index.js +1 -1
  222. package/dist/org/index.js.map +1 -1
  223. package/dist/resources/handlers.d.ts +6 -0
  224. package/dist/resources/handlers.d.ts.map +1 -1
  225. package/dist/resources/handlers.js +30 -6
  226. package/dist/resources/handlers.js.map +1 -1
  227. package/dist/resources/script-helpers.d.ts +11 -2
  228. package/dist/resources/script-helpers.d.ts.map +1 -1
  229. package/dist/resources/script-helpers.js +20 -3
  230. package/dist/resources/script-helpers.js.map +1 -1
  231. package/dist/resources/store.d.ts +28 -3
  232. package/dist/resources/store.d.ts.map +1 -1
  233. package/dist/resources/store.js +170 -20
  234. package/dist/resources/store.js.map +1 -1
  235. package/dist/scripts/resources/list.d.ts +1 -1
  236. package/dist/scripts/resources/list.d.ts.map +1 -1
  237. package/dist/scripts/resources/list.js +16 -4
  238. package/dist/scripts/resources/list.js.map +1 -1
  239. package/dist/scripts/resources/write.d.ts +1 -1
  240. package/dist/scripts/resources/write.d.ts.map +1 -1
  241. package/dist/scripts/resources/write.js +47 -3
  242. package/dist/scripts/resources/write.js.map +1 -1
  243. package/dist/server/action-discovery.d.ts.map +1 -1
  244. package/dist/server/action-discovery.js +8 -3
  245. package/dist/server/action-discovery.js.map +1 -1
  246. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  247. package/dist/server/agent-chat-plugin.js +214 -25
  248. package/dist/server/agent-chat-plugin.js.map +1 -1
  249. package/dist/server/agent-discovery.d.ts +35 -0
  250. package/dist/server/agent-discovery.d.ts.map +1 -1
  251. package/dist/server/agent-discovery.js +139 -8
  252. package/dist/server/agent-discovery.js.map +1 -1
  253. package/dist/server/app-url.d.ts +12 -6
  254. package/dist/server/app-url.d.ts.map +1 -1
  255. package/dist/server/app-url.js +58 -11
  256. package/dist/server/app-url.js.map +1 -1
  257. package/dist/server/auth.d.ts +22 -0
  258. package/dist/server/auth.d.ts.map +1 -1
  259. package/dist/server/auth.js +272 -59
  260. package/dist/server/auth.js.map +1 -1
  261. package/dist/server/better-auth-instance.d.ts +0 -4
  262. package/dist/server/better-auth-instance.d.ts.map +1 -1
  263. package/dist/server/better-auth-instance.js +0 -3
  264. package/dist/server/better-auth-instance.js.map +1 -1
  265. package/dist/server/builder-browser.d.ts.map +1 -1
  266. package/dist/server/builder-browser.js +23 -0
  267. package/dist/server/builder-browser.js.map +1 -1
  268. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  269. package/dist/server/core-routes-plugin.js +29 -14
  270. package/dist/server/core-routes-plugin.js.map +1 -1
  271. package/dist/server/credential-provider.d.ts +14 -0
  272. package/dist/server/credential-provider.d.ts.map +1 -1
  273. package/dist/server/credential-provider.js +88 -11
  274. package/dist/server/credential-provider.js.map +1 -1
  275. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  276. package/dist/server/google-auth-plugin.js +53 -13
  277. package/dist/server/google-auth-plugin.js.map +1 -1
  278. package/dist/server/google-oauth.d.ts.map +1 -1
  279. package/dist/server/google-oauth.js +47 -17
  280. package/dist/server/google-oauth.js.map +1 -1
  281. package/dist/server/index.d.ts +1 -1
  282. package/dist/server/index.d.ts.map +1 -1
  283. package/dist/server/index.js +1 -1
  284. package/dist/server/index.js.map +1 -1
  285. package/dist/server/oauth-public-origin.d.ts.map +1 -1
  286. package/dist/server/oauth-public-origin.js +19 -1
  287. package/dist/server/oauth-public-origin.js.map +1 -1
  288. package/dist/server/onboarding-html.d.ts.map +1 -1
  289. package/dist/server/onboarding-html.js +62 -15
  290. package/dist/server/onboarding-html.js.map +1 -1
  291. package/dist/server/poll.d.ts.map +1 -1
  292. package/dist/server/poll.js +20 -5
  293. package/dist/server/poll.js.map +1 -1
  294. package/dist/server/request-context.d.ts +8 -0
  295. package/dist/server/request-context.d.ts.map +1 -1
  296. package/dist/server/request-context.js.map +1 -1
  297. package/dist/shared/index.d.ts +2 -0
  298. package/dist/shared/index.d.ts.map +1 -1
  299. package/dist/shared/index.js +2 -0
  300. package/dist/shared/index.js.map +1 -1
  301. package/dist/shared/llm-connection.d.ts +10 -0
  302. package/dist/shared/llm-connection.d.ts.map +1 -0
  303. package/dist/shared/llm-connection.js +29 -0
  304. package/dist/shared/llm-connection.js.map +1 -0
  305. package/dist/shared/workspace-app-audience.d.ts +25 -0
  306. package/dist/shared/workspace-app-audience.d.ts.map +1 -0
  307. package/dist/shared/workspace-app-audience.js +126 -0
  308. package/dist/shared/workspace-app-audience.js.map +1 -0
  309. package/dist/shared/workspace-app-id.d.ts +1 -1
  310. package/dist/shared/workspace-app-id.d.ts.map +1 -1
  311. package/dist/shared/workspace-app-id.js +1 -0
  312. package/dist/shared/workspace-app-id.js.map +1 -1
  313. package/dist/sharing/access.d.ts.map +1 -1
  314. package/dist/sharing/access.js +46 -5
  315. package/dist/sharing/access.js.map +1 -1
  316. package/dist/sharing/actions/list-resource-shares.d.ts.map +1 -1
  317. package/dist/sharing/actions/list-resource-shares.js +8 -1
  318. package/dist/sharing/actions/list-resource-shares.js.map +1 -1
  319. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  320. package/dist/sharing/actions/set-resource-visibility.js +12 -3
  321. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  322. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  323. package/dist/sharing/actions/share-resource.js +50 -1
  324. package/dist/sharing/actions/share-resource.js.map +1 -1
  325. package/dist/sharing/registry.d.ts +26 -0
  326. package/dist/sharing/registry.d.ts.map +1 -1
  327. package/dist/sharing/registry.js.map +1 -1
  328. package/dist/styles/agent-native.css +91 -0
  329. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  330. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  331. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  332. package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  333. package/dist/templates/default/AGENTS.md +22 -19
  334. package/dist/templates/default/actions/navigate.ts +3 -0
  335. package/dist/templates/default/app/hooks/use-navigation-state.ts +29 -5
  336. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  337. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  338. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  339. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  340. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  341. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  342. package/dist/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  343. package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  344. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  345. package/dist/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  346. package/dist/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  347. package/dist/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  348. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  349. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  350. package/dist/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  351. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  352. package/dist/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  353. package/dist/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  354. package/dist/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  355. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  356. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  357. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  358. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  359. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  360. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  361. package/dist/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  362. package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  363. package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  364. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  365. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  366. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  367. package/dist/templates/workspace-core/AGENTS.md +16 -1
  368. package/dist/templates/workspace-root/AGENTS.md +35 -0
  369. package/dist/templates/workspace-root/README.md +7 -0
  370. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  371. package/dist/vite/action-types-plugin.js +4 -0
  372. package/dist/vite/action-types-plugin.js.map +1 -1
  373. package/docs/content/authentication.md +36 -0
  374. package/docs/content/creating-templates.md +15 -0
  375. package/docs/content/dispatch.md +3 -3
  376. package/docs/content/multi-app-workspace.md +5 -0
  377. package/docs/content/tracking.md +12 -0
  378. package/docs/content/workspace-management.md +39 -4
  379. package/package.json +15 -12
  380. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +72 -0
  381. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +60 -37
  382. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +28 -17
  383. package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +79 -0
  384. package/src/templates/default/AGENTS.md +22 -19
  385. package/src/templates/default/actions/navigate.ts +3 -0
  386. package/src/templates/default/app/hooks/use-navigation-state.ts +29 -5
  387. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +251 -0
  388. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +264 -0
  389. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +130 -0
  390. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +112 -0
  391. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +88 -0
  392. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +191 -0
  393. package/src/templates/workspace-core/.agents/skills/capture-learnings/SKILL.md +74 -0
  394. package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +75 -0
  395. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +190 -0
  396. package/src/templates/workspace-core/.agents/skills/create-skill/SKILL.md +168 -0
  397. package/src/templates/workspace-core/.agents/skills/delegate-to-agent/SKILL.md +163 -0
  398. package/src/templates/workspace-core/.agents/skills/extension-points/SKILL.md +205 -0
  399. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +720 -0
  400. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +92 -0
  401. package/src/templates/workspace-core/.agents/skills/integration-webhooks/SKILL.md +285 -0
  402. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +192 -0
  403. package/src/templates/workspace-core/.agents/skills/onboarding/SKILL.md +43 -0
  404. package/src/templates/workspace-core/.agents/skills/portability/SKILL.md +84 -0
  405. package/src/templates/workspace-core/.agents/skills/qa/SKILL.md +313 -0
  406. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +112 -0
  407. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +165 -0
  408. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +41 -0
  409. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +239 -0
  410. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +191 -0
  411. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +79 -0
  412. package/src/templates/workspace-core/.agents/skills/server-plugins/SKILL.md +73 -0
  413. package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +79 -0
  414. package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +217 -0
  415. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +132 -0
  416. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +150 -0
  417. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +124 -0
  418. package/src/templates/workspace-core/AGENTS.md +16 -1
  419. package/src/templates/workspace-root/AGENTS.md +35 -0
  420. package/src/templates/workspace-root/README.md +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"OrgSwitcher.js","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport {\n IconBuilding,\n IconCheck,\n IconLoader2,\n IconLogout,\n IconPlus,\n IconSelector,\n IconSettings,\n IconUser,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport {\n useOrg,\n useSwitchOrg,\n useCreateOrg,\n useInviteMember,\n useAcceptInvitation,\n useJoinByDomain,\n} from \"./hooks.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface OrgSwitcherProps {\n className?: string;\n /** Hide entirely when the user only belongs to one org. Default: false. */\n hideWhenSingle?: boolean;\n /** Keep the switcher's button height reserved while org state is loading. */\n reserveSpace?: boolean;\n /**\n * Where the \"Workspace settings\" item navigates to. Defaults to `/team`,\n * which every framework template mounts via the shared `TeamPage`.\n * Templates that mount the settings page elsewhere can override.\n */\n settingsPath?: string;\n}\n\nfunction personalLabelFromEmail(email: string | null | undefined): string {\n if (!email) return \"Personal\";\n const local = email.split(\"@\")[0] ?? email;\n const cleaned = local.replace(/[._-]+/g, \" \").trim();\n if (!cleaned) return \"Personal\";\n return cleaned\n .split(\" \")\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\ntype Mode = \"list\" | \"create\" | \"invite\";\n\nconst POPOVER_CONTENT_CLASS =\n \"z-50 min-w-[14rem] rounded-md border border-border bg-popover py-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\";\n\nconst ITEM_CLASS =\n \"flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-foreground hover:bg-accent focus-visible:bg-accent focus:outline-none disabled:opacity-50 disabled:pointer-events-none\";\n\nconst SECTION_LABEL_CLASS =\n \"px-2.5 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground\";\n\nfunction workspaceSettingsPath(path: string): string {\n return `${path.replace(/#.*$/, \"\")}#workspace-settings`;\n}\n\n/**\n * Compact org switcher button. Shows the active org (or \"Personal\" when the\n * user has none); opens a popover with the user's other orgs, pending\n * invitations, inline forms to create a new org / invite a teammate, and a\n * sign-out item. Renders nothing in dev / no-auth mode.\n */\nexport function OrgSwitcher({\n className,\n hideWhenSingle,\n reserveSpace,\n settingsPath = \"/team\",\n}: OrgSwitcherProps) {\n const { data: org, isLoading } = useOrg();\n const switchOrg = useSwitchOrg();\n const createOrg = useCreateOrg();\n const inviteMember = useInviteMember();\n const acceptInvitation = useAcceptInvitation();\n const joinByDomain = useJoinByDomain();\n const navigate = useNavigate();\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<Mode>(\"list\");\n const [newName, setNewName] = useState(\"\");\n const [inviteEmail, setInviteEmail] = useState(\"\");\n const [signingOut, setSigningOut] = useState(false);\n const [joiningOrgId, setJoiningOrgId] = useState<string | null>(null);\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next);\n if (!next) {\n setMode(\"list\");\n setNewName(\"\");\n setInviteEmail(\"\");\n }\n };\n\n const handleSignOut = async () => {\n if (signingOut) return;\n setSigningOut(true);\n try {\n await fetch(agentNativePath(\"/_agent-native/auth/logout\"), {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n /* fall through to reload — server may already have cleared the cookie */\n }\n window.location.reload();\n };\n\n if (!org) {\n return reserveSpace && isLoading ? (\n <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />\n ) : null;\n }\n\n const orgs = org.orgs ?? [];\n const pendingInvitations = org.pendingInvitations ?? [];\n const domainMatches = org.domainMatches ?? [];\n const orgCount = orgs.length;\n const hasAny =\n orgCount > 0 || pendingInvitations.length > 0 || domainMatches.length > 0;\n if (!hasAny && !org.email) {\n return reserveSpace ? (\n <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />\n ) : null;\n }\n if (\n hideWhenSingle &&\n orgCount < 2 &&\n pendingInvitations.length === 0 &&\n domainMatches.length === 0\n ) {\n return reserveSpace ? (\n <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />\n ) : null;\n }\n\n const canInvite =\n !!org.orgId && (org.role === \"owner\" || org.role === \"admin\");\n\n const personalLabel = personalLabelFromEmail(org.email);\n const inOrg = !!org.orgId;\n const buttonLabel = org.orgName ?? \"Personal\";\n const ButtonIcon = inOrg ? IconBuilding : IconUser;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={`flex w-full items-center gap-2 rounded-md border border-border/50 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer ${className ?? \"\"}`}\n >\n <ButtonIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1 text-left\">{buttonLabel}</span>\n <IconSelector className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"top\"\n align=\"start\"\n sideOffset={6}\n collisionPadding={12}\n className={POPOVER_CONTENT_CLASS}\n onOpenAutoFocus={(e) => {\n // Don't auto-focus the first item — feels heavy on a switcher.\n if (mode === \"list\") e.preventDefault();\n }}\n >\n {mode === \"list\" && (\n <>\n {!inOrg && (\n <div\n className=\"flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-muted-foreground\"\n aria-disabled=\"true\"\n >\n <IconUser className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1 text-left\">\n Personal ({personalLabel})\n </span>\n </div>\n )}\n {orgs.length > 0 && (\n <div className={SECTION_LABEL_CLASS}>Organizations</div>\n )}\n {orgs.map((o) => (\n <button\n key={o.orgId}\n type=\"button\"\n onClick={async () => {\n if (o.orgId === org.orgId) {\n setOpen(false);\n return;\n }\n try {\n await switchOrg.mutateAsync(o.orgId);\n setOpen(false);\n } catch {\n /* error surfaced via switchOrg.error */\n }\n }}\n disabled={switchOrg.isPending}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconBuilding className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-left\">{o.orgName}</span>\n {o.orgId === org.orgId && (\n <IconCheck className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n )}\n </button>\n ))}\n\n {pendingInvitations.length > 0 && (\n <>\n {orgs.length > 0 && <div className=\"my-1 h-px bg-border\" />}\n <div className={SECTION_LABEL_CLASS}>Invitations</div>\n {pendingInvitations.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center gap-2 px-2.5 py-1.5 text-xs\"\n >\n <IconBuilding className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-foreground\">\n {inv.orgName}\n </span>\n <button\n type=\"button\"\n onClick={async () => {\n try {\n await acceptInvitation.mutateAsync(inv.id);\n setOpen(false);\n } catch {\n /* error surfaced via acceptInvitation.error */\n }\n }}\n disabled={acceptInvitation.isPending}\n className=\"rounded px-1.5 py-0.5 text-[11px] font-medium text-primary hover:bg-primary/10 disabled:opacity-50 cursor-pointer\"\n >\n {acceptInvitation.isPending ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Join\"\n )}\n </button>\n </div>\n ))}\n </>\n )}\n\n {domainMatches.length > 0 && (\n <>\n {(orgs.length > 0 || pendingInvitations.length > 0) && (\n <div className=\"my-1 h-px bg-border\" />\n )}\n <div className={SECTION_LABEL_CLASS}>Join your team</div>\n {domainMatches.map((match) => {\n const isJoining =\n joinByDomain.isPending && joiningOrgId === match.orgId;\n return (\n <div\n key={match.orgId}\n className=\"flex items-center gap-2 px-2.5 py-1.5 text-xs\"\n >\n <IconBuilding className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-foreground\">\n {match.orgName}\n </span>\n <button\n type=\"button\"\n onClick={async () => {\n setJoiningOrgId(match.orgId);\n try {\n await joinByDomain.mutateAsync(match.orgId);\n setOpen(false);\n } catch {\n /* error surfaced via joinByDomain.error */\n } finally {\n setJoiningOrgId(null);\n }\n }}\n disabled={joinByDomain.isPending}\n className=\"rounded px-1.5 py-0.5 text-[11px] font-medium text-primary hover:bg-primary/10 disabled:opacity-50 cursor-pointer\"\n >\n {isJoining ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Join\"\n )}\n </button>\n </div>\n );\n })}\n </>\n )}\n\n <div className=\"my-1 h-px bg-border\" />\n {inOrg && (\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:open-settings\", {\n detail: { section: \"workspace-settings\" },\n }),\n );\n navigate(workspaceSettingsPath(settingsPath));\n }}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconSettings className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">Workspace settings</span>\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setMode(\"create\")}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconPlus className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">Create organization</span>\n </button>\n {canInvite && (\n <button\n type=\"button\"\n onClick={() => setMode(\"invite\")}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconUserPlus className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">Invite member</span>\n </button>\n )}\n\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n onClick={handleSignOut}\n disabled={signingOut}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n {signingOut ? (\n <IconLoader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground\" />\n ) : (\n <IconLogout className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"flex-1 text-left\">\n Sign out\n {org.email ? (\n <span className=\"ml-1 text-muted-foreground\">\n ({org.email})\n </span>\n ) : null}\n </span>\n </button>\n\n {(switchOrg.error ||\n acceptInvitation.error ||\n joinByDomain.error) && (\n <div className=\"px-2.5 pt-1 text-[11px] text-destructive\">\n {\n (\n (switchOrg.error ||\n acceptInvitation.error ||\n joinByDomain.error) as Error\n ).message\n }\n </div>\n )}\n </>\n )}\n\n {mode === \"create\" && (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const name = newName.trim();\n if (!name) return;\n try {\n await createOrg.mutateAsync(name);\n setOpen(false);\n } catch {\n /* error surfaced via createOrg.error */\n }\n }}\n className=\"px-2 py-1.5\"\n >\n <div className=\"px-0.5 pb-1 text-[10px] uppercase tracking-wide text-muted-foreground\">\n New organization\n </div>\n <input\n autoFocus\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Organization name\"\n disabled={createOrg.isPending}\n className=\"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n />\n {createOrg.error && (\n <div className=\"pt-1 text-[11px] text-destructive\">\n {(createOrg.error as Error).message}\n </div>\n )}\n <div className=\"flex items-center gap-1.5 pt-1.5\">\n <button\n type=\"button\"\n onClick={() => setMode(\"list\")}\n disabled={createOrg.isPending}\n className=\"flex-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50 cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={createOrg.isPending || !newName.trim()}\n className=\"flex-1 rounded-md bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50 cursor-pointer\"\n >\n {createOrg.isPending ? (\n <IconLoader2 className=\"mx-auto h-3 w-3 animate-spin\" />\n ) : (\n \"Create\"\n )}\n </button>\n </div>\n </form>\n )}\n\n {mode === \"invite\" && (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const email = inviteEmail.trim();\n if (!email) return;\n try {\n await inviteMember.mutateAsync(email);\n setInviteEmail(\"\");\n setMode(\"list\");\n } catch {\n /* error surfaced via inviteMember.error */\n }\n }}\n className=\"px-2 py-1.5\"\n >\n <div className=\"px-0.5 pb-1 text-[10px] uppercase tracking-wide text-muted-foreground\">\n Invite to {org.orgName}\n </div>\n <input\n autoFocus\n type=\"email\"\n value={inviteEmail}\n onChange={(e) => setInviteEmail(e.target.value)}\n placeholder=\"teammate@company.com\"\n disabled={inviteMember.isPending}\n className=\"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n />\n {inviteMember.error && (\n <div className=\"pt-1 text-[11px] text-destructive\">\n {(inviteMember.error as Error).message}\n </div>\n )}\n <div className=\"flex items-center gap-1.5 pt-1.5\">\n <button\n type=\"button\"\n onClick={() => setMode(\"list\")}\n disabled={inviteMember.isPending}\n className=\"flex-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50 cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={inviteMember.isPending || !inviteEmail.trim()}\n className=\"flex-1 rounded-md bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50 cursor-pointer\"\n >\n {inviteMember.isPending ? (\n <IconLoader2 className=\"mx-auto h-3 w-3 animate-spin\" />\n ) : (\n \"Send invite\"\n )}\n </button>\n </div>\n </form>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}
1
+ {"version":3,"file":"OrgSwitcher.js","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport {\n IconApps,\n IconArrowUpRight,\n IconBuilding,\n IconCheck,\n IconChevronRight,\n IconLoader2,\n IconLogout,\n IconMessageCircle,\n IconPlus,\n IconSelector,\n IconSettings,\n IconUser,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport {\n useOrg,\n useSwitchOrg,\n useCreateOrg,\n useInviteMember,\n useAcceptInvitation,\n useJoinByDomain,\n} from \"./hooks.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n ORG_SWITCHER_MAX_APP_LINKS,\n useOrgSwitcherAppLinks,\n visibleOrgAppLinks,\n type OrgSwitcherAppLink,\n} from \"./workspace-app-links.js\";\n\nexport interface OrgSwitcherProps {\n className?: string;\n /** Hide entirely when the user only belongs to one org. Default: false. */\n hideWhenSingle?: boolean;\n /** Keep the switcher's button height reserved while org state is loading. */\n reserveSpace?: boolean;\n /**\n * Path to navigate to when the user clicks \"Organization settings\".\n * Defaults to `/team`, the standard organization-management route. Templates\n * with an established org surface can pass their own path; pass `null` to\n * only open the in-sidebar settings panel.\n */\n settingsPath?: string | null;\n}\n\nfunction personalLabelFromEmail(email: string | null | undefined): string {\n if (!email) return \"Personal\";\n const local = email.split(\"@\")[0] ?? email;\n const cleaned = local.replace(/[._-]+/g, \" \").trim();\n if (!cleaned) return \"Personal\";\n return cleaned\n .split(\" \")\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\ntype Mode = \"list\" | \"create\" | \"invite\";\n\nconst POPOVER_CONTENT_CLASS =\n \"z-50 min-w-[14rem] rounded-md border border-border bg-popover py-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\";\n\nconst ITEM_CLASS =\n \"flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-foreground hover:bg-accent focus-visible:bg-accent focus:outline-none disabled:opacity-50 disabled:pointer-events-none\";\n\nconst SECTION_LABEL_CLASS =\n \"px-2.5 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground\";\n\nconst APP_SUBMENU_CONTENT_CLASS =\n \"z-50 w-72 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\";\n\nconst DEFAULT_ORGANIZATION_SETTINGS_PATH = \"/team\";\n\nfunction organizationSettingsPath(path: string): string {\n return `${path.replace(/#.*$/, \"\")}#workspace-settings`;\n}\n\nfunction AppMenuLink({\n app,\n onNavigate,\n}: {\n app: OrgSwitcherAppLink;\n onNavigate: () => void;\n}) {\n const Icon = app.isDispatch ? IconMessageCircle : IconApps;\n return (\n <a\n href={app.href}\n onClick={onNavigate}\n className={`flex items-center gap-2 rounded-sm px-2.5 py-2 text-xs outline-none hover:bg-accent focus:bg-accent ${\n app.isDispatch ? \"border border-primary/20 bg-primary/5\" : \"\"\n }`}\n >\n <span\n className={`flex h-7 w-7 shrink-0 items-center justify-center rounded-md ${\n app.isDispatch\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground\"\n }`}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium text-foreground\">\n {app.name}\n </span>\n <span className=\"block truncate text-[11px] text-muted-foreground\">\n {app.isDispatch\n ? \"Main hub\"\n : app.status === \"pending\"\n ? \"Building\"\n : \"Open app\"}\n </span>\n </span>\n <IconArrowUpRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </a>\n );\n}\n\nfunction AppsSubmenu({\n apps,\n isWorkspace,\n isLoading,\n dispatchHref,\n dispatchAllAppsHref,\n onNavigate,\n}: {\n apps: OrgSwitcherAppLink[];\n isWorkspace: boolean;\n isLoading: boolean;\n dispatchHref: string;\n dispatchAllAppsHref: string;\n onNavigate: () => void;\n}) {\n const { links, overflowCount } = visibleOrgAppLinks(apps);\n const visibleDispatchApp = links.find((app) => app.isDispatch);\n const dispatchApp =\n visibleDispatchApp ??\n ({\n id: \"dispatch\",\n name: \"Dispatch\",\n href: dispatchHref,\n isDispatch: true,\n status: \"ready\",\n } satisfies OrgSwitcherAppLink);\n const visibleNonDispatch = links\n .filter((app) => !app.isDispatch)\n .slice(0, visibleDispatchApp ? undefined : ORG_SWITCHER_MAX_APP_LINKS - 1);\n const shownCount = (dispatchApp ? 1 : 0) + visibleNonDispatch.length;\n const remainingCount = Math.max(overflowCount, apps.length - shownCount);\n\n return (\n <PopoverPrimitive.Root>\n <PopoverPrimitive.Trigger asChild>\n <button type=\"button\" className={`${ITEM_CLASS} cursor-pointer`}>\n <IconApps className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">Apps</span>\n <span className=\"text-[11px] text-muted-foreground\">\n {isLoading ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n apps.length\n )}\n </span>\n <IconChevronRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"right\"\n align=\"start\"\n sideOffset={8}\n collisionPadding={12}\n className={APP_SUBMENU_CONTENT_CLASS}\n >\n <div className=\"px-2.5 py-1.5\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">\n {isWorkspace ? \"Workspace apps\" : \"Default apps\"}\n </div>\n <div className=\"mt-0.5 text-[11px] text-muted-foreground\">\n {isWorkspace\n ? \"Dispatch is the workspace hub.\"\n : \"Dispatch is the home base.\"}\n </div>\n </div>\n\n <AppMenuLink app={dispatchApp} onNavigate={onNavigate} />\n\n {visibleNonDispatch.length > 0 && (\n <div className=\"my-1 h-px bg-border\" />\n )}\n {visibleNonDispatch.map((app) => (\n <AppMenuLink key={app.id} app={app} onNavigate={onNavigate} />\n ))}\n\n {remainingCount > 0 && (\n <>\n <div className=\"my-1 h-px bg-border\" />\n <a\n href={dispatchAllAppsHref}\n onClick={onNavigate}\n className=\"flex items-center gap-2 rounded-sm px-2.5 py-1.5 text-xs text-foreground outline-none hover:bg-accent focus:bg-accent\"\n >\n <IconMessageCircle className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1\">\n {`View ${remainingCount} more in Dispatch`}\n </span>\n <IconArrowUpRight className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </a>\n </>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\n/**\n * Compact org switcher button. Shows the active org (or \"Personal\" when the\n * user has none); opens a popover with the user's other orgs, pending\n * invitations, inline forms to create a new org / invite a teammate, and a\n * sign-out item. Renders nothing in dev / no-auth mode.\n */\nexport function OrgSwitcher({\n className,\n hideWhenSingle,\n reserveSpace,\n settingsPath = DEFAULT_ORGANIZATION_SETTINGS_PATH,\n}: OrgSwitcherProps) {\n const { data: org, isLoading } = useOrg();\n const switchOrg = useSwitchOrg();\n const createOrg = useCreateOrg();\n const inviteMember = useInviteMember();\n const acceptInvitation = useAcceptInvitation();\n const joinByDomain = useJoinByDomain();\n const navigate = useNavigate();\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<Mode>(\"list\");\n const [newName, setNewName] = useState(\"\");\n const [inviteEmail, setInviteEmail] = useState(\"\");\n const [signingOut, setSigningOut] = useState(false);\n const [joiningOrgId, setJoiningOrgId] = useState<string | null>(null);\n const appLinks = useOrgSwitcherAppLinks(open);\n\n const handleOpenChange = (next: boolean) => {\n setOpen(next);\n if (!next) {\n setMode(\"list\");\n setNewName(\"\");\n setInviteEmail(\"\");\n }\n };\n\n const handleSignOut = async () => {\n if (signingOut) return;\n setSigningOut(true);\n try {\n await fetch(agentNativePath(\"/_agent-native/auth/logout\"), {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n /* fall through to reload — server may already have cleared the cookie */\n }\n window.location.reload();\n };\n\n if (!org) {\n return reserveSpace && isLoading ? (\n <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />\n ) : null;\n }\n\n const orgs = org.orgs ?? [];\n const pendingInvitations = org.pendingInvitations ?? [];\n const domainMatches = org.domainMatches ?? [];\n const orgCount = orgs.length;\n const hasAny =\n orgCount > 0 || pendingInvitations.length > 0 || domainMatches.length > 0;\n if (!hasAny && !org.email) {\n return reserveSpace ? (\n <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />\n ) : null;\n }\n if (\n hideWhenSingle &&\n orgCount < 2 &&\n pendingInvitations.length === 0 &&\n domainMatches.length === 0\n ) {\n return reserveSpace ? (\n <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />\n ) : null;\n }\n\n const canInvite =\n !!org.orgId && (org.role === \"owner\" || org.role === \"admin\");\n\n const personalLabel = personalLabelFromEmail(org.email);\n const inOrg = !!org.orgId;\n const buttonLabel = org.orgName ?? \"Personal\";\n const ButtonIcon = inOrg ? IconBuilding : IconUser;\n const organizationSettingsHref = settingsPath\n ? organizationSettingsPath(settingsPath)\n : null;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={`flex w-full items-center gap-2 rounded-md border border-border/50 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring cursor-pointer ${className ?? \"\"}`}\n >\n <ButtonIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1 text-left\">{buttonLabel}</span>\n <IconSelector className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"top\"\n align=\"start\"\n sideOffset={6}\n collisionPadding={12}\n className={POPOVER_CONTENT_CLASS}\n onOpenAutoFocus={(e) => {\n // Don't auto-focus the first item — feels heavy on a switcher.\n if (mode === \"list\") e.preventDefault();\n }}\n >\n {mode === \"list\" && (\n <>\n {!inOrg && (\n <div\n className=\"flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-muted-foreground\"\n aria-disabled=\"true\"\n >\n <IconUser className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1 text-left\">\n Personal ({personalLabel})\n </span>\n </div>\n )}\n {orgs.length > 0 && (\n <div className={SECTION_LABEL_CLASS}>Organizations</div>\n )}\n {orgs.map((o) => (\n <button\n key={o.orgId}\n type=\"button\"\n onClick={async () => {\n if (o.orgId === org.orgId) {\n setOpen(false);\n return;\n }\n try {\n await switchOrg.mutateAsync(o.orgId);\n setOpen(false);\n } catch {\n /* error surfaced via switchOrg.error */\n }\n }}\n disabled={switchOrg.isPending}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconBuilding className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-left\">{o.orgName}</span>\n {o.orgId === org.orgId && (\n <IconCheck className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n )}\n </button>\n ))}\n\n {pendingInvitations.length > 0 && (\n <>\n {orgs.length > 0 && <div className=\"my-1 h-px bg-border\" />}\n <div className={SECTION_LABEL_CLASS}>Invitations</div>\n {pendingInvitations.map((inv) => (\n <div\n key={inv.id}\n className=\"flex items-center gap-2 px-2.5 py-1.5 text-xs\"\n >\n <IconBuilding className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-foreground\">\n {inv.orgName}\n </span>\n <button\n type=\"button\"\n onClick={async () => {\n try {\n await acceptInvitation.mutateAsync(inv.id);\n setOpen(false);\n } catch {\n /* error surfaced via acceptInvitation.error */\n }\n }}\n disabled={acceptInvitation.isPending}\n className=\"rounded px-1.5 py-0.5 text-[11px] font-medium text-primary hover:bg-primary/10 disabled:opacity-50 cursor-pointer\"\n >\n {acceptInvitation.isPending ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Join\"\n )}\n </button>\n </div>\n ))}\n </>\n )}\n\n {domainMatches.length > 0 && (\n <>\n {(orgs.length > 0 || pendingInvitations.length > 0) && (\n <div className=\"my-1 h-px bg-border\" />\n )}\n <div className={SECTION_LABEL_CLASS}>Join your team</div>\n {domainMatches.map((match) => {\n const isJoining =\n joinByDomain.isPending && joiningOrgId === match.orgId;\n return (\n <div\n key={match.orgId}\n className=\"flex items-center gap-2 px-2.5 py-1.5 text-xs\"\n >\n <IconBuilding className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-foreground\">\n {match.orgName}\n </span>\n <button\n type=\"button\"\n onClick={async () => {\n setJoiningOrgId(match.orgId);\n try {\n await joinByDomain.mutateAsync(match.orgId);\n setOpen(false);\n } catch {\n /* error surfaced via joinByDomain.error */\n } finally {\n setJoiningOrgId(null);\n }\n }}\n disabled={joinByDomain.isPending}\n className=\"rounded px-1.5 py-0.5 text-[11px] font-medium text-primary hover:bg-primary/10 disabled:opacity-50 cursor-pointer\"\n >\n {isJoining ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Join\"\n )}\n </button>\n </div>\n );\n })}\n </>\n )}\n\n <div className=\"my-1 h-px bg-border\" />\n <AppsSubmenu\n apps={appLinks.apps}\n isWorkspace={appLinks.isWorkspace}\n isLoading={appLinks.isLoading}\n dispatchHref={appLinks.dispatchHref}\n dispatchAllAppsHref={appLinks.dispatchAllAppsHref}\n onNavigate={() => setOpen(false)}\n />\n {inOrg && (\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n window.dispatchEvent(new CustomEvent(\"agent-panel:open\"));\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:open-settings\", {\n detail: { section: \"workspace-settings\" },\n }),\n );\n if (organizationSettingsHref) {\n navigate(organizationSettingsHref);\n }\n }}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconSettings className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">\n Organization settings\n </span>\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n // Clear any leftover input from a prior session — otherwise\n // the create form re-opens prefilled with the just-created\n // org's name and looks like a create dialog for the new org.\n setNewName(\"\");\n setMode(\"create\");\n }}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconPlus className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">Create organization</span>\n </button>\n {canInvite && (\n <button\n type=\"button\"\n onClick={() => {\n setInviteEmail(\"\");\n setMode(\"invite\");\n }}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n <IconUserPlus className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"flex-1 text-left\">Invite member</span>\n </button>\n )}\n\n <div className=\"my-1 h-px bg-border\" />\n <button\n type=\"button\"\n onClick={handleSignOut}\n disabled={signingOut}\n className={`${ITEM_CLASS} cursor-pointer`}\n >\n {signingOut ? (\n <IconLoader2 className=\"h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground\" />\n ) : (\n <IconLogout className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n )}\n <span className=\"flex-1 text-left\">\n Sign out\n {org.email ? (\n <span className=\"ml-1 text-muted-foreground\">\n ({org.email})\n </span>\n ) : null}\n </span>\n </button>\n\n {(switchOrg.error ||\n acceptInvitation.error ||\n joinByDomain.error) && (\n <div className=\"px-2.5 pt-1 text-[11px] text-destructive\">\n {\n (\n (switchOrg.error ||\n acceptInvitation.error ||\n joinByDomain.error) as Error\n ).message\n }\n </div>\n )}\n </>\n )}\n\n {mode === \"create\" && (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const name = newName.trim();\n if (!name) return;\n try {\n await createOrg.mutateAsync(name);\n handleOpenChange(false);\n } catch {\n /* error surfaced via createOrg.error */\n }\n }}\n className=\"px-2 py-1.5\"\n >\n <div className=\"px-0.5 pb-1 text-[10px] uppercase tracking-wide text-muted-foreground\">\n New organization\n </div>\n <input\n autoFocus\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Organization name\"\n disabled={createOrg.isPending}\n className=\"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n />\n {createOrg.error && (\n <div className=\"pt-1 text-[11px] text-destructive\">\n {(createOrg.error as Error).message}\n </div>\n )}\n <div className=\"flex items-center gap-1.5 pt-1.5\">\n <button\n type=\"button\"\n onClick={() => setMode(\"list\")}\n disabled={createOrg.isPending}\n className=\"flex-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50 cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={createOrg.isPending || !newName.trim()}\n className=\"flex flex-1 items-center justify-center rounded-md bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50 cursor-pointer\"\n >\n {createOrg.isPending ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Create\"\n )}\n </button>\n </div>\n </form>\n )}\n\n {mode === \"invite\" && (\n <form\n onSubmit={async (e) => {\n e.preventDefault();\n const email = inviteEmail.trim();\n if (!email) return;\n try {\n await inviteMember.mutateAsync(email);\n setInviteEmail(\"\");\n setMode(\"list\");\n } catch {\n /* error surfaced via inviteMember.error */\n }\n }}\n className=\"px-2 py-1.5\"\n >\n <div className=\"px-0.5 pb-1 text-[10px] uppercase tracking-wide text-muted-foreground\">\n Invite to {org.orgName}\n </div>\n <input\n autoFocus\n type=\"email\"\n value={inviteEmail}\n onChange={(e) => setInviteEmail(e.target.value)}\n placeholder=\"teammate@company.com\"\n disabled={inviteMember.isPending}\n className=\"w-full rounded-md border border-input bg-background px-2 py-1.5 text-xs outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n />\n {inviteMember.error && (\n <div className=\"pt-1 text-[11px] text-destructive\">\n {(inviteMember.error as Error).message}\n </div>\n )}\n <div className=\"flex items-center gap-1.5 pt-1.5\">\n <button\n type=\"button\"\n onClick={() => setMode(\"list\")}\n disabled={inviteMember.isPending}\n className=\"flex-1 rounded-md px-2 py-1 text-xs text-muted-foreground hover:bg-accent disabled:opacity-50 cursor-pointer\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={inviteMember.isPending || !inviteEmail.trim()}\n className=\"flex flex-1 items-center justify-center rounded-md bg-primary px-2 py-1 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50 cursor-pointer\"\n >\n {inviteMember.isPending ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : (\n \"Send invite\"\n )}\n </button>\n </div>\n </form>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/client/org/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAoC5B,wBAAgB,MAAM,mEAMrB;AAED,wBAAgB,aAAa;aACA,SAAS,EAAE;UAKvC;AAED,wBAAgB,iBAAiB;iBACA,oBAAoB,EAAE;UAKtD;AAmBD,wBAAgB,YAAY,mFAe3B;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,eAAe,gGAoB9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,UAAU,CAAC;QACjB,MAAM,EAAE,SAAS,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,sGAoBnC;AAED,wBAAgB,mBAAmB;WAGtB,MAAM;UAAQ,UAAU;;WAExB,MAAM;UAAQ,UAAU;YAWpC;AAED,wBAAgB,mBAAmB,mFAclC;AAED,wBAAgB,eAAe,mFAW9B;AAED,wBAAgB,YAAY,mFAY3B;AAED,wBAAgB,YAAY,mFAa3B;AAED,wBAAgB,eAAe,mFAY9B;AAED,wBAAgB,eAAe,mFAY9B;AAED,wBAAgB,eAAe;eAGd,MAAM;oBAAkB,MAAM,GAAG,IAAI;2BAarD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE,OAAO,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB;iBAIb,MAAM;YAWxB"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/client/org/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAoC5B,wBAAgB,MAAM,mEAMrB;AAED,wBAAgB,aAAa;aAIA,SAAS,EAAE;UAKvC;AAED,wBAAgB,iBAAiB;iBAEA,oBAAoB,EAAE;UAKtD;AAmBD,wBAAgB,YAAY,mFAe3B;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,eAAe,gGAoB9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,UAAU,CAAC;QACjB,MAAM,EAAE,SAAS,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,sGAoBnC;AAED,wBAAgB,mBAAmB;WAGtB,MAAM;UAAQ,UAAU;;WAExB,MAAM;UAAQ,UAAU;YAWpC;AAED,wBAAgB,mBAAmB,mFAclC;AAED,wBAAgB,eAAe,mFAW9B;AAED,wBAAgB,YAAY,mFAY3B;AAED,wBAAgB,YAAY,mFAa3B;AAED,wBAAgB,eAAe,mFAY9B;AAED,wBAAgB,eAAe,mFAY9B;AAED,wBAAgB,eAAe;eAGd,MAAM;oBAAkB,MAAM,GAAG,IAAI;2BAarD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE,OAAO,CAAC;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB;iBAIb,MAAM;YAWxB"}
@@ -37,15 +37,19 @@ export function useOrg() {
37
37
  });
38
38
  }
39
39
  export function useOrgMembers() {
40
+ // Scope the cache by active orgId so switching or creating an org forces a
41
+ // fresh fetch rather than briefly showing the previous org's members.
42
+ const { data: org } = useOrg();
40
43
  return useQuery({
41
- queryKey: ["org-members"],
44
+ queryKey: ["org-members", org?.orgId ?? null],
42
45
  queryFn: () => apiFetch(`${ORG_BASE}/members`),
43
46
  staleTime: 30_000,
44
47
  });
45
48
  }
46
49
  export function useOrgInvitations() {
50
+ const { data: org } = useOrg();
47
51
  return useQuery({
48
- queryKey: ["org-invitations"],
52
+ queryKey: ["org-invitations", org?.orgId ?? null],
49
53
  queryFn: () => apiFetch(`${ORG_BASE}/invitations`),
50
54
  staleTime: 30_000,
51
55
  });
@@ -74,10 +78,10 @@ export function useCreateOrg() {
74
78
  body: JSON.stringify({ name }),
75
79
  }),
76
80
  onSuccess: async () => {
77
- await Promise.all([
78
- qc.invalidateQueries({ queryKey: ["org-me"] }),
79
- qc.invalidateQueries({ queryKey: ["org-members"] }),
80
- ]);
81
+ // Creating an org also switches the user into it server-side, so every
82
+ // org-scoped query (members, invitations, and template-level data) is
83
+ // now stale. Match the broad invalidation that useSwitchOrg already does.
84
+ await qc.invalidateQueries();
81
85
  },
82
86
  });
83
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/client/org/hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n OrgInfo,\n OrgMember,\n OrgPendingInvitation,\n} from \"../../org/types.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nconst ORG_BASE = agentNativePath(\"/_agent-native/org\");\n\nasync function apiFetch(path: string, init?: RequestInit) {\n const res = await fetch(path, {\n ...init,\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...init?.headers,\n },\n });\n if (!res.ok) {\n // Prefer a JSON `error` / `message` field when the server returns one,\n // and only fall back to the raw body for plaintext responses. Avoids\n // surfacing `{\"error\":\"...\"}` as the user-visible message.\n const text = await res.text().catch(() => \"\");\n let message: string = res.statusText;\n if (text) {\n try {\n const parsed = JSON.parse(text) as {\n error?: string;\n message?: string;\n };\n message = parsed.error ?? parsed.message ?? text;\n } catch {\n message = text;\n }\n }\n throw new Error(message);\n }\n return res.json();\n}\n\nexport function useOrg() {\n return useQuery<OrgInfo>({\n queryKey: [\"org-me\"],\n queryFn: () => apiFetch(`${ORG_BASE}/me`),\n staleTime: 30_000,\n });\n}\n\nexport function useOrgMembers() {\n return useQuery<{ members: OrgMember[] }>({\n queryKey: [\"org-members\"],\n queryFn: () => apiFetch(`${ORG_BASE}/members`),\n staleTime: 30_000,\n });\n}\n\nexport function useOrgInvitations() {\n return useQuery<{ invitations: OrgPendingInvitation[] }>({\n queryKey: [\"org-invitations\"],\n queryFn: () => apiFetch(`${ORG_BASE}/invitations`),\n staleTime: 30_000,\n });\n}\n\n// NOTE: the onSuccess handlers below `await invalidateQueries`. In\n// TanStack Query v5, invalidateQueries:\n// 1. Marks every matching query as stale, so the next mount of an\n// INACTIVE query (e.g. the org-members table on a settings page\n// the user hasn't visited yet) refetches immediately instead of\n// serving 30-second-stale cached data.\n// 2. Triggers a refetch of every ACTIVE query that matches.\n// 3. Returns a promise that resolves once those refetches settle.\n//\n// `await`ing therefore keeps `mutation.isPending` true through the\n// full read-after-write window — closing the create-org / accept-\n// invite race where a button could re-enable mid-refetch. We\n// previously tried refetchQueries here for \"unambiguous semantics\",\n// but that variant doesn't mark inactive queries stale, leaving them\n// to serve stale data on next mount. invalidateQueries is the right\n// primitive — it just needed an `await`.\n\nexport function useCreateOrg() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (name: string) =>\n apiFetch(ORG_BASE, {\n method: \"POST\",\n body: JSON.stringify({ name }),\n }),\n onSuccess: async () => {\n await Promise.all([\n qc.invalidateQueries({ queryKey: [\"org-me\"] }),\n qc.invalidateQueries({ queryKey: [\"org-members\"] }),\n ]);\n },\n });\n}\n\nexport type InviteRole = \"admin\" | \"member\";\n\nexport interface InviteVars {\n email: string;\n role?: InviteRole;\n}\n\nexport function useInviteMember() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (vars: string | InviteVars) => {\n const body: { email: string; role: InviteRole } =\n typeof vars === \"string\"\n ? { email: vars, role: \"member\" }\n : { email: vars.email, role: vars.role ?? \"member\" };\n return apiFetch(`${ORG_BASE}/invitations`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n },\n onSuccess: async () => {\n await Promise.all([\n qc.invalidateQueries({ queryKey: [\"org-members\"] }),\n qc.invalidateQueries({ queryKey: [\"org-invitations\"] }),\n ]);\n },\n });\n}\n\nexport interface BulkInviteResult {\n succeeded: Array<{\n id: string;\n email: string;\n role: InviteRole;\n status: \"pending\";\n emailSent: boolean;\n emailError?: string;\n }>;\n failed: Array<{ email: string; error: string }>;\n total: number;\n}\n\nexport function useBulkInviteMembers() {\n const qc = useQueryClient();\n return useMutation<BulkInviteResult, Error, InviteVars[]>({\n mutationFn: (invites) =>\n apiFetch(`${ORG_BASE}/invitations`, {\n method: \"POST\",\n body: JSON.stringify({\n invites: invites.map((i) => ({\n email: i.email,\n role: i.role ?? \"member\",\n })),\n }),\n }),\n onSuccess: async () => {\n await Promise.all([\n qc.invalidateQueries({ queryKey: [\"org-members\"] }),\n qc.invalidateQueries({ queryKey: [\"org-invitations\"] }),\n ]);\n },\n });\n}\n\nexport function useChangeMemberRole() {\n const qc = useQueryClient();\n return useMutation<\n { email: string; role: InviteRole },\n Error,\n { email: string; role: InviteRole }\n >({\n mutationFn: ({ email, role }) =>\n apiFetch(`${ORG_BASE}/members/${encodeURIComponent(email)}/role`, {\n method: \"PUT\",\n body: JSON.stringify({ role }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-members\"] });\n },\n });\n}\n\nexport function useAcceptInvitation() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (invitationId: string) =>\n apiFetch(`${ORG_BASE}/invitations/${invitationId}/accept`, {\n method: \"POST\",\n }),\n onSuccess: async () => {\n // Joining/switching orgs changes all org-scoped data — invalidate\n // every cached query (no key filter) so each one refetches or is\n // marked stale for the next mount.\n await qc.invalidateQueries();\n },\n });\n}\n\nexport function useRemoveMember() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (email: string) =>\n apiFetch(`${ORG_BASE}/members/${encodeURIComponent(email)}`, {\n method: \"DELETE\",\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-members\"] });\n },\n });\n}\n\nexport function useUpdateOrg() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (name: string) =>\n apiFetch(ORG_BASE, {\n method: \"PATCH\",\n body: JSON.stringify({ name }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-me\"] });\n },\n });\n}\n\nexport function useSwitchOrg() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (orgId: string | null) =>\n apiFetch(`${ORG_BASE}/switch`, {\n method: \"PUT\",\n body: JSON.stringify({ orgId }),\n }),\n onSuccess: async () => {\n // Switching org changes everything scoped to AGENT_ORG_ID.\n await qc.invalidateQueries();\n },\n });\n}\n\nexport function useJoinByDomain() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (orgId: string) =>\n apiFetch(`${ORG_BASE}/join-by-domain`, {\n method: \"POST\",\n body: JSON.stringify({ orgId }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries();\n },\n });\n}\n\nexport function useSetOrgDomain() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (domain: string | null) =>\n apiFetch(`${ORG_BASE}/domain`, {\n method: \"PUT\",\n body: JSON.stringify({ domain }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-me\"] });\n },\n });\n}\n\nexport function useSetA2ASecret() {\n const qc = useQueryClient();\n return useMutation<\n { a2aSecret: string; previousSecret: string | null },\n Error,\n string | undefined\n >({\n mutationFn: (secret?: string) =>\n apiFetch(`${ORG_BASE}/a2a-secret`, {\n method: \"PUT\",\n body: JSON.stringify({ secret }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-me\"] });\n },\n });\n}\n\nexport interface SyncA2ASecretResult {\n total: number;\n succeeded: number;\n failed: number;\n results: Array<{\n id: string;\n name: string;\n url: string;\n ok: boolean;\n status?: number;\n error?: string;\n }>;\n}\n\n/**\n * Push the org's A2A secret to every connected app so cross-app delegation\n * works without manual copy/paste. Optionally pass a `signSecret` to sign\n * the outbound JWTs with a different secret (used by the regenerate-then-\n * sync flow where the new secret is in DB but peers still hold the old\n * one).\n */\nexport function useSyncA2ASecret() {\n return useMutation<\n SyncA2ASecretResult,\n Error,\n { signSecret?: string } | void\n >({\n mutationFn: (vars) =>\n apiFetch(`${ORG_BASE}/a2a-secret/sync`, {\n method: \"POST\",\n body: JSON.stringify({\n signSecret:\n vars && \"signSecret\" in vars ? vars.signSecret : undefined,\n }),\n }),\n });\n}\n"]}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/client/org/hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n OrgInfo,\n OrgMember,\n OrgPendingInvitation,\n} from \"../../org/types.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nconst ORG_BASE = agentNativePath(\"/_agent-native/org\");\n\nasync function apiFetch(path: string, init?: RequestInit) {\n const res = await fetch(path, {\n ...init,\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...init?.headers,\n },\n });\n if (!res.ok) {\n // Prefer a JSON `error` / `message` field when the server returns one,\n // and only fall back to the raw body for plaintext responses. Avoids\n // surfacing `{\"error\":\"...\"}` as the user-visible message.\n const text = await res.text().catch(() => \"\");\n let message: string = res.statusText;\n if (text) {\n try {\n const parsed = JSON.parse(text) as {\n error?: string;\n message?: string;\n };\n message = parsed.error ?? parsed.message ?? text;\n } catch {\n message = text;\n }\n }\n throw new Error(message);\n }\n return res.json();\n}\n\nexport function useOrg() {\n return useQuery<OrgInfo>({\n queryKey: [\"org-me\"],\n queryFn: () => apiFetch(`${ORG_BASE}/me`),\n staleTime: 30_000,\n });\n}\n\nexport function useOrgMembers() {\n // Scope the cache by active orgId so switching or creating an org forces a\n // fresh fetch rather than briefly showing the previous org's members.\n const { data: org } = useOrg();\n return useQuery<{ members: OrgMember[] }>({\n queryKey: [\"org-members\", org?.orgId ?? null],\n queryFn: () => apiFetch(`${ORG_BASE}/members`),\n staleTime: 30_000,\n });\n}\n\nexport function useOrgInvitations() {\n const { data: org } = useOrg();\n return useQuery<{ invitations: OrgPendingInvitation[] }>({\n queryKey: [\"org-invitations\", org?.orgId ?? null],\n queryFn: () => apiFetch(`${ORG_BASE}/invitations`),\n staleTime: 30_000,\n });\n}\n\n// NOTE: the onSuccess handlers below `await invalidateQueries`. In\n// TanStack Query v5, invalidateQueries:\n// 1. Marks every matching query as stale, so the next mount of an\n// INACTIVE query (e.g. the org-members table on a settings page\n// the user hasn't visited yet) refetches immediately instead of\n// serving 30-second-stale cached data.\n// 2. Triggers a refetch of every ACTIVE query that matches.\n// 3. Returns a promise that resolves once those refetches settle.\n//\n// `await`ing therefore keeps `mutation.isPending` true through the\n// full read-after-write window — closing the create-org / accept-\n// invite race where a button could re-enable mid-refetch. We\n// previously tried refetchQueries here for \"unambiguous semantics\",\n// but that variant doesn't mark inactive queries stale, leaving them\n// to serve stale data on next mount. invalidateQueries is the right\n// primitive — it just needed an `await`.\n\nexport function useCreateOrg() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (name: string) =>\n apiFetch(ORG_BASE, {\n method: \"POST\",\n body: JSON.stringify({ name }),\n }),\n onSuccess: async () => {\n // Creating an org also switches the user into it server-side, so every\n // org-scoped query (members, invitations, and template-level data) is\n // now stale. Match the broad invalidation that useSwitchOrg already does.\n await qc.invalidateQueries();\n },\n });\n}\n\nexport type InviteRole = \"admin\" | \"member\";\n\nexport interface InviteVars {\n email: string;\n role?: InviteRole;\n}\n\nexport function useInviteMember() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (vars: string | InviteVars) => {\n const body: { email: string; role: InviteRole } =\n typeof vars === \"string\"\n ? { email: vars, role: \"member\" }\n : { email: vars.email, role: vars.role ?? \"member\" };\n return apiFetch(`${ORG_BASE}/invitations`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n },\n onSuccess: async () => {\n await Promise.all([\n qc.invalidateQueries({ queryKey: [\"org-members\"] }),\n qc.invalidateQueries({ queryKey: [\"org-invitations\"] }),\n ]);\n },\n });\n}\n\nexport interface BulkInviteResult {\n succeeded: Array<{\n id: string;\n email: string;\n role: InviteRole;\n status: \"pending\";\n emailSent: boolean;\n emailError?: string;\n }>;\n failed: Array<{ email: string; error: string }>;\n total: number;\n}\n\nexport function useBulkInviteMembers() {\n const qc = useQueryClient();\n return useMutation<BulkInviteResult, Error, InviteVars[]>({\n mutationFn: (invites) =>\n apiFetch(`${ORG_BASE}/invitations`, {\n method: \"POST\",\n body: JSON.stringify({\n invites: invites.map((i) => ({\n email: i.email,\n role: i.role ?? \"member\",\n })),\n }),\n }),\n onSuccess: async () => {\n await Promise.all([\n qc.invalidateQueries({ queryKey: [\"org-members\"] }),\n qc.invalidateQueries({ queryKey: [\"org-invitations\"] }),\n ]);\n },\n });\n}\n\nexport function useChangeMemberRole() {\n const qc = useQueryClient();\n return useMutation<\n { email: string; role: InviteRole },\n Error,\n { email: string; role: InviteRole }\n >({\n mutationFn: ({ email, role }) =>\n apiFetch(`${ORG_BASE}/members/${encodeURIComponent(email)}/role`, {\n method: \"PUT\",\n body: JSON.stringify({ role }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-members\"] });\n },\n });\n}\n\nexport function useAcceptInvitation() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (invitationId: string) =>\n apiFetch(`${ORG_BASE}/invitations/${invitationId}/accept`, {\n method: \"POST\",\n }),\n onSuccess: async () => {\n // Joining/switching orgs changes all org-scoped data — invalidate\n // every cached query (no key filter) so each one refetches or is\n // marked stale for the next mount.\n await qc.invalidateQueries();\n },\n });\n}\n\nexport function useRemoveMember() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (email: string) =>\n apiFetch(`${ORG_BASE}/members/${encodeURIComponent(email)}`, {\n method: \"DELETE\",\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-members\"] });\n },\n });\n}\n\nexport function useUpdateOrg() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (name: string) =>\n apiFetch(ORG_BASE, {\n method: \"PATCH\",\n body: JSON.stringify({ name }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-me\"] });\n },\n });\n}\n\nexport function useSwitchOrg() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (orgId: string | null) =>\n apiFetch(`${ORG_BASE}/switch`, {\n method: \"PUT\",\n body: JSON.stringify({ orgId }),\n }),\n onSuccess: async () => {\n // Switching org changes everything scoped to AGENT_ORG_ID.\n await qc.invalidateQueries();\n },\n });\n}\n\nexport function useJoinByDomain() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (orgId: string) =>\n apiFetch(`${ORG_BASE}/join-by-domain`, {\n method: \"POST\",\n body: JSON.stringify({ orgId }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries();\n },\n });\n}\n\nexport function useSetOrgDomain() {\n const qc = useQueryClient();\n return useMutation({\n mutationFn: (domain: string | null) =>\n apiFetch(`${ORG_BASE}/domain`, {\n method: \"PUT\",\n body: JSON.stringify({ domain }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-me\"] });\n },\n });\n}\n\nexport function useSetA2ASecret() {\n const qc = useQueryClient();\n return useMutation<\n { a2aSecret: string; previousSecret: string | null },\n Error,\n string | undefined\n >({\n mutationFn: (secret?: string) =>\n apiFetch(`${ORG_BASE}/a2a-secret`, {\n method: \"PUT\",\n body: JSON.stringify({ secret }),\n }),\n onSuccess: async () => {\n await qc.invalidateQueries({ queryKey: [\"org-me\"] });\n },\n });\n}\n\nexport interface SyncA2ASecretResult {\n total: number;\n succeeded: number;\n failed: number;\n results: Array<{\n id: string;\n name: string;\n url: string;\n ok: boolean;\n status?: number;\n error?: string;\n }>;\n}\n\n/**\n * Push the org's A2A secret to every connected app so cross-app delegation\n * works without manual copy/paste. Optionally pass a `signSecret` to sign\n * the outbound JWTs with a different secret (used by the regenerate-then-\n * sync flow where the new secret is in DB but peers still hold the old\n * one).\n */\nexport function useSyncA2ASecret() {\n return useMutation<\n SyncA2ASecretResult,\n Error,\n { signSecret?: string } | void\n >({\n mutationFn: (vars) =>\n apiFetch(`${ORG_BASE}/a2a-secret/sync`, {\n method: \"POST\",\n body: JSON.stringify({\n signSecret:\n vars && \"signSecret\" in vars ? vars.signSecret : undefined,\n }),\n }),\n });\n}\n"]}
@@ -0,0 +1,31 @@
1
+ export interface OrgSwitcherAppLink {
2
+ id: string;
3
+ name: string;
4
+ href: string;
5
+ description?: string;
6
+ isDispatch: boolean;
7
+ status?: "ready" | "pending";
8
+ }
9
+ export interface VisibleOrgAppLinks {
10
+ links: OrgSwitcherAppLink[];
11
+ overflowCount: number;
12
+ }
13
+ type RuntimeEnv = Record<string, string | boolean | undefined>;
14
+ export declare const ORG_SWITCHER_MAX_APP_LINKS = 9;
15
+ export declare function parseWorkspaceAppLinks(payload: unknown, env?: RuntimeEnv): OrgSwitcherAppLink[] | null;
16
+ export declare function parseWorkspaceAppLinksJson(raw: string | undefined, env?: RuntimeEnv): OrgSwitcherAppLink[] | null;
17
+ export declare function defaultOrgAppLinks(): OrgSwitcherAppLink[];
18
+ export declare function isWorkspaceAppEnvironment(env?: RuntimeEnv): boolean;
19
+ export declare function dispatchOverviewHref(apps: OrgSwitcherAppLink[], env?: RuntimeEnv): string;
20
+ export declare function dispatchAppsHref(apps: OrgSwitcherAppLink[], env?: RuntimeEnv): string;
21
+ export declare function visibleOrgAppLinks(apps: OrgSwitcherAppLink[], max?: number): VisibleOrgAppLinks;
22
+ export interface UseOrgSwitcherAppLinksResult {
23
+ apps: OrgSwitcherAppLink[];
24
+ isWorkspace: boolean;
25
+ isLoading: boolean;
26
+ dispatchHref: string;
27
+ dispatchAllAppsHref: string;
28
+ }
29
+ export declare function useOrgSwitcherAppLinks(enabled: boolean): UseOrgSwitcherAppLinksResult;
30
+ export {};
31
+ //# sourceMappingURL=workspace-app-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-app-links.d.ts","sourceRoot":"","sources":["../../../src/client/org/workspace-app-links.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;AAG/D,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAuJ5C,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,UAAyB,GAC7B,kBAAkB,EAAE,GAAG,IAAI,CAa7B;AAED,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,GAAE,UAAyB,GAC7B,kBAAkB,EAAE,GAAG,IAAI,CAO7B;AAED,wBAAgB,kBAAkB,IAAI,kBAAkB,EAAE,CAgBzD;AAED,wBAAgB,yBAAyB,CACvC,GAAG,GAAE,UAAyB,GAC7B,OAAO,CAMT;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,EAAE,EAC1B,GAAG,GAAE,UAAyB,GAC7B,MAAM,CAIR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,kBAAkB,EAAE,EAC1B,GAAG,GAAE,UAAyB,GAC7B,MAAM,CAIR;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,kBAAkB,EAAE,EAC1B,GAAG,SAA6B,GAC/B,kBAAkB,CAMpB;AAyCD,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,GACf,4BAA4B,CAkD9B"}
@@ -0,0 +1,268 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ import { coreTemplates } from "../../cli/templates-meta.js";
3
+ const DISPATCH_ID = "dispatch";
4
+ export const ORG_SWITCHER_MAX_APP_LINKS = 9;
5
+ function runtimeEnv() {
6
+ return (import.meta.env ?? {});
7
+ }
8
+ function envString(env, key) {
9
+ const value = env[key];
10
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
11
+ }
12
+ function titleCase(value) {
13
+ return value
14
+ .split(/[-_\s]+/)
15
+ .filter(Boolean)
16
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
17
+ .join(" ");
18
+ }
19
+ function stripTrailingSlash(value) {
20
+ return value.replace(/\/+$/, "");
21
+ }
22
+ function appendPath(base, path) {
23
+ const segment = path.replace(/^\/+/, "");
24
+ try {
25
+ const url = new URL(base);
26
+ url.pathname = `${stripTrailingSlash(url.pathname)}/${segment}`.replace(/\/+/g, "/");
27
+ return url.toString();
28
+ }
29
+ catch {
30
+ return `${stripTrailingSlash(base)}/${segment}`;
31
+ }
32
+ }
33
+ function dispatchBaseHref(href) {
34
+ try {
35
+ const url = new URL(href);
36
+ url.pathname = url.pathname.replace(/\/(?:overview|apps)\/?$/, "") || "/";
37
+ url.search = "";
38
+ url.hash = "";
39
+ return stripTrailingSlash(url.toString());
40
+ }
41
+ catch {
42
+ return stripTrailingSlash(href.replace(/\/(?:overview|apps)\/?$/, "") || "/dispatch");
43
+ }
44
+ }
45
+ function isAbsoluteUrl(value) {
46
+ try {
47
+ new URL(value);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ function workspaceHref(pathValue, explicitUrl, env) {
55
+ const url = explicitUrl?.trim();
56
+ if (url) {
57
+ if (url.startsWith("/"))
58
+ return workspaceHref(url, null, env);
59
+ if (isAbsoluteUrl(url))
60
+ return url;
61
+ return url;
62
+ }
63
+ const path = pathValue.startsWith("/") ? pathValue : `/${pathValue}`;
64
+ const gatewayUrl = envString(env, "VITE_WORKSPACE_GATEWAY_URL");
65
+ if (!gatewayUrl)
66
+ return path;
67
+ try {
68
+ return new URL(path, `${stripTrailingSlash(gatewayUrl)}/`).toString();
69
+ }
70
+ catch {
71
+ return path;
72
+ }
73
+ }
74
+ function appEntryToLink(entry, env) {
75
+ if (!entry || typeof entry !== "object")
76
+ return null;
77
+ const record = entry;
78
+ const id = typeof record.id === "string" ? record.id.trim() : "";
79
+ if (!id)
80
+ return null;
81
+ const pathValue = typeof record.path === "string" && record.path.trim()
82
+ ? record.path.trim()
83
+ : `/${id}`;
84
+ const explicitUrl = typeof record.url === "string" && record.url.trim()
85
+ ? record.url.trim()
86
+ : typeof record.builderUrl === "string" && record.builderUrl.trim()
87
+ ? record.builderUrl.trim()
88
+ : null;
89
+ const baseHref = workspaceHref(pathValue, explicitUrl, env);
90
+ const isDispatch = typeof record.isDispatch === "boolean"
91
+ ? record.isDispatch
92
+ : id === DISPATCH_ID;
93
+ return {
94
+ id,
95
+ name: typeof record.name === "string" && record.name.trim()
96
+ ? record.name.trim()
97
+ : titleCase(id),
98
+ href: isDispatch ? appendPath(baseHref, "overview") : baseHref,
99
+ description: typeof record.description === "string" && record.description.trim()
100
+ ? record.description.trim()
101
+ : undefined,
102
+ isDispatch,
103
+ status: record.status === "pending" ? "pending" : "ready",
104
+ };
105
+ }
106
+ function sortAppLinks(apps) {
107
+ return [...apps].sort((a, b) => {
108
+ if (a.isDispatch && !b.isDispatch)
109
+ return -1;
110
+ if (!a.isDispatch && b.isDispatch)
111
+ return 1;
112
+ if (a.status === "pending" && b.status !== "pending")
113
+ return 1;
114
+ if (a.status !== "pending" && b.status === "pending")
115
+ return -1;
116
+ return a.name.localeCompare(b.name);
117
+ });
118
+ }
119
+ function dedupeAppLinks(apps) {
120
+ const seen = new Set();
121
+ const deduped = [];
122
+ for (const app of apps) {
123
+ if (seen.has(app.id))
124
+ continue;
125
+ seen.add(app.id);
126
+ deduped.push(app);
127
+ }
128
+ return deduped;
129
+ }
130
+ export function parseWorkspaceAppLinks(payload, env = runtimeEnv()) {
131
+ const rawApps = Array.isArray(payload?.apps)
132
+ ? payload.apps
133
+ : Array.isArray(payload)
134
+ ? payload
135
+ : null;
136
+ if (!rawApps)
137
+ return null;
138
+ const apps = rawApps
139
+ .map((entry) => appEntryToLink(entry, env))
140
+ .filter((app) => Boolean(app));
141
+ return apps.length ? sortAppLinks(dedupeAppLinks(apps)) : null;
142
+ }
143
+ export function parseWorkspaceAppLinksJson(raw, env = runtimeEnv()) {
144
+ if (!raw)
145
+ return null;
146
+ try {
147
+ return parseWorkspaceAppLinks(JSON.parse(raw), env);
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ }
153
+ export function defaultOrgAppLinks() {
154
+ return sortAppLinks(coreTemplates()
155
+ .filter((template) => !template.hidden && template.prodUrl)
156
+ .map((template) => ({
157
+ id: template.name,
158
+ name: template.label,
159
+ href: template.name === DISPATCH_ID
160
+ ? appendPath(template.prodUrl, "overview")
161
+ : template.prodUrl,
162
+ description: template.hint,
163
+ isDispatch: template.name === DISPATCH_ID,
164
+ status: "ready",
165
+ })));
166
+ }
167
+ export function isWorkspaceAppEnvironment(env = runtimeEnv()) {
168
+ return (envString(env, "VITE_AGENT_NATIVE_WORKSPACE") === "1" ||
169
+ Boolean(envString(env, "VITE_WORKSPACE_GATEWAY_URL")) ||
170
+ Boolean(envString(env, "VITE_AGENT_NATIVE_WORKSPACE_APPS_JSON")));
171
+ }
172
+ export function dispatchOverviewHref(apps, env = runtimeEnv()) {
173
+ const dispatch = apps.find((app) => app.isDispatch);
174
+ if (dispatch)
175
+ return appendPath(dispatchBaseHref(dispatch.href), "overview");
176
+ return appendPath(workspaceHref("/dispatch", null, env), "overview");
177
+ }
178
+ export function dispatchAppsHref(apps, env = runtimeEnv()) {
179
+ const dispatch = apps.find((app) => app.isDispatch);
180
+ if (dispatch)
181
+ return appendPath(dispatchBaseHref(dispatch.href), "apps");
182
+ return appendPath(workspaceHref("/dispatch", null, env), "apps");
183
+ }
184
+ export function visibleOrgAppLinks(apps, max = ORG_SWITCHER_MAX_APP_LINKS) {
185
+ const links = sortAppLinks(apps).slice(0, max);
186
+ return {
187
+ links,
188
+ overflowCount: Math.max(0, apps.length - links.length),
189
+ };
190
+ }
191
+ function initialWorkspaceLinks(env) {
192
+ return (parseWorkspaceAppLinksJson(envString(env, "VITE_AGENT_NATIVE_WORKSPACE_APPS_JSON"), env) ?? [
193
+ {
194
+ id: DISPATCH_ID,
195
+ name: "Dispatch",
196
+ href: appendPath(workspaceHref("/dispatch", null, env), "overview"),
197
+ description: "Workspace hub",
198
+ isDispatch: true,
199
+ status: "ready",
200
+ },
201
+ ]);
202
+ }
203
+ function workspaceAppFetchUrls(env) {
204
+ const urls = [];
205
+ const gatewayUrl = envString(env, "VITE_WORKSPACE_GATEWAY_URL");
206
+ if (gatewayUrl) {
207
+ try {
208
+ urls.push(new URL("/_workspace/apps", `${stripTrailingSlash(gatewayUrl)}/`).toString());
209
+ }
210
+ catch {
211
+ // Fall through to the same-origin Dispatch action below.
212
+ }
213
+ }
214
+ urls.push("/_agent-native/actions/list-workspace-apps?includeAgentCards=false");
215
+ return urls;
216
+ }
217
+ export function useOrgSwitcherAppLinks(enabled) {
218
+ const env = useMemo(() => runtimeEnv(), []);
219
+ const isWorkspace = useMemo(() => isWorkspaceAppEnvironment(env), [env]);
220
+ const [apps, setApps] = useState(() => isWorkspace ? initialWorkspaceLinks(env) : defaultOrgAppLinks());
221
+ const [isLoading, setIsLoading] = useState(false);
222
+ useEffect(() => {
223
+ if (!enabled || !isWorkspace)
224
+ return;
225
+ let cancelled = false;
226
+ async function refresh() {
227
+ setIsLoading(true);
228
+ try {
229
+ for (const url of workspaceAppFetchUrls(env)) {
230
+ try {
231
+ const response = await fetch(url, {
232
+ credentials: "include",
233
+ headers: { accept: "application/json" },
234
+ });
235
+ if (!response.ok)
236
+ continue;
237
+ const parsed = await response.json().catch(() => null);
238
+ const links = parseWorkspaceAppLinks(parsed, env);
239
+ if (links?.length) {
240
+ if (!cancelled)
241
+ setApps(links);
242
+ return;
243
+ }
244
+ }
245
+ catch {
246
+ // Try the next source; the static manifest remains available.
247
+ }
248
+ }
249
+ }
250
+ finally {
251
+ if (!cancelled)
252
+ setIsLoading(false);
253
+ }
254
+ }
255
+ void refresh();
256
+ return () => {
257
+ cancelled = true;
258
+ };
259
+ }, [enabled, env, isWorkspace]);
260
+ return {
261
+ apps,
262
+ isWorkspace,
263
+ isLoading,
264
+ dispatchHref: dispatchOverviewHref(apps, env),
265
+ dispatchAllAppsHref: dispatchAppsHref(apps, env),
266
+ };
267
+ }
268
+ //# sourceMappingURL=workspace-app-links.js.map