@arbidocs/blocks 0.3.185 → 0.4.1

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