@arbidocs/blocks 0.5.29 → 0.5.30

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 (202) hide show
  1. package/dist/{ConnectedCallDock-FDGMFTS5.js → ConnectedCallDock-AWSOPETT.js} +12 -12
  2. package/dist/{ConnectedCallDock-FDGMFTS5.js.map → ConnectedCallDock-AWSOPETT.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-ZIX2ZJCD.cjs → ConnectedCallDock-GM4KOBBS.cjs} +13 -13
  4. package/dist/{ConnectedCallDock-ZIX2ZJCD.cjs.map → ConnectedCallDock-GM4KOBBS.cjs.map} +1 -1
  5. package/dist/{ConnectedCallRoom-VJIHEJ4X.js → ConnectedCallRoom-JMB74KTV.js} +12 -12
  6. package/dist/{ConnectedCallRoom-VJIHEJ4X.js.map → ConnectedCallRoom-JMB74KTV.js.map} +1 -1
  7. package/dist/{ConnectedCallRoom-WZQVXDDW.cjs → ConnectedCallRoom-QE2MMJ6M.cjs} +13 -13
  8. package/dist/{ConnectedCallRoom-WZQVXDDW.cjs.map → ConnectedCallRoom-QE2MMJ6M.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-KSLSDAAP.cjs → ConnectedNativeDocxComparison-P7IHRMCS.cjs} +17 -17
  10. package/dist/{ConnectedNativeDocxComparison-KSLSDAAP.cjs.map → ConnectedNativeDocxComparison-P7IHRMCS.cjs.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-7ZC7BRY4.js → ConnectedNativeDocxComparison-T6JRDIMR.js} +16 -16
  12. package/dist/{ConnectedNativeDocxComparison-7ZC7BRY4.js.map → ConnectedNativeDocxComparison-T6JRDIMR.js.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-5E64Q7FX.cjs → ConnectedNativeDocxEditor-HBV5EJ63.cjs} +17 -17
  14. package/dist/{ConnectedNativeDocxEditor-5E64Q7FX.cjs.map → ConnectedNativeDocxEditor-HBV5EJ63.cjs.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-B5KDDPRY.js → ConnectedNativeDocxEditor-X6YNPGRL.js} +15 -15
  16. package/dist/{ConnectedNativeDocxEditor-B5KDDPRY.js.map → ConnectedNativeDocxEditor-X6YNPGRL.js.map} +1 -1
  17. package/dist/{ConnectedStreamedWordArtifact-RLU5VYGO.cjs → ConnectedStreamedWordArtifact-GYJEQO4M.cjs} +17 -17
  18. package/dist/ConnectedStreamedWordArtifact-GYJEQO4M.cjs.map +1 -0
  19. package/dist/{ConnectedStreamedWordArtifact-YCQSIGXL.js → ConnectedStreamedWordArtifact-X7R6PBRT.js} +16 -16
  20. package/dist/ConnectedStreamedWordArtifact-X7R6PBRT.js.map +1 -0
  21. package/dist/{WorkspaceTableView-BUWRSR42.cjs → WorkspaceTableView-FTQZJDRB.cjs} +10 -10
  22. package/dist/{WorkspaceTableView-BUWRSR42.cjs.map → WorkspaceTableView-FTQZJDRB.cjs.map} +1 -1
  23. package/dist/{WorkspaceTableView-62PJLX7V.js → WorkspaceTableView-NWRVACJL.js} +8 -8
  24. package/dist/{WorkspaceTableView-62PJLX7V.js.map → WorkspaceTableView-NWRVACJL.js.map} +1 -1
  25. package/dist/agents/index.cjs +373 -373
  26. package/dist/agents/index.js +11 -11
  27. package/dist/calls/index.cjs +39 -39
  28. package/dist/calls/index.js +7 -7
  29. package/dist/chat/index.cjs +167 -167
  30. package/dist/chat/index.js +9 -9
  31. package/dist/{chunk-CPJ2B3QQ.cjs → chunk-24Y36OK6.cjs} +9 -9
  32. package/dist/{chunk-CPJ2B3QQ.cjs.map → chunk-24Y36OK6.cjs.map} +1 -1
  33. package/dist/{chunk-XDFH6ONO.cjs → chunk-2DO5YPDH.cjs} +16 -16
  34. package/dist/{chunk-XDFH6ONO.cjs.map → chunk-2DO5YPDH.cjs.map} +1 -1
  35. package/dist/{chunk-GJI5PEGR.js → chunk-2JARBDEK.js} +4 -4
  36. package/dist/{chunk-GJI5PEGR.js.map → chunk-2JARBDEK.js.map} +1 -1
  37. package/dist/{chunk-HT62K3UO.cjs → chunk-3YVWAYXU.cjs} +4 -4
  38. package/dist/{chunk-HT62K3UO.cjs.map → chunk-3YVWAYXU.cjs.map} +1 -1
  39. package/dist/{chunk-EJSVRT3G.js → chunk-5VSMJ674.js} +56 -66
  40. package/dist/chunk-5VSMJ674.js.map +1 -0
  41. package/dist/{chunk-XGUN44A4.js → chunk-5XG7YD4V.js} +8 -8
  42. package/dist/{chunk-XGUN44A4.js.map → chunk-5XG7YD4V.js.map} +1 -1
  43. package/dist/{chunk-EVV32AXB.cjs → chunk-62G4HK7C.cjs} +6 -6
  44. package/dist/{chunk-EVV32AXB.cjs.map → chunk-62G4HK7C.cjs.map} +1 -1
  45. package/dist/{chunk-7U2DNPMZ.cjs → chunk-63FOCF46.cjs} +12 -12
  46. package/dist/{chunk-7U2DNPMZ.cjs.map → chunk-63FOCF46.cjs.map} +1 -1
  47. package/dist/{chunk-NIS5TLOM.cjs → chunk-6LVVW6VB.cjs} +4 -4
  48. package/dist/{chunk-NIS5TLOM.cjs.map → chunk-6LVVW6VB.cjs.map} +1 -1
  49. package/dist/{chunk-JS7KJRKG.js → chunk-75Z5AUMM.js} +3 -3
  50. package/dist/{chunk-JS7KJRKG.js.map → chunk-75Z5AUMM.js.map} +1 -1
  51. package/dist/{chunk-CRUCMRFC.cjs → chunk-76G2DAOF.cjs} +18 -18
  52. package/dist/{chunk-CRUCMRFC.cjs.map → chunk-76G2DAOF.cjs.map} +1 -1
  53. package/dist/{chunk-AHYSHKPL.cjs → chunk-7THRBD42.cjs} +57 -16
  54. package/dist/chunk-7THRBD42.cjs.map +1 -0
  55. package/dist/{chunk-SBHWRN2D.js → chunk-BBSXBABG.js} +3 -3
  56. package/dist/{chunk-SBHWRN2D.js.map → chunk-BBSXBABG.js.map} +1 -1
  57. package/dist/{chunk-WG2VDUEI.cjs → chunk-BVMPP574.cjs} +4 -4
  58. package/dist/{chunk-WG2VDUEI.cjs.map → chunk-BVMPP574.cjs.map} +1 -1
  59. package/dist/{chunk-3IRIITUW.cjs → chunk-BVXI7W7Z.cjs} +9 -9
  60. package/dist/{chunk-3IRIITUW.cjs.map → chunk-BVXI7W7Z.cjs.map} +1 -1
  61. package/dist/{chunk-EVYUYVH2.cjs → chunk-C5J74Y6N.cjs} +5 -5
  62. package/dist/{chunk-EVYUYVH2.cjs.map → chunk-C5J74Y6N.cjs.map} +1 -1
  63. package/dist/{chunk-WY626DNG.cjs → chunk-CGUDTSGI.cjs} +10 -10
  64. package/dist/{chunk-WY626DNG.cjs.map → chunk-CGUDTSGI.cjs.map} +1 -1
  65. package/dist/{chunk-WBCGVEJX.js → chunk-CMTAOVUX.js} +3 -3
  66. package/dist/{chunk-WBCGVEJX.js.map → chunk-CMTAOVUX.js.map} +1 -1
  67. package/dist/{chunk-OGADWN5L.js → chunk-DHTBHALC.js} +4 -4
  68. package/dist/{chunk-OGADWN5L.js.map → chunk-DHTBHALC.js.map} +1 -1
  69. package/dist/{chunk-UXIMEFEF.js → chunk-DWERY33L.js} +8 -8
  70. package/dist/{chunk-UXIMEFEF.js.map → chunk-DWERY33L.js.map} +1 -1
  71. package/dist/{chunk-A634VUNB.js → chunk-EPNJOP2M.js} +5 -5
  72. package/dist/{chunk-A634VUNB.js.map → chunk-EPNJOP2M.js.map} +1 -1
  73. package/dist/{chunk-4RMI6D64.cjs → chunk-EZLZ3MDU.cjs} +3 -3
  74. package/dist/{chunk-4RMI6D64.cjs.map → chunk-EZLZ3MDU.cjs.map} +1 -1
  75. package/dist/{chunk-3OKBEVP3.js → chunk-FAILAFD6.js} +3 -3
  76. package/dist/{chunk-3OKBEVP3.js.map → chunk-FAILAFD6.js.map} +1 -1
  77. package/dist/{chunk-OZSAQJO4.js → chunk-FODIZWMX.js} +3 -3
  78. package/dist/{chunk-OZSAQJO4.js.map → chunk-FODIZWMX.js.map} +1 -1
  79. package/dist/{chunk-V2GEULRG.cjs → chunk-GK35JEWW.cjs} +4 -4
  80. package/dist/{chunk-V2GEULRG.cjs.map → chunk-GK35JEWW.cjs.map} +1 -1
  81. package/dist/{chunk-52GITM4V.cjs → chunk-GNWQS6S4.cjs} +144 -154
  82. package/dist/{chunk-EJSVRT3G.js.map → chunk-GNWQS6S4.cjs.map} +1 -1
  83. package/dist/{chunk-R3HZBTE3.cjs → chunk-HMEP4EZ3.cjs} +4 -4
  84. package/dist/{chunk-R3HZBTE3.cjs.map → chunk-HMEP4EZ3.cjs.map} +1 -1
  85. package/dist/{chunk-5ETT7ZIO.js → chunk-IYKGI2DQ.js} +3 -3
  86. package/dist/{chunk-5ETT7ZIO.js.map → chunk-IYKGI2DQ.js.map} +1 -1
  87. package/dist/{chunk-3PQPA5K6.cjs → chunk-J4VP2PQJ.cjs} +28 -28
  88. package/dist/{chunk-3PQPA5K6.cjs.map → chunk-J4VP2PQJ.cjs.map} +1 -1
  89. package/dist/{chunk-TY76UEFK.js → chunk-JLJVEQFN.js} +6 -6
  90. package/dist/{chunk-TY76UEFK.js.map → chunk-JLJVEQFN.js.map} +1 -1
  91. package/dist/{chunk-G3MZ5S2Q.js → chunk-KYHDMUPW.js} +3 -3
  92. package/dist/{chunk-G3MZ5S2Q.js.map → chunk-KYHDMUPW.js.map} +1 -1
  93. package/dist/{chunk-DF2GSH4D.js → chunk-L2MMIC3S.js} +3 -3
  94. package/dist/{chunk-DF2GSH4D.js.map → chunk-L2MMIC3S.js.map} +1 -1
  95. package/dist/{chunk-46XON6PW.js → chunk-L4Q7FWBQ.js} +3 -3
  96. package/dist/{chunk-46XON6PW.js.map → chunk-L4Q7FWBQ.js.map} +1 -1
  97. package/dist/{chunk-OQCUIN6Z.cjs → chunk-M6N7XJH7.cjs} +5 -5
  98. package/dist/{chunk-OQCUIN6Z.cjs.map → chunk-M6N7XJH7.cjs.map} +1 -1
  99. package/dist/{chunk-MTHAQGJB.js → chunk-MNLMPH45.js} +3 -3
  100. package/dist/{chunk-MTHAQGJB.js.map → chunk-MNLMPH45.js.map} +1 -1
  101. package/dist/{chunk-W43S7COD.js → chunk-NBQNDHOW.js} +4 -4
  102. package/dist/{chunk-W43S7COD.js.map → chunk-NBQNDHOW.js.map} +1 -1
  103. package/dist/{chunk-7YGUUUL7.cjs → chunk-NF7CGYZF.cjs} +4 -4
  104. package/dist/{chunk-7YGUUUL7.cjs.map → chunk-NF7CGYZF.cjs.map} +1 -1
  105. package/dist/{chunk-DNGA25ZA.js → chunk-NI3O4UZL.js} +5 -5
  106. package/dist/{chunk-DNGA25ZA.js.map → chunk-NI3O4UZL.js.map} +1 -1
  107. package/dist/{chunk-T3JW5BYG.cjs → chunk-OSCWFBRD.cjs} +4 -4
  108. package/dist/{chunk-T3JW5BYG.cjs.map → chunk-OSCWFBRD.cjs.map} +1 -1
  109. package/dist/{chunk-TKOP6WMD.js → chunk-OYKITGTK.js} +4 -4
  110. package/dist/{chunk-TKOP6WMD.js.map → chunk-OYKITGTK.js.map} +1 -1
  111. package/dist/{chunk-2TB4UDBH.js → chunk-PKDGP6ZH.js} +3 -3
  112. package/dist/{chunk-2TB4UDBH.js.map → chunk-PKDGP6ZH.js.map} +1 -1
  113. package/dist/{chunk-AKW4JLHQ.cjs → chunk-PO2QI2OI.cjs} +4 -4
  114. package/dist/{chunk-AKW4JLHQ.cjs.map → chunk-PO2QI2OI.cjs.map} +1 -1
  115. package/dist/{chunk-4UREQY5X.js → chunk-Q56LAJRP.js} +4 -4
  116. package/dist/{chunk-4UREQY5X.js.map → chunk-Q56LAJRP.js.map} +1 -1
  117. package/dist/{chunk-SQAVWMGV.cjs → chunk-R6GIDWEH.cjs} +59 -59
  118. package/dist/{chunk-SQAVWMGV.cjs.map → chunk-R6GIDWEH.cjs.map} +1 -1
  119. package/dist/{chunk-KKBYWVEL.js → chunk-SLGRQMHW.js} +5 -5
  120. package/dist/{chunk-KKBYWVEL.js.map → chunk-SLGRQMHW.js.map} +1 -1
  121. package/dist/{chunk-LXB756TN.cjs → chunk-SN5VHPF4.cjs} +3 -3
  122. package/dist/{chunk-LXB756TN.cjs.map → chunk-SN5VHPF4.cjs.map} +1 -1
  123. package/dist/{chunk-CJWZYK5K.cjs → chunk-SVL2OM7T.cjs} +5 -5
  124. package/dist/{chunk-CJWZYK5K.cjs.map → chunk-SVL2OM7T.cjs.map} +1 -1
  125. package/dist/{chunk-SSRFSSIT.js → chunk-TGVBLXLV.js} +52 -17
  126. package/dist/chunk-TGVBLXLV.js.map +1 -0
  127. package/dist/{chunk-DV25UPJ7.js → chunk-THNTNAYI.js} +3 -3
  128. package/dist/{chunk-DV25UPJ7.js.map → chunk-THNTNAYI.js.map} +1 -1
  129. package/dist/{chunk-AYAWG2CM.js → chunk-TNWJPTDG.js} +3 -3
  130. package/dist/{chunk-AYAWG2CM.js.map → chunk-TNWJPTDG.js.map} +1 -1
  131. package/dist/{chunk-SN7X7C7H.cjs → chunk-UAMY7KHW.cjs} +5 -5
  132. package/dist/{chunk-SN7X7C7H.cjs.map → chunk-UAMY7KHW.cjs.map} +1 -1
  133. package/dist/{chunk-H72SWOUS.js → chunk-VTGRCJLP.js} +3 -3
  134. package/dist/{chunk-H72SWOUS.js.map → chunk-VTGRCJLP.js.map} +1 -1
  135. package/dist/{chunk-W5PKYJX5.cjs → chunk-W6DDSZUD.cjs} +14 -14
  136. package/dist/{chunk-W5PKYJX5.cjs.map → chunk-W6DDSZUD.cjs.map} +1 -1
  137. package/dist/{chunk-ZXXXLYZY.cjs → chunk-WG2IPVLA.cjs} +7 -7
  138. package/dist/{chunk-ZXXXLYZY.cjs.map → chunk-WG2IPVLA.cjs.map} +1 -1
  139. package/dist/{chunk-RWU3C4MK.js → chunk-WLWY43FR.js} +3 -3
  140. package/dist/{chunk-RWU3C4MK.js.map → chunk-WLWY43FR.js.map} +1 -1
  141. package/dist/{chunk-OZRGYS3J.js → chunk-X3LM4KRW.js} +3 -3
  142. package/dist/{chunk-OZRGYS3J.js.map → chunk-X3LM4KRW.js.map} +1 -1
  143. package/dist/{chunk-IZJ3BOJO.js → chunk-XMDIXNLW.js} +3 -3
  144. package/dist/{chunk-IZJ3BOJO.js.map → chunk-XMDIXNLW.js.map} +1 -1
  145. package/dist/{chunk-7FKVJUR4.js → chunk-Y6F6UF2W.js} +3 -3
  146. package/dist/{chunk-7FKVJUR4.js.map → chunk-Y6F6UF2W.js.map} +1 -1
  147. package/dist/{chunk-F72ZD5Q2.cjs → chunk-YD3RN2FY.cjs} +3 -3
  148. package/dist/{chunk-F72ZD5Q2.cjs.map → chunk-YD3RN2FY.cjs.map} +1 -1
  149. package/dist/{chunk-QHWDV2VB.cjs → chunk-YJJNDKA3.cjs} +6 -6
  150. package/dist/{chunk-QHWDV2VB.cjs.map → chunk-YJJNDKA3.cjs.map} +1 -1
  151. package/dist/{chunk-NZCAWWV4.cjs → chunk-YP643FYT.cjs} +4 -4
  152. package/dist/{chunk-NZCAWWV4.cjs.map → chunk-YP643FYT.cjs.map} +1 -1
  153. package/dist/{chunk-BBTHGWZO.cjs → chunk-ZUOU54X3.cjs} +5 -5
  154. package/dist/{chunk-BBTHGWZO.cjs.map → chunk-ZUOU54X3.cjs.map} +1 -1
  155. package/dist/citations/index.cjs +10 -10
  156. package/dist/citations/index.js +2 -2
  157. package/dist/collaboration/index.cjs +9 -9
  158. package/dist/collaboration/index.js +1 -1
  159. package/dist/connect/docx.cjs +19 -19
  160. package/dist/connect/docx.js +15 -15
  161. package/dist/connect/index.cjs +1885 -1856
  162. package/dist/connect/index.cjs.map +1 -1
  163. package/dist/connect/index.d.ts +1 -0
  164. package/dist/connect/index.js +686 -659
  165. package/dist/connect/index.js.map +1 -1
  166. package/dist/connect/viewer.cjs +83 -83
  167. package/dist/connect/viewer.js +18 -18
  168. package/dist/connection/ConnectedSettings.d.ts +1 -1
  169. package/dist/connection/dialogs/ConnectedGlobalDialogs.d.ts +26 -0
  170. package/dist/connection/dialogs/index.d.ts +1 -0
  171. package/dist/connection/files/upload/ConnectedUploadDropzone.d.ts +2 -1
  172. package/dist/connection/workspace-access/access-review.d.ts +6 -0
  173. package/dist/facts/index.cjs +60 -60
  174. package/dist/facts/index.js +7 -7
  175. package/dist/files/index.cjs +225 -225
  176. package/dist/files/index.js +5 -5
  177. package/dist/home/index.cjs +31 -31
  178. package/dist/home/index.js +6 -6
  179. package/dist/index.cjs +780 -756
  180. package/dist/index.d.ts +2 -1
  181. package/dist/index.js +27 -27
  182. package/dist/provider/dialog-registry.d.ts +85 -0
  183. package/dist/provider/environment.d.ts +11 -11
  184. package/dist/retrieval/index.cjs +4 -4
  185. package/dist/retrieval/index.js +2 -2
  186. package/dist/settings/index.cjs +156 -156
  187. package/dist/settings/index.js +3 -3
  188. package/dist/shell/index.cjs +42 -42
  189. package/dist/shell/index.js +4 -4
  190. package/dist/studio/index.cjs +18 -18
  191. package/dist/studio/index.js +10 -10
  192. package/dist/workflow-canvas/index.cjs +69 -69
  193. package/dist/workflow-canvas/index.js +14 -14
  194. package/dist/workspaces/index.cjs +29 -29
  195. package/dist/workspaces/index.js +4 -4
  196. package/node_modules/@arbidocs/coedit/package.json +1 -1
  197. package/package.json +5 -5
  198. package/dist/ConnectedStreamedWordArtifact-RLU5VYGO.cjs.map +0 -1
  199. package/dist/ConnectedStreamedWordArtifact-YCQSIGXL.js.map +0 -1
  200. package/dist/chunk-52GITM4V.cjs.map +0 -1
  201. package/dist/chunk-AHYSHKPL.cjs.map +0 -1
  202. package/dist/chunk-SSRFSSIT.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chat/participant-tints.ts","../src/chat/flashMessage.ts","../src/chat/DraftingDocChip.tsx","../src/chat/SlashMenu.tsx","../src/chat/ConversationLayout.tsx","../src/chat/BranchControls.tsx","../src/chat/ModelPicker.tsx","../src/chat/ConversationParts.tsx","../src/chat/ThreadMap.tsx","../src/chat/thread-diagram.ts","../src/chat/ThreadVisualizer.tsx","../src/lib/useLongPaste.ts","../src/chat/PendingAnswerBar.tsx","../src/chat/useOpenCitation.ts","../src/chat/useRecipientDraft.ts","../src/chat/message-copy.ts","../src/chat/table-csv.ts","../src/chat/ContextUsageBar.tsx","../src/chat/slash-menu-helpers.ts","../src/chat/generatedDocuments.ts"],"names":["text","jsxs","cn","jsx","PenLine","X","BookOpen","SquareSlash","memo","SlashMenu","useId","useRef","useEffect","testIdOr","prefixedTestId","listOptionId","Globe","Tooltip","TooltipTrigger","Network","TooltipContent","ArrowLeft","ArrowRight","Zap","Glasses","Crown","Sparkles","forwardRef","ModelPickerTrigger","Button","ChevronsUpDown","BlocksTooltipProvider","Popover","PopoverTrigger","PopoverContent","Check","Settings","Plus","Bot","Download","DOMPurify","useMemo","useState","useCallback","MessageCircleQuestion","Clock","Play","Pause","useBlocksEnvironment","hasMessageBody","buildDeepLinkUrl","markdownToPlainTextBlocks","plainText","downloadBlob","getContextUsedPercent","getContextRemainingPercent","filterSkills"],"mappings":"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","file":"chunk-SN7X7C7H.cjs","sourcesContent":["/** Conversation-local colors: callers supply participants in first-post order. */\nconst PARTICIPANT_COLORS = [\n 'blue',\n 'amber',\n 'teal',\n 'violet',\n 'rose',\n 'lime',\n 'sky',\n 'orange',\n 'emerald',\n 'fuchsia',\n 'indigo',\n 'cyan',\n] as const\n\nexport function getParticipantTints(participantIds: readonly string[]): Map<string, string> {\n const tints = new Map<string, string>()\n for (const id of participantIds) {\n if (!id || tints.has(id)) continue\n const color = PARTICIPANT_COLORS[tints.size % PARTICIPANT_COLORS.length]\n tints.set(id, `var(--color-${color}-600)`)\n }\n return tints\n}\n","/**\n * Mark the message a link took the reader to: a brief, gentle highlight on the message itself (on\n * the theme's accent and ring, `[data-deep-link-target]` in `blocks.css`) that fades out and\n * removes itself, so nothing is left tinted afterwards.\n */\nexport function flashMessage(el: Element): void {\n el.removeAttribute('data-deep-link-target')\n // Restart the animation when the same message is flashed again.\n void (el as HTMLElement).offsetWidth\n el.setAttribute('data-deep-link-target', '')\n const clear = () => el.removeAttribute('data-deep-link-target')\n el.addEventListener('animationend', clear, { once: true })\n // Reduced motion runs no animation: clear it after the same time.\n setTimeout(clear, 2000)\n}\n","import { PenLine, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the chip. Pass a partial `labels` to translate or reword. */\nexport interface DraftingDocChipLabels {\n /** `{title}` is the thread's document. */\n drafting: string\n /** What it means, on hover. */\n hint: string\n /** The attach offer in a thread not bound to the open document; `{title}` is its name. */\n attach: string\n /** What attaching does, on hover. */\n attachHint: string\n /** Unbind the thread from its document. */\n detach: string\n /** A thread bound to a document this person cannot open (another member's private document). */\n unavailable: string\n /** What that means, on hover. */\n unavailableHint: string\n}\n\nexport const DEFAULT_DRAFTING_DOC_CHIP_LABELS: DraftingDocChipLabels = {\n drafting: 'Drafting in {title}',\n hint: 'This thread works in the document: ARBI reads what it needs and makes its edits as tracked changes you accept or reject.',\n attach: 'Draft in {title}',\n attachHint:\n 'Attach the open document to this thread: its questions then edit the document as tracked changes. Until then, ARBI only answers.',\n detach: 'Stop drafting in this document',\n unavailable: 'Drafting in a document you cannot open',\n unavailableHint:\n 'This thread is bound to a document you do not have access to. Your questions here only get answers; unbind it to draft in another document.',\n}\n\nexport interface DraftingDocChipProps {\n /** The document's name. */\n title: string\n /**\n * `bound`: the thread drafts in the document (every turn names it). `attach`: the document is\n * open but the thread is not bound to it; clicking binds it (`onAttach`). `unavailable`: the\n * thread is bound to a document this person cannot open (`title` is not shown).\n */\n state?: 'bound' | 'attach' | 'unavailable'\n /** Bind the thread to the open document (the `attach` state). */\n onAttach?: () => void\n /** Unbind the thread (the `bound` state). Absent: not offered. */\n onDetach?: () => void\n className?: string\n labels?: Partial<DraftingDocChipLabels>\n testId?: string\n}\n\nconst CHIP =\n 'flex h-7 min-w-0 max-w-[16rem] items-center gap-1.5 rounded-md border bg-card px-2 text-xs text-muted-foreground'\n\n/**\n * Drafting mode, said in the composer. A thread drafts in a document only when it is bound to it\n * (started from it, attached in it, or made in it): then the chip says so, and the assistant reads\n * the document on demand and edits it granularly as tracked changes, never as a whole document\n * resent each turn (that is what a pin is for). A document merely open beside an unbound thread is\n * offered as an explicit attach: being open never makes a question an edit.\n */\nexport function DraftingDocChip({\n title,\n state = 'bound',\n onAttach,\n onDetach,\n className,\n labels,\n testId = 'drafting-doc-chip',\n}: DraftingDocChipProps) {\n const l = { ...DEFAULT_DRAFTING_DOC_CHIP_LABELS, ...labels }\n if (state === 'attach') {\n const text = l.attach.replace('{title}', title)\n return (\n <button\n type=\"button\"\n onClick={onAttach}\n className={cn(\n CHIP,\n 'border-dashed border-border hover:border-primary/60 hover:text-foreground',\n className\n )}\n title={`${text}. ${l.attachHint}`}\n data-testid={`${testId}-attach`}\n >\n <PenLine className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{text}</span>\n </button>\n )\n }\n const unavailable = state === 'unavailable'\n const text = unavailable ? l.unavailable : l.drafting.replace('{title}', title)\n return (\n <span\n className={cn(CHIP, 'border-border', onDetach && 'pr-0.5', className)}\n title={`${text}. ${unavailable ? l.unavailableHint : l.hint}`}\n data-testid={unavailable ? `${testId}-unavailable` : testId}\n >\n <PenLine\n className={cn('size-3.5 shrink-0', unavailable ? 'text-muted-foreground' : 'text-primary')}\n aria-hidden\n />\n <span className=\"truncate\">{text}</span>\n {onDetach && (\n <button\n type=\"button\"\n onClick={onDetach}\n className=\"flex size-5 shrink-0 items-center justify-center rounded hover:bg-muted hover:text-foreground\"\n aria-label={l.detach}\n title={l.detach}\n data-testid={`${testId}-detach`}\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n )}\n </span>\n )\n}\n","import { memo, useEffect, useId, useRef } from 'react'\nimport { BookOpen, Globe, SquareSlash } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { listOptionId } from '../lib/useListKeyNav'\nimport { prefixedTestId, testIdOr } from './test-id'\n\n/** Which list an entry came from: drives the menu's section grouping. */\nexport type SlashItemKind = 'command' | 'skill'\n\nexport interface SlashMenuItem {\n /** Slug used to invoke the entry (`/<slug>`). */\n name: string\n description?: string\n /** `command` = shipped built-in; `skill` = user-authored. */\n kind: SlashItemKind\n /** Args hint, e.g. `<prompt>`. */\n argHint?: string\n /** Marketplace visibility: drives the \"Global\" affordance. Skills only. */\n visibility?: 'mine' | 'global'\n}\n\n/** Every fixed string of the slash menu. Pass a partial `labels` to translate or reword. */\nexport interface SlashMenuLabels {\n hint: string\n commands: string\n skills: string\n global: string\n globalTitle: string\n /** Accessible name of the list. */\n list: string\n /** Polite count announced as the menu opens or the filter narrows it. */\n resultCount: (count: number) => string\n /** Footer action that opens the skills browser. */\n browse: string\n}\n\nexport const DEFAULT_SLASH_MENU_LABELS: SlashMenuLabels = {\n hint: 'Enter or Tab to insert, Esc to dismiss',\n commands: 'Commands',\n skills: 'Skills',\n global: 'Global',\n globalTitle: 'Shared skill from the marketplace',\n list: 'Commands and skills',\n resultCount: (count) => `${count} ${count === 1 ? 'command' : 'commands'} available`,\n browse: 'Browse skills',\n}\n\nexport interface SlashMenuProps {\n open: boolean\n /** The chat composer sits at the bottom (menu above); a top-of-page ask pill opens below. */\n placement?: 'above' | 'below'\n /** Highlighted row, 0-based over the flat list. */\n selectedIndex: number\n setSelectedIndex: (i: number) => void\n /**\n * Id of the listbox. Take it (and `comboboxProps`) from `useListKeyNav` so the text field's\n * `aria-controls` / `aria-activedescendant` point at this menu.\n */\n listboxId?: string\n /** Filtered list, already ordered commands-then-skills. */\n items: SlashMenuItem[]\n /** Adds a \"Browse skills\" footer that calls this (the host opens its skills browser). */\n onBrowse?: () => void\n onSelect: (item: SlashMenuItem) => void\n className?: string\n labels?: Partial<SlashMenuLabels>\n /** Test id of the menu (default `slash-menu`). */\n testId?: string\n /** Row prefixes (`<prefix>-<kind|name>`); defaults `slash-section` / `slash-item`. */\n testIds?: Partial<Record<'section' | 'item' | 'browse', string>>\n}\n\nfunction SectionIcon({ kind }: { kind: SlashItemKind }) {\n return kind === 'skill' ? (\n <BookOpen className=\"h-3 w-3\" aria-hidden=\"true\" />\n ) : (\n <SquareSlash className=\"h-3 w-3\" aria-hidden=\"true\" />\n )\n}\n\n/**\n * Slash-command autocomplete that floats over a text field. Presentational: the host owns the\n * filter, the highlighted index (see `useListKeyNav`) and what selecting an item does.\n */\nexport const SlashMenu = memo(function SlashMenu({\n open,\n placement = 'above',\n selectedIndex,\n setSelectedIndex,\n listboxId: listboxIdProp,\n items,\n onBrowse,\n onSelect,\n className,\n labels,\n testId,\n testIds,\n}: SlashMenuProps) {\n const l = { ...DEFAULT_SLASH_MENU_LABELS, ...labels }\n const ownId = useId()\n const listboxId = listboxIdProp ?? ownId\n // Keep the keyboard-highlighted row visible. Rows are split across per-section lists, so the\n // flat `data-slash-index` is the stable handle.\n const scrollRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!open) return\n const el = scrollRef.current?.querySelector<HTMLElement>(\n `[data-slash-index=\"${selectedIndex}\"]`\n )\n // jsdom has no scrollIntoView.\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [open, selectedIndex])\n\n if (!open || items.length === 0) return null\n\n let offset = 0\n const SECTIONS: ReadonlyArray<{ kind: SlashItemKind; label: string }> = [\n { kind: 'command', label: l.commands },\n { kind: 'skill', label: l.skills },\n ]\n const sections = SECTIONS.map(({ kind, label }) => {\n const rows = items.filter((i) => i.kind === kind)\n const section = { kind, label, rows, offset }\n offset += rows.length\n return section\n }).filter((s) => s.rows.length > 0)\n\n return (\n <div\n data-slot=\"slash-menu\"\n className={cn(\n 'absolute left-0 right-0 z-30 max-h-64 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-lg',\n placement === 'above' ? 'bottom-full mb-2' : 'top-full mt-2',\n className\n )}\n // mousedown would blur the textarea (closing the menu before the click lands).\n onMouseDown={(e) => e.preventDefault()}\n data-testid={testIdOr(testId, { testId: 'slash-menu' })}\n >\n <div className=\"border-b border-border/50 px-3 py-1.5 text-xs text-muted-foreground\">\n {l.hint}\n </div>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {l.resultCount(items.length)}\n </div>\n <div\n ref={scrollRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={l.list}\n className=\"scrollbar-subtle max-h-56 overflow-y-auto py-1\"\n >\n {sections.map((section) => (\n <div\n key={section.kind}\n role=\"group\"\n aria-labelledby={`${listboxId}-section-${section.kind}`}\n >\n <div\n id={`${listboxId}-section-${section.kind}`}\n className=\"flex items-center gap-1.5 px-3 pb-1 pt-1.5 text-xs font-medium text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.section, section.kind, {\n testId: `slash-section-${section.kind}`,\n })}\n >\n <SectionIcon kind={section.kind} />\n <span>{section.label}</span>\n </div>\n {section.rows.map((item, idx) => {\n const flatIndex = section.offset + idx\n const isActive = flatIndex === selectedIndex\n return (\n <div\n key={item.name}\n id={listOptionId(listboxId, flatIndex)}\n role=\"option\"\n aria-selected={isActive}\n data-slash-index={flatIndex}\n className={cn(\n 'flex cursor-pointer items-baseline gap-2 px-3 py-1.5 text-sm pointer-coarse:min-h-11 pointer-coarse:items-center',\n isActive ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/50'\n )}\n onMouseEnter={() => setSelectedIndex(flatIndex)}\n onClick={() => onSelect(item)}\n data-testid={prefixedTestId(testIds?.item, item.name, {\n testId: `slash-item-${item.name}`,\n })}\n >\n <span className=\"shrink-0 font-mono text-foreground\">/{item.name}</span>\n {item.argHint && (\n <span className=\"shrink-0 font-mono text-xs text-muted-foreground\">\n {item.argHint}\n </span>\n )}\n {item.description && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n {item.visibility === 'global' && (\n <span\n className=\"ml-auto inline-flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n title={l.globalTitle}\n >\n <Globe className=\"h-3 w-3\" />\n {l.global}\n </span>\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n {onBrowse && (\n <button\n type=\"button\"\n onClick={onBrowse}\n 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\"\n data-testid={testIdOr(testIds?.browse, { testId: 'slash-browse-skills' })}\n >\n <BookOpen className=\"h-3 w-3\" aria-hidden=\"true\" />\n {l.browse}\n </button>\n )}\n </div>\n )\n})\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the conversation layout. Pass a partial `labels` to reword. */\nexport interface ConversationLayoutLabels {\n loadingMessages: string\n}\n\nexport const DEFAULT_CONVERSATION_LAYOUT_LABELS: ConversationLayoutLabels = {\n loadingMessages: 'Loading messages...',\n}\n\n/**\n * Page frame of a conversation. The chat scroll surface belongs to the HOST (the outer\n * `[data-scroll-container]`), so this column must GROW with its content, not stay\n * viewport-capped: the sticky header and the sticky composer dock need a containing block that\n * spans the whole thread, otherwise `position: sticky` is clamped to one screen and both unpin.\n *\n * Do NOT put `overflow: clip/hidden`, `transform`, `filter`, `will-change` or `contain` on\n * {@link ConversationBody}: `overflow: clip` collapses the scrollHeight so the thread cannot\n * scroll, and a transform creates a containing block that breaks the dock's `bottom: 0`.\n */\nexport function ConversationRoot({\n className,\n children,\n testId = 'conversation',\n ...rest\n}: HTMLAttributes<HTMLDivElement> & { testId?: string }) {\n return (\n <div\n data-slot=\"conversation\"\n className={cn('flex min-h-full shrink-0 flex-col', className)}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** Sticky strip at the top (tabs and their actions). */\nexport function ConversationHeader({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"conversation-header\"\n className={cn('sticky top-0 z-10 bg-background', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** Grows (never shrinks) to the thread's full height so the sticky dock spans the scroll range. */\nexport function ConversationBody({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"conversation-body\"\n className={cn('flex flex-[1_0_auto] flex-col', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** The thread (or its empty / loading state). `relative` so absolutely-filled states fit. */\nexport function ConversationMain({ className, children, ...rest }: HTMLAttributes<HTMLElement>) {\n return (\n <main\n data-slot=\"conversation-main\"\n className={cn('relative flex flex-[1_0_auto] flex-col', className)}\n {...rest}\n >\n {children}\n </main>\n )\n}\n\n/** Centered status while the thread loads. */\nexport function ConversationLoading({\n children,\n labels,\n className,\n testId = 'loading-messages',\n}: {\n /** Text; wins over `labels.loadingMessages`. */\n children?: ReactNode\n labels?: Partial<ConversationLayoutLabels>\n className?: string\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_LAYOUT_LABELS, ...labels }\n return (\n <div className={cn('flex h-64 items-center justify-center', className)} data-testid={testId}>\n <p className=\"text-muted-foreground\">{children ?? l.loadingMessages}</p>\n </div>\n )\n}\n\nexport const Conversation = {\n Root: ConversationRoot,\n Header: ConversationHeader,\n Body: ConversationBody,\n Main: ConversationMain,\n Loading: ConversationLoading,\n}\n","import { ArrowLeft, ArrowRight, Network } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n/** Every fixed string of the branch controls. Pass a partial `labels` to translate or reword. */\nexport interface BranchControlsLabels {\n /** \"Branch 2 of 3\" (1-based `current`). */\n branchOf: (current: number, total: number) => string\n previewHint: string\n previousBranch: string\n nextBranch: string\n}\n\nexport const DEFAULT_BRANCH_CONTROLS_LABELS: BranchControlsLabels = {\n branchOf: (current, total) => `Branch ${current} of ${total}`,\n previewHint: 'Click for side-by-side view',\n previousBranch: 'Previous branch',\n nextBranch: 'Next branch',\n}\n\nexport interface BranchControlsProps {\n /** 0-based index of the active branch. */\n index: number\n /** Number of branches at this fork; nothing renders when there is only one. */\n count: number\n onSwitch: (targetIndex: number) => void\n /** Makes the label a button that opens the side-by-side view. */\n onPreview?: () => void\n /** Tooltip of the preview button; wins over `labels.previewHint`. */\n previewHint?: string\n className?: string\n labels?: Partial<BranchControlsLabels>\n /** Per-part test ids; defaults are the current ids. */\n testIds?: Partial<{\n root: string\n preview: string\n icon: string\n indicator: string\n previous: string\n next: string\n }>\n}\n\nconst ARROW =\n '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'\n\n/** \"Branch 2 of 3\" with previous/next arrows at a fork in the conversation. */\nexport function BranchControls({\n index,\n count,\n onSwitch,\n onPreview,\n previewHint,\n className,\n labels,\n testIds,\n}: BranchControlsProps) {\n if (count <= 1) return null\n const l = { ...DEFAULT_BRANCH_CONTROLS_LABELS, ...labels }\n const label = l.branchOf(index + 1, count)\n const rootTestId = testIdOr(testIds?.root, { testId: 'branch-controls' })\n const previewTestId = testIdOr(testIds?.preview, { testId: 'threads-preview-button' })\n const iconTestId = testIdOr(testIds?.icon, { testId: 'branch-icon' })\n const indicatorTestId = testIdOr(testIds?.indicator, { testId: 'branch-indicator' })\n const previousTestId = testIdOr(testIds?.previous, { testId: 'previous-branch-button' })\n const nextTestId = testIdOr(testIds?.next, { testId: 'next-branch-button' })\n\n return (\n <div\n data-slot=\"branch-controls\"\n className={cn('branch-controls flex items-center gap-1', className)}\n data-testid={rootTestId}\n >\n {onPreview ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onPreview}\n 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\"\n data-testid={previewTestId}\n >\n <Network size={12} className=\"text-primary\" data-testid={iconTestId} />\n <span\n className=\"text-sm font-medium text-muted-foreground\"\n data-testid={indicatorTestId}\n >\n {label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{previewHint ?? l.previewHint}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n <span\n className=\"flex items-center gap-1 px-2 py-1 text-sm font-medium text-muted-foreground\"\n data-testid={indicatorTestId}\n >\n <Network size={12} className=\"text-primary\" data-testid={iconTestId} />\n {label}\n </span>\n )}\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => onSwitch(index - 1)}\n disabled={index <= 0}\n className={ARROW}\n title={l.previousBranch}\n aria-label={l.previousBranch}\n data-testid={previousTestId}\n >\n <ArrowLeft size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => onSwitch(index + 1)}\n disabled={index >= count - 1}\n className={ARROW}\n title={l.nextBranch}\n aria-label={l.nextBranch}\n data-testid={nextTestId}\n >\n <ArrowRight size={12} />\n </button>\n </div>\n </div>\n )\n}\n","import { forwardRef } from 'react'\nimport type { ComponentType, ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Crown, Glasses, Settings, Sparkles, Zap } from 'lucide-react'\nimport {\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\n\n// ── Icons ───────────────────────────────────────────────────────────────────────────────────\n\nexport type ModelTierKind = 'standard' | 'wise' | 'premium'\n\nconst TIER_ICON: Record<ModelTierKind, ComponentType<{ className?: string }>> = {\n standard: Zap,\n wise: Glasses,\n premium: Crown,\n}\n\nconst TIER_TONE: Record<ModelTierKind, string> = {\n standard: 'text-secondary fill-secondary',\n wise: 'text-secondary fill-secondary',\n premium: 'text-yellow-text fill-yellow-text',\n}\n\nexport interface ModelTierIconProps {\n tier: ModelTierKind\n /** Agentic mode off: the tier glyph is greyed. */\n isGreyed?: boolean\n className?: string\n}\n\n/** The glyph of a model tier (Fast/Standard bolt, Wise glasses, Premium crown). */\nexport function ModelTierIcon({ tier, isGreyed, className }: ModelTierIconProps) {\n const Icon = TIER_ICON[tier]\n return (\n <Icon\n className={cn(\n 'size-3.5 shrink-0',\n isGreyed ? 'fill-muted-foreground text-muted-foreground' : TIER_TONE[tier],\n className\n )}\n />\n )\n}\n\n/** The Autoselect sparkle. */\nexport function ModelAutoIcon({ className }: { className?: string }) {\n return <Sparkles className={cn('size-3.5 shrink-0 fill-secondary text-secondary', className)} />\n}\n\n/** Neutral status dot for models with no tier glyph. */\nexport function ModelDot({ isGreyed }: { isGreyed?: boolean }) {\n return (\n <div\n className={cn(\n 'size-2 shrink-0 rounded-full',\n isGreyed ? 'bg-muted-foreground' : 'bg-primary'\n )}\n />\n )\n}\n\n/** Label + icon content shared by menu rows and select items. */\nexport function ModelOptionLabel({ icon, label }: { icon: ReactNode; label: ReactNode }) {\n return (\n <div className=\"flex w-full items-center gap-2\">\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </div>\n )\n}\n\n// ── Trigger ─────────────────────────────────────────────────────────────────────────────────\n\nexport interface ModelTriggerContentProps {\n icon?: ReactNode\n label: ReactNode\n}\n\n/** Icon + truncated label (used inside the compact trigger and the select trigger). */\nexport function ModelTriggerContent({ icon, label }: ModelTriggerContentProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n {icon}\n <span className=\"truncate\">{label}</span>\n </div>\n )\n}\n\nexport interface ModelPickerTriggerProps extends ModelTriggerContentProps {\n /** Spoken before the current model, so the button reads \"Model: Autoselect\". Default \"Model\". */\n nameLabel?: string\n className?: string\n testId?: string\n}\n\n/** The compact picker button (ghost, with a chevron). Forwards its ref for popover/tooltip triggers. */\nexport const ModelPickerTrigger = forwardRef<HTMLButtonElement, ModelPickerTriggerProps>(\n function ModelPickerTrigger(\n { icon, label, nameLabel = 'Model', className, testId = 'model-selector-compact', ...rest },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n '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',\n className\n )}\n aria-label={typeof label === 'string' ? `${nameLabel}: ${label}` : undefined}\n data-slot=\"model-picker-trigger\"\n data-testid={testId}\n {...rest}\n >\n <ModelTriggerContent icon={icon} label={label} />\n <ChevronsUpDown className=\"size-3 shrink-0 text-muted-foreground\" />\n </Button>\n )\n }\n)\n\n// ── Popover + menu ──────────────────────────────────────────────────────────────────────────\n\nexport interface ModelPickerPopoverProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The trigger (a ModelPickerTrigger). */\n trigger: ReactNode\n /** Hover tooltip on the trigger (hidden while open). */\n tooltip?: ReactNode\n title?: string\n /** The menu rows. */\n children: ReactNode\n}\n\n/** Popover shell: trigger + tooltip + titled, scrolling list. */\nexport function ModelPickerPopover({\n open,\n onOpenChange,\n trigger,\n tooltip,\n title = 'Select AI Model',\n children,\n}: ModelPickerPopoverProps) {\n return (\n <BlocksTooltipProvider>\n <Popover open={open} onOpenChange={onOpenChange}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n </TooltipTrigger>\n {tooltip && !open && <TooltipContent side=\"top\">{tooltip}</TooltipContent>}\n </Tooltip>\n <PopoverContent side=\"top\" align=\"start\" className=\"w-[280px] p-1\" sideOffset={8}>\n <div className=\"px-2 py-1.5 text-sm font-medium text-muted-foreground\">{title}</div>\n <div className=\"flex max-h-[280px] flex-col gap-0.5 overflow-y-auto\">{children}</div>\n </PopoverContent>\n </Popover>\n </BlocksTooltipProvider>\n )\n}\n\nexport function ModelMenuDivider() {\n return <div className=\"my-0.5 border-t border-border\" role=\"separator\" />\n}\n\nexport function ModelMenuMessage({ children }: { children: ReactNode }) {\n return <div className=\"px-2 py-1.5 text-sm text-muted-foreground\">{children}</div>\n}\n\nexport interface ModelOptionProps {\n icon: ReactNode\n label: ReactNode\n isSelected: boolean\n onSelect: () => void\n testId: string\n /** Tier rows mark selection with a primary left edge and bold label. */\n emphasis?: 'plain' | 'tier'\n}\n\n/** One selectable model row. */\nexport function ModelOption({\n icon,\n label,\n isSelected,\n onSelect,\n testId,\n emphasis = 'plain',\n}: ModelOptionProps) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n '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',\n emphasis === 'tier' && 'border-l-4',\n emphasis === 'tier' && (isSelected ? 'border-l-primary' : 'border-l-transparent'),\n isSelected && 'bg-accent'\n )}\n aria-pressed={isSelected}\n data-slot=\"model-option\"\n data-testid={testId}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n emphasis === 'tier' &&\n (isSelected ? 'font-semibold text-foreground' : 'font-medium text-muted-foreground')\n )}\n >\n {label}\n </span>\n {isSelected && <Check className=\"size-3 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ModelTierOptionProps {\n icon: ReactNode\n label: ReactNode\n isSelected: boolean\n /** The tier is switched off in settings: shown dimmed and not selectable. */\n isDisabled?: boolean\n onSelect: () => void\n /** Trailing control (the configure cog). */\n action?: ReactNode\n testId: string\n}\n\n/** A tier row with a trailing action (Premium + configure cog). */\nexport function ModelTierOption({\n icon,\n label,\n isSelected,\n isDisabled,\n onSelect,\n action,\n testId,\n}: ModelTierOptionProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1 rounded-sm border-l-4 pr-1 transition-colors',\n isSelected ? 'border-l-primary bg-accent' : 'border-l-transparent'\n )}\n data-slot=\"model-tier-option\"\n >\n <button\n type=\"button\"\n onClick={() => {\n if (!isDisabled) onSelect()\n }}\n disabled={isDisabled}\n className={cn(\n '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',\n isDisabled ? 'cursor-not-allowed opacity-50' : 'hover:bg-accent'\n )}\n data-testid={testId}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n isSelected ? 'font-semibold text-foreground' : 'font-medium text-muted-foreground'\n )}\n >\n {label}\n </span>\n </button>\n {action}\n </div>\n )\n}\n\nexport interface ModelConfigureButtonProps {\n onClick: () => void\n /** Accessible name. */\n label: string\n /** Tooltip text. */\n tooltip: string\n testId?: string\n}\n\n/** Small bordered cog beside a tier row. */\nexport function ModelConfigureButton({\n onClick,\n label,\n tooltip,\n testId,\n}: ModelConfigureButtonProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n 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\"\n data-testid={testId}\n aria-label={label}\n >\n <Settings className=\"size-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{tooltip}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** Every fixed string of the pricing tip. Pass a partial `labels` to translate or reword. */\nexport interface ModelPricingTipLabels {\n input: (price: string) => string\n output: (price: string) => string\n}\n\nexport const DEFAULT_MODEL_PRICING_TIP_LABELS: ModelPricingTipLabels = {\n input: (price) => `Input: ${price} / M tokens`,\n output: (price) => `Output: ${price} / M tokens`,\n}\n\nexport interface ModelPricingTipProps {\n modelName: string\n /** £ per million tokens, formatted (\"£2.50\"). */\n inputPrice?: string | null\n outputPrice?: string | null\n labels?: Partial<ModelPricingTipLabels>\n}\n\n/** Tooltip body: model name and per-million-token £ prices. */\nexport function ModelPricingTip({\n modelName,\n inputPrice,\n outputPrice,\n labels,\n}: ModelPricingTipProps) {\n const l = { ...DEFAULT_MODEL_PRICING_TIP_LABELS, ...labels }\n return (\n <div className=\"space-y-1 text-sm\">\n <div className=\"font-medium\">{modelName}</div>\n {inputPrice && <div>{l.input(inputPrice)}</div>}\n {outputPrice && <div>{l.output(outputPrice)}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Bot, Plus, Settings } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n// ── Header actions ──────────────────────────────────────────────────────────────────────────\n\n/** Right side of the conversation tab strip. */\nexport function ConversationHeaderActions({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('flex items-center gap-2', className)}\n data-slot=\"conversation-header-actions\"\n >\n {children}\n </div>\n )\n}\n\n/** Every fixed string of the conversation parts. Pass a partial `labels` to a part to reword. */\nexport interface ConversationPartsLabels {\n /** \"New Chat\": `entityLabel` is the host's noun. */\n newEntity: (entityLabel: string) => string\n newPaChatTitle: string\n newPaChat: string\n paModeTitle: string\n pa: string\n}\n\nexport const DEFAULT_CONVERSATION_PARTS_LABELS: ConversationPartsLabels = {\n newEntity: (entityLabel) => `New ${entityLabel}`,\n newPaChatTitle: 'Start a new Personal Assistant chat',\n newPaChat: 'New PA Chat',\n paModeTitle: 'Personal Assistant mode',\n pa: 'PA',\n}\n\nexport interface NewChatButtonProps {\n /** Entity label, e.g. \"Chat\": names the button (\"New Chat\"). */\n entityLabel: string\n /** Narrow header: icon only. */\n isCompact: boolean\n onClick: () => void\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}\n\n/** \"+ New Chat\". */\nexport function NewChatButton({\n entityLabel,\n isCompact,\n onClick,\n labels,\n testId = 'new-conversation-button',\n}: NewChatButtonProps) {\n const text = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }.newEntity(entityLabel)\n return (\n <button\n type=\"button\"\n onClick={onClick}\n 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\"\n data-testid={testId}\n aria-label={text}\n title={text}\n >\n <Plus className=\"size-4 shrink-0\" />\n {!isCompact && <span>{text}</span>}\n </button>\n )\n}\n\n/** Starts a Personal Assistant conversation (experimental). */\nexport function NewPaChatButton({\n isCompact,\n onClick,\n labels,\n testId = 'new-pa-conversation-button',\n}: {\n isCompact: boolean\n onClick: () => void\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onClick}\n className={cn(\n 'pointer-coarse:min-h-11',\n isCompact ? 'flex items-center' : 'flex w-auto items-center gap-2 px-4'\n )}\n data-testid={testId}\n title={l.newPaChatTitle}\n >\n <Bot className=\"size-4\" />\n {!isCompact && <span>{l.newPaChat}</span>}\n </Button>\n )\n}\n\n// ── Composer slots ──────────────────────────────────────────────────────────────────────────\n\n/** Left of the composer toolbar: borderless, muted buttons (files, facts). */\nexport function ComposerAccessories({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <span\n className={cn(\n 'flex items-center gap-1 [&_button]:border-transparent [&_button]:bg-transparent [&_button]:text-muted-foreground pointer-coarse:[&_button]:h-11',\n className\n )}\n data-slot=\"composer-accessories\"\n >\n {children}\n </span>\n )\n}\n\n/** Right of the composer toolbar: tools (settings, mic) around the send button. */\nexport function ComposerTools({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn(\n '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',\n className\n )}\n data-slot=\"composer-tools\"\n >\n {children}\n </div>\n )\n}\n\n/** Personal Assistant mode marker in place of the accessories. */\nexport function PaModeBadge({\n icon,\n labels,\n testId = 'pa-mode-indicator',\n}: {\n icon: ReactNode\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }\n return (\n <div\n className=\"flex h-8 shrink-0 items-center gap-1.5 rounded-md px-2.5 text-yellow-text\"\n title={l.paModeTitle}\n data-testid={testId}\n >\n {icon}\n <span className=\"text-sm font-semibold\">{l.pa}</span>\n </div>\n )\n}\n\n/** Icon-only gear for the conversation's settings (developers). */\nexport function ConversationSettingsButton({\n label,\n onClick,\n testId = 'conversation-settings-button',\n}: {\n /** e.g. \"Chat Settings\". */\n label: string\n onClick: () => void\n testId?: string\n}) {\n return (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 shrink-0 text-muted-foreground pointer-coarse:size-11\"\n onClick={onClick}\n title={label}\n aria-label={label}\n data-testid={testId}\n >\n <Settings className=\"size-4\" />\n </Button>\n )\n}\n\n/** The history (list) view area when no chat tab is active. */\nexport function ConversationHistoryPane({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return <div className={cn('min-h-0 flex-1 overflow-hidden', className)}>{children}</div>\n}\n","import { useMemo, type ReactNode, type Ref } from 'react'\nimport DOMPurify from 'dompurify'\nimport { Download } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the thread map parts. Pass a partial `labels` to a part to reword. */\nexport interface ThreadMapLabels {\n saveSvgTitle: string\n saveSvg: string\n generating: string\n /** \"Error rendering diagram: <message>\". */\n renderError: (message: string) => string\n}\n\nexport const DEFAULT_THREAD_MAP_LABELS: ThreadMapLabels = {\n saveSvgTitle: 'Save SVG as file',\n saveSvg: 'Save SVG',\n generating: 'Generating visualization...',\n renderError: (message) => `Error rendering diagram: ${message}`,\n}\n\nexport interface ThreadMapProps {\n /** Hint line above the map; omit to hide the header. */\n hint?: string\n /** Offer \"Save SVG\" (only once there is a diagram). */\n onSave?: () => void\n /** The map body (ThreadMapLoading / ThreadMapError / ThreadMapDiagram). */\n children: ReactNode\n className?: string\n labels?: Partial<ThreadMapLabels>\n testId?: string\n}\n\n/** The conversation-thread map: hint + save header over a scrolling canvas. */\nexport function ThreadMap({\n hint,\n onSave,\n children,\n className,\n labels,\n testId = 'thread-visualizer',\n}: ThreadMapProps) {\n const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels }\n return (\n <div\n className={cn('thread-visualizer flex h-full w-full flex-col', className)}\n data-slot=\"thread-map\"\n data-testid={testId}\n >\n {hint !== undefined && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-sm italic text-muted-foreground\">{hint}</div>\n {onSave && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onSave}\n title={l.saveSvgTitle}\n className=\"shrink-0 pointer-coarse:min-h-11\"\n >\n <Download className=\"size-3\" />\n {l.saveSvg}\n </Button>\n )}\n </div>\n )}\n <div\n className=\"mermaid-container w-full flex-1 overflow-auto rounded-lg bg-muted\"\n style={{ scrollBehavior: 'auto', contain: 'layout style' }}\n onScroll={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n )\n}\n\nexport function ThreadMapLoading({\n label,\n labels,\n}: {\n /** Text; wins over `labels.generating`. */\n label?: string\n labels?: Partial<ThreadMapLabels>\n}) {\n const text = label ?? { ...DEFAULT_THREAD_MAP_LABELS, ...labels }.generating\n return (\n <div className=\"flex h-24 items-center justify-center text-muted-foreground\" role=\"status\">\n <div className=\"flex flex-col items-center\">\n <svg\n className=\"-ml-1 mr-3 size-5 animate-spin text-primary\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n 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\"\n />\n </svg>\n <span>{text}</span>\n </div>\n </div>\n )\n}\n\nexport function ThreadMapError({\n message,\n labels,\n}: {\n message: string\n labels?: Partial<ThreadMapLabels>\n}) {\n const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels }\n return (\n <div className=\"p-4 text-red-text\" role=\"alert\">\n {l.renderError(message)}\n </div>\n )\n}\n\nexport interface ThreadMapDiagramProps {\n /**\n * Rendered SVG markup. Sanitised here (DOMPurify, SVG + HTML-label profile) before it is\n * injected: blocks cannot know whether the host's renderer ran in a strict security mode.\n */\n svg: string\n diagramRef?: Ref<HTMLDivElement>\n /** Accessible name of the diagram (default \"Conversation thread map\"). */\n label?: string\n}\n\n/** Strip scripts, event handlers and script URLs while keeping mermaid's `foreignObject` labels. */\nexport function sanitizeDiagramSvg(svg: string): string {\n // Without a DOM (SSR) DOMPurify cannot sanitise and would hand the input back: render nothing.\n if (!DOMPurify.isSupported) return ''\n return DOMPurify.sanitize(svg, {\n USE_PROFILES: { svg: true, svgFilters: true, html: true },\n ADD_TAGS: ['foreignobject'],\n HTML_INTEGRATION_POINTS: { foreignobject: true },\n ADD_ATTR: ['target'],\n })\n}\n\nexport function ThreadMapDiagram({\n svg,\n diagramRef,\n label = 'Conversation thread map',\n}: ThreadMapDiagramProps) {\n const safeSvg = useMemo(() => sanitizeDiagramSvg(svg), [svg])\n return (\n <div\n ref={diagramRef}\n className=\"p-4\"\n role=\"img\"\n aria-label={label}\n data-slot=\"thread-map-diagram\"\n dangerouslySetInnerHTML={{ __html: safeSvg }}\n />\n )\n}\n","/**\n * Pure helpers for the thread map: build the Mermaid flowchart of a conversation's threads, and\n * resolve which thread a clicked node should open.\n *\n * A Thread is `{ leaf_message_ext_id, history }`; threads may share history up to a branch point.\n */\n\n/** The message fields the map reads (an ARBI `MessageResponse` fits). */\nexport interface ThreadDiagramMessage {\n external_id?: string | null\n parent_message_ext_id?: string | null\n is_branch_point?: boolean | null\n role: string\n content?: string | null\n}\n\n/** One thread: the leaf message and the history leading to it (an ARBI `Thread` fits). */\nexport interface ThreadDiagramThread {\n leaf_message_ext_id: string\n history: ThreadDiagramMessage[]\n}\n\n/** Node colours, matching the message bubbles (Tailwind slate). */\nconst DIAGRAM_COLORS = {\n userBg: '#f1f5f9', // slate-100\n assistantBg: '#ffffff',\n stroke: '#cbd5e1', // slate-300\n strokeLight: '#e2e8f0', // slate-200\n text: '#334155', // slate-700\n}\n\n/** Escape the characters that break Mermaid label syntax. */\nfunction escapeLabel(text: string): string {\n return text\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\[/g, '&#91;')\n .replace(/\\]/g, '&#93;')\n .replace(/\\(/g, '&#40;')\n .replace(/\\)/g, '&#41;')\n .replace(/\\{/g, '&#123;')\n .replace(/\\}/g, '&#125;')\n}\n\n/** Mermaid `graph TD` source for the threads, or null while there is nothing to draw. */\nexport function buildThreadDiagram(threads: ThreadDiagramThread[]): string | null {\n if (!threads || threads.length === 0) return null\n\n // Store all messages first so they are available for parent-child mapping.\n const allMessages = new Map<string, ThreadDiagramMessage>()\n threads.forEach((thread) => {\n thread.history.forEach((message) => {\n allMessages.set(message.external_id!, message)\n })\n })\n\n // Parent-child relationships, with fallbacks: every message but the first should have a parent.\n const parentToChildren = new Map<string | null, Set<string>>()\n threads.forEach((thread) => {\n thread.history.forEach((message, index) => {\n const messageId = message.external_id!\n let parentId = message.parent_message_ext_id\n\n if (!parentId && index > 0) {\n parentId = thread.history[index - 1].external_id!\n console.warn(\n `ThreadVisualizer: Message ${messageId} (${message.role}) missing parent_message_ext_id. Inferred parent: ${parentId}`\n )\n } else if (!parentId) {\n parentId = null\n }\n\n if (parentId && !allMessages.has(parentId)) {\n if (index > 0) {\n const fallbackParentId = thread.history[index - 1].external_id!\n console.warn(\n `ThreadVisualizer: Message ${messageId} has invalid parent ${parentId}. Using fallback: ${fallbackParentId}`\n )\n parentId = fallbackParentId\n } else {\n console.warn(\n `ThreadVisualizer: Message ${messageId} has invalid parent ${parentId} and no fallback. Using root.`\n )\n parentId = null\n }\n }\n\n if (!parentToChildren.has(parentId)) parentToChildren.set(parentId, new Set())\n parentToChildren.get(parentId)?.add(messageId)\n })\n })\n\n // Branch points: messages with several children, or explicitly marked.\n const branchPoints = new Set<string>()\n parentToChildren.forEach((children, parentId) => {\n if (children.size > 1 && parentId) branchPoints.add(parentId)\n })\n allMessages.forEach((message, id) => {\n if (message.is_branch_point) branchPoints.add(id)\n })\n\n const leafNodes = new Set(threads.map((thread) => thread.leaf_message_ext_id))\n\n let diagram = 'graph TD\\n'\n // Match the message bubble colours, with a consistent font size.\n diagram += ` classDef user fill:${DIAGRAM_COLORS.userBg},stroke:${DIAGRAM_COLORS.stroke},color:${DIAGRAM_COLORS.text},stroke-width:1px,font-size:12px\\n`\n diagram += ` classDef assistant fill:${DIAGRAM_COLORS.assistantBg},stroke:${DIAGRAM_COLORS.strokeLight},color:${DIAGRAM_COLORS.text},stroke-width:1px,font-size:12px\\n`\n diagram += ` linkStyle default stroke:${DIAGRAM_COLORS.stroke},stroke-width:1px\\n`\n\n allMessages.forEach((message, id) => {\n // Plain text for a cleaner node: strip markdown, flatten line breaks, cap at 180 chars.\n const plain = (message.content || '').replace(/[*_~`#]/g, '')\n const shortened = plain.substring(0, 180).replace(/\\n/g, ' ')\n const content = escapeLabel(shortened) + (shortened.length < plain.length ? '...' : '')\n\n let label = `${message.role === 'user' ? 'User' : 'Assistant'}: ${content}`\n if (branchPoints.has(id)) label = `${label} 🔀`\n if (leafNodes.has(id)) label = `${label} 🏁`\n\n diagram += ` ${id}[\"${label}\"]\\n`\n diagram += ` class ${id} ${message.role === 'user' ? 'user' : 'assistant'}\\n`\n })\n\n // Edges only between parent and child (no root/start node).\n parentToChildren.forEach((children, parentId) => {\n children.forEach((childId) => {\n if (parentId) diagram += ` ${parentId} --> ${childId}\\n`\n })\n })\n\n return diagram\n}\n\n/**\n * The thread to open for a clicked flowchart node: the thread ending at that message if there is\n * one, otherwise the first thread containing it. Mermaid names a node's element\n * `{diagram id}-flowchart-{message id}-{n}` (Mermaid 11 prefixes the id of the render; older\n * versions wrote `flowchart-{message id}-{n}`).\n */\nexport function threadForNode(threads: ThreadDiagramThread[], nodeId: string): string | null {\n const messageId = /(?:^|-)flowchart-(.+)-\\d+$/.exec(nodeId)?.[1]\n if (!messageId) return null\n if (threads.some((thread) => thread.leaf_message_ext_id === messageId)) return messageId\n const containing = threads.find((thread) =>\n thread.history.some((msg) => msg.external_id === messageId)\n )\n return containing ? containing.leaf_message_ext_id : null\n}\n","/**\n * ThreadVisualizer: renders a conversation's threads as a Mermaid flowchart (message\n * relationships, branch points, thread paths) inside the ThreadMap parts. The diagram source is\n * built by `thread-diagram.ts`; node clicks open the thread through `switchToThread`.\n *\n * Mermaid is an optional peer, imported on first render, so it stays out of every bundle that\n * never shows the map.\n */\n\nimport { memo, useEffect, useMemo, useRef, useState, useCallback } from 'react'\nimport { ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading } from './ThreadMap'\nimport { buildThreadDiagram, threadForNode, type ThreadDiagramThread } from './thread-diagram'\n\n/** The hint above the map. */\nexport interface ThreadVisualizerLabels {\n hint: string\n /** Shown instead of `hint` when there are more than five threads. */\n hintMany: string\n}\n\nexport const DEFAULT_THREAD_VISUALIZER_LABELS: ThreadVisualizerLabels = {\n hint: 'Click on a message to resume conversation thread.',\n hintMany: 'This conversation has many threads. Click on a message to resume conversation thread.',\n}\n\nexport interface ThreadVisualizerProps {\n threads: ThreadDiagramThread[]\n /** Open a thread, by its leaf message id. */\n switchToThread: (threadId: string) => void\n showHeader?: boolean\n showDownloadButton?: boolean\n className?: string\n labels?: Partial<ThreadVisualizerLabels>\n}\n\n// Lazily loaded mermaid instance, initialized once on first use.\nlet mermaidInitialized = false\nlet mermaidModule: typeof import('mermaid').default | null = null\n\nasync function getMermaid(): Promise<typeof import('mermaid').default> {\n if (!mermaidModule) {\n mermaidModule = (await import('mermaid')).default\n }\n if (!mermaidInitialized) {\n try {\n mermaidModule.initialize({\n startOnLoad: false,\n flowchart: { useMaxWidth: true, curve: 'basis' },\n securityLevel: 'loose', // Required for click interactivity\n })\n mermaidInitialized = true\n } catch (error) {\n console.error('Error initializing Mermaid:', error)\n }\n }\n return mermaidModule\n}\n\nfunction ThreadVisualizerView({\n threads,\n switchToThread,\n showHeader = true,\n showDownloadButton = true,\n className,\n labels,\n}: ThreadVisualizerProps) {\n const svgContainerRef = useRef<HTMLDivElement>(null)\n const [isRendering, setIsRendering] = useState(true)\n const [renderError, setRenderError] = useState<string | null>(null)\n const [svgContent, setSvgContent] = useState<string>('')\n const renderingRef = useRef(false)\n\n const mermaidDiagram = useMemo(() => buildThreadDiagram(threads), [threads])\n\n const handleNodeClick = useCallback(\n (nodeId: string) => {\n try {\n const threadId = threadForNode(threads, nodeId)\n if (threadId) switchToThread(threadId)\n } catch (error) {\n console.error('Error in thread navigation callback:', error)\n }\n },\n [threads, switchToThread]\n )\n\n const saveSvgAsFile = useCallback(() => {\n if (!svgContent) return\n try {\n const blob = new Blob([svgContent], { type: 'image/svg+xml' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `thread-visualizer-${new Date().toISOString().split('T')[0]}.svg`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n } catch (error) {\n console.error('Failed to save SVG:', error)\n }\n }, [svgContent])\n\n // Render the diagram once per change of threads (never concurrently).\n useEffect(() => {\n if (renderingRef.current || !mermaidDiagram) return\n\n const renderDiagram = async () => {\n renderingRef.current = true\n setIsRendering(true)\n setRenderError(null)\n setSvgContent('')\n try {\n const renderDiagramId = `mermaid-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n const mermaid = await getMermaid()\n const { svg } = await mermaid.render(renderDiagramId, mermaidDiagram)\n setSvgContent(svg)\n setIsRendering(false)\n } catch (error) {\n console.error('Error rendering mermaid diagram:', error)\n setRenderError(error instanceof Error ? error.message : String(error))\n setIsRendering(false)\n setSvgContent('')\n } finally {\n renderingRef.current = false\n }\n }\n\n renderDiagram()\n }, [mermaidDiagram])\n\n // Style the SVG and make its nodes clickable once rendered.\n useEffect(() => {\n if (!svgContent || !svgContainerRef.current) return\n const svgElement = svgContainerRef.current.querySelector('svg')\n if (!svgElement) return\n svgElement.style.maxWidth = '100%'\n svgElement.style.height = 'auto'\n svgElement.style.minHeight = '400px'\n\n // Force consistent font styling.\n const textElements = svgElement.getElementsByTagName('text')\n for (let i = 0; i < textElements.length; i++) {\n textElements[i].setAttribute('font-family', 'system-ui, sans-serif')\n textElements[i].setAttribute('font-size', '12px')\n textElements[i].style.fontSize = '12px !important'\n }\n\n svgElement.querySelectorAll('g.node').forEach((element) => {\n const nodeId = element.getAttribute('id')\n if (!nodeId) return\n ;(element as SVGElement).style.cursor = 'pointer'\n element.addEventListener('click', () => handleNodeClick(nodeId))\n })\n }, [svgContent, handleNodeClick])\n\n const l = { ...DEFAULT_THREAD_VISUALIZER_LABELS, ...labels }\n const hint = showHeader ? (threads.length > 5 ? l.hintMany : l.hint) : undefined\n\n return (\n <ThreadMap\n hint={hint}\n onSave={showDownloadButton && svgContent ? saveSvgAsFile : undefined}\n className={className}\n >\n {/* Loading while rendering, with no content yet, or with no threads data. */}\n {(isRendering || !svgContent || !mermaidDiagram) && !renderError && <ThreadMapLoading />}\n {renderError && <ThreadMapError message={renderError} />}\n {svgContent && !renderError && (\n <ThreadMapDiagram svg={svgContent} diagramRef={svgContainerRef} />\n )}\n </ThreadMap>\n )\n}\n\nexport const ThreadVisualizer = memo(ThreadVisualizerView)\n","import { useCallback, useState, type ClipboardEvent } from 'react'\n\nconst LONG_PASTE_CHARACTER_LIMIT = 1_000\nconst LONG_PASTE_LINE_LIMIT = 12\n\n/** True when the text is big enough that a composer should fold it behind a \"Pasted text\" chip. */\nexport function isLongPastedText(value: string): boolean {\n return (\n value.length >= LONG_PASTE_CHARACTER_LIMIT || value.split('\\n').length >= LONG_PASTE_LINE_LIMIT\n )\n}\n\nexport interface UseLongPaste {\n /** The draft is long AND the user pasted it (typing a long text never folds it). */\n isCollapsed: boolean\n /** Wire to the textarea `onPaste`. Folds when the post-paste draft is long. */\n onPaste: (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => void\n /** Wire to the textarea `onChange`: unfolds once the draft is short again. */\n onValueChange: (nextValue: string) => void\n /** Unfold (the \"Expand\" chip). */\n expand: () => void\n}\n\n/** Headless long-paste folding for a composer draft. */\nexport function useLongPaste(value: string): UseLongPaste {\n const [collapsed, setCollapsed] = useState(false)\n\n const onPaste = useCallback(\n (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => {\n const pasted = event.clipboardData.getData('text')\n const el = event.currentTarget\n const next =\n currentValue.slice(0, el.selectionStart) + pasted + currentValue.slice(el.selectionEnd)\n if (isLongPastedText(next)) setCollapsed(true)\n },\n []\n )\n\n const onValueChange = useCallback((nextValue: string) => {\n if (!isLongPastedText(nextValue)) setCollapsed(false)\n }, [])\n\n const expand = useCallback(() => setCollapsed(false), [])\n\n return { isCollapsed: collapsed && isLongPastedText(value), onPaste, onValueChange, expand }\n}\n","/**\n * PendingAnswerBar\n *\n * When the agent pauses to ask the user a question (ask_user / Human-in-the-loop),\n * this card docks directly above the message composer. It shows the FULL question\n * and lays the answer options out vertically — one full-width row each — so every\n * label is readable in full, however long. A countdown sits in the header.\n *\n * There is intentionally NO text input here: a free-text answer is typed in the\n * real composer below, which interjects the answer while a question is\n * pending. One input, where the user's cursor already is.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { MessageCircleQuestion, Clock, Pause, Play } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the pending-answer bar. */\nexport interface PendingAnswerBarLabels {\n heading: string\n optionsLabel: string\n hint: string\n /** Pause button while the countdown runs. */\n pauseTimer: string\n /** Pause button while it is paused. */\n resumeTimer: string\n /** Name of the countdown, spoken with its value. */\n timeLeft: string\n /** Announced at 30 and 10 seconds left. */\n secondsWarning: (seconds: number) => string\n}\n\nexport const DEFAULT_PENDING_ANSWER_BAR_LABELS: PendingAnswerBarLabels = {\n heading: 'ARBI is asking',\n optionsLabel: 'Answer options',\n hint: 'Pick an option, or type your own answer below.',\n pauseTimer: 'Pause the countdown',\n resumeTimer: 'Resume the countdown',\n timeLeft: 'Time left to answer',\n secondsWarning: (seconds) => `${seconds} seconds left to answer`,\n}\n\nexport interface PendingAnswerBarProps {\n question: string\n options: string[]\n timeoutSeconds: number\n /** Called with the chosen option, the typed answer, or 'timeout' when it expires. */\n onPick: (answer: string) => void\n labels?: Partial<PendingAnswerBarLabels>\n}\n\nexport function PendingAnswerBar({\n question,\n options,\n timeoutSeconds,\n onPick,\n labels,\n}: PendingAnswerBarProps) {\n const l = { ...DEFAULT_PENDING_ANSWER_BAR_LABELS, ...labels }\n const [secondsLeft, setSecondsLeft] = useState(timeoutSeconds)\n // Once we've answered (or timed out) don't fire again as the bar unmounts.\n const firedRef = useRef(false)\n // WCAG 2.2.1: the countdown is pausable, and holds still while focus is inside the bar so a\n // keyboard or screen-reader user reading the options is never timed out under their hands.\n const [isPausedByUser, setIsPausedByUser] = useState(false)\n const [hasFocusWithin, setHasFocusWithin] = useState(false)\n const isPaused = isPausedByUser || hasFocusWithin\n // Spoken once the bar is mounted (a live region only announces changes made after it exists).\n const [announcement, setAnnouncement] = useState('')\n\n // A bare \"Other\" option is redundant — the composer is the free-text path.\n const choices = options.filter((o) => o.trim().toLowerCase() !== 'other')\n\n useEffect(() => {\n setAnnouncement(`${l.heading}: ${question}`)\n // Once per question: the bar is keyed by it in the host.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (secondsLeft <= 0 || isPaused) return\n const t = setInterval(() => setSecondsLeft((s) => (s <= 1 ? 0 : s - 1)), 1000)\n return () => clearInterval(t)\n }, [secondsLeft, isPaused])\n\n useEffect(() => {\n if (secondsLeft === 30 || secondsLeft === 10) setAnnouncement(l.secondsWarning(secondsLeft))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [secondsLeft])\n\n useEffect(() => {\n if (secondsLeft === 0 && !firedRef.current) {\n firedRef.current = true\n onPick('timeout')\n }\n }, [secondsLeft, onPick])\n\n const pick = (answer: string) => {\n if (firedRef.current) return\n firedRef.current = true\n onPick(answer)\n }\n\n const fmt = (s: number): string => {\n const m = Math.floor(s / 60)\n const r = s % 60\n return m > 0 ? `${m}:${r.toString().padStart(2, '0')}` : `${r}s`\n }\n const low = secondsLeft <= 30\n\n return (\n <div\n role=\"group\"\n aria-label={l.heading}\n className=\"mb-2 rounded-lg border border-theme-cyan/30 bg-theme-cyan/[0.05] px-3 py-2.5\"\n data-slot=\"pending-answer-bar\"\n data-testid=\"pending-answer-bar\"\n onFocus={() => setHasFocusWithin(true)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setHasFocusWithin(false)\n }\n }}\n >\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n data-testid=\"pending-answer-status\"\n >\n {announcement}\n </div>\n {/* Header: label + countdown */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <MessageCircleQuestion aria-hidden=\"true\" className=\"h-4 w-4 shrink-0 text-theme-cyan\" />\n <span className=\"text-xs font-medium uppercase tracking-wide text-theme-cyan\">\n {l.heading}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <span\n role=\"timer\"\n aria-label={l.timeLeft}\n className={cn(\n 'flex items-center gap-1 text-xs tabular-nums',\n low ? 'text-red-text' : 'text-muted-foreground'\n )}\n data-testid=\"pending-answer-timer\"\n >\n <Clock aria-hidden=\"true\" className=\"h-3 w-3\" />\n {fmt(secondsLeft)}\n </span>\n <button\n type=\"button\"\n onClick={() => setIsPausedByUser((p) => !p)}\n aria-pressed={isPausedByUser}\n aria-label={l.pauseTimer}\n title={isPausedByUser ? l.resumeTimer : l.pauseTimer}\n 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\"\n data-testid=\"pending-answer-pause\"\n >\n {isPausedByUser ? (\n <Play aria-hidden=\"true\" className=\"h-3 w-3\" />\n ) : (\n <Pause aria-hidden=\"true\" className=\"h-3 w-3\" />\n )}\n </button>\n </div>\n </div>\n\n {/* The full question — wraps freely, never truncated */}\n <p className=\"mt-1.5 whitespace-pre-line text-sm text-foreground\">{question}</p>\n\n {/* Options, stacked vertically — each row reveals its full label */}\n {choices.length > 0 && (\n <div className=\"mt-2.5 flex flex-col gap-1.5\" role=\"group\" aria-label={l.optionsLabel}>\n {choices.map((option, i) => (\n <button\n key={`${i}-${option}`}\n type=\"button\"\n onClick={() => pick(option)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md border border-border bg-background',\n 'px-3 py-2 text-left text-sm text-foreground transition-colors',\n 'hover:border-theme-cyan/50 hover:bg-theme-cyan/10',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11'\n )}\n data-testid={`pending-answer-option-${option}`}\n >\n <span\n aria-hidden=\"true\"\n 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\"\n >\n {i + 1}\n </span>\n <span className=\"min-w-0 flex-1\">{option}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* Free-text affordance — points at the composer below */}\n <p className=\"mt-2 text-xs text-muted-foreground\">{l.hint}</p>\n </div>\n )\n}\n","import { useCallback } from 'react'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport type { ChatCitationTarget } from './chat-page-types'\n\n/**\n * Open a cited document at its passage and page through the environment (`openDocument`): the\n * `onOpenCitation` of a chat whose host shows documents.\n */\nexport function useOpenCitation(): (target: ChatCitationTarget) => void {\n const { openDocument } = useBlocksEnvironment()\n return useCallback(\n ({ documentId, page, passage }) => {\n const id = documentId ?? passage?.documentId\n if (!id) return\n const at = page ?? passage?.page ?? undefined\n openDocument(id, { ...(at && { page: at }), ...(passage?.id && { passageId: passage.id }) })\n },\n [openDocument]\n )\n}\n","import { useEffect, useRef, type KeyboardEvent } from 'react'\nimport { hasMessageBody } from '@arbidocs/react/shell'\n\n/** Seed a shared draft once, preserve edits, and restore the default after a send. */\nexport function useRecipientDraft({\n value,\n onValueChange,\n contextKey,\n defaultLabel,\n}: {\n value: string\n onValueChange: (value: string) => void\n contextKey: string | null | undefined\n defaultLabel: string | null\n}) {\n const prefix = defaultLabel ? `@${defaultLabel} ` : ''\n const context = `${contextKey ?? ''}:${defaultLabel ?? ''}`\n const previousContext = useRef<string | null>(null)\n const resetAfterSend = useRef(false)\n useEffect(() => {\n const changed = previousContext.current !== context\n const previousLabel = previousContext.current?.split(':').pop()\n previousContext.current = context\n if (changed || (resetAfterSend.current && !value)) {\n resetAfterSend.current = false\n if (!value && prefix) onValueChange(prefix)\n // A visibility change removes only the untouched default, never someone's text.\n else if (changed && !prefix && previousLabel && value.trim() === `@${previousLabel}`)\n onValueChange('')\n }\n }, [context, prefix, value, onValueChange])\n\n return {\n hasBody: hasMessageBody(value, defaultLabel ?? 'ARBI'),\n onSend: () => {\n resetAfterSend.current = true\n },\n handleKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => {\n const textarea = event.currentTarget\n if (\n prefix &&\n value.startsWith(prefix) &&\n event.key === 'Backspace' &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey &&\n textarea.selectionStart === textarea.selectionEnd &&\n textarea.selectionStart === prefix.length\n ) {\n event.preventDefault()\n onValueChange(value.slice(prefix.length))\n requestAnimationFrame(() => textarea.setSelectionRange(0, 0))\n return true\n }\n return false\n },\n }\n}\n","/**\n * Message Copy Utilities\n *\n * Handles copying message content with formatting, including:\n * - Citation deep links in HTML with proper footnotes\n * - Message link at top\n * - Plain text with URL on first line\n */\n\nimport type { Chunk, ToolResponses } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../lib/deep-link'\nimport { markdownToPlainTextBlocks } from '@arbidocs/react/ui'\n\ninterface CopyMessageOptions {\n messageRef: React.RefObject<HTMLDivElement | null>\n responseContent: string\n messageContent: string\n isUser: boolean\n selectedWorkspaceId: string | null\n /** The deployment the links point at (the environment's `runtimeConfig.deploymentDomain`). */\n deploymentDomain?: string | null\n conversationExtId: string | undefined\n messageExtId: string | undefined\n activeCitations: Record<string, string[]> | null\n citationData: ToolResponses\n /** The preceding user message content (for assistant messages) */\n precedingUserMessage?: string\n}\n\ninterface PassageInfo {\n deepLink: string\n docTitle: string\n pageNumber?: number\n passageText?: string\n}\n\ninterface FootnoteData {\n citationNum: string\n passages: PassageInfo[]\n}\n\n/**\n * Build a lookup map from chunk_ext_id to chunk metadata\n */\nfunction buildChunkLookup(citationData: ToolResponses): Map<string, Chunk> {\n const lookup = new Map<string, Chunk>()\n Object.values(citationData).forEach((chunks) => {\n if (Array.isArray(chunks)) {\n ;(chunks as Chunk[]).forEach((chunk) => {\n if (chunk.metadata?.chunk_ext_id) {\n lookup.set(chunk.metadata.chunk_ext_id, chunk)\n }\n })\n }\n })\n return lookup\n}\n\n/**\n * Get all passage info for a citation number\n */\nfunction getPassagesForCitation(\n citationNum: string,\n selectedWorkspaceId: string,\n activeCitations: Record<string, string[]>,\n chunkLookup: Map<string, Chunk>,\n deploymentDomain: string | null | undefined\n): PassageInfo[] {\n const chunkIds = activeCitations[citationNum]\n if (!chunkIds?.length) return []\n\n const passages: PassageInfo[] = []\n\n for (const chunkId of chunkIds) {\n const chunk = chunkLookup.get(chunkId)\n if (!chunk?.metadata?.doc_ext_id || !chunk?.metadata?.chunk_ext_id) continue\n\n passages.push({\n deepLink: buildDeepLinkUrl(\n {\n workspaceId: selectedWorkspaceId,\n documentId: chunk.metadata.doc_ext_id,\n chunkId: chunk.metadata.chunk_ext_id,\n },\n deploymentDomain\n ),\n docTitle: chunk.metadata.doc_title || 'Document',\n pageNumber: chunk.metadata.page_number,\n passageText: chunk.content ? truncateText(chunk.content, 150) : undefined,\n })\n }\n\n return passages\n}\n\n/**\n * Truncate text to a maximum length with ellipsis\n */\nfunction truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength).trim() + '...'\n}\n\n/**\n * Generate HTML for a single footnote entry\n */\nfunction generateFootnoteHtml(footnote: FootnoteData): string {\n const { citationNum, passages } = footnote\n\n if (passages.length === 0) {\n return `<p id=\"fn-${citationNum}\" style=\"margin: 4px 0; font-size: 12px;\"><sup>${citationNum}</sup> [No source available]</p>`\n }\n\n let html = `<p id=\"fn-${citationNum}\" style=\"margin: 8px 0; font-size: 13px;\"><sup style=\"font-weight: bold;\">${citationNum}</sup> `\n\n // Each passage gets its own entry with doc title, page, and link following\n const passageEntries = passages.map((p) => {\n const pageStr = p.pageNumber ? `, p.${p.pageNumber}` : ''\n return `${p.docTitle}${pageStr} <a href=\"${p.deepLink}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">[view]</a>`\n })\n\n html += passageEntries.join('; ')\n html += '</p>'\n\n return html\n}\n\n/**\n * Generate the complete footnotes section HTML\n */\nfunction generateFootnotesSection(footnotes: FootnoteData[]): string {\n if (footnotes.length === 0) return ''\n\n let html = '<hr style=\"margin: 16px 0; border: none; border-top: 1px solid #e5e7eb;\">'\n html += '<div style=\"font-size: 12px; color: #6b7280;\">'\n html += '<p style=\"margin-bottom: 8px; font-weight: 600;\">References:</p>'\n\n for (const footnote of footnotes) {\n html += generateFootnoteHtml(footnote)\n }\n\n html += '</div>'\n return html\n}\n\n/**\n * Generate plain text footnotes section\n */\nfunction generateFootnotesSectionPlainText(footnotes: FootnoteData[]): string {\n if (footnotes.length === 0) return ''\n\n let text = '\\nReferences:\\n'\n\n for (const footnote of footnotes) {\n const { citationNum, passages } = footnote\n if (passages.length === 0) {\n text += `[${citationNum}] [No source available]\\n`\n continue\n }\n\n const passageEntries = passages.map((p) => {\n const pageStr = p.pageNumber ? `, p.${p.pageNumber}` : ''\n return `${p.docTitle}${pageStr} - ${p.deepLink}`\n })\n\n text += `[${citationNum}] ${passageEntries.join('; ')}\\n`\n }\n\n return text\n}\n\n/**\n * Replace markdown citation links with bracketed references\n * Converts [text](#cite-N) to text[N]\n *\n * The link text may itself contain one level of brackets (e.g. \"co-arbitrator [9] under…\"),\n * which CommonMark allows; a plain [^\\]] match would stop at the inner ] and leak the link.\n */\nfunction replaceCitationLinksInMarkdown(text: string): string {\n return text.replace(/\\[((?:[^[\\]]|\\[[^[\\]]*\\])+)\\]\\(#cite-(\\d+)\\)/g, '$1[$2]')\n}\n\n/**\n * Process HTML to add citation links and collect footnote data\n */\nfunction processCitationsInHtml(\n html: string,\n selectedWorkspaceId: string,\n activeCitations: Record<string, string[]>,\n citationData: ToolResponses,\n deploymentDomain: string | null | undefined\n): { html: string; footnotes: FootnoteData[] } {\n const chunkLookup = buildChunkLookup(citationData)\n const tempDiv = document.createElement('div')\n tempDiv.innerHTML = html\n\n const footnotes: FootnoteData[] = []\n const processedCitations = new Set<string>()\n\n // Find all citation spans and process them\n tempDiv.querySelectorAll('[data-testid^=\"citation-link-\"]').forEach((span) => {\n const citationNum = span.getAttribute('data-testid')?.replace('citation-link-', '')\n if (!citationNum) return\n\n // Get all passages for this citation\n const passages = getPassagesForCitation(\n citationNum,\n selectedWorkspaceId,\n activeCitations,\n chunkLookup,\n deploymentDomain\n )\n\n // Collect footnote data (only once per citation number)\n if (!processedCitations.has(citationNum)) {\n processedCitations.add(citationNum)\n footnotes.push({ citationNum, passages })\n }\n\n // Style the superscript with brackets (footnotes section has the actual links)\n const supElement = span.querySelector('sup')\n if (supElement) {\n supElement.textContent = `[${citationNum}]`\n supElement.style.cssText = 'color: #2563eb;'\n }\n })\n\n // Sort footnotes by citation number\n footnotes.sort((a, b) => parseInt(a.citationNum) - parseInt(b.citationNum))\n\n return { html: tempDiv.innerHTML, footnotes }\n}\n\n/**\n * Build message link URL and HTML\n */\nexport function buildMessageLink(\n selectedWorkspaceId: string | null,\n conversationExtId: string | undefined,\n messageExtId: string | undefined,\n deploymentDomain?: string | null\n): { url: string; html: string } | null {\n if (!selectedWorkspaceId || !conversationExtId || !messageExtId) return null\n\n const fullUrl = buildDeepLinkUrl(\n {\n workspaceId: selectedWorkspaceId,\n conversationId: conversationExtId,\n messageId: messageExtId,\n },\n deploymentDomain\n )\n return {\n url: fullUrl,\n html: `<p style=\"margin-bottom: 12px;\"><a href=\"${fullUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">ARBI Docs message link</a></p>`,\n }\n}\n\nconst NO_ANSWER_TEXT = '(No answer text was written.)'\n\n/**\n * Build clipboard content (both HTML and plain text)\n */\nfunction buildClipboardContent(\n htmlContent: string,\n plainTextContent: string,\n messageLinkUrl: string,\n messageLinkHtml: string,\n footnotesHtml: string,\n footnotes: FootnoteData[],\n precedingUserMessage?: string,\n isUser?: boolean\n): { html: string; plainText: string } {\n // An answer stopped before it wrote any text has an empty body. Say so, rather than\n // leave a bare \"Assistant:\" heading that looks like the copy lost the answer.\n const isEmptyAnswer = !isUser && !plainTextContent.trim()\n const bodyHtml = isEmptyAnswer ? `<p><em>${NO_ANSWER_TEXT}</em></p>` : htmlContent\n // Assistant answers are markdown: strip the markup so the pasted text has no stray ** or #\n const body = replaceCitationLinksInMarkdown(plainTextContent)\n const bodyText = isEmptyAnswer ? NO_ANSWER_TEXT : isUser ? body : markdownToPlainTextBlocks(body)\n\n // HTML: message link at top, content, then footnotes at bottom\n let html = ''\n if (messageLinkHtml) html += messageLinkHtml\n\n // For assistant messages with a preceding user message, format as User:/Assistant: sections\n if (!isUser && precedingUserMessage) {\n html += `<p><strong>User:</strong></p>${escapeHtml(precedingUserMessage)}<br><br>`\n html += `<p><strong>Assistant:</strong></p>${bodyHtml}`\n } else {\n html += bodyHtml\n }\n\n if (footnotesHtml) html += footnotesHtml\n\n // Plain text: URL on first line, content with [N] refs, then footnotes\n let plainText = messageLinkUrl ? `${messageLinkUrl}\\n\\n` : ''\n\n // For assistant messages with a preceding user message, format as User:/Assistant: sections\n if (!isUser && precedingUserMessage) {\n plainText += `User:\\n${precedingUserMessage}\\n\\nAssistant:\\n`\n }\n\n plainText += bodyText\n plainText += generateFootnotesSectionPlainText(footnotes)\n\n return { html, plainText }\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n .replace(/\\n/g, '<br>')\n}\n\n/**\n * Find the message content div — the rendered answer.\n *\n * It used to have to step over a `thinking-section` panel that could precede it\n * in the card. That panel is gone, so the lookup is just the first\n * `.markdown-content` — exactly the branch this already took for every message\n * that had no reasoning, which was almost all of them.\n */\nfunction findMessageContentDiv(messageRef: HTMLDivElement): Element | null {\n return messageRef.querySelector('.markdown-content')\n}\n\n/**\n * Copy message content to clipboard with formatting\n */\nexport async function copyMessageToClipboard(options: CopyMessageOptions): Promise<boolean> {\n const {\n messageRef,\n responseContent,\n messageContent,\n isUser,\n selectedWorkspaceId,\n conversationExtId,\n messageExtId,\n activeCitations,\n citationData,\n deploymentDomain,\n } = options\n\n if (!messageRef.current) return false\n\n const plainTextContent = isUser ? messageContent : responseContent\n const messageLink = buildMessageLink(\n selectedWorkspaceId,\n conversationExtId,\n messageExtId,\n deploymentDomain\n )\n const messageLinkUrl = messageLink?.url || ''\n const messageLinkHtml = messageLink?.html || ''\n\n const targetContentDiv = findMessageContentDiv(messageRef.current)\n\n if (!targetContentDiv) {\n const { plainText } = buildClipboardContent(\n '',\n plainTextContent,\n messageLinkUrl,\n '',\n '',\n [],\n undefined,\n isUser\n )\n await navigator.clipboard.writeText(plainText)\n return true\n }\n\n // Process citations and generate footnotes\n let htmlContent = targetContentDiv.innerHTML\n let footnotesHtml = ''\n let footnotes: FootnoteData[] = []\n\n if (selectedWorkspaceId && activeCitations) {\n const result = processCitationsInHtml(\n htmlContent,\n selectedWorkspaceId,\n activeCitations,\n citationData,\n deploymentDomain\n )\n htmlContent = result.html\n footnotes = result.footnotes\n footnotesHtml = generateFootnotesSection(footnotes)\n }\n\n const { html, plainText } = buildClipboardContent(\n htmlContent,\n plainTextContent,\n messageLinkUrl,\n messageLinkHtml,\n footnotesHtml,\n footnotes,\n options.precedingUserMessage,\n isUser\n )\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([html], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n })\n\n await navigator.clipboard.write([clipboardItem])\n return true\n}\n","/**\n * Turn a rendered answer table (an HTML <table>) into a CSV download.\n *\n * Works from the DOM rather than the markdown source so the CSV holds exactly\n * what the reader sees: cited text stays, the citation's superscript number\n * does not.\n */\nimport { downloadBlob } from '@arbidocs/react/document-tools'\n\n/** The superscript number a citation renders after its cited words. */\nconst CITATION_MARKER_SELECTOR = '[data-mark-kind=\"citation\"] > sup, .cited-text > sup'\nconst HEADING_SELECTOR = 'h1, h2, h3, h4, h5, h6'\nconst PARAGRAPH_SELECTOR = 'p'\nconst MAX_SLUG_LENGTH = 80\n/** Where the block search stops: the answer's own markdown root. */\nconst ANSWER_ROOT_SELECTOR = '.markdown-content, [data-testid=\"citation-renderer\"]'\n\nconst LINE_BREAK = '\\u0000'\n\nfunction cellText(cell: Element): string {\n const clone = cell.cloneNode(true) as Element\n clone.querySelectorAll(CITATION_MARKER_SELECTOR).forEach((marker) => marker.remove())\n // A sentinel, not '\\n', so source newlines (plain whitespace) still collapse.\n clone.querySelectorAll('br').forEach((br) => br.replaceWith(LINE_BREAK))\n return (clone.textContent ?? '')\n .split(LINE_BREAK)\n .map((line) => line.replace(/\\s+/g, ' ').trim())\n .join('\\n')\n .trim()\n}\n\n/** Visible cell text of every row (header included), citation markers removed. */\nexport function extractTableRows(table: HTMLTableElement): string[][] {\n return Array.from(table.rows).map((row) => Array.from(row.cells).map(cellText))\n}\n\n/**\n * RFC 4180 CSV (CRLF rows; fields with commas, quotes or line breaks are quoted\n * and inner quotes doubled). Prefixed with a UTF-8 BOM so Excel reads accents\n * and currency symbols correctly.\n */\nexport async function rowsToCsv(rows: string[][]): Promise<string> {\n const Papa = (await import('papaparse')).default\n return '\\ufeff' + Papa.unparse(rows, { newline: '\\r\\n' })\n}\n\n/** The closest element matching `selector` above `el` inside the answer, or null. */\nfunction findPrecedingBlock(el: Element, selector: string): Element | null {\n let node: Element | null = el\n while (node && !node.matches(ANSWER_ROOT_SELECTOR)) {\n let sibling = node.previousElementSibling\n while (sibling) {\n if (sibling.matches(selector)) return sibling\n const nested = sibling.querySelectorAll(selector)\n if (nested.length > 0) return nested[nested.length - 1]\n sibling = sibling.previousElementSibling\n }\n node = node.parentElement\n }\n return null\n}\n\n/**\n * `<nearest-heading>.csv`, else `<introducing-sentence>.csv` (the paragraph just\n * above the table), slugified. `table.csv` when neither exists.\n */\nexport function csvFilenameForTable(el: Element): string {\n const source =\n findPrecedingBlock(el, HEADING_SELECTOR) ?? findPrecedingBlock(el, PARAGRAPH_SELECTOR)\n const slug = (source ? cellText(source) : '')\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/['’]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n // Cap the length at a word boundary, so a long sentence never ends mid-word.\n const capped =\n slug.length > MAX_SLUG_LENGTH ? slug.slice(0, MAX_SLUG_LENGTH).replace(/-[^-]*$/, '') : slug\n return `${capped || 'table'}.csv`\n}\n\n/**\n * Download `table` as CSV, named after the content above `anchor` (see `csvFilenameForTable`).\n * Resolves to the file name that was downloaded.\n */\nexport async function downloadTableAsCsv(\n table: HTMLTableElement,\n anchor: Element = table\n): Promise<string> {\n const csv = await rowsToCsv(extractTableRows(table))\n const filename = csvFilenameForTable(anchor)\n downloadBlob(new Blob([csv], { type: 'text/csv;charset=utf-8' }), filename)\n return filename\n}\n","/**\n * Thin strip pinned to the bottom inner edge of the composer box that shows\n * how full the context window is. Fills left-to-right like a percent-full\n * meter (colored = used, white space = headroom left); the tooltip frames\n * it to the user as a plain countdown percentage, not raw token counts.\n * Must be rendered inside a `relative` ancestor sized to the composer box —\n * it positions itself relative to that box, not the page.\n */\n\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport {\n type ContextUsage,\n getContextRemainingPercent,\n getContextUsedPercent,\n} from '@arbidocs/sdk/browser'\n\nconst WARM_REMAINING_THRESHOLD_PERCENT = 50\n\nexport function ContextUsageBar({\n contextUsage,\n draftLength = 0,\n}: {\n contextUsage?: ContextUsage | null\n /** Length of the not-yet-sent draft text, so the bar reacts while typing. */\n draftLength?: number\n}) {\n if (!contextUsage || contextUsage.context_window <= 0) return null\n\n const usedPercent = getContextUsedPercent(contextUsage, draftLength)\n const remainingPercent = getContextRemainingPercent(contextUsage, draftLength)\n // £ spent is a past-turn cost, not future context headroom — that lives in\n // the assistant message's own steps expander instead (see AgentSteps).\n const isWarm = remainingPercent < WARM_REMAINING_THRESHOLD_PERCENT || contextUsage.truncated\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className=\"pointer-events-auto absolute inset-x-0 bottom-0 z-10 h-[2px] cursor-default overflow-hidden rounded-b-md bg-muted-foreground/20\"\n data-testid=\"context-usage-bar\"\n >\n <div\n className={cn(\n 'h-full transition-all duration-500 ease-out',\n isWarm ? 'bg-yellow-text' : 'bg-muted-foreground'\n )}\n style={{ width: `${usedPercent}%` }}\n data-testid=\"context-usage-bar-fill\"\n />\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[240px] space-y-1 text-sm\">\n <div className=\"font-medium\">\n {Math.round(remainingPercent)}% remaining before auto-compaction\n </div>\n {isWarm && (\n <div className=\"text-yellow-text\">\n This conversation is getting long and will be autocompacted when this reaches 0%. Run\n /compact any time to reduce context length.\n </div>\n )}\n {contextUsage.truncated && (\n <div className=\"font-medium text-yellow-text\">Context was truncated</div>\n )}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Slash-menu data logic (build + filter the item list) for the `SlashMenu`.\n *\n * The SDK owns the slug grammar and filter ranking; this file is the\n * single React-side import site for slash-command primitives so\n * upstream changes propagate without touching the component.\n */\n\nimport { filterSkills } from '@arbidocs/sdk/browser'\nimport type { SlashItemKind, SlashMenuItem } from './SlashMenu'\n\nexport { parseSlashTokenInProgress as parseSlashToken } from '@arbidocs/sdk/browser'\n\n/**\n * Build the single menu list from the two sources that feed it: the\n * backend's built-in commands (``GET /v1/assistant/commands``) and the\n * user's skills (``GET /v1/assistant/skills``).\n *\n * Built-ins come first — they're shipped vocabulary the backend always\n * handles — and a built-in wins a name collision, because a skill named\n * ``compact`` could never actually be invoked: the dispatcher checks its\n * built-in branches before it ever reaches the skill loader, so listing the\n * shadowed skill would promise something the backend won't do. Same rule the\n * TUI applies in ``toSlashCommandsWithSkills``.\n */\nexport function buildSlashItems(\n commands: ReadonlyArray<SlashMenuItem>,\n skills: ReadonlyArray<SlashMenuItem>\n): SlashMenuItem[] {\n const taken = new Set(commands.map((c) => c.name))\n return [...commands, ...skills.filter((s) => !taken.has(s.name))]\n}\n\n/**\n * Filter+sort wrapper around the SDK's ``filterSkills`` that returns\n * exactly the shape the menu renders. Kept as a thin adapter so future\n * refactors (e.g. switching to a fuzzy matcher) can move upstream into\n * the SDK without touching the component.\n *\n * Each kind is ranked independently and the groups are re-concatenated in\n * commands-then-skills order, so the flat array the menu indexes into is\n * *already* grouped. The component slices it into sections without a second\n * sort, and keyboard navigation stays a plain index over one array.\n */\nexport function filterSlashItems(\n items: ReadonlyArray<SlashMenuItem>,\n query: string,\n pinned: ReadonlyArray<string> = []\n): SlashMenuItem[] {\n const ofKind = (kind: SlashItemKind) =>\n filterSkills(\n items.filter((i) => i.kind === kind),\n query,\n pinned\n )\n return [...ofKind('command'), ...ofKind('skill')]\n}\n","/**\n * Generated-document helpers. A generated document names the assistant message that made it\n * (`source_message_ext_id`) and that message's conversation (`conversation_ext_id`, null for\n * uploads). Every edit is a new version of the same document, and each version names the message\n * whose turn made it (and its conversation): none for a person's upload or save.\n */\n\nimport type { components } from '@arbidocs/client'\n\ntype Doc = components['schemas']['DocResponse']\n\ntype LinkedDoc = Pick<\n Doc,\n 'external_id' | 'source_message_ext_id' | 'conversation_ext_id' | 'created_at' | 'updated_at'\n> & {\n versions?: ReadonlyArray<\n Pick<Doc['versions'][number], 'source_message_ext_id' | 'conversation_ext_id'>\n >\n}\n\nconst newestFirst = (a: LinkedDoc, b: LinkedDoc): number =>\n (b.created_at ?? '').localeCompare(a.created_at ?? '')\n\n/**\n * The message that made a document's latest version a thread made (a person's later save does not\n * move it): the newest version naming a message, else the generating message.\n */\nexport function latestThreadVersionMessage(d: LinkedDoc): string | null {\n const named = (d.versions ?? []).filter((v) => v.source_message_ext_id)\n return named.at(-1)?.source_message_ext_id ?? d.source_message_ext_id ?? null\n}\n\n/** The threads a document was made or edited in. */\nfunction threadsOf(d: LinkedDoc): string[] {\n const ids = [d.conversation_ext_id, ...(d.versions ?? []).map((v) => v.conversation_ext_id)]\n return [...new Set(ids.filter((id): id is string => !!id))]\n}\n\n/**\n * Generated documents grouped by the conversations they were made or edited in, newest first.\n * Uploads nobody's thread touched are excluded.\n */\nexport function groupOutputsByConversation<T extends LinkedDoc>(\n docs: readonly T[]\n): Record<string, T[]> {\n const out: Record<string, T[]> = {}\n for (const d of docs) for (const id of threadsOf(d)) (out[id] ??= []).push(d)\n for (const list of Object.values(out)) list.sort(newestFirst)\n return out\n}\n\n/**\n * The document to show under an assistant message: the newest document whose latest thread-made\n * version this message made. A document edited by a later message shows under that later\n * message, so the earlier message no longer matches; a person's own save changes nothing.\n */\nexport function findMessageDocument<T extends LinkedDoc>(\n docs: readonly T[] | undefined,\n messageExtId: string | undefined\n): T | undefined {\n if (!docs || !messageExtId) return undefined\n const matches = docs.filter((d) => latestThreadVersionMessage(d) === messageExtId)\n return matches.sort(newestFirst)[0]\n}\n"]}
1
+ {"version":3,"sources":["../src/chat/participant-tints.ts","../src/chat/flashMessage.ts","../src/chat/DraftingDocChip.tsx","../src/chat/SlashMenu.tsx","../src/chat/ConversationLayout.tsx","../src/chat/BranchControls.tsx","../src/chat/ModelPicker.tsx","../src/chat/ConversationParts.tsx","../src/chat/ThreadMap.tsx","../src/chat/thread-diagram.ts","../src/chat/ThreadVisualizer.tsx","../src/lib/useLongPaste.ts","../src/chat/PendingAnswerBar.tsx","../src/chat/useOpenCitation.ts","../src/chat/useRecipientDraft.ts","../src/chat/message-copy.ts","../src/chat/table-csv.ts","../src/chat/ContextUsageBar.tsx","../src/chat/slash-menu-helpers.ts","../src/chat/generatedDocuments.ts"],"names":["text","jsxs","cn","jsx","PenLine","X","BookOpen","SquareSlash","memo","SlashMenu","useId","useRef","useEffect","testIdOr","prefixedTestId","listOptionId","Globe","Tooltip","TooltipTrigger","Network","TooltipContent","ArrowLeft","ArrowRight","Zap","Glasses","Crown","Sparkles","forwardRef","ModelPickerTrigger","Button","ChevronsUpDown","BlocksTooltipProvider","Popover","PopoverTrigger","PopoverContent","Check","Settings","Plus","Bot","Download","DOMPurify","useMemo","useState","useCallback","MessageCircleQuestion","Clock","Play","Pause","useBlocksEnvironment","hasMessageBody","buildDeepLinkUrl","markdownToPlainTextBlocks","plainText","downloadBlob","getContextUsedPercent","getContextRemainingPercent","filterSkills"],"mappings":"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","file":"chunk-UAMY7KHW.cjs","sourcesContent":["/** Conversation-local colors: callers supply participants in first-post order. */\nconst PARTICIPANT_COLORS = [\n 'blue',\n 'amber',\n 'teal',\n 'violet',\n 'rose',\n 'lime',\n 'sky',\n 'orange',\n 'emerald',\n 'fuchsia',\n 'indigo',\n 'cyan',\n] as const\n\nexport function getParticipantTints(participantIds: readonly string[]): Map<string, string> {\n const tints = new Map<string, string>()\n for (const id of participantIds) {\n if (!id || tints.has(id)) continue\n const color = PARTICIPANT_COLORS[tints.size % PARTICIPANT_COLORS.length]\n tints.set(id, `var(--color-${color}-600)`)\n }\n return tints\n}\n","/**\n * Mark the message a link took the reader to: a brief, gentle highlight on the message itself (on\n * the theme's accent and ring, `[data-deep-link-target]` in `blocks.css`) that fades out and\n * removes itself, so nothing is left tinted afterwards.\n */\nexport function flashMessage(el: Element): void {\n el.removeAttribute('data-deep-link-target')\n // Restart the animation when the same message is flashed again.\n void (el as HTMLElement).offsetWidth\n el.setAttribute('data-deep-link-target', '')\n const clear = () => el.removeAttribute('data-deep-link-target')\n el.addEventListener('animationend', clear, { once: true })\n // Reduced motion runs no animation: clear it after the same time.\n setTimeout(clear, 2000)\n}\n","import { PenLine, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the chip. Pass a partial `labels` to translate or reword. */\nexport interface DraftingDocChipLabels {\n /** `{title}` is the thread's document. */\n drafting: string\n /** What it means, on hover. */\n hint: string\n /** The attach offer in a thread not bound to the open document; `{title}` is its name. */\n attach: string\n /** What attaching does, on hover. */\n attachHint: string\n /** Unbind the thread from its document. */\n detach: string\n /** A thread bound to a document this person cannot open (another member's private document). */\n unavailable: string\n /** What that means, on hover. */\n unavailableHint: string\n}\n\nexport const DEFAULT_DRAFTING_DOC_CHIP_LABELS: DraftingDocChipLabels = {\n drafting: 'Drafting in {title}',\n hint: 'This thread works in the document: ARBI reads what it needs and makes its edits as tracked changes you accept or reject.',\n attach: 'Draft in {title}',\n attachHint:\n 'Attach the open document to this thread: its questions then edit the document as tracked changes. Until then, ARBI only answers.',\n detach: 'Stop drafting in this document',\n unavailable: 'Drafting in a document you cannot open',\n unavailableHint:\n 'This thread is bound to a document you do not have access to. Your questions here only get answers; unbind it to draft in another document.',\n}\n\nexport interface DraftingDocChipProps {\n /** The document's name. */\n title: string\n /**\n * `bound`: the thread drafts in the document (every turn names it). `attach`: the document is\n * open but the thread is not bound to it; clicking binds it (`onAttach`). `unavailable`: the\n * thread is bound to a document this person cannot open (`title` is not shown).\n */\n state?: 'bound' | 'attach' | 'unavailable'\n /** Bind the thread to the open document (the `attach` state). */\n onAttach?: () => void\n /** Unbind the thread (the `bound` state). Absent: not offered. */\n onDetach?: () => void\n className?: string\n labels?: Partial<DraftingDocChipLabels>\n testId?: string\n}\n\nconst CHIP =\n 'flex h-7 min-w-0 max-w-[16rem] items-center gap-1.5 rounded-md border bg-card px-2 text-xs text-muted-foreground'\n\n/**\n * Drafting mode, said in the composer. A thread drafts in a document only when it is bound to it\n * (started from it, attached in it, or made in it): then the chip says so, and the assistant reads\n * the document on demand and edits it granularly as tracked changes, never as a whole document\n * resent each turn (that is what a pin is for). A document merely open beside an unbound thread is\n * offered as an explicit attach: being open never makes a question an edit.\n */\nexport function DraftingDocChip({\n title,\n state = 'bound',\n onAttach,\n onDetach,\n className,\n labels,\n testId = 'drafting-doc-chip',\n}: DraftingDocChipProps) {\n const l = { ...DEFAULT_DRAFTING_DOC_CHIP_LABELS, ...labels }\n if (state === 'attach') {\n const text = l.attach.replace('{title}', title)\n return (\n <button\n type=\"button\"\n onClick={onAttach}\n className={cn(\n CHIP,\n 'border-dashed border-border hover:border-primary/60 hover:text-foreground',\n className\n )}\n title={`${text}. ${l.attachHint}`}\n data-testid={`${testId}-attach`}\n >\n <PenLine className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{text}</span>\n </button>\n )\n }\n const unavailable = state === 'unavailable'\n const text = unavailable ? l.unavailable : l.drafting.replace('{title}', title)\n return (\n <span\n className={cn(CHIP, 'border-border', onDetach && 'pr-0.5', className)}\n title={`${text}. ${unavailable ? l.unavailableHint : l.hint}`}\n data-testid={unavailable ? `${testId}-unavailable` : testId}\n >\n <PenLine\n className={cn('size-3.5 shrink-0', unavailable ? 'text-muted-foreground' : 'text-primary')}\n aria-hidden\n />\n <span className=\"truncate\">{text}</span>\n {onDetach && (\n <button\n type=\"button\"\n onClick={onDetach}\n className=\"flex size-5 shrink-0 items-center justify-center rounded hover:bg-muted hover:text-foreground\"\n aria-label={l.detach}\n title={l.detach}\n data-testid={`${testId}-detach`}\n >\n <X className=\"size-3\" aria-hidden />\n </button>\n )}\n </span>\n )\n}\n","import { memo, useEffect, useId, useRef } from 'react'\nimport { BookOpen, Globe, SquareSlash } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { listOptionId } from '../lib/useListKeyNav'\nimport { prefixedTestId, testIdOr } from './test-id'\n\n/** Which list an entry came from: drives the menu's section grouping. */\nexport type SlashItemKind = 'command' | 'skill'\n\nexport interface SlashMenuItem {\n /** Slug used to invoke the entry (`/<slug>`). */\n name: string\n description?: string\n /** `command` = shipped built-in; `skill` = user-authored. */\n kind: SlashItemKind\n /** Args hint, e.g. `<prompt>`. */\n argHint?: string\n /** Marketplace visibility: drives the \"Global\" affordance. Skills only. */\n visibility?: 'mine' | 'global'\n}\n\n/** Every fixed string of the slash menu. Pass a partial `labels` to translate or reword. */\nexport interface SlashMenuLabels {\n hint: string\n commands: string\n skills: string\n global: string\n globalTitle: string\n /** Accessible name of the list. */\n list: string\n /** Polite count announced as the menu opens or the filter narrows it. */\n resultCount: (count: number) => string\n /** Footer action that opens the skills browser. */\n browse: string\n}\n\nexport const DEFAULT_SLASH_MENU_LABELS: SlashMenuLabels = {\n hint: 'Enter or Tab to insert, Esc to dismiss',\n commands: 'Commands',\n skills: 'Skills',\n global: 'Global',\n globalTitle: 'Shared skill from the marketplace',\n list: 'Commands and skills',\n resultCount: (count) => `${count} ${count === 1 ? 'command' : 'commands'} available`,\n browse: 'Browse skills',\n}\n\nexport interface SlashMenuProps {\n open: boolean\n /** The chat composer sits at the bottom (menu above); a top-of-page ask pill opens below. */\n placement?: 'above' | 'below'\n /** Highlighted row, 0-based over the flat list. */\n selectedIndex: number\n setSelectedIndex: (i: number) => void\n /**\n * Id of the listbox. Take it (and `comboboxProps`) from `useListKeyNav` so the text field's\n * `aria-controls` / `aria-activedescendant` point at this menu.\n */\n listboxId?: string\n /** Filtered list, already ordered commands-then-skills. */\n items: SlashMenuItem[]\n /** Adds a \"Browse skills\" footer that calls this (the host opens its skills browser). */\n onBrowse?: () => void\n onSelect: (item: SlashMenuItem) => void\n className?: string\n labels?: Partial<SlashMenuLabels>\n /** Test id of the menu (default `slash-menu`). */\n testId?: string\n /** Row prefixes (`<prefix>-<kind|name>`); defaults `slash-section` / `slash-item`. */\n testIds?: Partial<Record<'section' | 'item' | 'browse', string>>\n}\n\nfunction SectionIcon({ kind }: { kind: SlashItemKind }) {\n return kind === 'skill' ? (\n <BookOpen className=\"h-3 w-3\" aria-hidden=\"true\" />\n ) : (\n <SquareSlash className=\"h-3 w-3\" aria-hidden=\"true\" />\n )\n}\n\n/**\n * Slash-command autocomplete that floats over a text field. Presentational: the host owns the\n * filter, the highlighted index (see `useListKeyNav`) and what selecting an item does.\n */\nexport const SlashMenu = memo(function SlashMenu({\n open,\n placement = 'above',\n selectedIndex,\n setSelectedIndex,\n listboxId: listboxIdProp,\n items,\n onBrowse,\n onSelect,\n className,\n labels,\n testId,\n testIds,\n}: SlashMenuProps) {\n const l = { ...DEFAULT_SLASH_MENU_LABELS, ...labels }\n const ownId = useId()\n const listboxId = listboxIdProp ?? ownId\n // Keep the keyboard-highlighted row visible. Rows are split across per-section lists, so the\n // flat `data-slash-index` is the stable handle.\n const scrollRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!open) return\n const el = scrollRef.current?.querySelector<HTMLElement>(\n `[data-slash-index=\"${selectedIndex}\"]`\n )\n // jsdom has no scrollIntoView.\n el?.scrollIntoView?.({ block: 'nearest' })\n }, [open, selectedIndex])\n\n if (!open || items.length === 0) return null\n\n let offset = 0\n const SECTIONS: ReadonlyArray<{ kind: SlashItemKind; label: string }> = [\n { kind: 'command', label: l.commands },\n { kind: 'skill', label: l.skills },\n ]\n const sections = SECTIONS.map(({ kind, label }) => {\n const rows = items.filter((i) => i.kind === kind)\n const section = { kind, label, rows, offset }\n offset += rows.length\n return section\n }).filter((s) => s.rows.length > 0)\n\n return (\n <div\n data-slot=\"slash-menu\"\n className={cn(\n 'absolute left-0 right-0 z-30 max-h-64 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-lg',\n placement === 'above' ? 'bottom-full mb-2' : 'top-full mt-2',\n className\n )}\n // mousedown would blur the textarea (closing the menu before the click lands).\n onMouseDown={(e) => e.preventDefault()}\n data-testid={testIdOr(testId, { testId: 'slash-menu' })}\n >\n <div className=\"border-b border-border/50 px-3 py-1.5 text-xs text-muted-foreground\">\n {l.hint}\n </div>\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {l.resultCount(items.length)}\n </div>\n <div\n ref={scrollRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={l.list}\n className=\"scrollbar-subtle max-h-56 overflow-y-auto py-1\"\n >\n {sections.map((section) => (\n <div\n key={section.kind}\n role=\"group\"\n aria-labelledby={`${listboxId}-section-${section.kind}`}\n >\n <div\n id={`${listboxId}-section-${section.kind}`}\n className=\"flex items-center gap-1.5 px-3 pb-1 pt-1.5 text-xs font-medium text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.section, section.kind, {\n testId: `slash-section-${section.kind}`,\n })}\n >\n <SectionIcon kind={section.kind} />\n <span>{section.label}</span>\n </div>\n {section.rows.map((item, idx) => {\n const flatIndex = section.offset + idx\n const isActive = flatIndex === selectedIndex\n return (\n <div\n key={item.name}\n id={listOptionId(listboxId, flatIndex)}\n role=\"option\"\n aria-selected={isActive}\n data-slash-index={flatIndex}\n className={cn(\n 'flex cursor-pointer items-baseline gap-2 px-3 py-1.5 text-sm pointer-coarse:min-h-11 pointer-coarse:items-center',\n isActive ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/50'\n )}\n onMouseEnter={() => setSelectedIndex(flatIndex)}\n onClick={() => onSelect(item)}\n data-testid={prefixedTestId(testIds?.item, item.name, {\n testId: `slash-item-${item.name}`,\n })}\n >\n <span className=\"shrink-0 font-mono text-foreground\">/{item.name}</span>\n {item.argHint && (\n <span className=\"shrink-0 font-mono text-xs text-muted-foreground\">\n {item.argHint}\n </span>\n )}\n {item.description && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n {item.visibility === 'global' && (\n <span\n className=\"ml-auto inline-flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n title={l.globalTitle}\n >\n <Globe className=\"h-3 w-3\" />\n {l.global}\n </span>\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n {onBrowse && (\n <button\n type=\"button\"\n onClick={onBrowse}\n 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\"\n data-testid={testIdOr(testIds?.browse, { testId: 'slash-browse-skills' })}\n >\n <BookOpen className=\"h-3 w-3\" aria-hidden=\"true\" />\n {l.browse}\n </button>\n )}\n </div>\n )\n})\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the conversation layout. Pass a partial `labels` to reword. */\nexport interface ConversationLayoutLabels {\n loadingMessages: string\n}\n\nexport const DEFAULT_CONVERSATION_LAYOUT_LABELS: ConversationLayoutLabels = {\n loadingMessages: 'Loading messages...',\n}\n\n/**\n * Page frame of a conversation. The chat scroll surface belongs to the HOST (the outer\n * `[data-scroll-container]`), so this column must GROW with its content, not stay\n * viewport-capped: the sticky header and the sticky composer dock need a containing block that\n * spans the whole thread, otherwise `position: sticky` is clamped to one screen and both unpin.\n *\n * Do NOT put `overflow: clip/hidden`, `transform`, `filter`, `will-change` or `contain` on\n * {@link ConversationBody}: `overflow: clip` collapses the scrollHeight so the thread cannot\n * scroll, and a transform creates a containing block that breaks the dock's `bottom: 0`.\n */\nexport function ConversationRoot({\n className,\n children,\n testId = 'conversation',\n ...rest\n}: HTMLAttributes<HTMLDivElement> & { testId?: string }) {\n return (\n <div\n data-slot=\"conversation\"\n className={cn('flex min-h-full shrink-0 flex-col', className)}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** Sticky strip at the top (tabs and their actions). */\nexport function ConversationHeader({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"conversation-header\"\n className={cn('sticky top-0 z-10 bg-background', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** Grows (never shrinks) to the thread's full height so the sticky dock spans the scroll range. */\nexport function ConversationBody({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n data-slot=\"conversation-body\"\n className={cn('flex flex-[1_0_auto] flex-col', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/** The thread (or its empty / loading state). `relative` so absolutely-filled states fit. */\nexport function ConversationMain({ className, children, ...rest }: HTMLAttributes<HTMLElement>) {\n return (\n <main\n data-slot=\"conversation-main\"\n className={cn('relative flex flex-[1_0_auto] flex-col', className)}\n {...rest}\n >\n {children}\n </main>\n )\n}\n\n/** Centered status while the thread loads. */\nexport function ConversationLoading({\n children,\n labels,\n className,\n testId = 'loading-messages',\n}: {\n /** Text; wins over `labels.loadingMessages`. */\n children?: ReactNode\n labels?: Partial<ConversationLayoutLabels>\n className?: string\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_LAYOUT_LABELS, ...labels }\n return (\n <div className={cn('flex h-64 items-center justify-center', className)} data-testid={testId}>\n <p className=\"text-muted-foreground\">{children ?? l.loadingMessages}</p>\n </div>\n )\n}\n\nexport const Conversation = {\n Root: ConversationRoot,\n Header: ConversationHeader,\n Body: ConversationBody,\n Main: ConversationMain,\n Loading: ConversationLoading,\n}\n","import { ArrowLeft, ArrowRight, Network } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n/** Every fixed string of the branch controls. Pass a partial `labels` to translate or reword. */\nexport interface BranchControlsLabels {\n /** \"Branch 2 of 3\" (1-based `current`). */\n branchOf: (current: number, total: number) => string\n previewHint: string\n previousBranch: string\n nextBranch: string\n}\n\nexport const DEFAULT_BRANCH_CONTROLS_LABELS: BranchControlsLabels = {\n branchOf: (current, total) => `Branch ${current} of ${total}`,\n previewHint: 'Click for side-by-side view',\n previousBranch: 'Previous branch',\n nextBranch: 'Next branch',\n}\n\nexport interface BranchControlsProps {\n /** 0-based index of the active branch. */\n index: number\n /** Number of branches at this fork; nothing renders when there is only one. */\n count: number\n onSwitch: (targetIndex: number) => void\n /** Makes the label a button that opens the side-by-side view. */\n onPreview?: () => void\n /** Tooltip of the preview button; wins over `labels.previewHint`. */\n previewHint?: string\n className?: string\n labels?: Partial<BranchControlsLabels>\n /** Per-part test ids; defaults are the current ids. */\n testIds?: Partial<{\n root: string\n preview: string\n icon: string\n indicator: string\n previous: string\n next: string\n }>\n}\n\nconst ARROW =\n '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'\n\n/** \"Branch 2 of 3\" with previous/next arrows at a fork in the conversation. */\nexport function BranchControls({\n index,\n count,\n onSwitch,\n onPreview,\n previewHint,\n className,\n labels,\n testIds,\n}: BranchControlsProps) {\n if (count <= 1) return null\n const l = { ...DEFAULT_BRANCH_CONTROLS_LABELS, ...labels }\n const label = l.branchOf(index + 1, count)\n const rootTestId = testIdOr(testIds?.root, { testId: 'branch-controls' })\n const previewTestId = testIdOr(testIds?.preview, { testId: 'threads-preview-button' })\n const iconTestId = testIdOr(testIds?.icon, { testId: 'branch-icon' })\n const indicatorTestId = testIdOr(testIds?.indicator, { testId: 'branch-indicator' })\n const previousTestId = testIdOr(testIds?.previous, { testId: 'previous-branch-button' })\n const nextTestId = testIdOr(testIds?.next, { testId: 'next-branch-button' })\n\n return (\n <div\n data-slot=\"branch-controls\"\n className={cn('branch-controls flex items-center gap-1', className)}\n data-testid={rootTestId}\n >\n {onPreview ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onPreview}\n 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\"\n data-testid={previewTestId}\n >\n <Network size={12} className=\"text-primary\" data-testid={iconTestId} />\n <span\n className=\"text-sm font-medium text-muted-foreground\"\n data-testid={indicatorTestId}\n >\n {label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{previewHint ?? l.previewHint}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n <span\n className=\"flex items-center gap-1 px-2 py-1 text-sm font-medium text-muted-foreground\"\n data-testid={indicatorTestId}\n >\n <Network size={12} className=\"text-primary\" data-testid={iconTestId} />\n {label}\n </span>\n )}\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => onSwitch(index - 1)}\n disabled={index <= 0}\n className={ARROW}\n title={l.previousBranch}\n aria-label={l.previousBranch}\n data-testid={previousTestId}\n >\n <ArrowLeft size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => onSwitch(index + 1)}\n disabled={index >= count - 1}\n className={ARROW}\n title={l.nextBranch}\n aria-label={l.nextBranch}\n data-testid={nextTestId}\n >\n <ArrowRight size={12} />\n </button>\n </div>\n </div>\n )\n}\n","import { forwardRef } from 'react'\nimport type { ComponentType, ReactNode } from 'react'\nimport { Check, ChevronsUpDown, Crown, Glasses, Settings, Sparkles, Zap } from 'lucide-react'\nimport {\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\n\n// ── Icons ───────────────────────────────────────────────────────────────────────────────────\n\nexport type ModelTierKind = 'standard' | 'wise' | 'premium'\n\nconst TIER_ICON: Record<ModelTierKind, ComponentType<{ className?: string }>> = {\n standard: Zap,\n wise: Glasses,\n premium: Crown,\n}\n\nconst TIER_TONE: Record<ModelTierKind, string> = {\n standard: 'text-secondary fill-secondary',\n wise: 'text-secondary fill-secondary',\n premium: 'text-yellow-text fill-yellow-text',\n}\n\nexport interface ModelTierIconProps {\n tier: ModelTierKind\n /** Agentic mode off: the tier glyph is greyed. */\n isGreyed?: boolean\n className?: string\n}\n\n/** The glyph of a model tier (Fast/Standard bolt, Wise glasses, Premium crown). */\nexport function ModelTierIcon({ tier, isGreyed, className }: ModelTierIconProps) {\n const Icon = TIER_ICON[tier]\n return (\n <Icon\n className={cn(\n 'size-3.5 shrink-0',\n isGreyed ? 'fill-muted-foreground text-muted-foreground' : TIER_TONE[tier],\n className\n )}\n />\n )\n}\n\n/** The Autoselect sparkle. */\nexport function ModelAutoIcon({ className }: { className?: string }) {\n return <Sparkles className={cn('size-3.5 shrink-0 fill-secondary text-secondary', className)} />\n}\n\n/** Neutral status dot for models with no tier glyph. */\nexport function ModelDot({ isGreyed }: { isGreyed?: boolean }) {\n return (\n <div\n className={cn(\n 'size-2 shrink-0 rounded-full',\n isGreyed ? 'bg-muted-foreground' : 'bg-primary'\n )}\n />\n )\n}\n\n/** Label + icon content shared by menu rows and select items. */\nexport function ModelOptionLabel({ icon, label }: { icon: ReactNode; label: ReactNode }) {\n return (\n <div className=\"flex w-full items-center gap-2\">\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </div>\n )\n}\n\n// ── Trigger ─────────────────────────────────────────────────────────────────────────────────\n\nexport interface ModelTriggerContentProps {\n icon?: ReactNode\n label: ReactNode\n}\n\n/** Icon + truncated label (used inside the compact trigger and the select trigger). */\nexport function ModelTriggerContent({ icon, label }: ModelTriggerContentProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-1.5\">\n {icon}\n <span className=\"truncate\">{label}</span>\n </div>\n )\n}\n\nexport interface ModelPickerTriggerProps extends ModelTriggerContentProps {\n /** Spoken before the current model, so the button reads \"Model: Autoselect\". Default \"Model\". */\n nameLabel?: string\n className?: string\n testId?: string\n}\n\n/** The compact picker button (ghost, with a chevron). Forwards its ref for popover/tooltip triggers. */\nexport const ModelPickerTrigger = forwardRef<HTMLButtonElement, ModelPickerTriggerProps>(\n function ModelPickerTrigger(\n { icon, label, nameLabel = 'Model', className, testId = 'model-selector-compact', ...rest },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n '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',\n className\n )}\n aria-label={typeof label === 'string' ? `${nameLabel}: ${label}` : undefined}\n data-slot=\"model-picker-trigger\"\n data-testid={testId}\n {...rest}\n >\n <ModelTriggerContent icon={icon} label={label} />\n <ChevronsUpDown className=\"size-3 shrink-0 text-muted-foreground\" />\n </Button>\n )\n }\n)\n\n// ── Popover + menu ──────────────────────────────────────────────────────────────────────────\n\nexport interface ModelPickerPopoverProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The trigger (a ModelPickerTrigger). */\n trigger: ReactNode\n /** Hover tooltip on the trigger (hidden while open). */\n tooltip?: ReactNode\n title?: string\n /** The menu rows. */\n children: ReactNode\n}\n\n/** Popover shell: trigger + tooltip + titled, scrolling list. */\nexport function ModelPickerPopover({\n open,\n onOpenChange,\n trigger,\n tooltip,\n title = 'Select AI Model',\n children,\n}: ModelPickerPopoverProps) {\n return (\n <BlocksTooltipProvider>\n <Popover open={open} onOpenChange={onOpenChange}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n </TooltipTrigger>\n {tooltip && !open && <TooltipContent side=\"top\">{tooltip}</TooltipContent>}\n </Tooltip>\n <PopoverContent side=\"top\" align=\"start\" className=\"w-[280px] p-1\" sideOffset={8}>\n <div className=\"px-2 py-1.5 text-sm font-medium text-muted-foreground\">{title}</div>\n <div className=\"flex max-h-[280px] flex-col gap-0.5 overflow-y-auto\">{children}</div>\n </PopoverContent>\n </Popover>\n </BlocksTooltipProvider>\n )\n}\n\nexport function ModelMenuDivider() {\n return <div className=\"my-0.5 border-t border-border\" role=\"separator\" />\n}\n\nexport function ModelMenuMessage({ children }: { children: ReactNode }) {\n return <div className=\"px-2 py-1.5 text-sm text-muted-foreground\">{children}</div>\n}\n\nexport interface ModelOptionProps {\n icon: ReactNode\n label: ReactNode\n isSelected: boolean\n onSelect: () => void\n testId: string\n /** Tier rows mark selection with a primary left edge and bold label. */\n emphasis?: 'plain' | 'tier'\n}\n\n/** One selectable model row. */\nexport function ModelOption({\n icon,\n label,\n isSelected,\n onSelect,\n testId,\n emphasis = 'plain',\n}: ModelOptionProps) {\n return (\n <button\n type=\"button\"\n onClick={onSelect}\n className={cn(\n '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',\n emphasis === 'tier' && 'border-l-4',\n emphasis === 'tier' && (isSelected ? 'border-l-primary' : 'border-l-transparent'),\n isSelected && 'bg-accent'\n )}\n aria-pressed={isSelected}\n data-slot=\"model-option\"\n data-testid={testId}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n emphasis === 'tier' &&\n (isSelected ? 'font-semibold text-foreground' : 'font-medium text-muted-foreground')\n )}\n >\n {label}\n </span>\n {isSelected && <Check className=\"size-3 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ModelTierOptionProps {\n icon: ReactNode\n label: ReactNode\n isSelected: boolean\n /** The tier is switched off in settings: shown dimmed and not selectable. */\n isDisabled?: boolean\n onSelect: () => void\n /** Trailing control (the configure cog). */\n action?: ReactNode\n testId: string\n}\n\n/** A tier row with a trailing action (Premium + configure cog). */\nexport function ModelTierOption({\n icon,\n label,\n isSelected,\n isDisabled,\n onSelect,\n action,\n testId,\n}: ModelTierOptionProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1 rounded-sm border-l-4 pr-1 transition-colors',\n isSelected ? 'border-l-primary bg-accent' : 'border-l-transparent'\n )}\n data-slot=\"model-tier-option\"\n >\n <button\n type=\"button\"\n onClick={() => {\n if (!isDisabled) onSelect()\n }}\n disabled={isDisabled}\n className={cn(\n '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',\n isDisabled ? 'cursor-not-allowed opacity-50' : 'hover:bg-accent'\n )}\n data-testid={testId}\n >\n {icon}\n <span\n className={cn(\n 'min-w-0 flex-1 truncate',\n isSelected ? 'font-semibold text-foreground' : 'font-medium text-muted-foreground'\n )}\n >\n {label}\n </span>\n </button>\n {action}\n </div>\n )\n}\n\nexport interface ModelConfigureButtonProps {\n onClick: () => void\n /** Accessible name. */\n label: string\n /** Tooltip text. */\n tooltip: string\n testId?: string\n}\n\n/** Small bordered cog beside a tier row. */\nexport function ModelConfigureButton({\n onClick,\n label,\n tooltip,\n testId,\n}: ModelConfigureButtonProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n 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\"\n data-testid={testId}\n aria-label={label}\n >\n <Settings className=\"size-4\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{tooltip}</TooltipContent>\n </Tooltip>\n )\n}\n\n/** Every fixed string of the pricing tip. Pass a partial `labels` to translate or reword. */\nexport interface ModelPricingTipLabels {\n input: (price: string) => string\n output: (price: string) => string\n}\n\nexport const DEFAULT_MODEL_PRICING_TIP_LABELS: ModelPricingTipLabels = {\n input: (price) => `Input: ${price} / M tokens`,\n output: (price) => `Output: ${price} / M tokens`,\n}\n\nexport interface ModelPricingTipProps {\n modelName: string\n /** £ per million tokens, formatted (\"£2.50\"). */\n inputPrice?: string | null\n outputPrice?: string | null\n labels?: Partial<ModelPricingTipLabels>\n}\n\n/** Tooltip body: model name and per-million-token £ prices. */\nexport function ModelPricingTip({\n modelName,\n inputPrice,\n outputPrice,\n labels,\n}: ModelPricingTipProps) {\n const l = { ...DEFAULT_MODEL_PRICING_TIP_LABELS, ...labels }\n return (\n <div className=\"space-y-1 text-sm\">\n <div className=\"font-medium\">{modelName}</div>\n {inputPrice && <div>{l.input(inputPrice)}</div>}\n {outputPrice && <div>{l.output(outputPrice)}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Bot, Plus, Settings } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from './test-id'\n\n// ── Header actions ──────────────────────────────────────────────────────────────────────────\n\n/** Right side of the conversation tab strip. */\nexport function ConversationHeaderActions({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('flex items-center gap-2', className)}\n data-slot=\"conversation-header-actions\"\n >\n {children}\n </div>\n )\n}\n\n/** Every fixed string of the conversation parts. Pass a partial `labels` to a part to reword. */\nexport interface ConversationPartsLabels {\n /** \"New Chat\": `entityLabel` is the host's noun. */\n newEntity: (entityLabel: string) => string\n newPaChatTitle: string\n newPaChat: string\n paModeTitle: string\n pa: string\n}\n\nexport const DEFAULT_CONVERSATION_PARTS_LABELS: ConversationPartsLabels = {\n newEntity: (entityLabel) => `New ${entityLabel}`,\n newPaChatTitle: 'Start a new Personal Assistant chat',\n newPaChat: 'New PA Chat',\n paModeTitle: 'Personal Assistant mode',\n pa: 'PA',\n}\n\nexport interface NewChatButtonProps {\n /** Entity label, e.g. \"Chat\": names the button (\"New Chat\"). */\n entityLabel: string\n /** Narrow header: icon only. */\n isCompact: boolean\n onClick: () => void\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}\n\n/** \"+ New Chat\". */\nexport function NewChatButton({\n entityLabel,\n isCompact,\n onClick,\n labels,\n testId = 'new-conversation-button',\n}: NewChatButtonProps) {\n const text = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }.newEntity(entityLabel)\n return (\n <button\n type=\"button\"\n onClick={onClick}\n 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\"\n data-testid={testId}\n aria-label={text}\n title={text}\n >\n <Plus className=\"size-4 shrink-0\" />\n {!isCompact && <span>{text}</span>}\n </button>\n )\n}\n\n/** Starts a Personal Assistant conversation (experimental). */\nexport function NewPaChatButton({\n isCompact,\n onClick,\n labels,\n testId = 'new-pa-conversation-button',\n}: {\n isCompact: boolean\n onClick: () => void\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={onClick}\n className={cn(\n 'pointer-coarse:min-h-11',\n isCompact ? 'flex items-center' : 'flex w-auto items-center gap-2 px-4'\n )}\n data-testid={testId}\n title={l.newPaChatTitle}\n >\n <Bot className=\"size-4\" />\n {!isCompact && <span>{l.newPaChat}</span>}\n </Button>\n )\n}\n\n// ── Composer slots ──────────────────────────────────────────────────────────────────────────\n\n/** Left of the composer toolbar: borderless, muted buttons (files, facts). */\nexport function ComposerAccessories({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <span\n className={cn(\n 'flex items-center gap-1 [&_button]:border-transparent [&_button]:bg-transparent [&_button]:text-muted-foreground pointer-coarse:[&_button]:h-11',\n className\n )}\n data-slot=\"composer-accessories\"\n >\n {children}\n </span>\n )\n}\n\n/** Right of the composer toolbar: tools (settings, mic) around the send button. */\nexport function ComposerTools({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn(\n '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',\n className\n )}\n data-slot=\"composer-tools\"\n >\n {children}\n </div>\n )\n}\n\n/** Personal Assistant mode marker in place of the accessories. */\nexport function PaModeBadge({\n icon,\n labels,\n testId = 'pa-mode-indicator',\n}: {\n icon: ReactNode\n labels?: Partial<ConversationPartsLabels>\n testId?: string\n}) {\n const l = { ...DEFAULT_CONVERSATION_PARTS_LABELS, ...labels }\n return (\n <div\n className=\"flex h-8 shrink-0 items-center gap-1.5 rounded-md px-2.5 text-yellow-text\"\n title={l.paModeTitle}\n data-testid={testId}\n >\n {icon}\n <span className=\"text-sm font-semibold\">{l.pa}</span>\n </div>\n )\n}\n\n/** Icon-only gear for the conversation's settings (developers). */\nexport function ConversationSettingsButton({\n label,\n onClick,\n testId = 'conversation-settings-button',\n}: {\n /** e.g. \"Chat Settings\". */\n label: string\n onClick: () => void\n testId?: string\n}) {\n return (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className=\"size-8 shrink-0 text-muted-foreground pointer-coarse:size-11\"\n onClick={onClick}\n title={label}\n aria-label={label}\n data-testid={testId}\n >\n <Settings className=\"size-4\" />\n </Button>\n )\n}\n\n/** The history (list) view area when no chat tab is active. */\nexport function ConversationHistoryPane({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return <div className={cn('min-h-0 flex-1 overflow-hidden', className)}>{children}</div>\n}\n","import { useMemo, type ReactNode, type Ref } from 'react'\nimport DOMPurify from 'dompurify'\nimport { Download } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the thread map parts. Pass a partial `labels` to a part to reword. */\nexport interface ThreadMapLabels {\n saveSvgTitle: string\n saveSvg: string\n generating: string\n /** \"Error rendering diagram: <message>\". */\n renderError: (message: string) => string\n}\n\nexport const DEFAULT_THREAD_MAP_LABELS: ThreadMapLabels = {\n saveSvgTitle: 'Save SVG as file',\n saveSvg: 'Save SVG',\n generating: 'Generating visualization...',\n renderError: (message) => `Error rendering diagram: ${message}`,\n}\n\nexport interface ThreadMapProps {\n /** Hint line above the map; omit to hide the header. */\n hint?: string\n /** Offer \"Save SVG\" (only once there is a diagram). */\n onSave?: () => void\n /** The map body (ThreadMapLoading / ThreadMapError / ThreadMapDiagram). */\n children: ReactNode\n className?: string\n labels?: Partial<ThreadMapLabels>\n testId?: string\n}\n\n/** The conversation-thread map: hint + save header over a scrolling canvas. */\nexport function ThreadMap({\n hint,\n onSave,\n children,\n className,\n labels,\n testId = 'thread-visualizer',\n}: ThreadMapProps) {\n const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels }\n return (\n <div\n className={cn('thread-visualizer flex h-full w-full flex-col', className)}\n data-slot=\"thread-map\"\n data-testid={testId}\n >\n {hint !== undefined && (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-sm italic text-muted-foreground\">{hint}</div>\n {onSave && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onSave}\n title={l.saveSvgTitle}\n className=\"shrink-0 pointer-coarse:min-h-11\"\n >\n <Download className=\"size-3\" />\n {l.saveSvg}\n </Button>\n )}\n </div>\n )}\n <div\n className=\"mermaid-container w-full flex-1 overflow-auto rounded-lg bg-muted\"\n style={{ scrollBehavior: 'auto', contain: 'layout style' }}\n onScroll={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n </div>\n )\n}\n\nexport function ThreadMapLoading({\n label,\n labels,\n}: {\n /** Text; wins over `labels.generating`. */\n label?: string\n labels?: Partial<ThreadMapLabels>\n}) {\n const text = label ?? { ...DEFAULT_THREAD_MAP_LABELS, ...labels }.generating\n return (\n <div className=\"flex h-24 items-center justify-center text-muted-foreground\" role=\"status\">\n <div className=\"flex flex-col items-center\">\n <svg\n className=\"-ml-1 mr-3 size-5 animate-spin text-primary\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n 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\"\n />\n </svg>\n <span>{text}</span>\n </div>\n </div>\n )\n}\n\nexport function ThreadMapError({\n message,\n labels,\n}: {\n message: string\n labels?: Partial<ThreadMapLabels>\n}) {\n const l = { ...DEFAULT_THREAD_MAP_LABELS, ...labels }\n return (\n <div className=\"p-4 text-red-text\" role=\"alert\">\n {l.renderError(message)}\n </div>\n )\n}\n\nexport interface ThreadMapDiagramProps {\n /**\n * Rendered SVG markup. Sanitised here (DOMPurify, SVG + HTML-label profile) before it is\n * injected: blocks cannot know whether the host's renderer ran in a strict security mode.\n */\n svg: string\n diagramRef?: Ref<HTMLDivElement>\n /** Accessible name of the diagram (default \"Conversation thread map\"). */\n label?: string\n}\n\n/** Strip scripts, event handlers and script URLs while keeping mermaid's `foreignObject` labels. */\nexport function sanitizeDiagramSvg(svg: string): string {\n // Without a DOM (SSR) DOMPurify cannot sanitise and would hand the input back: render nothing.\n if (!DOMPurify.isSupported) return ''\n return DOMPurify.sanitize(svg, {\n USE_PROFILES: { svg: true, svgFilters: true, html: true },\n ADD_TAGS: ['foreignobject'],\n HTML_INTEGRATION_POINTS: { foreignobject: true },\n ADD_ATTR: ['target'],\n })\n}\n\nexport function ThreadMapDiagram({\n svg,\n diagramRef,\n label = 'Conversation thread map',\n}: ThreadMapDiagramProps) {\n const safeSvg = useMemo(() => sanitizeDiagramSvg(svg), [svg])\n return (\n <div\n ref={diagramRef}\n className=\"p-4\"\n role=\"img\"\n aria-label={label}\n data-slot=\"thread-map-diagram\"\n dangerouslySetInnerHTML={{ __html: safeSvg }}\n />\n )\n}\n","/**\n * Pure helpers for the thread map: build the Mermaid flowchart of a conversation's threads, and\n * resolve which thread a clicked node should open.\n *\n * A Thread is `{ leaf_message_ext_id, history }`; threads may share history up to a branch point.\n */\n\n/** The message fields the map reads (an ARBI `MessageResponse` fits). */\nexport interface ThreadDiagramMessage {\n external_id?: string | null\n parent_message_ext_id?: string | null\n is_branch_point?: boolean | null\n role: string\n content?: string | null\n}\n\n/** One thread: the leaf message and the history leading to it (an ARBI `Thread` fits). */\nexport interface ThreadDiagramThread {\n leaf_message_ext_id: string\n history: ThreadDiagramMessage[]\n}\n\n/** Node colours, matching the message bubbles (Tailwind slate). */\nconst DIAGRAM_COLORS = {\n userBg: '#f1f5f9', // slate-100\n assistantBg: '#ffffff',\n stroke: '#cbd5e1', // slate-300\n strokeLight: '#e2e8f0', // slate-200\n text: '#334155', // slate-700\n}\n\n/** Escape the characters that break Mermaid label syntax. */\nfunction escapeLabel(text: string): string {\n return text\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\[/g, '&#91;')\n .replace(/\\]/g, '&#93;')\n .replace(/\\(/g, '&#40;')\n .replace(/\\)/g, '&#41;')\n .replace(/\\{/g, '&#123;')\n .replace(/\\}/g, '&#125;')\n}\n\n/** Mermaid `graph TD` source for the threads, or null while there is nothing to draw. */\nexport function buildThreadDiagram(threads: ThreadDiagramThread[]): string | null {\n if (!threads || threads.length === 0) return null\n\n // Store all messages first so they are available for parent-child mapping.\n const allMessages = new Map<string, ThreadDiagramMessage>()\n threads.forEach((thread) => {\n thread.history.forEach((message) => {\n allMessages.set(message.external_id!, message)\n })\n })\n\n // Parent-child relationships, with fallbacks: every message but the first should have a parent.\n const parentToChildren = new Map<string | null, Set<string>>()\n threads.forEach((thread) => {\n thread.history.forEach((message, index) => {\n const messageId = message.external_id!\n let parentId = message.parent_message_ext_id\n\n if (!parentId && index > 0) {\n parentId = thread.history[index - 1].external_id!\n console.warn(\n `ThreadVisualizer: Message ${messageId} (${message.role}) missing parent_message_ext_id. Inferred parent: ${parentId}`\n )\n } else if (!parentId) {\n parentId = null\n }\n\n if (parentId && !allMessages.has(parentId)) {\n if (index > 0) {\n const fallbackParentId = thread.history[index - 1].external_id!\n console.warn(\n `ThreadVisualizer: Message ${messageId} has invalid parent ${parentId}. Using fallback: ${fallbackParentId}`\n )\n parentId = fallbackParentId\n } else {\n console.warn(\n `ThreadVisualizer: Message ${messageId} has invalid parent ${parentId} and no fallback. Using root.`\n )\n parentId = null\n }\n }\n\n if (!parentToChildren.has(parentId)) parentToChildren.set(parentId, new Set())\n parentToChildren.get(parentId)?.add(messageId)\n })\n })\n\n // Branch points: messages with several children, or explicitly marked.\n const branchPoints = new Set<string>()\n parentToChildren.forEach((children, parentId) => {\n if (children.size > 1 && parentId) branchPoints.add(parentId)\n })\n allMessages.forEach((message, id) => {\n if (message.is_branch_point) branchPoints.add(id)\n })\n\n const leafNodes = new Set(threads.map((thread) => thread.leaf_message_ext_id))\n\n let diagram = 'graph TD\\n'\n // Match the message bubble colours, with a consistent font size.\n diagram += ` classDef user fill:${DIAGRAM_COLORS.userBg},stroke:${DIAGRAM_COLORS.stroke},color:${DIAGRAM_COLORS.text},stroke-width:1px,font-size:12px\\n`\n diagram += ` classDef assistant fill:${DIAGRAM_COLORS.assistantBg},stroke:${DIAGRAM_COLORS.strokeLight},color:${DIAGRAM_COLORS.text},stroke-width:1px,font-size:12px\\n`\n diagram += ` linkStyle default stroke:${DIAGRAM_COLORS.stroke},stroke-width:1px\\n`\n\n allMessages.forEach((message, id) => {\n // Plain text for a cleaner node: strip markdown, flatten line breaks, cap at 180 chars.\n const plain = (message.content || '').replace(/[*_~`#]/g, '')\n const shortened = plain.substring(0, 180).replace(/\\n/g, ' ')\n const content = escapeLabel(shortened) + (shortened.length < plain.length ? '...' : '')\n\n let label = `${message.role === 'user' ? 'User' : 'Assistant'}: ${content}`\n if (branchPoints.has(id)) label = `${label} 🔀`\n if (leafNodes.has(id)) label = `${label} 🏁`\n\n diagram += ` ${id}[\"${label}\"]\\n`\n diagram += ` class ${id} ${message.role === 'user' ? 'user' : 'assistant'}\\n`\n })\n\n // Edges only between parent and child (no root/start node).\n parentToChildren.forEach((children, parentId) => {\n children.forEach((childId) => {\n if (parentId) diagram += ` ${parentId} --> ${childId}\\n`\n })\n })\n\n return diagram\n}\n\n/**\n * The thread to open for a clicked flowchart node: the thread ending at that message if there is\n * one, otherwise the first thread containing it. Mermaid names a node's element\n * `{diagram id}-flowchart-{message id}-{n}` (Mermaid 11 prefixes the id of the render; older\n * versions wrote `flowchart-{message id}-{n}`).\n */\nexport function threadForNode(threads: ThreadDiagramThread[], nodeId: string): string | null {\n const messageId = /(?:^|-)flowchart-(.+)-\\d+$/.exec(nodeId)?.[1]\n if (!messageId) return null\n if (threads.some((thread) => thread.leaf_message_ext_id === messageId)) return messageId\n const containing = threads.find((thread) =>\n thread.history.some((msg) => msg.external_id === messageId)\n )\n return containing ? containing.leaf_message_ext_id : null\n}\n","/**\n * ThreadVisualizer: renders a conversation's threads as a Mermaid flowchart (message\n * relationships, branch points, thread paths) inside the ThreadMap parts. The diagram source is\n * built by `thread-diagram.ts`; node clicks open the thread through `switchToThread`.\n *\n * Mermaid is an optional peer, imported on first render, so it stays out of every bundle that\n * never shows the map.\n */\n\nimport { memo, useEffect, useMemo, useRef, useState, useCallback } from 'react'\nimport { ThreadMap, ThreadMapDiagram, ThreadMapError, ThreadMapLoading } from './ThreadMap'\nimport { buildThreadDiagram, threadForNode, type ThreadDiagramThread } from './thread-diagram'\n\n/** The hint above the map. */\nexport interface ThreadVisualizerLabels {\n hint: string\n /** Shown instead of `hint` when there are more than five threads. */\n hintMany: string\n}\n\nexport const DEFAULT_THREAD_VISUALIZER_LABELS: ThreadVisualizerLabels = {\n hint: 'Click on a message to resume conversation thread.',\n hintMany: 'This conversation has many threads. Click on a message to resume conversation thread.',\n}\n\nexport interface ThreadVisualizerProps {\n threads: ThreadDiagramThread[]\n /** Open a thread, by its leaf message id. */\n switchToThread: (threadId: string) => void\n showHeader?: boolean\n showDownloadButton?: boolean\n className?: string\n labels?: Partial<ThreadVisualizerLabels>\n}\n\n// Lazily loaded mermaid instance, initialized once on first use.\nlet mermaidInitialized = false\nlet mermaidModule: typeof import('mermaid').default | null = null\n\nasync function getMermaid(): Promise<typeof import('mermaid').default> {\n if (!mermaidModule) {\n mermaidModule = (await import('mermaid')).default\n }\n if (!mermaidInitialized) {\n try {\n mermaidModule.initialize({\n startOnLoad: false,\n flowchart: { useMaxWidth: true, curve: 'basis' },\n securityLevel: 'loose', // Required for click interactivity\n })\n mermaidInitialized = true\n } catch (error) {\n console.error('Error initializing Mermaid:', error)\n }\n }\n return mermaidModule\n}\n\nfunction ThreadVisualizerView({\n threads,\n switchToThread,\n showHeader = true,\n showDownloadButton = true,\n className,\n labels,\n}: ThreadVisualizerProps) {\n const svgContainerRef = useRef<HTMLDivElement>(null)\n const [isRendering, setIsRendering] = useState(true)\n const [renderError, setRenderError] = useState<string | null>(null)\n const [svgContent, setSvgContent] = useState<string>('')\n const renderingRef = useRef(false)\n\n const mermaidDiagram = useMemo(() => buildThreadDiagram(threads), [threads])\n\n const handleNodeClick = useCallback(\n (nodeId: string) => {\n try {\n const threadId = threadForNode(threads, nodeId)\n if (threadId) switchToThread(threadId)\n } catch (error) {\n console.error('Error in thread navigation callback:', error)\n }\n },\n [threads, switchToThread]\n )\n\n const saveSvgAsFile = useCallback(() => {\n if (!svgContent) return\n try {\n const blob = new Blob([svgContent], { type: 'image/svg+xml' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `thread-visualizer-${new Date().toISOString().split('T')[0]}.svg`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n } catch (error) {\n console.error('Failed to save SVG:', error)\n }\n }, [svgContent])\n\n // Render the diagram once per change of threads (never concurrently).\n useEffect(() => {\n if (renderingRef.current || !mermaidDiagram) return\n\n const renderDiagram = async () => {\n renderingRef.current = true\n setIsRendering(true)\n setRenderError(null)\n setSvgContent('')\n try {\n const renderDiagramId = `mermaid-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n const mermaid = await getMermaid()\n const { svg } = await mermaid.render(renderDiagramId, mermaidDiagram)\n setSvgContent(svg)\n setIsRendering(false)\n } catch (error) {\n console.error('Error rendering mermaid diagram:', error)\n setRenderError(error instanceof Error ? error.message : String(error))\n setIsRendering(false)\n setSvgContent('')\n } finally {\n renderingRef.current = false\n }\n }\n\n renderDiagram()\n }, [mermaidDiagram])\n\n // Style the SVG and make its nodes clickable once rendered.\n useEffect(() => {\n if (!svgContent || !svgContainerRef.current) return\n const svgElement = svgContainerRef.current.querySelector('svg')\n if (!svgElement) return\n svgElement.style.maxWidth = '100%'\n svgElement.style.height = 'auto'\n svgElement.style.minHeight = '400px'\n\n // Force consistent font styling.\n const textElements = svgElement.getElementsByTagName('text')\n for (let i = 0; i < textElements.length; i++) {\n textElements[i].setAttribute('font-family', 'system-ui, sans-serif')\n textElements[i].setAttribute('font-size', '12px')\n textElements[i].style.fontSize = '12px !important'\n }\n\n svgElement.querySelectorAll('g.node').forEach((element) => {\n const nodeId = element.getAttribute('id')\n if (!nodeId) return\n ;(element as SVGElement).style.cursor = 'pointer'\n element.addEventListener('click', () => handleNodeClick(nodeId))\n })\n }, [svgContent, handleNodeClick])\n\n const l = { ...DEFAULT_THREAD_VISUALIZER_LABELS, ...labels }\n const hint = showHeader ? (threads.length > 5 ? l.hintMany : l.hint) : undefined\n\n return (\n <ThreadMap\n hint={hint}\n onSave={showDownloadButton && svgContent ? saveSvgAsFile : undefined}\n className={className}\n >\n {/* Loading while rendering, with no content yet, or with no threads data. */}\n {(isRendering || !svgContent || !mermaidDiagram) && !renderError && <ThreadMapLoading />}\n {renderError && <ThreadMapError message={renderError} />}\n {svgContent && !renderError && (\n <ThreadMapDiagram svg={svgContent} diagramRef={svgContainerRef} />\n )}\n </ThreadMap>\n )\n}\n\nexport const ThreadVisualizer = memo(ThreadVisualizerView)\n","import { useCallback, useState, type ClipboardEvent } from 'react'\n\nconst LONG_PASTE_CHARACTER_LIMIT = 1_000\nconst LONG_PASTE_LINE_LIMIT = 12\n\n/** True when the text is big enough that a composer should fold it behind a \"Pasted text\" chip. */\nexport function isLongPastedText(value: string): boolean {\n return (\n value.length >= LONG_PASTE_CHARACTER_LIMIT || value.split('\\n').length >= LONG_PASTE_LINE_LIMIT\n )\n}\n\nexport interface UseLongPaste {\n /** The draft is long AND the user pasted it (typing a long text never folds it). */\n isCollapsed: boolean\n /** Wire to the textarea `onPaste`. Folds when the post-paste draft is long. */\n onPaste: (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => void\n /** Wire to the textarea `onChange`: unfolds once the draft is short again. */\n onValueChange: (nextValue: string) => void\n /** Unfold (the \"Expand\" chip). */\n expand: () => void\n}\n\n/** Headless long-paste folding for a composer draft. */\nexport function useLongPaste(value: string): UseLongPaste {\n const [collapsed, setCollapsed] = useState(false)\n\n const onPaste = useCallback(\n (event: ClipboardEvent<HTMLTextAreaElement>, currentValue: string) => {\n const pasted = event.clipboardData.getData('text')\n const el = event.currentTarget\n const next =\n currentValue.slice(0, el.selectionStart) + pasted + currentValue.slice(el.selectionEnd)\n if (isLongPastedText(next)) setCollapsed(true)\n },\n []\n )\n\n const onValueChange = useCallback((nextValue: string) => {\n if (!isLongPastedText(nextValue)) setCollapsed(false)\n }, [])\n\n const expand = useCallback(() => setCollapsed(false), [])\n\n return { isCollapsed: collapsed && isLongPastedText(value), onPaste, onValueChange, expand }\n}\n","/**\n * PendingAnswerBar\n *\n * When the agent pauses to ask the user a question (ask_user / Human-in-the-loop),\n * this card docks directly above the message composer. It shows the FULL question\n * and lays the answer options out vertically — one full-width row each — so every\n * label is readable in full, however long. A countdown sits in the header.\n *\n * There is intentionally NO text input here: a free-text answer is typed in the\n * real composer below, which interjects the answer while a question is\n * pending. One input, where the user's cursor already is.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { MessageCircleQuestion, Clock, Pause, Play } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the pending-answer bar. */\nexport interface PendingAnswerBarLabels {\n heading: string\n optionsLabel: string\n hint: string\n /** Pause button while the countdown runs. */\n pauseTimer: string\n /** Pause button while it is paused. */\n resumeTimer: string\n /** Name of the countdown, spoken with its value. */\n timeLeft: string\n /** Announced at 30 and 10 seconds left. */\n secondsWarning: (seconds: number) => string\n}\n\nexport const DEFAULT_PENDING_ANSWER_BAR_LABELS: PendingAnswerBarLabels = {\n heading: 'ARBI is asking',\n optionsLabel: 'Answer options',\n hint: 'Pick an option, or type your own answer below.',\n pauseTimer: 'Pause the countdown',\n resumeTimer: 'Resume the countdown',\n timeLeft: 'Time left to answer',\n secondsWarning: (seconds) => `${seconds} seconds left to answer`,\n}\n\nexport interface PendingAnswerBarProps {\n question: string\n options: string[]\n timeoutSeconds: number\n /** Called with the chosen option, the typed answer, or 'timeout' when it expires. */\n onPick: (answer: string) => void\n labels?: Partial<PendingAnswerBarLabels>\n}\n\nexport function PendingAnswerBar({\n question,\n options,\n timeoutSeconds,\n onPick,\n labels,\n}: PendingAnswerBarProps) {\n const l = { ...DEFAULT_PENDING_ANSWER_BAR_LABELS, ...labels }\n const [secondsLeft, setSecondsLeft] = useState(timeoutSeconds)\n // Once we've answered (or timed out) don't fire again as the bar unmounts.\n const firedRef = useRef(false)\n // WCAG 2.2.1: the countdown is pausable, and holds still while focus is inside the bar so a\n // keyboard or screen-reader user reading the options is never timed out under their hands.\n const [isPausedByUser, setIsPausedByUser] = useState(false)\n const [hasFocusWithin, setHasFocusWithin] = useState(false)\n const isPaused = isPausedByUser || hasFocusWithin\n // Spoken once the bar is mounted (a live region only announces changes made after it exists).\n const [announcement, setAnnouncement] = useState('')\n\n // A bare \"Other\" option is redundant — the composer is the free-text path.\n const choices = options.filter((o) => o.trim().toLowerCase() !== 'other')\n\n useEffect(() => {\n setAnnouncement(`${l.heading}: ${question}`)\n // Once per question: the bar is keyed by it in the host.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (secondsLeft <= 0 || isPaused) return\n const t = setInterval(() => setSecondsLeft((s) => (s <= 1 ? 0 : s - 1)), 1000)\n return () => clearInterval(t)\n }, [secondsLeft, isPaused])\n\n useEffect(() => {\n if (secondsLeft === 30 || secondsLeft === 10) setAnnouncement(l.secondsWarning(secondsLeft))\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [secondsLeft])\n\n useEffect(() => {\n if (secondsLeft === 0 && !firedRef.current) {\n firedRef.current = true\n onPick('timeout')\n }\n }, [secondsLeft, onPick])\n\n const pick = (answer: string) => {\n if (firedRef.current) return\n firedRef.current = true\n onPick(answer)\n }\n\n const fmt = (s: number): string => {\n const m = Math.floor(s / 60)\n const r = s % 60\n return m > 0 ? `${m}:${r.toString().padStart(2, '0')}` : `${r}s`\n }\n const low = secondsLeft <= 30\n\n return (\n <div\n role=\"group\"\n aria-label={l.heading}\n className=\"mb-2 rounded-lg border border-theme-cyan/30 bg-theme-cyan/[0.05] px-3 py-2.5\"\n data-slot=\"pending-answer-bar\"\n data-testid=\"pending-answer-bar\"\n onFocus={() => setHasFocusWithin(true)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setHasFocusWithin(false)\n }\n }}\n >\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n data-testid=\"pending-answer-status\"\n >\n {announcement}\n </div>\n {/* Header: label + countdown */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <MessageCircleQuestion aria-hidden=\"true\" className=\"h-4 w-4 shrink-0 text-theme-cyan\" />\n <span className=\"text-xs font-medium uppercase tracking-wide text-theme-cyan\">\n {l.heading}\n </span>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <span\n role=\"timer\"\n aria-label={l.timeLeft}\n className={cn(\n 'flex items-center gap-1 text-xs tabular-nums',\n low ? 'text-red-text' : 'text-muted-foreground'\n )}\n data-testid=\"pending-answer-timer\"\n >\n <Clock aria-hidden=\"true\" className=\"h-3 w-3\" />\n {fmt(secondsLeft)}\n </span>\n <button\n type=\"button\"\n onClick={() => setIsPausedByUser((p) => !p)}\n aria-pressed={isPausedByUser}\n aria-label={l.pauseTimer}\n title={isPausedByUser ? l.resumeTimer : l.pauseTimer}\n 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\"\n data-testid=\"pending-answer-pause\"\n >\n {isPausedByUser ? (\n <Play aria-hidden=\"true\" className=\"h-3 w-3\" />\n ) : (\n <Pause aria-hidden=\"true\" className=\"h-3 w-3\" />\n )}\n </button>\n </div>\n </div>\n\n {/* The full question — wraps freely, never truncated */}\n <p className=\"mt-1.5 whitespace-pre-line text-sm text-foreground\">{question}</p>\n\n {/* Options, stacked vertically — each row reveals its full label */}\n {choices.length > 0 && (\n <div className=\"mt-2.5 flex flex-col gap-1.5\" role=\"group\" aria-label={l.optionsLabel}>\n {choices.map((option, i) => (\n <button\n key={`${i}-${option}`}\n type=\"button\"\n onClick={() => pick(option)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md border border-border bg-background',\n 'px-3 py-2 text-left text-sm text-foreground transition-colors',\n 'hover:border-theme-cyan/50 hover:bg-theme-cyan/10',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11'\n )}\n data-testid={`pending-answer-option-${option}`}\n >\n <span\n aria-hidden=\"true\"\n 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\"\n >\n {i + 1}\n </span>\n <span className=\"min-w-0 flex-1\">{option}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* Free-text affordance — points at the composer below */}\n <p className=\"mt-2 text-xs text-muted-foreground\">{l.hint}</p>\n </div>\n )\n}\n","import { useCallback } from 'react'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport type { ChatCitationTarget } from './chat-page-types'\n\n/**\n * Open a cited document at its passage and page through the environment (`openDocument`): the\n * `onOpenCitation` of a chat whose host shows documents.\n */\nexport function useOpenCitation(): (target: ChatCitationTarget) => void {\n const { openDocument } = useBlocksEnvironment()\n return useCallback(\n ({ documentId, page, passage }) => {\n const id = documentId ?? passage?.documentId\n if (!id) return\n const at = page ?? passage?.page ?? undefined\n openDocument(id, { ...(at && { page: at }), ...(passage?.id && { passageId: passage.id }) })\n },\n [openDocument]\n )\n}\n","import { useEffect, useRef, type KeyboardEvent } from 'react'\nimport { hasMessageBody } from '@arbidocs/react/shell'\n\n/** Seed a shared draft once, preserve edits, and restore the default after a send. */\nexport function useRecipientDraft({\n value,\n onValueChange,\n contextKey,\n defaultLabel,\n}: {\n value: string\n onValueChange: (value: string) => void\n contextKey: string | null | undefined\n defaultLabel: string | null\n}) {\n const prefix = defaultLabel ? `@${defaultLabel} ` : ''\n const context = `${contextKey ?? ''}:${defaultLabel ?? ''}`\n const previousContext = useRef<string | null>(null)\n const resetAfterSend = useRef(false)\n useEffect(() => {\n const changed = previousContext.current !== context\n const previousLabel = previousContext.current?.split(':').pop()\n previousContext.current = context\n if (changed || (resetAfterSend.current && !value)) {\n resetAfterSend.current = false\n if (!value && prefix) onValueChange(prefix)\n // A visibility change removes only the untouched default, never someone's text.\n else if (changed && !prefix && previousLabel && value.trim() === `@${previousLabel}`)\n onValueChange('')\n }\n }, [context, prefix, value, onValueChange])\n\n return {\n hasBody: hasMessageBody(value, defaultLabel ?? 'ARBI'),\n onSend: () => {\n resetAfterSend.current = true\n },\n handleKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => {\n const textarea = event.currentTarget\n if (\n prefix &&\n value.startsWith(prefix) &&\n event.key === 'Backspace' &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey &&\n textarea.selectionStart === textarea.selectionEnd &&\n textarea.selectionStart === prefix.length\n ) {\n event.preventDefault()\n onValueChange(value.slice(prefix.length))\n requestAnimationFrame(() => textarea.setSelectionRange(0, 0))\n return true\n }\n return false\n },\n }\n}\n","/**\n * Message Copy Utilities\n *\n * Handles copying message content with formatting, including:\n * - Citation deep links in HTML with proper footnotes\n * - Message link at top\n * - Plain text with URL on first line\n */\n\nimport type { Chunk, ToolResponses } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../lib/deep-link'\nimport { markdownToPlainTextBlocks } from '@arbidocs/react/ui'\n\ninterface CopyMessageOptions {\n messageRef: React.RefObject<HTMLDivElement | null>\n responseContent: string\n messageContent: string\n isUser: boolean\n selectedWorkspaceId: string | null\n /** The deployment the links point at (the environment's `runtimeConfig.deploymentDomain`). */\n deploymentDomain?: string | null\n conversationExtId: string | undefined\n messageExtId: string | undefined\n activeCitations: Record<string, string[]> | null\n citationData: ToolResponses\n /** The preceding user message content (for assistant messages) */\n precedingUserMessage?: string\n}\n\ninterface PassageInfo {\n deepLink: string\n docTitle: string\n pageNumber?: number\n passageText?: string\n}\n\ninterface FootnoteData {\n citationNum: string\n passages: PassageInfo[]\n}\n\n/**\n * Build a lookup map from chunk_ext_id to chunk metadata\n */\nfunction buildChunkLookup(citationData: ToolResponses): Map<string, Chunk> {\n const lookup = new Map<string, Chunk>()\n Object.values(citationData).forEach((chunks) => {\n if (Array.isArray(chunks)) {\n ;(chunks as Chunk[]).forEach((chunk) => {\n if (chunk.metadata?.chunk_ext_id) {\n lookup.set(chunk.metadata.chunk_ext_id, chunk)\n }\n })\n }\n })\n return lookup\n}\n\n/**\n * Get all passage info for a citation number\n */\nfunction getPassagesForCitation(\n citationNum: string,\n selectedWorkspaceId: string,\n activeCitations: Record<string, string[]>,\n chunkLookup: Map<string, Chunk>,\n deploymentDomain: string | null | undefined\n): PassageInfo[] {\n const chunkIds = activeCitations[citationNum]\n if (!chunkIds?.length) return []\n\n const passages: PassageInfo[] = []\n\n for (const chunkId of chunkIds) {\n const chunk = chunkLookup.get(chunkId)\n if (!chunk?.metadata?.doc_ext_id || !chunk?.metadata?.chunk_ext_id) continue\n\n passages.push({\n deepLink: buildDeepLinkUrl(\n {\n workspaceId: selectedWorkspaceId,\n documentId: chunk.metadata.doc_ext_id,\n chunkId: chunk.metadata.chunk_ext_id,\n },\n deploymentDomain\n ),\n docTitle: chunk.metadata.doc_title || 'Document',\n pageNumber: chunk.metadata.page_number,\n passageText: chunk.content ? truncateText(chunk.content, 150) : undefined,\n })\n }\n\n return passages\n}\n\n/**\n * Truncate text to a maximum length with ellipsis\n */\nfunction truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength).trim() + '...'\n}\n\n/**\n * Generate HTML for a single footnote entry\n */\nfunction generateFootnoteHtml(footnote: FootnoteData): string {\n const { citationNum, passages } = footnote\n\n if (passages.length === 0) {\n return `<p id=\"fn-${citationNum}\" style=\"margin: 4px 0; font-size: 12px;\"><sup>${citationNum}</sup> [No source available]</p>`\n }\n\n let html = `<p id=\"fn-${citationNum}\" style=\"margin: 8px 0; font-size: 13px;\"><sup style=\"font-weight: bold;\">${citationNum}</sup> `\n\n // Each passage gets its own entry with doc title, page, and link following\n const passageEntries = passages.map((p) => {\n const pageStr = p.pageNumber ? `, p.${p.pageNumber}` : ''\n return `${p.docTitle}${pageStr} <a href=\"${p.deepLink}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">[view]</a>`\n })\n\n html += passageEntries.join('; ')\n html += '</p>'\n\n return html\n}\n\n/**\n * Generate the complete footnotes section HTML\n */\nfunction generateFootnotesSection(footnotes: FootnoteData[]): string {\n if (footnotes.length === 0) return ''\n\n let html = '<hr style=\"margin: 16px 0; border: none; border-top: 1px solid #e5e7eb;\">'\n html += '<div style=\"font-size: 12px; color: #6b7280;\">'\n html += '<p style=\"margin-bottom: 8px; font-weight: 600;\">References:</p>'\n\n for (const footnote of footnotes) {\n html += generateFootnoteHtml(footnote)\n }\n\n html += '</div>'\n return html\n}\n\n/**\n * Generate plain text footnotes section\n */\nfunction generateFootnotesSectionPlainText(footnotes: FootnoteData[]): string {\n if (footnotes.length === 0) return ''\n\n let text = '\\nReferences:\\n'\n\n for (const footnote of footnotes) {\n const { citationNum, passages } = footnote\n if (passages.length === 0) {\n text += `[${citationNum}] [No source available]\\n`\n continue\n }\n\n const passageEntries = passages.map((p) => {\n const pageStr = p.pageNumber ? `, p.${p.pageNumber}` : ''\n return `${p.docTitle}${pageStr} - ${p.deepLink}`\n })\n\n text += `[${citationNum}] ${passageEntries.join('; ')}\\n`\n }\n\n return text\n}\n\n/**\n * Replace markdown citation links with bracketed references\n * Converts [text](#cite-N) to text[N]\n *\n * The link text may itself contain one level of brackets (e.g. \"co-arbitrator [9] under…\"),\n * which CommonMark allows; a plain [^\\]] match would stop at the inner ] and leak the link.\n */\nfunction replaceCitationLinksInMarkdown(text: string): string {\n return text.replace(/\\[((?:[^[\\]]|\\[[^[\\]]*\\])+)\\]\\(#cite-(\\d+)\\)/g, '$1[$2]')\n}\n\n/**\n * Process HTML to add citation links and collect footnote data\n */\nfunction processCitationsInHtml(\n html: string,\n selectedWorkspaceId: string,\n activeCitations: Record<string, string[]>,\n citationData: ToolResponses,\n deploymentDomain: string | null | undefined\n): { html: string; footnotes: FootnoteData[] } {\n const chunkLookup = buildChunkLookup(citationData)\n const tempDiv = document.createElement('div')\n tempDiv.innerHTML = html\n\n const footnotes: FootnoteData[] = []\n const processedCitations = new Set<string>()\n\n // Find all citation spans and process them\n tempDiv.querySelectorAll('[data-testid^=\"citation-link-\"]').forEach((span) => {\n const citationNum = span.getAttribute('data-testid')?.replace('citation-link-', '')\n if (!citationNum) return\n\n // Get all passages for this citation\n const passages = getPassagesForCitation(\n citationNum,\n selectedWorkspaceId,\n activeCitations,\n chunkLookup,\n deploymentDomain\n )\n\n // Collect footnote data (only once per citation number)\n if (!processedCitations.has(citationNum)) {\n processedCitations.add(citationNum)\n footnotes.push({ citationNum, passages })\n }\n\n // Style the superscript with brackets (footnotes section has the actual links)\n const supElement = span.querySelector('sup')\n if (supElement) {\n supElement.textContent = `[${citationNum}]`\n supElement.style.cssText = 'color: #2563eb;'\n }\n })\n\n // Sort footnotes by citation number\n footnotes.sort((a, b) => parseInt(a.citationNum) - parseInt(b.citationNum))\n\n return { html: tempDiv.innerHTML, footnotes }\n}\n\n/**\n * Build message link URL and HTML\n */\nexport function buildMessageLink(\n selectedWorkspaceId: string | null,\n conversationExtId: string | undefined,\n messageExtId: string | undefined,\n deploymentDomain?: string | null\n): { url: string; html: string } | null {\n if (!selectedWorkspaceId || !conversationExtId || !messageExtId) return null\n\n const fullUrl = buildDeepLinkUrl(\n {\n workspaceId: selectedWorkspaceId,\n conversationId: conversationExtId,\n messageId: messageExtId,\n },\n deploymentDomain\n )\n return {\n url: fullUrl,\n html: `<p style=\"margin-bottom: 12px;\"><a href=\"${fullUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">ARBI Docs message link</a></p>`,\n }\n}\n\nconst NO_ANSWER_TEXT = '(No answer text was written.)'\n\n/**\n * Build clipboard content (both HTML and plain text)\n */\nfunction buildClipboardContent(\n htmlContent: string,\n plainTextContent: string,\n messageLinkUrl: string,\n messageLinkHtml: string,\n footnotesHtml: string,\n footnotes: FootnoteData[],\n precedingUserMessage?: string,\n isUser?: boolean\n): { html: string; plainText: string } {\n // An answer stopped before it wrote any text has an empty body. Say so, rather than\n // leave a bare \"Assistant:\" heading that looks like the copy lost the answer.\n const isEmptyAnswer = !isUser && !plainTextContent.trim()\n const bodyHtml = isEmptyAnswer ? `<p><em>${NO_ANSWER_TEXT}</em></p>` : htmlContent\n // Assistant answers are markdown: strip the markup so the pasted text has no stray ** or #\n const body = replaceCitationLinksInMarkdown(plainTextContent)\n const bodyText = isEmptyAnswer ? NO_ANSWER_TEXT : isUser ? body : markdownToPlainTextBlocks(body)\n\n // HTML: message link at top, content, then footnotes at bottom\n let html = ''\n if (messageLinkHtml) html += messageLinkHtml\n\n // For assistant messages with a preceding user message, format as User:/Assistant: sections\n if (!isUser && precedingUserMessage) {\n html += `<p><strong>User:</strong></p>${escapeHtml(precedingUserMessage)}<br><br>`\n html += `<p><strong>Assistant:</strong></p>${bodyHtml}`\n } else {\n html += bodyHtml\n }\n\n if (footnotesHtml) html += footnotesHtml\n\n // Plain text: URL on first line, content with [N] refs, then footnotes\n let plainText = messageLinkUrl ? `${messageLinkUrl}\\n\\n` : ''\n\n // For assistant messages with a preceding user message, format as User:/Assistant: sections\n if (!isUser && precedingUserMessage) {\n plainText += `User:\\n${precedingUserMessage}\\n\\nAssistant:\\n`\n }\n\n plainText += bodyText\n plainText += generateFootnotesSectionPlainText(footnotes)\n\n return { html, plainText }\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n .replace(/\\n/g, '<br>')\n}\n\n/**\n * Find the message content div — the rendered answer.\n *\n * It used to have to step over a `thinking-section` panel that could precede it\n * in the card. That panel is gone, so the lookup is just the first\n * `.markdown-content` — exactly the branch this already took for every message\n * that had no reasoning, which was almost all of them.\n */\nfunction findMessageContentDiv(messageRef: HTMLDivElement): Element | null {\n return messageRef.querySelector('.markdown-content')\n}\n\n/**\n * Copy message content to clipboard with formatting\n */\nexport async function copyMessageToClipboard(options: CopyMessageOptions): Promise<boolean> {\n const {\n messageRef,\n responseContent,\n messageContent,\n isUser,\n selectedWorkspaceId,\n conversationExtId,\n messageExtId,\n activeCitations,\n citationData,\n deploymentDomain,\n } = options\n\n if (!messageRef.current) return false\n\n const plainTextContent = isUser ? messageContent : responseContent\n const messageLink = buildMessageLink(\n selectedWorkspaceId,\n conversationExtId,\n messageExtId,\n deploymentDomain\n )\n const messageLinkUrl = messageLink?.url || ''\n const messageLinkHtml = messageLink?.html || ''\n\n const targetContentDiv = findMessageContentDiv(messageRef.current)\n\n if (!targetContentDiv) {\n const { plainText } = buildClipboardContent(\n '',\n plainTextContent,\n messageLinkUrl,\n '',\n '',\n [],\n undefined,\n isUser\n )\n await navigator.clipboard.writeText(plainText)\n return true\n }\n\n // Process citations and generate footnotes\n let htmlContent = targetContentDiv.innerHTML\n let footnotesHtml = ''\n let footnotes: FootnoteData[] = []\n\n if (selectedWorkspaceId && activeCitations) {\n const result = processCitationsInHtml(\n htmlContent,\n selectedWorkspaceId,\n activeCitations,\n citationData,\n deploymentDomain\n )\n htmlContent = result.html\n footnotes = result.footnotes\n footnotesHtml = generateFootnotesSection(footnotes)\n }\n\n const { html, plainText } = buildClipboardContent(\n htmlContent,\n plainTextContent,\n messageLinkUrl,\n messageLinkHtml,\n footnotesHtml,\n footnotes,\n options.precedingUserMessage,\n isUser\n )\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([html], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n })\n\n await navigator.clipboard.write([clipboardItem])\n return true\n}\n","/**\n * Turn a rendered answer table (an HTML <table>) into a CSV download.\n *\n * Works from the DOM rather than the markdown source so the CSV holds exactly\n * what the reader sees: cited text stays, the citation's superscript number\n * does not.\n */\nimport { downloadBlob } from '@arbidocs/react/document-tools'\n\n/** The superscript number a citation renders after its cited words. */\nconst CITATION_MARKER_SELECTOR = '[data-mark-kind=\"citation\"] > sup, .cited-text > sup'\nconst HEADING_SELECTOR = 'h1, h2, h3, h4, h5, h6'\nconst PARAGRAPH_SELECTOR = 'p'\nconst MAX_SLUG_LENGTH = 80\n/** Where the block search stops: the answer's own markdown root. */\nconst ANSWER_ROOT_SELECTOR = '.markdown-content, [data-testid=\"citation-renderer\"]'\n\nconst LINE_BREAK = '\\u0000'\n\nfunction cellText(cell: Element): string {\n const clone = cell.cloneNode(true) as Element\n clone.querySelectorAll(CITATION_MARKER_SELECTOR).forEach((marker) => marker.remove())\n // A sentinel, not '\\n', so source newlines (plain whitespace) still collapse.\n clone.querySelectorAll('br').forEach((br) => br.replaceWith(LINE_BREAK))\n return (clone.textContent ?? '')\n .split(LINE_BREAK)\n .map((line) => line.replace(/\\s+/g, ' ').trim())\n .join('\\n')\n .trim()\n}\n\n/** Visible cell text of every row (header included), citation markers removed. */\nexport function extractTableRows(table: HTMLTableElement): string[][] {\n return Array.from(table.rows).map((row) => Array.from(row.cells).map(cellText))\n}\n\n/**\n * RFC 4180 CSV (CRLF rows; fields with commas, quotes or line breaks are quoted\n * and inner quotes doubled). Prefixed with a UTF-8 BOM so Excel reads accents\n * and currency symbols correctly.\n */\nexport async function rowsToCsv(rows: string[][]): Promise<string> {\n const Papa = (await import('papaparse')).default\n return '\\ufeff' + Papa.unparse(rows, { newline: '\\r\\n' })\n}\n\n/** The closest element matching `selector` above `el` inside the answer, or null. */\nfunction findPrecedingBlock(el: Element, selector: string): Element | null {\n let node: Element | null = el\n while (node && !node.matches(ANSWER_ROOT_SELECTOR)) {\n let sibling = node.previousElementSibling\n while (sibling) {\n if (sibling.matches(selector)) return sibling\n const nested = sibling.querySelectorAll(selector)\n if (nested.length > 0) return nested[nested.length - 1]\n sibling = sibling.previousElementSibling\n }\n node = node.parentElement\n }\n return null\n}\n\n/**\n * `<nearest-heading>.csv`, else `<introducing-sentence>.csv` (the paragraph just\n * above the table), slugified. `table.csv` when neither exists.\n */\nexport function csvFilenameForTable(el: Element): string {\n const source =\n findPrecedingBlock(el, HEADING_SELECTOR) ?? findPrecedingBlock(el, PARAGRAPH_SELECTOR)\n const slug = (source ? cellText(source) : '')\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/['’]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n // Cap the length at a word boundary, so a long sentence never ends mid-word.\n const capped =\n slug.length > MAX_SLUG_LENGTH ? slug.slice(0, MAX_SLUG_LENGTH).replace(/-[^-]*$/, '') : slug\n return `${capped || 'table'}.csv`\n}\n\n/**\n * Download `table` as CSV, named after the content above `anchor` (see `csvFilenameForTable`).\n * Resolves to the file name that was downloaded.\n */\nexport async function downloadTableAsCsv(\n table: HTMLTableElement,\n anchor: Element = table\n): Promise<string> {\n const csv = await rowsToCsv(extractTableRows(table))\n const filename = csvFilenameForTable(anchor)\n downloadBlob(new Blob([csv], { type: 'text/csv;charset=utf-8' }), filename)\n return filename\n}\n","/**\n * Thin strip pinned to the bottom inner edge of the composer box that shows\n * how full the context window is. Fills left-to-right like a percent-full\n * meter (colored = used, white space = headroom left); the tooltip frames\n * it to the user as a plain countdown percentage, not raw token counts.\n * Must be rendered inside a `relative` ancestor sized to the composer box —\n * it positions itself relative to that box, not the page.\n */\n\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport {\n type ContextUsage,\n getContextRemainingPercent,\n getContextUsedPercent,\n} from '@arbidocs/sdk/browser'\n\nconst WARM_REMAINING_THRESHOLD_PERCENT = 50\n\nexport function ContextUsageBar({\n contextUsage,\n draftLength = 0,\n}: {\n contextUsage?: ContextUsage | null\n /** Length of the not-yet-sent draft text, so the bar reacts while typing. */\n draftLength?: number\n}) {\n if (!contextUsage || contextUsage.context_window <= 0) return null\n\n const usedPercent = getContextUsedPercent(contextUsage, draftLength)\n const remainingPercent = getContextRemainingPercent(contextUsage, draftLength)\n // £ spent is a past-turn cost, not future context headroom — that lives in\n // the assistant message's own steps expander instead (see AgentSteps).\n const isWarm = remainingPercent < WARM_REMAINING_THRESHOLD_PERCENT || contextUsage.truncated\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className=\"pointer-events-auto absolute inset-x-0 bottom-0 z-10 h-[2px] cursor-default overflow-hidden rounded-b-md bg-muted-foreground/20\"\n data-testid=\"context-usage-bar\"\n >\n <div\n className={cn(\n 'h-full transition-all duration-500 ease-out',\n isWarm ? 'bg-yellow-text' : 'bg-muted-foreground'\n )}\n style={{ width: `${usedPercent}%` }}\n data-testid=\"context-usage-bar-fill\"\n />\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-[240px] space-y-1 text-sm\">\n <div className=\"font-medium\">\n {Math.round(remainingPercent)}% remaining before auto-compaction\n </div>\n {isWarm && (\n <div className=\"text-yellow-text\">\n This conversation is getting long and will be autocompacted when this reaches 0%. Run\n /compact any time to reduce context length.\n </div>\n )}\n {contextUsage.truncated && (\n <div className=\"font-medium text-yellow-text\">Context was truncated</div>\n )}\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Slash-menu data logic (build + filter the item list) for the `SlashMenu`.\n *\n * The SDK owns the slug grammar and filter ranking; this file is the\n * single React-side import site for slash-command primitives so\n * upstream changes propagate without touching the component.\n */\n\nimport { filterSkills } from '@arbidocs/sdk/browser'\nimport type { SlashItemKind, SlashMenuItem } from './SlashMenu'\n\nexport { parseSlashTokenInProgress as parseSlashToken } from '@arbidocs/sdk/browser'\n\n/**\n * Build the single menu list from the two sources that feed it: the\n * backend's built-in commands (``GET /v1/assistant/commands``) and the\n * user's skills (``GET /v1/assistant/skills``).\n *\n * Built-ins come first — they're shipped vocabulary the backend always\n * handles — and a built-in wins a name collision, because a skill named\n * ``compact`` could never actually be invoked: the dispatcher checks its\n * built-in branches before it ever reaches the skill loader, so listing the\n * shadowed skill would promise something the backend won't do. Same rule the\n * TUI applies in ``toSlashCommandsWithSkills``.\n */\nexport function buildSlashItems(\n commands: ReadonlyArray<SlashMenuItem>,\n skills: ReadonlyArray<SlashMenuItem>\n): SlashMenuItem[] {\n const taken = new Set(commands.map((c) => c.name))\n return [...commands, ...skills.filter((s) => !taken.has(s.name))]\n}\n\n/**\n * Filter+sort wrapper around the SDK's ``filterSkills`` that returns\n * exactly the shape the menu renders. Kept as a thin adapter so future\n * refactors (e.g. switching to a fuzzy matcher) can move upstream into\n * the SDK without touching the component.\n *\n * Each kind is ranked independently and the groups are re-concatenated in\n * commands-then-skills order, so the flat array the menu indexes into is\n * *already* grouped. The component slices it into sections without a second\n * sort, and keyboard navigation stays a plain index over one array.\n */\nexport function filterSlashItems(\n items: ReadonlyArray<SlashMenuItem>,\n query: string,\n pinned: ReadonlyArray<string> = []\n): SlashMenuItem[] {\n const ofKind = (kind: SlashItemKind) =>\n filterSkills(\n items.filter((i) => i.kind === kind),\n query,\n pinned\n )\n return [...ofKind('command'), ...ofKind('skill')]\n}\n","/**\n * Generated-document helpers. A generated document names the assistant message that made it\n * (`source_message_ext_id`) and that message's conversation (`conversation_ext_id`, null for\n * uploads). Every edit is a new version of the same document, and each version names the message\n * whose turn made it (and its conversation): none for a person's upload or save.\n */\n\nimport type { components } from '@arbidocs/client'\n\ntype Doc = components['schemas']['DocResponse']\n\ntype LinkedDoc = Pick<\n Doc,\n 'external_id' | 'source_message_ext_id' | 'conversation_ext_id' | 'created_at' | 'updated_at'\n> & {\n versions?: ReadonlyArray<\n Pick<Doc['versions'][number], 'source_message_ext_id' | 'conversation_ext_id'>\n >\n}\n\nconst newestFirst = (a: LinkedDoc, b: LinkedDoc): number =>\n (b.created_at ?? '').localeCompare(a.created_at ?? '')\n\n/**\n * The message that made a document's latest version a thread made (a person's later save does not\n * move it): the newest version naming a message, else the generating message.\n */\nexport function latestThreadVersionMessage(d: LinkedDoc): string | null {\n const named = (d.versions ?? []).filter((v) => v.source_message_ext_id)\n return named.at(-1)?.source_message_ext_id ?? d.source_message_ext_id ?? null\n}\n\n/** The threads a document was made or edited in. */\nfunction threadsOf(d: LinkedDoc): string[] {\n const ids = [d.conversation_ext_id, ...(d.versions ?? []).map((v) => v.conversation_ext_id)]\n return [...new Set(ids.filter((id): id is string => !!id))]\n}\n\n/**\n * Generated documents grouped by the conversations they were made or edited in, newest first.\n * Uploads nobody's thread touched are excluded.\n */\nexport function groupOutputsByConversation<T extends LinkedDoc>(\n docs: readonly T[]\n): Record<string, T[]> {\n const out: Record<string, T[]> = {}\n for (const d of docs) for (const id of threadsOf(d)) (out[id] ??= []).push(d)\n for (const list of Object.values(out)) list.sort(newestFirst)\n return out\n}\n\n/**\n * The document to show under an assistant message: the newest document whose latest thread-made\n * version this message made. A document edited by a later message shows under that later\n * message, so the earlier message no longer matches; a person's own save changes nothing.\n */\nexport function findMessageDocument<T extends LinkedDoc>(\n docs: readonly T[] | undefined,\n messageExtId: string | undefined\n): T | undefined {\n if (!docs || !messageExtId) return undefined\n const matches = docs.filter((d) => latestThreadVersionMessage(d) === messageExtId)\n return matches.sort(newestFirst)[0]\n}\n"]}