@agent-native/core 0.76.2 → 0.76.4

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 (429) hide show
  1. package/corpus/core/CHANGELOG.md +14 -0
  2. package/corpus/core/package.json +1 -1
  3. package/corpus/core/src/agent/durable-background.ts +8 -7
  4. package/corpus/core/src/client/AgentPanel.tsx +3 -3
  5. package/corpus/core/src/client/AgentTaskCard.tsx +2 -1
  6. package/corpus/core/src/client/AppearancePicker.tsx +1 -1
  7. package/corpus/core/src/client/AssistantChat.tsx +3 -3
  8. package/corpus/core/src/client/CommandMenu.tsx +4 -4
  9. package/corpus/core/src/client/ErrorBoundary.tsx +1 -1
  10. package/corpus/core/src/client/MultiTabAssistantChat.tsx +11 -11
  11. package/corpus/core/src/client/NewWorkspaceAppFlow.tsx +5 -5
  12. package/corpus/core/src/client/components/ui/dropdown-menu.tsx +9 -9
  13. package/corpus/core/src/client/components/ui/sheet.tsx +1 -1
  14. package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +6 -6
  15. package/corpus/core/src/client/composer/MentionPopover.tsx +4 -4
  16. package/corpus/core/src/client/composer/PastedTextChip.tsx +3 -3
  17. package/corpus/core/src/client/composer/PromptComposer.tsx +3 -3
  18. package/corpus/core/src/client/composer/TiptapComposer.tsx +16 -16
  19. package/corpus/core/src/client/guided-questions.tsx +6 -8
  20. package/corpus/core/src/client/i18n.tsx +2 -2
  21. package/corpus/core/src/client/integrations/IntegrationCard.tsx +2 -2
  22. package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +4 -4
  23. package/corpus/core/src/client/notifications/NotificationsBell.tsx +3 -3
  24. package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +3 -3
  25. package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +17 -10
  26. package/corpus/core/src/client/org/OrgSwitcher.tsx +13 -11
  27. package/corpus/core/src/client/org/TeamPage.tsx +2 -2
  28. package/corpus/core/src/client/settings/AgentsSection.tsx +3 -3
  29. package/corpus/core/src/client/settings/AutomationsSection.tsx +3 -3
  30. package/corpus/core/src/client/settings/SecretsSection.tsx +2 -2
  31. package/corpus/core/src/client/settings/SettingsPanel.tsx +5 -7
  32. package/corpus/core/src/client/settings/SettingsSection.tsx +1 -1
  33. package/corpus/core/src/client/settings/UsageSection.tsx +3 -3
  34. package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +3 -3
  35. package/corpus/core/src/client/sharing/ShareButton.tsx +7 -7
  36. package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
  37. package/corpus/core/src/deploy/build.ts +2 -2
  38. package/corpus/core/src/styles/agent-conversation.css +10 -10
  39. package/corpus/core/src/styles/blocks.css +2 -2
  40. package/corpus/core/src/styles/rich-markdown-editor.css +2 -2
  41. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +1 -1
  42. package/corpus/templates/analytics/app/components/ui/alert-dialog.tsx +1 -1
  43. package/corpus/templates/analytics/app/components/ui/alert.tsx +1 -1
  44. package/corpus/templates/analytics/app/components/ui/breadcrumb.tsx +1 -1
  45. package/corpus/templates/analytics/app/components/ui/calendar.tsx +6 -6
  46. package/corpus/templates/analytics/app/components/ui/carousel.tsx +6 -6
  47. package/corpus/templates/analytics/app/components/ui/command.tsx +2 -2
  48. package/corpus/templates/analytics/app/components/ui/context-menu.tsx +9 -9
  49. package/corpus/templates/analytics/app/components/ui/date-picker.tsx +1 -1
  50. package/corpus/templates/analytics/app/components/ui/dialog.tsx +2 -2
  51. package/corpus/templates/analytics/app/components/ui/drawer.tsx +1 -1
  52. package/corpus/templates/analytics/app/components/ui/dropdown-menu.tsx +9 -9
  53. package/corpus/templates/analytics/app/components/ui/input-otp.tsx +1 -1
  54. package/corpus/templates/analytics/app/components/ui/menubar.tsx +9 -9
  55. package/corpus/templates/analytics/app/components/ui/navigation-menu.tsx +3 -3
  56. package/corpus/templates/analytics/app/components/ui/pagination.tsx +4 -4
  57. package/corpus/templates/analytics/app/components/ui/scroll-area.tsx +1 -1
  58. package/corpus/templates/analytics/app/components/ui/select.tsx +3 -3
  59. package/corpus/templates/analytics/app/components/ui/sheet.tsx +2 -2
  60. package/corpus/templates/analytics/app/components/ui/sidebar.tsx +6 -6
  61. package/corpus/templates/analytics/app/components/ui/table.tsx +2 -2
  62. package/corpus/templates/analytics/app/components/ui/toast.tsx +3 -3
  63. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -2
  64. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +12 -12
  65. package/corpus/templates/assets/app/components/ui/alert-dialog.tsx +1 -1
  66. package/corpus/templates/assets/app/components/ui/alert.tsx +1 -1
  67. package/corpus/templates/assets/app/components/ui/breadcrumb.tsx +1 -1
  68. package/corpus/templates/assets/app/components/ui/dialog.tsx +2 -2
  69. package/corpus/templates/assets/app/components/ui/dropdown-menu.tsx +9 -9
  70. package/corpus/templates/assets/app/components/ui/pagination.tsx +4 -4
  71. package/corpus/templates/assets/app/components/ui/scroll-area.tsx +1 -1
  72. package/corpus/templates/assets/app/components/ui/select.tsx +3 -3
  73. package/corpus/templates/assets/app/components/ui/sheet.tsx +2 -2
  74. package/corpus/templates/assets/app/components/ui/table.tsx +2 -2
  75. package/corpus/templates/assets/app/routes/library.tsx +3 -3
  76. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  77. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +5 -5
  78. package/corpus/templates/brain/app/components/ui/dropdown-menu.tsx +9 -9
  79. package/corpus/templates/brain/app/components/ui/select.tsx +3 -3
  80. package/corpus/templates/brain/app/components/ui/sheet.tsx +2 -2
  81. package/corpus/templates/brain/app/components/ui/table.tsx +2 -2
  82. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +6 -6
  83. package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +3 -3
  84. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +11 -9
  85. package/corpus/templates/calendar/app/components/ui/alert-dialog.tsx +1 -1
  86. package/corpus/templates/calendar/app/components/ui/alert.tsx +1 -1
  87. package/corpus/templates/calendar/app/components/ui/breadcrumb.tsx +1 -1
  88. package/corpus/templates/calendar/app/components/ui/calendar.tsx +5 -5
  89. package/corpus/templates/calendar/app/components/ui/carousel.tsx +6 -6
  90. package/corpus/templates/calendar/app/components/ui/command.tsx +2 -2
  91. package/corpus/templates/calendar/app/components/ui/context-menu.tsx +9 -9
  92. package/corpus/templates/calendar/app/components/ui/dialog.tsx +2 -2
  93. package/corpus/templates/calendar/app/components/ui/drawer.tsx +1 -1
  94. package/corpus/templates/calendar/app/components/ui/dropdown-menu.tsx +9 -9
  95. package/corpus/templates/calendar/app/components/ui/input-otp.tsx +1 -1
  96. package/corpus/templates/calendar/app/components/ui/menubar.tsx +9 -9
  97. package/corpus/templates/calendar/app/components/ui/navigation-menu.tsx +3 -3
  98. package/corpus/templates/calendar/app/components/ui/pagination.tsx +4 -4
  99. package/corpus/templates/calendar/app/components/ui/scroll-area.tsx +1 -1
  100. package/corpus/templates/calendar/app/components/ui/select.tsx +3 -3
  101. package/corpus/templates/calendar/app/components/ui/sheet.tsx +2 -2
  102. package/corpus/templates/calendar/app/components/ui/sidebar.tsx +6 -6
  103. package/corpus/templates/calendar/app/components/ui/sonner.tsx +1 -1
  104. package/corpus/templates/calendar/app/components/ui/table.tsx +2 -2
  105. package/corpus/templates/calendar/app/components/ui/toast.tsx +3 -3
  106. package/corpus/templates/calendar/app/pages/Settings.tsx +5 -5
  107. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +9 -9
  108. package/corpus/templates/chat/app/components/ui/alert-dialog.tsx +1 -1
  109. package/corpus/templates/chat/app/components/ui/alert.tsx +1 -1
  110. package/corpus/templates/chat/app/components/ui/breadcrumb.tsx +1 -1
  111. package/corpus/templates/chat/app/components/ui/calendar.tsx +5 -5
  112. package/corpus/templates/chat/app/components/ui/carousel.tsx +6 -6
  113. package/corpus/templates/chat/app/components/ui/command.tsx +2 -2
  114. package/corpus/templates/chat/app/components/ui/context-menu.tsx +9 -9
  115. package/corpus/templates/chat/app/components/ui/dialog.tsx +2 -2
  116. package/corpus/templates/chat/app/components/ui/drawer.tsx +1 -1
  117. package/corpus/templates/chat/app/components/ui/dropdown-menu.tsx +9 -9
  118. package/corpus/templates/chat/app/components/ui/input-otp.tsx +1 -1
  119. package/corpus/templates/chat/app/components/ui/menubar.tsx +9 -9
  120. package/corpus/templates/chat/app/components/ui/navigation-menu.tsx +3 -3
  121. package/corpus/templates/chat/app/components/ui/pagination.tsx +4 -4
  122. package/corpus/templates/chat/app/components/ui/scroll-area.tsx +1 -1
  123. package/corpus/templates/chat/app/components/ui/select.tsx +3 -3
  124. package/corpus/templates/chat/app/components/ui/sheet.tsx +2 -2
  125. package/corpus/templates/chat/app/components/ui/sidebar.tsx +6 -6
  126. package/corpus/templates/chat/app/components/ui/table.tsx +2 -2
  127. package/corpus/templates/chat/app/components/ui/toast.tsx +3 -3
  128. package/corpus/templates/clips/app/components/capture-install-options.tsx +3 -3
  129. package/corpus/templates/clips/app/components/editable-recording-title.tsx +1 -1
  130. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +3 -3
  131. package/corpus/templates/clips/app/components/library/folder-tree.tsx +5 -5
  132. package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
  133. package/corpus/templates/clips/app/components/library/organization-switcher.tsx +4 -4
  134. package/corpus/templates/clips/app/components/library/recording-card.tsx +11 -11
  135. package/corpus/templates/clips/app/components/library/search-bar.tsx +4 -4
  136. package/corpus/templates/clips/app/components/library/space-card.tsx +1 -1
  137. package/corpus/templates/clips/app/components/library/tag-input.tsx +1 -1
  138. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +2 -2
  139. package/corpus/templates/clips/app/components/recorder/camera-visualizer.tsx +2 -2
  140. package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +1 -1
  141. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +4 -4
  142. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -1
  143. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +2 -2
  144. package/corpus/templates/clips/app/components/ui/alert-dialog.tsx +1 -1
  145. package/corpus/templates/clips/app/components/ui/alert.tsx +1 -1
  146. package/corpus/templates/clips/app/components/ui/breadcrumb.tsx +1 -1
  147. package/corpus/templates/clips/app/components/ui/calendar.tsx +5 -5
  148. package/corpus/templates/clips/app/components/ui/carousel.tsx +6 -6
  149. package/corpus/templates/clips/app/components/ui/command.tsx +2 -2
  150. package/corpus/templates/clips/app/components/ui/context-menu.tsx +9 -9
  151. package/corpus/templates/clips/app/components/ui/dialog.tsx +2 -2
  152. package/corpus/templates/clips/app/components/ui/drawer.tsx +1 -1
  153. package/corpus/templates/clips/app/components/ui/dropdown-menu.tsx +9 -9
  154. package/corpus/templates/clips/app/components/ui/input-otp.tsx +1 -1
  155. package/corpus/templates/clips/app/components/ui/menubar.tsx +9 -9
  156. package/corpus/templates/clips/app/components/ui/navigation-menu.tsx +3 -3
  157. package/corpus/templates/clips/app/components/ui/pagination.tsx +4 -4
  158. package/corpus/templates/clips/app/components/ui/scroll-area.tsx +1 -1
  159. package/corpus/templates/clips/app/components/ui/select.tsx +3 -3
  160. package/corpus/templates/clips/app/components/ui/sheet.tsx +2 -2
  161. package/corpus/templates/clips/app/components/ui/sidebar.tsx +6 -6
  162. package/corpus/templates/clips/app/components/ui/table.tsx +2 -2
  163. package/corpus/templates/clips/app/components/ui/toast.tsx +3 -3
  164. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +1 -1
  165. package/corpus/templates/clips/app/components/workspace/insights-hub.tsx +2 -2
  166. package/corpus/templates/clips/app/components/workspace/invite-dialog.tsx +2 -2
  167. package/corpus/templates/clips/app/components/workspace/top-creators-table.tsx +6 -6
  168. package/corpus/templates/clips/app/components/workspace/top-videos-table.tsx +2 -2
  169. package/corpus/templates/clips/app/routes/_app.dictate.tsx +4 -4
  170. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +7 -7
  171. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -1
  172. package/corpus/templates/clips/app/routes/download.tsx +2 -2
  173. package/corpus/templates/clips/app/routes/invite.$token.tsx +2 -2
  174. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +3 -3
  175. package/corpus/templates/clips/app/routes/record.tsx +5 -5
  176. package/corpus/templates/clips/app/routes/share.$shareId.tsx +7 -7
  177. package/corpus/templates/content/app/components/EmptyState.tsx +1 -1
  178. package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +17 -17
  179. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -2
  180. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +10 -9
  181. package/corpus/templates/content/app/components/sidebar/DocumentTreeItem.tsx +10 -6
  182. package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +3 -3
  183. package/corpus/templates/content/app/components/ui/alert-dialog.tsx +1 -1
  184. package/corpus/templates/content/app/components/ui/dialog.tsx +2 -2
  185. package/corpus/templates/content/app/components/ui/dropdown-menu.tsx +9 -9
  186. package/corpus/templates/content/app/components/ui/scroll-area.tsx +1 -1
  187. package/corpus/templates/content/app/components/ui/sheet.tsx +2 -2
  188. package/corpus/templates/content/app/components/ui/table.tsx +2 -2
  189. package/corpus/templates/content/app/components/ui/toast.tsx +3 -3
  190. package/corpus/templates/design/app/components/layout/Layout.tsx +3 -3
  191. package/corpus/templates/design/app/components/layout/Sidebar.tsx +3 -3
  192. package/corpus/templates/design/app/components/ui/alert-dialog.tsx +1 -1
  193. package/corpus/templates/design/app/components/ui/alert.tsx +1 -1
  194. package/corpus/templates/design/app/components/ui/breadcrumb.tsx +1 -1
  195. package/corpus/templates/design/app/components/ui/calendar.tsx +5 -5
  196. package/corpus/templates/design/app/components/ui/carousel.tsx +6 -6
  197. package/corpus/templates/design/app/components/ui/command.tsx +2 -2
  198. package/corpus/templates/design/app/components/ui/context-menu.tsx +9 -9
  199. package/corpus/templates/design/app/components/ui/dialog.tsx +2 -2
  200. package/corpus/templates/design/app/components/ui/drawer.tsx +1 -1
  201. package/corpus/templates/design/app/components/ui/dropdown-menu.tsx +9 -9
  202. package/corpus/templates/design/app/components/ui/input-otp.tsx +1 -1
  203. package/corpus/templates/design/app/components/ui/menubar.tsx +9 -9
  204. package/corpus/templates/design/app/components/ui/navigation-menu.tsx +3 -3
  205. package/corpus/templates/design/app/components/ui/pagination.tsx +4 -4
  206. package/corpus/templates/design/app/components/ui/scroll-area.tsx +1 -1
  207. package/corpus/templates/design/app/components/ui/select.tsx +3 -3
  208. package/corpus/templates/design/app/components/ui/sheet.tsx +2 -2
  209. package/corpus/templates/design/app/components/ui/sidebar.tsx +6 -6
  210. package/corpus/templates/design/app/components/ui/table.tsx +2 -2
  211. package/corpus/templates/design/app/components/ui/toast.tsx +3 -3
  212. package/corpus/templates/design/app/pages/DesignSystems.tsx +6 -8
  213. package/corpus/templates/design/app/pages/Index.tsx +8 -8
  214. package/corpus/templates/design/app/pages/NotFound.tsx +1 -1
  215. package/corpus/templates/design/app/pages/Templates.tsx +2 -2
  216. package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
  217. package/corpus/templates/forms/app/components/ui/alert-dialog.tsx +1 -1
  218. package/corpus/templates/forms/app/components/ui/alert.tsx +1 -1
  219. package/corpus/templates/forms/app/components/ui/breadcrumb.tsx +1 -1
  220. package/corpus/templates/forms/app/components/ui/calendar.tsx +9 -6
  221. package/corpus/templates/forms/app/components/ui/carousel.tsx +6 -6
  222. package/corpus/templates/forms/app/components/ui/command.tsx +2 -2
  223. package/corpus/templates/forms/app/components/ui/context-menu.tsx +9 -9
  224. package/corpus/templates/forms/app/components/ui/dialog.tsx +2 -2
  225. package/corpus/templates/forms/app/components/ui/drawer.tsx +1 -1
  226. package/corpus/templates/forms/app/components/ui/dropdown-menu.tsx +9 -9
  227. package/corpus/templates/forms/app/components/ui/input-otp.tsx +1 -1
  228. package/corpus/templates/forms/app/components/ui/menubar.tsx +9 -9
  229. package/corpus/templates/forms/app/components/ui/navigation-menu.tsx +3 -3
  230. package/corpus/templates/forms/app/components/ui/pagination.tsx +4 -4
  231. package/corpus/templates/forms/app/components/ui/scroll-area.tsx +1 -1
  232. package/corpus/templates/forms/app/components/ui/select.tsx +3 -3
  233. package/corpus/templates/forms/app/components/ui/sheet.tsx +2 -2
  234. package/corpus/templates/forms/app/components/ui/sidebar.tsx +6 -6
  235. package/corpus/templates/forms/app/components/ui/table.tsx +2 -2
  236. package/corpus/templates/forms/app/components/ui/toast.tsx +3 -3
  237. package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +18 -18
  238. package/corpus/templates/forms/app/pages/FormsListPage.tsx +9 -9
  239. package/corpus/templates/macros/app/components/layout/AppLayout.tsx +4 -4
  240. package/corpus/templates/macros/app/components/ui/alert-dialog.tsx +1 -1
  241. package/corpus/templates/macros/app/components/ui/alert.tsx +1 -1
  242. package/corpus/templates/macros/app/components/ui/breadcrumb.tsx +1 -1
  243. package/corpus/templates/macros/app/components/ui/command.tsx +2 -2
  244. package/corpus/templates/macros/app/components/ui/context-menu.tsx +9 -9
  245. package/corpus/templates/macros/app/components/ui/dialog.tsx +2 -2
  246. package/corpus/templates/macros/app/components/ui/drawer.tsx +1 -1
  247. package/corpus/templates/macros/app/components/ui/dropdown-menu.tsx +9 -9
  248. package/corpus/templates/macros/app/components/ui/menubar.tsx +9 -9
  249. package/corpus/templates/macros/app/components/ui/navigation-menu.tsx +3 -3
  250. package/corpus/templates/macros/app/components/ui/pagination.tsx +4 -4
  251. package/corpus/templates/macros/app/components/ui/scroll-area.tsx +1 -1
  252. package/corpus/templates/macros/app/components/ui/select.tsx +3 -3
  253. package/corpus/templates/macros/app/components/ui/sheet.tsx +2 -2
  254. package/corpus/templates/macros/app/components/ui/table.tsx +2 -2
  255. package/corpus/templates/macros/app/components/ui/toast.tsx +3 -3
  256. package/corpus/templates/macros/app/routes/_index.tsx +2 -2
  257. package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
  258. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +6 -6
  259. package/corpus/templates/mail/app/components/email/AttachmentStrip.tsx +2 -2
  260. package/corpus/templates/mail/app/components/email/EmailListItem.tsx +5 -5
  261. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +5 -5
  262. package/corpus/templates/mail/app/components/email/MobileActionBar.tsx +3 -3
  263. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +10 -10
  264. package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +1 -1
  265. package/corpus/templates/mail/app/components/layout/SearchBar.tsx +3 -3
  266. package/corpus/templates/mail/app/components/ui/alert-dialog.tsx +1 -1
  267. package/corpus/templates/mail/app/components/ui/alert.tsx +1 -1
  268. package/corpus/templates/mail/app/components/ui/breadcrumb.tsx +1 -1
  269. package/corpus/templates/mail/app/components/ui/calendar.tsx +4 -4
  270. package/corpus/templates/mail/app/components/ui/carousel.tsx +6 -6
  271. package/corpus/templates/mail/app/components/ui/command.tsx +2 -2
  272. package/corpus/templates/mail/app/components/ui/context-menu.tsx +9 -9
  273. package/corpus/templates/mail/app/components/ui/dialog.tsx +2 -2
  274. package/corpus/templates/mail/app/components/ui/drawer.tsx +1 -1
  275. package/corpus/templates/mail/app/components/ui/dropdown-menu.tsx +9 -9
  276. package/corpus/templates/mail/app/components/ui/input-otp.tsx +1 -1
  277. package/corpus/templates/mail/app/components/ui/menubar.tsx +9 -9
  278. package/corpus/templates/mail/app/components/ui/navigation-menu.tsx +3 -3
  279. package/corpus/templates/mail/app/components/ui/pagination.tsx +4 -4
  280. package/corpus/templates/mail/app/components/ui/scroll-area.tsx +1 -1
  281. package/corpus/templates/mail/app/components/ui/select.tsx +3 -3
  282. package/corpus/templates/mail/app/components/ui/sheet.tsx +2 -2
  283. package/corpus/templates/mail/app/components/ui/sidebar.tsx +6 -6
  284. package/corpus/templates/mail/app/components/ui/sonner.tsx +2 -2
  285. package/corpus/templates/mail/app/components/ui/table.tsx +2 -2
  286. package/corpus/templates/mail/app/components/ui/toast.tsx +3 -3
  287. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +10 -10
  288. package/corpus/templates/plan/app/components/ui/alert-dialog.tsx +1 -1
  289. package/corpus/templates/plan/app/components/ui/alert.tsx +1 -1
  290. package/corpus/templates/plan/app/components/ui/breadcrumb.tsx +1 -1
  291. package/corpus/templates/plan/app/components/ui/calendar.tsx +5 -5
  292. package/corpus/templates/plan/app/components/ui/carousel.tsx +6 -6
  293. package/corpus/templates/plan/app/components/ui/command.tsx +2 -2
  294. package/corpus/templates/plan/app/components/ui/context-menu.tsx +9 -9
  295. package/corpus/templates/plan/app/components/ui/dialog.tsx +2 -2
  296. package/corpus/templates/plan/app/components/ui/drawer.tsx +1 -1
  297. package/corpus/templates/plan/app/components/ui/dropdown-menu.tsx +9 -9
  298. package/corpus/templates/plan/app/components/ui/input-otp.tsx +1 -1
  299. package/corpus/templates/plan/app/components/ui/menubar.tsx +9 -9
  300. package/corpus/templates/plan/app/components/ui/navigation-menu.tsx +3 -3
  301. package/corpus/templates/plan/app/components/ui/pagination.tsx +4 -4
  302. package/corpus/templates/plan/app/components/ui/scroll-area.tsx +1 -1
  303. package/corpus/templates/plan/app/components/ui/select.tsx +3 -3
  304. package/corpus/templates/plan/app/components/ui/sheet.tsx +2 -2
  305. package/corpus/templates/plan/app/components/ui/sidebar.tsx +6 -6
  306. package/corpus/templates/plan/app/components/ui/table.tsx +2 -2
  307. package/corpus/templates/plan/app/components/ui/toast.tsx +3 -3
  308. package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
  309. package/corpus/templates/slides/app/components/ui/alert-dialog.tsx +1 -1
  310. package/corpus/templates/slides/app/components/ui/alert.tsx +1 -1
  311. package/corpus/templates/slides/app/components/ui/breadcrumb.tsx +1 -1
  312. package/corpus/templates/slides/app/components/ui/calendar.tsx +5 -5
  313. package/corpus/templates/slides/app/components/ui/carousel.tsx +6 -6
  314. package/corpus/templates/slides/app/components/ui/command.tsx +2 -2
  315. package/corpus/templates/slides/app/components/ui/context-menu.tsx +9 -9
  316. package/corpus/templates/slides/app/components/ui/dialog.tsx +2 -2
  317. package/corpus/templates/slides/app/components/ui/drawer.tsx +1 -1
  318. package/corpus/templates/slides/app/components/ui/dropdown-menu.tsx +9 -9
  319. package/corpus/templates/slides/app/components/ui/input-otp.tsx +1 -1
  320. package/corpus/templates/slides/app/components/ui/menubar.tsx +9 -9
  321. package/corpus/templates/slides/app/components/ui/navigation-menu.tsx +3 -3
  322. package/corpus/templates/slides/app/components/ui/pagination.tsx +4 -4
  323. package/corpus/templates/slides/app/components/ui/scroll-area.tsx +1 -1
  324. package/corpus/templates/slides/app/components/ui/select.tsx +3 -3
  325. package/corpus/templates/slides/app/components/ui/sheet.tsx +2 -2
  326. package/corpus/templates/slides/app/components/ui/sidebar.tsx +6 -6
  327. package/corpus/templates/slides/app/components/ui/table.tsx +2 -2
  328. package/corpus/templates/slides/app/components/ui/toast.tsx +3 -3
  329. package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +1 -1
  330. package/corpus/templates/videos/app/components/ui/alert.tsx +1 -1
  331. package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +1 -1
  332. package/corpus/templates/videos/app/components/ui/calendar.tsx +5 -5
  333. package/corpus/templates/videos/app/components/ui/carousel.tsx +6 -6
  334. package/corpus/templates/videos/app/components/ui/command.tsx +2 -2
  335. package/corpus/templates/videos/app/components/ui/context-menu.tsx +9 -9
  336. package/corpus/templates/videos/app/components/ui/dialog.tsx +2 -2
  337. package/corpus/templates/videos/app/components/ui/drawer.tsx +1 -1
  338. package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +9 -9
  339. package/corpus/templates/videos/app/components/ui/input-otp.tsx +1 -1
  340. package/corpus/templates/videos/app/components/ui/menubar.tsx +9 -9
  341. package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +3 -3
  342. package/corpus/templates/videos/app/components/ui/pagination.tsx +4 -4
  343. package/corpus/templates/videos/app/components/ui/scroll-area.tsx +1 -1
  344. package/corpus/templates/videos/app/components/ui/select.tsx +3 -3
  345. package/corpus/templates/videos/app/components/ui/sheet.tsx +2 -2
  346. package/corpus/templates/videos/app/components/ui/sidebar.tsx +6 -6
  347. package/corpus/templates/videos/app/components/ui/table.tsx +2 -2
  348. package/corpus/templates/videos/app/components/ui/toast.tsx +3 -3
  349. package/dist/agent/durable-background.d.ts +2 -2
  350. package/dist/agent/durable-background.d.ts.map +1 -1
  351. package/dist/agent/durable-background.js +8 -7
  352. package/dist/agent/durable-background.js.map +1 -1
  353. package/dist/client/AgentPanel.js +3 -3
  354. package/dist/client/AgentPanel.js.map +1 -1
  355. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  356. package/dist/client/AgentTaskCard.js +1 -1
  357. package/dist/client/AgentTaskCard.js.map +1 -1
  358. package/dist/client/AppearancePicker.js +1 -1
  359. package/dist/client/AppearancePicker.js.map +1 -1
  360. package/dist/client/AssistantChat.js +3 -3
  361. package/dist/client/AssistantChat.js.map +1 -1
  362. package/dist/client/CommandMenu.js +4 -4
  363. package/dist/client/CommandMenu.js.map +1 -1
  364. package/dist/client/ErrorBoundary.js +1 -1
  365. package/dist/client/ErrorBoundary.js.map +1 -1
  366. package/dist/client/MultiTabAssistantChat.js +9 -9
  367. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  368. package/dist/client/NewWorkspaceAppFlow.js +5 -5
  369. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  370. package/dist/client/components/ui/dropdown-menu.js +6 -6
  371. package/dist/client/components/ui/dropdown-menu.js.map +1 -1
  372. package/dist/client/components/ui/sheet.js +1 -1
  373. package/dist/client/components/ui/sheet.js.map +1 -1
  374. package/dist/client/composer/ComposerPlusMenu.js +5 -5
  375. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  376. package/dist/client/composer/MentionPopover.js +4 -4
  377. package/dist/client/composer/MentionPopover.js.map +1 -1
  378. package/dist/client/composer/PastedTextChip.js +2 -2
  379. package/dist/client/composer/PastedTextChip.js.map +1 -1
  380. package/dist/client/composer/PromptComposer.js +3 -3
  381. package/dist/client/composer/PromptComposer.js.map +1 -1
  382. package/dist/client/composer/TiptapComposer.js +12 -12
  383. package/dist/client/composer/TiptapComposer.js.map +1 -1
  384. package/dist/client/guided-questions.d.ts.map +1 -1
  385. package/dist/client/guided-questions.js +5 -5
  386. package/dist/client/guided-questions.js.map +1 -1
  387. package/dist/client/i18n.js +2 -2
  388. package/dist/client/i18n.js.map +1 -1
  389. package/dist/client/integrations/IntegrationCard.js +1 -1
  390. package/dist/client/integrations/IntegrationCard.js.map +1 -1
  391. package/dist/client/integrations/IntegrationsPanel.js +4 -4
  392. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  393. package/dist/client/notifications/NotificationsBell.js +3 -3
  394. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  395. package/dist/client/onboarding/OnboardingBanner.js +3 -3
  396. package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
  397. package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
  398. package/dist/client/onboarding/OnboardingPanel.js +15 -10
  399. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  400. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  401. package/dist/client/org/OrgSwitcher.js +7 -7
  402. package/dist/client/org/OrgSwitcher.js.map +1 -1
  403. package/dist/client/org/TeamPage.js +2 -2
  404. package/dist/client/org/TeamPage.js.map +1 -1
  405. package/dist/client/settings/AgentsSection.js +3 -3
  406. package/dist/client/settings/AgentsSection.js.map +1 -1
  407. package/dist/client/settings/AutomationsSection.js +2 -2
  408. package/dist/client/settings/AutomationsSection.js.map +1 -1
  409. package/dist/client/settings/SecretsSection.js +2 -2
  410. package/dist/client/settings/SecretsSection.js.map +1 -1
  411. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  412. package/dist/client/settings/SettingsPanel.js +4 -4
  413. package/dist/client/settings/SettingsPanel.js.map +1 -1
  414. package/dist/client/settings/SettingsSection.js +1 -1
  415. package/dist/client/settings/SettingsSection.js.map +1 -1
  416. package/dist/client/settings/UsageSection.js +2 -2
  417. package/dist/client/settings/UsageSection.js.map +1 -1
  418. package/dist/client/settings/VoiceTranscriptionSection.js +3 -3
  419. package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
  420. package/dist/client/sharing/ShareButton.js +6 -6
  421. package/dist/client/sharing/ShareButton.js.map +1 -1
  422. package/dist/client/sharing/ShareDialog.js +3 -3
  423. package/dist/client/sharing/ShareDialog.js.map +1 -1
  424. package/dist/deploy/build.js +2 -2
  425. package/dist/deploy/build.js.map +1 -1
  426. package/dist/styles/agent-conversation.css +10 -10
  427. package/dist/styles/blocks.css +2 -2
  428. package/dist/styles/rich-markdown-editor.css +2 -2
  429. package/package.json +1 -1
