@arbidocs/blocks 0.3.185 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/README.md +100 -0
  2. package/dist/agents/approvals/AuthorizeAgentParts.d.ts +79 -0
  3. package/dist/agents/approvals/ConsentPage.d.ts +76 -0
  4. package/dist/agents/approvals/ConsentParts.d.ts +37 -0
  5. package/dist/agents/approvals/index.d.ts +3 -0
  6. package/dist/agents/config/ConfigField.d.ts +43 -0
  7. package/dist/agents/config/ConfigForm.d.ts +35 -0
  8. package/dist/agents/config/TupleArrayField.d.ts +32 -0
  9. package/dist/agents/config/index.d.ts +4 -0
  10. package/dist/agents/config/schema-utils.d.ts +28 -0
  11. package/dist/agents/definitions/AgentCard.d.ts +63 -0
  12. package/dist/agents/definitions/AgentCreator.d.ts +118 -0
  13. package/dist/agents/definitions/AgentEditorParts.d.ts +63 -0
  14. package/dist/agents/definitions/AgentGallery.d.ts +29 -0
  15. package/dist/agents/definitions/index.d.ts +4 -0
  16. package/dist/agents/index.cjs +595 -0
  17. package/dist/agents/index.cjs.map +1 -0
  18. package/dist/agents/index.d.ts +7 -0
  19. package/dist/agents/index.js +14 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/runs/AgentBar.d.ts +103 -0
  22. package/dist/agents/runs/AgentSteps.d.ts +157 -0
  23. package/dist/agents/runs/SubagentRoster.d.ts +37 -0
  24. package/dist/agents/runs/index.d.ts +3 -0
  25. package/dist/agents/skills/SkillBrowserParts.d.ts +70 -0
  26. package/dist/agents/skills/SkillCard.d.ts +48 -0
  27. package/dist/agents/skills/SkillForms.d.ts +64 -0
  28. package/dist/agents/skills/SkillParts.d.ts +31 -0
  29. package/dist/agents/skills/SkillRow.d.ts +34 -0
  30. package/dist/agents/skills/index.d.ts +5 -0
  31. package/dist/agents/tasks/LiveRunsBanner.d.ts +26 -0
  32. package/dist/agents/tasks/RecurrenceBuilder.d.ts +36 -0
  33. package/dist/agents/tasks/TaskComposer.d.ts +108 -0
  34. package/dist/agents/tasks/TaskPlan.d.ts +78 -0
  35. package/dist/agents/tasks/TaskRowActions.d.ts +43 -0
  36. package/dist/agents/tasks/TaskRunsDialog.d.ts +45 -0
  37. package/dist/agents/tasks/TasksChrome.d.ts +36 -0
  38. package/dist/agents/tasks/UploadTaskItem.d.ts +39 -0
  39. package/dist/agents/tasks/UploadTaskList.d.ts +35 -0
  40. package/dist/agents/tasks/elapsed.d.ts +2 -0
  41. package/dist/agents/tasks/index.d.ts +13 -0
  42. package/dist/agents/tasks/rrule.d.ts +36 -0
  43. package/dist/agents/tasks/taskColumns.d.ts +68 -0
  44. package/dist/agents/tasks/taskLabels.d.ts +26 -0
  45. package/dist/agents/workflows/AgentSelect.d.ts +33 -0
  46. package/dist/agents/workflows/SchemaForm.d.ts +37 -0
  47. package/dist/agents/workflows/WorkflowConfigDialog.d.ts +73 -0
  48. package/dist/agents/workflows/WorkflowLauncher.d.ts +38 -0
  49. package/dist/agents/workflows/index.d.ts +6 -0
  50. package/dist/agents/workflows/types.d.ts +125 -0
  51. package/dist/agents/workflows/workflow.d.ts +62 -0
  52. package/dist/auth/AuthFooter.d.ts +56 -0
  53. package/dist/auth/AuthForm.d.ts +105 -0
  54. package/dist/auth/AuthLayout.d.ts +46 -0
  55. package/dist/auth/PasswordStrengthInput.d.ts +44 -0
  56. package/dist/auth/RecoveryDialogs.d.ts +90 -0
  57. package/dist/auth/SsoLoginButton.d.ts +19 -0
  58. package/dist/auth/index.cjs +123 -0
  59. package/dist/auth/index.cjs.map +1 -0
  60. package/dist/auth/index.d.ts +6 -0
  61. package/dist/auth/index.js +6 -0
  62. package/dist/auth/index.js.map +1 -0
  63. package/dist/builder/AgentsPanel.d.ts +9 -0
  64. package/dist/builder/ModuleManager.d.ts +6 -0
  65. package/dist/builder/VerticalBuilder.d.ts +32 -0
  66. package/dist/builder/agents/store.d.ts +21 -0
  67. package/dist/builder/export.d.ts +30 -0
  68. package/dist/builder/modules/registry.d.ts +11 -0
  69. package/dist/builder/modules/store.d.ts +29 -0
  70. package/dist/builder/modules/types.d.ts +29 -0
  71. package/dist/builder/types.d.ts +28 -0
  72. package/dist/chat/BranchControls.d.ts +33 -0
  73. package/dist/chat/Composer.d.ts +156 -0
  74. package/dist/chat/ContextChip.d.ts +19 -0
  75. package/dist/chat/ContextPanel.d.ts +108 -0
  76. package/dist/chat/ConversationEmpty.d.ts +53 -0
  77. package/dist/chat/ConversationLayout.d.ts +40 -0
  78. package/dist/chat/ConversationParts.d.ts +62 -0
  79. package/dist/chat/ConversationSearchView.d.ts +57 -0
  80. package/dist/chat/LabelPinRow.d.ts +30 -0
  81. package/dist/chat/Message.d.ts +189 -0
  82. package/dist/chat/MessageAlert.d.ts +25 -0
  83. package/dist/chat/MessageList.d.ts +102 -0
  84. package/dist/chat/ModelPicker.d.ts +103 -0
  85. package/dist/chat/PendingAnswerBar.d.ts +36 -0
  86. package/dist/chat/PinnedDocChip.d.ts +22 -0
  87. package/dist/chat/SlashMenu.d.ts +57 -0
  88. package/dist/chat/ThreadMap.d.ts +45 -0
  89. package/dist/chat/index.cjs +423 -0
  90. package/dist/chat/index.cjs.map +1 -0
  91. package/dist/chat/index.d.ts +21 -0
  92. package/dist/chat/index.js +6 -0
  93. package/dist/chat/index.js.map +1 -0
  94. package/dist/chat/test-id.d.ts +16 -0
  95. package/dist/chat/useStreamAnnouncement.d.ts +19 -0
  96. package/dist/chunk-223D4727.cjs +50 -0
  97. package/dist/chunk-223D4727.cjs.map +1 -0
  98. package/dist/chunk-4EZVCGRL.js +803 -0
  99. package/dist/chunk-4EZVCGRL.js.map +1 -0
  100. package/dist/chunk-54Q3RNJU.cjs +516 -0
  101. package/dist/chunk-54Q3RNJU.cjs.map +1 -0
  102. package/dist/chunk-5B4PXAKI.cjs +287 -0
  103. package/dist/chunk-5B4PXAKI.cjs.map +1 -0
  104. package/dist/chunk-5TYEJOXY.js +1762 -0
  105. package/dist/chunk-5TYEJOXY.js.map +1 -0
  106. package/dist/chunk-6ALISABK.cjs +677 -0
  107. package/dist/chunk-6ALISABK.cjs.map +1 -0
  108. package/dist/chunk-6HIPFEID.cjs +574 -0
  109. package/dist/chunk-6HIPFEID.cjs.map +1 -0
  110. package/dist/chunk-76JDDMSP.js +31 -0
  111. package/dist/chunk-76JDDMSP.js.map +1 -0
  112. package/dist/chunk-7F6CBP3Z.js +12 -0
  113. package/dist/chunk-7F6CBP3Z.js.map +1 -0
  114. package/dist/chunk-7G2LJMUG.cjs +45 -0
  115. package/dist/chunk-7G2LJMUG.cjs.map +1 -0
  116. package/dist/chunk-7G3JNSJB.cjs +1809 -0
  117. package/dist/chunk-7G3JNSJB.cjs.map +1 -0
  118. package/dist/chunk-A2YAC22G.js +93 -0
  119. package/dist/chunk-A2YAC22G.js.map +1 -0
  120. package/dist/chunk-ADOKTJHV.cjs +262 -0
  121. package/dist/chunk-ADOKTJHV.cjs.map +1 -0
  122. package/dist/chunk-AXIZ2MDV.js +751 -0
  123. package/dist/chunk-AXIZ2MDV.js.map +1 -0
  124. package/dist/chunk-AZQDNYH4.js +2865 -0
  125. package/dist/chunk-AZQDNYH4.js.map +1 -0
  126. package/dist/chunk-C54XEN5T.cjs +34 -0
  127. package/dist/chunk-C54XEN5T.cjs.map +1 -0
  128. package/dist/chunk-CQCC7LE7.js +210 -0
  129. package/dist/chunk-CQCC7LE7.js.map +1 -0
  130. package/dist/chunk-CRIKTUEU.cjs +47 -0
  131. package/dist/chunk-CRIKTUEU.cjs.map +1 -0
  132. package/dist/chunk-CTZ5745I.js +564 -0
  133. package/dist/chunk-CTZ5745I.js.map +1 -0
  134. package/dist/chunk-DPLRHEJZ.js +78 -0
  135. package/dist/chunk-DPLRHEJZ.js.map +1 -0
  136. package/dist/chunk-DVLEQURC.js +672 -0
  137. package/dist/chunk-DVLEQURC.js.map +1 -0
  138. package/dist/chunk-ELR74ME6.cjs +68 -0
  139. package/dist/chunk-ELR74ME6.cjs.map +1 -0
  140. package/dist/{chunk-DBAUZD7A.cjs → chunk-FZQJ2S6P.cjs} +244 -1123
  141. package/dist/chunk-FZQJ2S6P.cjs.map +1 -0
  142. package/dist/chunk-G3G7LZPM.cjs +205 -0
  143. package/dist/chunk-G3G7LZPM.cjs.map +1 -0
  144. package/dist/chunk-GDFWJ73C.cjs +2973 -0
  145. package/dist/chunk-GDFWJ73C.cjs.map +1 -0
  146. package/dist/chunk-ITGHMJOM.js +5528 -0
  147. package/dist/chunk-ITGHMJOM.js.map +1 -0
  148. package/dist/chunk-K4BGOPGG.js +79 -0
  149. package/dist/chunk-K4BGOPGG.js.map +1 -0
  150. package/dist/chunk-KUA3BCT2.cjs +272 -0
  151. package/dist/chunk-KUA3BCT2.cjs.map +1 -0
  152. package/dist/chunk-LGBAZD37.js +341 -0
  153. package/dist/chunk-LGBAZD37.js.map +1 -0
  154. package/dist/chunk-MHVNT4J3.cjs +15 -0
  155. package/dist/chunk-MHVNT4J3.cjs.map +1 -0
  156. package/dist/chunk-MMYCZRKT.cjs +168 -0
  157. package/dist/chunk-MMYCZRKT.cjs.map +1 -0
  158. package/dist/chunk-NBV56SGU.js +42 -0
  159. package/dist/chunk-NBV56SGU.js.map +1 -0
  160. package/dist/chunk-NPLYHR2E.js +13 -0
  161. package/dist/chunk-NPLYHR2E.js.map +1 -0
  162. package/dist/chunk-NUNKSZKU.js +203 -0
  163. package/dist/chunk-NUNKSZKU.js.map +1 -0
  164. package/dist/chunk-OB5F4577.cjs +40 -0
  165. package/dist/chunk-OB5F4577.cjs.map +1 -0
  166. package/dist/chunk-OUW6G4O2.cjs +96 -0
  167. package/dist/chunk-OUW6G4O2.cjs.map +1 -0
  168. package/dist/chunk-OVEQERPO.js +66 -0
  169. package/dist/chunk-OVEQERPO.js.map +1 -0
  170. package/dist/chunk-P6GHJSLR.js +34 -0
  171. package/dist/chunk-P6GHJSLR.js.map +1 -0
  172. package/dist/chunk-PCB2BPN3.cjs +41 -0
  173. package/dist/chunk-PCB2BPN3.cjs.map +1 -0
  174. package/dist/chunk-PPCATBOY.cjs +15 -0
  175. package/dist/chunk-PPCATBOY.cjs.map +1 -0
  176. package/dist/chunk-QN42OA5J.js +887 -0
  177. package/dist/chunk-QN42OA5J.js.map +1 -0
  178. package/dist/{chunk-FZ2S6VAZ.js → chunk-RBXZYNVB.js} +223 -1102
  179. package/dist/chunk-RBXZYNVB.js.map +1 -0
  180. package/dist/chunk-RC6VTY2H.js +47 -0
  181. package/dist/chunk-RC6VTY2H.js.map +1 -0
  182. package/dist/chunk-RFIBUWLF.cjs +232 -0
  183. package/dist/chunk-RFIBUWLF.cjs.map +1 -0
  184. package/dist/chunk-S5T7ZTX2.js +266 -0
  185. package/dist/chunk-S5T7ZTX2.js.map +1 -0
  186. package/dist/chunk-S7PSMMRG.js +38 -0
  187. package/dist/chunk-S7PSMMRG.js.map +1 -0
  188. package/dist/chunk-SCFYPAG6.cjs +18 -0
  189. package/dist/chunk-SCFYPAG6.cjs.map +1 -0
  190. package/dist/chunk-SYDHKKRZ.cjs +818 -0
  191. package/dist/chunk-SYDHKKRZ.cjs.map +1 -0
  192. package/dist/chunk-TX2ZICS7.js +139 -0
  193. package/dist/chunk-TX2ZICS7.js.map +1 -0
  194. package/dist/chunk-TYZUCAT7.js +787 -0
  195. package/dist/chunk-TYZUCAT7.js.map +1 -0
  196. package/dist/chunk-U2E3WT3J.js +45 -0
  197. package/dist/chunk-U2E3WT3J.js.map +1 -0
  198. package/dist/chunk-UBNVIIBT.js +284 -0
  199. package/dist/chunk-UBNVIIBT.js.map +1 -0
  200. package/dist/chunk-UFHMLHIR.cjs +66 -0
  201. package/dist/chunk-UFHMLHIR.cjs.map +1 -0
  202. package/dist/chunk-UJE32SST.js +39 -0
  203. package/dist/chunk-UJE32SST.js.map +1 -0
  204. package/dist/chunk-ULWRNGGE.cjs +146 -0
  205. package/dist/chunk-ULWRNGGE.cjs.map +1 -0
  206. package/dist/chunk-UTWX2X2A.js +165 -0
  207. package/dist/chunk-UTWX2X2A.js.map +1 -0
  208. package/dist/chunk-UWGIB3VQ.js +64 -0
  209. package/dist/chunk-UWGIB3VQ.js.map +1 -0
  210. package/dist/chunk-V4ISCZJ7.cjs +207 -0
  211. package/dist/chunk-V4ISCZJ7.cjs.map +1 -0
  212. package/dist/chunk-VFUWWH52.cjs +83 -0
  213. package/dist/chunk-VFUWWH52.cjs.map +1 -0
  214. package/dist/chunk-VILAPTCB.js +259 -0
  215. package/dist/chunk-VILAPTCB.js.map +1 -0
  216. package/dist/chunk-VLCY46K6.cjs +82 -0
  217. package/dist/chunk-VLCY46K6.cjs.map +1 -0
  218. package/dist/chunk-VPPX5XUF.cjs +813 -0
  219. package/dist/chunk-VPPX5XUF.cjs.map +1 -0
  220. package/dist/chunk-WJMEXTVD.cjs +122 -0
  221. package/dist/chunk-WJMEXTVD.cjs.map +1 -0
  222. package/dist/chunk-WTNMWEBC.js +504 -0
  223. package/dist/chunk-WTNMWEBC.js.map +1 -0
  224. package/dist/chunk-WW6EOVZA.js +112 -0
  225. package/dist/chunk-WW6EOVZA.js.map +1 -0
  226. package/dist/chunk-XNBAXRY7.cjs +5673 -0
  227. package/dist/chunk-XNBAXRY7.cjs.map +1 -0
  228. package/dist/chunk-XQ7PKKDY.cjs +787 -0
  229. package/dist/chunk-XQ7PKKDY.cjs.map +1 -0
  230. package/dist/chunk-XZIYRKLW.cjs +347 -0
  231. package/dist/chunk-XZIYRKLW.cjs.map +1 -0
  232. package/dist/chunk-YBXCZEWS.js +187 -0
  233. package/dist/chunk-YBXCZEWS.js.map +1 -0
  234. package/dist/chunk-YDHO4AVL.js +16 -0
  235. package/dist/chunk-YDHO4AVL.js.map +1 -0
  236. package/dist/chunk-ZORQ5M3W.cjs +934 -0
  237. package/dist/chunk-ZORQ5M3W.cjs.map +1 -0
  238. package/dist/chunk-ZW6FPIFC.cjs +36 -0
  239. package/dist/chunk-ZW6FPIFC.cjs.map +1 -0
  240. package/dist/citations/CitationEditor.d.ts +58 -0
  241. package/dist/citations/PassagePill.d.ts +49 -0
  242. package/dist/citations/QuietMarks.d.ts +81 -0
  243. package/dist/citations/index.cjs +47 -0
  244. package/dist/citations/index.cjs.map +1 -0
  245. package/dist/citations/index.d.ts +3 -0
  246. package/dist/citations/index.js +6 -0
  247. package/dist/citations/index.js.map +1 -0
  248. package/dist/collaboration/contacts/AddContactsParts.d.ts +46 -0
  249. package/dist/collaboration/contacts/index.d.ts +1 -0
  250. package/dist/collaboration/direct-messages/DirectMessages.d.ts +33 -0
  251. package/dist/collaboration/direct-messages/DmParts.d.ts +139 -0
  252. package/dist/collaboration/direct-messages/index.d.ts +2 -0
  253. package/dist/collaboration/index.cjs +141 -0
  254. package/dist/collaboration/index.cjs.map +1 -0
  255. package/dist/collaboration/index.d.ts +5 -0
  256. package/dist/collaboration/index.js +8 -0
  257. package/dist/collaboration/index.js.map +1 -0
  258. package/dist/collaboration/mail/MailFolderTree.d.ts +34 -0
  259. package/dist/collaboration/mail/index.d.ts +2 -0
  260. package/dist/collaboration/mail/mailFolders.d.ts +25 -0
  261. package/dist/collaboration/members/WorkspaceMembers.d.ts +74 -0
  262. package/dist/collaboration/members/index.d.ts +1 -0
  263. package/dist/collaboration/sharing/ShareControl.d.ts +38 -0
  264. package/dist/collaboration/sharing/index.d.ts +1 -0
  265. package/dist/components/Accordion.d.ts +12 -0
  266. package/dist/components/ActionLink.d.ts +18 -0
  267. package/dist/components/AskBar.d.ts +48 -0
  268. package/dist/components/AvatarBlock.d.ts +9 -0
  269. package/dist/components/Banner.d.ts +12 -0
  270. package/dist/components/BlockImage.d.ts +18 -0
  271. package/dist/components/CTABanner.d.ts +17 -0
  272. package/dist/components/Callout.d.ts +9 -0
  273. package/dist/components/Chart.d.ts +27 -0
  274. package/dist/components/CollectionDetail.d.ts +23 -0
  275. package/dist/components/Columns.d.ts +11 -0
  276. package/dist/components/ContactForm.d.ts +42 -0
  277. package/dist/components/Container.d.ts +11 -0
  278. package/dist/components/DataTable.d.ts +47 -0
  279. package/dist/components/DataTableBlock.d.ts +26 -0
  280. package/dist/components/EmptyState.d.ts +11 -0
  281. package/dist/components/EntityChip.d.ts +24 -0
  282. package/dist/components/EntityIdentityBar.d.ts +90 -0
  283. package/dist/components/EntityTooltip.d.ts +43 -0
  284. package/dist/components/FAQ.d.ts +14 -0
  285. package/dist/components/FeatureGrid.d.ts +18 -0
  286. package/dist/components/Footer.d.ts +25 -0
  287. package/dist/components/Gallery.d.ts +15 -0
  288. package/dist/components/Hero.d.ts +35 -0
  289. package/dist/components/ListBlock.d.ts +10 -0
  290. package/dist/components/LogoCloud.d.ts +12 -0
  291. package/dist/components/MediaText.d.ts +15 -0
  292. package/dist/components/MemberAvatarStack.d.ts +36 -0
  293. package/dist/components/MetricCard.d.ts +28 -0
  294. package/dist/components/Navbar.d.ts +39 -0
  295. package/dist/components/PageHeader.d.ts +15 -0
  296. package/dist/components/PricingTable.d.ts +19 -0
  297. package/dist/components/RichTextBlock.d.ts +10 -0
  298. package/dist/components/SectionHeading.d.ts +11 -0
  299. package/dist/components/Spacer.d.ts +7 -0
  300. package/dist/components/StatGroup.d.ts +12 -0
  301. package/dist/components/Steps.d.ts +12 -0
  302. package/dist/components/Tabs.d.ts +15 -0
  303. package/dist/components/TeamGrid.d.ts +18 -0
  304. package/dist/components/Testimonial.d.ts +9 -0
  305. package/dist/components/TestimonialGrid.d.ts +13 -0
  306. package/dist/components/ToneBadge.d.ts +18 -0
  307. package/dist/components/Toolbar.d.ts +11 -0
  308. package/dist/components/UsageMeter.d.ts +21 -0
  309. package/dist/components/VideoEmbed.d.ts +16 -0
  310. package/dist/components/assetImage.d.ts +16 -0
  311. package/dist/components/assetResolver.d.ts +57 -0
  312. package/dist/components/blockLink.d.ts +26 -0
  313. package/dist/components/tones.d.ts +14 -0
  314. package/dist/connect/index.cjs +65 -0
  315. package/dist/connect/index.cjs.map +1 -0
  316. package/dist/connect/index.d.ts +8 -0
  317. package/dist/connect/index.js +28 -0
  318. package/dist/connect/index.js.map +1 -0
  319. package/dist/connection/ArbiAppProvider.d.ts +16 -0
  320. package/dist/connection/ConnectionProvider.d.ts +50 -0
  321. package/dist/connection/ai.d.ts +99 -0
  322. package/dist/connection/types.d.ts +54 -0
  323. package/dist/connection/useImageGen.d.ts +22 -0
  324. package/dist/facts/FactComposer.d.ts +75 -0
  325. package/dist/facts/FactDateInput.d.ts +34 -0
  326. package/dist/facts/FactLabelsCell.d.ts +35 -0
  327. package/dist/facts/FactPassages.d.ts +52 -0
  328. package/dist/facts/FactRowActions.d.ts +18 -0
  329. package/dist/facts/FactSearchParts.d.ts +80 -0
  330. package/dist/facts/FactSourceGroup.d.ts +26 -0
  331. package/dist/facts/FactTimelineViews.d.ts +37 -0
  332. package/dist/facts/FactsBulkBar.d.ts +53 -0
  333. package/dist/facts/FactsEmptyState.d.ts +38 -0
  334. package/dist/facts/FactsFieldsButton.d.ts +21 -0
  335. package/dist/facts/FactsFilterInput.d.ts +46 -0
  336. package/dist/facts/FactsTable.d.ts +28 -0
  337. package/dist/facts/FactsToolbar.d.ts +53 -0
  338. package/dist/facts/FactsViewToggle.d.ts +36 -0
  339. package/dist/facts/fact-date.d.ts +22 -0
  340. package/dist/facts/fact-text.d.ts +14 -0
  341. package/dist/facts/factColumns.d.ts +88 -0
  342. package/dist/facts/index.cjs +2372 -0
  343. package/dist/facts/index.cjs.map +1 -0
  344. package/dist/facts/index.d.ts +34 -0
  345. package/dist/facts/index.js +2316 -0
  346. package/dist/facts/index.js.map +1 -0
  347. package/dist/facts/timezone.d.ts +4 -0
  348. package/dist/files/AiReviewDialog.d.ts +77 -0
  349. package/dist/files/DocStatusIcon.d.ts +12 -0
  350. package/dist/files/DocumentGrid.d.ts +27 -0
  351. package/dist/files/Explorer.d.ts +10 -0
  352. package/dist/files/ExplorerSurface.d.ts +34 -0
  353. package/dist/files/ExplorerTile.d.ts +142 -0
  354. package/dist/files/ExportParts.d.ts +114 -0
  355. package/dist/files/FieldParts.d.ts +64 -0
  356. package/dist/files/FilesPage.d.ts +20 -0
  357. package/dist/files/FilesToolbar.d.ts +59 -0
  358. package/dist/files/FolderPicker.d.ts +82 -0
  359. package/dist/files/GridView.d.ts +59 -0
  360. package/dist/files/HtmlViewerParts.d.ts +183 -0
  361. package/dist/files/MoveToFolderDialog.d.ts +32 -0
  362. package/dist/files/RedlineParts.d.ts +72 -0
  363. package/dist/files/SelectionBar.d.ts +65 -0
  364. package/dist/files/StatusPill.d.ts +23 -0
  365. package/dist/files/TagPassagePanel.d.ts +60 -0
  366. package/dist/files/UploadDropzone.d.ts +33 -0
  367. package/dist/files/UploadFooter.d.ts +59 -0
  368. package/dist/files/UploadParts.d.ts +78 -0
  369. package/dist/files/UploadSources.d.ts +77 -0
  370. package/dist/files/VersionTimeline.d.ts +60 -0
  371. package/dist/files/ViewToggle.d.ts +49 -0
  372. package/dist/files/ViewerChrome.d.ts +155 -0
  373. package/dist/files/ViewerLayout.d.ts +32 -0
  374. package/dist/files/ViewerParts.d.ts +62 -0
  375. package/dist/files/bulk/BulkActionsBar.d.ts +76 -0
  376. package/dist/files/bulk/FolderFilterButton.d.ts +35 -0
  377. package/dist/files/bulk/index.d.ts +2 -0
  378. package/dist/files/cells/DocumentNameCell.d.ts +31 -0
  379. package/dist/files/cells/FolderCell.d.ts +25 -0
  380. package/dist/files/cells/HoverIconCell.d.ts +21 -0
  381. package/dist/files/cells/LabelMultiSelect.d.ts +50 -0
  382. package/dist/files/cells/RelatedDocsCell.d.ts +22 -0
  383. package/dist/files/cells/TagColumnParts.d.ts +29 -0
  384. package/dist/files/cells/index.d.ts +6 -0
  385. package/dist/files/documentGridLayout.d.ts +31 -0
  386. package/dist/files/grid-test-ids.d.ts +18 -0
  387. package/dist/files/import/CalendarImportRow.d.ts +26 -0
  388. package/dist/files/import/ImportParts.d.ts +114 -0
  389. package/dist/files/import/TaskSection.d.ts +51 -0
  390. package/dist/files/import/UrlInputDialogView.d.ts +63 -0
  391. package/dist/files/import/VendorLogo.d.ts +15 -0
  392. package/dist/files/import/index.d.ts +5 -0
  393. package/dist/files/index.cjs +7589 -0
  394. package/dist/files/index.cjs.map +1 -0
  395. package/dist/files/index.d.ts +34 -0
  396. package/dist/files/index.js +7374 -0
  397. package/dist/files/index.js.map +1 -0
  398. package/dist/files/page/FilesAddMenu.d.ts +30 -0
  399. package/dist/files/page/FilesPageParts.d.ts +24 -0
  400. package/dist/files/page/FilesPageTitle.d.ts +24 -0
  401. package/dist/files/page/index.d.ts +3 -0
  402. package/dist/files/tags/BulkTagEditor.d.ts +136 -0
  403. package/dist/files/tags/DocTagPopover.d.ts +113 -0
  404. package/dist/files/tags/TagManager.d.ts +54 -0
  405. package/dist/files/tags/index.d.ts +3 -0
  406. package/dist/files/views/FieldsEditorParts.d.ts +151 -0
  407. package/dist/files/views/FieldsManagerParts.d.ts +17 -0
  408. package/dist/files/views/TagFormParts.d.ts +109 -0
  409. package/dist/files/views/ViewSelectorMenu.d.ts +66 -0
  410. package/dist/files/views/fieldsEditorModel.d.ts +43 -0
  411. package/dist/files/views/index.d.ts +5 -0
  412. package/dist/home/ActionMenuDialog.d.ts +26 -0
  413. package/dist/home/AddFilesFirst.d.ts +22 -0
  414. package/dist/home/CardHeaderBar.d.ts +40 -0
  415. package/dist/home/CollapsibleSection.d.ts +43 -0
  416. package/dist/home/CreateTile.d.ts +17 -0
  417. package/dist/home/DashboardParts.d.ts +32 -0
  418. package/dist/home/FactsStrip.d.ts +41 -0
  419. package/dist/home/FoldSection.d.ts +19 -0
  420. package/dist/home/GettingStartedStrip.d.ts +49 -0
  421. package/dist/home/Greeting.d.ts +18 -0
  422. package/dist/home/HomeLayout.d.ts +28 -0
  423. package/dist/home/KeyValueRow.d.ts +43 -0
  424. package/dist/home/ProjectBandParts.d.ts +70 -0
  425. package/dist/home/QuickActionDialogHeader.d.ts +21 -0
  426. package/dist/home/RecentList.d.ts +48 -0
  427. package/dist/home/ScopePicker.d.ts +65 -0
  428. package/dist/home/StartTiles.d.ts +33 -0
  429. package/dist/home/index.cjs +854 -0
  430. package/dist/home/index.cjs.map +1 -0
  431. package/dist/home/index.d.ts +37 -0
  432. package/dist/home/index.js +763 -0
  433. package/dist/home/index.js.map +1 -0
  434. package/dist/home/sections.d.ts +33 -0
  435. package/dist/index.cjs +1932 -5547
  436. package/dist/index.cjs.map +1 -1
  437. package/dist/index.d.ts +71 -1716
  438. package/dist/index.js +142 -5316
  439. package/dist/index.js.map +1 -1
  440. package/dist/lib/balanced-columns.d.ts +8 -0
  441. package/dist/lib/format.d.ts +37 -0
  442. package/dist/lib/observe-resize.d.ts +6 -0
  443. package/dist/lib/password-strength.d.ts +24 -0
  444. package/dist/lib/sidebar-mode.d.ts +46 -0
  445. package/dist/lib/testid.d.ts +7 -0
  446. package/dist/lib/use-drawer.d.ts +11 -0
  447. package/dist/lib/useControllableState.d.ts +5 -0
  448. package/dist/lib/useDismissibleCard.d.ts +15 -0
  449. package/dist/lib/useListKeyNav.d.ts +42 -0
  450. package/dist/lib/useLongPaste.d.ts +15 -0
  451. package/dist/lib/useRestoreFocus.d.ts +11 -0
  452. package/dist/lib/useScopeSelection.d.ts +34 -0
  453. package/dist/nav/types.d.ts +19 -0
  454. package/dist/provider/BlocksProvider.d.ts +20 -0
  455. package/dist/provider/TooltipScope.d.ts +9 -0
  456. package/dist/record/index.cjs +2 -4
  457. package/dist/record/index.cjs.map +1 -1
  458. package/dist/record/index.d.ts +12 -16
  459. package/dist/record/index.js +2 -4
  460. package/dist/record/index.js.map +1 -1
  461. package/dist/retrieval/HighlightText.d.ts +21 -0
  462. package/dist/retrieval/SearchEmptyState.d.ts +39 -0
  463. package/dist/retrieval/SearchGroupHeader.d.ts +21 -0
  464. package/dist/retrieval/SearchHit.d.ts +36 -0
  465. package/dist/retrieval/SearchPage.d.ts +187 -0
  466. package/dist/retrieval/SearchPagination.d.ts +21 -0
  467. package/dist/retrieval/highlight.d.ts +21 -0
  468. package/dist/retrieval/index.cjs +160 -0
  469. package/dist/retrieval/index.cjs.map +1 -0
  470. package/dist/retrieval/index.d.ts +7 -0
  471. package/dist/retrieval/index.js +7 -0
  472. package/dist/retrieval/index.js.map +1 -0
  473. package/dist/settings/AccountDialogs.d.ts +89 -0
  474. package/dist/settings/AvatarPicker.d.ts +25 -0
  475. package/dist/settings/Billing.d.ts +113 -0
  476. package/dist/settings/ConfigSwitcherBar.d.ts +46 -0
  477. package/dist/settings/ConfirmDialog.d.ts +28 -0
  478. package/dist/settings/ConnectionCard.d.ts +58 -0
  479. package/dist/settings/ConversationSettingsParts.d.ts +53 -0
  480. package/dist/settings/DocumentPicker.d.ts +57 -0
  481. package/dist/settings/EmailWorkspaceDialogView.d.ts +60 -0
  482. package/dist/settings/ErrorDialog.d.ts +36 -0
  483. package/dist/settings/FloatingPanel.d.ts +32 -0
  484. package/dist/settings/JsonTree.d.ts +24 -0
  485. package/dist/settings/LogoutDialog.d.ts +51 -0
  486. package/dist/settings/ModalBreadcrumbHeader.d.ts +32 -0
  487. package/dist/settings/ModalScaffold.d.ts +60 -0
  488. package/dist/settings/MultiSelect.d.ts +111 -0
  489. package/dist/settings/NotificationCategoryList.d.ts +26 -0
  490. package/dist/settings/PanelFrame.d.ts +47 -0
  491. package/dist/settings/PasswordChangeDialog.d.ts +64 -0
  492. package/dist/settings/PlanBadge.d.ts +14 -0
  493. package/dist/settings/PlanCard.d.ts +97 -0
  494. package/dist/settings/PremiumModelsFrame.d.ts +17 -0
  495. package/dist/settings/ProfileCard.d.ts +67 -0
  496. package/dist/settings/Projects.d.ts +108 -0
  497. package/dist/settings/QuotaMeter.d.ts +31 -0
  498. package/dist/settings/ReferralCredit.d.ts +46 -0
  499. package/dist/settings/SegmentedControl.d.ts +20 -0
  500. package/dist/settings/ServerConnectionControls.d.ts +31 -0
  501. package/dist/settings/SettingsPanel.d.ts +61 -0
  502. package/dist/settings/SettingsSwitchRow.d.ts +21 -0
  503. package/dist/settings/SubscriptionParts.d.ts +215 -0
  504. package/dist/settings/SupportPanel.d.ts +32 -0
  505. package/dist/settings/SyncDialogParts.d.ts +155 -0
  506. package/dist/settings/ThreadPreviewDialog.d.ts +18 -0
  507. package/dist/settings/TipsEditorDialog.d.ts +94 -0
  508. package/dist/settings/TriStateFilterMenu.d.ts +66 -0
  509. package/dist/settings/Usage.d.ts +102 -0
  510. package/dist/settings/WelcomeDialog.d.ts +79 -0
  511. package/dist/settings/index.cjs +5131 -0
  512. package/dist/settings/index.cjs.map +1 -0
  513. package/dist/settings/index.d.ts +38 -0
  514. package/dist/settings/index.js +4922 -0
  515. package/dist/settings/index.js.map +1 -0
  516. package/dist/shell/ActionCluster.d.ts +28 -0
  517. package/dist/shell/AskField.d.ts +71 -0
  518. package/dist/shell/InfoBar.d.ts +20 -0
  519. package/dist/shell/MobileBars.d.ts +47 -0
  520. package/dist/shell/OfflinePill.d.ts +28 -0
  521. package/dist/shell/RemoteControlPill.d.ts +23 -0
  522. package/dist/shell/Shell.d.ts +123 -0
  523. package/dist/shell/Sidebar.d.ts +104 -0
  524. package/dist/shell/SidebarBadgeRow.d.ts +29 -0
  525. package/dist/shell/SidebarRowAction.d.ts +24 -0
  526. package/dist/shell/StatusRow.d.ts +20 -0
  527. package/dist/shell/TabHeader.d.ts +70 -0
  528. package/dist/shell/TipCard.d.ts +46 -0
  529. package/dist/shell/ToolButton.d.ts +12 -0
  530. package/dist/shell/Workspace.d.ts +90 -0
  531. package/dist/shell/index.cjs +187 -0
  532. package/dist/shell/index.cjs.map +1 -0
  533. package/dist/shell/index.d.ts +20 -0
  534. package/dist/shell/index.js +10 -0
  535. package/dist/shell/index.js.map +1 -0
  536. package/dist/shell/sidebar-context.d.ts +19 -0
  537. package/dist/shell/types.d.ts +48 -0
  538. package/dist/site/index.cjs +113 -90
  539. package/dist/site/index.d.ts +59 -4
  540. package/dist/site/index.js +8 -1
  541. package/dist/studio/PageRenderer.d.ts +35 -0
  542. package/dist/studio/Section.d.ts +24 -0
  543. package/dist/studio/StudioEditor.d.ts +32 -0
  544. package/dist/studio/aiFields.d.ts +17 -0
  545. package/dist/studio/blockKit.d.ts +36 -0
  546. package/dist/studio/blocksConfig.d.ts +42 -0
  547. package/dist/studio/imageFields.d.ts +14 -0
  548. package/dist/studio/index.cjs +3353 -0
  549. package/dist/studio/index.cjs.map +1 -0
  550. package/dist/studio/index.d.ts +32 -0
  551. package/dist/studio/index.js +3297 -0
  552. package/dist/studio/index.js.map +1 -0
  553. package/dist/studio/liveData.d.ts +4 -0
  554. package/dist/studio/liveWidgetRuntime.d.ts +41 -0
  555. package/dist/studio/persistence.d.ts +38 -0
  556. package/dist/studio/publish.d.ts +39 -0
  557. package/dist/studio/siteBlocks.d.ts +14 -0
  558. package/dist/studio/types.d.ts +46 -0
  559. package/dist/studio/websiteBlocks.d.ts +4 -0
  560. package/dist/studio/widgets.d.ts +20 -0
  561. package/dist/theme/ThemeEditor.d.ts +16 -0
  562. package/dist/theme/fontPairings.d.ts +48 -0
  563. package/dist/theme/store.d.ts +53 -0
  564. package/dist/theme/tokens.d.ts +105 -0
  565. package/dist/timeline/Timeline.d.ts +27 -0
  566. package/dist/timeline/TimelineCalendar.d.ts +54 -0
  567. package/dist/timeline/TimelineGantt.d.ts +71 -0
  568. package/dist/timeline/TimelineZoomControl.d.ts +17 -0
  569. package/dist/timeline/index.cjs +50 -0
  570. package/dist/timeline/index.cjs.map +1 -0
  571. package/dist/timeline/index.d.ts +13 -0
  572. package/dist/timeline/index.js +5 -0
  573. package/dist/timeline/index.js.map +1 -0
  574. package/dist/timeline/span.d.ts +29 -0
  575. package/dist/timeline/types.d.ts +30 -0
  576. package/dist/workspaces/WorkspaceBadges.d.ts +27 -0
  577. package/dist/workspaces/WorkspaceCard.d.ts +142 -0
  578. package/dist/workspaces/WorkspaceFormParts.d.ts +98 -0
  579. package/dist/workspaces/WorkspaceGroup.d.ts +31 -0
  580. package/dist/workspaces/WorkspaceSettingsParts.d.ts +70 -0
  581. package/dist/workspaces/index.cjs +690 -0
  582. package/dist/workspaces/index.cjs.map +1 -0
  583. package/dist/workspaces/index.d.ts +9 -0
  584. package/dist/workspaces/index.js +661 -0
  585. package/dist/workspaces/index.js.map +1 -0
  586. package/package.json +154 -9
  587. package/src/blocks.css +348 -0
  588. package/src/components/grid.css +60 -107
  589. package/src/source.css +20 -0
  590. package/src/studio/studio.css +3 -3
  591. package/src/tokens.css +226 -0
  592. package/dist/chunk-DBAUZD7A.cjs.map +0 -1
  593. package/dist/chunk-FZ2S6VAZ.js.map +0 -1
  594. package/dist/index-DduoEosi.d.cts +0 -846
  595. package/dist/index-DduoEosi.d.ts +0 -846
  596. package/dist/index.d.cts +0 -1717
  597. package/dist/record/index.d.cts +0 -96
  598. package/dist/site/index.d.cts +0 -4
