@agent-native/core 0.101.13 → 0.102.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 (561) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +13 -0
  3. package/corpus/core/package.json +4 -2
  4. package/corpus/core/src/cli/create.ts +32 -10
  5. package/corpus/core/src/cli/templates-meta.ts +13 -0
  6. package/corpus/core/src/client/AgentPanel.tsx +61 -48
  7. package/corpus/core/src/client/chat/message-components.tsx +1 -0
  8. package/corpus/core/src/client/chat/tool-call-display.tsx +12 -2
  9. package/corpus/core/src/client/org/OrgSwitcher.tsx +2 -0
  10. package/corpus/templates/clips/app/components/player/share-dialog.tsx +1 -1
  11. package/corpus/templates/clips/app/i18n/ar-SA.ts +1 -0
  12. package/corpus/templates/clips/app/i18n/de-DE.ts +1 -0
  13. package/corpus/templates/clips/app/i18n/en-US.ts +1 -0
  14. package/corpus/templates/clips/app/i18n/es-ES.ts +1 -0
  15. package/corpus/templates/clips/app/i18n/fr-FR.ts +1 -0
  16. package/corpus/templates/clips/app/i18n/hi-IN.ts +1 -0
  17. package/corpus/templates/clips/app/i18n/ja-JP.ts +1 -0
  18. package/corpus/templates/clips/app/i18n/ko-KR.ts +1 -0
  19. package/corpus/templates/clips/app/i18n/pt-BR.ts +1 -0
  20. package/corpus/templates/clips/app/i18n/zh-CN.ts +1 -0
  21. package/corpus/templates/clips/app/i18n/zh-TW.ts +1 -0
  22. package/corpus/templates/clips/changelog/2026-07-15-public-clip-links-are-labeled-share-with-humans-for-clarity.md +6 -0
  23. package/corpus/templates/content/actions/_database-source-utils.ts +59 -4
  24. package/corpus/templates/content/actions/prepare-builder-source-review.ts +9 -0
  25. package/corpus/templates/content/actions/preview-builder-source-review.ts +6 -4
  26. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +4 -0
  27. package/corpus/templates/content/changelog/2026-07-15-selected-builder-reviews-now-load-only-the-chosen-rows-avoid.md +6 -0
  28. package/corpus/templates/content/shared/api.ts +1 -0
  29. package/corpus/templates/forms/actions/delete-form.ts +4 -0
  30. package/corpus/templates/forms/actions/patch-form-fields.ts +3 -0
  31. package/corpus/templates/forms/actions/restore-form.ts +3 -0
  32. package/corpus/templates/forms/actions/update-form.ts +3 -0
  33. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +2 -2
  34. package/corpus/templates/forms/app/pages/ResponsesPage.tsx +2 -2
  35. package/corpus/templates/forms/changelog/2026-07-15-published-forms-now-reflect-field-updates-immediately-at-the.md +6 -0
  36. package/corpus/templates/forms/changelog/2026-07-15-response-rows-now-keep-every-column-aligned-to-the-top-for-c.md +6 -0
  37. package/corpus/templates/forms/server/handlers/forms.ts +1 -0
  38. package/corpus/templates/forms/server/lib/public-form-ssr.ts +47 -4
  39. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +189 -82
  40. package/corpus/templates/slides/app/pages/DeckEditor.tsx +1 -1
  41. package/corpus/templates/tasks/.agents/commands/visual-plan.md +9 -0
  42. package/corpus/templates/tasks/.agents/commands/visual-recap.md +8 -0
  43. package/corpus/templates/tasks/.agents/skills/actions/SKILL.md +492 -0
  44. package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +189 -0
  45. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +76 -0
  46. package/corpus/templates/tasks/.agents/skills/agent-watchdog/README.md +43 -0
  47. package/corpus/templates/tasks/.agents/skills/agent-watchdog/SKILL.md +110 -0
  48. package/corpus/templates/tasks/.agents/skills/agent-watchdog/agents/openai.yaml +4 -0
  49. package/corpus/templates/tasks/.agents/skills/capture-learnings/SKILL.md +89 -0
  50. package/corpus/templates/tasks/.agents/skills/change-summary/SKILL.md +83 -0
  51. package/corpus/templates/tasks/.agents/skills/create-skill/SKILL.md +221 -0
  52. package/corpus/templates/tasks/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  53. package/corpus/templates/tasks/.agents/skills/efficient-fable/README.md +75 -0
  54. package/corpus/templates/tasks/.agents/skills/efficient-fable/SKILL.md +95 -0
  55. package/corpus/templates/tasks/.agents/skills/efficient-frontier/README.md +53 -0
  56. package/corpus/templates/tasks/.agents/skills/efficient-frontier/SKILL.md +73 -0
  57. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +112 -0
  58. package/corpus/templates/tasks/.agents/skills/plan-arbiter/README.md +41 -0
  59. package/corpus/templates/tasks/.agents/skills/plan-arbiter/SKILL.md +114 -0
  60. package/corpus/templates/tasks/.agents/skills/plan-arbiter/agents/openai.yaml +4 -0
  61. package/corpus/templates/tasks/.agents/skills/plow-ahead/README.md +42 -0
  62. package/corpus/templates/tasks/.agents/skills/plow-ahead/SKILL.md +104 -0
  63. package/corpus/templates/tasks/.agents/skills/plow-ahead/agents/openai.yaml +4 -0
  64. package/corpus/templates/tasks/.agents/skills/quick-recap/README.md +55 -0
  65. package/corpus/templates/tasks/.agents/skills/quick-recap/SKILL.md +54 -0
  66. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/README.md +54 -0
  67. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/SKILL.md +126 -0
  68. package/corpus/templates/tasks/.agents/skills/read-the-damn-docs/agents/openai.yaml +4 -0
  69. package/corpus/templates/tasks/.agents/skills/real-time-sync/SKILL.md +232 -0
  70. package/corpus/templates/tasks/.agents/skills/security/SKILL.md +280 -0
  71. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +106 -0
  72. package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +95 -0
  73. package/corpus/templates/tasks/.agents/skills/stay-within-limits/README.md +61 -0
  74. package/corpus/templates/tasks/.agents/skills/stay-within-limits/SKILL.md +83 -0
  75. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  76. package/corpus/templates/tasks/.agents/skills/visual-plan/SKILL.md +547 -0
  77. package/corpus/templates/tasks/.agents/skills/visual-plan/agent-native-skill.json +12 -0
  78. package/corpus/templates/tasks/.agents/skills/visual-plan/references/canvas.md +121 -0
  79. package/corpus/templates/tasks/.agents/skills/visual-plan/references/document-quality.md +178 -0
  80. package/corpus/templates/tasks/.agents/skills/visual-plan/references/exemplar.md +62 -0
  81. package/corpus/templates/tasks/.agents/skills/visual-plan/references/wireframe.md +264 -0
  82. package/corpus/templates/tasks/.agents/skills/visual-recap/SKILL.md +634 -0
  83. package/corpus/templates/tasks/.agents/skills/visual-recap/agent-native-skill.json +12 -0
  84. package/corpus/templates/tasks/.agents/skills/visual-recap/references/wireframe.md +264 -0
  85. package/corpus/templates/tasks/.claude/commands/visual-plan.md +9 -0
  86. package/corpus/templates/tasks/.claude/commands/visual-recap.md +8 -0
  87. package/corpus/templates/tasks/.env.example +5 -0
  88. package/corpus/templates/tasks/.ignore +0 -0
  89. package/corpus/templates/tasks/.prettierrc +5 -0
  90. package/corpus/templates/tasks/AGENTS.md +158 -0
  91. package/corpus/templates/tasks/DEVELOPING.md +185 -0
  92. package/corpus/templates/tasks/README.md +16 -0
  93. package/corpus/templates/tasks/actions/bulk-delete-inbox-items.ts +24 -0
  94. package/corpus/templates/tasks/actions/bulk-delete-tasks.ts +21 -0
  95. package/corpus/templates/tasks/actions/bulk-mark-inbox-items-ready.ts +27 -0
  96. package/corpus/templates/tasks/actions/bulk-update-tasks.ts +35 -0
  97. package/corpus/templates/tasks/actions/create-custom-field.ts +22 -0
  98. package/corpus/templates/tasks/actions/create-inbox-item.ts +30 -0
  99. package/corpus/templates/tasks/actions/create-task.ts +33 -0
  100. package/corpus/templates/tasks/actions/delete-custom-field.ts +19 -0
  101. package/corpus/templates/tasks/actions/delete-inbox-item.ts +17 -0
  102. package/corpus/templates/tasks/actions/delete-task.ts +17 -0
  103. package/corpus/templates/tasks/actions/lib/boolean-query-param.ts +30 -0
  104. package/corpus/templates/tasks/actions/list-custom-fields.ts +18 -0
  105. package/corpus/templates/tasks/actions/list-inbox-items.ts +16 -0
  106. package/corpus/templates/tasks/actions/list-tasks.ts +52 -0
  107. package/corpus/templates/tasks/actions/list-visible-task-fields.ts +18 -0
  108. package/corpus/templates/tasks/actions/mark-inbox-item-ready.ts +31 -0
  109. package/corpus/templates/tasks/actions/navigate.ts +51 -0
  110. package/corpus/templates/tasks/actions/reorder-custom-fields.ts +27 -0
  111. package/corpus/templates/tasks/actions/reorder-inbox-items.ts +24 -0
  112. package/corpus/templates/tasks/actions/reorder-tasks.ts +29 -0
  113. package/corpus/templates/tasks/actions/run.ts +2 -0
  114. package/corpus/templates/tasks/actions/update-custom-field.ts +33 -0
  115. package/corpus/templates/tasks/actions/update-inbox-item.ts +24 -0
  116. package/corpus/templates/tasks/actions/update-task.ts +68 -0
  117. package/corpus/templates/tasks/actions/update-visible-task-fields.ts +27 -0
  118. package/corpus/templates/tasks/actions/view-screen-helpers.ts +68 -0
  119. package/corpus/templates/tasks/actions/view-screen.ts +207 -0
  120. package/corpus/templates/tasks/app/components/custom-fields/FieldCreateBar.tsx +121 -0
  121. package/corpus/templates/tasks/app/components/custom-fields/FieldListRow.tsx +116 -0
  122. package/corpus/templates/tasks/app/components/custom-fields/FieldsList.tsx +225 -0
  123. package/corpus/templates/tasks/app/components/custom-fields/FieldsListSkeleton.tsx +18 -0
  124. package/corpus/templates/tasks/app/components/custom-fields/FieldsPage.tsx +42 -0
  125. package/corpus/templates/tasks/app/components/custom-fields/editor/FieldEditorSidebar.tsx +69 -0
  126. package/corpus/templates/tasks/app/components/custom-fields/editor/FieldTitleSection.tsx +32 -0
  127. package/corpus/templates/tasks/app/components/custom-fields/editor/config/CurrencyConfigControl.tsx +49 -0
  128. package/corpus/templates/tasks/app/components/custom-fields/editor/config/FieldConfigControl.tsx +56 -0
  129. package/corpus/templates/tasks/app/components/custom-fields/editor/config/NumberConfigControl.tsx +52 -0
  130. package/corpus/templates/tasks/app/components/custom-fields/editor/config/PercentConfigControl.tsx +30 -0
  131. package/corpus/templates/tasks/app/components/custom-fields/editor/config/SelectConfigControl.tsx +135 -0
  132. package/corpus/templates/tasks/app/components/custom-fields/editor/config/select-colors.ts +23 -0
  133. package/corpus/templates/tasks/app/components/custom-fields/editor/config/utils.ts +52 -0
  134. package/corpus/templates/tasks/app/components/custom-fields/editor/types.ts +7 -0
  135. package/corpus/templates/tasks/app/components/dnd/SortableItem.tsx +72 -0
  136. package/corpus/templates/tasks/app/components/dnd/SortableList.tsx +136 -0
  137. package/corpus/templates/tasks/app/components/dnd/reorder-moving-items.ts +160 -0
  138. package/corpus/templates/tasks/app/components/dnd/sortable-drag-props.ts +60 -0
  139. package/corpus/templates/tasks/app/components/inbox/InboxList.tsx +222 -0
  140. package/corpus/templates/tasks/app/components/inbox/InboxListPage.tsx +39 -0
  141. package/corpus/templates/tasks/app/components/inbox/InboxListRow.tsx +122 -0
  142. package/corpus/templates/tasks/app/components/layout/Header.tsx +55 -0
  143. package/corpus/templates/tasks/app/components/layout/HeaderActions.tsx +84 -0
  144. package/corpus/templates/tasks/app/components/layout/Layout.tsx +134 -0
  145. package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +211 -0
  146. package/corpus/templates/tasks/app/components/shared/AddListItemInput.tsx +57 -0
  147. package/corpus/templates/tasks/app/components/shared/AlertDialog.tsx +53 -0
  148. package/corpus/templates/tasks/app/components/shared/BulkDeleteDialog.tsx +76 -0
  149. package/corpus/templates/tasks/app/components/shared/ChipSelect.tsx +240 -0
  150. package/corpus/templates/tasks/app/components/shared/DeleteItemDialog.tsx +40 -0
  151. package/corpus/templates/tasks/app/components/shared/InlineEditable.tsx +166 -0
  152. package/corpus/templates/tasks/app/components/shared/ListEmptyState.tsx +13 -0
  153. package/corpus/templates/tasks/app/components/shared/ListErrorMessage.tsx +15 -0
  154. package/corpus/templates/tasks/app/components/shared/ListViewHeader.tsx +75 -0
  155. package/corpus/templates/tasks/app/components/shared/PageHeader.tsx +25 -0
  156. package/corpus/templates/tasks/app/components/shared/RowActionsMenu.tsx +42 -0
  157. package/corpus/templates/tasks/app/components/shared/SidePanel.tsx +99 -0
  158. package/corpus/templates/tasks/app/components/shared/dnd/ListRowPreview.tsx +37 -0
  159. package/corpus/templates/tasks/app/components/shared/list/List.tsx +63 -0
  160. package/corpus/templates/tasks/app/components/shared/list/ListRow.tsx +159 -0
  161. package/corpus/templates/tasks/app/components/shared/list/ListRowDragHandle.tsx +52 -0
  162. package/corpus/templates/tasks/app/components/shared/list/ListSkeletonRows.tsx +11 -0
  163. package/corpus/templates/tasks/app/components/shared/list/SortableListItemShell.tsx +32 -0
  164. package/corpus/templates/tasks/app/components/shared/list/types.ts +1 -0
  165. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionBar.tsx +158 -0
  166. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionHeaderToggle.tsx +28 -0
  167. package/corpus/templates/tasks/app/components/shared/selection/ListSelectionToolbar.tsx +81 -0
  168. package/corpus/templates/tasks/app/components/shared/selection/get-list-row-selection-ui.ts +41 -0
  169. package/corpus/templates/tasks/app/components/shared/selection/use-list-selection.ts +196 -0
  170. package/corpus/templates/tasks/app/components/tasks/TaskList.tsx +333 -0
  171. package/corpus/templates/tasks/app/components/tasks/TaskListHeaderRow.tsx +46 -0
  172. package/corpus/templates/tasks/app/components/tasks/TaskListPage.tsx +115 -0
  173. package/corpus/templates/tasks/app/components/tasks/TaskListRow.css +49 -0
  174. package/corpus/templates/tasks/app/components/tasks/TaskListRow.tsx +307 -0
  175. package/corpus/templates/tasks/app/components/tasks/fields/TaskFieldsSidebar.tsx +102 -0
  176. package/corpus/templates/tasks/app/components/tasks/fields/TaskTitleSection.tsx +27 -0
  177. package/corpus/templates/tasks/app/components/tasks/fields/controls/DateValueControl.tsx +21 -0
  178. package/corpus/templates/tasks/app/components/tasks/fields/controls/FieldValueControl.tsx +76 -0
  179. package/corpus/templates/tasks/app/components/tasks/fields/controls/MultiSelectValueControl.tsx +52 -0
  180. package/corpus/templates/tasks/app/components/tasks/fields/controls/NumberValueControl.tsx +56 -0
  181. package/corpus/templates/tasks/app/components/tasks/fields/controls/RichTextValueControl.tsx +115 -0
  182. package/corpus/templates/tasks/app/components/tasks/fields/controls/SingleSelectValueControl.tsx +61 -0
  183. package/corpus/templates/tasks/app/components/tasks/fields/controls/TextValueControl.tsx +20 -0
  184. package/corpus/templates/tasks/app/components/tasks/use-task-row-completion-animation.ts +181 -0
  185. package/corpus/templates/tasks/app/components/ui/accordion.tsx +56 -0
  186. package/corpus/templates/tasks/app/components/ui/alert-dialog.tsx +1 -0
  187. package/corpus/templates/tasks/app/components/ui/alert.tsx +1 -0
  188. package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +5 -0
  189. package/corpus/templates/tasks/app/components/ui/avatar.tsx +1 -0
  190. package/corpus/templates/tasks/app/components/ui/badge.tsx +1 -0
  191. package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +115 -0
  192. package/corpus/templates/tasks/app/components/ui/button.tsx +1 -0
  193. package/corpus/templates/tasks/app/components/ui/calendar.tsx +70 -0
  194. package/corpus/templates/tasks/app/components/ui/card.tsx +1 -0
  195. package/corpus/templates/tasks/app/components/ui/carousel.tsx +260 -0
  196. package/corpus/templates/tasks/app/components/ui/chart.tsx +379 -0
  197. package/corpus/templates/tasks/app/components/ui/checkbox.tsx +1 -0
  198. package/corpus/templates/tasks/app/components/ui/collapsible.tsx +1 -0
  199. package/corpus/templates/tasks/app/components/ui/command.tsx +1 -0
  200. package/corpus/templates/tasks/app/components/ui/context-menu.tsx +1 -0
  201. package/corpus/templates/tasks/app/components/ui/dialog.tsx +1 -0
  202. package/corpus/templates/tasks/app/components/ui/drawer.tsx +1 -0
  203. package/corpus/templates/tasks/app/components/ui/dropdown-menu.tsx +1 -0
  204. package/corpus/templates/tasks/app/components/ui/form.tsx +177 -0
  205. package/corpus/templates/tasks/app/components/ui/hover-card.tsx +27 -0
  206. package/corpus/templates/tasks/app/components/ui/input-otp.tsx +69 -0
  207. package/corpus/templates/tasks/app/components/ui/input.tsx +1 -0
  208. package/corpus/templates/tasks/app/components/ui/label.tsx +1 -0
  209. package/corpus/templates/tasks/app/components/ui/menubar.tsx +254 -0
  210. package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +128 -0
  211. package/corpus/templates/tasks/app/components/ui/pagination.tsx +121 -0
  212. package/corpus/templates/tasks/app/components/ui/popover.tsx +1 -0
  213. package/corpus/templates/tasks/app/components/ui/progress.tsx +1 -0
  214. package/corpus/templates/tasks/app/components/ui/radio-group.tsx +1 -0
  215. package/corpus/templates/tasks/app/components/ui/resizable.tsx +43 -0
  216. package/corpus/templates/tasks/app/components/ui/scroll-area.tsx +1 -0
  217. package/corpus/templates/tasks/app/components/ui/select.tsx +1 -0
  218. package/corpus/templates/tasks/app/components/ui/separator.tsx +1 -0
  219. package/corpus/templates/tasks/app/components/ui/sheet.tsx +1 -0
  220. package/corpus/templates/tasks/app/components/ui/sidebar.tsx +782 -0
  221. package/corpus/templates/tasks/app/components/ui/skeleton.tsx +1 -0
  222. package/corpus/templates/tasks/app/components/ui/slider.tsx +1 -0
  223. package/corpus/templates/tasks/app/components/ui/sonner.tsx +1 -0
  224. package/corpus/templates/tasks/app/components/ui/spinner.tsx +1 -0
  225. package/corpus/templates/tasks/app/components/ui/switch.tsx +1 -0
  226. package/corpus/templates/tasks/app/components/ui/table.tsx +1 -0
  227. package/corpus/templates/tasks/app/components/ui/tabs.tsx +1 -0
  228. package/corpus/templates/tasks/app/components/ui/textarea.tsx +1 -0
  229. package/corpus/templates/tasks/app/components/ui/toast.tsx +1 -0
  230. package/corpus/templates/tasks/app/components/ui/toaster.tsx +1 -0
  231. package/corpus/templates/tasks/app/components/ui/toggle-group.tsx +1 -0
  232. package/corpus/templates/tasks/app/components/ui/toggle.tsx +43 -0
  233. package/corpus/templates/tasks/app/components/ui/tooltip.tsx +1 -0
  234. package/corpus/templates/tasks/app/components/ui/use-toast.ts +3 -0
  235. package/corpus/templates/tasks/app/entry.client.tsx +19 -0
  236. package/corpus/templates/tasks/app/entry.server.tsx +10 -0
  237. package/corpus/templates/tasks/app/global.css +93 -0
  238. package/corpus/templates/tasks/app/hooks/cache.ts +31 -0
  239. package/corpus/templates/tasks/app/hooks/use-custom-fields.ts +93 -0
  240. package/corpus/templates/tasks/app/hooks/use-inbox-items.ts +196 -0
  241. package/corpus/templates/tasks/app/hooks/use-mobile.tsx +21 -0
  242. package/corpus/templates/tasks/app/hooks/use-navigation-state.ts +40 -0
  243. package/corpus/templates/tasks/app/hooks/use-tasks.ts +276 -0
  244. package/corpus/templates/tasks/app/hooks/use-toast.ts +188 -0
  245. package/corpus/templates/tasks/app/hooks/use-visible-task-fields.ts +140 -0
  246. package/corpus/templates/tasks/app/lib/app-config.ts +11 -0
  247. package/corpus/templates/tasks/app/lib/tab-id.ts +1 -0
  248. package/corpus/templates/tasks/app/lib/utils.ts +1 -0
  249. package/corpus/templates/tasks/app/root.tsx +130 -0
  250. package/corpus/templates/tasks/app/routes/_index.tsx +22 -0
  251. package/corpus/templates/tasks/app/routes/extensions.$id.$slug.tsx +2 -0
  252. package/corpus/templates/tasks/app/routes/extensions.$id.tsx +11 -0
  253. package/corpus/templates/tasks/app/routes/extensions._index.tsx +11 -0
  254. package/corpus/templates/tasks/app/routes/extensions.tsx +5 -0
  255. package/corpus/templates/tasks/app/routes/fields.tsx +16 -0
  256. package/corpus/templates/tasks/app/routes/inbox.tsx +16 -0
  257. package/corpus/templates/tasks/app/routes/tasks.tsx +17 -0
  258. package/corpus/templates/tasks/app/routes/team.tsx +17 -0
  259. package/corpus/templates/tasks/app/routes.ts +4 -0
  260. package/corpus/templates/tasks/app/vite-env.d.ts +6 -0
  261. package/corpus/templates/tasks/components.json +20 -0
  262. package/corpus/templates/tasks/data/sync-config.json +1 -0
  263. package/corpus/templates/tasks/docs/features/README.md +81 -0
  264. package/corpus/templates/tasks/docs/features/f1-tasks.mdx +67 -0
  265. package/corpus/templates/tasks/docs/features/f2-custom-fields.mdx +68 -0
  266. package/corpus/templates/tasks/docs/features/f3-projects.mdx +33 -0
  267. package/corpus/templates/tasks/docs/features/f4-inbox.mdx +55 -0
  268. package/corpus/templates/tasks/docs/features/f5-views.mdx +65 -0
  269. package/corpus/templates/tasks/docs/features/f6-search.mdx +43 -0
  270. package/corpus/templates/tasks/docs/features/f7-first-run.mdx +66 -0
  271. package/corpus/templates/tasks/docs/features/f8-chat.mdx +120 -0
  272. package/corpus/templates/tasks/e2e/global-setup.ts +42 -0
  273. package/corpus/templates/tasks/e2e/helpers/inbox.ts +71 -0
  274. package/corpus/templates/tasks/e2e/helpers/tasks.ts +99 -0
  275. package/corpus/templates/tasks/learnings.defaults.md +5 -0
  276. package/corpus/templates/tasks/netlify.toml +10 -0
  277. package/corpus/templates/tasks/package.json +104 -0
  278. package/corpus/templates/tasks/playwright.config.ts +34 -0
  279. package/corpus/templates/tasks/public/agent-native-icon-dark.svg +10 -0
  280. package/corpus/templates/tasks/public/agent-native-icon-light.svg +10 -0
  281. package/corpus/templates/tasks/public/agent-native-logo-dark.svg +21 -0
  282. package/corpus/templates/tasks/public/agent-native-logo-light.svg +21 -0
  283. package/corpus/templates/tasks/public/favicon.svg +1 -0
  284. package/corpus/templates/tasks/public/icon-180.svg +1 -0
  285. package/corpus/templates/tasks/public/icon-192.svg +1 -0
  286. package/corpus/templates/tasks/public/icon-512.svg +1 -0
  287. package/corpus/templates/tasks/public/manifest.json +21 -0
  288. package/corpus/templates/tasks/react-router.config.ts +7 -0
  289. package/corpus/templates/tasks/server/custom-fields/normalize.ts +163 -0
  290. package/corpus/templates/tasks/server/custom-fields/parse.ts +146 -0
  291. package/corpus/templates/tasks/server/custom-fields/schema.ts +147 -0
  292. package/corpus/templates/tasks/server/custom-fields/store.ts +425 -0
  293. package/corpus/templates/tasks/server/custom-fields/task-fields.ts +104 -0
  294. package/corpus/templates/tasks/server/custom-fields/types.ts +98 -0
  295. package/corpus/templates/tasks/server/custom-fields/validate.ts +210 -0
  296. package/corpus/templates/tasks/server/custom-fields/values/store.ts +386 -0
  297. package/corpus/templates/tasks/server/db/bulk-write.ts +30 -0
  298. package/corpus/templates/tasks/server/db/index.ts +5 -0
  299. package/corpus/templates/tasks/server/db/record-utils.ts +7 -0
  300. package/corpus/templates/tasks/server/db/schema.ts +67 -0
  301. package/corpus/templates/tasks/server/db/test-tasks-table.ts +76 -0
  302. package/corpus/templates/tasks/server/db/transaction.ts +6 -0
  303. package/corpus/templates/tasks/server/errors.ts +31 -0
  304. package/corpus/templates/tasks/server/inbox/store.ts +216 -0
  305. package/corpus/templates/tasks/server/middleware/auth.ts +15 -0
  306. package/corpus/templates/tasks/server/plugins/agent-chat.ts +46 -0
  307. package/corpus/templates/tasks/server/plugins/auth.ts +15 -0
  308. package/corpus/templates/tasks/server/plugins/db.ts +90 -0
  309. package/corpus/templates/tasks/server/routes/[...page].get.ts +5 -0
  310. package/corpus/templates/tasks/server/stored-items/store.ts +548 -0
  311. package/corpus/templates/tasks/server/tasks/store.ts +306 -0
  312. package/corpus/templates/tasks/server/user-config/store.ts +138 -0
  313. package/corpus/templates/tasks/shared/app-state-tabs.ts +15 -0
  314. package/corpus/templates/tasks/shared/boolean-param.ts +22 -0
  315. package/corpus/templates/tasks/shared/bulk-limits.ts +7 -0
  316. package/corpus/templates/tasks/shared/list-screen-snapshot.ts +90 -0
  317. package/corpus/templates/tasks/shared/navigation.ts +104 -0
  318. package/corpus/templates/tasks/shared/visible-task-fields.ts +2 -0
  319. package/corpus/templates/tasks/ssr-entry.ts +15 -0
  320. package/corpus/templates/tasks/tsconfig.json +24 -0
  321. package/corpus/templates/tasks/vite.config.ts +19 -0
  322. package/corpus/templates/tasks/vitest.config.ts +8 -0
  323. package/dist/cli/create.d.ts +5 -2
  324. package/dist/cli/create.d.ts.map +1 -1
  325. package/dist/cli/create.js +22 -11
  326. package/dist/cli/create.js.map +1 -1
  327. package/dist/cli/templates-meta.d.ts.map +1 -1
  328. package/dist/cli/templates-meta.js +13 -0
  329. package/dist/cli/templates-meta.js.map +1 -1
  330. package/dist/client/AgentPanel.d.ts +2 -0
  331. package/dist/client/AgentPanel.d.ts.map +1 -1
  332. package/dist/client/AgentPanel.js +24 -13
  333. package/dist/client/AgentPanel.js.map +1 -1
  334. package/dist/client/chat/message-components.d.ts.map +1 -1
  335. package/dist/client/chat/message-components.js +1 -1
  336. package/dist/client/chat/message-components.js.map +1 -1
  337. package/dist/client/chat/tool-call-display.d.ts +3 -1
  338. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  339. package/dist/client/chat/tool-call-display.js +6 -5
  340. package/dist/client/chat/tool-call-display.js.map +1 -1
  341. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  342. package/dist/client/org/OrgSwitcher.js +2 -1
  343. package/dist/client/org/OrgSwitcher.js.map +1 -1
  344. package/dist/collab/struct-routes.d.ts +1 -1
  345. package/dist/templates/chat/.agents/skills/actions/SKILL.md +492 -0
  346. package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +189 -0
  347. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +76 -0
  348. package/dist/templates/chat/.agents/skills/capture-learnings/SKILL.md +89 -0
  349. package/dist/templates/chat/.agents/skills/create-skill/SKILL.md +221 -0
  350. package/dist/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  351. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +112 -0
  352. package/dist/templates/chat/.agents/skills/real-time-sync/SKILL.md +232 -0
  353. package/dist/templates/chat/.agents/skills/security/SKILL.md +280 -0
  354. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +106 -0
  355. package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +95 -0
  356. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  357. package/dist/templates/chat/.env.example +5 -0
  358. package/dist/templates/chat/.ignore +0 -0
  359. package/dist/templates/chat/.oxfmtrc.json +8 -0
  360. package/dist/templates/chat/.react-router/types/+server-build.d.ts +18 -0
  361. package/dist/templates/chat/.react-router/types/app/+types/root.ts +68 -0
  362. package/dist/templates/chat/AGENTS.md +62 -0
  363. package/dist/templates/chat/CHANGELOG.md +10 -0
  364. package/dist/templates/chat/DEVELOPING.md +185 -0
  365. package/dist/templates/chat/README.md +32 -0
  366. package/dist/templates/chat/_gitignore +43 -0
  367. package/dist/templates/chat/actions/hello.ts +13 -0
  368. package/dist/templates/chat/actions/navigate.ts +41 -0
  369. package/dist/templates/chat/actions/run.ts +2 -0
  370. package/dist/templates/chat/actions/view-screen.ts +31 -0
  371. package/dist/templates/chat/app/components/layout/Header.tsx +59 -0
  372. package/dist/templates/chat/app/components/layout/Layout.tsx +184 -0
  373. package/dist/templates/chat/app/components/layout/Sidebar.tsx +580 -0
  374. package/dist/templates/chat/app/components/ui/button.tsx +1 -0
  375. package/dist/templates/chat/app/components/ui/card.tsx +1 -0
  376. package/dist/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
  377. package/dist/templates/chat/app/components/ui/input.tsx +1 -0
  378. package/dist/templates/chat/app/components/ui/label.tsx +1 -0
  379. package/dist/templates/chat/app/components/ui/sheet.tsx +1 -0
  380. package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
  381. package/dist/templates/chat/app/components/ui/tooltip.tsx +1 -0
  382. package/dist/templates/chat/app/entry.client.tsx +19 -0
  383. package/dist/templates/chat/app/entry.server.tsx +10 -0
  384. package/dist/templates/chat/app/global.css +93 -0
  385. package/dist/templates/chat/app/hooks/use-navigation-state.ts +111 -0
  386. package/dist/templates/chat/app/i18n/ar-SA.ts +68 -0
  387. package/dist/templates/chat/app/i18n/de-DE.ts +71 -0
  388. package/dist/templates/chat/app/i18n/en-US.ts +70 -0
  389. package/dist/templates/chat/app/i18n/es-ES.ts +71 -0
  390. package/dist/templates/chat/app/i18n/fr-FR.ts +71 -0
  391. package/dist/templates/chat/app/i18n/hi-IN.ts +69 -0
  392. package/dist/templates/chat/app/i18n/index.ts +34 -0
  393. package/dist/templates/chat/app/i18n/ja-JP.ts +70 -0
  394. package/dist/templates/chat/app/i18n/ko-KR.ts +70 -0
  395. package/dist/templates/chat/app/i18n/pt-BR.ts +71 -0
  396. package/dist/templates/chat/app/i18n/zh-CN.ts +67 -0
  397. package/dist/templates/chat/app/i18n/zh-TW.ts +67 -0
  398. package/dist/templates/chat/app/i18n-data.ts +556 -0
  399. package/dist/templates/chat/app/lib/agent-page.tsx +40 -0
  400. package/dist/templates/chat/app/lib/app-config.ts +11 -0
  401. package/dist/templates/chat/app/lib/tab-id.ts +1 -0
  402. package/dist/templates/chat/app/lib/utils.ts +1 -0
  403. package/dist/templates/chat/app/root.tsx +172 -0
  404. package/dist/templates/chat/app/routes/_index.tsx +91 -0
  405. package/dist/templates/chat/app/routes/agent.tsx +17 -0
  406. package/dist/templates/chat/app/routes/chat.$threadId.tsx +1 -0
  407. package/dist/templates/chat/app/routes/database.tsx +17 -0
  408. package/dist/templates/chat/app/routes/extensions.$id.$slug.tsx +2 -0
  409. package/dist/templates/chat/app/routes/extensions.$id.tsx +11 -0
  410. package/dist/templates/chat/app/routes/extensions._index.tsx +11 -0
  411. package/dist/templates/chat/app/routes/extensions.tsx +5 -0
  412. package/dist/templates/chat/app/routes/observability.tsx +18 -0
  413. package/dist/templates/chat/app/routes/settings.tsx +88 -0
  414. package/dist/templates/chat/app/routes/team.tsx +11 -0
  415. package/dist/templates/chat/app/routes.ts +4 -0
  416. package/dist/templates/chat/app/vite-env.d.ts +6 -0
  417. package/dist/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  418. package/dist/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  419. package/dist/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  420. package/dist/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  421. package/dist/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  422. package/dist/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  423. package/dist/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  424. package/dist/templates/chat/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
  425. package/dist/templates/chat/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
  426. package/dist/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  427. package/dist/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  428. package/dist/templates/chat/components.json +20 -0
  429. package/dist/templates/chat/data/.gitkeep +0 -0
  430. package/dist/templates/chat/data/sync-config.json +1 -0
  431. package/dist/templates/chat/learnings.defaults.md +5 -0
  432. package/dist/templates/chat/netlify.toml +10 -0
  433. package/dist/templates/chat/package.json +92 -0
  434. package/dist/templates/chat/public/agent-native-icon-dark.svg +10 -0
  435. package/dist/templates/chat/public/agent-native-icon-light.svg +10 -0
  436. package/dist/templates/chat/public/agent-native-logo-dark.svg +21 -0
  437. package/dist/templates/chat/public/agent-native-logo-light.svg +21 -0
  438. package/dist/templates/chat/public/favicon.svg +1 -0
  439. package/dist/templates/chat/public/icon-180.svg +1 -0
  440. package/dist/templates/chat/public/icon-192.svg +1 -0
  441. package/dist/templates/chat/public/icon-512.svg +1 -0
  442. package/dist/templates/chat/public/manifest.json +21 -0
  443. package/dist/templates/chat/react-router.config.ts +7 -0
  444. package/dist/templates/chat/server/middleware/auth.ts +15 -0
  445. package/dist/templates/chat/server/plugins/agent-chat.ts +21 -0
  446. package/dist/templates/chat/server/plugins/auth.ts +17 -0
  447. package/dist/templates/chat/server/routes/[...page].get.ts +5 -0
  448. package/dist/templates/chat/ssr-entry.ts +15 -0
  449. package/dist/templates/chat/tsconfig.json +21 -0
  450. package/dist/templates/chat/vite.config.ts +19 -0
  451. package/package.json +2 -1
  452. package/src/templates/chat/.agents/skills/actions/SKILL.md +492 -0
  453. package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +189 -0
  454. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +76 -0
  455. package/src/templates/chat/.agents/skills/capture-learnings/SKILL.md +89 -0
  456. package/src/templates/chat/.agents/skills/create-skill/SKILL.md +221 -0
  457. package/src/templates/chat/.agents/skills/delegate-to-agent/SKILL.md +263 -0
  458. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +112 -0
  459. package/src/templates/chat/.agents/skills/real-time-sync/SKILL.md +232 -0
  460. package/src/templates/chat/.agents/skills/security/SKILL.md +280 -0
  461. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +106 -0
  462. package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +95 -0
  463. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  464. package/src/templates/chat/.env.example +5 -0
  465. package/src/templates/chat/.ignore +0 -0
  466. package/src/templates/chat/.oxfmtrc.json +8 -0
  467. package/src/templates/chat/.react-router/types/+server-build.d.ts +18 -0
  468. package/src/templates/chat/.react-router/types/app/+types/root.ts +68 -0
  469. package/src/templates/chat/AGENTS.md +62 -0
  470. package/src/templates/chat/CHANGELOG.md +10 -0
  471. package/src/templates/chat/DEVELOPING.md +185 -0
  472. package/src/templates/chat/README.md +32 -0
  473. package/src/templates/chat/_gitignore +43 -0
  474. package/src/templates/chat/actions/hello.spec.ts +23 -0
  475. package/src/templates/chat/actions/hello.ts +13 -0
  476. package/src/templates/chat/actions/navigate.spec.ts +68 -0
  477. package/src/templates/chat/actions/navigate.ts +41 -0
  478. package/src/templates/chat/actions/run.ts +2 -0
  479. package/src/templates/chat/actions/view-screen.spec.ts +40 -0
  480. package/src/templates/chat/actions/view-screen.ts +31 -0
  481. package/src/templates/chat/app/components/layout/Header.tsx +59 -0
  482. package/src/templates/chat/app/components/layout/Layout.tsx +184 -0
  483. package/src/templates/chat/app/components/layout/Sidebar.tsx +580 -0
  484. package/src/templates/chat/app/components/ui/button.tsx +1 -0
  485. package/src/templates/chat/app/components/ui/card.tsx +1 -0
  486. package/src/templates/chat/app/components/ui/dropdown-menu.tsx +1 -0
  487. package/src/templates/chat/app/components/ui/input.tsx +1 -0
  488. package/src/templates/chat/app/components/ui/label.tsx +1 -0
  489. package/src/templates/chat/app/components/ui/sheet.tsx +1 -0
  490. package/src/templates/chat/app/components/ui/toolkit-provider.tsx +12 -0
  491. package/src/templates/chat/app/components/ui/tooltip.tsx +1 -0
  492. package/src/templates/chat/app/entry.client.tsx +19 -0
  493. package/src/templates/chat/app/entry.server.tsx +10 -0
  494. package/src/templates/chat/app/global.css +93 -0
  495. package/src/templates/chat/app/hooks/use-navigation-state.ts +111 -0
  496. package/src/templates/chat/app/i18n/ar-SA.ts +68 -0
  497. package/src/templates/chat/app/i18n/de-DE.ts +71 -0
  498. package/src/templates/chat/app/i18n/en-US.ts +70 -0
  499. package/src/templates/chat/app/i18n/es-ES.ts +71 -0
  500. package/src/templates/chat/app/i18n/fr-FR.ts +71 -0
  501. package/src/templates/chat/app/i18n/hi-IN.ts +69 -0
  502. package/src/templates/chat/app/i18n/index.ts +34 -0
  503. package/src/templates/chat/app/i18n/ja-JP.ts +70 -0
  504. package/src/templates/chat/app/i18n/ko-KR.ts +70 -0
  505. package/src/templates/chat/app/i18n/pt-BR.ts +71 -0
  506. package/src/templates/chat/app/i18n/zh-CN.ts +67 -0
  507. package/src/templates/chat/app/i18n/zh-TW.ts +67 -0
  508. package/src/templates/chat/app/i18n-data.ts +556 -0
  509. package/src/templates/chat/app/lib/agent-page.spec.tsx +52 -0
  510. package/src/templates/chat/app/lib/agent-page.tsx +40 -0
  511. package/src/templates/chat/app/lib/app-config.ts +11 -0
  512. package/src/templates/chat/app/lib/tab-id.ts +1 -0
  513. package/src/templates/chat/app/lib/utils.ts +1 -0
  514. package/src/templates/chat/app/root.tsx +172 -0
  515. package/src/templates/chat/app/routes/_index.tsx +91 -0
  516. package/src/templates/chat/app/routes/agent.tsx +17 -0
  517. package/src/templates/chat/app/routes/chat.$threadId.tsx +1 -0
  518. package/src/templates/chat/app/routes/database.tsx +17 -0
  519. package/src/templates/chat/app/routes/extensions.$id.$slug.tsx +2 -0
  520. package/src/templates/chat/app/routes/extensions.$id.tsx +11 -0
  521. package/src/templates/chat/app/routes/extensions._index.tsx +11 -0
  522. package/src/templates/chat/app/routes/extensions.tsx +5 -0
  523. package/src/templates/chat/app/routes/observability.tsx +18 -0
  524. package/src/templates/chat/app/routes/settings.tsx +88 -0
  525. package/src/templates/chat/app/routes/team.tsx +11 -0
  526. package/src/templates/chat/app/routes.ts +4 -0
  527. package/src/templates/chat/app/vite-env.d.ts +6 -0
  528. package/src/templates/chat/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
  529. package/src/templates/chat/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
  530. package/src/templates/chat/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
  531. package/src/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
  532. package/src/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
  533. package/src/templates/chat/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
  534. package/src/templates/chat/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
  535. package/src/templates/chat/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
  536. package/src/templates/chat/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
  537. package/src/templates/chat/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
  538. package/src/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  539. package/src/templates/chat/components.json +20 -0
  540. package/src/templates/chat/data/.gitkeep +0 -0
  541. package/src/templates/chat/data/sync-config.json +1 -0
  542. package/src/templates/chat/learnings.defaults.md +5 -0
  543. package/src/templates/chat/netlify.toml +10 -0
  544. package/src/templates/chat/package.json +92 -0
  545. package/src/templates/chat/public/agent-native-icon-dark.svg +10 -0
  546. package/src/templates/chat/public/agent-native-icon-light.svg +10 -0
  547. package/src/templates/chat/public/agent-native-logo-dark.svg +21 -0
  548. package/src/templates/chat/public/agent-native-logo-light.svg +21 -0
  549. package/src/templates/chat/public/favicon.svg +1 -0
  550. package/src/templates/chat/public/icon-180.svg +1 -0
  551. package/src/templates/chat/public/icon-192.svg +1 -0
  552. package/src/templates/chat/public/icon-512.svg +1 -0
  553. package/src/templates/chat/public/manifest.json +21 -0
  554. package/src/templates/chat/react-router.config.ts +7 -0
  555. package/src/templates/chat/server/middleware/auth.ts +15 -0
  556. package/src/templates/chat/server/plugins/agent-chat.ts +21 -0
  557. package/src/templates/chat/server/plugins/auth.ts +17 -0
  558. package/src/templates/chat/server/routes/[...page].get.ts +5 -0
  559. package/src/templates/chat/ssr-entry.ts +15 -0
  560. package/src/templates/chat/tsconfig.json +21 -0
  561. package/src/templates/chat/vite.config.ts +19 -0