@@ -84,7 +84,7 @@ function CommandItem({ onSelect, children, keywords: _keywords, className, defer
84
84
  return (_jsx("div", { ref: itemRef, className: cn("relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none", className), onClick: handleSelect, onMouseEnter: handleMouseEnter, role: "option", children: children }));
85
85
  }
86
86
  function CommandShortcut({ children, className }) {
87
- return (_jsx("span", { className: cn("ml-auto text-xs tracking-widest text-muted-foreground", className), children: children }));
87
+ return (_jsx("span", { className: cn("ms-auto text-xs tracking-widest text-muted-foreground", className), children: children }));
88
88
  }
89
89
  function CommandSeparator({ className }) {
90
90
  return _jsx("div", { className: cn("-mx-1 my-1 h-px bg-border", className) });
@@ -292,21 +292,21 @@ export function CommandMenu({ open, onOpenChange, children, placeholder = "Type
292
292
  const filteredChildren = filterChildren(children);
293
293
  const hasResults = React.Children.toArray(filteredChildren).some((child) => React.isValidElement(child) &&
294
294
  (child.type === CommandGroup || child.type === CommandDocsGroup));
295
- return (_jsxs(_Fragment, { children: [open && (_jsx("div", { className: "fixed inset-0 z-50 bg-black/50", children: _jsx("div", { ref: containerRef, className: cn("fixed left-1/2 top-[15vh] -translate-x-1/2 w-full max-w-lg", "rounded-lg border border-border bg-popover text-popover-foreground shadow-lg", className), children: _jsxs(CommandMenuContext.Provider, { value: { search, onOpenChange, containerRef, setSelectedIndex }, children: [_jsxs("div", { className: "flex items-center border-b px-3", children: [_jsx(IconSearch, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }), _jsx("input", { ref: inputRef, value: search, onChange: (e) => setSearch(e.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, className: "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50" })] }), _jsxs("div", { className: "max-h-[300px] overflow-y-auto overflow-x-hidden", children: [hasResults && filteredChildren, showChangelogRow && (_jsxs(_Fragment, { children: [hasResults && _jsx(CommandSeparator, {}), _jsx("div", { className: "p-1", children: _jsxs("div", { className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none", onClick: openChangelog, onMouseEnter: (e) => {
295
+ return (_jsxs(_Fragment, { children: [open && (_jsx("div", { className: "fixed inset-0 z-50 bg-black/50", children: _jsx("div", { ref: containerRef, className: cn("fixed left-1/2 top-[15vh] -translate-x-1/2 w-full max-w-lg", "rounded-lg border border-border bg-popover text-popover-foreground shadow-lg", className), children: _jsxs(CommandMenuContext.Provider, { value: { search, onOpenChange, containerRef, setSelectedIndex }, children: [_jsxs("div", { className: "flex items-center border-b px-3", children: [_jsx(IconSearch, { className: "me-2 h-4 w-4 shrink-0 opacity-50" }), _jsx("input", { ref: inputRef, value: search, onChange: (e) => setSearch(e.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, className: "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50" })] }), _jsxs("div", { className: "max-h-[300px] overflow-y-auto overflow-x-hidden", children: [hasResults && filteredChildren, showChangelogRow && (_jsxs(_Fragment, { children: [hasResults && _jsx(CommandSeparator, {}), _jsx("div", { className: "p-1", children: _jsxs("div", { className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none", onClick: openChangelog, onMouseEnter: (e) => {
296
296
  const items = containerRef.current?.querySelectorAll('[role="option"]');
297
297
  if (!items)
298
298
  return;
299
299
  const index = Array.from(items).indexOf(e.currentTarget);
300
300
  if (index >= 0)
301
301
  setSelectedIndex(index);
302
- }, role: "option", children: [_jsx(IconHistory, { className: "h-4 w-4 text-muted-foreground" }), _jsx("span", { children: changelogLabel }), changelogUnseen && (_jsx("span", { className: "ml-auto h-2 w-2 rounded-full bg-primary", "aria-label": "New updates available" }))] }) })] })), showAgentFallback && (_jsxs(_Fragment, { children: [(hasResults || showChangelogRow) && _jsx(CommandSeparator, {}), _jsx("div", { className: "p-1", children: _jsxs("div", { className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none", onClick: handleSubmitToAgent, onMouseEnter: (e) => {
302
+ }, role: "option", children: [_jsx(IconHistory, { className: "h-4 w-4 text-muted-foreground" }), _jsx("span", { children: changelogLabel }), changelogUnseen && (_jsx("span", { className: "ms-auto h-2 w-2 rounded-full bg-primary", "aria-label": "New updates available" }))] }) })] })), showAgentFallback && (_jsxs(_Fragment, { children: [(hasResults || showChangelogRow) && _jsx(CommandSeparator, {}), _jsx("div", { className: "p-1", children: _jsxs("div", { className: "relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none", onClick: handleSubmitToAgent, onMouseEnter: (e) => {
303
303
  const items = containerRef.current?.querySelectorAll('[role="option"]');
304
304
  if (!items)
305
305
  return;
306
306
  const index = Array.from(items).indexOf(e.currentTarget);
307
307
  if (index >= 0)
308
308
  setSelectedIndex(index);
309
- }, role: "option", children: [_jsx(IconMessage, { className: "h-4 w-4 text-muted-foreground" }), _jsx("span", { children: search.trim() ? (_jsxs(_Fragment, { children: ["Ask AI:", " ", _jsxs("span", { className: "text-muted-foreground", children: ["\"", search, "\""] })] })) : (_jsx("span", { className: "text-muted-foreground", children: "Ask AI anything..." })) }), search.trim() && (_jsx("span", { className: "ml-auto text-xs text-muted-foreground", children: "\u21B5" }))] }) })] }))] })] }) }) })), hasChangelog && (_jsx(ChangelogDialog, { open: changelogOpen, onOpenChange: setChangelogOpen, markdown: changelog, title: changelogLabel }))] }));
309
+ }, role: "option", children: [_jsx(IconMessage, { className: "h-4 w-4 text-muted-foreground" }), _jsx("span", { children: search.trim() ? (_jsxs(_Fragment, { children: ["Ask AI:", " ", _jsxs("span", { className: "text-muted-foreground", children: ["\"", search, "\""] })] })) : (_jsx("span", { className: "text-muted-foreground", children: "Ask AI anything..." })) }), search.trim() && (_jsx("span", { className: "ms-auto text-xs text-muted-foreground", children: "\u21B5" }))] }) })] }))] })] }) }) })), hasChangelog && (_jsx(ChangelogDialog, { open: changelogOpen, onOpenChange: setChangelogOpen, markdown: changelog, title: changelogLabel }))] }));
310
310
  }
311
311
  // Helper to extract text content from React children
312
312
  function getTextContent(children) {
@@ -1 +1 @@
1
- {"version":3,"file":"CommandMenu.js","sourceRoot":"","sources":["../../src/client/CommandMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * CommandMenu — reusable command palette with agent chat fallback.\n *\n * Features:\n * - Anchored to top of viewport (not centered)\n * - Falls back to agent chat when no command matches\n * - Opens agent sidebar automatically when sending prompts\n * - Customizable commands via children\n *\n * Usage:\n * <CommandMenu open={open} onOpenChange={setOpen}>\n * <CommandMenu.Group heading=\"Actions\">\n * <CommandMenu.Item onSelect={() => doThing()}>Do thing</CommandMenu.Item>\n * </CommandMenu.Group>\n * </CommandMenu>\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n IconBook2,\n IconExternalLink,\n IconSearch,\n IconMessage,\n IconHistory,\n} from \"@tabler/icons-react\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { cn } from \"./utils.js\";\nimport { ChangelogDialog, useChangelogSeen } from \"./changelog/Changelog.js\";\nimport { parseChangelog } from \"../changelog/parse.js\";\n\n// ─── Context ────────────────────────────────────────────────────────────────\n\ninterface CommandMenuContextValue {\n search: string;\n onOpenChange: (open: boolean) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n setSelectedIndex: (index: number) => void;\n}\n\nconst CommandMenuContext = createContext<CommandMenuContextValue | null>(null);\n\nfunction useCommandMenuContext() {\n const ctx = useContext(CommandMenuContext);\n if (!ctx) throw new Error(\"CommandMenu.* must be used inside <CommandMenu>\");\n return ctx;\n}\n\n// ─── Hooks ──────────────────────────────────────────────────────────────────\n\n/**\n * Opens the agent sidebar (dispatches event that AgentSidebar listens for)\n */\nexport function openAgentSidebar() {\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n}\n\nexport function openAgentSettings(\n section?: string | { section?: string | null },\n) {\n if (typeof window === \"undefined\") return;\n\n const normalizedSection =\n typeof section === \"string\" ? section : section?.section;\n\n openAgentSidebar();\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:open-settings\", {\n detail: normalizedSection ? { section: normalizedSection } : undefined,\n }),\n );\n}\n\nexport function focusAgentChat() {\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:set-mode\", {\n detail: { mode: \"chat\" },\n }),\n );\n openAgentSidebar();\n}\n\n/**\n * Sends a prompt to the agent and opens the sidebar\n */\nexport function submitToAgent(message: string) {\n focusAgentChat();\n sendToAgentChat({ message, submit: true });\n}\n\n// ─── Sub-components ─────────────────────────────────────────────────────────\n\ninterface CommandGroupProps {\n heading?: string;\n children: ReactNode;\n}\n\nfunction CommandGroup({ heading, children }: CommandGroupProps) {\n return (\n <div className=\"overflow-hidden p-1 text-foreground\">\n {heading && (\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\ninterface CommandItemProps {\n onSelect: () => void;\n children: ReactNode;\n keywords?: string[];\n className?: string;\n deferSelect?: boolean;\n}\n\nfunction CommandItem({\n onSelect,\n children,\n keywords: _keywords,\n className,\n deferSelect = true,\n}: CommandItemProps) {\n const { onOpenChange, containerRef, setSelectedIndex } =\n useCommandMenuContext();\n const itemRef = useRef<HTMLDivElement>(null);\n\n const handleSelect = () => {\n if (!deferSelect) {\n onSelect();\n onOpenChange(false);\n return;\n }\n\n onOpenChange(false);\n // Small delay to let dialog close animation start\n setTimeout(onSelect, 50);\n };\n\n const handleMouseEnter = () => {\n if (!containerRef.current || !itemRef.current) return;\n const items = containerRef.current.querySelectorAll('[role=\"option\"]');\n const index = Array.from(items).indexOf(itemRef.current);\n if (index >= 0) setSelectedIndex(index);\n };\n\n return (\n <div\n ref={itemRef}\n className={cn(\n \"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none\",\n className,\n )}\n onClick={handleSelect}\n onMouseEnter={handleMouseEnter}\n role=\"option\"\n >\n {children}\n </div>\n );\n}\n\ninterface CommandShortcutProps {\n children: ReactNode;\n className?: string;\n}\n\nfunction CommandShortcut({ children, className }: CommandShortcutProps) {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nfunction CommandSeparator({ className }: { className?: string }) {\n return <div className={cn(\"-mx-1 my-1 h-px bg-border\", className)} />;\n}\n\nexport interface CommandMenuDoc {\n title: string;\n href: string;\n description?: string;\n keywords?: string[];\n}\n\ninterface CommandDocsGroupProps {\n docs: CommandMenuDoc[];\n heading?: string;\n}\n\nfunction commandDocSearchText(doc: CommandMenuDoc): string {\n return [doc.title, doc.description, ...(doc.keywords ?? [])]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n}\n\nfunction filterCommandDocs(docs: CommandMenuDoc[], search: string) {\n const searchLower = search.trim().toLowerCase();\n if (!searchLower) return docs;\n return docs.filter((doc) => commandDocSearchText(doc).includes(searchLower));\n}\n\nfunction openDocsHref(href: string) {\n if (/^https?:\\/\\//i.test(href)) {\n window.open(href, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n window.location.assign(href);\n}\n\nfunction CommandDocsGroup({ docs, heading = \"Docs\" }: CommandDocsGroupProps) {\n if (docs.length === 0) return null;\n\n return (\n <CommandGroup heading={heading}>\n {docs.map((doc) => (\n <CommandItem\n key={doc.href}\n onSelect={() => openDocsHref(doc.href)}\n keywords={[doc.title, doc.description ?? \"\", ...(doc.keywords ?? [])]}\n deferSelect={false}\n className=\"items-start py-2\"\n >\n <IconBook2 className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{doc.title}</span>\n {doc.description ? (\n <span className=\"mt-0.5 block line-clamp-2 text-xs leading-snug text-muted-foreground\">\n {doc.description}\n </span>\n ) : null}\n </span>\n <IconExternalLink className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </CommandItem>\n ))}\n </CommandGroup>\n );\n}\n\n// ─── Main Component ─────────────────────────────────────────────────────────\n\nexport interface CommandMenuProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: ReactNode;\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Text shown when no results match (before showing agent fallback) */\n emptyText?: string;\n /** Whether to show the \"Ask AI\" fallback when no commands match. Default: true */\n showAgentFallback?: boolean;\n /** Custom class for the dialog content */\n className?: string;\n /**\n * Raw CHANGELOG.md contents. When provided, the menu shows a built-in\n * \"What's new\" entry that opens an in-app changelog dialog (with an unseen\n * dot for new releases). Pass your app's own file:\n * import changelog from \"../CHANGELOG.md?raw\";\n * <CommandMenu ... changelog={changelog} />\n */\n changelog?: string;\n /** Label for the built-in changelog entry. Default: \"What's new\". */\n changelogLabel?: string;\n /**\n * Stable key used to remember which release a user has already seen (for the\n * unseen dot). Defaults to the document title's host app; set explicitly when\n * multiple apps share an origin.\n */\n changelogKey?: string;\n}\n\nexport function CommandMenu({\n open,\n onOpenChange,\n children,\n placeholder = \"Type a command or ask AI...\",\n emptyText: _emptyText = \"No commands found.\",\n showAgentFallback = true,\n className,\n changelog,\n changelogLabel = \"What's new\",\n changelogKey,\n}: CommandMenuProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Built-in \"What's new\" changelog surface (only active when `changelog` is\n // passed). The dialog is rendered alongside the menu so it survives the menu\n // closing; the unseen dot persists per browser via localStorage.\n const [changelogOpen, setChangelogOpen] = useState(false);\n const hasChangelog =\n typeof changelog === \"string\" && changelog.trim().length > 0;\n const changelogEntries = useMemo(\n () => (hasChangelog ? parseChangelog(changelog as string) : []),\n [hasChangelog, changelog],\n );\n const latestChangelogId = changelogEntries[0]?.id;\n const { unseen: changelogUnseen, markSeen: markChangelogSeen } =\n useChangelogSeen(changelogKey ?? \"app\", latestChangelogId);\n\n const openChangelog = useCallback(() => {\n onOpenChange(false);\n markChangelogSeen();\n // Let the menu close before the dialog opens (avoids overlay flicker).\n setTimeout(() => setChangelogOpen(true), 50);\n }, [onOpenChange, markChangelogSeen]);\n\n // Focus input when opening\n useEffect(() => {\n if (open) {\n setSearch(\"\");\n setSelectedIndex(0);\n // Wait for render then focus\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }\n }, [open]);\n\n // Reset selection when search changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [search]);\n\n // Keep selected item scrolled into view\n useEffect(() => {\n const items = containerRef.current?.querySelectorAll('[role=\"option\"]');\n if (items && items[selectedIndex]) {\n items[selectedIndex].scrollIntoView({ block: \"nearest\" });\n }\n }, [selectedIndex]);\n\n // Apply selected styling directly (can't rely on Tailwind scanning core package)\n useEffect(() => {\n const items = containerRef.current?.querySelectorAll('[role=\"option\"]');\n if (!items) return;\n items.forEach((item, i) => {\n const el = item as HTMLElement;\n if (i === selectedIndex) {\n el.style.backgroundColor = \"hsl(var(--accent))\";\n el.style.color = \"hsl(var(--accent-foreground))\";\n } else {\n el.style.backgroundColor = \"\";\n el.style.color = \"\";\n }\n });\n });\n\n // Close on escape\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onOpenChange(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onOpenChange]);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n const handleClick = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n onOpenChange(false);\n }\n };\n // Use capture to handle clicks before they bubble\n document.addEventListener(\"mousedown\", handleClick, true);\n return () => document.removeEventListener(\"mousedown\", handleClick, true);\n }, [open, onOpenChange]);\n\n const handleSubmitToAgent = useCallback(() => {\n onOpenChange(false);\n if (!search.trim()) {\n focusAgentChat();\n return;\n }\n submitToAgent(search.trim());\n }, [search, onOpenChange]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const items = containerRef.current?.querySelectorAll('[role=\"option\"]');\n const itemCount = items?.length ?? 0;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((prev) => (prev + 1) % itemCount || 0);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex((prev) => (prev - 1 + itemCount) % itemCount || 0);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (items && items[selectedIndex]) {\n (items[selectedIndex] as HTMLElement).click();\n }\n }\n };\n\n // The built-in \"What's new\" row matches changelog-ish search terms.\n const changelogRowMatches =\n !search ||\n [\n changelogLabel,\n \"changelog\",\n \"what's new\",\n \"whats new\",\n \"updates\",\n \"release notes\",\n \"changes\",\n ]\n .join(\" \")\n .toLowerCase()\n .includes(search.toLowerCase());\n const showChangelogRow = hasChangelog && changelogRowMatches;\n\n // Filter children based on search\n const filterChildren = (nodes: ReactNode): ReactNode => {\n return React.Children.map(nodes, (child) => {\n if (!React.isValidElement(child)) return child;\n const props = child.props as Record<string, unknown>;\n\n // If it's a CommandGroup, filter its children\n if (child.type === CommandGroup) {\n const groupChildren = filterChildren(props.children as ReactNode);\n const hasChildren = React.Children.count(groupChildren) > 0;\n if (!hasChildren) return null;\n return React.cloneElement(child, {\n ...props,\n children: groupChildren,\n } as Record<string, unknown>);\n }\n\n if (child.type === CommandDocsGroup) {\n const docs = Array.isArray(props.docs)\n ? (props.docs as CommandMenuDoc[])\n : [];\n const filteredDocs = filterCommandDocs(docs, search);\n if (filteredDocs.length === 0) return null;\n return React.cloneElement(child, {\n ...props,\n docs: filteredDocs,\n } as Record<string, unknown>);\n }\n\n // If it's a CommandItem, check if it matches search\n if (child.type === CommandItem) {\n if (!search) return child;\n const text = getTextContent(props.children as ReactNode).toLowerCase();\n const keywords = ((props.keywords as string[]) || [])\n .join(\" \")\n .toLowerCase();\n const searchLower = search.toLowerCase();\n if (text.includes(searchLower) || keywords.includes(searchLower)) {\n return child;\n }\n return null;\n }\n\n // If it's a separator, keep it (will be cleaned up later if needed)\n if (child.type === CommandSeparator) {\n return search ? null : child; // Hide separators when searching\n }\n\n return child;\n });\n };\n\n const filteredChildren = filterChildren(children);\n const hasResults = React.Children.toArray(filteredChildren).some(\n (child) =>\n React.isValidElement(child) &&\n (child.type === CommandGroup || child.type === CommandDocsGroup),\n );\n\n return (\n <>\n {open && (\n <div className=\"fixed inset-0 z-50 bg-black/50\">\n <div\n ref={containerRef}\n className={cn(\n \"fixed left-1/2 top-[15vh] -translate-x-1/2 w-full max-w-lg\",\n \"rounded-lg border border-border bg-popover text-popover-foreground shadow-lg\",\n className,\n )}\n >\n <CommandMenuContext.Provider\n value={{ search, onOpenChange, containerRef, setSelectedIndex }}\n >\n {/* Search input */}\n <div className=\"flex items-center border-b px-3\">\n <IconSearch className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <input\n ref={inputRef}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n\n {/* Command list */}\n <div className=\"max-h-[300px] overflow-y-auto overflow-x-hidden\">\n {hasResults && filteredChildren}\n\n {/* What's new — built-in changelog entry */}\n {showChangelogRow && (\n <>\n {hasResults && <CommandSeparator />}\n <div className=\"p-1\">\n <div\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none\"\n onClick={openChangelog}\n onMouseEnter={(e) => {\n const items =\n containerRef.current?.querySelectorAll(\n '[role=\"option\"]',\n );\n if (!items) return;\n const index = Array.from(items).indexOf(\n e.currentTarget,\n );\n if (index >= 0) setSelectedIndex(index);\n }}\n role=\"option\"\n >\n <IconHistory className=\"h-4 w-4 text-muted-foreground\" />\n <span>{changelogLabel}</span>\n {changelogUnseen && (\n <span\n className=\"ml-auto h-2 w-2 rounded-full bg-primary\"\n aria-label=\"New updates available\"\n />\n )}\n </div>\n </div>\n </>\n )}\n\n {/* Ask AI — always visible at the bottom */}\n {showAgentFallback && (\n <>\n {(hasResults || showChangelogRow) && <CommandSeparator />}\n <div className=\"p-1\">\n <div\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none\"\n onClick={handleSubmitToAgent}\n onMouseEnter={(e) => {\n const items =\n containerRef.current?.querySelectorAll(\n '[role=\"option\"]',\n );\n if (!items) return;\n const index = Array.from(items).indexOf(\n e.currentTarget,\n );\n if (index >= 0) setSelectedIndex(index);\n }}\n role=\"option\"\n >\n <IconMessage className=\"h-4 w-4 text-muted-foreground\" />\n <span>\n {search.trim() ? (\n <>\n Ask AI:{\" \"}\n <span className=\"text-muted-foreground\">\n \"{search}\"\n </span>\n </>\n ) : (\n <span className=\"text-muted-foreground\">\n Ask AI anything...\n </span>\n )}\n </span>\n {search.trim() && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n ↵\n </span>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n </CommandMenuContext.Provider>\n </div>\n </div>\n )}\n\n {hasChangelog && (\n <ChangelogDialog\n open={changelogOpen}\n onOpenChange={setChangelogOpen}\n markdown={changelog as string}\n title={changelogLabel}\n />\n )}\n </>\n );\n}\n\n// Helper to extract text content from React children\nfunction getTextContent(children: ReactNode): string {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (!children) return \"\";\n if (Array.isArray(children)) {\n return children.map(getTextContent).join(\" \");\n }\n if (\n React.isValidElement(children) &&\n (children.props as Record<string, unknown>).children\n ) {\n return getTextContent(\n (children.props as Record<string, unknown>).children as ReactNode,\n );\n }\n return \"\";\n}\n\n// Attach sub-components\nCommandMenu.Group = CommandGroup;\nCommandMenu.Item = CommandItem;\nCommandMenu.DocsGroup = CommandDocsGroup;\nCommandMenu.Shortcut = CommandShortcut;\nCommandMenu.Separator = CommandSeparator;\n\n// ─── Keyboard Hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook to handle Cmd+K (or Ctrl+K) to open the command menu\n */\nexport function useCommandMenuShortcut(onOpen: () => void) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n // Don't trigger if user is typing in an input/textarea\n const target = e.target as HTMLElement;\n if (\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable\n ) {\n return;\n }\n e.preventDefault();\n onOpen();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onOpen]);\n}\n\nexport type {\n CommandDocsGroupProps,\n CommandGroupProps,\n CommandItemProps,\n CommandShortcutProps,\n};\n"]}
1
+ {"version":3,"file":"CommandMenu.js","sourceRoot":"","sources":["../../src/client/CommandMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * CommandMenu — reusable command palette with agent chat fallback.\n *\n * Features:\n * - Anchored to top of viewport (not centered)\n * - Falls back to agent chat when no command matches\n * - Opens agent sidebar automatically when sending prompts\n * - Customizable commands via children\n *\n * Usage:\n * <CommandMenu open={open} onOpenChange={setOpen}>\n * <CommandMenu.Group heading=\"Actions\">\n * <CommandMenu.Item onSelect={() => doThing()}>Do thing</CommandMenu.Item>\n * </CommandMenu.Group>\n * </CommandMenu>\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n IconBook2,\n IconExternalLink,\n IconSearch,\n IconMessage,\n IconHistory,\n} from \"@tabler/icons-react\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { cn } from \"./utils.js\";\nimport { ChangelogDialog, useChangelogSeen } from \"./changelog/Changelog.js\";\nimport { parseChangelog } from \"../changelog/parse.js\";\n\n// ─── Context ────────────────────────────────────────────────────────────────\n\ninterface CommandMenuContextValue {\n search: string;\n onOpenChange: (open: boolean) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n setSelectedIndex: (index: number) => void;\n}\n\nconst CommandMenuContext = createContext<CommandMenuContextValue | null>(null);\n\nfunction useCommandMenuContext() {\n const ctx = useContext(CommandMenuContext);\n if (!ctx) throw new Error(\"CommandMenu.* must be used inside <CommandMenu>\");\n return ctx;\n}\n\n// ─── Hooks ──────────────────────────────────────────────────────────────────\n\n/**\n * Opens the agent sidebar (dispatches event that AgentSidebar listens for)\n */\nexport function openAgentSidebar() {\n window.dispatchEvent(new Event(\"agent-panel:open\"));\n}\n\nexport function openAgentSettings(\n section?: string | { section?: string | null },\n) {\n if (typeof window === \"undefined\") return;\n\n const normalizedSection =\n typeof section === \"string\" ? section : section?.section;\n\n openAgentSidebar();\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:open-settings\", {\n detail: normalizedSection ? { section: normalizedSection } : undefined,\n }),\n );\n}\n\nexport function focusAgentChat() {\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:set-mode\", {\n detail: { mode: \"chat\" },\n }),\n );\n openAgentSidebar();\n}\n\n/**\n * Sends a prompt to the agent and opens the sidebar\n */\nexport function submitToAgent(message: string) {\n focusAgentChat();\n sendToAgentChat({ message, submit: true });\n}\n\n// ─── Sub-components ─────────────────────────────────────────────────────────\n\ninterface CommandGroupProps {\n heading?: string;\n children: ReactNode;\n}\n\nfunction CommandGroup({ heading, children }: CommandGroupProps) {\n return (\n <div className=\"overflow-hidden p-1 text-foreground\">\n {heading && (\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n {heading}\n </div>\n )}\n {children}\n </div>\n );\n}\n\ninterface CommandItemProps {\n onSelect: () => void;\n children: ReactNode;\n keywords?: string[];\n className?: string;\n deferSelect?: boolean;\n}\n\nfunction CommandItem({\n onSelect,\n children,\n keywords: _keywords,\n className,\n deferSelect = true,\n}: CommandItemProps) {\n const { onOpenChange, containerRef, setSelectedIndex } =\n useCommandMenuContext();\n const itemRef = useRef<HTMLDivElement>(null);\n\n const handleSelect = () => {\n if (!deferSelect) {\n onSelect();\n onOpenChange(false);\n return;\n }\n\n onOpenChange(false);\n // Small delay to let dialog close animation start\n setTimeout(onSelect, 50);\n };\n\n const handleMouseEnter = () => {\n if (!containerRef.current || !itemRef.current) return;\n const items = containerRef.current.querySelectorAll('[role=\"option\"]');\n const index = Array.from(items).indexOf(itemRef.current);\n if (index >= 0) setSelectedIndex(index);\n };\n\n return (\n <div\n ref={itemRef}\n className={cn(\n \"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none\",\n className,\n )}\n onClick={handleSelect}\n onMouseEnter={handleMouseEnter}\n role=\"option\"\n >\n {children}\n </div>\n );\n}\n\ninterface CommandShortcutProps {\n children: ReactNode;\n className?: string;\n}\n\nfunction CommandShortcut({ children, className }: CommandShortcutProps) {\n return (\n <span\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n >\n {children}\n </span>\n );\n}\n\nfunction CommandSeparator({ className }: { className?: string }) {\n return <div className={cn(\"-mx-1 my-1 h-px bg-border\", className)} />;\n}\n\nexport interface CommandMenuDoc {\n title: string;\n href: string;\n description?: string;\n keywords?: string[];\n}\n\ninterface CommandDocsGroupProps {\n docs: CommandMenuDoc[];\n heading?: string;\n}\n\nfunction commandDocSearchText(doc: CommandMenuDoc): string {\n return [doc.title, doc.description, ...(doc.keywords ?? [])]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n}\n\nfunction filterCommandDocs(docs: CommandMenuDoc[], search: string) {\n const searchLower = search.trim().toLowerCase();\n if (!searchLower) return docs;\n return docs.filter((doc) => commandDocSearchText(doc).includes(searchLower));\n}\n\nfunction openDocsHref(href: string) {\n if (/^https?:\\/\\//i.test(href)) {\n window.open(href, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n window.location.assign(href);\n}\n\nfunction CommandDocsGroup({ docs, heading = \"Docs\" }: CommandDocsGroupProps) {\n if (docs.length === 0) return null;\n\n return (\n <CommandGroup heading={heading}>\n {docs.map((doc) => (\n <CommandItem\n key={doc.href}\n onSelect={() => openDocsHref(doc.href)}\n keywords={[doc.title, doc.description ?? \"\", ...(doc.keywords ?? [])]}\n deferSelect={false}\n className=\"items-start py-2\"\n >\n <IconBook2 className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">{doc.title}</span>\n {doc.description ? (\n <span className=\"mt-0.5 block line-clamp-2 text-xs leading-snug text-muted-foreground\">\n {doc.description}\n </span>\n ) : null}\n </span>\n <IconExternalLink className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </CommandItem>\n ))}\n </CommandGroup>\n );\n}\n\n// ─── Main Component ─────────────────────────────────────────────────────────\n\nexport interface CommandMenuProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n children: ReactNode;\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Text shown when no results match (before showing agent fallback) */\n emptyText?: string;\n /** Whether to show the \"Ask AI\" fallback when no commands match. Default: true */\n showAgentFallback?: boolean;\n /** Custom class for the dialog content */\n className?: string;\n /**\n * Raw CHANGELOG.md contents. When provided, the menu shows a built-in\n * \"What's new\" entry that opens an in-app changelog dialog (with an unseen\n * dot for new releases). Pass your app's own file:\n * import changelog from \"../CHANGELOG.md?raw\";\n * <CommandMenu ... changelog={changelog} />\n */\n changelog?: string;\n /** Label for the built-in changelog entry. Default: \"What's new\". */\n changelogLabel?: string;\n /**\n * Stable key used to remember which release a user has already seen (for the\n * unseen dot). Defaults to the document title's host app; set explicitly when\n * multiple apps share an origin.\n */\n changelogKey?: string;\n}\n\nexport function CommandMenu({\n open,\n onOpenChange,\n children,\n placeholder = \"Type a command or ask AI...\",\n emptyText: _emptyText = \"No commands found.\",\n showAgentFallback = true,\n className,\n changelog,\n changelogLabel = \"What's new\",\n changelogKey,\n}: CommandMenuProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Built-in \"What's new\" changelog surface (only active when `changelog` is\n // passed). The dialog is rendered alongside the menu so it survives the menu\n // closing; the unseen dot persists per browser via localStorage.\n const [changelogOpen, setChangelogOpen] = useState(false);\n const hasChangelog =\n typeof changelog === \"string\" && changelog.trim().length > 0;\n const changelogEntries = useMemo(\n () => (hasChangelog ? parseChangelog(changelog as string) : []),\n [hasChangelog, changelog],\n );\n const latestChangelogId = changelogEntries[0]?.id;\n const { unseen: changelogUnseen, markSeen: markChangelogSeen } =\n useChangelogSeen(changelogKey ?? \"app\", latestChangelogId);\n\n const openChangelog = useCallback(() => {\n onOpenChange(false);\n markChangelogSeen();\n // Let the menu close before the dialog opens (avoids overlay flicker).\n setTimeout(() => setChangelogOpen(true), 50);\n }, [onOpenChange, markChangelogSeen]);\n\n // Focus input when opening\n useEffect(() => {\n if (open) {\n setSearch(\"\");\n setSelectedIndex(0);\n // Wait for render then focus\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n }\n }, [open]);\n\n // Reset selection when search changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [search]);\n\n // Keep selected item scrolled into view\n useEffect(() => {\n const items = containerRef.current?.querySelectorAll('[role=\"option\"]');\n if (items && items[selectedIndex]) {\n items[selectedIndex].scrollIntoView({ block: \"nearest\" });\n }\n }, [selectedIndex]);\n\n // Apply selected styling directly (can't rely on Tailwind scanning core package)\n useEffect(() => {\n const items = containerRef.current?.querySelectorAll('[role=\"option\"]');\n if (!items) return;\n items.forEach((item, i) => {\n const el = item as HTMLElement;\n if (i === selectedIndex) {\n el.style.backgroundColor = \"hsl(var(--accent))\";\n el.style.color = \"hsl(var(--accent-foreground))\";\n } else {\n el.style.backgroundColor = \"\";\n el.style.color = \"\";\n }\n });\n });\n\n // Close on escape\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onOpenChange(false);\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onOpenChange]);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n const handleClick = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n onOpenChange(false);\n }\n };\n // Use capture to handle clicks before they bubble\n document.addEventListener(\"mousedown\", handleClick, true);\n return () => document.removeEventListener(\"mousedown\", handleClick, true);\n }, [open, onOpenChange]);\n\n const handleSubmitToAgent = useCallback(() => {\n onOpenChange(false);\n if (!search.trim()) {\n focusAgentChat();\n return;\n }\n submitToAgent(search.trim());\n }, [search, onOpenChange]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const items = containerRef.current?.querySelectorAll('[role=\"option\"]');\n const itemCount = items?.length ?? 0;\n\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex((prev) => (prev + 1) % itemCount || 0);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex((prev) => (prev - 1 + itemCount) % itemCount || 0);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (items && items[selectedIndex]) {\n (items[selectedIndex] as HTMLElement).click();\n }\n }\n };\n\n // The built-in \"What's new\" row matches changelog-ish search terms.\n const changelogRowMatches =\n !search ||\n [\n changelogLabel,\n \"changelog\",\n \"what's new\",\n \"whats new\",\n \"updates\",\n \"release notes\",\n \"changes\",\n ]\n .join(\" \")\n .toLowerCase()\n .includes(search.toLowerCase());\n const showChangelogRow = hasChangelog && changelogRowMatches;\n\n // Filter children based on search\n const filterChildren = (nodes: ReactNode): ReactNode => {\n return React.Children.map(nodes, (child) => {\n if (!React.isValidElement(child)) return child;\n const props = child.props as Record<string, unknown>;\n\n // If it's a CommandGroup, filter its children\n if (child.type === CommandGroup) {\n const groupChildren = filterChildren(props.children as ReactNode);\n const hasChildren = React.Children.count(groupChildren) > 0;\n if (!hasChildren) return null;\n return React.cloneElement(child, {\n ...props,\n children: groupChildren,\n } as Record<string, unknown>);\n }\n\n if (child.type === CommandDocsGroup) {\n const docs = Array.isArray(props.docs)\n ? (props.docs as CommandMenuDoc[])\n : [];\n const filteredDocs = filterCommandDocs(docs, search);\n if (filteredDocs.length === 0) return null;\n return React.cloneElement(child, {\n ...props,\n docs: filteredDocs,\n } as Record<string, unknown>);\n }\n\n // If it's a CommandItem, check if it matches search\n if (child.type === CommandItem) {\n if (!search) return child;\n const text = getTextContent(props.children as ReactNode).toLowerCase();\n const keywords = ((props.keywords as string[]) || [])\n .join(\" \")\n .toLowerCase();\n const searchLower = search.toLowerCase();\n if (text.includes(searchLower) || keywords.includes(searchLower)) {\n return child;\n }\n return null;\n }\n\n // If it's a separator, keep it (will be cleaned up later if needed)\n if (child.type === CommandSeparator) {\n return search ? null : child; // Hide separators when searching\n }\n\n return child;\n });\n };\n\n const filteredChildren = filterChildren(children);\n const hasResults = React.Children.toArray(filteredChildren).some(\n (child) =>\n React.isValidElement(child) &&\n (child.type === CommandGroup || child.type === CommandDocsGroup),\n );\n\n return (\n <>\n {open && (\n <div className=\"fixed inset-0 z-50 bg-black/50\">\n <div\n ref={containerRef}\n className={cn(\n \"fixed left-1/2 top-[15vh] -translate-x-1/2 w-full max-w-lg\",\n \"rounded-lg border border-border bg-popover text-popover-foreground shadow-lg\",\n className,\n )}\n >\n <CommandMenuContext.Provider\n value={{ search, onOpenChange, containerRef, setSelectedIndex }}\n >\n {/* Search input */}\n <div className=\"flex items-center border-b px-3\">\n <IconSearch className=\"me-2 h-4 w-4 shrink-0 opacity-50\" />\n <input\n ref={inputRef}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n\n {/* Command list */}\n <div className=\"max-h-[300px] overflow-y-auto overflow-x-hidden\">\n {hasResults && filteredChildren}\n\n {/* What's new — built-in changelog entry */}\n {showChangelogRow && (\n <>\n {hasResults && <CommandSeparator />}\n <div className=\"p-1\">\n <div\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none\"\n onClick={openChangelog}\n onMouseEnter={(e) => {\n const items =\n containerRef.current?.querySelectorAll(\n '[role=\"option\"]',\n );\n if (!items) return;\n const index = Array.from(items).indexOf(\n e.currentTarget,\n );\n if (index >= 0) setSelectedIndex(index);\n }}\n role=\"option\"\n >\n <IconHistory className=\"h-4 w-4 text-muted-foreground\" />\n <span>{changelogLabel}</span>\n {changelogUnseen && (\n <span\n className=\"ms-auto h-2 w-2 rounded-full bg-primary\"\n aria-label=\"New updates available\"\n />\n )}\n </div>\n </div>\n </>\n )}\n\n {/* Ask AI — always visible at the bottom */}\n {showAgentFallback && (\n <>\n {(hasResults || showChangelogRow) && <CommandSeparator />}\n <div className=\"p-1\">\n <div\n className=\"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-2 text-sm outline-none\"\n onClick={handleSubmitToAgent}\n onMouseEnter={(e) => {\n const items =\n containerRef.current?.querySelectorAll(\n '[role=\"option\"]',\n );\n if (!items) return;\n const index = Array.from(items).indexOf(\n e.currentTarget,\n );\n if (index >= 0) setSelectedIndex(index);\n }}\n role=\"option\"\n >\n <IconMessage className=\"h-4 w-4 text-muted-foreground\" />\n <span>\n {search.trim() ? (\n <>\n Ask AI:{\" \"}\n <span className=\"text-muted-foreground\">\n \"{search}\"\n </span>\n </>\n ) : (\n <span className=\"text-muted-foreground\">\n Ask AI anything...\n </span>\n )}\n </span>\n {search.trim() && (\n <span className=\"ms-auto text-xs text-muted-foreground\">\n ↵\n </span>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n </CommandMenuContext.Provider>\n </div>\n </div>\n )}\n\n {hasChangelog && (\n <ChangelogDialog\n open={changelogOpen}\n onOpenChange={setChangelogOpen}\n markdown={changelog as string}\n title={changelogLabel}\n />\n )}\n </>\n );\n}\n\n// Helper to extract text content from React children\nfunction getTextContent(children: ReactNode): string {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (!children) return \"\";\n if (Array.isArray(children)) {\n return children.map(getTextContent).join(\" \");\n }\n if (\n React.isValidElement(children) &&\n (children.props as Record<string, unknown>).children\n ) {\n return getTextContent(\n (children.props as Record<string, unknown>).children as ReactNode,\n );\n }\n return \"\";\n}\n\n// Attach sub-components\nCommandMenu.Group = CommandGroup;\nCommandMenu.Item = CommandItem;\nCommandMenu.DocsGroup = CommandDocsGroup;\nCommandMenu.Shortcut = CommandShortcut;\nCommandMenu.Separator = CommandSeparator;\n\n// ─── Keyboard Hook ──────────────────────────────────────────────────────────\n\n/**\n * Hook to handle Cmd+K (or Ctrl+K) to open the command menu\n */\nexport function useCommandMenuShortcut(onOpen: () => void) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n // Don't trigger if user is typing in an input/textarea\n const target = e.target as HTMLElement;\n if (\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable\n ) {\n return;\n }\n e.preventDefault();\n onOpen();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onOpen]);\n}\n\nexport type {\n CommandDocsGroupProps,\n CommandGroupProps,\n CommandItemProps,\n CommandShortcutProps,\n};\n"]}
@@ -93,7 +93,7 @@ function ErrorScreen({ error }) {
93
93
  if (typeof console !== "undefined" && error) {
94
94
  console.error("[ErrorBoundary]", error);
95
95
  }
96
- return (_jsx("main", { className: "flex items-center justify-center min-h-screen p-4 bg-background text-foreground", children: _jsxs("div", { className: "flex flex-col items-center text-center max-w-md", children: [status && (_jsx("span", { className: "text-7xl font-bold tracking-tight text-muted-foreground/40", children: status })), _jsx("h1", { className: "mt-3 text-2xl font-semibold", children: title }), _jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: details }), _jsx("a", { href: appPath("/"), className: homeLinkClassName, children: "Go home" }), _jsx("button", { type: "button", onClick: () => window.location.reload(), className: "mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent", children: "Reload" }), stack && (_jsx("pre", { className: "mt-6 w-full text-left text-xs overflow-auto p-4 bg-muted rounded", children: _jsx("code", { children: stack }) }))] }) }));
96
+ return (_jsx("main", { className: "flex items-center justify-center min-h-screen p-4 bg-background text-foreground", children: _jsxs("div", { className: "flex flex-col items-center text-center max-w-md", children: [status && (_jsx("span", { className: "text-7xl font-bold tracking-tight text-muted-foreground/40", children: status })), _jsx("h1", { className: "mt-3 text-2xl font-semibold", children: title }), _jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: details }), _jsx("a", { href: appPath("/"), className: homeLinkClassName, children: "Go home" }), _jsx("button", { type: "button", onClick: () => window.location.reload(), className: "mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent", children: "Reload" }), stack && (_jsx("pre", { className: "mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded", children: _jsx("code", { children: stack }) }))] }) }));
97
97
  }