@@ -0,0 +1,2973 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkSCFYPAG6_cjs = require('./chunk-SCFYPAG6.cjs');
5
+ var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
6
+ var react = require('react');
7
+ var lucideReact = require('lucide-react');
8
+ var ui = require('@arbidocs/react/ui');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+ var DOMPurify = require('dompurify');
11
+
12
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
+
14
+ var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
15
+
16
+ var DEFAULT_MESSAGE_LABELS = {
17
+ subagentBadge: "sub-agent",
18
+ hideSteps: "Hide steps",
19
+ showSteps: "Show steps",
20
+ stepCount: (count) => `${count} step${count !== 1 ? "s" : ""}`,
21
+ openSource: (num, title) => `Open source ${num}: ${title}`,
22
+ openSourceAria: (num, title, page) => `Open source ${num}: ${title}${page != null ? `, page ${page}` : ""}`,
23
+ page: (page) => `p. ${page}`,
24
+ pages: (pages) => `pp. ${pages.join(", ")}`,
25
+ moreActionsTitle: "More actions",
26
+ moreActionsAria: "More message actions"
27
+ };
28
+ function MessageRoot({
29
+ role,
30
+ messageId,
31
+ tone = "default",
32
+ testId = `message-${messageId}`,
33
+ className,
34
+ children,
35
+ ...rest
36
+ }) {
37
+ return /* @__PURE__ */ jsxRuntime.jsx(
38
+ "div",
39
+ {
40
+ "data-slot": "message",
41
+ "data-testid": testId,
42
+ "data-message-role": role,
43
+ className: ui.cn(
44
+ "group mx-auto mb-1 flex w-full max-w-[46rem] justify-center",
45
+ tone === "error" ? "rounded-lg bg-red-bg" : tone === "subagent" ? "rounded-lg bg-muted/40" : "bg-background",
46
+ className
47
+ ),
48
+ ...rest,
49
+ children
50
+ }
51
+ );
52
+ }
53
+ function MessageContent({
54
+ role,
55
+ messageId,
56
+ testId = `message-content-${messageId}`,
57
+ className,
58
+ children,
59
+ ...rest
60
+ }) {
61
+ return /* @__PURE__ */ jsxRuntime.jsx(
62
+ "div",
63
+ {
64
+ "data-slot": "message-content",
65
+ "data-testid": testId,
66
+ className: ui.cn(
67
+ "w-full max-w-full overflow-hidden text-chat",
68
+ role === "user" && "flex flex-col items-end",
69
+ className
70
+ ),
71
+ ...rest,
72
+ children
73
+ }
74
+ );
75
+ }
76
+ var MessageBubble = react.forwardRef(function MessageBubble2({ role, messageId, isEditing, isQueued, testId, className, children, ...rest }, ref) {
77
+ const isUser = role === "user";
78
+ return /* @__PURE__ */ jsxRuntime.jsx(
79
+ "div",
80
+ {
81
+ ref,
82
+ "data-slot": "message-bubble",
83
+ "data-testid": testId ?? (isUser ? `user-message-${messageId}` : `assistant-message-${messageId}`),
84
+ className: ui.cn(
85
+ "overflow-hidden transition-colors",
86
+ isUser && "max-w-[80%] rounded-lg bg-muted",
87
+ isEditing && "ring-2 ring-inset ring-primary/30",
88
+ className
89
+ ),
90
+ ...rest,
91
+ children: /* @__PURE__ */ jsxRuntime.jsx(
92
+ "div",
93
+ {
94
+ className: ui.cn(
95
+ isUser ? "px-4 py-2.5" : "px-4 py-3 sm:pl-9 sm:pr-0",
96
+ isQueued && "opacity-70"
97
+ ),
98
+ children
99
+ }
100
+ )
101
+ }
102
+ );
103
+ });
104
+ function MessageByline({
105
+ messageId,
106
+ identity,
107
+ timeLabel,
108
+ isSettled,
109
+ isFailed,
110
+ statusLabel,
111
+ className,
112
+ testId = `assistant-byline-${messageId}`,
113
+ statusTestId
114
+ }) {
115
+ return /* @__PURE__ */ jsxRuntime.jsxs(
116
+ "div",
117
+ {
118
+ "data-slot": "message-byline",
119
+ "data-testid": testId,
120
+ className: ui.cn("mb-2 flex min-w-0 items-center gap-2 text-sm sm:-ml-9", className),
121
+ children: [
122
+ /* @__PURE__ */ jsxRuntime.jsx(
123
+ "span",
124
+ {
125
+ className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-ai-soft text-ai-ink",
126
+ "aria-hidden": "true",
127
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { size: 14 })
128
+ }
129
+ ),
130
+ identity,
131
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-xs text-muted-foreground", children: timeLabel }),
132
+ isSettled && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", "aria-hidden": "true", children: "\xB7" }),
133
+ isSettled && /* @__PURE__ */ jsxRuntime.jsx(
134
+ "span",
135
+ {
136
+ className: ui.cn(
137
+ "shrink-0 text-xs",
138
+ isFailed ? "font-medium text-red-text" : "text-muted-foreground"
139
+ ),
140
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(statusTestId, { testId: "assistant-status" }),
141
+ children: statusLabel
142
+ }
143
+ )
144
+ ]
145
+ }
146
+ );
147
+ }
148
+ function MessageSubagentBadge({
149
+ messageId,
150
+ children,
151
+ labels,
152
+ className,
153
+ testId = `subagent-task-badge-${messageId}`
154
+ }) {
155
+ const l = { ...DEFAULT_MESSAGE_LABELS, ...labels };
156
+ return /* @__PURE__ */ jsxRuntime.jsx(
157
+ "span",
158
+ {
159
+ "data-slot": "message-subagent-badge",
160
+ className: ui.cn(
161
+ "mb-2 inline-block rounded bg-muted px-1 py-0.5 text-xs font-semibold uppercase leading-none tracking-wide text-muted-foreground",
162
+ className
163
+ ),
164
+ "data-testid": testId,
165
+ children: children ?? l.subagentBadge
166
+ }
167
+ );
168
+ }
169
+ function MessageBody({
170
+ messageId,
171
+ className,
172
+ children,
173
+ testId = `message-body-${messageId}`
174
+ }) {
175
+ return /* @__PURE__ */ jsxRuntime.jsx(
176
+ "div",
177
+ {
178
+ "data-slot": "message-body",
179
+ className: ui.cn("markdown-content m-0 p-0 text-base leading-relaxed", className),
180
+ "data-testid": testId,
181
+ children
182
+ }
183
+ );
184
+ }
185
+ function MessageNarration({
186
+ messageId,
187
+ children,
188
+ className,
189
+ testId = `message-narration-${messageId}`
190
+ }) {
191
+ return /* @__PURE__ */ jsxRuntime.jsx(
192
+ "div",
193
+ {
194
+ "data-slot": "message-narration",
195
+ className: ui.cn("opacity-50 transition-opacity duration-300", className),
196
+ "data-provisional": "true",
197
+ "data-testid": testId,
198
+ children
199
+ }
200
+ );
201
+ }
202
+ function SourceChip({
203
+ num,
204
+ title,
205
+ page,
206
+ pages,
207
+ onOpen,
208
+ className,
209
+ labels,
210
+ testId = `source-chip-${num}`
211
+ }) {
212
+ const l = { ...DEFAULT_MESSAGE_LABELS, ...labels };
213
+ const pageText = pages && pages.length > 1 ? l.pages(pages) : page != null ? l.page(page) : null;
214
+ return /* @__PURE__ */ jsxRuntime.jsxs(
215
+ "button",
216
+ {
217
+ type: "button",
218
+ "data-slot": "source-chip",
219
+ onClick: onOpen,
220
+ className: ui.cn(
221
+ "inline-flex min-h-8 max-w-full items-center gap-2 rounded-md bg-muted px-2 py-1 text-sm text-foreground transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
222
+ className
223
+ ),
224
+ title: l.openSource(num, title),
225
+ "aria-label": l.openSourceAria(num, title, page),
226
+ "data-testid": testId,
227
+ children: [
228
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-5 min-w-5 items-center justify-center rounded-sm bg-ai-soft px-1 text-xs font-semibold text-ai-ink", children: num }),
229
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate", children: title }),
230
+ pageText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: pageText })
231
+ ]
232
+ }
233
+ );
234
+ }
235
+ function mergeSourcesByFile(sources) {
236
+ const byTitle = /* @__PURE__ */ new Map();
237
+ for (const s of sources) {
238
+ const group = byTitle.get(s.title) ?? { nums: [], title: s.title, pages: [] };
239
+ group.nums.push(s.num);
240
+ if (s.page != null && !group.pages.includes(s.page)) group.pages.push(s.page);
241
+ byTitle.set(s.title, group);
242
+ }
243
+ return [...byTitle.values()];
244
+ }
245
+ function MessageSources({
246
+ messageId,
247
+ sources,
248
+ onOpenSource,
249
+ className,
250
+ labels,
251
+ testId = `source-chips-${messageId}`
252
+ }) {
253
+ if (sources.length === 0) return null;
254
+ return /* @__PURE__ */ jsxRuntime.jsx(
255
+ "div",
256
+ {
257
+ "data-slot": "message-sources",
258
+ className: ui.cn("mt-3 flex flex-wrap gap-2", className),
259
+ "data-testid": testId,
260
+ children: mergeSourcesByFile(sources).map((g) => /* @__PURE__ */ jsxRuntime.jsx(
261
+ SourceChip,
262
+ {
263
+ num: g.nums.join(", "),
264
+ testId: `source-chip-${g.nums[0]}`,
265
+ title: g.title,
266
+ page: g.pages[0],
267
+ pages: g.pages,
268
+ onOpen: () => onOpenSource(g.nums[0]),
269
+ labels
270
+ },
271
+ g.nums[0]
272
+ ))
273
+ }
274
+ );
275
+ }
276
+ function MessageFooter({
277
+ role,
278
+ leading,
279
+ actions,
280
+ steps,
281
+ className,
282
+ labels,
283
+ stepsToggleTestId
284
+ }) {
285
+ const l = { ...DEFAULT_MESSAGE_LABELS, ...labels };
286
+ const isUser = role === "user";
287
+ const showSteps = !isUser && !!steps && steps.count > 0;
288
+ const row = /* @__PURE__ */ jsxRuntime.jsxs(
289
+ "div",
290
+ {
291
+ className: ui.cn(
292
+ "flex items-center text-sm",
293
+ isUser ? "justify-end gap-2 text-xs" : "justify-between"
294
+ ),
295
+ children: [
296
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
297
+ leading,
298
+ showSteps && /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
299
+ "button",
300
+ {
301
+ type: "button",
302
+ className: "flex items-center gap-1 text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
303
+ "aria-expanded": steps.open,
304
+ "aria-label": steps.open ? l.hideSteps : l.showSteps,
305
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(stepsToggleTestId, { testId: "steps-toggle" }),
306
+ children: [
307
+ steps.open ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { size: 14 }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { size: 14 }),
308
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: l.stepCount(steps.count) })
309
+ ]
310
+ }
311
+ ) })
312
+ ] }),
313
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", children: actions })
314
+ ]
315
+ }
316
+ );
317
+ return /* @__PURE__ */ jsxRuntime.jsx(
318
+ "div",
319
+ {
320
+ "data-slot": "message-footer",
321
+ className: ui.cn(
322
+ "text-muted-foreground",
323
+ isUser ? "mt-1 max-w-full self-end" : "mt-3",
324
+ className
325
+ ),
326
+ children: steps ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open: steps.open, onOpenChange: steps.onOpenChange, children: [
327
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverAnchor, { asChild: true, children: row }),
328
+ !isUser && steps.count > 0 && /* @__PURE__ */ jsxRuntime.jsx(
329
+ ui.PopoverContent,
330
+ {
331
+ side: "top",
332
+ align: "start",
333
+ sideOffset: 8,
334
+ className: "max-h-[min(60vh,32rem)] w-[var(--radix-popover-trigger-width)] overflow-y-auto rounded-lg border border-border bg-popover p-0 shadow-lg",
335
+ children: steps.panel
336
+ }
337
+ )
338
+ ] }) : row
339
+ }
340
+ );
341
+ }
342
+ var MessageActionButton = react.forwardRef(
343
+ function MessageActionButton2({ isDone, className, type = "button", ...rest }, ref) {
344
+ return /* @__PURE__ */ jsxRuntime.jsx(
345
+ "button",
346
+ {
347
+ ref,
348
+ type,
349
+ "data-slot": "message-action",
350
+ className: ui.cn(
351
+ "inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 pointer-coarse:h-11 pointer-coarse:w-11",
352
+ isDone && "text-green-text",
353
+ className
354
+ ),
355
+ ...rest
356
+ }
357
+ );
358
+ }
359
+ );
360
+ function MessageActionMenu({
361
+ items,
362
+ testId,
363
+ label,
364
+ labels,
365
+ className
366
+ }) {
367
+ const l = { ...DEFAULT_MESSAGE_LABELS, ...labels };
368
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
369
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
370
+ MessageActionButton,
371
+ {
372
+ onClick: (e) => e.stopPropagation(),
373
+ className,
374
+ title: l.moreActionsTitle,
375
+ "aria-label": label ?? l.moreActionsAria,
376
+ "data-testid": testId,
377
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { size: 16 })
378
+ }
379
+ ) }),
380
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenuContent, { align: "end", children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
381
+ ui.DropdownMenuItem,
382
+ {
383
+ onClick: (e) => {
384
+ e.stopPropagation();
385
+ item.onSelect();
386
+ },
387
+ className: item.tone === "danger" ? "text-red-text focus:text-red-text" : void 0,
388
+ "data-testid": item.testId,
389
+ children: [
390
+ item.icon,
391
+ item.label
392
+ ]
393
+ },
394
+ item.id
395
+ )) })
396
+ ] });
397
+ }
398
+ var Message = {
399
+ Root: MessageRoot,
400
+ Content: MessageContent,
401
+ Bubble: MessageBubble,
402
+ Byline: MessageByline,
403
+ SubagentBadge: MessageSubagentBadge,
404
+ Body: MessageBody,
405
+ Narration: MessageNarration,
406
+ Sources: MessageSources,
407
+ Footer: MessageFooter,
408
+ ActionButton: MessageActionButton,
409
+ ActionMenu: MessageActionMenu
410
+ };
411
+ var DEFAULT_MESSAGE_ALERT_LABELS = {
412
+ retrying: "Retrying...",
413
+ retry: "Retry"
414
+ };
415
+ function MessageAlert({
416
+ title,
417
+ description,
418
+ isBusy = false,
419
+ busyTitle,
420
+ labels,
421
+ onActivate,
422
+ actions,
423
+ className,
424
+ testId = "message-alert"
425
+ }) {
426
+ const l = { ...DEFAULT_MESSAGE_ALERT_LABELS, ...labels };
427
+ return /* @__PURE__ */ jsxRuntime.jsx(
428
+ "div",
429
+ {
430
+ "data-slot": "message-alert",
431
+ role: isBusy ? "status" : "alert",
432
+ "aria-busy": isBusy,
433
+ className: ui.cn(
434
+ "mb-3 rounded-lg border border-red-border bg-red-bg px-4 py-2 transition-colors",
435
+ className
436
+ ),
437
+ "data-testid": testId,
438
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
439
+ isBusy ? /* @__PURE__ */ jsxRuntime.jsx(
440
+ lucideReact.RotateCw,
441
+ {
442
+ "aria-hidden": "true",
443
+ className: "mt-0.5 h-5 w-5 shrink-0 animate-spin text-red-text motion-reduce:animate-none"
444
+ }
445
+ ) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertCircle, { "aria-hidden": "true", className: "mt-0.5 h-5 w-5 shrink-0 text-red-text" }),
446
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
447
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-1 text-base font-medium text-red-text", children: isBusy ? busyTitle ?? l.retrying : title }),
448
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-1 text-sm text-muted-foreground", children: description }),
449
+ (actions || onActivate) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex flex-wrap gap-2", children: [
450
+ actions,
451
+ onActivate && /* @__PURE__ */ jsxRuntime.jsxs(
452
+ ui.Button,
453
+ {
454
+ type: "button",
455
+ size: "sm",
456
+ variant: "outline",
457
+ className: "pointer-coarse:min-h-11",
458
+ disabled: isBusy,
459
+ onClick: onActivate,
460
+ "data-testid": `${testId}-retry`,
461
+ children: [
462
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCw, { "aria-hidden": "true", className: "mr-2 h-4 w-4" }),
463
+ l.retry
464
+ ]
465
+ }
466
+ )
467
+ ] })
468
+ ] })
469
+ ] })
470
+ }
471
+ );
472
+ }
473
+ var DEFAULT_MESSAGE_LIST_LABELS = {
474
+ messageList: "Message list",
475
+ startConversation: "Start a new conversation",
476
+ backToConversation: "Back to conversation \u2014 this is a sub-agent's delegated thread",
477
+ conversationMessages: "Conversation messages",
478
+ responding: "Assistant is responding",
479
+ responseComplete: (text) => text ? `Response complete: ${text}` : "Response complete"
480
+ };
481
+ function MessageListRoot({
482
+ className,
483
+ children,
484
+ isBusy = false,
485
+ labels,
486
+ testId = "message-list",
487
+ ...rest
488
+ }) {
489
+ const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels };
490
+ return /* @__PURE__ */ jsxRuntime.jsx(
491
+ "div",
492
+ {
493
+ "data-slot": "message-list",
494
+ style: { containerType: "inline-size" },
495
+ "data-testid": testId,
496
+ role: "log",
497
+ "aria-live": "off",
498
+ "aria-busy": isBusy,
499
+ "aria-label": l.messageList,
500
+ className,
501
+ ...rest,
502
+ children
503
+ }
504
+ );
505
+ }
506
+ function MessageListStatus({
507
+ message,
508
+ testId = "message-list-status"
509
+ }) {
510
+ return /* @__PURE__ */ jsxRuntime.jsx(
511
+ "div",
512
+ {
513
+ "data-slot": "message-list-status",
514
+ role: "status",
515
+ "aria-live": "polite",
516
+ "aria-atomic": "true",
517
+ className: "sr-only",
518
+ "data-testid": testId,
519
+ children: message
520
+ }
521
+ );
522
+ }
523
+ function MessageListEmpty({
524
+ children,
525
+ labels,
526
+ className,
527
+ testId = "message-list-empty"
528
+ }) {
529
+ const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels };
530
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("flex h-64 items-center justify-center", className), "data-testid": testId, children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: children ?? l.startConversation }) });
531
+ }
532
+ function MessageListBanner({
533
+ onBack,
534
+ children,
535
+ labels,
536
+ className,
537
+ testId = "back-to-conversation-button"
538
+ }) {
539
+ const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels };
540
+ return /* @__PURE__ */ jsxRuntime.jsx(
541
+ "div",
542
+ {
543
+ "data-slot": "message-list-banner",
544
+ className: ui.cn(
545
+ "sticky top-0 z-10 border-b border-border/40 bg-background px-3 py-2 sm:px-6",
546
+ className
547
+ ),
548
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
549
+ "button",
550
+ {
551
+ type: "button",
552
+ onClick: onBack,
553
+ className: "flex items-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium text-primary transition-colors hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
554
+ "data-testid": testId,
555
+ children: [
556
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, { size: 14 }),
557
+ children ?? l.backToConversation
558
+ ]
559
+ }
560
+ )
561
+ }
562
+ );
563
+ }
564
+ function MessageListRows({
565
+ totalSize,
566
+ className,
567
+ children,
568
+ labels,
569
+ ...rest
570
+ }) {
571
+ const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels };
572
+ return /* @__PURE__ */ jsxRuntime.jsx(
573
+ "div",
574
+ {
575
+ "data-slot": "message-list-rows",
576
+ style: { height: totalSize, position: "relative" },
577
+ role: "list",
578
+ "aria-label": l.conversationMessages,
579
+ className,
580
+ ...rest,
581
+ children
582
+ }
583
+ );
584
+ }
585
+ var MessageListRow = react.forwardRef(
586
+ function MessageListRow2({ index, start, messageId, setSize, className, children, ...rest }, ref) {
587
+ const style = {
588
+ position: "absolute",
589
+ top: 0,
590
+ left: 0,
591
+ width: "100%",
592
+ transform: `translateY(${start}px)`
593
+ };
594
+ return /* @__PURE__ */ jsxRuntime.jsx(
595
+ "div",
596
+ {
597
+ ref,
598
+ "data-slot": "message-list-row",
599
+ "data-index": index,
600
+ "data-message-id": messageId,
601
+ role: "listitem",
602
+ "aria-posinset": setSize === void 0 ? void 0 : index + 1,
603
+ "aria-setsize": setSize,
604
+ style,
605
+ className,
606
+ ...rest,
607
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("w-full px-3 sm:px-6"), children })
608
+ }
609
+ );
610
+ }
611
+ );
612
+ function MessageListTail() {
613
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-12 sm:h-32", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none h-8 bg-gradient-to-b from-background to-transparent sm:h-20" }) });
614
+ }
615
+ var MessageList = {
616
+ Root: MessageListRoot,
617
+ Empty: MessageListEmpty,
618
+ Banner: MessageListBanner,
619
+ Status: MessageListStatus,
620
+ Rows: MessageListRows,
621
+ Row: MessageListRow,
622
+ Tail: MessageListTail
623
+ };
624
+ function toSpeakableText(markdown, maxLength = 600) {
625
+ const flat = markdown.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/[*_`#>~|]/g, "").replace(/\s+/g, " ").trim();
626
+ if (flat.length <= maxLength) return flat;
627
+ const cut = flat.slice(0, maxLength);
628
+ const lastSpace = cut.lastIndexOf(" ");
629
+ return `${(lastSpace > maxLength / 2 ? cut.slice(0, lastSpace) : cut).trimEnd()}\u2026`;
630
+ }
631
+ function useStreamAnnouncement({
632
+ isStreaming,
633
+ text,
634
+ resetKey,
635
+ maxLength,
636
+ labels
637
+ }) {
638
+ const l = { ...DEFAULT_MESSAGE_LIST_LABELS, ...labels };
639
+ const [message, setMessage] = react.useState("");
640
+ const wasStreaming = react.useRef(isStreaming);
641
+ const textRef = react.useRef(text);
642
+ textRef.current = text;
643
+ const lastKey = react.useRef(resetKey);
644
+ react.useEffect(() => {
645
+ if (lastKey.current !== resetKey) {
646
+ lastKey.current = resetKey;
647
+ wasStreaming.current = isStreaming;
648
+ setMessage("");
649
+ return;
650
+ }
651
+ if (isStreaming === wasStreaming.current) return;
652
+ wasStreaming.current = isStreaming;
653
+ setMessage(
654
+ isStreaming ? l.responding : l.responseComplete(toSpeakableText(textRef.current, maxLength))
655
+ );
656
+ }, [isStreaming, resetKey]);
657
+ return message;
658
+ }
659
+ var DEFAULT_COMPOSER_LABELS = {
660
+ branchingNotice: "Editing message. Submit to send, or cancel to go back.",
661
+ cancel: "Cancel",
662
+ inputAriaLabel: "Write your prompt here",
663
+ pastedText: "Pasted text",
664
+ pasteSummary: (lines, characters) => `${lines} lines \xB7 ${characters} characters`,
665
+ expand: "Expand",
666
+ retryMessage: "Retry message",
667
+ sendMessage: "Send message",
668
+ voiceButton: "Press and hold to speak",
669
+ jumpToBottom: "Jump to bottom"
670
+ };
671
+ function ComposerRoot({
672
+ onSubmit,
673
+ notice,
674
+ isBranching,
675
+ formRef,
676
+ testId = "message-input",
677
+ formTestId,
678
+ className,
679
+ children,
680
+ ...rest
681
+ }) {
682
+ return /* @__PURE__ */ jsxRuntime.jsxs(
683
+ "div",
684
+ {
685
+ "data-slot": "composer",
686
+ className: ui.cn("relative z-[20] shrink-0", isBranching && "bg-muted/30"),
687
+ "data-testid": testId,
688
+ children: [
689
+ notice,
690
+ /* @__PURE__ */ jsxRuntime.jsx(
691
+ "form",
692
+ {
693
+ ref: formRef,
694
+ onSubmit,
695
+ ...rest,
696
+ className: ui.cn("relative w-full", className),
697
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(formTestId, { testId: "message-input-form" }),
698
+ children
699
+ }
700
+ )
701
+ ]
702
+ }
703
+ );
704
+ }
705
+ function ComposerBranchingNotice({
706
+ onCancel,
707
+ children,
708
+ labels,
709
+ testId = "message-input-branching-indicator",
710
+ cancelTestId,
711
+ className,
712
+ ...rest
713
+ }) {
714
+ const l = { ...DEFAULT_COMPOSER_LABELS, ...labels };
715
+ return /* @__PURE__ */ jsxRuntime.jsxs(
716
+ "div",
717
+ {
718
+ ...rest,
719
+ "data-slot": "composer-notice",
720
+ className: ui.cn("mb-2 flex items-center rounded-md bg-muted px-3 py-1.5 text-sm", className),
721
+ "data-testid": testId,
722
+ children: [
723
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Edit3, { size: 16, className: "mr-2 text-muted-foreground" }),
724
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1 text-muted-foreground", children: children ?? l.branchingNotice }),
725
+ onCancel && /* @__PURE__ */ jsxRuntime.jsx(
726
+ ui.Button,
727
+ {
728
+ type: "button",
729
+ variant: "outline",
730
+ size: "sm",
731
+ className: "ml-2",
732
+ onClick: onCancel,
733
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(cancelTestId, { testId: "cancel-branching-button" }),
734
+ children: l.cancel
735
+ }
736
+ )
737
+ ]
738
+ }
739
+ );
740
+ }
741
+ var INTERACTIVE = 'button, a, input, textarea, select, [role="button"], [contenteditable="true"]';
742
+ function ComposerFrame({ className, children, ...rest }) {
743
+ return /* @__PURE__ */ jsxRuntime.jsx(
744
+ "div",
745
+ {
746
+ "data-slot": "composer-frame",
747
+ className: ui.cn(
748
+ "relative flex w-full flex-col rounded-lg border border-border bg-background px-4 py-3 shadow-lg transition-shadow focus-within:shadow-xl",
749
+ className
750
+ ),
751
+ onMouseDown: (e) => {
752
+ const target = e.target;
753
+ if (target.closest(INTERACTIVE)) return;
754
+ e.preventDefault();
755
+ e.currentTarget.querySelector("textarea")?.focus();
756
+ },
757
+ ...rest,
758
+ children
759
+ }
760
+ );
761
+ }
762
+ function scrollToLastContentLine(textarea) {
763
+ if (!textarea) return;
764
+ const text = textarea.value;
765
+ const lines = text.split("\n");
766
+ const trimmedLines = text.trimEnd().split("\n");
767
+ if (lines.length - trimmedLines.length > 0 && trimmedLines.length > 0) {
768
+ const lineHeight = parseFloat(getComputedStyle(textarea).lineHeight) || 24;
769
+ textarea.scrollTop = (trimmedLines.length - 1) * lineHeight;
770
+ } else {
771
+ textarea.scrollTop = textarea.scrollHeight;
772
+ }
773
+ }
774
+ var ComposerInput = react.forwardRef(
775
+ function ComposerInput2({
776
+ value,
777
+ onValueChange,
778
+ onKeyDown,
779
+ submitOnEnter = true,
780
+ onPaste,
781
+ placeholder,
782
+ textareaRef,
783
+ isSuggestion,
784
+ isRoomy,
785
+ isPasteCollapsed,
786
+ onExpandPaste,
787
+ ariaLabel,
788
+ textareaProps,
789
+ className,
790
+ labels,
791
+ testId = "message-input-textarea",
792
+ pasteChipTestId
793
+ }, forwardedRef) {
794
+ const l = { ...DEFAULT_COMPOSER_LABELS, ...labels };
795
+ const [isFocused, setIsFocused] = react.useState(false);
796
+ const [isHovered, setIsHovered] = react.useState(false);
797
+ const innerRef = react.useRef(null);
798
+ const setRefs = (node) => {
799
+ innerRef.current = node;
800
+ for (const ref of [forwardedRef, textareaRef]) {
801
+ if (typeof ref === "function") ref(node);
802
+ else if (ref) ref.current = node;
803
+ }
804
+ };
805
+ const handleKeyDown = (event) => {
806
+ onKeyDown?.(event);
807
+ if (event.defaultPrevented || !submitOnEnter) return;
808
+ if (event.key !== "Enter" || event.shiftKey || event.altKey) return;
809
+ if (event.nativeEvent.isComposing || event.keyCode === 229) return;
810
+ event.preventDefault();
811
+ event.currentTarget.form?.requestSubmit();
812
+ };
813
+ if (isPasteCollapsed) {
814
+ const lineCount = value.split("\n").length;
815
+ return /* @__PURE__ */ jsxRuntime.jsxs(
816
+ "button",
817
+ {
818
+ type: "button",
819
+ "data-slot": "composer-paste-chip",
820
+ onClick: onExpandPaste,
821
+ className: "flex w-full items-center gap-2 rounded-md bg-muted/50 px-3 py-2 text-left transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40",
822
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(pasteChipTestId, { testId: "long-paste-placeholder" }),
823
+ "data-full-length": value.length,
824
+ children: [
825
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "h-4 w-4 shrink-0 text-muted-foreground", "aria-hidden": "true" }),
826
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1", children: [
827
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-sm font-medium text-foreground", children: l.pastedText }),
828
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-xs text-muted-foreground", children: l.pasteSummary(lineCount, value.length.toLocaleString()) })
829
+ ] }),
830
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex shrink-0 items-center gap-1 text-xs font-medium text-muted-foreground", children: [
831
+ l.expand,
832
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-3.5 w-3.5", "aria-hidden": "true" })
833
+ ] })
834
+ ]
835
+ }
836
+ );
837
+ }
838
+ return /* @__PURE__ */ jsxRuntime.jsx(
839
+ ui.Textarea,
840
+ {
841
+ ...textareaProps,
842
+ "aria-label": ariaLabel ?? l.inputAriaLabel,
843
+ placeholder,
844
+ "data-suggested-query": isSuggestion ? "true" : void 0,
845
+ rows: 1,
846
+ ref: setRefs,
847
+ value,
848
+ onChange: (event) => onValueChange(event.target.value),
849
+ onPaste,
850
+ onKeyDown: handleKeyDown,
851
+ disabled: false,
852
+ className: ui.cn(
853
+ "scrollbar-subtle !min-h-0 pointer-coarse:!min-h-11 pointer-coarse:py-2.5 w-full resize-none border-0 bg-transparent p-0 !text-base leading-relaxed text-foreground shadow-none placeholder:text-muted-foreground/50 focus-visible:ring-0 focus-visible:ring-offset-0 md:!text-base",
854
+ className
855
+ ),
856
+ style: {
857
+ fieldSizing: "content",
858
+ maxHeight: isFocused || isHovered ? "40vh" : value ? "6.5em" : isRoomy ? "4em" : "1.7em",
859
+ overflowY: value ? "auto" : "hidden",
860
+ scrollbarGutter: "stable"
861
+ },
862
+ onFocus: () => {
863
+ setIsFocused(true);
864
+ requestAnimationFrame(() => {
865
+ const ta = innerRef.current;
866
+ if (ta) {
867
+ ta.setSelectionRange(ta.value.length, ta.value.length);
868
+ ta.scrollTop = ta.scrollHeight;
869
+ }
870
+ });
871
+ },
872
+ onBlur: () => {
873
+ setIsFocused(false);
874
+ if (!isHovered) requestAnimationFrame(() => scrollToLastContentLine(innerRef.current));
875
+ },
876
+ onMouseEnter: () => setIsHovered(true),
877
+ onMouseLeave: () => {
878
+ setIsHovered(false);
879
+ if (!isFocused) requestAnimationFrame(() => scrollToLastContentLine(innerRef.current));
880
+ },
881
+ "data-testid": testId
882
+ }
883
+ );
884
+ }
885
+ );
886
+ function ComposerToolbar({ leading, trailing, className }) {
887
+ return /* @__PURE__ */ jsxRuntime.jsxs(
888
+ "div",
889
+ {
890
+ "data-slot": "composer-toolbar",
891
+ className: ui.cn(
892
+ "mt-2 flex flex-wrap items-center justify-between gap-x-1 gap-y-0.5",
893
+ className
894
+ ),
895
+ children: [
896
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-1", children: leading }),
897
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex min-w-0 items-center justify-end gap-1", children: trailing })
898
+ ]
899
+ }
900
+ );
901
+ }
902
+ function ComposerSend({
903
+ onSend,
904
+ disabled,
905
+ isRetry,
906
+ labels,
907
+ className,
908
+ testIds
909
+ }) {
910
+ const l = { ...DEFAULT_COMPOSER_LABELS, ...labels };
911
+ const sendTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.send, { testId: "send-message-button" });
912
+ const retryTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.retry, { testId: "retry-button" });
913
+ return /* @__PURE__ */ jsxRuntime.jsx(
914
+ ui.Button,
915
+ {
916
+ type: "button",
917
+ size: "icon",
918
+ className: ui.cn(
919
+ "h-9 w-9 shrink-0 pointer-coarse:h-11 pointer-coarse:w-11",
920
+ // A faded primary is unreadable; a flat muted chip reads as "not available yet" at 4.5:1.
921
+ "disabled:bg-muted disabled:text-muted-foreground disabled:opacity-100",
922
+ className
923
+ ),
924
+ "aria-label": isRetry ? l.retryMessage : l.sendMessage,
925
+ disabled,
926
+ onClick: onSend,
927
+ "data-testid": isRetry ? retryTestId : sendTestId,
928
+ children: isRetry ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCw, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Send, { className: "h-3.5 w-3.5" })
929
+ }
930
+ );
931
+ }
932
+ function ComposerVoiceButton({
933
+ isRecording,
934
+ isBusy,
935
+ onPressStart,
936
+ onPressEnd,
937
+ label,
938
+ labels,
939
+ className,
940
+ testIds
941
+ }) {
942
+ const text = label ?? { ...DEFAULT_COMPOSER_LABELS, ...labels }.voiceButton;
943
+ const startTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.start, { testId: "start-recording-button" });
944
+ const recordingTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.recording, { testId: "recording-mic-button" });
945
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
946
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
947
+ ui.Button,
948
+ {
949
+ type: "button",
950
+ variant: "ghost",
951
+ size: "sm",
952
+ "aria-label": text,
953
+ onPointerDown: (e) => {
954
+ e.preventDefault();
955
+ onPressStart();
956
+ },
957
+ onPointerUp: onPressEnd,
958
+ onPointerLeave: onPressEnd,
959
+ onPointerCancel: onPressEnd,
960
+ disabled: isBusy,
961
+ className: ui.cn(
962
+ "h-8 w-8 shrink-0 p-0 hover:bg-muted pointer-coarse:h-11 pointer-coarse:w-11",
963
+ isRecording && "bg-red-bg",
964
+ className
965
+ ),
966
+ "data-testid": isRecording ? recordingTestId : startTestId,
967
+ children: isBusy ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-3.5 w-3.5 animate-spin text-muted-foreground" }) : isRecording ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Square, { className: "h-3 w-3 fill-red-text text-red-text" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mic, { className: "h-4 w-4 text-muted-foreground" })
968
+ }
969
+ ) }),
970
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "top", children: text })
971
+ ] });
972
+ }
973
+ function ComposerContainer({
974
+ className,
975
+ children,
976
+ testId = "message-input-container",
977
+ ...rest
978
+ }) {
979
+ return /* @__PURE__ */ jsxRuntime.jsx(
980
+ "div",
981
+ {
982
+ ...rest,
983
+ "data-slot": "composer-container",
984
+ className: ui.cn("w-full bg-background py-1", className),
985
+ "data-testid": testId,
986
+ children
987
+ }
988
+ );
989
+ }
990
+ function ComposerDock({ children, floating }) {
991
+ return /* @__PURE__ */ jsxRuntime.jsxs(
992
+ "div",
993
+ {
994
+ "data-slot": "composer-dock",
995
+ className: "sticky bottom-0 z-40 w-full pb-4 sm:pb-[max(1rem,env(safe-area-inset-bottom))]",
996
+ children: [
997
+ /* @__PURE__ */ jsxRuntime.jsx(
998
+ "div",
999
+ {
1000
+ className: "pointer-events-none absolute bottom-full left-0 right-0 h-16 bg-gradient-to-b from-transparent to-background/70",
1001
+ "aria-hidden": "true"
1002
+ }
1003
+ ),
1004
+ /* @__PURE__ */ jsxRuntime.jsx(
1005
+ "div",
1006
+ {
1007
+ className: "pointer-events-none absolute bottom-0 left-0 right-0 h-4 bg-gradient-to-b from-transparent to-background/60 backdrop-blur-sm",
1008
+ "aria-hidden": "true"
1009
+ }
1010
+ ),
1011
+ floating,
1012
+ children
1013
+ ]
1014
+ }
1015
+ );
1016
+ }
1017
+ function ScrollToBottom({
1018
+ show,
1019
+ onClick,
1020
+ label,
1021
+ labels,
1022
+ className,
1023
+ testId = "scroll-to-bottom-button"
1024
+ }) {
1025
+ if (!show) return null;
1026
+ const text = label ?? { ...DEFAULT_COMPOSER_LABELS, ...labels }.jumpToBottom;
1027
+ return /* @__PURE__ */ jsxRuntime.jsx(
1028
+ ui.Button,
1029
+ {
1030
+ onClick,
1031
+ variant: "outline",
1032
+ size: "icon",
1033
+ className: ui.cn(
1034
+ "absolute -top-12 left-1/2 z-[15] h-10 w-10 -translate-x-1/2 shadow-lg pointer-coarse:h-11 pointer-coarse:w-11",
1035
+ className
1036
+ ),
1037
+ title: text,
1038
+ "aria-label": text,
1039
+ "data-testid": testId,
1040
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDown, { size: 20 })
1041
+ }
1042
+ );
1043
+ }
1044
+ var Composer = {
1045
+ Root: ComposerRoot,
1046
+ Notice: ComposerBranchingNotice,
1047
+ Frame: ComposerFrame,
1048
+ Input: ComposerInput,
1049
+ Toolbar: ComposerToolbar,
1050
+ Send: ComposerSend,
1051
+ VoiceButton: ComposerVoiceButton,
1052
+ Container: ComposerContainer,
1053
+ Dock: ComposerDock
1054
+ };
1055
+ function listOptionId(listboxId, index) {
1056
+ return `${listboxId}-option-${index}`;
1057
+ }
1058
+ function useListKeyNav({
1059
+ open,
1060
+ items,
1061
+ onPick,
1062
+ onDismiss,
1063
+ resetKey
1064
+ }) {
1065
+ const [selectedIndex, setSelectedIndex] = react.useState(0);
1066
+ const listboxId = react.useId();
1067
+ const isExpanded = open && items.length > 0;
1068
+ react.useEffect(() => {
1069
+ setSelectedIndex(0);
1070
+ }, [resetKey, items.length]);
1071
+ const handleKeyDown = react.useCallback(
1072
+ (event) => {
1073
+ if (!open || items.length === 0) return false;
1074
+ switch (event.key) {
1075
+ case "ArrowDown":
1076
+ event.preventDefault();
1077
+ setSelectedIndex((i) => (i + 1) % items.length);
1078
+ return true;
1079
+ case "ArrowUp":
1080
+ event.preventDefault();
1081
+ setSelectedIndex((i) => (i - 1 + items.length) % items.length);
1082
+ return true;
1083
+ case "Enter":
1084
+ case "Tab": {
1085
+ event.preventDefault();
1086
+ const pick = items[selectedIndex] ?? items[0];
1087
+ if (pick !== void 0) onPick(pick);
1088
+ return true;
1089
+ }
1090
+ case "Escape":
1091
+ event.preventDefault();
1092
+ onDismiss?.();
1093
+ return true;
1094
+ default:
1095
+ return false;
1096
+ }
1097
+ },
1098
+ [open, items, selectedIndex, onPick, onDismiss]
1099
+ );
1100
+ const comboboxProps = isExpanded ? {
1101
+ role: "combobox",
1102
+ "aria-autocomplete": "list",
1103
+ "aria-haspopup": "listbox",
1104
+ "aria-expanded": true,
1105
+ "aria-controls": listboxId,
1106
+ "aria-activedescendant": listOptionId(listboxId, selectedIndex)
1107
+ } : {};
1108
+ return { listboxId, comboboxProps, selectedIndex, setSelectedIndex, handleKeyDown };
1109
+ }
1110
+ var DEFAULT_SLASH_MENU_LABELS = {
1111
+ hint: "Enter or Tab to insert, Esc to dismiss",
1112
+ commands: "Commands",
1113
+ skills: "Skills",
1114
+ global: "Global",
1115
+ globalTitle: "Shared skill from the marketplace",
1116
+ list: "Commands and skills",
1117
+ resultCount: (count) => `${count} ${count === 1 ? "command" : "commands"} available`,
1118
+ browse: "Browse skills"
1119
+ };
1120
+ function SectionIcon({ kind }) {
1121
+ return kind === "skill" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpen, { className: "h-3 w-3", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.SquareSlash, { className: "h-3 w-3", "aria-hidden": "true" });
1122
+ }
1123
+ var SlashMenu = react.memo(function SlashMenu2({
1124
+ open,
1125
+ placement = "above",
1126
+ selectedIndex,
1127
+ setSelectedIndex,
1128
+ listboxId: listboxIdProp,
1129
+ items,
1130
+ onBrowse,
1131
+ onSelect,
1132
+ className,
1133
+ labels,
1134
+ testId,
1135
+ testIds
1136
+ }) {
1137
+ const l = { ...DEFAULT_SLASH_MENU_LABELS, ...labels };
1138
+ const ownId = react.useId();
1139
+ const listboxId = listboxIdProp ?? ownId;
1140
+ const scrollRef = react.useRef(null);
1141
+ react.useEffect(() => {
1142
+ if (!open) return;
1143
+ const el = scrollRef.current?.querySelector(
1144
+ `[data-slash-index="${selectedIndex}"]`
1145
+ );
1146
+ el?.scrollIntoView?.({ block: "nearest" });
1147
+ }, [open, selectedIndex]);
1148
+ if (!open || items.length === 0) return null;
1149
+ let offset = 0;
1150
+ const SECTIONS = [
1151
+ { kind: "command", label: l.commands },
1152
+ { kind: "skill", label: l.skills }
1153
+ ];
1154
+ const sections = SECTIONS.map(({ kind, label }) => {
1155
+ const rows = items.filter((i) => i.kind === kind);
1156
+ const section = { kind, label, rows, offset };
1157
+ offset += rows.length;
1158
+ return section;
1159
+ }).filter((s) => s.rows.length > 0);
1160
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1161
+ "div",
1162
+ {
1163
+ "data-slot": "slash-menu",
1164
+ className: ui.cn(
1165
+ "absolute left-0 right-0 z-30 max-h-64 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-lg",
1166
+ placement === "above" ? "bottom-full mb-2" : "top-full mt-2",
1167
+ className
1168
+ ),
1169
+ onMouseDown: (e) => e.preventDefault(),
1170
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "slash-menu" }),
1171
+ children: [
1172
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b border-border/50 px-3 py-1.5 text-xs text-muted-foreground", children: l.hint }),
1173
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sr-only", role: "status", "aria-live": "polite", "aria-atomic": "true", children: l.resultCount(items.length) }),
1174
+ /* @__PURE__ */ jsxRuntime.jsx(
1175
+ "div",
1176
+ {
1177
+ ref: scrollRef,
1178
+ id: listboxId,
1179
+ role: "listbox",
1180
+ "aria-label": l.list,
1181
+ className: "scrollbar-subtle max-h-56 overflow-y-auto py-1",
1182
+ children: sections.map((section) => /* @__PURE__ */ jsxRuntime.jsxs(
1183
+ "div",
1184
+ {
1185
+ role: "group",
1186
+ "aria-labelledby": `${listboxId}-section-${section.kind}`,
1187
+ children: [
1188
+ /* @__PURE__ */ jsxRuntime.jsxs(
1189
+ "div",
1190
+ {
1191
+ id: `${listboxId}-section-${section.kind}`,
1192
+ className: "flex items-center gap-1.5 px-3 pb-1 pt-1.5 text-xs font-medium text-muted-foreground",
1193
+ "data-testid": chunkMHVNT4J3_cjs.prefixedTestId(testIds?.section, section.kind, {
1194
+ testId: `slash-section-${section.kind}`
1195
+ }),
1196
+ children: [
1197
+ /* @__PURE__ */ jsxRuntime.jsx(SectionIcon, { kind: section.kind }),
1198
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: section.label })
1199
+ ]
1200
+ }
1201
+ ),
1202
+ section.rows.map((item, idx) => {
1203
+ const flatIndex = section.offset + idx;
1204
+ const isActive = flatIndex === selectedIndex;
1205
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1206
+ "div",
1207
+ {
1208
+ id: listOptionId(listboxId, flatIndex),
1209
+ role: "option",
1210
+ "aria-selected": isActive,
1211
+ "data-slash-index": flatIndex,
1212
+ className: ui.cn(
1213
+ "flex cursor-pointer items-baseline gap-2 px-3 py-1.5 text-sm pointer-coarse:min-h-11 pointer-coarse:items-center",
1214
+ isActive ? "bg-accent text-accent-foreground" : "hover:bg-accent/50"
1215
+ ),
1216
+ onMouseEnter: () => setSelectedIndex(flatIndex),
1217
+ onClick: () => onSelect(item),
1218
+ "data-testid": chunkMHVNT4J3_cjs.prefixedTestId(testIds?.item, item.name, {
1219
+ testId: `slash-item-${item.name}`
1220
+ }),
1221
+ children: [
1222
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "shrink-0 font-mono text-foreground", children: [
1223
+ "/",
1224
+ item.name
1225
+ ] }),
1226
+ item.argHint && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 font-mono text-xs text-muted-foreground", children: item.argHint }),
1227
+ item.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-xs text-muted-foreground", children: item.description }),
1228
+ item.visibility === "global" && /* @__PURE__ */ jsxRuntime.jsxs(
1229
+ "span",
1230
+ {
1231
+ className: "ml-auto inline-flex shrink-0 items-center gap-1 text-xs text-muted-foreground",
1232
+ title: l.globalTitle,
1233
+ children: [
1234
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Globe, { className: "h-3 w-3" }),
1235
+ l.global
1236
+ ]
1237
+ }
1238
+ )
1239
+ ]
1240
+ },
1241
+ item.name
1242
+ );
1243
+ })
1244
+ ]
1245
+ },
1246
+ section.kind
1247
+ ))
1248
+ }
1249
+ ),
1250
+ onBrowse && /* @__PURE__ */ jsxRuntime.jsxs(
1251
+ "button",
1252
+ {
1253
+ type: "button",
1254
+ onClick: onBrowse,
1255
+ className: "flex w-full items-center gap-1.5 border-t border-border/50 px-3 py-1.5 text-left text-xs text-muted-foreground hover:bg-accent/50 pointer-coarse:min-h-11",
1256
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.browse, { testId: "slash-browse-skills" }),
1257
+ children: [
1258
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpen, { className: "h-3 w-3", "aria-hidden": "true" }),
1259
+ l.browse
1260
+ ]
1261
+ }
1262
+ )
1263
+ ]
1264
+ }
1265
+ );
1266
+ });
1267
+ var DEFAULT_PINNED_DOC_CHIP_LABELS = {
1268
+ unpin: "Unpin",
1269
+ unpinDocument: (title) => `Unpin ${title}`
1270
+ };
1271
+ function PinnedDocChip({
1272
+ title,
1273
+ onUnpin,
1274
+ className,
1275
+ labels,
1276
+ testId = "unpin-document-button"
1277
+ }) {
1278
+ const l = { ...DEFAULT_PINNED_DOC_CHIP_LABELS, ...labels };
1279
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1280
+ "span",
1281
+ {
1282
+ role: "button",
1283
+ tabIndex: 0,
1284
+ "data-slot": "pinned-doc-chip",
1285
+ onClick: (e) => {
1286
+ e.stopPropagation();
1287
+ onUnpin();
1288
+ },
1289
+ onKeyDown: (e) => {
1290
+ if (e.key === "Enter" || e.key === " ") {
1291
+ e.stopPropagation();
1292
+ onUnpin();
1293
+ }
1294
+ },
1295
+ title: l.unpin,
1296
+ "aria-label": l.unpinDocument(title),
1297
+ className: ui.cn(
1298
+ "-mx-0.5 flex min-w-0 items-center gap-1 rounded-sm px-1 text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1299
+ className
1300
+ ),
1301
+ "data-testid": testId,
1302
+ children: [
1303
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pin, { className: "h-3 w-3 shrink-0 fill-primary" }),
1304
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "order-last h-3 w-3 shrink-0 text-muted-foreground" }),
1305
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate text-sm", children: title })
1306
+ ]
1307
+ }
1308
+ );
1309
+ }
1310
+ var DEFAULT_CONVERSATION_EMPTY_LABELS = {
1311
+ title: "Ask ARBI about your documents",
1312
+ description: "Ask a question and verify every answer against the source.",
1313
+ dropDocuments: "Drop documents here to add them"
1314
+ };
1315
+ function AddDocumentsArea({
1316
+ onAddDocuments,
1317
+ label,
1318
+ testId
1319
+ }) {
1320
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1321
+ "button",
1322
+ {
1323
+ type: "button",
1324
+ onClick: () => onAddDocuments(),
1325
+ onDragOver: (e) => {
1326
+ if (e.dataTransfer.types.includes("Files")) {
1327
+ e.preventDefault();
1328
+ e.dataTransfer.dropEffect = "copy";
1329
+ }
1330
+ },
1331
+ onDrop: (e) => {
1332
+ const files = Array.from(e.dataTransfer.files ?? []);
1333
+ if (files.length > 0) {
1334
+ e.preventDefault();
1335
+ onAddDocuments(files);
1336
+ }
1337
+ },
1338
+ "data-testid": testId,
1339
+ className: "mx-auto flex w-full max-w-sm items-center justify-center gap-2 rounded-lg bg-muted px-3 py-2.5 text-sm text-muted-foreground transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
1340
+ children: [
1341
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileUp, { className: "h-4 w-4 shrink-0" }),
1342
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
1343
+ ]
1344
+ }
1345
+ );
1346
+ }
1347
+ var BELOW = "mx-auto w-full max-w-4xl text-left";
1348
+ var CHIP = "group inline-flex items-center rounded-full bg-muted px-3.5 py-2 text-left text-sm text-foreground transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11";
1349
+ function ConversationEmpty({
1350
+ hasDocuments,
1351
+ prompts,
1352
+ shortcut,
1353
+ onUsePrompt,
1354
+ onAddDocuments,
1355
+ noDocuments,
1356
+ below,
1357
+ title,
1358
+ description,
1359
+ className,
1360
+ labels,
1361
+ testIds
1362
+ }) {
1363
+ const l = { ...DEFAULT_CONVERSATION_EMPTY_LABELS, ...labels };
1364
+ const rootTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "conversation-empty-state" });
1365
+ const uploadTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.upload, { testId: "conversation-empty-upload" });
1366
+ const shortcutTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.shortcut, {
1367
+ testId: "conversation-shortcut-main-events"
1368
+ });
1369
+ const promptTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.prompt, { testId: "conversation-example-prompt" });
1370
+ if (!hasDocuments) {
1371
+ return /* @__PURE__ */ jsxRuntime.jsx(
1372
+ "div",
1373
+ {
1374
+ "data-slot": "conversation-empty",
1375
+ className: ui.cn(
1376
+ "absolute inset-0 flex flex-col items-center overflow-y-auto px-6 py-8 pb-28",
1377
+ className
1378
+ ),
1379
+ "data-testid": rootTestId,
1380
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "my-auto flex w-full flex-col items-center gap-8", children: [
1381
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full max-w-xl flex-col items-center gap-3", children: noDocuments }),
1382
+ below && /* @__PURE__ */ jsxRuntime.jsx("div", { className: BELOW, children: below })
1383
+ ] })
1384
+ }
1385
+ );
1386
+ }
1387
+ return /* @__PURE__ */ jsxRuntime.jsx(
1388
+ "div",
1389
+ {
1390
+ "data-slot": "conversation-empty",
1391
+ className: ui.cn("absolute inset-0 flex overflow-y-auto p-6 pb-28", className),
1392
+ "data-testid": rootTestId,
1393
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "m-auto flex w-full flex-col", children: [
1394
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-xl text-center", children: [
1395
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-lg bg-ai-soft text-ai-ink", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: "h-6 w-6" }) }),
1396
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-lg font-semibold text-foreground", children: title ?? l.title }),
1397
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 text-sm text-muted-foreground", children: description ?? l.description })
1398
+ ] }),
1399
+ below && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn(BELOW, "mt-6"), children: below }),
1400
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto w-full max-w-xl text-center", children: [
1401
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("flex flex-wrap justify-center gap-2", below ? "mt-8" : "mt-5"), children: [
1402
+ shortcut && /* @__PURE__ */ jsxRuntime.jsxs(
1403
+ "button",
1404
+ {
1405
+ type: "button",
1406
+ onClick: () => onUsePrompt(shortcut.prompt),
1407
+ title: shortcut.prompt,
1408
+ className: ui.cn(CHIP, "gap-2 font-medium"),
1409
+ "data-testid": shortcutTestId,
1410
+ children: [
1411
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.GanttChartSquare, { className: "h-4 w-4 shrink-0 text-ai-ink" }),
1412
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: shortcut.label }),
1413
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" })
1414
+ ]
1415
+ }
1416
+ ),
1417
+ prompts.map((prompt) => /* @__PURE__ */ jsxRuntime.jsxs(
1418
+ "button",
1419
+ {
1420
+ type: "button",
1421
+ onClick: () => onUsePrompt(prompt),
1422
+ className: ui.cn(CHIP, "gap-1.5"),
1423
+ "data-testid": promptTestId,
1424
+ children: [
1425
+ prompt,
1426
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { className: "h-3.5 w-3.5 text-muted-foreground" })
1427
+ ]
1428
+ },
1429
+ prompt
1430
+ ))
1431
+ ] }),
1432
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-5", children: /* @__PURE__ */ jsxRuntime.jsx(
1433
+ AddDocumentsArea,
1434
+ {
1435
+ onAddDocuments,
1436
+ label: l.dropDocuments,
1437
+ testId: uploadTestId
1438
+ }
1439
+ ) })
1440
+ ] })
1441
+ ] })
1442
+ }
1443
+ );
1444
+ }
1445
+ var DEFAULT_CONVERSATION_LAYOUT_LABELS = {
1446
+ loadingMessages: "Loading messages..."
1447
+ };
1448
+ function ConversationRoot({
1449
+ className,
1450
+ children,
1451
+ testId = "conversation",
1452
+ ...rest
1453
+ }) {
1454
+ return /* @__PURE__ */ jsxRuntime.jsx(
1455
+ "div",
1456
+ {
1457
+ "data-slot": "conversation",
1458
+ className: ui.cn("flex min-h-full shrink-0 flex-col", className),
1459
+ "data-testid": testId,
1460
+ ...rest,
1461
+ children
1462
+ }
1463
+ );
1464
+ }
1465
+ function ConversationHeader({
1466
+ className,
1467
+ children,
1468
+ ...rest
1469
+ }) {
1470
+ return /* @__PURE__ */ jsxRuntime.jsx(
1471
+ "div",
1472
+ {
1473
+ "data-slot": "conversation-header",
1474
+ className: ui.cn("sticky top-0 z-10 bg-background", className),
1475
+ ...rest,
1476
+ children
1477
+ }
1478
+ );
1479
+ }
1480
+ function ConversationBody({ className, children, ...rest }) {
1481
+ return /* @__PURE__ */ jsxRuntime.jsx(
1482
+ "div",
1483
+ {
1484
+ "data-slot": "conversation-body",
1485
+ className: ui.cn("flex flex-[1_0_auto] flex-col", className),
1486
+ ...rest,
1487
+ children
1488
+ }
1489
+ );
1490
+ }
1491
+ function ConversationMain({ className, children, ...rest }) {
1492
+ return /* @__PURE__ */ jsxRuntime.jsx(
1493
+ "main",
1494
+ {
1495
+ "data-slot": "conversation-main",
1496
+ className: ui.cn("relative flex flex-[1_0_auto] flex-col", className),
1497
+ ...rest,
1498
+ children
1499
+ }
1500
+ );
1501
+ }
1502
+ function ConversationLoading({
1503
+ children,
1504
+ labels,
1505
+ className,
1506
+ testId = "loading-messages"
1507
+ }) {
1508
+ const l = { ...DEFAULT_CONVERSATION_LAYOUT_LABELS, ...labels };
1509
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("flex h-64 items-center justify-center", className), "data-testid": testId, children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: children ?? l.loadingMessages }) });
1510
+ }
1511
+ var Conversation = {
1512
+ Root: ConversationRoot,
1513
+ Header: ConversationHeader,
1514
+ Body: ConversationBody,
1515
+ Main: ConversationMain,
1516
+ Loading: ConversationLoading
1517
+ };
1518
+ var DEFAULT_BRANCH_CONTROLS_LABELS = {
1519
+ branchOf: (current, total) => `Branch ${current} of ${total}`,
1520
+ previewHint: "Click for side-by-side view",
1521
+ previousBranch: "Previous branch",
1522
+ nextBranch: "Next branch"
1523
+ };
1524
+ var ARROW = "rounded p-1 hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:p-3";
1525
+ function BranchControls({
1526
+ index,
1527
+ count,
1528
+ onSwitch,
1529
+ onPreview,
1530
+ previewHint,
1531
+ className,
1532
+ labels,
1533
+ testIds
1534
+ }) {
1535
+ if (count <= 1) return null;
1536
+ const l = { ...DEFAULT_BRANCH_CONTROLS_LABELS, ...labels };
1537
+ const label = l.branchOf(index + 1, count);
1538
+ const rootTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.root, { testId: "branch-controls" });
1539
+ const previewTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.preview, { testId: "threads-preview-button" });
1540
+ const iconTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.icon, { testId: "branch-icon" });
1541
+ const indicatorTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.indicator, { testId: "branch-indicator" });
1542
+ const previousTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.previous, { testId: "previous-branch-button" });
1543
+ const nextTestId = chunkMHVNT4J3_cjs.testIdOr(testIds?.next, { testId: "next-branch-button" });
1544
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1545
+ "div",
1546
+ {
1547
+ "data-slot": "branch-controls",
1548
+ className: ui.cn("branch-controls flex items-center gap-1", className),
1549
+ "data-testid": rootTestId,
1550
+ children: [
1551
+ onPreview ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
1552
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
1553
+ "button",
1554
+ {
1555
+ type: "button",
1556
+ onClick: onPreview,
1557
+ className: "flex items-center gap-1 rounded-md bg-muted px-2 py-1 transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
1558
+ "data-testid": previewTestId,
1559
+ children: [
1560
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Network, { size: 12, className: "text-primary", "data-testid": iconTestId }),
1561
+ /* @__PURE__ */ jsxRuntime.jsx(
1562
+ "span",
1563
+ {
1564
+ className: "text-sm font-medium text-muted-foreground",
1565
+ "data-testid": indicatorTestId,
1566
+ children: label
1567
+ }
1568
+ )
1569
+ ]
1570
+ }
1571
+ ) }),
1572
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: previewHint ?? l.previewHint }) })
1573
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(
1574
+ "span",
1575
+ {
1576
+ className: "flex items-center gap-1 px-2 py-1 text-sm font-medium text-muted-foreground",
1577
+ "data-testid": indicatorTestId,
1578
+ children: [
1579
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Network, { size: 12, className: "text-primary", "data-testid": iconTestId }),
1580
+ label
1581
+ ]
1582
+ }
1583
+ ),
1584
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
1585
+ /* @__PURE__ */ jsxRuntime.jsx(
1586
+ "button",
1587
+ {
1588
+ type: "button",
1589
+ onClick: () => onSwitch(index - 1),
1590
+ disabled: index <= 0,
1591
+ className: ARROW,
1592
+ title: l.previousBranch,
1593
+ "aria-label": l.previousBranch,
1594
+ "data-testid": previousTestId,
1595
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeft, { size: 12 })
1596
+ }
1597
+ ),
1598
+ /* @__PURE__ */ jsxRuntime.jsx(
1599
+ "button",
1600
+ {
1601
+ type: "button",
1602
+ onClick: () => onSwitch(index + 1),
1603
+ disabled: index >= count - 1,
1604
+ className: ARROW,
1605
+ title: l.nextBranch,
1606
+ "aria-label": l.nextBranch,
1607
+ "data-testid": nextTestId,
1608
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { size: 12 })
1609
+ }
1610
+ )
1611
+ ] })
1612
+ ]
1613
+ }
1614
+ );
1615
+ }
1616
+ var TIER_ICON = {
1617
+ standard: lucideReact.Zap,
1618
+ wise: lucideReact.Glasses,
1619
+ premium: lucideReact.Crown
1620
+ };
1621
+ var TIER_TONE = {
1622
+ standard: "text-secondary fill-secondary",
1623
+ wise: "text-secondary fill-secondary",
1624
+ premium: "text-yellow-text fill-yellow-text"
1625
+ };
1626
+ function ModelTierIcon({ tier, isGreyed, className }) {
1627
+ const Icon = TIER_ICON[tier];
1628
+ return /* @__PURE__ */ jsxRuntime.jsx(
1629
+ Icon,
1630
+ {
1631
+ className: ui.cn(
1632
+ "size-3.5 shrink-0",
1633
+ isGreyed ? "fill-muted-foreground text-muted-foreground" : TIER_TONE[tier],
1634
+ className
1635
+ )
1636
+ }
1637
+ );
1638
+ }
1639
+ function ModelAutoIcon({ className }) {
1640
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sparkles, { className: ui.cn("size-3.5 shrink-0 fill-secondary text-secondary", className) });
1641
+ }
1642
+ function ModelDot({ isGreyed }) {
1643
+ return /* @__PURE__ */ jsxRuntime.jsx(
1644
+ "div",
1645
+ {
1646
+ className: ui.cn(
1647
+ "size-2 shrink-0 rounded-full",
1648
+ isGreyed ? "bg-muted-foreground" : "bg-primary"
1649
+ )
1650
+ }
1651
+ );
1652
+ }
1653
+ function ModelOptionLabel({ icon, label }) {
1654
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-2", children: [
1655
+ icon,
1656
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: label })
1657
+ ] });
1658
+ }
1659
+ function ModelTriggerContent({ icon, label }) {
1660
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [
1661
+ icon,
1662
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label })
1663
+ ] });
1664
+ }
1665
+ var ModelPickerTrigger = react.forwardRef(
1666
+ function ModelPickerTrigger2({ icon, label, nameLabel = "Model", className, testId = "model-selector-compact", ...rest }, ref) {
1667
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1668
+ ui.Button,
1669
+ {
1670
+ ref,
1671
+ variant: "ghost",
1672
+ size: "sm",
1673
+ className: ui.cn(
1674
+ "h-8 min-w-0 shrink gap-1 px-2 text-sm text-muted-foreground hover:bg-muted hover:text-foreground pointer-coarse:h-11",
1675
+ className
1676
+ ),
1677
+ "aria-label": typeof label === "string" ? `${nameLabel}: ${label}` : void 0,
1678
+ "data-slot": "model-picker-trigger",
1679
+ "data-testid": testId,
1680
+ ...rest,
1681
+ children: [
1682
+ /* @__PURE__ */ jsxRuntime.jsx(ModelTriggerContent, { icon, label }),
1683
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: "size-3 shrink-0 text-muted-foreground" })
1684
+ ]
1685
+ }
1686
+ );
1687
+ }
1688
+ );
1689
+ function ModelPickerPopover({
1690
+ open,
1691
+ onOpenChange,
1692
+ trigger,
1693
+ tooltip,
1694
+ title = "Select AI Model",
1695
+ children
1696
+ }) {
1697
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkSCFYPAG6_cjs.BlocksTooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange, children: [
1698
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
1699
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: trigger }) }),
1700
+ tooltip && !open && /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "top", children: tooltip })
1701
+ ] }),
1702
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.PopoverContent, { side: "top", align: "start", className: "w-[280px] p-1", sideOffset: 8, children: [
1703
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1.5 text-sm font-medium text-muted-foreground", children: title }),
1704
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex max-h-[280px] flex-col gap-0.5 overflow-y-auto", children })
1705
+ ] })
1706
+ ] }) });
1707
+ }
1708
+ function ModelMenuDivider() {
1709
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-0.5 border-t border-border", role: "separator" });
1710
+ }
1711
+ function ModelMenuMessage({ children }) {
1712
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1.5 text-sm text-muted-foreground", children });
1713
+ }
1714
+ function ModelOption({
1715
+ icon,
1716
+ label,
1717
+ isSelected,
1718
+ onSelect,
1719
+ testId,
1720
+ emphasis = "plain"
1721
+ }) {
1722
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1723
+ "button",
1724
+ {
1725
+ type: "button",
1726
+ onClick: onSelect,
1727
+ className: ui.cn(
1728
+ "flex w-full min-w-0 items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent pointer-coarse:min-h-11",
1729
+ emphasis === "tier" && "border-l-4",
1730
+ emphasis === "tier" && (isSelected ? "border-l-primary" : "border-l-transparent"),
1731
+ isSelected && "bg-accent"
1732
+ ),
1733
+ "aria-pressed": isSelected,
1734
+ "data-slot": "model-option",
1735
+ "data-testid": testId,
1736
+ children: [
1737
+ icon,
1738
+ /* @__PURE__ */ jsxRuntime.jsx(
1739
+ "span",
1740
+ {
1741
+ className: ui.cn(
1742
+ "min-w-0 flex-1 truncate",
1743
+ emphasis === "tier" && (isSelected ? "font-semibold text-foreground" : "font-medium text-muted-foreground")
1744
+ ),
1745
+ children: label
1746
+ }
1747
+ ),
1748
+ isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3 shrink-0 text-primary" })
1749
+ ]
1750
+ }
1751
+ );
1752
+ }
1753
+ function ModelTierOption({
1754
+ icon,
1755
+ label,
1756
+ isSelected,
1757
+ isDisabled,
1758
+ onSelect,
1759
+ action,
1760
+ testId
1761
+ }) {
1762
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1763
+ "div",
1764
+ {
1765
+ className: ui.cn(
1766
+ "flex items-center gap-1 rounded-sm border-l-4 pr-1 transition-colors",
1767
+ isSelected ? "border-l-primary bg-accent" : "border-l-transparent"
1768
+ ),
1769
+ "data-slot": "model-tier-option",
1770
+ children: [
1771
+ /* @__PURE__ */ jsxRuntime.jsxs(
1772
+ "button",
1773
+ {
1774
+ type: "button",
1775
+ onClick: () => {
1776
+ if (!isDisabled) onSelect();
1777
+ },
1778
+ disabled: isDisabled,
1779
+ className: ui.cn(
1780
+ "flex min-w-0 flex-1 items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm pointer-coarse:min-h-11",
1781
+ isDisabled ? "cursor-not-allowed opacity-50" : "hover:bg-accent"
1782
+ ),
1783
+ "data-testid": testId,
1784
+ children: [
1785
+ icon,
1786
+ /* @__PURE__ */ jsxRuntime.jsx(
1787
+ "span",
1788
+ {
1789
+ className: ui.cn(
1790
+ "min-w-0 flex-1 truncate",
1791
+ isSelected ? "font-semibold text-foreground" : "font-medium text-muted-foreground"
1792
+ ),
1793
+ children: label
1794
+ }
1795
+ )
1796
+ ]
1797
+ }
1798
+ ),
1799
+ action
1800
+ ]
1801
+ }
1802
+ );
1803
+ }
1804
+ function ModelConfigureButton({
1805
+ onClick,
1806
+ label,
1807
+ tooltip,
1808
+ testId
1809
+ }) {
1810
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
1811
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
1812
+ "button",
1813
+ {
1814
+ type: "button",
1815
+ onClick: (e) => {
1816
+ e.stopPropagation();
1817
+ onClick();
1818
+ },
1819
+ className: "flex size-7 shrink-0 items-center justify-center rounded-md border border-border bg-background text-foreground hover:bg-accent pointer-coarse:size-11",
1820
+ "data-testid": testId,
1821
+ "aria-label": label,
1822
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "size-4" })
1823
+ }
1824
+ ) }),
1825
+ /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "top", children: tooltip })
1826
+ ] });
1827
+ }
1828
+ var DEFAULT_MODEL_PRICING_TIP_LABELS = {
1829
+ input: (credits) => `Input: ${credits} credits/M tokens`,
1830
+ output: (credits) => `Output: ${credits} credits/M tokens`
1831
+ };
1832
+ function ModelPricingTip({
1833
+ modelName,
1834
+ inputCredits,
1835
+ outputCredits,
1836
+ labels
1837
+ }) {
1838
+ const l = { ...DEFAULT_MODEL_PRICING_TIP_LABELS, ...labels };
1839
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 text-sm", children: [
1840
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: modelName }),
1841
+ inputCredits && /* @__PURE__ */ jsxRuntime.jsx("div", { children: l.input(inputCredits) }),
1842
+ outputCredits && /* @__PURE__ */ jsxRuntime.jsx("div", { children: l.output(outputCredits) })
1843
+ ] });
1844
+ }
1845
+ function ConversationHeaderActions({
1846
+ children,
1847
+ className
1848
+ }) {
1849
+ return /* @__PURE__ */ jsxRuntime.jsx(
1850
+ "div",
1851
+ {
1852
+ className: ui.cn("flex items-center gap-2", className),
1853
+ "data-slot": "conversation-header-actions",
1854
+ children
1855
+ }
1856
+ );
1857
+ }
1858
+ var DEFAULT_CONVERSATION_PARTS_LABELS = {
1859
+ newEntity: (entityLabel) => `New ${entityLabel}`,
1860
+ newPaChatTitle: "Start a new Personal Assistant chat",
1861
+ newPaChat: "New PA Chat",
1862
+ paModeTitle: "Personal Assistant mode",
1863
+ pa: "PA"
1864
+ };
1865
+ function NewChatButton({
1866
+ entityLabel,
1867
+ isCompact,
1868
+ onClick,
1869
+ labels,
1870
+ testId = "new-conversation-button"
1871
+ }) {
1872
+ const text = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }.newEntity(entityLabel);
1873
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1874
+ "button",
1875
+ {
1876
+ type: "button",
1877
+ onClick,
1878
+ className: "flex h-8 items-center gap-1.5 rounded-md px-2 text-sm font-medium text-primary transition-colors hover:bg-primary/10 pointer-coarse:h-11! pointer-coarse:min-w-11 pointer-coarse:justify-center",
1879
+ "data-testid": testId,
1880
+ "aria-label": text,
1881
+ title: text,
1882
+ children: [
1883
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "size-4 shrink-0" }),
1884
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { children: text })
1885
+ ]
1886
+ }
1887
+ );
1888
+ }
1889
+ function NewPaChatButton({
1890
+ isCompact,
1891
+ onClick,
1892
+ labels,
1893
+ testId = "new-pa-conversation-button"
1894
+ }) {
1895
+ const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels };
1896
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1897
+ ui.Button,
1898
+ {
1899
+ variant: "outline",
1900
+ size: "icon",
1901
+ onClick,
1902
+ className: ui.cn(
1903
+ "pointer-coarse:min-h-11",
1904
+ isCompact ? "flex items-center" : "flex w-auto items-center gap-2 px-4"
1905
+ ),
1906
+ "data-testid": testId,
1907
+ title: l.newPaChatTitle,
1908
+ children: [
1909
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bot, { className: "size-4" }),
1910
+ !isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { children: l.newPaChat })
1911
+ ]
1912
+ }
1913
+ );
1914
+ }
1915
+ function ComposerAccessories({
1916
+ children,
1917
+ className
1918
+ }) {
1919
+ return /* @__PURE__ */ jsxRuntime.jsx(
1920
+ "span",
1921
+ {
1922
+ className: ui.cn(
1923
+ "flex items-center gap-1 [&_button]:border-transparent [&_button]:bg-transparent [&_button]:text-muted-foreground pointer-coarse:[&_button]:h-11",
1924
+ className
1925
+ ),
1926
+ "data-slot": "composer-accessories",
1927
+ children
1928
+ }
1929
+ );
1930
+ }
1931
+ function ComposerTools({
1932
+ children,
1933
+ className
1934
+ }) {
1935
+ return /* @__PURE__ */ jsxRuntime.jsx(
1936
+ "div",
1937
+ {
1938
+ className: ui.cn(
1939
+ "flex items-center gap-1 [&_button:not([data-testid=send-message-button]):not([data-testid=retry-button])]:border-transparent [&_button:not([data-testid=send-message-button]):not([data-testid=retry-button])]:bg-transparent",
1940
+ className
1941
+ ),
1942
+ "data-slot": "composer-tools",
1943
+ children
1944
+ }
1945
+ );
1946
+ }
1947
+ function PaModeBadge({
1948
+ icon,
1949
+ labels,
1950
+ testId = "pa-mode-indicator"
1951
+ }) {
1952
+ const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels };
1953
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1954
+ "div",
1955
+ {
1956
+ className: "flex h-8 shrink-0 items-center gap-1.5 rounded-md px-2.5 text-yellow-text",
1957
+ title: l.paModeTitle,
1958
+ "data-testid": testId,
1959
+ children: [
1960
+ icon,
1961
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold", children: l.pa })
1962
+ ]
1963
+ }
1964
+ );
1965
+ }
1966
+ function ConversationSettingsButton({
1967
+ label,
1968
+ onClick,
1969
+ testId = "conversation-settings-button"
1970
+ }) {
1971
+ return /* @__PURE__ */ jsxRuntime.jsx(
1972
+ ui.Button,
1973
+ {
1974
+ type: "button",
1975
+ size: "icon",
1976
+ variant: "ghost",
1977
+ className: "size-8 shrink-0 text-muted-foreground pointer-coarse:size-11",
1978
+ onClick,
1979
+ title: label,
1980
+ "aria-label": label,
1981
+ "data-testid": testId,
1982
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "size-4" })
1983
+ }
1984
+ );
1985
+ }
1986
+ function ConversationHistoryPane({
1987
+ children,
1988
+ className
1989
+ }) {
1990
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("min-h-0 flex-1 overflow-hidden", className), children });
1991
+ }
1992
+ var DEFAULT_THREAD_MAP_LABELS = {
1993
+ saveSvgTitle: "Save SVG as file",
1994
+ saveSvg: "Save SVG",
1995
+ generating: "Generating visualization...",
1996
+ renderError: (message) => `Error rendering diagram: ${message}`
1997
+ };
1998
+ function ThreadMap({
1999
+ hint,
2000
+ onSave,
2001
+ children,
2002
+ className,
2003
+ labels,
2004
+ testId = "thread-visualizer"
2005
+ }) {
2006
+ const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels };
2007
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2008
+ "div",
2009
+ {
2010
+ className: ui.cn("thread-visualizer flex h-full w-full flex-col", className),
2011
+ "data-slot": "thread-map",
2012
+ "data-testid": testId,
2013
+ children: [
2014
+ hint !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [
2015
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm italic text-muted-foreground", children: hint }),
2016
+ onSave && /* @__PURE__ */ jsxRuntime.jsxs(
2017
+ ui.Button,
2018
+ {
2019
+ variant: "secondary",
2020
+ size: "sm",
2021
+ onClick: onSave,
2022
+ title: l.saveSvgTitle,
2023
+ className: "shrink-0 pointer-coarse:min-h-11",
2024
+ children: [
2025
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "size-3" }),
2026
+ l.saveSvg
2027
+ ]
2028
+ }
2029
+ )
2030
+ ] }),
2031
+ /* @__PURE__ */ jsxRuntime.jsx(
2032
+ "div",
2033
+ {
2034
+ className: "mermaid-container w-full flex-1 overflow-auto rounded-lg bg-muted",
2035
+ style: { scrollBehavior: "auto", contain: "layout style" },
2036
+ onScroll: (e) => e.stopPropagation(),
2037
+ children
2038
+ }
2039
+ )
2040
+ ]
2041
+ }
2042
+ );
2043
+ }
2044
+ function ThreadMapLoading({
2045
+ label,
2046
+ labels
2047
+ }) {
2048
+ const text = label ?? { ...DEFAULT_THREAD_MAP_LABELS, ...labels }.generating;
2049
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-24 items-center justify-center text-muted-foreground", role: "status", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center", children: [
2050
+ /* @__PURE__ */ jsxRuntime.jsxs(
2051
+ "svg",
2052
+ {
2053
+ className: "-ml-1 mr-3 size-5 animate-spin text-primary",
2054
+ xmlns: "http://www.w3.org/2000/svg",
2055
+ fill: "none",
2056
+ viewBox: "0 0 24 24",
2057
+ "aria-hidden": true,
2058
+ children: [
2059
+ /* @__PURE__ */ jsxRuntime.jsx(
2060
+ "circle",
2061
+ {
2062
+ className: "opacity-25",
2063
+ cx: "12",
2064
+ cy: "12",
2065
+ r: "10",
2066
+ stroke: "currentColor",
2067
+ strokeWidth: "4"
2068
+ }
2069
+ ),
2070
+ /* @__PURE__ */ jsxRuntime.jsx(
2071
+ "path",
2072
+ {
2073
+ className: "opacity-75",
2074
+ fill: "currentColor",
2075
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
2076
+ }
2077
+ )
2078
+ ]
2079
+ }
2080
+ ),
2081
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: text })
2082
+ ] }) });
2083
+ }
2084
+ function ThreadMapError({
2085
+ message,
2086
+ labels
2087
+ }) {
2088
+ const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels };
2089
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4 text-red-text", role: "alert", children: l.renderError(message) });
2090
+ }
2091
+ function sanitizeDiagramSvg(svg) {
2092
+ if (!DOMPurify__default.default.isSupported) return "";
2093
+ return DOMPurify__default.default.sanitize(svg, {
2094
+ USE_PROFILES: { svg: true, svgFilters: true, html: true },
2095
+ ADD_TAGS: ["foreignobject"],
2096
+ HTML_INTEGRATION_POINTS: { foreignobject: true },
2097
+ ADD_ATTR: ["target"]
2098
+ });
2099
+ }
2100
+ function ThreadMapDiagram({
2101
+ svg,
2102
+ diagramRef,
2103
+ label = "Conversation thread map"
2104
+ }) {
2105
+ const safeSvg = react.useMemo(() => sanitizeDiagramSvg(svg), [svg]);
2106
+ return /* @__PURE__ */ jsxRuntime.jsx(
2107
+ "div",
2108
+ {
2109
+ ref: diagramRef,
2110
+ className: "p-4",
2111
+ role: "img",
2112
+ "aria-label": label,
2113
+ "data-slot": "thread-map-diagram",
2114
+ dangerouslySetInnerHTML: { __html: safeSvg }
2115
+ }
2116
+ );
2117
+ }
2118
+ var LONG_PASTE_CHARACTER_LIMIT = 1e3;
2119
+ var LONG_PASTE_LINE_LIMIT = 12;
2120
+ function isLongPastedText(value) {
2121
+ return value.length >= LONG_PASTE_CHARACTER_LIMIT || value.split("\n").length >= LONG_PASTE_LINE_LIMIT;
2122
+ }
2123
+ function useLongPaste(value) {
2124
+ const [collapsed, setCollapsed] = react.useState(false);
2125
+ const onPaste = react.useCallback(
2126
+ (event, currentValue) => {
2127
+ const pasted = event.clipboardData.getData("text");
2128
+ const el = event.currentTarget;
2129
+ const next = currentValue.slice(0, el.selectionStart) + pasted + currentValue.slice(el.selectionEnd);
2130
+ if (isLongPastedText(next)) setCollapsed(true);
2131
+ },
2132
+ []
2133
+ );
2134
+ const onValueChange = react.useCallback((nextValue) => {
2135
+ if (!isLongPastedText(nextValue)) setCollapsed(false);
2136
+ }, []);
2137
+ const expand = react.useCallback(() => setCollapsed(false), []);
2138
+ return { isCollapsed: collapsed && isLongPastedText(value), onPaste, onValueChange, expand };
2139
+ }
2140
+ var DEFAULT_PENDING_ANSWER_BAR_LABELS = {
2141
+ heading: "ARBI is asking",
2142
+ optionsLabel: "Answer options",
2143
+ hint: "Pick an option, or type your own answer below.",
2144
+ pauseTimer: "Pause the countdown",
2145
+ resumeTimer: "Resume the countdown",
2146
+ timeLeft: "Time left to answer",
2147
+ secondsWarning: (seconds) => `${seconds} seconds left to answer`
2148
+ };
2149
+ function PendingAnswerBar({
2150
+ question,
2151
+ options,
2152
+ timeoutSeconds,
2153
+ onPick,
2154
+ labels
2155
+ }) {
2156
+ const l = { ...DEFAULT_PENDING_ANSWER_BAR_LABELS, ...labels };
2157
+ const [secondsLeft, setSecondsLeft] = react.useState(timeoutSeconds);
2158
+ const firedRef = react.useRef(false);
2159
+ const [isPausedByUser, setIsPausedByUser] = react.useState(false);
2160
+ const [hasFocusWithin, setHasFocusWithin] = react.useState(false);
2161
+ const isPaused = isPausedByUser || hasFocusWithin;
2162
+ const [announcement, setAnnouncement] = react.useState("");
2163
+ const choices = options.filter((o) => o.trim().toLowerCase() !== "other");
2164
+ react.useEffect(() => {
2165
+ setAnnouncement(`${l.heading}: ${question}`);
2166
+ }, []);
2167
+ react.useEffect(() => {
2168
+ if (secondsLeft <= 0 || isPaused) return;
2169
+ const t = setInterval(() => setSecondsLeft((s) => s <= 1 ? 0 : s - 1), 1e3);
2170
+ return () => clearInterval(t);
2171
+ }, [secondsLeft, isPaused]);
2172
+ react.useEffect(() => {
2173
+ if (secondsLeft === 30 || secondsLeft === 10) setAnnouncement(l.secondsWarning(secondsLeft));
2174
+ }, [secondsLeft]);
2175
+ react.useEffect(() => {
2176
+ if (secondsLeft === 0 && !firedRef.current) {
2177
+ firedRef.current = true;
2178
+ onPick("timeout");
2179
+ }
2180
+ }, [secondsLeft, onPick]);
2181
+ const pick = (answer) => {
2182
+ if (firedRef.current) return;
2183
+ firedRef.current = true;
2184
+ onPick(answer);
2185
+ };
2186
+ const fmt = (s) => {
2187
+ const m = Math.floor(s / 60);
2188
+ const r = s % 60;
2189
+ return m > 0 ? `${m}:${r.toString().padStart(2, "0")}` : `${r}s`;
2190
+ };
2191
+ const low = secondsLeft <= 30;
2192
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2193
+ "div",
2194
+ {
2195
+ role: "group",
2196
+ "aria-label": l.heading,
2197
+ className: "mb-2 rounded-lg border border-theme-cyan/30 bg-theme-cyan/[0.05] px-3 py-2.5",
2198
+ "data-slot": "pending-answer-bar",
2199
+ "data-testid": "pending-answer-bar",
2200
+ onFocus: () => setHasFocusWithin(true),
2201
+ onBlur: (event) => {
2202
+ if (!event.currentTarget.contains(event.relatedTarget)) {
2203
+ setHasFocusWithin(false);
2204
+ }
2205
+ },
2206
+ children: [
2207
+ /* @__PURE__ */ jsxRuntime.jsx(
2208
+ "div",
2209
+ {
2210
+ role: "status",
2211
+ "aria-live": "polite",
2212
+ "aria-atomic": "true",
2213
+ className: "sr-only",
2214
+ "data-testid": "pending-answer-status",
2215
+ children: announcement
2216
+ }
2217
+ ),
2218
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
2219
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
2220
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageCircleQuestion, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 text-theme-cyan" }),
2221
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium uppercase tracking-wide text-theme-cyan", children: l.heading })
2222
+ ] }),
2223
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
2224
+ /* @__PURE__ */ jsxRuntime.jsxs(
2225
+ "span",
2226
+ {
2227
+ role: "timer",
2228
+ "aria-label": l.timeLeft,
2229
+ className: ui.cn(
2230
+ "flex items-center gap-1 text-xs tabular-nums",
2231
+ low ? "text-red-text" : "text-muted-foreground"
2232
+ ),
2233
+ "data-testid": "pending-answer-timer",
2234
+ children: [
2235
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { "aria-hidden": "true", className: "h-3 w-3" }),
2236
+ fmt(secondsLeft)
2237
+ ]
2238
+ }
2239
+ ),
2240
+ /* @__PURE__ */ jsxRuntime.jsx(
2241
+ "button",
2242
+ {
2243
+ type: "button",
2244
+ onClick: () => setIsPausedByUser((p) => !p),
2245
+ "aria-pressed": isPausedByUser,
2246
+ "aria-label": l.pauseTimer,
2247
+ title: isPausedByUser ? l.resumeTimer : l.pauseTimer,
2248
+ className: "flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11",
2249
+ "data-testid": "pending-answer-pause",
2250
+ children: isPausedByUser ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { "aria-hidden": "true", className: "h-3 w-3" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pause, { "aria-hidden": "true", className: "h-3 w-3" })
2251
+ }
2252
+ )
2253
+ ] })
2254
+ ] }),
2255
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 whitespace-pre-line text-sm text-foreground", children: question }),
2256
+ choices.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2.5 flex flex-col gap-1.5", role: "group", "aria-label": l.optionsLabel, children: choices.map((option, i) => /* @__PURE__ */ jsxRuntime.jsxs(
2257
+ "button",
2258
+ {
2259
+ type: "button",
2260
+ onClick: () => pick(option),
2261
+ className: ui.cn(
2262
+ "flex w-full items-center gap-2 rounded-md border border-border bg-background",
2263
+ "px-3 py-2 text-left text-sm text-foreground transition-colors",
2264
+ "hover:border-theme-cyan/50 hover:bg-theme-cyan/10",
2265
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11"
2266
+ ),
2267
+ "data-testid": `pending-answer-option-${option}`,
2268
+ children: [
2269
+ /* @__PURE__ */ jsxRuntime.jsx(
2270
+ "span",
2271
+ {
2272
+ "aria-hidden": "true",
2273
+ className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-theme-cyan/40 text-xs font-medium text-theme-cyan",
2274
+ children: i + 1
2275
+ }
2276
+ ),
2277
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1", children: option })
2278
+ ]
2279
+ },
2280
+ `${i}-${option}`
2281
+ )) }),
2282
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: l.hint })
2283
+ ]
2284
+ }
2285
+ );
2286
+ }
2287
+ var DEFAULT_CONVERSATION_SEARCH_LABELS = {
2288
+ placeholder: "Search your conversations...",
2289
+ search: "Search",
2290
+ searching: "Searching conversations\u2026",
2291
+ matched: (count, query) => `${count} conversation${count === 1 ? "" : "s"} matched \u201C${query}\u201D`,
2292
+ matchCount: (count) => `${count} match${count === 1 ? "" : "es"}`,
2293
+ untitled: "Untitled conversation",
2294
+ you: "You",
2295
+ assistant: "Assistant",
2296
+ clear: "Clear",
2297
+ noResults: (query) => `No conversations matched \u201C${query}\u201D.`,
2298
+ reindexHint: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2299
+ "Older conversations may need indexing \u2014 try ",
2300
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: "Re-index" }),
2301
+ "."
2302
+ ] }),
2303
+ backToList: "Back to list"
2304
+ };
2305
+ function RoleChip({ isUser, labels }) {
2306
+ const Icon = isUser ? lucideReact.User : lucideReact.Bot;
2307
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 text-xs font-medium text-muted-foreground", children: [
2308
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-3" }),
2309
+ isUser ? labels.you : labels.assistant
2310
+ ] });
2311
+ }
2312
+ var Passthrough = ({ children }) => /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
2313
+ function ConversationSearchView({
2314
+ query,
2315
+ onQueryChange,
2316
+ onSubmit,
2317
+ canSubmit,
2318
+ isSearching,
2319
+ submittedQuery,
2320
+ groups,
2321
+ onOpenConversation,
2322
+ onClear,
2323
+ children,
2324
+ ResultsBoundary = Passthrough,
2325
+ labels
2326
+ }) {
2327
+ const l = react.useMemo(() => ({ ...DEFAULT_CONVERSATION_SEARCH_LABELS, ...labels }), [labels]);
2328
+ const hasResults = !!submittedQuery && !isSearching && groups.length > 0;
2329
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2330
+ "div",
2331
+ {
2332
+ "data-slot": "conversation-search",
2333
+ className: "flex h-full flex-col",
2334
+ "data-testid": "conversation-search-page",
2335
+ children: [
2336
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start gap-3 px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(
2337
+ "form",
2338
+ {
2339
+ onSubmit: (e) => {
2340
+ e.preventDefault();
2341
+ onSubmit();
2342
+ },
2343
+ className: "flex-1",
2344
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-2 rounded-md border border-input bg-muted px-3 py-1.5 focus-within:ring-2 focus-within:ring-ring", children: [
2345
+ /* @__PURE__ */ jsxRuntime.jsx(
2346
+ "textarea",
2347
+ {
2348
+ rows: 1,
2349
+ value: query,
2350
+ onChange: (e) => {
2351
+ onQueryChange(e.target.value);
2352
+ e.target.style.height = "auto";
2353
+ e.target.style.height = `${e.target.scrollHeight}px`;
2354
+ },
2355
+ onKeyDown: (e) => {
2356
+ if (e.key === "Enter" && !e.shiftKey) {
2357
+ e.preventDefault();
2358
+ onSubmit();
2359
+ }
2360
+ },
2361
+ placeholder: l.placeholder,
2362
+ "aria-label": l.search,
2363
+ className: "flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground",
2364
+ "data-testid": "conversation-search-input"
2365
+ }
2366
+ ),
2367
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-shrink-0 items-center gap-1", children: /* @__PURE__ */ jsxRuntime.jsx(
2368
+ ui.Button,
2369
+ {
2370
+ type: "submit",
2371
+ size: "icon",
2372
+ disabled: !canSubmit,
2373
+ className: "size-7 pointer-coarse:size-11",
2374
+ "data-testid": "conversation-search-submit-button",
2375
+ title: l.search,
2376
+ "aria-label": l.search,
2377
+ children: isSearching ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "size-4" })
2378
+ }
2379
+ ) })
2380
+ ] })
2381
+ }
2382
+ ) }),
2383
+ !submittedQuery ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 overflow-hidden", children }) : /* @__PURE__ */ jsxRuntime.jsx(ResultsBoundary, { children: /* @__PURE__ */ jsxRuntime.jsx("main", { className: "flex-1 overflow-auto px-6 pb-6", children: isSearching ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 py-16 text-muted-foreground", children: [
2384
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-5 animate-spin" }),
2385
+ l.searching
2386
+ ] }) : hasResults ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": "conversation-search-results", children: [
2387
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-3", children: [
2388
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: l.matched(groups.length, submittedQuery) }),
2389
+ /* @__PURE__ */ jsxRuntime.jsxs(
2390
+ ui.Button,
2391
+ {
2392
+ type: "button",
2393
+ variant: "ghost",
2394
+ size: "sm",
2395
+ className: "h-7 gap-1 text-muted-foreground pointer-coarse:h-11",
2396
+ onClick: onClear,
2397
+ "data-testid": "conversation-search-clear",
2398
+ children: [
2399
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3.5" }),
2400
+ l.clear
2401
+ ]
2402
+ }
2403
+ )
2404
+ ] }),
2405
+ groups.map((group) => /* @__PURE__ */ jsxRuntime.jsxs(
2406
+ "div",
2407
+ {
2408
+ className: "rounded-lg border border-border bg-card",
2409
+ "data-testid": "conversation-search-group",
2410
+ children: [
2411
+ /* @__PURE__ */ jsxRuntime.jsxs(
2412
+ "button",
2413
+ {
2414
+ type: "button",
2415
+ onClick: () => onOpenConversation(group.id),
2416
+ className: "flex w-full items-center justify-between gap-3 rounded-t-lg px-4 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11",
2417
+ children: [
2418
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [
2419
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "size-4 flex-shrink-0 text-muted-foreground" }),
2420
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate font-medium", children: group.title || l.untitled })
2421
+ ] }),
2422
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-xs text-muted-foreground", children: l.matchCount(group.matches.length) })
2423
+ ]
2424
+ }
2425
+ ),
2426
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2 border-t border-border p-3", children: group.matches.map((m) => /* @__PURE__ */ jsxRuntime.jsx(
2427
+ ui.PassageCard,
2428
+ {
2429
+ header: /* @__PURE__ */ jsxRuntime.jsx(RoleChip, { isUser: m.role === "user", labels: l }),
2430
+ score: m.score,
2431
+ onClick: () => onOpenConversation(group.id, m.id),
2432
+ "data-testid": "conversation-search-hit",
2433
+ children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "line-clamp-3 text-sm text-foreground/90", children: m.snippet })
2434
+ },
2435
+ m.id
2436
+ )) })
2437
+ ]
2438
+ },
2439
+ group.id
2440
+ ))
2441
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(
2442
+ "div",
2443
+ {
2444
+ className: "py-16 text-center text-muted-foreground",
2445
+ "data-testid": "conversation-search-no-results",
2446
+ children: [
2447
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, { className: "mx-auto mb-3 size-8 opacity-40" }),
2448
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: l.noResults(submittedQuery) }),
2449
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm", children: l.reindexHint }),
2450
+ /* @__PURE__ */ jsxRuntime.jsxs(
2451
+ ui.Button,
2452
+ {
2453
+ type: "button",
2454
+ variant: "ghost",
2455
+ size: "sm",
2456
+ className: "mt-3 gap-1 text-muted-foreground pointer-coarse:h-11",
2457
+ onClick: onClear,
2458
+ children: [
2459
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3.5" }),
2460
+ l.backToList
2461
+ ]
2462
+ }
2463
+ )
2464
+ ]
2465
+ }
2466
+ ) }) })
2467
+ ]
2468
+ }
2469
+ );
2470
+ }
2471
+ var ContextPanelContent = react.forwardRef(function ContextPanelContent2({ className, onClick, ...props }, ref) {
2472
+ return /* @__PURE__ */ jsxRuntime.jsx(
2473
+ ui.HoverCardContent,
2474
+ {
2475
+ ref,
2476
+ side: "top",
2477
+ align: "start",
2478
+ "data-slot": "context-panel",
2479
+ onClick: (e) => {
2480
+ e.stopPropagation();
2481
+ onClick?.(e);
2482
+ },
2483
+ className: ui.cn(
2484
+ "w-[var(--chat-input-width,var(--radix-hover-card-content-available-width))] max-h-[var(--radix-hover-card-content-available-height)] max-w-[95vw] overflow-y-auto overscroll-contain rounded-md border border-border bg-muted p-3 shadow-lg",
2485
+ className
2486
+ ),
2487
+ ...props
2488
+ }
2489
+ );
2490
+ });
2491
+ function ContextPickerList({
2492
+ groups,
2493
+ emptyText,
2494
+ testId,
2495
+ className
2496
+ }) {
2497
+ const isEmpty = groups.every((g) => g.count === 0);
2498
+ return /* @__PURE__ */ jsxRuntime.jsx(
2499
+ "div",
2500
+ {
2501
+ className: ui.cn("max-h-[400px] space-y-1 overflow-y-auto", className),
2502
+ "data-slot": "context-picker-list",
2503
+ "data-testid": testId,
2504
+ onClick: (e) => e.stopPropagation(),
2505
+ children: isEmpty ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "p-2 text-sm text-muted-foreground", children: emptyText }) : groups.map((g, index) => /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
2506
+ /* @__PURE__ */ jsxRuntime.jsxs(
2507
+ "div",
2508
+ {
2509
+ className: ui.cn(
2510
+ "sticky z-10 bg-muted px-2 py-1.5 text-sm font-medium text-muted-foreground",
2511
+ index === 0 ? "top-0" : "top-8"
2512
+ ),
2513
+ "data-testid": g.testId,
2514
+ children: [
2515
+ g.heading,
2516
+ " (",
2517
+ g.count,
2518
+ ")"
2519
+ ]
2520
+ }
2521
+ ),
2522
+ g.children
2523
+ ] }, g.key))
2524
+ }
2525
+ );
2526
+ }
2527
+ function CheckGlyph({ isChecked, className }) {
2528
+ return /* @__PURE__ */ jsxRuntime.jsx(
2529
+ "span",
2530
+ {
2531
+ className: ui.cn(
2532
+ "flex size-3.5 shrink-0 items-center justify-center rounded-sm border",
2533
+ isChecked ? "border-primary bg-primary text-primary-foreground" : "border-input",
2534
+ className
2535
+ ),
2536
+ children: isChecked && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3" })
2537
+ }
2538
+ );
2539
+ }
2540
+ function ContextPickerRow({
2541
+ isSelected,
2542
+ onToggle,
2543
+ testId,
2544
+ children
2545
+ }) {
2546
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2547
+ "button",
2548
+ {
2549
+ type: "button",
2550
+ onClick: (e) => {
2551
+ e.stopPropagation();
2552
+ onToggle();
2553
+ },
2554
+ "aria-pressed": isSelected,
2555
+ "data-testid": testId,
2556
+ className: ui.cn(
2557
+ "flex w-full items-start gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11",
2558
+ isSelected ? "bg-primary/10" : "bg-card hover:bg-muted"
2559
+ ),
2560
+ children: [
2561
+ /* @__PURE__ */ jsxRuntime.jsx(CheckGlyph, { isChecked: isSelected, className: "mt-0.5" }),
2562
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "line-clamp-2 min-w-0 text-foreground", children })
2563
+ ]
2564
+ }
2565
+ );
2566
+ }
2567
+ function ContextCheckRow({
2568
+ isSelected,
2569
+ toggle,
2570
+ status,
2571
+ testId,
2572
+ children
2573
+ }) {
2574
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2575
+ "div",
2576
+ {
2577
+ className: "flex items-center gap-2 rounded px-1 py-0.5",
2578
+ "data-slot": "context-check-row",
2579
+ "data-testid": testId,
2580
+ children: [
2581
+ /* @__PURE__ */ jsxRuntime.jsx(
2582
+ "button",
2583
+ {
2584
+ type: "button",
2585
+ "aria-label": toggle.label,
2586
+ "aria-pressed": isSelected,
2587
+ onClick: toggle.onToggle,
2588
+ "data-testid": toggle.testId,
2589
+ className: "flex shrink-0 items-center justify-center rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11",
2590
+ children: /* @__PURE__ */ jsxRuntime.jsx(CheckGlyph, { isChecked: isSelected })
2591
+ }
2592
+ ),
2593
+ status,
2594
+ children
2595
+ ]
2596
+ }
2597
+ );
2598
+ }
2599
+ function ContextSelectList({ children }) {
2600
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-[150px] space-y-2 overflow-y-auto", children });
2601
+ }
2602
+ function ContextSelectRow({
2603
+ isSelected,
2604
+ onSelect,
2605
+ status,
2606
+ title,
2607
+ testId
2608
+ }) {
2609
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2610
+ "button",
2611
+ {
2612
+ type: "button",
2613
+ onClick: (e) => {
2614
+ e.stopPropagation();
2615
+ onSelect(e);
2616
+ },
2617
+ "aria-pressed": isSelected,
2618
+ "data-testid": testId,
2619
+ className: ui.cn(
2620
+ "flex w-full items-center gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11",
2621
+ isSelected ? "border border-primary/30 bg-primary/10" : "bg-card hover:bg-muted"
2622
+ ),
2623
+ children: [
2624
+ status,
2625
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate text-foreground", title, children: title }),
2626
+ isSelected && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckCircle, { className: "size-3.5 shrink-0 text-primary" })
2627
+ ]
2628
+ }
2629
+ );
2630
+ }
2631
+ function ContextPanelFooter({ labels, search, title, actions }) {
2632
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 space-y-2 border-t border-border pt-3", "data-slot": "context-panel-footer", children: [
2633
+ labels,
2634
+ search,
2635
+ /* @__PURE__ */ jsxRuntime.jsxs(
2636
+ "div",
2637
+ {
2638
+ className: ui.cn(
2639
+ "flex flex-wrap items-center gap-x-2 gap-y-1.5",
2640
+ title ? "justify-between" : "justify-end"
2641
+ ),
2642
+ children: [
2643
+ title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 items-center gap-2 text-sm font-medium text-foreground", children: title }),
2644
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-1.5", children: actions })
2645
+ ]
2646
+ }
2647
+ )
2648
+ ] });
2649
+ }
2650
+ var ContextSearchInput = react.forwardRef(function ContextSearchInput2({ className, onClick, ...props }, ref) {
2651
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", onClick: (e) => e.stopPropagation(), children: [
2652
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
2653
+ /* @__PURE__ */ jsxRuntime.jsx(
2654
+ ui.Input,
2655
+ {
2656
+ ref,
2657
+ className: ui.cn("h-7 bg-background pl-7 text-sm", className),
2658
+ onClick,
2659
+ ...props
2660
+ }
2661
+ )
2662
+ ] });
2663
+ });
2664
+ var ContextActionButton = react.forwardRef(
2665
+ function ContextActionButton2({ icon, count, isIconTrailing, onClick, children, className, variant = "outline", ...props }, ref) {
2666
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2667
+ ui.Button,
2668
+ {
2669
+ ref,
2670
+ variant,
2671
+ size: "sm",
2672
+ className: ui.cn("flex h-6 items-center gap-1 px-2 text-sm pointer-coarse:h-11", className),
2673
+ onClick: (e) => {
2674
+ e.stopPropagation();
2675
+ onClick?.(e);
2676
+ },
2677
+ ...props,
2678
+ children: [
2679
+ !isIconTrailing && icon,
2680
+ children,
2681
+ isIconTrailing && icon,
2682
+ count != null && count > 0 && /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { variant: "outline", className: "badge-count ml-1", children: count })
2683
+ ]
2684
+ }
2685
+ );
2686
+ }
2687
+ );
2688
+ function ContextPanelTabs({
2689
+ tabs,
2690
+ value,
2691
+ onValueChange,
2692
+ testId,
2693
+ listClassName
2694
+ }) {
2695
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tabs, { value, onValueChange, "data-testid": testId, children: [
2696
+ /* @__PURE__ */ jsxRuntime.jsx(
2697
+ ui.TabsList,
2698
+ {
2699
+ className: ui.cn("grid h-auto w-full grid-cols-2 pointer-coarse:h-auto", listClassName),
2700
+ children: tabs.map((t) => /* @__PURE__ */ jsxRuntime.jsxs(ui.TabsTrigger, { value: t.value, "data-testid": t.testId, className: "gap-1.5", children: [
2701
+ t.label,
2702
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { variant: "outline", className: "badge-count", children: t.count })
2703
+ ] }, t.value))
2704
+ }
2705
+ ),
2706
+ tabs.map((t) => /* @__PURE__ */ jsxRuntime.jsx(ui.TabsContent, { value: t.value, className: "mt-3", children: t.content }, t.value))
2707
+ ] });
2708
+ }
2709
+ function canHover() {
2710
+ return typeof window !== "undefined" && !!window.matchMedia?.("(hover: hover)").matches;
2711
+ }
2712
+ function isFocusVisible(el) {
2713
+ try {
2714
+ return el.matches(":focus-visible");
2715
+ } catch {
2716
+ return true;
2717
+ }
2718
+ }
2719
+ var ContextChip = react.forwardRef(function ContextChip2({
2720
+ count,
2721
+ label,
2722
+ isOpen = false,
2723
+ children,
2724
+ className,
2725
+ onMouseEnter,
2726
+ onMouseLeave,
2727
+ onFocus,
2728
+ onBlur,
2729
+ ...props
2730
+ }, ref) {
2731
+ const [isHovered, setIsHovered] = react.useState(false);
2732
+ const [isFocused, setIsFocused] = react.useState(false);
2733
+ const isEditing = isHovered || isFocused || isOpen;
2734
+ const Icon = isEditing ? lucideReact.Pencil : lucideReact.FileText;
2735
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2736
+ ui.Button,
2737
+ {
2738
+ ref,
2739
+ type: "button",
2740
+ variant: "outline",
2741
+ "aria-label": label,
2742
+ "aria-haspopup": "dialog",
2743
+ "aria-expanded": isOpen,
2744
+ "data-slot": "context-chip",
2745
+ "data-icon": isEditing ? "edit" : "document",
2746
+ className: ui.cn(
2747
+ "flex h-8 min-w-0 max-w-[280px] flex-shrink-0 items-center gap-1.5 rounded-md px-2.5",
2748
+ className
2749
+ ),
2750
+ ...props,
2751
+ onMouseEnter: (e) => {
2752
+ onMouseEnter?.(e);
2753
+ if (canHover()) setIsHovered(true);
2754
+ },
2755
+ onMouseLeave: (e) => {
2756
+ onMouseLeave?.(e);
2757
+ setIsHovered(false);
2758
+ },
2759
+ onFocus: (e) => {
2760
+ onFocus?.(e);
2761
+ setIsFocused(isFocusVisible(e.currentTarget));
2762
+ },
2763
+ onBlur: (e) => {
2764
+ onBlur?.(e);
2765
+ setIsFocused(false);
2766
+ },
2767
+ children: [
2768
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-3.5 w-3.5 flex-shrink-0", "aria-hidden": "true" }),
2769
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 text-sm font-medium", "data-testid": "context-chip-count", children: count >= 1e3 ? "999+" : count }),
2770
+ children
2771
+ ]
2772
+ }
2773
+ );
2774
+ });
2775
+ function useDismissibleCard({
2776
+ isOpen,
2777
+ onClose,
2778
+ contentRef,
2779
+ focusRef
2780
+ }) {
2781
+ react.useEffect(() => {
2782
+ if (!isOpen) return;
2783
+ const id = requestAnimationFrame(() => focusRef?.current?.focus());
2784
+ return () => cancelAnimationFrame(id);
2785
+ }, [isOpen, focusRef]);
2786
+ react.useEffect(() => {
2787
+ if (!isOpen) return;
2788
+ const onKeyDown = (e) => {
2789
+ if (e.key !== "Escape") return;
2790
+ e.stopPropagation();
2791
+ onClose();
2792
+ };
2793
+ document.addEventListener("keydown", onKeyDown);
2794
+ return () => document.removeEventListener("keydown", onKeyDown);
2795
+ }, [isOpen, onClose]);
2796
+ react.useEffect(() => {
2797
+ if (!isOpen) return;
2798
+ const onPointerDown = (e) => {
2799
+ const target = e.target;
2800
+ if (!target) return;
2801
+ if (contentRef.current?.contains(target)) return;
2802
+ if (target.closest("[data-radix-popper-content-wrapper]")) return;
2803
+ onClose();
2804
+ };
2805
+ document.addEventListener("mousedown", onPointerDown);
2806
+ return () => document.removeEventListener("mousedown", onPointerDown);
2807
+ }, [isOpen, onClose, contentRef]);
2808
+ }
2809
+ var DEFAULT_LABEL_PIN_ROW_LABELS = {
2810
+ remove: (count, name) => `Remove the ${count} \u201C${name}\u201D item(s) from this chat`,
2811
+ add: (count, name) => `Add the ${count} \u201C${name}\u201D item(s) to this chat`
2812
+ };
2813
+ function LabelPinRow({
2814
+ labels,
2815
+ selectedIds,
2816
+ onAdd,
2817
+ onRemove,
2818
+ testId = "label-pin-row",
2819
+ copy
2820
+ }) {
2821
+ const l = { ...DEFAULT_LABEL_PIN_ROW_LABELS, ...copy };
2822
+ const usable = labels.filter((label) => label.itemIds.length > 0);
2823
+ if (usable.length === 0) return null;
2824
+ const selectedSet = new Set(selectedIds);
2825
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2826
+ "div",
2827
+ {
2828
+ className: "flex flex-wrap items-center gap-1",
2829
+ "data-slot": "label-pin-row",
2830
+ "data-testid": testId,
2831
+ children: [
2832
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Tag, { className: "size-3.5 shrink-0 text-muted-foreground", "aria-hidden": true }),
2833
+ usable.map((label) => {
2834
+ const allIn = label.itemIds.every((id) => selectedSet.has(id));
2835
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2836
+ "button",
2837
+ {
2838
+ type: "button",
2839
+ "aria-pressed": allIn,
2840
+ title: allIn ? l.remove(label.itemIds.length, label.name) : l.add(label.itemIds.length, label.name),
2841
+ onClick: () => allIn ? onRemove(label.itemIds) : onAdd(label.itemIds.filter((id) => !selectedSet.has(id))),
2842
+ className: ui.cn(
2843
+ "flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11",
2844
+ allIn ? "text-white" : "bg-muted text-foreground hover:brightness-95"
2845
+ ),
2846
+ style: allIn ? { backgroundColor: label.color, borderColor: label.color } : { borderColor: `${label.color}66` },
2847
+ "data-testid": `${testId}-${label.id}`,
2848
+ children: [
2849
+ !allIn && /* @__PURE__ */ jsxRuntime.jsx(
2850
+ "span",
2851
+ {
2852
+ className: "size-1.5 shrink-0 rounded-full",
2853
+ style: { backgroundColor: label.color },
2854
+ "aria-hidden": true
2855
+ }
2856
+ ),
2857
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[120px] truncate", children: label.name }),
2858
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums opacity-70", children: label.itemIds.length })
2859
+ ]
2860
+ },
2861
+ label.id
2862
+ );
2863
+ })
2864
+ ]
2865
+ }
2866
+ );
2867
+ }
2868
+
2869
+ exports.BranchControls = BranchControls;
2870
+ exports.Composer = Composer;
2871
+ exports.ComposerAccessories = ComposerAccessories;
2872
+ exports.ComposerBranchingNotice = ComposerBranchingNotice;
2873
+ exports.ComposerContainer = ComposerContainer;
2874
+ exports.ComposerDock = ComposerDock;
2875
+ exports.ComposerFrame = ComposerFrame;
2876
+ exports.ComposerInput = ComposerInput;
2877
+ exports.ComposerRoot = ComposerRoot;
2878
+ exports.ComposerSend = ComposerSend;
2879
+ exports.ComposerToolbar = ComposerToolbar;
2880
+ exports.ComposerTools = ComposerTools;
2881
+ exports.ComposerVoiceButton = ComposerVoiceButton;
2882
+ exports.ContextActionButton = ContextActionButton;
2883
+ exports.ContextCheckRow = ContextCheckRow;
2884
+ exports.ContextChip = ContextChip;
2885
+ exports.ContextPanelContent = ContextPanelContent;
2886
+ exports.ContextPanelFooter = ContextPanelFooter;
2887
+ exports.ContextPanelTabs = ContextPanelTabs;
2888
+ exports.ContextPickerList = ContextPickerList;
2889
+ exports.ContextPickerRow = ContextPickerRow;
2890
+ exports.ContextSearchInput = ContextSearchInput;
2891
+ exports.ContextSelectList = ContextSelectList;
2892
+ exports.ContextSelectRow = ContextSelectRow;
2893
+ exports.Conversation = Conversation;
2894
+ exports.ConversationBody = ConversationBody;
2895
+ exports.ConversationEmpty = ConversationEmpty;
2896
+ exports.ConversationHeader = ConversationHeader;
2897
+ exports.ConversationHeaderActions = ConversationHeaderActions;
2898
+ exports.ConversationHistoryPane = ConversationHistoryPane;
2899
+ exports.ConversationLoading = ConversationLoading;
2900
+ exports.ConversationMain = ConversationMain;
2901
+ exports.ConversationRoot = ConversationRoot;
2902
+ exports.ConversationSearchView = ConversationSearchView;
2903
+ exports.ConversationSettingsButton = ConversationSettingsButton;
2904
+ exports.DEFAULT_BRANCH_CONTROLS_LABELS = DEFAULT_BRANCH_CONTROLS_LABELS;
2905
+ exports.DEFAULT_COMPOSER_LABELS = DEFAULT_COMPOSER_LABELS;
2906
+ exports.DEFAULT_CONVERSATION_EMPTY_LABELS = DEFAULT_CONVERSATION_EMPTY_LABELS;
2907
+ exports.DEFAULT_CONVERSATION_LAYOUT_LABELS = DEFAULT_CONVERSATION_LAYOUT_LABELS;
2908
+ exports.DEFAULT_CONVERSATION_PARTS_LABELS = DEFAULT_CONVERSATION_PARTS_LABELS;
2909
+ exports.DEFAULT_CONVERSATION_SEARCH_LABELS = DEFAULT_CONVERSATION_SEARCH_LABELS;
2910
+ exports.DEFAULT_LABEL_PIN_ROW_LABELS = DEFAULT_LABEL_PIN_ROW_LABELS;
2911
+ exports.DEFAULT_MESSAGE_ALERT_LABELS = DEFAULT_MESSAGE_ALERT_LABELS;
2912
+ exports.DEFAULT_MESSAGE_LABELS = DEFAULT_MESSAGE_LABELS;
2913
+ exports.DEFAULT_MESSAGE_LIST_LABELS = DEFAULT_MESSAGE_LIST_LABELS;
2914
+ exports.DEFAULT_MODEL_PRICING_TIP_LABELS = DEFAULT_MODEL_PRICING_TIP_LABELS;
2915
+ exports.DEFAULT_PENDING_ANSWER_BAR_LABELS = DEFAULT_PENDING_ANSWER_BAR_LABELS;
2916
+ exports.DEFAULT_PINNED_DOC_CHIP_LABELS = DEFAULT_PINNED_DOC_CHIP_LABELS;
2917
+ exports.DEFAULT_SLASH_MENU_LABELS = DEFAULT_SLASH_MENU_LABELS;
2918
+ exports.DEFAULT_THREAD_MAP_LABELS = DEFAULT_THREAD_MAP_LABELS;
2919
+ exports.LabelPinRow = LabelPinRow;
2920
+ exports.Message = Message;
2921
+ exports.MessageActionButton = MessageActionButton;
2922
+ exports.MessageActionMenu = MessageActionMenu;
2923
+ exports.MessageAlert = MessageAlert;
2924
+ exports.MessageBody = MessageBody;
2925
+ exports.MessageBubble = MessageBubble;
2926
+ exports.MessageByline = MessageByline;
2927
+ exports.MessageContent = MessageContent;
2928
+ exports.MessageFooter = MessageFooter;
2929
+ exports.MessageList = MessageList;
2930
+ exports.MessageListBanner = MessageListBanner;
2931
+ exports.MessageListEmpty = MessageListEmpty;
2932
+ exports.MessageListRoot = MessageListRoot;
2933
+ exports.MessageListRow = MessageListRow;
2934
+ exports.MessageListRows = MessageListRows;
2935
+ exports.MessageListStatus = MessageListStatus;
2936
+ exports.MessageListTail = MessageListTail;
2937
+ exports.MessageNarration = MessageNarration;
2938
+ exports.MessageRoot = MessageRoot;
2939
+ exports.MessageSources = MessageSources;
2940
+ exports.MessageSubagentBadge = MessageSubagentBadge;
2941
+ exports.ModelAutoIcon = ModelAutoIcon;
2942
+ exports.ModelConfigureButton = ModelConfigureButton;
2943
+ exports.ModelDot = ModelDot;
2944
+ exports.ModelMenuDivider = ModelMenuDivider;
2945
+ exports.ModelMenuMessage = ModelMenuMessage;
2946
+ exports.ModelOption = ModelOption;
2947
+ exports.ModelOptionLabel = ModelOptionLabel;
2948
+ exports.ModelPickerPopover = ModelPickerPopover;
2949
+ exports.ModelPickerTrigger = ModelPickerTrigger;
2950
+ exports.ModelPricingTip = ModelPricingTip;
2951
+ exports.ModelTierIcon = ModelTierIcon;
2952
+ exports.ModelTierOption = ModelTierOption;
2953
+ exports.ModelTriggerContent = ModelTriggerContent;
2954
+ exports.NewChatButton = NewChatButton;
2955
+ exports.NewPaChatButton = NewPaChatButton;
2956
+ exports.PaModeBadge = PaModeBadge;
2957
+ exports.PendingAnswerBar = PendingAnswerBar;
2958
+ exports.PinnedDocChip = PinnedDocChip;
2959
+ exports.ScrollToBottom = ScrollToBottom;
2960
+ exports.SlashMenu = SlashMenu;
2961
+ exports.SourceChip = SourceChip;
2962
+ exports.ThreadMap = ThreadMap;
2963
+ exports.ThreadMapDiagram = ThreadMapDiagram;
2964
+ exports.ThreadMapError = ThreadMapError;
2965
+ exports.ThreadMapLoading = ThreadMapLoading;
2966
+ exports.isLongPastedText = isLongPastedText;
2967
+ exports.toSpeakableText = toSpeakableText;
2968
+ exports.useDismissibleCard = useDismissibleCard;
2969
+ exports.useListKeyNav = useListKeyNav;
2970
+ exports.useLongPaste = useLongPaste;
2971
+ exports.useStreamAnnouncement = useStreamAnnouncement;
2972
+ //# sourceMappingURL=chunk-GDFWJ73C.cjs.map
2973
+ //# sourceMappingURL=chunk-GDFWJ73C.cjs.map