@@ -1 +1 @@
1
- {"version":3,"file":"tool-call-display.js","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: tool-payload formatting helpers, ToolCallDisplay, ToolCallFallback,\n// and ReconnectStreamMessage used by AssistantChat.\n\nimport type { ToolCallMessagePartProps } from \"@assistant-ui/react\";\nimport {\n IconLoader2,\n IconCircleX,\n IconCheck,\n IconChevronRight,\n IconCopy,\n IconCode,\n IconBrandSlack,\n IconTerminal2,\n IconDatabase,\n IconSearch,\n IconFileCode,\n IconShieldCheck,\n IconX,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useEffect,\n useCallback,\n useLayoutEffect,\n useRef,\n} from \"react\";\n\nimport type { ActionChatUIConfig } from \"../../action-ui.js\";\nimport type { AgentMcpAppPayload } from \"../../mcp-client/app-result.js\";\nimport { AgentTaskCard } from \"../AgentTaskCard.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { ConnectBuilderCard } from \"../ConnectBuilderCard.js\";\nimport { McpAppRenderer } from \"../mcp-apps/McpAppRenderer.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport {\n BashCell,\n EditCell,\n WriteCell,\n FilesChangedSummary,\n} from \"../tool-cells/index.js\";\nimport { humanizeToolName } from \"../tool-display.js\";\nimport { cn } from \"../utils.js\";\nimport {\n SmoothMarkdownText,\n HighlightedCodeBlock,\n markdownComponents,\n markdownModule,\n remarkGfmFn,\n markdownUrlTransform,\n} from \"./markdown-renderer.js\";\nimport { resolveToolRenderer } from \"./tool-render-registry.js\";\nimport {\n isBuiltinDataWidgetActionRenderer,\n resolveBuiltinActionChatRenderer,\n resolveBuiltinFallbackToolRenderer,\n} from \"./widgets/builtin-tool-renderers.js\";\n\n// Exported so AssistantChatInner can provide a context value.\nexport const ChatRunningContext = React.createContext(false);\n\n/**\n * Human-in-the-loop approval bridge. `AssistantChatInner` provides a value that\n * re-issues the turn approving a specific paused tool call (opt-in\n * `needsApproval` actions). When null, the Approve button is not rendered.\n * Deny defaults to local-only (the action stays un-run) unless `onDeny` is\n * provided, and \"Always allow\" only renders when `onAlwaysAllow` is provided\n * — both are additive so existing action-approval consumers are unaffected.\n */\nexport type ApprovalContextValue = {\n /** Re-issue the turn so the server runs the approved call. */\n onApprove: (approvalKey: string) => void;\n /**\n * Optional host hook invoked in addition to the local \"denied\" state, e.g.\n * so a Code session can also resolve its own pending approval as denied.\n */\n onDeny?: (approvalKey: string) => void;\n /**\n * Optional host hook that persists this exact call so future occurrences\n * skip the approval gate. When absent, no \"Always allow\" button renders.\n */\n onAlwaysAllow?: (approvalKey: string) => void;\n};\nexport const ApprovalContext = React.createContext<ApprovalContextValue | null>(\n null,\n);\n\nexport const TOOL_LONG_RUNNING_HINT_DELAY_MS = 45_000;\n\nfunction ToolLongRunningHintShell({\n toolName,\n isRunning,\n children,\n}: {\n toolName: string;\n isRunning: boolean;\n children: React.ReactNode;\n}) {\n const [showLongRunningHint, setShowLongRunningHint] = useState(false);\n\n useEffect(() => {\n if (!isRunning) {\n setShowLongRunningHint(false);\n return;\n }\n setShowLongRunningHint(false);\n const timeout = window.setTimeout(() => {\n setShowLongRunningHint(true);\n }, TOOL_LONG_RUNNING_HINT_DELAY_MS);\n return () => window.clearTimeout(timeout);\n }, [isRunning, toolName]);\n\n return (\n <>\n {children}\n {isRunning && showLongRunningHint && (\n <div className=\"mt-0.5 px-2.5 text-[11px] leading-snug text-muted-foreground/80\">\n Still working. Large updates can take a minute or two.\n </div>\n )}\n </>\n );\n}\n\n// ─── Tool-payload formatting ──────────────────────────────────────────────────\n\ntype ToolDetailSection = \"input\" | \"result\";\nexport type ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"code\" &&\n (tool.includes(\"run-code\") || tool.includes(\"run_code\"))\n ) {\n return \"javascript\";\n }\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nexport function toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nexport function toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\n// ─── Tool icon helpers ────────────────────────────────────────────────────────\n\ntype ToolIconComponent = React.ComponentType<{\n className?: string;\n size?: number | string;\n}>;\n\nfunction resolveToolIcon(toolName: string): ToolIconComponent {\n const name = toolName.toLowerCase();\n if (name.includes(\"slack\")) return IconBrandSlack;\n if (\n name.includes(\"bash\") ||\n name.includes(\"shell\") ||\n name.includes(\"terminal\") ||\n name.includes(\"run-code\") ||\n name.includes(\"exec\")\n ) {\n return IconTerminal2;\n }\n if (\n name.includes(\"sql\") ||\n name.includes(\"bigquery\") ||\n name.includes(\"db-query\") ||\n name.includes(\"query\")\n ) {\n return IconDatabase;\n }\n if (\n name.includes(\"search\") ||\n name.includes(\"find\") ||\n name.includes(\"grep\")\n ) {\n return IconSearch;\n }\n if (\n name.includes(\"file\") ||\n name.includes(\"read\") ||\n name.includes(\"write\") ||\n name.includes(\"edit\")\n ) {\n return IconFileCode;\n }\n return IconCode;\n}\n\n// ─── Simple code viewer (Codex-style gray box) ────────────────────────────────\n\nfunction SimpleCodeViewer({\n text,\n lang,\n className,\n maxHeightClass = \"max-h-56\",\n}: {\n text: string;\n lang: string;\n className?: string;\n maxHeightClass?: string;\n}) {\n return (\n <div\n className={cn(\n \"agent-tool-code overflow-auto rounded-md bg-muted/70 font-mono text-[11px] leading-relaxed text-foreground\",\n maxHeightClass,\n className,\n )}\n >\n {lang !== \"text\" && (\n <div className=\"sticky top-0 z-[1] flex items-center justify-between border-b border-border/40 bg-muted/90 px-2.5 py-1\">\n <span className=\"font-mono text-[10px] uppercase tracking-wide text-muted-foreground/80\">\n {lang}\n </span>\n </div>\n )}\n <HighlightedCodeBlock code={text} lang={lang} />\n </div>\n );\n}\n\nfunction ToolOutputPopover({\n open,\n onOpenChange,\n title,\n payload,\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n payload: ToolDetailPayload;\n children: React.ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n if (await writeClipboardText(payload.copyText)) {\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n }\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={6}\n collisionPadding={12}\n className=\"flex max-h-[min(calc(100vh-2rem),var(--radix-popover-content-available-height,75vh))] w-[min(calc(100vw-2rem),var(--radix-popover-content-available-width,760px),760px)] flex-col gap-0 overflow-hidden p-0\"\n >\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b border-border px-4 py-3\">\n <div className=\"truncate text-sm font-medium\">{title}</div>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-7 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={13} /> : <IconCopy size={13} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-hidden p-3\">\n <SimpleCodeViewer\n text={payload.text}\n lang={payload.lang}\n maxHeightClass=\"max-h-[min(70vh,calc(var(--radix-popover-content-available-height,75vh)-4.5rem))]\"\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Collapsible height animation ─────────────────────────────────────────────\n\nexport function AnimatedCollapse({\n open,\n children,\n}: {\n open: boolean;\n children: React.ReactNode;\n}) {\n const [mounted, setMounted] = useState(open);\n\n useLayoutEffect(() => {\n if (open) setMounted(true);\n }, [open]);\n\n const onTransitionEnd = useCallback(\n (event: React.TransitionEvent<HTMLDivElement>) => {\n if (event.propertyName !== \"grid-template-rows\" || open) return;\n setMounted(false);\n },\n [open],\n );\n\n if (!mounted) return null;\n\n return (\n <div\n className=\"agent-chat-collapse\"\n data-state={open ? \"open\" : \"closed\"}\n aria-hidden={!open}\n onTransitionEnd={onTransitionEnd}\n >\n <div className=\"agent-chat-collapse__content\">{children}</div>\n </div>\n );\n}\n\n// ─── Human-in-the-loop approval affordance ────────────────────────────────────\n\n/**\n * Inline Approve/Deny prompt rendered when a `needsApproval` action paused the\n * turn. Approve re-issues the turn with the call's `approvalKey`; Deny dismisses\n * the prompt locally (the action stays un-run).\n */\nfunction ApprovalAffordance({\n toolName,\n approval,\n}: {\n toolName: string;\n approval: { approvalKey: string; dismissed?: boolean };\n}) {\n const ctx = React.useContext(ApprovalContext);\n const [approved, setApproved] = useState(false);\n const [denied, setDenied] = useState(false);\n\n // Once approved, the turn is re-issued; collapse to a quiet note so the user\n // can't double-fire the approval.\n if (approved) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Approved. Re-running {toolName}...\n </div>\n );\n }\n // Deny defaults to local-only (the action simply stays un-run). When the\n // host also provided `onDeny` (e.g. a Code session resolving its own\n // pending approval), it fires alongside the local state.\n if (denied) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Denied. {toolName} did not run.\n </div>\n );\n }\n return (\n <div className=\"mt-1.5 flex items-center gap-2 rounded-md border border-border bg-muted/40 px-2.5 py-1.5\">\n <IconShieldCheck className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"mr-auto text-xs text-muted-foreground\">\n Approve to run {toolName}?\n </span>\n {ctx && (\n <button\n type=\"button\"\n onClick={() => {\n setApproved(true);\n ctx.onApprove(approval.approvalKey);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n <IconCheck className=\"h-3.5 w-3.5\" />\n Approve\n </button>\n )}\n {ctx?.onAlwaysAllow && (\n <button\n type=\"button\"\n onClick={() => {\n setApproved(true);\n ctx.onAlwaysAllow?.(approval.approvalKey);\n }}\n title=\"Approve and always allow this exact command\"\n className={cn(\n \"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors\",\n \"text-foreground hover:bg-muted\",\n )}\n >\n <IconShieldCheck className=\"h-3.5 w-3.5\" />\n Always allow\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setDenied(true);\n ctx?.onDeny?.(approval.approvalKey);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors\",\n \"text-foreground hover:bg-muted\",\n )}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n Deny\n </button>\n </div>\n );\n}\n\n// ─── ToolCallDisplay ──────────────────────────────────────────────────────────\n\nexport function ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n chatUI,\n isRunning,\n structuredMeta,\n approval,\n repeatCount,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n isRunning: boolean;\n structuredMeta?: Record<string, unknown>;\n approval?: { approvalKey: string; dismissed?: boolean };\n repeatCount?: number;\n}) {\n // Delegate to bespoke cells when structured metadata is present.\n // These must be separate components so hook order in ToolCallDisplayGeneric\n // is always stable (no conditional hook calls).\n const toolKind = structuredMeta?.toolKind as string | undefined;\n const wrapToolDisplay = (children: React.ReactNode) => (\n <ToolLongRunningHintShell toolName={toolName} isRunning={isRunning}>\n {children}\n </ToolLongRunningHintShell>\n );\n if (toolKind === \"bash\") {\n return wrapToolDisplay(\n <BashCell\n meta={\n structuredMeta as unknown as Parameters<typeof BashCell>[0][\"meta\"]\n }\n output={result}\n isRunning={isRunning}\n />,\n );\n }\n if (toolKind === \"edit\") {\n return wrapToolDisplay(\n <EditCell\n meta={\n structuredMeta as unknown as Parameters<typeof EditCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />,\n );\n }\n if (toolKind === \"write\") {\n return wrapToolDisplay(\n <WriteCell\n meta={\n structuredMeta as unknown as Parameters<typeof WriteCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />,\n );\n }\n return wrapToolDisplay(\n <ToolCallDisplayGeneric\n toolName={toolName}\n argsText={argsText}\n args={args}\n result={result}\n mcpApp={mcpApp}\n chatUI={chatUI}\n isRunning={isRunning}\n approval={approval}\n repeatCount={repeatCount}\n />,\n );\n}\n\nfunction ToolCallDisplayGeneric({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n chatUI,\n isRunning,\n approval,\n repeatCount,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n isRunning: boolean;\n approval?: { approvalKey: string; dismissed?: boolean };\n repeatCount?: number;\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const [outputOpen, setOutputOpen] = useState(false);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n // Ignore saved cliAuthUrl values from older tool results. They\n // contain signed callback state and can expire while a chat sits\n // open; the card's hook fetches a fresh signed URL on mount/click.\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const parsedResult = result ? parseJsonText(result) : null;\n const nativeToolContext = {\n toolName,\n args,\n resultText: result,\n resultJson: parsedResult,\n isRunning,\n chatUI,\n };\n const skipRegistryRenderer =\n !isAgentCall && isBuiltinDataWidgetActionRenderer(nativeToolContext);\n const NativeToolRenderer = isAgentCall\n ? null\n : (resolveBuiltinActionChatRenderer(nativeToolContext) ??\n (skipRegistryRenderer ? null : resolveToolRenderer(nativeToolContext)) ??\n resolveBuiltinFallbackToolRenderer(nativeToolContext));\n if (NativeToolRenderer) {\n return <NativeToolRenderer context={nativeToolContext} />;\n }\n\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : humanizeToolName(toolName);\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n const ToolIcon = resolveToolIcon(toolName);\n const outputTitle = `Raw ${toolName} tool call output`;\n\n return (\n <div className=\"group/tool my-0.5 w-full overflow-hidden\">\n {mcpApp && <McpAppRenderer app={mcpApp} className=\"mb-1.5\" />}\n <button\n type=\"button\"\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md py-0.5 text-left text-[13px] text-muted-foreground transition-colors\",\n canExpand && \"hover:text-foreground\",\n isRunning && \"text-muted-foreground\",\n )}\n >\n <span className=\"relative flex size-4 shrink-0 items-center justify-center\">\n {isRunning ? (\n <IconLoader2 className=\"size-3.5 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"size-3.5 text-destructive\" />\n ) : (\n <>\n <ToolIcon\n className={cn(\n \"size-3.5 transition-opacity\",\n canExpand && \"group-hover/tool:opacity-0\",\n )}\n />\n {canExpand && (\n <IconChevronRight\n className={cn(\n \"absolute size-3.5 opacity-0 transition-[opacity,transform] group-hover/tool:opacity-100\",\n isExpanded && \"rotate-90\",\n )}\n />\n )}\n </>\n )}\n </span>\n <span className=\"min-w-0 truncate font-normal\">{displayName}</span>\n {repeatCount && repeatCount > 1 && (\n <span\n className=\"shrink-0 rounded border border-border/60 px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground\"\n title={`Repeated ${repeatCount} times`}\n >\n {repeatCount}x\n </span>\n )}\n </button>\n <AnimatedCollapse open={isExpanded && isAgentCall && hasStreamText}>\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n {markdownModule?.default && remarkGfmFn ? (\n <markdownModule.default\n remarkPlugins={[remarkGfmFn]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </markdownModule.default>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{agentStreamText}</span>\n )}\n </div>\n </AnimatedCollapse>\n <AnimatedCollapse\n open={isExpanded && !isAgentCall && (hasArgs || result !== undefined)}\n >\n <div className=\"mt-1 space-y-2 pl-5\">\n {inputPayload && (\n <SimpleCodeViewer\n text={inputPayload.text}\n lang={inputPayload.lang}\n />\n )}\n {resultPayload && (\n <ToolOutputPopover\n open={outputOpen}\n onOpenChange={setOutputOpen}\n title={outputTitle}\n payload={resultPayload}\n >\n <button\n type=\"button\"\n aria-label={`View ${toolName} output`}\n className=\"inline-flex size-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent hover:text-foreground\"\n >\n <IconCode className=\"size-3.5\" />\n </button>\n </ToolOutputPopover>\n )}\n </div>\n </AnimatedCollapse>\n {approval && (\n <ApprovalAffordance toolName={toolName} approval={approval} />\n )}\n </div>\n );\n}\n\n// ─── ToolCallFallback ──────────────────────────────────────────────────────────\n\nexport function ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n ...rest\n}: ToolCallMessagePartProps & {\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n structuredMeta?: Record<string, unknown>;\n activity?: boolean;\n approval?: { approvalKey: string; dismissed?: boolean };\n repeatCount?: number;\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning =\n result === undefined && (chatRunning || rest.activity === true);\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n mcpApp={rest.mcpApp}\n chatUI={rest.chatUI}\n structuredMeta={rest.structuredMeta}\n isRunning={isRunning}\n approval={rest.approval}\n repeatCount={rest.repeatCount}\n />\n );\n}\n\n// ─── ReconnectStreamMessage ────────────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nexport function ReconnectStreamMessage({\n content,\n}: {\n content: ContentPart[];\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n const latestReasoningPartIndex = content.reduce(\n (latestIndex, part, index) =>\n part.type === \"reasoning\" ? index : latestIndex,\n -1,\n );\n const streamingTextPartIndex =\n content.at(-1)?.type === \"text\" ? content.length - 1 : -1;\n const streamingReasoningPartIndex =\n content.at(-1)?.type === \"reasoning\" ? content.length - 1 : -1;\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n const partStreaming = chatRunning && i === streamingTextPartIndex;\n return (\n <SmoothMarkdownText\n key={`reconnect-text-${i}`}\n text={part.text}\n streaming={partStreaming}\n resetKey={`reconnect-text-${i}`}\n statusType={partStreaming ? \"running\" : \"complete\"}\n />\n );\n }\n if (part.type === \"reasoning\") {\n return (\n <ReasoningCell\n key={`reconnect-reasoning-${i}`}\n text={part.text}\n isStreaming={chatRunning && i === streamingReasoningPartIndex}\n defaultOpen={i === latestReasoningPartIndex}\n collapseWhenReplaced={i < latestReasoningPartIndex}\n />\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n mcpApp={part.mcpApp}\n chatUI={part.chatUI}\n structuredMeta={part.structuredMeta}\n isRunning={\n part.result === undefined &&\n (chatRunning || part.activity === true)\n }\n approval={part.approval}\n repeatCount={part.repeatCount}\n />\n );\n }\n return null;\n })}\n </div>\n </div>\n );\n}\n\n// ─── Reasoning / Thinking cell ────────────────────────────────────────────────\n\n/**\n * Completed reasoning and tool calls share one outer \"Worked for…\"\n * disclosure. Reasoning cells inside it render their prose directly so\n * opening that summary never reveals a redundant second disclosure.\n */\nconst WorkSummaryContentContext = React.createContext(false);\n\nexport function ReasoningCell({\n text,\n isStreaming = false,\n defaultOpen,\n autoCollapse = false,\n collapseWhenReplaced = false,\n durationMs,\n}: {\n text: string;\n isStreaming?: boolean;\n defaultOpen?: boolean;\n /** Animate closed when a live reasoning segment finishes during a run. */\n autoCollapse?: boolean;\n /** Animate closed when a newer reasoning segment replaces this one. */\n collapseWhenReplaced?: boolean;\n /**\n * Elapsed thinking time in ms, once known. Only meaningful once streaming\n * has finished — callers that track live timing (see ReasoningMessagePart)\n * pass this so the label can read \"Thought for Xs\" instead of \"Thought\".\n * Historical messages with no live timing simply omit it.\n */\n durationMs?: number | null;\n}) {\n const embeddedInWorkSummary = React.useContext(WorkSummaryContentContext);\n const [open, setOpen] = useState(defaultOpen ?? true);\n const wasStreamingRef = useRef(isStreaming);\n const wasReplacedRef = useRef(collapseWhenReplaced);\n const trimmed = text.trim();\n\n useEffect(() => {\n if (autoCollapse && wasStreamingRef.current && !isStreaming) {\n setOpen(false);\n }\n wasStreamingRef.current = isStreaming;\n }, [autoCollapse, isStreaming]);\n\n useEffect(() => {\n if (collapseWhenReplaced && !wasReplacedRef.current) {\n setOpen(false);\n }\n wasReplacedRef.current = collapseWhenReplaced;\n }, [collapseWhenReplaced]);\n\n if (!trimmed && !isStreaming) return null;\n\n if (embeddedInWorkSummary) {\n return (\n <div className=\"pb-1 pl-5 text-[13px] leading-relaxed text-muted-foreground whitespace-pre-wrap\">\n {trimmed || (isStreaming ? \"…\" : \"\")}\n </div>\n );\n }\n\n const label = isStreaming\n ? \"Thinking\"\n : durationMs != null\n ? `Thought for ${formatWorkedDuration(durationMs)}`\n : \"Thought\";\n // Only clamp to a scroll-free \"tail\" view while actively streaming and\n // expanded — once the run finishes the full text is shown, unclamped.\n const showTail = isStreaming && open;\n\n return (\n <div className=\"my-0.5 w-full\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground\"\n >\n <IconChevronRight\n className={cn(\n \"size-3.5 shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n {isStreaming ? (\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n ) : (\n <span>{label}</span>\n )}\n </button>\n <AnimatedCollapse open={open}>\n <div className={cn(\"pl-5 pb-1\", showTail && \"reasoning-cell-tail\")}>\n <div className=\"text-[13px] leading-relaxed text-muted-foreground whitespace-pre-wrap\">\n {trimmed || (isStreaming ? \"…\" : \"\")}\n </div>\n </div>\n </AnimatedCollapse>\n </div>\n );\n}\n\n// ─── Worked-for duration helpers ──────────────────────────────────────────────\n\nexport function formatWorkedDuration(ms: number): string {\n const totalSeconds = Math.max(0, Math.round(ms / 1000));\n if (totalSeconds < 60) {\n return totalSeconds <= 1 ? \"1s\" : `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) {\n if (seconds === 0) return `${minutes}m`;\n return `${minutes}m ${seconds}s`;\n }\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n if (remMinutes === 0) return `${hours}h`;\n return `${hours}h ${remMinutes}m`;\n}\n\nexport function WorkedForSummary({\n durationMs,\n autoCollapse = false,\n children,\n}: {\n durationMs?: number | null;\n /** When true, close the summary after a run has completed. */\n autoCollapse?: boolean;\n children: React.ReactNode;\n}) {\n // Start closed so a remounted completed message never flashes its work\n // details open while auto-collapse settles. If the summary was already\n // open when autoCollapse changes, AnimatedCollapse still animates it shut.\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (autoCollapse) setOpen(false);\n }, [autoCollapse]);\n\n const label =\n durationMs != null && durationMs >= 1000\n ? `Worked for ${formatWorkedDuration(durationMs)}`\n : \"Worked\";\n\n return (\n <div className=\"my-1 w-full\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground\"\n >\n <span>{label}</span>\n <IconChevronRight\n className={cn(\n \"size-3.5 shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n </button>\n <AnimatedCollapse open={open}>\n <WorkSummaryContentContext.Provider value>\n <div className=\"pt-1\">{children}</div>\n </WorkSummaryContentContext.Provider>\n </AnimatedCollapse>\n </div>\n );\n}\n\n// ─── Re-export for AssistantMessage ───────────────────────────────────────────\n// AssistantMessage in AssistantChat.tsx uses FilesChangedSummary directly, so\n// re-export it so AssistantChat.tsx can import from one place.\nexport { FilesChangedSummary };\n"]}
1
+ {"version":3,"file":"tool-call-display.js","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: tool-payload formatting helpers, ToolCallDisplay, ToolCallFallback,\n// and ReconnectStreamMessage used by AssistantChat.\n\nimport type { ToolCallMessagePartProps } from \"@assistant-ui/react\";\nimport {\n IconLoader2,\n IconCircleX,\n IconCheck,\n IconChevronRight,\n IconCopy,\n IconCode,\n IconBrandSlack,\n IconTerminal2,\n IconDatabase,\n IconSearch,\n IconFileCode,\n IconShieldCheck,\n IconX,\n} from \"@tabler/icons-react\";\nimport React, {\n useState,\n useEffect,\n useCallback,\n useLayoutEffect,\n useRef,\n} from \"react\";\n\nimport type { ActionChatUIConfig } from \"../../action-ui.js\";\nimport type { AgentMcpAppPayload } from \"../../mcp-client/app-result.js\";\nimport { AgentTaskCard } from \"../AgentTaskCard.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { ConnectBuilderCard } from \"../ConnectBuilderCard.js\";\nimport { McpAppRenderer } from \"../mcp-apps/McpAppRenderer.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport {\n BashCell,\n EditCell,\n WriteCell,\n FilesChangedSummary,\n} from \"../tool-cells/index.js\";\nimport { humanizeToolName } from \"../tool-display.js\";\nimport { cn } from \"../utils.js\";\nimport {\n SmoothMarkdownText,\n HighlightedCodeBlock,\n markdownComponents,\n markdownModule,\n remarkGfmFn,\n markdownUrlTransform,\n useSmoothStreamingText,\n} from \"./markdown-renderer.js\";\nimport { resolveToolRenderer } from \"./tool-render-registry.js\";\nimport {\n isBuiltinDataWidgetActionRenderer,\n resolveBuiltinActionChatRenderer,\n resolveBuiltinFallbackToolRenderer,\n} from \"./widgets/builtin-tool-renderers.js\";\n\n// Exported so AssistantChatInner can provide a context value.\nexport const ChatRunningContext = React.createContext(false);\n\n/**\n * Human-in-the-loop approval bridge. `AssistantChatInner` provides a value that\n * re-issues the turn approving a specific paused tool call (opt-in\n * `needsApproval` actions). When null, the Approve button is not rendered.\n * Deny defaults to local-only (the action stays un-run) unless `onDeny` is\n * provided, and \"Always allow\" only renders when `onAlwaysAllow` is provided\n * — both are additive so existing action-approval consumers are unaffected.\n */\nexport type ApprovalContextValue = {\n /** Re-issue the turn so the server runs the approved call. */\n onApprove: (approvalKey: string) => void;\n /**\n * Optional host hook invoked in addition to the local \"denied\" state, e.g.\n * so a Code session can also resolve its own pending approval as denied.\n */\n onDeny?: (approvalKey: string) => void;\n /**\n * Optional host hook that persists this exact call so future occurrences\n * skip the approval gate. When absent, no \"Always allow\" button renders.\n */\n onAlwaysAllow?: (approvalKey: string) => void;\n};\nexport const ApprovalContext = React.createContext<ApprovalContextValue | null>(\n null,\n);\n\nexport const TOOL_LONG_RUNNING_HINT_DELAY_MS = 45_000;\n\nfunction ToolLongRunningHintShell({\n toolName,\n isRunning,\n children,\n}: {\n toolName: string;\n isRunning: boolean;\n children: React.ReactNode;\n}) {\n const [showLongRunningHint, setShowLongRunningHint] = useState(false);\n\n useEffect(() => {\n if (!isRunning) {\n setShowLongRunningHint(false);\n return;\n }\n setShowLongRunningHint(false);\n const timeout = window.setTimeout(() => {\n setShowLongRunningHint(true);\n }, TOOL_LONG_RUNNING_HINT_DELAY_MS);\n return () => window.clearTimeout(timeout);\n }, [isRunning, toolName]);\n\n return (\n <>\n {children}\n {isRunning && showLongRunningHint && (\n <div className=\"mt-0.5 px-2.5 text-[11px] leading-snug text-muted-foreground/80\">\n Still working. Large updates can take a minute or two.\n </div>\n )}\n </>\n );\n}\n\n// ─── Tool-payload formatting ──────────────────────────────────────────────────\n\ntype ToolDetailSection = \"input\" | \"result\";\nexport type ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"code\" &&\n (tool.includes(\"run-code\") || tool.includes(\"run_code\"))\n ) {\n return \"javascript\";\n }\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nexport function toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nexport function toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\n// ─── Tool icon helpers ────────────────────────────────────────────────────────\n\ntype ToolIconComponent = React.ComponentType<{\n className?: string;\n size?: number | string;\n}>;\n\nfunction resolveToolIcon(toolName: string): ToolIconComponent {\n const name = toolName.toLowerCase();\n if (name.includes(\"slack\")) return IconBrandSlack;\n if (\n name.includes(\"bash\") ||\n name.includes(\"shell\") ||\n name.includes(\"terminal\") ||\n name.includes(\"run-code\") ||\n name.includes(\"exec\")\n ) {\n return IconTerminal2;\n }\n if (\n name.includes(\"sql\") ||\n name.includes(\"bigquery\") ||\n name.includes(\"db-query\") ||\n name.includes(\"query\")\n ) {\n return IconDatabase;\n }\n if (\n name.includes(\"search\") ||\n name.includes(\"find\") ||\n name.includes(\"grep\")\n ) {\n return IconSearch;\n }\n if (\n name.includes(\"file\") ||\n name.includes(\"read\") ||\n name.includes(\"write\") ||\n name.includes(\"edit\")\n ) {\n return IconFileCode;\n }\n return IconCode;\n}\n\n// ─── Simple code viewer (Codex-style gray box) ────────────────────────────────\n\nfunction SimpleCodeViewer({\n text,\n lang,\n className,\n maxHeightClass = \"max-h-56\",\n}: {\n text: string;\n lang: string;\n className?: string;\n maxHeightClass?: string;\n}) {\n return (\n <div\n className={cn(\n \"agent-tool-code overflow-auto rounded-md bg-muted/70 font-mono text-[11px] leading-relaxed text-foreground\",\n maxHeightClass,\n className,\n )}\n >\n {lang !== \"text\" && (\n <div className=\"sticky top-0 z-[1] flex items-center justify-between border-b border-border/40 bg-muted/90 px-2.5 py-1\">\n <span className=\"font-mono text-[10px] uppercase tracking-wide text-muted-foreground/80\">\n {lang}\n </span>\n </div>\n )}\n <HighlightedCodeBlock code={text} lang={lang} />\n </div>\n );\n}\n\nfunction ToolOutputPopover({\n open,\n onOpenChange,\n title,\n payload,\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n payload: ToolDetailPayload;\n children: React.ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n if (await writeClipboardText(payload.copyText)) {\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n }\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n <PopoverContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={6}\n collisionPadding={12}\n className=\"flex max-h-[min(calc(100vh-2rem),var(--radix-popover-content-available-height,75vh))] w-[min(calc(100vw-2rem),var(--radix-popover-content-available-width,760px),760px)] flex-col gap-0 overflow-hidden p-0\"\n >\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b border-border px-4 py-3\">\n <div className=\"truncate text-sm font-medium\">{title}</div>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-7 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={13} /> : <IconCopy size={13} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n <div className=\"min-h-0 flex-1 overflow-hidden p-3\">\n <SimpleCodeViewer\n text={payload.text}\n lang={payload.lang}\n maxHeightClass=\"max-h-[min(70vh,calc(var(--radix-popover-content-available-height,75vh)-4.5rem))]\"\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Collapsible height animation ─────────────────────────────────────────────\n\nexport function AnimatedCollapse({\n open,\n children,\n}: {\n open: boolean;\n children: React.ReactNode;\n}) {\n const [mounted, setMounted] = useState(open);\n\n useLayoutEffect(() => {\n if (open) setMounted(true);\n }, [open]);\n\n const onTransitionEnd = useCallback(\n (event: React.TransitionEvent<HTMLDivElement>) => {\n if (event.propertyName !== \"grid-template-rows\" || open) return;\n setMounted(false);\n },\n [open],\n );\n\n if (!mounted) return null;\n\n return (\n <div\n className=\"agent-chat-collapse\"\n data-state={open ? \"open\" : \"closed\"}\n aria-hidden={!open}\n onTransitionEnd={onTransitionEnd}\n >\n <div className=\"agent-chat-collapse__content\">{children}</div>\n </div>\n );\n}\n\n// ─── Human-in-the-loop approval affordance ────────────────────────────────────\n\n/**\n * Inline Approve/Deny prompt rendered when a `needsApproval` action paused the\n * turn. Approve re-issues the turn with the call's `approvalKey`; Deny dismisses\n * the prompt locally (the action stays un-run).\n */\nfunction ApprovalAffordance({\n toolName,\n approval,\n}: {\n toolName: string;\n approval: { approvalKey: string; dismissed?: boolean };\n}) {\n const ctx = React.useContext(ApprovalContext);\n const [approved, setApproved] = useState(false);\n const [denied, setDenied] = useState(false);\n\n // Once approved, the turn is re-issued; collapse to a quiet note so the user\n // can't double-fire the approval.\n if (approved) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Approved. Re-running {toolName}...\n </div>\n );\n }\n // Deny defaults to local-only (the action simply stays un-run). When the\n // host also provided `onDeny` (e.g. a Code session resolving its own\n // pending approval), it fires alongside the local state.\n if (denied) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Denied. {toolName} did not run.\n </div>\n );\n }\n return (\n <div className=\"mt-1.5 flex items-center gap-2 rounded-md border border-border bg-muted/40 px-2.5 py-1.5\">\n <IconShieldCheck className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"mr-auto text-xs text-muted-foreground\">\n Approve to run {toolName}?\n </span>\n {ctx && (\n <button\n type=\"button\"\n onClick={() => {\n setApproved(true);\n ctx.onApprove(approval.approvalKey);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n <IconCheck className=\"h-3.5 w-3.5\" />\n Approve\n </button>\n )}\n {ctx?.onAlwaysAllow && (\n <button\n type=\"button\"\n onClick={() => {\n setApproved(true);\n ctx.onAlwaysAllow?.(approval.approvalKey);\n }}\n title=\"Approve and always allow this exact command\"\n className={cn(\n \"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors\",\n \"text-foreground hover:bg-muted\",\n )}\n >\n <IconShieldCheck className=\"h-3.5 w-3.5\" />\n Always allow\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => {\n setDenied(true);\n ctx?.onDeny?.(approval.approvalKey);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors\",\n \"text-foreground hover:bg-muted\",\n )}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n Deny\n </button>\n </div>\n );\n}\n\n// ─── ToolCallDisplay ──────────────────────────────────────────────────────────\n\nexport function ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n chatUI,\n isRunning,\n structuredMeta,\n approval,\n repeatCount,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n isRunning: boolean;\n structuredMeta?: Record<string, unknown>;\n approval?: { approvalKey: string; dismissed?: boolean };\n repeatCount?: number;\n}) {\n // Delegate to bespoke cells when structured metadata is present.\n // These must be separate components so hook order in ToolCallDisplayGeneric\n // is always stable (no conditional hook calls).\n const toolKind = structuredMeta?.toolKind as string | undefined;\n const wrapToolDisplay = (children: React.ReactNode) => (\n <ToolLongRunningHintShell toolName={toolName} isRunning={isRunning}>\n {children}\n </ToolLongRunningHintShell>\n );\n if (toolKind === \"bash\") {\n return wrapToolDisplay(\n <BashCell\n meta={\n structuredMeta as unknown as Parameters<typeof BashCell>[0][\"meta\"]\n }\n output={result}\n isRunning={isRunning}\n />,\n );\n }\n if (toolKind === \"edit\") {\n return wrapToolDisplay(\n <EditCell\n meta={\n structuredMeta as unknown as Parameters<typeof EditCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />,\n );\n }\n if (toolKind === \"write\") {\n return wrapToolDisplay(\n <WriteCell\n meta={\n structuredMeta as unknown as Parameters<typeof WriteCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />,\n );\n }\n return wrapToolDisplay(\n <ToolCallDisplayGeneric\n toolName={toolName}\n argsText={argsText}\n args={args}\n result={result}\n mcpApp={mcpApp}\n chatUI={chatUI}\n isRunning={isRunning}\n approval={approval}\n repeatCount={repeatCount}\n />,\n );\n}\n\nfunction ToolCallDisplayGeneric({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n chatUI,\n isRunning,\n approval,\n repeatCount,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n isRunning: boolean;\n approval?: { approvalKey: string; dismissed?: boolean };\n repeatCount?: number;\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const [outputOpen, setOutputOpen] = useState(false);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n // Ignore saved cliAuthUrl values from older tool results. They\n // contain signed callback state and can expire while a chat sits\n // open; the card's hook fetches a fresh signed URL on mount/click.\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const parsedResult = result ? parseJsonText(result) : null;\n const nativeToolContext = {\n toolName,\n args,\n resultText: result,\n resultJson: parsedResult,\n isRunning,\n chatUI,\n };\n const skipRegistryRenderer =\n !isAgentCall && isBuiltinDataWidgetActionRenderer(nativeToolContext);\n const NativeToolRenderer = isAgentCall\n ? null\n : (resolveBuiltinActionChatRenderer(nativeToolContext) ??\n (skipRegistryRenderer ? null : resolveToolRenderer(nativeToolContext)) ??\n resolveBuiltinFallbackToolRenderer(nativeToolContext));\n if (NativeToolRenderer) {\n return <NativeToolRenderer context={nativeToolContext} />;\n }\n\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : humanizeToolName(toolName);\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n const ToolIcon = resolveToolIcon(toolName);\n const outputTitle = `Raw ${toolName} tool call output`;\n\n return (\n <div className=\"group/tool my-0.5 w-full overflow-hidden\">\n {mcpApp && <McpAppRenderer app={mcpApp} className=\"mb-1.5\" />}\n <button\n type=\"button\"\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex w-full items-center gap-1.5 rounded-md py-0.5 text-left text-[13px] text-muted-foreground transition-colors\",\n canExpand && \"hover:text-foreground\",\n isRunning && \"text-muted-foreground\",\n )}\n >\n <span className=\"relative flex size-4 shrink-0 items-center justify-center\">\n {isRunning ? (\n <IconLoader2 className=\"size-3.5 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"size-3.5 text-destructive\" />\n ) : (\n <>\n <ToolIcon\n className={cn(\n \"size-3.5 transition-opacity\",\n canExpand && \"group-hover/tool:opacity-0\",\n )}\n />\n {canExpand && (\n <IconChevronRight\n className={cn(\n \"absolute size-3.5 opacity-0 transition-[opacity,transform] group-hover/tool:opacity-100\",\n isExpanded && \"rotate-90\",\n )}\n />\n )}\n </>\n )}\n </span>\n <span className=\"min-w-0 truncate font-normal\">{displayName}</span>\n {repeatCount && repeatCount > 1 && (\n <span\n className=\"shrink-0 rounded border border-border/60 px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground\"\n title={`Repeated ${repeatCount} times`}\n >\n {repeatCount}x\n </span>\n )}\n </button>\n <AnimatedCollapse open={isExpanded && isAgentCall && hasStreamText}>\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n {markdownModule?.default && remarkGfmFn ? (\n <markdownModule.default\n remarkPlugins={[remarkGfmFn]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </markdownModule.default>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{agentStreamText}</span>\n )}\n </div>\n </AnimatedCollapse>\n <AnimatedCollapse\n open={isExpanded && !isAgentCall && (hasArgs || result !== undefined)}\n >\n <div className=\"mt-1 space-y-2 pl-5\">\n {inputPayload && (\n <SimpleCodeViewer\n text={inputPayload.text}\n lang={inputPayload.lang}\n />\n )}\n {resultPayload && (\n <ToolOutputPopover\n open={outputOpen}\n onOpenChange={setOutputOpen}\n title={outputTitle}\n payload={resultPayload}\n >\n <button\n type=\"button\"\n aria-label={`View ${toolName} output`}\n className=\"inline-flex size-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent hover:text-foreground\"\n >\n <IconCode className=\"size-3.5\" />\n </button>\n </ToolOutputPopover>\n )}\n </div>\n </AnimatedCollapse>\n {approval && (\n <ApprovalAffordance toolName={toolName} approval={approval} />\n )}\n </div>\n );\n}\n\n// ─── ToolCallFallback ──────────────────────────────────────────────────────────\n\nexport function ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n ...rest\n}: ToolCallMessagePartProps & {\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n structuredMeta?: Record<string, unknown>;\n activity?: boolean;\n approval?: { approvalKey: string; dismissed?: boolean };\n repeatCount?: number;\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning =\n result === undefined && (chatRunning || rest.activity === true);\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n mcpApp={rest.mcpApp}\n chatUI={rest.chatUI}\n structuredMeta={rest.structuredMeta}\n isRunning={isRunning}\n approval={rest.approval}\n repeatCount={rest.repeatCount}\n />\n );\n}\n\n// ─── ReconnectStreamMessage ────────────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nexport function ReconnectStreamMessage({\n content,\n}: {\n content: ContentPart[];\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n const latestReasoningPartIndex = content.reduce(\n (latestIndex, part, index) =>\n part.type === \"reasoning\" ? index : latestIndex,\n -1,\n );\n const streamingTextPartIndex =\n content.at(-1)?.type === \"text\" ? content.length - 1 : -1;\n const streamingReasoningPartIndex =\n content.at(-1)?.type === \"reasoning\" ? content.length - 1 : -1;\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n const partStreaming = chatRunning && i === streamingTextPartIndex;\n return (\n <SmoothMarkdownText\n key={`reconnect-text-${i}`}\n text={part.text}\n streaming={partStreaming}\n resetKey={`reconnect-text-${i}`}\n statusType={partStreaming ? \"running\" : \"complete\"}\n />\n );\n }\n if (part.type === \"reasoning\") {\n return (\n <ReasoningCell\n key={`reconnect-reasoning-${i}`}\n text={part.text}\n isStreaming={chatRunning && i === streamingReasoningPartIndex}\n resetKey={`reconnect-reasoning-${i}`}\n defaultOpen={i === latestReasoningPartIndex}\n collapseWhenReplaced={i < latestReasoningPartIndex}\n />\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n mcpApp={part.mcpApp}\n chatUI={part.chatUI}\n structuredMeta={part.structuredMeta}\n isRunning={\n part.result === undefined &&\n (chatRunning || part.activity === true)\n }\n approval={part.approval}\n repeatCount={part.repeatCount}\n />\n );\n }\n return null;\n })}\n </div>\n </div>\n );\n}\n\n// ─── Reasoning / Thinking cell ────────────────────────────────────────────────\n\n/**\n * Completed reasoning and tool calls share one outer \"Worked for…\"\n * disclosure. Reasoning cells inside it render their prose directly so\n * opening that summary never reveals a redundant second disclosure.\n */\nconst WorkSummaryContentContext = React.createContext(false);\n\nexport function ReasoningCell({\n text,\n isStreaming = false,\n resetKey,\n defaultOpen,\n autoCollapse = false,\n collapseWhenReplaced = false,\n durationMs,\n}: {\n text: string;\n isStreaming?: boolean;\n /** Stable identity used to restart the reveal when a new reasoning part mounts. */\n resetKey?: string;\n defaultOpen?: boolean;\n /** Animate closed when a live reasoning segment finishes during a run. */\n autoCollapse?: boolean;\n /** Animate closed when a newer reasoning segment replaces this one. */\n collapseWhenReplaced?: boolean;\n /**\n * Elapsed thinking time in ms, once known. Only meaningful once streaming\n * has finished — callers that track live timing (see ReasoningMessagePart)\n * pass this so the label can read \"Thought for Xs\" instead of \"Thought\".\n * Historical messages with no live timing simply omit it.\n */\n durationMs?: number | null;\n}) {\n const embeddedInWorkSummary = React.useContext(WorkSummaryContentContext);\n const [open, setOpen] = useState(defaultOpen ?? true);\n const wasStreamingRef = useRef(isStreaming);\n const wasReplacedRef = useRef(collapseWhenReplaced);\n const trimmed = text.trim();\n const visibleText = useSmoothStreamingText(\n trimmed,\n isStreaming,\n resetKey ?? \"reasoning\",\n );\n\n useEffect(() => {\n if (autoCollapse && wasStreamingRef.current && !isStreaming) {\n setOpen(false);\n }\n wasStreamingRef.current = isStreaming;\n }, [autoCollapse, isStreaming]);\n\n useEffect(() => {\n if (collapseWhenReplaced && !wasReplacedRef.current) {\n setOpen(false);\n }\n wasReplacedRef.current = collapseWhenReplaced;\n }, [collapseWhenReplaced]);\n\n if (!trimmed && !isStreaming) return null;\n\n if (embeddedInWorkSummary) {\n return (\n <div className=\"pb-1 pl-5 text-[13px] leading-relaxed text-muted-foreground whitespace-pre-wrap\">\n {visibleText || (isStreaming ? \"…\" : \"\")}\n </div>\n );\n }\n\n const label = isStreaming\n ? \"Thinking\"\n : durationMs != null\n ? `Thought for ${formatWorkedDuration(durationMs)}`\n : \"Thought\";\n // Only clamp to a scroll-free \"tail\" view while actively streaming and\n // expanded — once the run finishes the full text is shown, unclamped.\n const showTail = isStreaming && open;\n\n return (\n <div className=\"my-0.5 w-full\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground\"\n >\n <IconChevronRight\n className={cn(\n \"size-3.5 shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n {isStreaming ? (\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n ) : (\n <span>{label}</span>\n )}\n </button>\n <AnimatedCollapse open={open}>\n <div className={cn(\"pl-5 pb-1\", showTail && \"reasoning-cell-tail\")}>\n <div className=\"text-[13px] leading-relaxed text-muted-foreground whitespace-pre-wrap\">\n {visibleText || (isStreaming ? \"…\" : \"\")}\n </div>\n </div>\n </AnimatedCollapse>\n </div>\n );\n}\n\n// ─── Worked-for duration helpers ──────────────────────────────────────────────\n\nexport function formatWorkedDuration(ms: number): string {\n const totalSeconds = Math.max(0, Math.round(ms / 1000));\n if (totalSeconds < 60) {\n return totalSeconds <= 1 ? \"1s\" : `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) {\n if (seconds === 0) return `${minutes}m`;\n return `${minutes}m ${seconds}s`;\n }\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n if (remMinutes === 0) return `${hours}h`;\n return `${hours}h ${remMinutes}m`;\n}\n\nexport function WorkedForSummary({\n durationMs,\n autoCollapse = false,\n children,\n}: {\n durationMs?: number | null;\n /** When true, close the summary after a run has completed. */\n autoCollapse?: boolean;\n children: React.ReactNode;\n}) {\n // Start closed so a remounted completed message never flashes its work\n // details open while auto-collapse settles. If the summary was already\n // open when autoCollapse changes, AnimatedCollapse still animates it shut.\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (autoCollapse) setOpen(false);\n }, [autoCollapse]);\n\n const label =\n durationMs != null && durationMs >= 1000\n ? `Worked for ${formatWorkedDuration(durationMs)}`\n : \"Worked\";\n\n return (\n <div className=\"my-1 w-full\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className=\"flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground\"\n >\n <span>{label}</span>\n <IconChevronRight\n className={cn(\n \"size-3.5 shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n </button>\n <AnimatedCollapse open={open}>\n <WorkSummaryContentContext.Provider value>\n <div className=\"pt-1\">{children}</div>\n </WorkSummaryContentContext.Provider>\n </AnimatedCollapse>\n </div>\n );\n}\n\n// ─── Re-export for AssistantMessage ───────────────────────────────────────────\n// AssistantMessage in AssistantChat.tsx uses FilesChangedSummary directly, so\n// re-export it so AssistantChat.tsx can import from one place.\nexport { FilesChangedSummary };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAwDA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAmOD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAiD,GAClD,EAAE,gBAAgB,sCA4blB"}
1
+ {"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAyDA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAoOD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAiD,GAClD,EAAE,gBAAgB,sCA4blB"}
@@ -1,6 +1,6 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as PopoverPrimitive from "@radix-ui/react-popover";
3
- import { IconApps, IconArrowUpRight, IconBrain, IconBrandJira, IconBrush, IconCalendar, IconCalendarTime, IconChartBar, IconCheck, IconChevronRight, IconClipboardList, IconCode, IconFileText, IconLayoutBoard, IconLoader2, IconLogout, IconMail, IconMessageCircle, IconMicrophone, IconNote, IconPhone, IconPhoto, IconPlus, IconPresentation, IconRoute, IconScreenShare, IconSelector, IconSettings, IconStack2, IconUser, IconUserPlus, IconUsers, IconUsersGroup, IconWorld, } from "@tabler/icons-react";
3
+ import { IconApps, IconArrowUpRight, IconBrain, IconBrandJira, IconBrush, IconCalendar, IconCalendarTime, IconChartBar, IconCheck, IconChevronRight, IconClipboardList, IconCode, IconFileText, IconLayoutBoard, IconListCheck, IconLoader2, IconLogout, IconMail, IconMessageCircle, IconMicrophone, IconNote, IconPhone, IconPhoto, IconPlus, IconPresentation, IconRoute, IconScreenShare, IconSelector, IconSettings, IconStack2, IconUser, IconUserPlus, IconUsers, IconUsersGroup, IconWorld, } from "@tabler/icons-react";
4
4
  import { useState } from "react";