98
98
  function RoutedErrorScreen() {
99
99
  return _jsx(ErrorScreen, { error: useRouteError() });
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\nimport { appPath } from \"./api-path.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst homeLinkClassName =\n \"mt-6 inline-flex items-center gap-1.5 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">\n Loading the latest version…\n </p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = \"Something went wrong\";\n let details = \"An unexpected error occurred.\";\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = \"Page not found\";\n details = \"We couldn't find this page.\";\n } else {\n title = `${error.status} Error`;\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <a href={appPath(\"/\")} className={homeLinkClassName}>\n Go home\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent\"\n >\n Reload\n </button>\n {stack && (\n <pre className=\"mt-6 w-full text-left text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,iBAAiB,GACrB,gKAAgK,CAAC;AAEnK,SAAS,kBAAkB;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrE,OAAO;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,EAAE,CAAC;gBACrE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAChD,6BAA6B,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CACrD,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,6BAA6B,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1D,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC;YAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CACL,eAAM,SAAS,EAAC,iFAAiF,YAC/F,YAAG,SAAS,EAAC,+BAA+B,iDAExC,GACC,CACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,KAAK,EAAsB;IAChD,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAChD,yEAAyE;IACzE,0EAA0E;IAC1E,4BAA4B;IAC5B,IAAI,UAAU;QAAE,OAAO,KAAC,cAAc,KAAG,CAAC;IAE1C,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,KAAK,GAAG,sBAAsB,CAAC;IACnC,IAAI,OAAO,GAAG,+BAA+B,CAAC;IAC9C,IAAI,KAAyB,CAAC;IAE9B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACtB,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACzB,KAAK,GAAG,gBAAgB,CAAC;YACzB,OAAO,GAAG,6BAA6B,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC;YAChC,OAAO,GAAG,KAAK,CAAC,UAAU,IAAI,OAAO,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,0DAA0D;QAC1D,qEAAqE;QACrE,kEAAkE;QAClE,0BAA0B;QAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1B,CAAC;QACD,IACE,OAAO,OAAO,KAAK,WAAW;YAC9B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EACrC,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC9C,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,mEAAmE;IACnE,8DAA8D;IAC9D,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,EAAE,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CACL,eAAM,SAAS,EAAC,iFAAiF,YAC/F,eAAK,SAAS,EAAC,iDAAiD,aAC7D,MAAM,IAAI,CACT,eAAM,SAAS,EAAC,4DAA4D,YACzE,MAAM,GACF,CACR,EACD,aAAI,SAAS,EAAC,6BAA6B,YAAE,KAAK,GAAM,EACxD,YAAG,SAAS,EAAC,oCAAoC,YAAE,OAAO,GAAK,EAC/D,YAAG,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,iBAAiB,wBAE/C,EACJ,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EACvC,SAAS,EAAC,4KAA4K,uBAG/K,EACR,KAAK,IAAI,CACR,cAAK,SAAS,EAAC,mEAAmE,YAChF,yBAAO,KAAK,GAAQ,GAChB,CACP,IACG,GACD,CACR,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,KAAC,WAAW,IAAC,KAAK,EAAE,aAAa,EAAE,GAAI,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,kBAAkB,EAAE,CAAC;IACrB,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO,KAAC,WAAW,IAAC,KAAK,EAAE,SAAS,GAAI,CAAC;IACpE,OAAO,KAAC,iBAAiB,KAAG,CAAC;AAC/B,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\nimport { appPath } from \"./api-path.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst homeLinkClassName =\n \"mt-6 inline-flex items-center gap-1.5 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">\n Loading the latest version…\n </p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = \"Something went wrong\";\n let details = \"An unexpected error occurred.\";\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = \"Page not found\";\n details = \"We couldn't find this page.\";\n } else {\n title = `${error.status} Error`;\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <a href={appPath(\"/\")} className={homeLinkClassName}>\n Go home\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent\"\n >\n Reload\n </button>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
@@ -95,7 +95,7 @@ function resolveModelSelection(selection, groups) {
95
95
  }
96
96
  // ─── Skeleton Loader ─────────────────────────────────────────────────────────
97
97
  function ChatSkeleton({ header, headerOnly = false, }) {
98
- return (_jsxs("div", { className: cn("flex flex-col min-h-0", headerOnly ? "shrink-0" : "flex-1 h-full"), children: [header ?? (_jsxs("div", { className: "flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5", children: [_jsx("div", { className: "h-[22px] w-20 rounded-md bg-muted animate-pulse" }), _jsxs("div", { className: "ml-auto flex gap-0.5", children: [_jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" })] })] })), !headerOnly && (_jsxs("div", { className: "flex-1 flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-center py-8", children: _jsx("div", { className: "h-10 w-10 rounded-full bg-muted animate-pulse" }) }), _jsx("div", { className: "h-3 w-32 rounded bg-muted animate-pulse mx-auto" })] }))] }));
98
+ return (_jsxs("div", { className: cn("flex flex-col min-h-0", headerOnly ? "shrink-0" : "flex-1 h-full"), children: [header ?? (_jsxs("div", { className: "flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5", children: [_jsx("div", { className: "h-[22px] w-20 rounded-md bg-muted animate-pulse" }), _jsxs("div", { className: "ms-auto flex gap-0.5", children: [_jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" })] })] })), !headerOnly && (_jsxs("div", { className: "flex-1 flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-center py-8", children: _jsx("div", { className: "h-10 w-10 rounded-full bg-muted animate-pulse" }) }), _jsx("div", { className: "h-3 w-32 rounded bg-muted animate-pulse mx-auto" })] }))] }));
99
99
  }
100
100
  // ─── Scope Badge ─────────────────────────────────────────────────────────────
101
101
  function formatScopeType(type) {
@@ -134,7 +134,7 @@ function ScopeBadge({ scope, currentScope, onDetach, otherScopedThreads, activeT
134
134
  ? "New chats here keep this context."
135
135
  : "Start a new chat for a general conversation.";
136
136
  const otherCount = otherScopedThreads.length;
137
- return (_jsx("div", { className: "agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground", children: _jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex h-7 min-w-0 max-w-full cursor-pointer items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-muted-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] transition-colors hover:bg-accent hover:text-foreground sm:max-w-72", "aria-label": heading, children: [_jsx(IconLink, { size: 11, className: "shrink-0 opacity-70" }), _jsx("span", { className: "min-w-0 truncate", children: heading }), otherCount > 0 && (_jsxs("span", { className: "ml-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground", "aria-label": `${otherCount} other chats for ${objectLabel}`, children: ["+", otherCount] }))] }) }), _jsxs(PopoverContent, { align: "center", side: "top", className: "w-72 p-0", children: [_jsxs("p", { className: "px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground", children: ["This chat can see", " ", _jsx("span", { className: "text-foreground", children: objectLabel }), ".", " ", detailSuffix] }), otherCount > 0 && (_jsxs("div", { className: "border-t border-border", children: [_jsxs("div", { className: "px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70", children: ["Chats for ", objectLabel] }), _jsx("div", { className: "max-h-56 overflow-y-auto pb-1", children: otherScopedThreads.map((thread) => renderThreadRow(thread, activeThreadId, openTabIds, formatThreadTime, onSelectThread, () => setOpen(false))) })] })), _jsx("div", { className: "border-t border-border p-1", children: _jsxs("button", { type: "button", onClick: () => {
137
+ return (_jsx("div", { className: "agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground", children: _jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", className: "inline-flex h-7 min-w-0 max-w-full cursor-pointer items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-muted-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] transition-colors hover:bg-accent hover:text-foreground sm:max-w-72", "aria-label": heading, children: [_jsx(IconLink, { size: 11, className: "shrink-0 opacity-70" }), _jsx("span", { className: "min-w-0 truncate", children: heading }), otherCount > 0 && (_jsxs("span", { className: "ms-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground", "aria-label": `${otherCount} other chats for ${objectLabel}`, children: ["+", otherCount] }))] }) }), _jsxs(PopoverContent, { align: "center", side: "top", className: "w-72 p-0", children: [_jsxs("p", { className: "px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground", children: ["This chat can see", " ", _jsx("span", { className: "text-foreground", children: objectLabel }), ".", " ", detailSuffix] }), otherCount > 0 && (_jsxs("div", { className: "border-t border-border", children: [_jsxs("div", { className: "px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70", children: ["Chats for ", objectLabel] }), _jsx("div", { className: "max-h-56 overflow-y-auto pb-1", children: otherScopedThreads.map((thread) => renderThreadRow(thread, activeThreadId, openTabIds, formatThreadTime, onSelectThread, () => setOpen(false))) })] })), _jsx("div", { className: "border-t border-border p-1", children: _jsxs("button", { type: "button", onClick: () => {
138
138
  setOpen(false);
139
139
  onDetach();
140
140
  }, className: "flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer", children: [_jsx(IconLinkOff, { size: 13 }), _jsx("span", { children: "Remove context" })] }) })] })] }) }));
@@ -151,7 +151,7 @@ function PreviousScopedChatsHint({ scope, threads, onSelectThread, }) {
151
151
  const shown = threads.slice(0, MAX_INLINE);
152
152
  const remaining = threads.length - shown.length;
153
153
  const scopeLabel = scope.label || `this ${formatScopeType(scope.type)}`;
154
- return (_jsxs("div", { className: "flex w-full max-w-[280px] flex-col gap-1.5", children: [_jsxs("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground/70 text-center", children: ["Previous chats for ", scopeLabel] }), _jsx("div", { className: "flex flex-col gap-1", children: shown.map((thread) => (_jsxs("button", { type: "button", onClick: () => onSelectThread(thread.id), className: "flex items-baseline justify-between gap-2 rounded-md border border-border px-2.5 py-1.5 text-left hover:bg-accent cursor-pointer", children: [_jsx("span", { className: "truncate text-[12px] text-foreground", children: thread.title || thread.preview || "Chat" }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: formatThreadTime(thread.updatedAt) })] }, thread.id))) }), remaining > 0 && (_jsxs("div", { className: "text-[10px] text-muted-foreground/70 text-center", children: ["+", remaining, " more"] }))] }));
154
+ return (_jsxs("div", { className: "flex w-full max-w-[280px] flex-col gap-1.5", children: [_jsxs("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground/70 text-center", children: ["Previous chats for ", scopeLabel] }), _jsx("div", { className: "flex flex-col gap-1", children: shown.map((thread) => (_jsxs("button", { type: "button", onClick: () => onSelectThread(thread.id), className: "flex items-baseline justify-between gap-2 rounded-md border border-border px-2.5 py-1.5 text-start hover:bg-accent cursor-pointer", children: [_jsx("span", { className: "truncate text-[12px] text-foreground", children: thread.title || thread.preview || "Chat" }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: formatThreadTime(thread.updatedAt) })] }, thread.id))) }), remaining > 0 && (_jsxs("div", { className: "text-[10px] text-muted-foreground/70 text-center", children: ["+", remaining, " more"] }))] }));
155
155
  }
156
156
  /**
157
157
  * Thin confirmation banner shown briefly after detach. The chip itself
@@ -181,7 +181,7 @@ function renderThreadRow(thread, activeThreadId, openTabIds, formatTime, onSelec
181
181
  return (_jsxs("button", { onClick: () => {
182
182
  onSelect(thread.id);
183
183
  onClose();
184
- }, className: cn("w-full px-3 py-2 text-left hover:bg-accent/50 cursor-pointer", isActive && "bg-accent/30"), children: [_jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [_jsx("span", { className: "text-xs font-medium text-foreground truncate", children: thread.title || thread.preview || "Chat" }), _jsx("span", { className: "text-[10px] text-muted-foreground shrink-0", children: isActive
184
+ }, className: cn("w-full px-3 py-2 text-start hover:bg-accent/50 cursor-pointer", isActive && "bg-accent/30"), children: [_jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [_jsx("span", { className: "text-xs font-medium text-foreground truncate", children: thread.title || thread.preview || "Chat" }), _jsx("span", { className: "text-[10px] text-muted-foreground shrink-0", children: isActive
185
185
  ? "Active"
186
186
  : openTabIds.has(thread.id)
187
187
  ? "Open"
@@ -249,7 +249,7 @@ function HistoryPopover({ threads, openTabIds, activeThreadId, currentScope, onS
249
249
  t.scope.id !== currentScope.id),
250
250
  }
251
251
  : null;
252
- return (_jsxs(Popover, { open: true, onOpenChange: (open) => !open && onClose(), children: [_jsx(PopoverAnchor, { asChild: true, children: _jsx("span", { "aria-hidden": true, className: "absolute right-2 top-0 h-px w-px" }) }), _jsxs(PopoverContent, { align: "end", side: "bottom", sideOffset: 0, onOpenAutoFocus: (event) => {
252
+ return (_jsxs(Popover, { open: true, onOpenChange: (open) => !open && onClose(), children: [_jsx(PopoverAnchor, { asChild: true, children: _jsx("span", { "aria-hidden": true, className: "absolute end-2 top-0 h-px w-px" }) }), _jsxs(PopoverContent, { align: "end", side: "bottom", sideOffset: 0, onOpenAutoFocus: (event) => {
253
253
  event.preventDefault();
254
254
  inputRef.current?.focus();
255
255
  }, className: "w-72 rounded-lg p-0", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [_jsx(IconSearch, { size: 13 }), _jsx("input", { ref: inputRef, type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search chats...", className: "flex-1 bg-transparent text-xs text-foreground placeholder:text-muted-foreground outline-none" })] }), _jsx("div", { className: "max-h-64 overflow-y-auto py-1", children: isSearching ? (_jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: "Searching..." })) : filtered.length === 0 ? (_jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: search ? "No matching chats" : "No chats yet" })) : sectionedThreads ? (_jsxs(_Fragment, { children: [sectionedThreads.scoped.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70", children: ["This ", currentScope.type] }), sectionedThreads.scoped.map((thread) => renderThreadRow(thread, activeThreadId, openTabIds, formatThreadTime, onSelect, onClose))] })), sectionedThreads.other.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70", children: "All chats" }), sectionedThreads.other.map((thread) => renderThreadRow(thread, activeThreadId, openTabIds, formatThreadTime, onSelect, onClose))] }))] })) : (filtered.map((thread) => renderThreadRow(thread, activeThreadId, openTabIds, formatThreadTime, onSelect, onClose))) })] })] }));
@@ -276,7 +276,7 @@ function HelpPopover({ onClose }) {
276
276
  { name: "/help", description: "Show this list of commands" },
277
277
  { name: "@", description: "Mention files, agents, or resources" },
278
278
  ];
279
- return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: onClose }), _jsxs("div", { className: "absolute right-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-border", children: [_jsx("span", { className: "text-xs font-medium text-foreground", children: "Available Commands" }), _jsx("button", { onClick: onClose, "aria-label": "Close help", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground", children: _jsx(IconX, { size: 12 }) })] }), _jsx("div", { className: "py-1", children: commands.map((cmd) => (_jsxs("div", { className: "px-3 py-1.5", children: [_jsx("div", { className: "text-xs font-medium text-foreground", children: cmd.name }), _jsx("div", { className: "text-[11px] text-muted-foreground", children: cmd.description })] }, cmd.name))) })] })] }));
279
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-40", onClick: onClose }), _jsxs("div", { className: "absolute end-2 top-0 z-50 w-72 rounded-lg border border-border bg-popover shadow-lg", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-border", children: [_jsx("span", { className: "text-xs font-medium text-foreground", children: "Available Commands" }), _jsx("button", { onClick: onClose, "aria-label": "Close help", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground", children: _jsx(IconX, { size: 12 }) })] }), _jsx("div", { className: "py-1", children: commands.map((cmd) => (_jsxs("div", { className: "px-3 py-1.5", children: [_jsx("div", { className: "text-xs font-medium text-foreground", children: cmd.name }), _jsx("div", { className: "text-[11px] text-muted-foreground", children: cmd.description })] }, cmd.name))) })] })] }));
280
280
  }
281
281
  function readString(value) {
282
282
  return typeof value === "string" ? value.trim() : "";
@@ -1742,7 +1742,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1742
1742
  activeTab?.parentThreadId === tab.id);
1743
1743
  return (_jsxs("div", { ref: isActive ? activeTabRefCb : undefined, className: cn("agent-tab relative flex items-center rounded-md text-[11px] font-medium shrink-0 max-w-[130px]", isActive
1744
1744
  ? "bg-accent text-foreground ring-1 ring-inset ring-border/60 shadow-sm"
1745
- : "text-muted-foreground hover:text-foreground hover:bg-accent/50"), children: [_jsxs("button", { type: "button", onClick: () => switchThread(tab.id), className: "flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-left", children: [_jsx("span", { className: "truncate pr-1", children: tab.label }), tab.status === "running" && (_jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse" }))] }), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
1745
+ : "text-muted-foreground hover:text-foreground hover:bg-accent/50"), children: [_jsxs("button", { type: "button", onClick: () => switchThread(tab.id), className: "flex items-center gap-1 px-2.5 py-1.5 min-w-0 flex-1 text-start", children: [_jsx("span", { className: "truncate pe-1", children: tab.label }), tab.status === "running" && (_jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse" }))] }), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
1746
1746
  e.stopPropagation();
1747
1747
  e.preventDefault();
1748
1748
  closeTab(tab.id);
@@ -1756,13 +1756,13 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1756
1756
  borderRadius: "0 6px 6px 0",
1757
1757
  background: "linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
1758
1758
  }, children: _jsx(IconX, { size: 12 }) })] }, tab.id));
1759
- }) }), _jsx(TooltipProvider, { delayDuration: 200, children: _jsxs("div", { className: "flex items-center gap-px shrink-0 ml-auto", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: addTab, "aria-label": "New chat", className: "flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 12 }) }) }), _jsx(TooltipContent, { children: "New chat" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => setShowHistory(!showHistory), "aria-label": "All chats", className: cn("flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50", showHistory && "bg-accent text-foreground"), children: _jsx(IconHistory, { size: 12 }) }) }), _jsx(TooltipContent, { children: "All chats" })] })] }) })] }), hasSubTabs && (_jsx("div", { className: "flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30", children: _jsxs("div", { className: "agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1", children: [_jsx("button", { onClick: () => switchThread(focusParentId), className: cn("flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer", activeThreadId === focusParentId
1759
+ }) }), _jsx(TooltipProvider, { delayDuration: 200, children: _jsxs("div", { className: "flex items-center gap-px shrink-0 ms-auto", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: addTab, "aria-label": "New chat", className: "flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { size: 12 }) }) }), _jsx(TooltipContent, { children: "New chat" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => setShowHistory(!showHistory), "aria-label": "All chats", className: cn("flex h-6 w-6 items-center justify-center rounded text-muted-foreground/60 hover:text-foreground hover:bg-accent/50", showHistory && "bg-accent text-foreground"), children: _jsx(IconHistory, { size: 12 }) }) }), _jsx(TooltipContent, { children: "All chats" })] })] }) })] }), hasSubTabs && (_jsx("div", { className: "flex items-center px-1 py-0.5 border-b border-border shrink-0 gap-0.5 bg-muted/30", children: _jsxs("div", { className: "agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1", children: [_jsx("button", { onClick: () => switchThread(focusParentId), className: cn("flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer", activeThreadId === focusParentId
1760
1760
  ? "bg-accent text-foreground"
1761
1761
  : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: "Main" }), childTabs.map((tab) => (_jsxs("div", { ref: tab.id === activeThreadId
1762
1762
  ? activeTabRefCb
1763
1763
  : undefined, className: cn("agent-tab relative flex shrink-0 items-center rounded-md text-[10px] font-medium max-w-[130px]", tab.id === activeThreadId
1764
1764
  ? "bg-accent text-foreground"
1765
- : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsxs("button", { type: "button", onClick: () => switchThread(tab.id), className: "flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-left", children: [_jsx("span", { className: "truncate pr-1", children: tab.subAgentName || tab.label }), tab.status === "running" && (_jsx("span", { className: "w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse" }))] }), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
1765
+ : "text-muted-foreground hover:bg-accent hover:text-foreground"), children: [_jsxs("button", { type: "button", onClick: () => switchThread(tab.id), className: "flex items-center gap-1 px-2 py-1 min-w-0 flex-1 text-start", children: [_jsx("span", { className: "truncate pe-1", children: tab.subAgentName || tab.label }), tab.status === "running" && (_jsx("span", { className: "w-1 h-1 rounded-full bg-muted-foreground/50 shrink-0 animate-pulse" }))] }), _jsx("button", { type: "button", "aria-label": "Close tab", onClick: (e) => {
1766
1766
  e.stopPropagation();
1767
1767
  e.preventDefault();
1768
1768
  closeTab(tab.id);