5
5
  import { useNavigate } from "react-router";
6
6
  import { agentNativePath } from "../api-path.js";
@@ -47,6 +47,7 @@ const APP_ICON_MAP = {
47
47
  CalendarTime: IconCalendarTime,
48
48
  Globe: IconWorld,
49
49
  Photo: IconPhoto,
50
+ ListCheck: IconListCheck,
50
51
  };
51
52
  function appMenuIcon(app) {
52
53
  if (app.icon)
@@ -1 +1 @@
1
- {"version":3,"file":"OrgSwitcher.js","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport {\n IconApps,\n IconArrowUpRight,\n IconBrain,\n IconBrandJira,\n IconBrush,\n IconCalendar,\n IconCalendarTime,\n IconChartBar,\n IconCheck,\n IconChevronRight,\n IconClipboardList,\n IconCode,\n IconFileText,\n IconLayoutBoard,\n IconLoader2,\n IconLogout,\n IconMail,\n IconMessageCircle,\n IconMicrophone,\n IconNote,\n IconPhone,\n IconPhoto,\n IconPlus,\n IconPresentation,\n IconRoute,\n IconScreenShare,\n IconSelector,\n IconSettings,\n IconStack2,\n IconUser,\n IconUserPlus,\n IconUsers,\n IconUsersGroup,\n IconWorld,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n useOrg,\n useSwitchOrg,\n useCreateOrg,\n useInviteMember,\n useAcceptInvitation,\n useJoinByDomain,\n} from \"./hooks.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 the Organization tab inside Settings. Templates with an\n * established org surface can pass their own path; pass `null` to only open\n * 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 SWITCHER_BUTTON_CLASS =\n \"flex w-full items-center gap-2 rounded-md border border-border/70 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-60 cursor-pointer\";\n\nconst DEFAULT_ORGANIZATION_SETTINGS_PATH = \"/settings#organization\";\n\nconst APP_ICON_MAP: Record<string, typeof IconApps> = {\n Mail: IconMail,\n CalendarDays: IconCalendar,\n FileText: IconFileText,\n LayoutBoard: IconLayoutBoard,\n BarChart2: IconChartBar,\n GalleryHorizontal: IconPresentation,\n BrandJira: IconBrandJira,\n ClipboardList: IconClipboardList,\n Users: IconUsers,\n Code: IconCode,\n MessageCircle: IconMessageCircle,\n Route: IconRoute,\n ScreenShare: IconScreenShare,\n Brush: IconBrush,\n Brain: IconBrain,\n Phone: IconPhone,\n Note: IconNote,\n Microphone: IconMicrophone,\n CalendarTime: IconCalendarTime,\n Globe: IconWorld,\n Photo: IconPhoto,\n};\n\nfunction appMenuIcon(app: OrgSwitcherAppLink): typeof IconApps {\n if (app.icon) return APP_ICON_MAP[app.icon] ?? IconStack2;\n return app.isDispatch ? IconMessageCircle : IconStack2;\n}\n\nfunction organizationSettingsPath(path: string): string {\n if (path.includes(\"#\")) return path;\n const pathname = path.split(\"?\")[0]?.replace(/\\/+$/, \"\");\n return pathname === \"/settings\" ? `${path}#organization` : path;\n}\n\nfunction AppMenuLink({\n app,\n onNavigate,\n}: {\n app: OrgSwitcherAppLink;\n onNavigate: () => void;\n}) {\n const Icon = appMenuIcon(app);\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-start\">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 rtl:-scale-x-100\" />\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\nfunction ReservedOrgSwitcherSpace({ className }: { className?: string }) {\n return <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />;\n}\n\nfunction OrgSwitcherLoadingPlaceholder({ className }: { className?: string }) {\n return (\n <button\n type=\"button\"\n disabled\n aria-label=\"Loading organization\"\n className={`${SWITCHER_BUTTON_CLASS} animate-pulse ${className ?? \"\"}`}\n >\n <IconUsersGroup className=\"h-3.5 w-3.5 shrink-0 opacity-60\" />\n <span className=\"h-3 min-w-0 flex-1 rounded-sm bg-muted-foreground/20\" />\n <IconSelector className=\"h-3 w-3 shrink-0 opacity-30\" />\n </button>\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 <OrgSwitcherLoadingPlaceholder className={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 <ReservedOrgSwitcherSpace className={className} />\n ) : null;\n }\n if (\n hideWhenSingle &&\n orgCount < 2 &&\n pendingInvitations.length === 0 &&\n domainMatches.length === 0\n ) {\n return reserveSpace ? (\n <ReservedOrgSwitcherSpace className={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 ? IconUsersGroup : 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={`${SWITCHER_BUTTON_CLASS} ${className ?? \"\"}`}\n >\n <ButtonIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1 text-start\">{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-start\">\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 <IconUsersGroup className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-start\">\n {o.orgName}\n </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 <IconUsersGroup 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 <IconUsersGroup 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 if (organizationSettingsHref) {\n navigate(organizationSettingsHref);\n } else {\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 }\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-start\">\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-start\">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-start\">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 rtl:-scale-x-100\" />\n )}\n <span className=\"flex-1 text-start\">\n Sign out\n {org.email ? (\n <span className=\"ms-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
+ {"version":3,"file":"OrgSwitcher.js","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport {\n IconApps,\n IconArrowUpRight,\n IconBrain,\n IconBrandJira,\n IconBrush,\n IconCalendar,\n IconCalendarTime,\n IconChartBar,\n IconCheck,\n IconChevronRight,\n IconClipboardList,\n IconCode,\n IconFileText,\n IconLayoutBoard,\n IconListCheck,\n IconLoader2,\n IconLogout,\n IconMail,\n IconMessageCircle,\n IconMicrophone,\n IconNote,\n IconPhone,\n IconPhoto,\n IconPlus,\n IconPresentation,\n IconRoute,\n IconScreenShare,\n IconSelector,\n IconSettings,\n IconStack2,\n IconUser,\n IconUserPlus,\n IconUsers,\n IconUsersGroup,\n IconWorld,\n} from \"@tabler/icons-react\";\nimport { useState } from \"react\";\nimport { useNavigate } from \"react-router\";\n\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n useOrg,\n useSwitchOrg,\n useCreateOrg,\n useInviteMember,\n useAcceptInvitation,\n useJoinByDomain,\n} from \"./hooks.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 the Organization tab inside Settings. Templates with an\n * established org surface can pass their own path; pass `null` to only open\n * 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 SWITCHER_BUTTON_CLASS =\n \"flex w-full items-center gap-2 rounded-md border border-border/70 px-2.5 py-1.5 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-60 cursor-pointer\";\n\nconst DEFAULT_ORGANIZATION_SETTINGS_PATH = \"/settings#organization\";\n\nconst APP_ICON_MAP: Record<string, typeof IconApps> = {\n Mail: IconMail,\n CalendarDays: IconCalendar,\n FileText: IconFileText,\n LayoutBoard: IconLayoutBoard,\n BarChart2: IconChartBar,\n GalleryHorizontal: IconPresentation,\n BrandJira: IconBrandJira,\n ClipboardList: IconClipboardList,\n Users: IconUsers,\n Code: IconCode,\n MessageCircle: IconMessageCircle,\n Route: IconRoute,\n ScreenShare: IconScreenShare,\n Brush: IconBrush,\n Brain: IconBrain,\n Phone: IconPhone,\n Note: IconNote,\n Microphone: IconMicrophone,\n CalendarTime: IconCalendarTime,\n Globe: IconWorld,\n Photo: IconPhoto,\n ListCheck: IconListCheck,\n};\n\nfunction appMenuIcon(app: OrgSwitcherAppLink): typeof IconApps {\n if (app.icon) return APP_ICON_MAP[app.icon] ?? IconStack2;\n return app.isDispatch ? IconMessageCircle : IconStack2;\n}\n\nfunction organizationSettingsPath(path: string): string {\n if (path.includes(\"#\")) return path;\n const pathname = path.split(\"?\")[0]?.replace(/\\/+$/, \"\");\n return pathname === \"/settings\" ? `${path}#organization` : path;\n}\n\nfunction AppMenuLink({\n app,\n onNavigate,\n}: {\n app: OrgSwitcherAppLink;\n onNavigate: () => void;\n}) {\n const Icon = appMenuIcon(app);\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-start\">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 rtl:-scale-x-100\" />\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\nfunction ReservedOrgSwitcherSpace({ className }: { className?: string }) {\n return <div aria-hidden=\"true\" className={`h-8 ${className ?? \"\"}`} />;\n}\n\nfunction OrgSwitcherLoadingPlaceholder({ className }: { className?: string }) {\n return (\n <button\n type=\"button\"\n disabled\n aria-label=\"Loading organization\"\n className={`${SWITCHER_BUTTON_CLASS} animate-pulse ${className ?? \"\"}`}\n >\n <IconUsersGroup className=\"h-3.5 w-3.5 shrink-0 opacity-60\" />\n <span className=\"h-3 min-w-0 flex-1 rounded-sm bg-muted-foreground/20\" />\n <IconSelector className=\"h-3 w-3 shrink-0 opacity-30\" />\n </button>\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 <OrgSwitcherLoadingPlaceholder className={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 <ReservedOrgSwitcherSpace className={className} />\n ) : null;\n }\n if (\n hideWhenSingle &&\n orgCount < 2 &&\n pendingInvitations.length === 0 &&\n domainMatches.length === 0\n ) {\n return reserveSpace ? (\n <ReservedOrgSwitcherSpace className={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 ? IconUsersGroup : 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={`${SWITCHER_BUTTON_CLASS} ${className ?? \"\"}`}\n >\n <ButtonIcon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate flex-1 text-start\">{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-start\">\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 <IconUsersGroup className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"truncate flex-1 text-start\">\n {o.orgName}\n </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 <IconUsersGroup 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 <IconUsersGroup 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 if (organizationSettingsHref) {\n navigate(organizationSettingsHref);\n } else {\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 }\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-start\">\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-start\">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-start\">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 rtl:-scale-x-100\" />\n )}\n <span className=\"flex-1 text-start\">\n Sign out\n {org.email ? (\n <span className=\"ms-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"]}
@@ -13,8 +13,8 @@
13
13
  * Body: { json: any, fieldName?: string, type?: "map"|"array", requestSource?: string }
14
14
  */
15
15
  export declare const postCollabJson: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
16
- ok?: undefined;
17
16
  error: string;
17
+ ok?: undefined;
18
18
  } | {
19
19
  error?: undefined;
20
20
  ok: boolean;