@arbidocs/blocks 0.5.75 → 0.5.76

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 (175) hide show
  1. package/README.md +23 -0
  2. package/dist/{ConnectedDocumentViewer-U5TQ4LFJ.js → ConnectedDocumentViewer-4LRZ5N3L.js} +6 -6
  3. package/dist/{ConnectedDocumentViewer-U5TQ4LFJ.js.map → ConnectedDocumentViewer-4LRZ5N3L.js.map} +1 -1
  4. package/dist/{ConnectedDocumentViewer-ID2RG5MF.cjs → ConnectedDocumentViewer-FREQM2ES.cjs} +7 -7
  5. package/dist/{ConnectedDocumentViewer-ID2RG5MF.cjs.map → ConnectedDocumentViewer-FREQM2ES.cjs.map} +1 -1
  6. package/dist/{ConnectedNativeDocxComparison-PBMS77ZP.js → ConnectedNativeDocxComparison-P7OJ3UVK.js} +6 -6
  7. package/dist/{ConnectedNativeDocxComparison-PBMS77ZP.js.map → ConnectedNativeDocxComparison-P7OJ3UVK.js.map} +1 -1
  8. package/dist/{ConnectedNativeDocxComparison-R4OFGVHY.cjs → ConnectedNativeDocxComparison-RQIKQM5O.cjs} +7 -7
  9. package/dist/{ConnectedNativeDocxComparison-R4OFGVHY.cjs.map → ConnectedNativeDocxComparison-RQIKQM5O.cjs.map} +1 -1
  10. package/dist/{ConnectedNativeDocxEditor-27JZI2D5.js → ConnectedNativeDocxEditor-HX3FDJ2T.js} +5 -5
  11. package/dist/{ConnectedNativeDocxEditor-27JZI2D5.js.map → ConnectedNativeDocxEditor-HX3FDJ2T.js.map} +1 -1
  12. package/dist/{ConnectedNativeDocxEditor-774XRIP3.cjs → ConnectedNativeDocxEditor-XKQV7A37.cjs} +7 -7
  13. package/dist/{ConnectedNativeDocxEditor-774XRIP3.cjs.map → ConnectedNativeDocxEditor-XKQV7A37.cjs.map} +1 -1
  14. package/dist/{ConnectedStreamedWordArtifact-7TNIQTVE.cjs → ConnectedStreamedWordArtifact-CSRL4SCO.cjs} +7 -7
  15. package/dist/ConnectedStreamedWordArtifact-CSRL4SCO.cjs.map +1 -0
  16. package/dist/{ConnectedStreamedWordArtifact-XEFXYMKS.js → ConnectedStreamedWordArtifact-SSH6M5LN.js} +6 -6
  17. package/dist/ConnectedStreamedWordArtifact-SSH6M5LN.js.map +1 -0
  18. package/dist/{DocumentReviewCard-7OPL6PWG.cjs → DocumentReviewCard-3PZJPVQC.cjs} +14 -14
  19. package/dist/{DocumentReviewCard-7OPL6PWG.cjs.map → DocumentReviewCard-3PZJPVQC.cjs.map} +1 -1
  20. package/dist/{DocumentReviewCard-NDHCFYYT.js → DocumentReviewCard-KHMHG7A5.js} +9 -9
  21. package/dist/{DocumentReviewCard-NDHCFYYT.js.map → DocumentReviewCard-KHMHG7A5.js.map} +1 -1
  22. package/dist/{WorkspaceTableView-4INHJ7QK.js → WorkspaceTableView-4VMCTOFT.js} +5 -5
  23. package/dist/{WorkspaceTableView-4INHJ7QK.js.map → WorkspaceTableView-4VMCTOFT.js.map} +1 -1
  24. package/dist/{WorkspaceTableView-BTUSU3N3.cjs → WorkspaceTableView-Q44KNO3Z.cjs} +7 -7
  25. package/dist/{WorkspaceTableView-BTUSU3N3.cjs.map → WorkspaceTableView-Q44KNO3Z.cjs.map} +1 -1
  26. package/dist/agents/index.cjs +281 -281
  27. package/dist/agents/index.js +4 -4
  28. package/dist/{chunk-E3ILJRG4.cjs → chunk-2HECOUXC.cjs} +4 -3
  29. package/dist/chunk-2HECOUXC.cjs.map +1 -0
  30. package/dist/{chunk-AQPZ4QMV.cjs → chunk-3J2ASIM7.cjs} +3 -3
  31. package/dist/chunk-3J2ASIM7.cjs.map +1 -0
  32. package/dist/{chunk-QCFNPQWS.cjs → chunk-3LJUTIS6.cjs} +44 -44
  33. package/dist/{chunk-QCFNPQWS.cjs.map → chunk-3LJUTIS6.cjs.map} +1 -1
  34. package/dist/chunk-4B6HYQTW.cjs +20 -0
  35. package/dist/chunk-4B6HYQTW.cjs.map +1 -0
  36. package/dist/{chunk-4UMVAJJZ.js → chunk-6NEBHZIF.js} +4 -4
  37. package/dist/{chunk-4UMVAJJZ.js.map → chunk-6NEBHZIF.js.map} +1 -1
  38. package/dist/{chunk-IMIE5NOQ.js → chunk-7E5GV4R7.js} +4 -4
  39. package/dist/{chunk-IMIE5NOQ.js.map → chunk-7E5GV4R7.js.map} +1 -1
  40. package/dist/{chunk-LNXMSIKU.js → chunk-AWFEB4YJ.js} +8 -8
  41. package/dist/{chunk-LNXMSIKU.js.map → chunk-AWFEB4YJ.js.map} +1 -1
  42. package/dist/{chunk-JMQLTMJ7.js → chunk-B3BD5IJR.js} +16 -20
  43. package/dist/chunk-B3BD5IJR.js.map +1 -0
  44. package/dist/{chunk-5Q2U7GLI.cjs → chunk-CDW3W5U5.cjs} +4 -4
  45. package/dist/{chunk-5Q2U7GLI.cjs.map → chunk-CDW3W5U5.cjs.map} +1 -1
  46. package/dist/{chunk-SK5TP4DP.js → chunk-DBPPOJQM.js} +3 -3
  47. package/dist/{chunk-SK5TP4DP.js.map → chunk-DBPPOJQM.js.map} +1 -1
  48. package/dist/{chunk-NJ3YV3VM.cjs → chunk-DMYBHKNQ.cjs} +27 -27
  49. package/dist/{chunk-NJ3YV3VM.cjs.map → chunk-DMYBHKNQ.cjs.map} +1 -1
  50. package/dist/{chunk-563BHHHO.cjs → chunk-E6S6WHXL.cjs} +9 -9
  51. package/dist/{chunk-563BHHHO.cjs.map → chunk-E6S6WHXL.cjs.map} +1 -1
  52. package/dist/{chunk-BV34QPKE.js → chunk-EASXRDYQ.js} +3 -3
  53. package/dist/{chunk-BV34QPKE.js.map → chunk-EASXRDYQ.js.map} +1 -1
  54. package/dist/{chunk-JOFUAQTV.js → chunk-HWNVAQBX.js} +3 -3
  55. package/dist/{chunk-JOFUAQTV.js.map → chunk-HWNVAQBX.js.map} +1 -1
  56. package/dist/{chunk-PNWSEIWS.cjs → chunk-I3HK46DH.cjs} +4 -4
  57. package/dist/{chunk-PNWSEIWS.cjs.map → chunk-I3HK46DH.cjs.map} +1 -1
  58. package/dist/{chunk-GJKXYX47.js → chunk-IJ2CTMA7.js} +3 -3
  59. package/dist/{chunk-GJKXYX47.js.map → chunk-IJ2CTMA7.js.map} +1 -1
  60. package/dist/{chunk-7ZL6OVGO.cjs → chunk-IQFHOKQH.cjs} +23 -46
  61. package/dist/chunk-IQFHOKQH.cjs.map +1 -0
  62. package/dist/{chunk-7ZCM2GR2.js → chunk-IRCGXKLB.js} +3 -3
  63. package/dist/{chunk-7ZCM2GR2.js.map → chunk-IRCGXKLB.js.map} +1 -1
  64. package/dist/{chunk-G4GLDQLY.js → chunk-KG3W76BB.js} +3 -3
  65. package/dist/chunk-KG3W76BB.js.map +1 -0
  66. package/dist/{chunk-B66CICTP.cjs → chunk-KHLPBCRZ.cjs} +52 -52
  67. package/dist/{chunk-B66CICTP.cjs.map → chunk-KHLPBCRZ.cjs.map} +1 -1
  68. package/dist/{chunk-J4SEJSSV.js → chunk-KPIR4MJV.js} +6 -6
  69. package/dist/{chunk-J4SEJSSV.js.map → chunk-KPIR4MJV.js.map} +1 -1
  70. package/dist/{chunk-PA4EGGCI.js → chunk-KSHTODQZ.js} +3 -3
  71. package/dist/{chunk-PA4EGGCI.js.map → chunk-KSHTODQZ.js.map} +1 -1
  72. package/dist/{chunk-PT6D5B6L.cjs → chunk-MAUJVVFJ.cjs} +360 -410
  73. package/dist/chunk-MAUJVVFJ.cjs.map +1 -0
  74. package/dist/{chunk-MP7XCRHV.js → chunk-NRI5DKJE.js} +4 -3
  75. package/dist/chunk-NRI5DKJE.js.map +1 -0
  76. package/dist/{chunk-XXPDAENX.cjs → chunk-PGTDQBMX.cjs} +7 -7
  77. package/dist/{chunk-XXPDAENX.cjs.map → chunk-PGTDQBMX.cjs.map} +1 -1
  78. package/dist/{chunk-4JKK6S7U.cjs → chunk-S7G3A52F.cjs} +5 -5
  79. package/dist/{chunk-4JKK6S7U.cjs.map → chunk-S7G3A52F.cjs.map} +1 -1
  80. package/dist/{chunk-OUCWTKQT.js → chunk-SBFQF3BU.js} +4 -4
  81. package/dist/{chunk-OUCWTKQT.js.map → chunk-SBFQF3BU.js.map} +1 -1
  82. package/dist/{chunk-52VME6ZS.cjs → chunk-SIOBGNRY.cjs} +18 -18
  83. package/dist/{chunk-52VME6ZS.cjs.map → chunk-SIOBGNRY.cjs.map} +1 -1
  84. package/dist/chunk-SK3GBHPJ.js +15 -0
  85. package/dist/chunk-SK3GBHPJ.js.map +1 -0
  86. package/dist/{chunk-RADE22SM.cjs → chunk-T2OG3CPR.cjs} +4 -4
  87. package/dist/{chunk-RADE22SM.cjs.map → chunk-T2OG3CPR.cjs.map} +1 -1
  88. package/dist/{chunk-IGQJ6ET3.js → chunk-TWSOU6SE.js} +421 -501
  89. package/dist/chunk-TWSOU6SE.js.map +1 -0
  90. package/dist/{chunk-QRV4XYFJ.js → chunk-UCD7644N.js} +3 -3
  91. package/dist/{chunk-QRV4XYFJ.js.map → chunk-UCD7644N.js.map} +1 -1
  92. package/dist/{chunk-TQ4VGQHG.js → chunk-ULUCGL24.js} +3 -3
  93. package/dist/{chunk-TQ4VGQHG.js.map → chunk-ULUCGL24.js.map} +1 -1
  94. package/dist/{chunk-IRI6LPDX.cjs → chunk-UR4OSH2Q.cjs} +4 -4
  95. package/dist/{chunk-IRI6LPDX.cjs.map → chunk-UR4OSH2Q.cjs.map} +1 -1
  96. package/dist/{chunk-66QN6ZJR.cjs → chunk-URZAK3A3.cjs} +36 -36
  97. package/dist/{chunk-66QN6ZJR.cjs.map → chunk-URZAK3A3.cjs.map} +1 -1
  98. package/dist/{chunk-57S2PLCM.js → chunk-V2QWATXQ.js} +3 -3
  99. package/dist/{chunk-57S2PLCM.js.map → chunk-V2QWATXQ.js.map} +1 -1
  100. package/dist/{chunk-55JI2IGZ.cjs → chunk-VBLJNOVP.cjs} +4 -4
  101. package/dist/{chunk-55JI2IGZ.cjs.map → chunk-VBLJNOVP.cjs.map} +1 -1
  102. package/dist/{chunk-KFAFWPZK.cjs → chunk-VRMACPJR.cjs} +7 -7
  103. package/dist/{chunk-KFAFWPZK.cjs.map → chunk-VRMACPJR.cjs.map} +1 -1
  104. package/dist/{chunk-5Y6V7F6W.cjs → chunk-VWUNPAR2.cjs} +15 -19
  105. package/dist/chunk-VWUNPAR2.cjs.map +1 -0
  106. package/dist/{chunk-T3GTQXGP.js → chunk-W7CQ5MLR.js} +3 -3
  107. package/dist/{chunk-T3GTQXGP.js.map → chunk-W7CQ5MLR.js.map} +1 -1
  108. package/dist/{chunk-AOBNXZLS.cjs → chunk-Y3VXKSW7.cjs} +594 -674
  109. package/dist/chunk-Y3VXKSW7.cjs.map +1 -0
  110. package/dist/{chunk-RTYU6ZGO.cjs → chunk-YCABQ5W4.cjs} +4 -4
  111. package/dist/{chunk-RTYU6ZGO.cjs.map → chunk-YCABQ5W4.cjs.map} +1 -1
  112. package/dist/{chunk-EWHD3BY5.js → chunk-ZHHUEYSB.js} +25 -48
  113. package/dist/chunk-ZHHUEYSB.js.map +1 -0
  114. package/dist/{chunk-5PKIDR2Q.js → chunk-ZHJVABQ6.js} +361 -406
  115. package/dist/chunk-ZHJVABQ6.js.map +1 -0
  116. package/dist/connect/docx.cjs +11 -11
  117. package/dist/connect/docx.js +7 -7
  118. package/dist/connect/index.cjs +1448 -1367
  119. package/dist/connect/index.cjs.map +1 -1
  120. package/dist/connect/index.d.ts +2 -0
  121. package/dist/connect/index.js +545 -466
  122. package/dist/connect/index.js.map +1 -1
  123. package/dist/connect/viewer.cjs +5 -5
  124. package/dist/connect/viewer.js +4 -4
  125. package/dist/connection/account-cluster/ConnectedAccountCluster.d.ts +2 -1
  126. package/dist/connection/facts/useFactFilters.d.ts +46 -0
  127. package/dist/connection/files/fields/ConnectedTagForm.d.ts +1 -1
  128. package/dist/connection/report-problem/ReportProblemDialog.d.ts +10 -8
  129. package/dist/connection/report-problem/useReportProblem.d.ts +2 -6
  130. package/dist/connection/tags/ConnectedTagTable.d.ts +1 -1
  131. package/dist/connection/tags/ConnectedTagsPage.d.ts +3 -1
  132. package/dist/connection/tags/TagsPageSections.d.ts +5 -3
  133. package/dist/connection/tags/tagged-content.d.ts +10 -0
  134. package/dist/connection/threads/useThreadTagFilter.d.ts +10 -0
  135. package/dist/connection/tips/ConnectedTipBar.d.ts +2 -1
  136. package/dist/connection/tips/useContextualHints.d.ts +6 -1
  137. package/dist/embed/index.cjs +13 -12
  138. package/dist/embed/index.js +8 -7
  139. package/dist/facts/index.cjs +45 -45
  140. package/dist/facts/index.js +2 -2
  141. package/dist/files/index.cjs +226 -226
  142. package/dist/files/index.js +2 -2
  143. package/dist/index.cjs +423 -367
  144. package/dist/index.cjs.map +1 -1
  145. package/dist/index.js +76 -16
  146. package/dist/index.js.map +1 -1
  147. package/dist/settings/FilterChip.d.ts +2 -1
  148. package/dist/settings/TriStateFilterMenu.d.ts +1 -0
  149. package/dist/settings/index.cjs +158 -158
  150. package/dist/settings/index.js +2 -2
  151. package/dist/shell/index.cjs +14 -14
  152. package/dist/shell/index.js +1 -1
  153. package/dist/styles.css +1 -1
  154. package/dist/tags/TagDetail.d.ts +2 -2
  155. package/dist/tags/TagTable.d.ts +17 -3
  156. package/dist/tags/index.d.ts +1 -1
  157. package/dist/workflow-canvas/index.cjs +29 -29
  158. package/dist/workflow-canvas/index.js +12 -12
  159. package/node_modules/@arbidocs/coedit/package.json +1 -1
  160. package/package.json +5 -5
  161. package/dist/ConnectedStreamedWordArtifact-7TNIQTVE.cjs.map +0 -1
  162. package/dist/ConnectedStreamedWordArtifact-XEFXYMKS.js.map +0 -1
  163. package/dist/chunk-5PKIDR2Q.js.map +0 -1
  164. package/dist/chunk-5Y6V7F6W.cjs.map +0 -1
  165. package/dist/chunk-7ZL6OVGO.cjs.map +0 -1
  166. package/dist/chunk-AOBNXZLS.cjs.map +0 -1
  167. package/dist/chunk-AQPZ4QMV.cjs.map +0 -1
  168. package/dist/chunk-E3ILJRG4.cjs.map +0 -1
  169. package/dist/chunk-EWHD3BY5.js.map +0 -1
  170. package/dist/chunk-G4GLDQLY.js.map +0 -1
  171. package/dist/chunk-IGQJ6ET3.js.map +0 -1
  172. package/dist/chunk-JMQLTMJ7.js.map +0 -1
  173. package/dist/chunk-MP7XCRHV.js.map +0 -1
  174. package/dist/chunk-PT6D5B6L.cjs.map +0 -1
  175. package/dist/connection/tags/TagPlacement.d.ts +0 -16
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkPNWSEIWS_cjs = require('./chunk-PNWSEIWS.cjs');
5
- var chunk66QN6ZJR_cjs = require('./chunk-66QN6ZJR.cjs');
4
+ var chunkI3HK46DH_cjs = require('./chunk-I3HK46DH.cjs');
5
+ var chunkURZAK3A3_cjs = require('./chunk-URZAK3A3.cjs');
6
6
  var chunkXFL67STW_cjs = require('./chunk-XFL67STW.cjs');
7
- var chunkE3ILJRG4_cjs = require('./chunk-E3ILJRG4.cjs');
7
+ var chunk2HECOUXC_cjs = require('./chunk-2HECOUXC.cjs');
8
8
  var chunkX5AG2UZZ_cjs = require('./chunk-X5AG2UZZ.cjs');
9
9
  var chunk223D4727_cjs = require('./chunk-223D4727.cjs');
10
10
  var chunkQQMMCXBP_cjs = require('./chunk-QQMMCXBP.cjs');
11
+ var chunk4B6HYQTW_cjs = require('./chunk-4B6HYQTW.cjs');
11
12
  var chunkTMX7YFVM_cjs = require('./chunk-TMX7YFVM.cjs');
12
13
  var chunkCS6KNXUO_cjs = require('./chunk-CS6KNXUO.cjs');
13
14
  var chunkF3NMEQF6_cjs = require('./chunk-F3NMEQF6.cjs');
@@ -29,7 +30,7 @@ var chunk725OETK3_cjs = require('./chunk-725OETK3.cjs');
29
30
  var chunkZW6FPIFC_cjs = require('./chunk-ZW6FPIFC.cjs');
30
31
  var chunkUFEXJIEY_cjs = require('./chunk-UFEXJIEY.cjs');
31
32
  var chunk3AWP3O5M_cjs = require('./chunk-3AWP3O5M.cjs');
32
- var React7 = require('react');
33
+ var React6 = require('react');
33
34
  var lucideReact = require('lucide-react');
34
35
  var react = require('@arbidocs/react');
35
36
  var ui = require('@arbidocs/react/ui');
@@ -44,7 +45,7 @@ var reactVirtual = require('@tanstack/react-virtual');
44
45
 
45
46
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
46
47
 
47
- var React7__default = /*#__PURE__*/_interopDefault(React7);
48
+ var React6__default = /*#__PURE__*/_interopDefault(React6);
48
49
 
49
50
  function useDisplayStatus(user, isMe, showPresence) {
50
51
  const wsStatus = react.useArbiWsStatus();
@@ -59,7 +60,7 @@ function useDisplayStatus(user, isMe, showPresence) {
59
60
  }
60
61
  return presence === "online" ? "connected" : "hidden";
61
62
  }
62
- var ConnectedUserEntity = React7.memo(function ConnectedUserEntity2({
63
+ var ConnectedUserEntity = React6.memo(function ConnectedUserEntity2({
63
64
  user,
64
65
  size = "md",
65
66
  variant = "pill",
@@ -75,13 +76,13 @@ var ConnectedUserEntity = React7.memo(function ConnectedUserEntity2({
75
76
  const isMe = !!(user && currentUserId && user.external_id === currentUserId);
76
77
  const displayStatus = useDisplayStatus(user, isMe, showPresence);
77
78
  const { data: workspaces = [] } = react.useWorkspaces();
78
- const sharedWorkspaces = React7.useMemo(() => {
79
+ const sharedWorkspaces = React6.useMemo(() => {
79
80
  if (!user || isMe) return [];
80
81
  return workspaces.filter(
81
82
  (ws) => ws.users?.some((member) => member.user.external_id === user.external_id)
82
83
  );
83
84
  }, [workspaces, user, isMe]);
84
- const agentOwner = React7.useMemo(() => {
85
+ const agentOwner = React6.useMemo(() => {
85
86
  if (!user || !ui.isAgent(user) || !user.parent_ext_id) return null;
86
87
  for (const ws of workspaces) {
87
88
  const found = ws.users?.find((member) => member.user.external_id === user.parent_ext_id);
@@ -328,11 +329,11 @@ function ConnectedProfileCard({
328
329
  const display = profile?.fullName || "Unnamed";
329
330
  return /* @__PURE__ */ jsxRuntime.jsxs(chunkQQMMCXBP_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserCircle, {}), title, children: [
330
331
  /* @__PURE__ */ jsxRuntime.jsx(
331
- chunkE3ILJRG4_cjs.ProfileCard,
332
+ chunk2HECOUXC_cjs.ProfileCard,
332
333
  {
333
334
  avatar: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
334
335
  /* @__PURE__ */ jsxRuntime.jsx(
335
- chunkE3ILJRG4_cjs.AvatarPicker,
336
+ chunk2HECOUXC_cjs.AvatarPicker,
336
337
  {
337
338
  pictureUrl: profile?.picture,
338
339
  initials: chunkUFEXJIEY_cjs.initials(display),
@@ -382,7 +383,7 @@ function ConnectedIdentityVerification({
382
383
  });
383
384
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
384
385
  /* @__PURE__ */ jsxRuntime.jsx(
385
- chunkE3ILJRG4_cjs.IdentityVerificationCard,
386
+ chunk2HECOUXC_cjs.IdentityVerificationCard,
386
387
  {
387
388
  flow,
388
389
  labels,
@@ -391,7 +392,7 @@ function ConnectedIdentityVerification({
391
392
  }
392
393
  ),
393
394
  /* @__PURE__ */ jsxRuntime.jsx(
394
- chunkE3ILJRG4_cjs.IdentityVerificationDialog,
395
+ chunk2HECOUXC_cjs.IdentityVerificationDialog,
395
396
  {
396
397
  flow,
397
398
  accountName: profile?.fullName ?? "",
@@ -404,7 +405,7 @@ function ConnectedIdentityVerification({
404
405
  function ConnectedRequireVerified({ children, labels }) {
405
406
  const { data: profile } = react.useProfile();
406
407
  const flow = react.useIdentityVerification();
407
- return /* @__PURE__ */ jsxRuntime.jsx(chunkE3ILJRG4_cjs.RequireVerified, { flow, accountName: profile?.fullName ?? "", labels, children });
408
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk2HECOUXC_cjs.RequireVerified, { flow, accountName: profile?.fullName ?? "", labels, children });
408
409
  }
409
410
  function ConnectedPasswordChangeDialog({
410
411
  open,
@@ -429,7 +430,7 @@ function ConnectedPasswordChangeDialog({
429
430
  onRecoveryComplete
430
431
  });
431
432
  return /* @__PURE__ */ jsxRuntime.jsx(
432
- chunkE3ILJRG4_cjs.PasswordChangeDialog,
433
+ chunk2HECOUXC_cjs.PasswordChangeDialog,
433
434
  {
434
435
  open,
435
436
  onClose: form.onCancel,
@@ -451,7 +452,7 @@ function ConnectedPasswordChangeDialog({
451
452
  );
452
453
  }
453
454
  function ConnectedSecuritySection({ children }) {
454
- const [open, setOpen] = React7.useState(false);
455
+ const [open, setOpen] = React6.useState(false);
455
456
  return /* @__PURE__ */ jsxRuntime.jsxs(chunkQQMMCXBP_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.KeyRound, {}), title: "Security", children: [
456
457
  /* @__PURE__ */ jsxRuntime.jsxs(chunkQQMMCXBP_cjs.SettingsCard, { padding: "sm", children: [
457
458
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -469,23 +470,23 @@ function ConnectedSecuritySection({ children }) {
469
470
  ] });
470
471
  }
471
472
  function ConnectedNotificationPreferences({
472
- categories = chunkE3ILJRG4_cjs.EMAIL_NOTIFICATION_CATEGORIES,
473
+ categories = chunk2HECOUXC_cjs.EMAIL_NOTIFICATION_CATEGORIES,
473
474
  title = "Notifications"
474
475
  }) {
475
- const keys = React7.useMemo(
476
- () => categories === chunkE3ILJRG4_cjs.EMAIL_NOTIFICATION_CATEGORIES ? chunkE3ILJRG4_cjs.EMAIL_NOTIFICATION_KEYS : categories.map((c) => c.key),
476
+ const keys = React6.useMemo(
477
+ () => categories === chunk2HECOUXC_cjs.EMAIL_NOTIFICATION_CATEGORIES ? chunk2HECOUXC_cjs.EMAIL_NOTIFICATION_KEYS : categories.map((c) => c.key),
477
478
  [categories]
478
479
  );
479
480
  const prefs = react.useNotificationPreferences(keys);
480
481
  return /* @__PURE__ */ jsxRuntime.jsx(chunkQQMMCXBP_cjs.SettingsSection, { title, children: /* @__PURE__ */ jsxRuntime.jsx(chunkQQMMCXBP_cjs.SettingsCard, { className: "space-y-0", children: /* @__PURE__ */ jsxRuntime.jsx(
481
- chunkE3ILJRG4_cjs.NotificationCategoryList,
482
+ chunk2HECOUXC_cjs.NotificationCategoryList,
482
483
  {
483
484
  masterId: "emailNotifications",
484
485
  masterTitle: "Email Notifications",
485
486
  masterDescription: "Email me about activity when I\u2019m away",
486
487
  masterChecked: prefs.masterChecked,
487
488
  onMasterChange: prefs.setAll,
488
- categories: chunkE3ILJRG4_cjs.toNotificationCategories(prefs.checked, categories),
489
+ categories: chunk2HECOUXC_cjs.toNotificationCategories(prefs.checked, categories),
489
490
  onCategoryChange: prefs.setCategory
490
491
  }
491
492
  ) }) });
@@ -494,11 +495,11 @@ function ConnectedSessionsRow({
494
495
  renderSessionIcon = renderSessionStatusIcon
495
496
  }) {
496
497
  const { notify: notify3, confirm } = chunk3AWP3O5M_cjs.useBlocksEnvironment();
497
- const [open, setOpen] = React7.useState(false);
498
+ const [open, setOpen] = React6.useState(false);
498
499
  const sessions = react.useSessions({ enabled: open });
499
500
  const currentSessionId = react.useCurrentSessionId();
500
501
  const terminate = react.useTerminateSession();
501
- const views = chunkE3ILJRG4_cjs.toActiveSessionViews(sessions.data ?? [], {
502
+ const views = chunk2HECOUXC_cjs.toActiveSessionViews(sessions.data ?? [], {
502
503
  currentSessionId,
503
504
  terminatingId: terminate.isPending ? terminate.variables : null,
504
505
  renderIcon: renderSessionIcon
@@ -527,7 +528,7 @@ function ConnectedSessionsRow({
527
528
  }
528
529
  ),
529
530
  /* @__PURE__ */ jsxRuntime.jsx(
530
- chunkE3ILJRG4_cjs.ActiveSessionsDialog,
531
+ chunk2HECOUXC_cjs.ActiveSessionsDialog,
531
532
  {
532
533
  open,
533
534
  onOpenChange: setOpen,
@@ -570,7 +571,7 @@ function ConnectedLogoutDialog({
570
571
  signOut.mutate({ everywhere, reason: "manual" });
571
572
  };
572
573
  return /* @__PURE__ */ jsxRuntime.jsx(
573
- chunkE3ILJRG4_cjs.LogoutDialog,
574
+ chunk2HECOUXC_cjs.LogoutDialog,
574
575
  {
575
576
  open,
576
577
  onClose,
@@ -578,15 +579,15 @@ function ConnectedLogoutDialog({
578
579
  onLogoutAll: () => void run(true),
579
580
  canLogoutAll: canLogoutAll ?? !(user && ui.isAgent(user)),
580
581
  isOnline,
581
- sessions: chunkE3ILJRG4_cjs.toLogoutSessionViews(sessions.data ?? []),
582
+ sessions: chunk2HECOUXC_cjs.toLogoutSessionViews(sessions.data ?? []),
582
583
  renderSessionIcon
583
584
  }
584
585
  );
585
586
  }
586
587
  function ConnectedDangerZone({ renderSubscriptionLink }) {
587
588
  const { notify: notify3 } = chunk3AWP3O5M_cjs.useBlocksEnvironment();
588
- const [zoneOpen, setZoneOpen] = React7.useState(false);
589
- const [dialogOpen, setDialogOpen] = React7.useState(false);
589
+ const [zoneOpen, setZoneOpen] = React6.useState(false);
590
+ const [dialogOpen, setDialogOpen] = React6.useState(false);
590
591
  const { data: profile } = react.useProfile();
591
592
  const userEmail = profile?.email ?? "";
592
593
  const remove = react.useDeleteAccount();
@@ -620,12 +621,12 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
620
621
  }
621
622
  ),
622
623
  /* @__PURE__ */ jsxRuntime.jsx(
623
- chunkE3ILJRG4_cjs.DeleteAccountDialog,
624
+ chunk2HECOUXC_cjs.DeleteAccountDialog,
624
625
  {
625
626
  open: dialogOpen,
626
627
  onClose: flow.onClose,
627
628
  step: flow.step,
628
- blockers: chunkE3ILJRG4_cjs.toDeleteBlockerViews(flow.blockers, renderSubscriptionLink),
629
+ blockers: chunk2HECOUXC_cjs.toDeleteBlockerViews(flow.blockers, renderSubscriptionLink),
629
630
  onContinue: flow.onContinue,
630
631
  onBack: flow.onBack,
631
632
  userEmail,
@@ -657,7 +658,7 @@ function useModelPicker({
657
658
  });
658
659
  const sendConfigModel = sendConfig ? react.resolveConfigModel(sendConfig) : void 0;
659
660
  const premiumModelPref = userSettings?.premium_model;
660
- const { standardTier, premiumTier, developerModels } = React7.useMemo(() => {
661
+ const { standardTier, premiumTier, developerModels } = React6.useMemo(() => {
661
662
  const empty = {
662
663
  standardTier: null,
663
664
  premiumTier: null,
@@ -694,11 +695,11 @@ function useModelPicker({
694
695
  return { standardTier: standardTier2, premiumTier: premiumTier2, developerModels: [...custom, ...developer] };
695
696
  }, [availableModels, isDeveloper, premiumModelPref]);
696
697
  const selectedModel = (isControlled ? controlledValue : currentConversationModel || sendConfigModel) || react.AUTO_CHAT_MODEL;
697
- const selectedModelInfo = React7.useMemo(
698
+ const selectedModelInfo = React6.useMemo(
698
699
  () => availableModels?.models?.find((m) => m.model_name === selectedModel),
699
700
  [availableModels, selectedModel]
700
701
  );
701
- const handleModelChange = React7.useCallback(
702
+ const handleModelChange = React6.useCallback(
702
703
  (value) => {
703
704
  if (isControlled) {
704
705
  controlledOnChange?.(value);
@@ -712,7 +713,7 @@ function useModelPicker({
712
713
  [isControlled, controlledOnChange, applyChatModel]
713
714
  );
714
715
  const isAuto = selectedModel === react.AUTO_CHAT_MODEL;
715
- React7.useEffect(() => {
716
+ React6.useEffect(() => {
716
717
  if (isControlled) return;
717
718
  if (!premiumTier) return;
718
719
  const onPremium = premiumTier.members.some((m) => m.model_name === selectedModel);
@@ -724,14 +725,14 @@ function useModelPicker({
724
725
  if (selectedModel === premiumTier.resolvedModelName) return;
725
726
  handleModelChange(premiumTier.resolvedModelName);
726
727
  }, [isControlled, premiumTier, selectedModel, premiumModelPref, handleModelChange]);
727
- const pricing = React7.useMemo(() => {
728
+ const pricing = React6.useMemo(() => {
728
729
  if (isAuto || !selectedModelInfo) return null;
729
730
  const inputPrice = react.formatGbpPerMillionTokens(selectedModelInfo.input_cost_per_token);
730
731
  const outputPrice = react.formatGbpPerMillionTokens(selectedModelInfo.output_cost_per_token);
731
732
  if (!inputPrice && !outputPrice) return null;
732
733
  return { inputPrice, outputPrice, modelName: selectedModelInfo.model_name };
733
734
  }, [selectedModelInfo, isAuto]);
734
- const openPremiumSettings = React7.useCallback(() => openSettings("chat"), [openSettings]);
735
+ const openPremiumSettings = React6.useCallback(() => openSettings("chat"), [openSettings]);
735
736
  return {
736
737
  standardTier,
737
738
  premiumTier,
@@ -774,7 +775,7 @@ function ConnectedModelSelector({
774
775
  pricing,
775
776
  handleModelChange
776
777
  } = picker;
777
- const [isOpen, setIsOpen] = React7.useState(false);
778
+ const [isOpen, setIsOpen] = React6.useState(false);
778
779
  const standardIcon = (model) => {
779
780
  let tier = TAG_TIER[model.model_name];
780
781
  if (!tier) {
@@ -966,6 +967,308 @@ function ConnectedModelSelector({
966
967
  tooltip && /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "top", children: tooltip })
967
968
  ] }) });
968
969
  }
970
+ function useHintsVisibility() {
971
+ const { data: userSettings } = react.useUserSettings();
972
+ const [sessionOverride] = react.useTransientView(chunk4B6HYQTW_cjs.TIPS_VISIBILITY_OVERRIDE, null);
973
+ return {
974
+ showHints: sessionOverride ?? userSettings?.show_hints ?? true,
975
+ settingsLoaded: userSettings !== void 0,
976
+ isDeveloper: userSettings?.developer === true
977
+ };
978
+ }
979
+ function useContextualHints() {
980
+ const visibility = useHintsVisibility();
981
+ const session = react.useArbiSessionStore();
982
+ const updateUserSettings = react.useUpdateUserSettings();
983
+ const setShowHints = (value) => chunk4B6HYQTW_cjs.setHintsSessionOverride(session, value);
984
+ const setShowHintsPersisted = (value) => {
985
+ chunk4B6HYQTW_cjs.setHintsSessionOverride(session, null);
986
+ updateUserSettings.mutate({ show_hints: value });
987
+ };
988
+ return {
989
+ ...visibility,
990
+ setShowHints,
991
+ setShowHintsPersisted,
992
+ dismissHints: () => setShowHints(false)
993
+ };
994
+ }
995
+ function useSlashItems(text, builtinSkills = []) {
996
+ const { data: listings } = react.useSkills();
997
+ const skillsEnabled = react.useUserSettings().data?.show_skills ?? false;
998
+ const { commands } = react.useBuiltinCommands();
999
+ const slashToken = chunkCS6KNXUO_cjs.parseSlashTokenInProgress(text);
1000
+ const slashItems = React6.useMemo(
1001
+ () => chunkCS6KNXUO_cjs.buildSlashItems(
1002
+ commands.map((c) => ({
1003
+ name: c.name,
1004
+ description: c.description,
1005
+ argHint: c.arg_hint,
1006
+ kind: "command"
1007
+ })),
1008
+ skillsEnabled ? skillItems(builtinSkills, listings ?? []) : []
1009
+ ),
1010
+ [commands, listings, skillsEnabled, builtinSkills]
1011
+ );
1012
+ const filteredItems = React6.useMemo(
1013
+ () => slashToken !== null ? chunkCS6KNXUO_cjs.filterSlashItems(slashItems, slashToken) : [],
1014
+ [slashItems, slashToken]
1015
+ );
1016
+ return {
1017
+ slashToken,
1018
+ filteredItems,
1019
+ isOpen: slashToken !== null && filteredItems.length > 0,
1020
+ /** The menu's "Browse all" footer opens the Skills browser: only for skills users. */
1021
+ canBrowseSkills: skillsEnabled
1022
+ };
1023
+ }
1024
+ function skillItems(builtinSkills, listings) {
1025
+ const { host, skills } = chunk555BS22J_cjs.mergeSkillWorkflows([...builtinSkills], listings);
1026
+ const listing = new Map(listings.map((s) => [s.slug, s]));
1027
+ return [
1028
+ ...host.map((w) => ({
1029
+ name: w.id,
1030
+ description: w.description,
1031
+ argHint: w.inputs[0]?.label ?? "",
1032
+ visibility: "global",
1033
+ kind: "skill"
1034
+ })),
1035
+ ...skills.map((w) => {
1036
+ const s = listing.get(w.id);
1037
+ return {
1038
+ name: w.id,
1039
+ description: s?.description || (w.title !== w.id ? w.title : ""),
1040
+ argHint: s?.arg_hint ?? "",
1041
+ visibility: s?.visibility === "global" ? "global" : "mine",
1042
+ kind: "skill"
1043
+ };
1044
+ })
1045
+ ];
1046
+ }
1047
+ var ConversationComposerComponent = function ConversationComposer({
1048
+ value,
1049
+ onValueChange,
1050
+ handleSendMessage,
1051
+ isGenerating = false,
1052
+ compact = false,
1053
+ inputRef,
1054
+ isBranching = false,
1055
+ onCancelBranching,
1056
+ placeholder,
1057
+ onOpenSettings,
1058
+ leftButton,
1059
+ rightButton,
1060
+ modelSelector,
1061
+ skills,
1062
+ onBrowseSkills,
1063
+ contextUsage,
1064
+ isConversationEmpty = false,
1065
+ shouldOfferFollowUp = true
1066
+ }) {
1067
+ const session = react.useArbiSessionStore();
1068
+ const sessionDraft = react.useArbiSessionState(react.selectDraft);
1069
+ const newMessage = value ?? sessionDraft;
1070
+ const setNewMessage = onValueChange ?? session.setDraft;
1071
+ const { showHints } = useHintsVisibility();
1072
+ const suggestedQuery = react.useArbiSessionState((s) => s.suggestedQuery);
1073
+ const currentConversationId = react.useArbiSessionState((s) => s.conversationId);
1074
+ const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
1075
+ const longPaste = chunkCS6KNXUO_cjs.useLongPaste(newMessage);
1076
+ const textareaRef = React6.useRef(null);
1077
+ const formRef = React6.useRef(null);
1078
+ React6.useLayoutEffect(() => {
1079
+ const el = formRef.current;
1080
+ if (!el) return;
1081
+ const apply = () => {
1082
+ document.documentElement.style.setProperty("--chat-input-width", `${el.offsetWidth}px`);
1083
+ const rect = el.getBoundingClientRect();
1084
+ document.documentElement.style.setProperty("--chat-input-left", `${rect.left}px`);
1085
+ document.documentElement.style.setProperty("--chat-input-top", `${rect.top}px`);
1086
+ };
1087
+ apply();
1088
+ const ro = new ResizeObserver(apply);
1089
+ ro.observe(el);
1090
+ return () => ro.disconnect();
1091
+ }, []);
1092
+ React6.useLayoutEffect(() => {
1093
+ if (textareaRef.current && inputRef && "current" in inputRef) {
1094
+ inputRef.current = textareaRef.current;
1095
+ }
1096
+ }, [inputRef]);
1097
+ const {
1098
+ slashToken,
1099
+ filteredItems,
1100
+ isOpen: isSlashMenuOpen,
1101
+ canBrowseSkills
1102
+ } = useSlashItems(newMessage, skills?.builtin);
1103
+ const insertSlashItem = (item) => {
1104
+ if (skills?.openFor(item)) {
1105
+ setNewMessage("");
1106
+ return;
1107
+ }
1108
+ setNewMessage(`/${item.name} `);
1109
+ requestAnimationFrame(() => {
1110
+ const ta = textareaRef.current;
1111
+ if (!ta) return;
1112
+ ta.focus();
1113
+ const end = `/${item.name} `.length;
1114
+ ta.setSelectionRange(end, end);
1115
+ });
1116
+ };
1117
+ const { data: users } = react.useWorkspaceUsers();
1118
+ const currentUserId = react.useArbiSession().user?.external_id;
1119
+ const assistantName = react.useAssistantName();
1120
+ const mentionCandidates = React6.useMemo(
1121
+ () => react.buildMentionCandidates(users ?? [], currentUserId, assistantName),
1122
+ [users, currentUserId, assistantName]
1123
+ );
1124
+ const mention = chunkP6TPVQRU_cjs.useMentionAutocomplete({
1125
+ value: newMessage,
1126
+ onValueChange: setNewMessage,
1127
+ candidates: mentionCandidates,
1128
+ textareaRef
1129
+ });
1130
+ const { data: conversations } = react.useConversations(workspaceId ?? void 0);
1131
+ const isThread = conversations?.find((conversation) => conversation.external_id === currentConversationId)?.is_shared ?? false;
1132
+ const prefillsAssistant = isThread && !isBranching;
1133
+ const recipient = chunkCS6KNXUO_cjs.useRecipientDraft({
1134
+ value: newMessage,
1135
+ onValueChange: setNewMessage,
1136
+ contextKey: currentConversationId,
1137
+ defaultLabel: prefillsAssistant ? assistantName : null
1138
+ });
1139
+ const slashNav = chunk75BNMCUX_cjs.useListKeyNav({
1140
+ open: isSlashMenuOpen,
1141
+ items: filteredItems,
1142
+ onPick: insertSlashItem,
1143
+ // Clear the leading slash to fully dismiss; otherwise the menu reopens on the next letter.
1144
+ onDismiss: () => setNewMessage(""),
1145
+ resetKey: slashToken
1146
+ });
1147
+ const isComposerMenuOpen = isSlashMenuOpen || mention.isOpen;
1148
+ React6.useEffect(() => {
1149
+ if (isComposerMenuOpen) session.setActiveCitationKey(null);
1150
+ }, [isComposerMenuOpen, session]);
1151
+ const followUp = !newMessage && !isBranching && !isGenerating && shouldOfferFollowUp && showHints && suggestedQuery && suggestedQuery.conversationExtId === currentConversationId ? suggestedQuery.text : null;
1152
+ const sendDraft = () => {
1153
+ handleSendMessage();
1154
+ textareaRef.current?.focus();
1155
+ if (isBranching && onCancelBranching) onCancelBranching();
1156
+ };
1157
+ const onKeyDown = (event) => {
1158
+ if (recipient.handleKeyDown(event)) return;
1159
+ if (slashNav.handleKeyDown(event)) return;
1160
+ if (mention.nav.handleKeyDown(event)) return;
1161
+ if (followUp && event.key === "Tab" && !event.shiftKey) {
1162
+ event.preventDefault();
1163
+ setNewMessage(followUp);
1164
+ return;
1165
+ }
1166
+ if (event.key === "Escape" && isBranching && onCancelBranching) {
1167
+ event.preventDefault();
1168
+ onCancelBranching();
1169
+ }
1170
+ };
1171
+ const handleSubmit = (e) => {
1172
+ e.preventDefault();
1173
+ if (recipient.hasBody) sendDraft();
1174
+ };
1175
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(
1176
+ chunkF3NMEQF6_cjs.Composer.Root,
1177
+ {
1178
+ onSubmit: handleSubmit,
1179
+ formRef,
1180
+ isBranching,
1181
+ notice: isBranching ? /* @__PURE__ */ jsxRuntime.jsx(chunkF3NMEQF6_cjs.Composer.Notice, { onCancel: onCancelBranching }) : void 0,
1182
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1183
+ chunkF3NMEQF6_cjs.Composer.Frame,
1184
+ {
1185
+ className: compact ? "rounded-none border-0 px-0 py-0 shadow-none focus-within:shadow-none" : void 0,
1186
+ children: [
1187
+ /* @__PURE__ */ jsxRuntime.jsx(
1188
+ chunkCS6KNXUO_cjs.SlashMenu,
1189
+ {
1190
+ open: isSlashMenuOpen,
1191
+ items: filteredItems,
1192
+ selectedIndex: slashNav.selectedIndex,
1193
+ setSelectedIndex: slashNav.setSelectedIndex,
1194
+ listboxId: slashNav.listboxId,
1195
+ onSelect: insertSlashItem,
1196
+ onBrowse: canBrowseSkills ? onBrowseSkills : void 0
1197
+ }
1198
+ ),
1199
+ /* @__PURE__ */ jsxRuntime.jsx(
1200
+ chunk75BNMCUX_cjs.MentionMenu,
1201
+ {
1202
+ open: mention.isOpen,
1203
+ items: mention.items,
1204
+ selectedIndex: mention.nav.selectedIndex,
1205
+ setSelectedIndex: mention.nav.setSelectedIndex,
1206
+ listboxId: mention.nav.listboxId,
1207
+ onSelect: mention.pick
1208
+ }
1209
+ ),
1210
+ /* @__PURE__ */ jsxRuntime.jsx(
1211
+ chunkF3NMEQF6_cjs.Composer.Input,
1212
+ {
1213
+ value: newMessage,
1214
+ onValueChange: (next) => {
1215
+ mention.onValueChange(next);
1216
+ longPaste.onValueChange(next);
1217
+ },
1218
+ onPaste: (event) => longPaste.onPaste(event, newMessage),
1219
+ onKeyDown,
1220
+ textareaProps: {
1221
+ ...mention.isOpen ? mention.nav.comboboxProps : slashNav.comboboxProps,
1222
+ ...mention.textareaProps
1223
+ },
1224
+ textareaRef,
1225
+ isPasteCollapsed: longPaste.isCollapsed,
1226
+ onExpandPaste: () => {
1227
+ longPaste.expand();
1228
+ requestAnimationFrame(() => textareaRef.current?.focus());
1229
+ },
1230
+ isRoomy: isConversationEmpty,
1231
+ isSuggestion: !!followUp,
1232
+ compact,
1233
+ placeholder: followUp || placeholder || (isBranching ? "Edit message to create a branch..." : isThread ? "Message the thread\u2026 @mention someone to notify them" : isGenerating ? "Type your next prompt..." : "Ask ARBI anything\u2026")
1234
+ }
1235
+ ),
1236
+ /* @__PURE__ */ jsxRuntime.jsx(
1237
+ chunkF3NMEQF6_cjs.Composer.Toolbar,
1238
+ {
1239
+ className: compact ? "flex-nowrap" : void 0,
1240
+ leading: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1241
+ leftButton,
1242
+ compact && modelSelector,
1243
+ onOpenSettings && /* @__PURE__ */ jsxRuntime.jsx(
1244
+ ui.Button,
1245
+ {
1246
+ type: "button",
1247
+ variant: "ghost",
1248
+ size: "sm",
1249
+ onClick: onOpenSettings,
1250
+ className: "h-8 w-8 p-0 pointer-coarse:h-11 pointer-coarse:w-11",
1251
+ "aria-label": "Chat settings",
1252
+ title: "Chat settings",
1253
+ "data-testid": "message-input-settings-button",
1254
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "h-4 w-4 text-muted-foreground" })
1255
+ }
1256
+ )
1257
+ ] }),
1258
+ trailing: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1259
+ !compact && modelSelector,
1260
+ rightButton
1261
+ ] })
1262
+ }
1263
+ ),
1264
+ /* @__PURE__ */ jsxRuntime.jsx(chunkCS6KNXUO_cjs.ContextUsageBar, { contextUsage, draftLength: newMessage.length })
1265
+ ]
1266
+ }
1267
+ )
1268
+ }
1269
+ ) });
1270
+ };
1271
+ var ConversationComposer2 = React6.memo(ConversationComposerComponent);
969
1272
  function MessageLiveSecondsComponent({
970
1273
  conversationId,
971
1274
  messageId,
@@ -985,7 +1288,7 @@ function MessageLiveSecondsComponent({
985
1288
  suffix
986
1289
  ] });
987
1290
  }
988
- var MessageLiveSeconds = React7__default.default.memo(MessageLiveSecondsComponent);
1291
+ var MessageLiveSeconds = React6__default.default.memo(MessageLiveSecondsComponent);
989
1292
  var DISPLAY_FIELDS = /* @__PURE__ */ new Set(["tool", "label", "icon", "summary"]);
990
1293
  function getToolParams(detail) {
991
1294
  const params = [];
@@ -1016,7 +1319,7 @@ var AgentStepsComponent = ({
1016
1319
  const { data: userSettings } = react.useUserSettings();
1017
1320
  const isDeveloper = userSettings?.developer === true;
1018
1321
  const { data: documents = [] } = react.useDocuments();
1019
- const docInfo = React7.useMemo(() => {
1322
+ const docInfo = React6.useMemo(() => {
1020
1323
  const map = {};
1021
1324
  const docArray = Array.isArray(documents) ? documents : [];
1022
1325
  for (const doc of docArray) {
@@ -1031,13 +1334,13 @@ var AgentStepsComponent = ({
1031
1334
  return map;
1032
1335
  }, [documents]);
1033
1336
  const { data: availableModels } = react.useAvailableModels();
1034
- const getModelTag = React7.useMemo(() => {
1337
+ const getModelTag = React6.useMemo(() => {
1035
1338
  return (modelName) => {
1036
1339
  if (!modelName || !availableModels?.models) return null;
1037
1340
  return availableModels.models.find((m) => m.model_name === modelName)?.tags?.[0] || null;
1038
1341
  };
1039
1342
  }, [availableModels]);
1040
- const mergedSteps = React7.useMemo(() => {
1343
+ const mergedSteps = React6.useMemo(() => {
1041
1344
  const merged = browser.mergeAgentSteps(steps);
1042
1345
  if (!hideLive) return merged;
1043
1346
  const runningHandles = new Set(
@@ -1045,7 +1348,7 @@ var AgentStepsComponent = ({
1045
1348
  );
1046
1349
  return merged.filter((s) => !(s.subagent && runningHandles.has(s.subagent)));
1047
1350
  }, [steps, hideLive]);
1048
- const stepDurations = React7.useMemo(() => {
1351
+ const stepDurations = React6.useMemo(() => {
1049
1352
  const durations = [];
1050
1353
  for (let i = 0; i < mergedSteps.length; i++) {
1051
1354
  const currentT = mergedSteps[i].t;
@@ -1063,10 +1366,10 @@ var AgentStepsComponent = ({
1063
1366
  }
1064
1367
  return durations;
1065
1368
  }, [mergedSteps, totalElapsedTime]);
1066
- const stepTokens = React7.useMemo(() => {
1369
+ const stepTokens = React6.useMemo(() => {
1067
1370
  return mergedSteps.map((step) => step.step_tokens ?? null);
1068
1371
  }, [mergedSteps]);
1069
- const stepGbp = React7.useMemo(() => {
1372
+ const stepGbp = React6.useMemo(() => {
1070
1373
  return mergedSteps.map((step) => step.step_gbp ?? null);
1071
1374
  }, [mergedSteps]);
1072
1375
  const currentStepIndex = isStreaming ? browser.getCurrentStep(mergedSteps)?.index : void 0;
@@ -1303,7 +1606,7 @@ function subStepNoun(tool) {
1303
1606
  function pluralise(noun) {
1304
1607
  return noun.endsWith("h") ? `${noun}es` : `${noun}s`;
1305
1608
  }
1306
- var AgentSteps = React7__default.default.memo(AgentStepsComponent, (prev, next) => {
1609
+ var AgentSteps = React6__default.default.memo(AgentStepsComponent, (prev, next) => {
1307
1610
  return prev.isStreaming === next.isStreaming && prev.className === next.className && prev.totalElapsedTime === next.totalElapsedTime && prev.steps === next.steps && prev.liveTimer === next.liveTimer && prev.hideLive === next.hideLive;
1308
1611
  });
1309
1612
  function groupStepsByHandle(steps) {
@@ -1328,8 +1631,8 @@ function RunningSubagentsRoster({
1328
1631
  className
1329
1632
  }) {
1330
1633
  const { threads, setParentMessageId: selectThread } = react.useConversationData();
1331
- const stepsByHandle = React7.useMemo(() => groupStepsByHandle(steps), [steps]);
1332
- const rosterLanes = React7.useMemo(
1634
+ const stepsByHandle = React6.useMemo(() => groupStepsByHandle(steps), [steps]);
1635
+ const rosterLanes = React6.useMemo(
1333
1636
  () => lanes.map((lane) => ({
1334
1637
  handle: lane.handle,
1335
1638
  status: lane.status,
@@ -1367,16 +1670,16 @@ function AnswerTable({
1367
1670
  className,
1368
1671
  ...props
1369
1672
  }) {
1370
- const wrapperRef = React7.useRef(null);
1371
- const scrollRef = React7.useRef(null);
1372
- const [hasMoreRight, setHasMoreRight] = React7.useState(false);
1373
- const checkOverflow = React7.useCallback(() => {
1673
+ const wrapperRef = React6.useRef(null);
1674
+ const scrollRef = React6.useRef(null);
1675
+ const [hasMoreRight, setHasMoreRight] = React6.useState(false);
1676
+ const checkOverflow = React6.useCallback(() => {
1374
1677
  const el = scrollRef.current;
1375
1678
  if (!el) return;
1376
1679
  const more = el.scrollLeft + el.clientWidth < el.scrollWidth - 1;
1377
1680
  setHasMoreRight((prev) => prev === more ? prev : more);
1378
1681
  }, []);
1379
- React7.useEffect(() => {
1682
+ React6.useEffect(() => {
1380
1683
  const el = scrollRef.current;
1381
1684
  if (!el) return;
1382
1685
  checkOverflow();
@@ -1385,12 +1688,12 @@ function AnswerTable({
1385
1688
  if (el.firstElementChild) observer.observe(el.firstElementChild);
1386
1689
  return () => observer.disconnect();
1387
1690
  }, [checkOverflow]);
1388
- const scrollRight = React7.useCallback(() => {
1691
+ const scrollRight = React6.useCallback(() => {
1389
1692
  const el = scrollRef.current;
1390
1693
  if (!el) return;
1391
1694
  el.scrollBy({ left: 240, behavior: "smooth" });
1392
1695
  }, []);
1393
- const handleDownload = React7.useCallback(async () => {
1696
+ const handleDownload = React6.useCallback(async () => {
1394
1697
  const table = wrapperRef.current?.querySelector("table");
1395
1698
  if (!table || !wrapperRef.current) return;
1396
1699
  try {
@@ -1465,7 +1768,7 @@ function AnswerTable({
1465
1768
  function useOpenChunk() {
1466
1769
  const { openDocument } = chunk3AWP3O5M_cjs.useBlocksEnvironment();
1467
1770
  const { data: documents } = react.useDocuments();
1468
- return React7.useCallback(
1771
+ return React6.useCallback(
1469
1772
  (chunk) => {
1470
1773
  const meta = chunk.metadata;
1471
1774
  if (!meta?.doc_ext_id) return;
@@ -1480,7 +1783,7 @@ function useOpenChunk() {
1480
1783
  }
1481
1784
  function useWorkspaceDocTitles() {
1482
1785
  const { data } = react.useDocuments();
1483
- return React7.useMemo(
1786
+ return React6.useMemo(
1484
1787
  () => new Map(
1485
1788
  (data ?? []).map((doc) => [doc.external_id, ui.getDocumentTitle(doc)])
1486
1789
  ),
@@ -1510,497 +1813,122 @@ function withAnswerTable(components) {
1510
1813
  return merged;
1511
1814
  }
1512
1815
  var renderMarkdown = ({ components, isStreaming, children }) => /* @__PURE__ */ jsxRuntime.jsx(chunkX5AG2UZZ_cjs.ConnectedMarkdown, { components: withAnswerTable(components), isStreaming, children });
1513
- function LinkInAnswer({ href, children, ...props }) {
1514
- const docId = chunkZ2XZ2D4N_cjs.workspaceDocIdFromHref(href, chunk3AWP3O5M_cjs.useBlocksEnvironment().runtimeConfig.deploymentDomain);
1515
- if (docId) {
1516
- return /* @__PURE__ */ jsxRuntime.jsx(chunkX5AG2UZZ_cjs.InternalDocLink, { docId, href, ...props, children });
1517
- }
1518
- return /* @__PURE__ */ jsxRuntime.jsx(chunkX5AG2UZZ_cjs.ExternalLink, { href, ...props, children });
1519
- }
1520
- var ConnectedCitationRendererComponent = ({
1521
- alwaysInteractive,
1522
- ...props
1523
- }) => {
1524
- const session = react.useArbiSessionStore();
1525
- const openChunk = useOpenChunk();
1526
- const docTitles = useWorkspaceDocTitles();
1527
- const onOpenCitation = React7.useCallback(
1528
- (citationKey) => session.setActiveCitationKey(citationKey),
1529
- [session]
1530
- );
1531
- const onActivateChunk = React7.useCallback(
1532
- ({ messageId, citationNum, chunk }) => {
1533
- session.setActiveCitationKey(`${messageId}-${citationNum}`);
1534
- if (chunk.metadata.chunk_ext_id) openChunk(chunk);
1535
- },
1536
- [session, openChunk]
1537
- );
1538
- const onCloseCitation = React7.useCallback(() => {
1539
- session.setActiveCitationKey(null);
1540
- const viewing = session.getState().viewingDocument;
1541
- if (viewing?.passageId) session.setViewingDocument({ id: viewing.id, passageId: null });
1542
- }, [session]);
1543
- const onDismissCitation = React7.useCallback(() => session.setActiveCitationKey(null), [session]);
1544
- return /* @__PURE__ */ jsxRuntime.jsx(
1545
- react.CitationRenderer,
1546
- {
1547
- ...props,
1548
- renderMarkdown,
1549
- ExternalLink: LinkInAnswer,
1550
- onOpenCitation,
1551
- onActivateChunk,
1552
- useCitationState: alwaysInteractive ? useCitationStateAlwaysInteractive : useCitationState,
1553
- onCloseCitation,
1554
- onDismissCitation,
1555
- notify: notifyCitation,
1556
- docTitles
1557
- }
1558
- );
1559
- };
1560
- var ConnectedCitationRenderer = React7__default.default.memo(ConnectedCitationRendererComponent);
1561
- function sourceTitle(chunk, docTitles) {
1562
- const displayTitle = chunk.metadata.doc_ext_id ? docTitles.get(chunk.metadata.doc_ext_id) : void 0;
1563
- return displayTitle ?? chunk.metadata.doc_title ?? chunk.metadata.doc_ext_id ?? "Source";
1564
- }
1565
- function retrievedSources(citationData, docTitles) {
1566
- const seen = /* @__PURE__ */ new Map();
1567
- Object.values(citationData || {}).forEach((docChunks) => {
1568
- if (!Array.isArray(docChunks)) return;
1569
- docChunks.forEach((chunk) => {
1570
- const chunkId = chunk?.metadata?.chunk_ext_id;
1571
- if (!chunkId) return;
1572
- const key = `${chunk.metadata.doc_ext_id ?? ""}:${chunk.metadata.page_number ?? ""}`;
1573
- if (seen.has(key)) return;
1574
- seen.set(key, {
1575
- num: String(seen.size + 1),
1576
- chunkIds: [chunkId],
1577
- chunk,
1578
- title: sourceTitle(chunk, docTitles),
1579
- page: chunk.metadata.page_number
1580
- });
1581
- });
1582
- });
1583
- return [...seen.values()];
1584
- }
1585
- var SourceChips = ({ messageId, citations, citationData }) => {
1586
- const compact = chunkMCXS6X37_cjs.useCompactChat();
1587
- const session = react.useArbiSessionStore();
1588
- const openChunk = useOpenChunk();
1589
- const docTitles = useWorkspaceDocTitles();
1590
- const sources = React7.useMemo(() => {
1591
- if (!citations) return retrievedSources(citationData, docTitles);
1592
- const chunkMap = /* @__PURE__ */ new Map();
1593
- Object.values(citationData || {}).forEach((docChunks) => {
1594
- if (Array.isArray(docChunks)) {
1595
- docChunks.forEach((chunk) => {
1596
- if (chunk?.metadata?.chunk_ext_id) chunkMap.set(chunk.metadata.chunk_ext_id, chunk);
1597
- });
1598
- }
1599
- });
1600
- return Object.entries(citations).sort(([a], [b]) => Number(a) - Number(b)).map(([num, chunkIds]) => {
1601
- const chunk = chunkIds.map((id) => chunkMap.get(id)).find((c) => !!c);
1602
- if (!chunk) return null;
1603
- return {
1604
- num,
1605
- chunkIds,
1606
- chunk,
1607
- title: sourceTitle(chunk, docTitles),
1608
- page: chunk.metadata.page_number
1609
- };
1610
- }).filter((c) => c !== null);
1611
- }, [citations, citationData, docTitles]);
1612
- const open = (num) => {
1613
- const source = sources.find((s) => s.num === num);
1614
- if (!source) return;
1615
- if (!citations) {
1616
- openChunk(source.chunk);
1617
- return;
1618
- }
1619
- session.setActiveCitationKey(`${messageId}-${num}`);
1620
- if (source.chunk.metadata.chunk_ext_id) openChunk(source.chunk);
1621
- };
1622
- if (compact && sources.length)
1623
- return /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "mt-2 text-xs text-muted-foreground", children: [
1624
- /* @__PURE__ */ jsxRuntime.jsx("summary", { className: "cursor-pointer py-1", children: "Sources" }),
1625
- /* @__PURE__ */ jsxRuntime.jsx(chunkF3NMEQF6_cjs.MessageSources, { messageId, sources, onOpenSource: open })
1626
- ] });
1627
- return /* @__PURE__ */ jsxRuntime.jsx(chunkF3NMEQF6_cjs.MessageSources, { messageId, sources, onOpenSource: open });
1628
- };
1629
- function MessageDetailsModal({
1630
- open,
1631
- onOpenChange,
1632
- messageExtId,
1633
- workspace
1634
- }) {
1635
- const {
1636
- data: messageDetails,
1637
- isLoading,
1638
- error
1639
- } = react.useMessageDetails(messageExtId, { enabled: open && !!messageExtId });
1640
- const currentConversationId = react.useArbiSessionState((s) => s.conversationId);
1641
- const conversationTitle = messageDetails?.conversation_ext_id === currentConversationId ? "Current Conversation" : "Message";
1642
- return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
1643
- ui.DialogContent,
1644
- {
1645
- presentation: "sheet",
1646
- className: "max-w-4xl max-h-[calc(100dvh-2rem)] overflow-hidden flex flex-col",
1647
- "data-testid": "message-details-modal",
1648
- children: [
1649
- /* @__PURE__ */ jsxRuntime.jsx(
1650
- chunk223D4727_cjs.ModalBreadcrumbHeader,
1651
- {
1652
- icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { size: 20 }),
1653
- title: "Message Details",
1654
- subtitle: workspace || currentConversationId ? /* @__PURE__ */ jsxRuntime.jsx(
1655
- chunk223D4727_cjs.ModalCrumbs,
1656
- {
1657
- items: [
1658
- ...workspace ? [
1659
- {
1660
- icon: workspace.icon,
1661
- label: workspace.name
1662
- }
1663
- ] : [],
1664
- ...currentConversationId ? [{ label: conversationTitle }] : []
1665
- ]
1666
- }
1667
- ) : void 0,
1668
- description: "Full message data including execution trace and metadata"
1669
- }
1670
- ),
1671
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 overflow-auto p-4 bg-muted/20 rounded-md", children: [
1672
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(
1673
- "div",
1674
- {
1675
- className: "flex items-center justify-center h-64",
1676
- "data-testid": "message-details-loading",
1677
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground" })
1678
- }
1679
- ),
1680
- error && /* @__PURE__ */ jsxRuntime.jsxs(
1681
- "div",
1682
- {
1683
- className: "text-destructive p-4 border border-destructive/20 rounded-md",
1684
- "data-testid": "message-details-error",
1685
- children: [
1686
- "Error loading message details: ",
1687
- String(error)
1688
- ]
1689
- }
1690
- ),
1691
- messageDetails && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "message-details-content", children: /* @__PURE__ */ jsxRuntime.jsx(chunkE3ILJRG4_cjs.MessageJsonTree, { data: messageDetails, name: "message", defaultExpanded: true }) })
1692
- ] })
1693
- ]
1694
- }
1695
- ) });
1696
- }
1697
- function useSlashItems(text, builtinSkills = []) {
1698
- const { data: listings } = react.useSkills();
1699
- const skillsEnabled = react.useUserSettings().data?.show_skills ?? false;
1700
- const { commands } = react.useBuiltinCommands();
1701
- const slashToken = chunkCS6KNXUO_cjs.parseSlashTokenInProgress(text);
1702
- const slashItems = React7.useMemo(
1703
- () => chunkCS6KNXUO_cjs.buildSlashItems(
1704
- commands.map((c) => ({
1705
- name: c.name,
1706
- description: c.description,
1707
- argHint: c.arg_hint,
1708
- kind: "command"
1709
- })),
1710
- skillsEnabled ? skillItems(builtinSkills, listings ?? []) : []
1711
- ),
1712
- [commands, listings, skillsEnabled, builtinSkills]
1713
- );
1714
- const filteredItems = React7.useMemo(
1715
- () => slashToken !== null ? chunkCS6KNXUO_cjs.filterSlashItems(slashItems, slashToken) : [],
1716
- [slashItems, slashToken]
1717
- );
1718
- return {
1719
- slashToken,
1720
- filteredItems,
1721
- isOpen: slashToken !== null && filteredItems.length > 0,
1722
- /** The menu's "Browse all" footer opens the Skills browser: only for skills users. */
1723
- canBrowseSkills: skillsEnabled
1724
- };
1725
- }
1726
- function skillItems(builtinSkills, listings) {
1727
- const { host, skills } = chunk555BS22J_cjs.mergeSkillWorkflows([...builtinSkills], listings);
1728
- const listing = new Map(listings.map((s) => [s.slug, s]));
1729
- return [
1730
- ...host.map((w) => ({
1731
- name: w.id,
1732
- description: w.description,
1733
- argHint: w.inputs[0]?.label ?? "",
1734
- visibility: "global",
1735
- kind: "skill"
1736
- })),
1737
- ...skills.map((w) => {
1738
- const s = listing.get(w.id);
1739
- return {
1740
- name: w.id,
1741
- description: s?.description || (w.title !== w.id ? w.title : ""),
1742
- argHint: s?.arg_hint ?? "",
1743
- visibility: s?.visibility === "global" ? "global" : "mine",
1744
- kind: "skill"
1745
- };
1746
- })
1747
- ];
1748
- }
1749
- var ConversationComposerComponent = function ConversationComposer({
1750
- value,
1751
- onValueChange,
1752
- handleSendMessage,
1753
- isGenerating = false,
1754
- compact = false,
1755
- inputRef,
1756
- isBranching = false,
1757
- onCancelBranching,
1758
- placeholder,
1759
- onOpenSettings,
1760
- leftButton,
1761
- rightButton,
1762
- modelSelector,
1763
- skills,
1764
- onBrowseSkills,
1765
- contextUsage,
1766
- isConversationEmpty = false,
1767
- shouldOfferFollowUp = true
1768
- }) {
1769
- const session = react.useArbiSessionStore();
1770
- const sessionDraft = react.useArbiSessionState(react.selectDraft);
1771
- const newMessage = value ?? sessionDraft;
1772
- const setNewMessage = onValueChange ?? session.setDraft;
1773
- const suggestedQuery = react.useArbiSessionState((s) => s.suggestedQuery);
1774
- const currentConversationId = react.useArbiSessionState((s) => s.conversationId);
1775
- const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
1776
- const longPaste = chunkCS6KNXUO_cjs.useLongPaste(newMessage);
1777
- const textareaRef = React7.useRef(null);
1778
- const formRef = React7.useRef(null);
1779
- React7.useLayoutEffect(() => {
1780
- const el = formRef.current;
1781
- if (!el) return;
1782
- const apply = () => {
1783
- document.documentElement.style.setProperty("--chat-input-width", `${el.offsetWidth}px`);
1784
- const rect = el.getBoundingClientRect();
1785
- document.documentElement.style.setProperty("--chat-input-left", `${rect.left}px`);
1786
- document.documentElement.style.setProperty("--chat-input-top", `${rect.top}px`);
1787
- };
1788
- apply();
1789
- const ro = new ResizeObserver(apply);
1790
- ro.observe(el);
1791
- return () => ro.disconnect();
1792
- }, []);
1793
- React7.useLayoutEffect(() => {
1794
- if (textareaRef.current && inputRef && "current" in inputRef) {
1795
- inputRef.current = textareaRef.current;
1796
- }
1797
- }, [inputRef]);
1798
- const {
1799
- slashToken,
1800
- filteredItems,
1801
- isOpen: isSlashMenuOpen,
1802
- canBrowseSkills
1803
- } = useSlashItems(newMessage, skills?.builtin);
1804
- const insertSlashItem = (item) => {
1805
- if (skills?.openFor(item)) {
1806
- setNewMessage("");
1807
- return;
1808
- }
1809
- setNewMessage(`/${item.name} `);
1810
- requestAnimationFrame(() => {
1811
- const ta = textareaRef.current;
1812
- if (!ta) return;
1813
- ta.focus();
1814
- const end = `/${item.name} `.length;
1815
- ta.setSelectionRange(end, end);
1816
- });
1817
- };
1818
- const { data: users } = react.useWorkspaceUsers();
1819
- const currentUserId = react.useArbiSession().user?.external_id;
1820
- const assistantName = react.useAssistantName();
1821
- const mentionCandidates = React7.useMemo(
1822
- () => react.buildMentionCandidates(users ?? [], currentUserId, assistantName),
1823
- [users, currentUserId, assistantName]
1816
+ function LinkInAnswer({ href, children, ...props }) {
1817
+ const docId = chunkZ2XZ2D4N_cjs.workspaceDocIdFromHref(href, chunk3AWP3O5M_cjs.useBlocksEnvironment().runtimeConfig.deploymentDomain);
1818
+ if (docId) {
1819
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkX5AG2UZZ_cjs.InternalDocLink, { docId, href, ...props, children });
1820
+ }
1821
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkX5AG2UZZ_cjs.ExternalLink, { href, ...props, children });
1822
+ }
1823
+ var ConnectedCitationRendererComponent = ({
1824
+ alwaysInteractive,
1825
+ ...props
1826
+ }) => {
1827
+ const session = react.useArbiSessionStore();
1828
+ const openChunk = useOpenChunk();
1829
+ const docTitles = useWorkspaceDocTitles();
1830
+ const onOpenCitation = React6.useCallback(
1831
+ (citationKey) => session.setActiveCitationKey(citationKey),
1832
+ [session]
1824
1833
  );
1825
- const mention = chunkP6TPVQRU_cjs.useMentionAutocomplete({
1826
- value: newMessage,
1827
- onValueChange: setNewMessage,
1828
- candidates: mentionCandidates,
1829
- textareaRef
1830
- });
1831
- const { data: conversations } = react.useConversations(workspaceId ?? void 0);
1832
- const isThread = conversations?.find((conversation) => conversation.external_id === currentConversationId)?.is_shared ?? false;
1833
- const prefillsAssistant = isThread && !isBranching;
1834
- const recipient = chunkCS6KNXUO_cjs.useRecipientDraft({
1835
- value: newMessage,
1836
- onValueChange: setNewMessage,
1837
- contextKey: currentConversationId,
1838
- defaultLabel: prefillsAssistant ? assistantName : null
1839
- });
1840
- const slashNav = chunk75BNMCUX_cjs.useListKeyNav({
1841
- open: isSlashMenuOpen,
1842
- items: filteredItems,
1843
- onPick: insertSlashItem,
1844
- // Clear the leading slash to fully dismiss; otherwise the menu reopens on the next letter.
1845
- onDismiss: () => setNewMessage(""),
1846
- resetKey: slashToken
1847
- });
1848
- const isComposerMenuOpen = isSlashMenuOpen || mention.isOpen;
1849
- React7.useEffect(() => {
1850
- if (isComposerMenuOpen) session.setActiveCitationKey(null);
1851
- }, [isComposerMenuOpen, session]);
1852
- const followUp = !newMessage && !isBranching && !isGenerating && shouldOfferFollowUp && suggestedQuery && suggestedQuery.conversationExtId === currentConversationId ? suggestedQuery.text : null;
1853
- const sendDraft = () => {
1854
- handleSendMessage();
1855
- textareaRef.current?.focus();
1856
- if (isBranching && onCancelBranching) onCancelBranching();
1857
- };
1858
- const onKeyDown = (event) => {
1859
- if (recipient.handleKeyDown(event)) return;
1860
- if (slashNav.handleKeyDown(event)) return;
1861
- if (mention.nav.handleKeyDown(event)) return;
1862
- if (event.key === "Escape" && isBranching && onCancelBranching) {
1863
- event.preventDefault();
1864
- onCancelBranching();
1834
+ const onActivateChunk = React6.useCallback(
1835
+ ({ messageId, citationNum, chunk }) => {
1836
+ session.setActiveCitationKey(`${messageId}-${citationNum}`);
1837
+ if (chunk.metadata.chunk_ext_id) openChunk(chunk);
1838
+ },
1839
+ [session, openChunk]
1840
+ );
1841
+ const onCloseCitation = React6.useCallback(() => {
1842
+ session.setActiveCitationKey(null);
1843
+ const viewing = session.getState().viewingDocument;
1844
+ if (viewing?.passageId) session.setViewingDocument({ id: viewing.id, passageId: null });
1845
+ }, [session]);
1846
+ const onDismissCitation = React6.useCallback(() => session.setActiveCitationKey(null), [session]);
1847
+ return /* @__PURE__ */ jsxRuntime.jsx(
1848
+ react.CitationRenderer,
1849
+ {
1850
+ ...props,
1851
+ renderMarkdown,
1852
+ ExternalLink: LinkInAnswer,
1853
+ onOpenCitation,
1854
+ onActivateChunk,
1855
+ useCitationState: alwaysInteractive ? useCitationStateAlwaysInteractive : useCitationState,
1856
+ onCloseCitation,
1857
+ onDismissCitation,
1858
+ notify: notifyCitation,
1859
+ docTitles
1865
1860
  }
1866
- };
1867
- const handleSubmit = (e) => {
1868
- e.preventDefault();
1869
- if (recipient.hasBody) sendDraft();
1870
- };
1871
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(
1872
- chunkF3NMEQF6_cjs.Composer.Root,
1861
+ );
1862
+ };
1863
+ var ConnectedCitationRenderer = React6__default.default.memo(ConnectedCitationRendererComponent);
1864
+ function MessageDetailsModal({
1865
+ open,
1866
+ onOpenChange,
1867
+ messageExtId,
1868
+ workspace
1869
+ }) {
1870
+ const {
1871
+ data: messageDetails,
1872
+ isLoading,
1873
+ error
1874
+ } = react.useMessageDetails(messageExtId, { enabled: open && !!messageExtId });
1875
+ const currentConversationId = react.useArbiSessionState((s) => s.conversationId);
1876
+ const conversationTitle = messageDetails?.conversation_ext_id === currentConversationId ? "Current Conversation" : "Message";
1877
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
1878
+ ui.DialogContent,
1873
1879
  {
1874
- onSubmit: handleSubmit,
1875
- formRef,
1876
- isBranching,
1877
- notice: isBranching ? /* @__PURE__ */ jsxRuntime.jsx(chunkF3NMEQF6_cjs.Composer.Notice, { onCancel: onCancelBranching }) : void 0,
1878
- children: /* @__PURE__ */ jsxRuntime.jsxs(
1879
- chunkF3NMEQF6_cjs.Composer.Frame,
1880
- {
1881
- className: compact ? "rounded-none border-0 px-0 py-0 shadow-none focus-within:shadow-none" : void 0,
1882
- children: [
1883
- /* @__PURE__ */ jsxRuntime.jsx(
1884
- chunkCS6KNXUO_cjs.SlashMenu,
1885
- {
1886
- open: isSlashMenuOpen,
1887
- items: filteredItems,
1888
- selectedIndex: slashNav.selectedIndex,
1889
- setSelectedIndex: slashNav.setSelectedIndex,
1890
- listboxId: slashNav.listboxId,
1891
- onSelect: insertSlashItem,
1892
- onBrowse: canBrowseSkills ? onBrowseSkills : void 0
1893
- }
1894
- ),
1895
- /* @__PURE__ */ jsxRuntime.jsx(
1896
- chunk75BNMCUX_cjs.MentionMenu,
1897
- {
1898
- open: mention.isOpen,
1899
- items: mention.items,
1900
- selectedIndex: mention.nav.selectedIndex,
1901
- setSelectedIndex: mention.nav.setSelectedIndex,
1902
- listboxId: mention.nav.listboxId,
1903
- onSelect: mention.pick
1904
- }
1905
- ),
1906
- followUp && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 px-3 pt-2", "data-testid": "follow-up-suggestion", children: [
1907
- /* @__PURE__ */ jsxRuntime.jsxs(
1908
- ui.Button,
1909
- {
1910
- type: "button",
1911
- variant: "outline",
1912
- size: "sm",
1913
- className: "h-auto min-w-0 max-w-full rounded-full py-1 font-normal",
1914
- onClick: () => {
1915
- setNewMessage(followUp);
1916
- requestAnimationFrame(() => textareaRef.current?.focus());
1917
- },
1918
- "data-testid": "follow-up-suggestion-button",
1919
- children: [
1920
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { className: "h-3.5 w-3.5 shrink-0" }),
1921
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: followUp })
1922
- ]
1923
- }
1924
- ),
1925
- /* @__PURE__ */ jsxRuntime.jsx(
1926
- ui.Button,
1927
- {
1928
- type: "button",
1929
- variant: "outline",
1930
- size: "icon",
1931
- className: "h-7 w-7 shrink-0 rounded-full pointer-coarse:h-11 pointer-coarse:w-11",
1932
- onClick: () => {
1933
- setNewMessage(followUp);
1934
- sendDraft();
1935
- },
1936
- "aria-label": "Send this question",
1937
- title: "Send this question",
1938
- "data-testid": "follow-up-suggestion-send",
1939
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Send, { className: "h-3.5 w-3.5" })
1940
- }
1941
- )
1942
- ] }),
1943
- /* @__PURE__ */ jsxRuntime.jsx(
1944
- chunkF3NMEQF6_cjs.Composer.Input,
1945
- {
1946
- value: newMessage,
1947
- onValueChange: (next) => {
1948
- mention.onValueChange(next);
1949
- longPaste.onValueChange(next);
1950
- },
1951
- onPaste: (event) => longPaste.onPaste(event, newMessage),
1952
- onKeyDown,
1953
- textareaProps: {
1954
- ...mention.isOpen ? mention.nav.comboboxProps : slashNav.comboboxProps,
1955
- ...mention.textareaProps
1956
- },
1957
- textareaRef,
1958
- isPasteCollapsed: longPaste.isCollapsed,
1959
- onExpandPaste: () => {
1960
- longPaste.expand();
1961
- requestAnimationFrame(() => textareaRef.current?.focus());
1962
- },
1963
- isRoomy: isConversationEmpty,
1964
- compact,
1965
- placeholder: placeholder || (isBranching ? "Edit message to create a branch..." : isThread ? "Message the thread\u2026 @mention someone to notify them" : isGenerating ? "Type your next prompt..." : "Ask ARBI anything\u2026")
1966
- }
1967
- ),
1968
- /* @__PURE__ */ jsxRuntime.jsx(
1969
- chunkF3NMEQF6_cjs.Composer.Toolbar,
1880
+ presentation: "sheet",
1881
+ className: "max-w-4xl max-h-[calc(100dvh-2rem)] overflow-hidden flex flex-col",
1882
+ "data-testid": "message-details-modal",
1883
+ children: [
1884
+ /* @__PURE__ */ jsxRuntime.jsx(
1885
+ chunk223D4727_cjs.ModalBreadcrumbHeader,
1886
+ {
1887
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { size: 20 }),
1888
+ title: "Message Details",
1889
+ subtitle: workspace || currentConversationId ? /* @__PURE__ */ jsxRuntime.jsx(
1890
+ chunk223D4727_cjs.ModalCrumbs,
1970
1891
  {
1971
- className: compact ? "flex-nowrap" : void 0,
1972
- leading: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1973
- leftButton,
1974
- compact && modelSelector,
1975
- onOpenSettings && /* @__PURE__ */ jsxRuntime.jsx(
1976
- ui.Button,
1892
+ items: [
1893
+ ...workspace ? [
1977
1894
  {
1978
- type: "button",
1979
- variant: "ghost",
1980
- size: "sm",
1981
- onClick: onOpenSettings,
1982
- className: "h-8 w-8 p-0 pointer-coarse:h-11 pointer-coarse:w-11",
1983
- "aria-label": "Chat settings",
1984
- title: "Chat settings",
1985
- "data-testid": "message-input-settings-button",
1986
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings, { className: "h-4 w-4 text-muted-foreground" })
1895
+ icon: workspace.icon,
1896
+ label: workspace.name
1987
1897
  }
1988
- )
1989
- ] }),
1990
- trailing: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1991
- !compact && modelSelector,
1992
- rightButton
1993
- ] })
1898
+ ] : [],
1899
+ ...currentConversationId ? [{ label: conversationTitle }] : []
1900
+ ]
1994
1901
  }
1995
- ),
1996
- /* @__PURE__ */ jsxRuntime.jsx(chunkCS6KNXUO_cjs.ContextUsageBar, { contextUsage, draftLength: newMessage.length })
1997
- ]
1998
- }
1999
- )
1902
+ ) : void 0,
1903
+ description: "Full message data including execution trace and metadata"
1904
+ }
1905
+ ),
1906
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 overflow-auto p-4 bg-muted/20 rounded-md", children: [
1907
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx(
1908
+ "div",
1909
+ {
1910
+ className: "flex items-center justify-center h-64",
1911
+ "data-testid": "message-details-loading",
1912
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground" })
1913
+ }
1914
+ ),
1915
+ error && /* @__PURE__ */ jsxRuntime.jsxs(
1916
+ "div",
1917
+ {
1918
+ className: "text-destructive p-4 border border-destructive/20 rounded-md",
1919
+ "data-testid": "message-details-error",
1920
+ children: [
1921
+ "Error loading message details: ",
1922
+ String(error)
1923
+ ]
1924
+ }
1925
+ ),
1926
+ messageDetails && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "message-details-content", children: /* @__PURE__ */ jsxRuntime.jsx(chunk2HECOUXC_cjs.MessageJsonTree, { data: messageDetails, name: "message", defaultExpanded: true }) })
1927
+ ] })
1928
+ ]
2000
1929
  }
2001
1930
  ) });
2002
- };
2003
- var ConversationComposer2 = React7.memo(ConversationComposerComponent);
1931
+ }
2004
1932
  function useOpenWorkspaceIcon() {
2005
1933
  const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
2006
1934
  const { data: workspaces } = react.useWorkspaces();
@@ -2015,7 +1943,7 @@ function useOpenWorkspaceIcon() {
2015
1943
  ) : void 0;
2016
1944
  return { workspaceId, workspace, icon };
2017
1945
  }
2018
- var AskAgainContext = React7.createContext(null);
1946
+ var AskAgainContext = React6.createContext(null);
2019
1947
  function WorkflowStepMessage({
2020
1948
  messageId,
2021
1949
  conversationId,
@@ -2060,11 +1988,11 @@ var MessageComponent = ({
2060
1988
  participantTint,
2061
1989
  ...rest
2062
1990
  }) => {
2063
- const [isCopied, setIsCopied] = React7.useState(false);
2064
- const [factSaved, setFactSaved] = React7.useState(false);
2065
- const [isStepsExpanded, setIsStepsExpanded] = React7.useState(false);
2066
- const [showDetailsModal, setShowDetailsModal] = React7.useState(false);
2067
- const messageRef = React7.useRef(null);
1991
+ const [isCopied, setIsCopied] = React6.useState(false);
1992
+ const [factSaved, setFactSaved] = React6.useState(false);
1993
+ const [isStepsExpanded, setIsStepsExpanded] = React6.useState(false);
1994
+ const [showDetailsModal, setShowDetailsModal] = React6.useState(false);
1995
+ const messageRef = React6.useRef(null);
2068
1996
  const session = react.useArbiSessionStore();
2069
1997
  const environment = chunk3AWP3O5M_cjs.useBlocksEnvironment();
2070
1998
  const linkMentions = react.useLinkMentions();
@@ -2092,7 +2020,7 @@ var MessageComponent = ({
2092
2020
  const { data: workspaceUsers = [] } = react.useWorkspaceUsers();
2093
2021
  const streaming = shell.useMessageChatArtifact(message.external_id);
2094
2022
  const { data: workspaceDocs } = react.useDocuments();
2095
- const linkedArtifact = React7.useMemo(() => {
2023
+ const linkedArtifact = React6.useMemo(() => {
2096
2024
  if (!message.external_id) return void 0;
2097
2025
  if (streaming) return streaming;
2098
2026
  const doc = chunkCS6KNXUO_cjs.findMessageDocument(workspaceDocs, message.external_id);
@@ -2105,14 +2033,14 @@ var MessageComponent = ({
2105
2033
  mode: ui.isImageDocument(doc) ? "image" : kind ?? "markdown"
2106
2034
  };
2107
2035
  }, [streaming, workspaceDocs, message.external_id]);
2108
- const handleOpenArtifact = React7.useCallback(
2036
+ const handleOpenArtifact = React6.useCallback(
2109
2037
  (docExtId) => {
2110
2038
  session.setDocumentViewer({ tab: artifacts.viewerTabForArtifactMode(linkedArtifact?.mode) });
2111
2039
  environment.openDocument(docExtId);
2112
2040
  },
2113
2041
  [linkedArtifact?.mode, session, environment]
2114
2042
  );
2115
- const messageAuthorUser = React7.useMemo(() => {
2043
+ const messageAuthorUser = React6.useMemo(() => {
2116
2044
  if (!isUser) return null;
2117
2045
  const isCurrentUser = message.created_by_ext_id === currentUser?.external_id;
2118
2046
  if (isCurrentUser && currentUser) {
@@ -2124,14 +2052,14 @@ var MessageComponent = ({
2124
2052
  return workspaceUser?.user || null;
2125
2053
  }, [isUser, message.created_by_ext_id, currentUser, workspaceUsers]);
2126
2054
  const isOtherPerson = isUser && !!message.created_by_ext_id && message.created_by_ext_id !== currentUser?.external_id;
2127
- const startsAuthorRun = React7.useMemo(() => {
2055
+ const startsAuthorRun = React6.useMemo(() => {
2128
2056
  if (!isOtherPerson) return false;
2129
2057
  const prev = messageHistory && index > 0 ? messageHistory[index - 1] : null;
2130
2058
  if (!prev) return true;
2131
2059
  const prevIsTranscript = !!react.transcriptSegmentOf(prev.tools ?? prev.meta?.tools);
2132
2060
  return prev.role !== "user" || prevIsTranscript || prev.created_by_ext_id !== message.created_by_ext_id;
2133
2061
  }, [isOtherPerson, messageHistory, index, message.created_by_ext_id]);
2134
- const configId = React7.useMemo(() => {
2062
+ const configId = React6.useMemo(() => {
2135
2063
  if (!isUser) {
2136
2064
  return message.config_ext_id;
2137
2065
  }
@@ -2144,7 +2072,7 @@ var MessageComponent = ({
2144
2072
  return message.config_ext_id;
2145
2073
  }, [isUser, message.config_ext_id, messageHistory, index]);
2146
2074
  const { data: messageConfig } = react.useConfig(configId || "default");
2147
- const modelName = React7.useMemo(() => {
2075
+ const modelName = React6.useMemo(() => {
2148
2076
  const steps = message.agentSteps;
2149
2077
  if (!steps?.length) return null;
2150
2078
  const answering = steps.find((s) => s.step === "answering" && s.usage?.model);
@@ -2156,13 +2084,13 @@ var MessageComponent = ({
2156
2084
  return steps.find((s) => s.selected_model)?.selected_model ?? null;
2157
2085
  }, [message.agentSteps]);
2158
2086
  const { data: availableModels } = react.useAvailableModels();
2159
- const modelTag = React7.useMemo(() => {
2087
+ const modelTag = React6.useMemo(() => {
2160
2088
  if (!modelName || !availableModels?.models) return null;
2161
2089
  const info = availableModels.models.find((m) => m.model_name === modelName);
2162
2090
  return info?.tags?.[0] || null;
2163
2091
  }, [modelName, availableModels]);
2164
2092
  const modelDisplayName = modelName;
2165
- const activeCitations = React7.useMemo(() => {
2093
+ const activeCitations = React6.useMemo(() => {
2166
2094
  const tools = message.tools || message.meta?.tools;
2167
2095
  const modelCitations = tools?.model_citations;
2168
2096
  const toolResponses = modelCitations && "tool_responses" in modelCitations ? modelCitations.tool_responses : null;
@@ -2178,7 +2106,7 @@ var MessageComponent = ({
2178
2106
  });
2179
2107
  return Object.keys(citationMap).length > 0 ? citationMap : null;
2180
2108
  }, [message.tools, message.meta?.tools]);
2181
- const citationData = React7.useMemo(() => browser.buildCitationChunkData(message), [message]);
2109
+ const citationData = React6.useMemo(() => browser.buildCitationChunkData(message), [message]);
2182
2110
  const isGenerating = !isUser && message.isLoading === true;
2183
2111
  const isFailed = message.status === "failed";
2184
2112
  const isStopped = !isUser && message.status === "cancelled";
@@ -2199,7 +2127,7 @@ var MessageComponent = ({
2199
2127
  const workingStepLabel = showWorkingIndicator ? chunkUICJN7O2_cjs.getCurrentAgentStepPresentation(message.agentSteps ?? [])?.description : void 0;
2200
2128
  const showEmptyAnswer = !isUser && !isGenerating && !isRunningOnServer && !isFailed && !isStopped && !responseContent.trim() && !linkedArtifact;
2201
2129
  const isEmptyStopped = isStopped && !responseContent.trim();
2202
- const stoppedQuestion = React7.useMemo(() => {
2130
+ const stoppedQuestion = React6.useMemo(() => {
2203
2131
  if (!isStopped || !messageHistory || !message.parent_message_ext_id) return null;
2204
2132
  const parentIndex = messageHistory.findIndex(
2205
2133
  (m) => m.external_id === message.parent_message_ext_id
@@ -2208,32 +2136,32 @@ var MessageComponent = ({
2208
2136
  if (!parent || (parent.role || "").toLowerCase() !== "user") return null;
2209
2137
  return { question: parent, isEditable: parentIndex > 0 };
2210
2138
  }, [isStopped, messageHistory, message.parent_message_ext_id]);
2211
- const askAgain = React7.useContext(AskAgainContext);
2139
+ const askAgain = React6.useContext(AskAgainContext);
2212
2140
  const askStoppedQuestionAgain = (retry) => {
2213
2141
  if (askAgain) askAgain(retry.question, message);
2214
2142
  else if (retry.isEditable) startEditing(retry.question);
2215
2143
  else session.setDraft(retry.question.content);
2216
2144
  };
2217
- const factData = React7.useMemo(
2145
+ const factData = React6.useMemo(
2218
2146
  () => chunkXFL67STW_cjs.buildFactCitations(responseContent, activeCitations, citationData),
2219
2147
  [responseContent, activeCitations, citationData]
2220
2148
  );
2221
2149
  const factText = factData.text;
2222
2150
  const canCreateFact = !isUser && !isGenerating && !isFailed && factText.length > 2;
2223
- const visibleStepCount = React7.useMemo(
2151
+ const visibleStepCount = React6.useMemo(
2224
2152
  () => message.agentSteps ? browser.topLevelAgentSteps(message.agentSteps).length : 0,
2225
2153
  [message.agentSteps]
2226
2154
  );
2227
2155
  const timerKey = `${message.conversation_ext_id || "new"}:${message.external_id}`;
2228
2156
  const finalElapsedSeconds = react.useArbiSessionState((state) => state.messageTimers[timerKey]?.elapsedTime) ?? message.agentStepsTotalElapsed ?? 0;
2229
- React7.useEffect(() => {
2157
+ React6.useEffect(() => {
2230
2158
  let timeout;
2231
2159
  if (isCopied) {
2232
2160
  timeout = setTimeout(() => setIsCopied(false), 2e3);
2233
2161
  }
2234
2162
  return () => clearTimeout(timeout);
2235
2163
  }, [isCopied]);
2236
- React7.useEffect(() => {
2164
+ React6.useEffect(() => {
2237
2165
  setFactSaved(false);
2238
2166
  }, [message.external_id]);
2239
2167
  const { openShare } = environment;
@@ -2251,10 +2179,10 @@ var MessageComponent = ({
2251
2179
  const fullUrl = domain ? `https://${domain}${path}` : `${window.location.origin}${path}`;
2252
2180
  navigator.clipboard.writeText(fullUrl).then(
2253
2181
  () => notify3(
2254
- React7__default.default.createElement(
2182
+ React6__default.default.createElement(
2255
2183
  "span",
2256
2184
  {},
2257
- React7__default.default.createElement(
2185
+ React6__default.default.createElement(
2258
2186
  "a",
2259
2187
  {
2260
2188
  href: fullUrl,
@@ -2488,7 +2416,7 @@ var MessageComponent = ({
2488
2416
  revealActionsOnHover: true,
2489
2417
  leading: isUser ? (
2490
2418
  // Someone else's author is the pill above their run; only mine is marked here.
2491
- !isOtherPerson && messageAuthorUser && /* @__PURE__ */ jsxRuntime.jsx(chunk66QN6ZJR_cjs.DocumentUser, { user: messageAuthorUser })
2419
+ !isOtherPerson && messageAuthorUser && /* @__PURE__ */ jsxRuntime.jsx(chunkURZAK3A3_cjs.DocumentUser, { user: messageAuthorUser })
2492
2420
  ) : /* @__PURE__ */ jsxRuntime.jsx(
2493
2421
  "span",
2494
2422
  {
@@ -2593,7 +2521,7 @@ var MessageComponent = ({
2593
2521
  messageId,
2594
2522
  align: isOtherPerson ? "start" : "end",
2595
2523
  children: [
2596
- startsAuthorRun && messageAuthorUser && /* @__PURE__ */ jsxRuntime.jsx(chunkF3NMEQF6_cjs.MessageAuthor, { children: /* @__PURE__ */ jsxRuntime.jsx(chunk66QN6ZJR_cjs.DocumentUser, { user: messageAuthorUser, variant: "pill" }) }),
2524
+ startsAuthorRun && messageAuthorUser && /* @__PURE__ */ jsxRuntime.jsx(chunkF3NMEQF6_cjs.MessageAuthor, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkURZAK3A3_cjs.DocumentUser, { user: messageAuthorUser, variant: "pill" }) }),
2597
2525
  /* @__PURE__ */ jsxRuntime.jsxs(
2598
2526
  chunkF3NMEQF6_cjs.MessageBubble,
2599
2527
  {
@@ -2737,15 +2665,7 @@ var MessageComponent = ({
2737
2665
  }
2738
2666
  ),
2739
2667
  !isUser && linkedArtifact && /* @__PURE__ */ jsxRuntime.jsx(react.MessageArtifactCard, { artifact: linkedArtifact, onOpen: handleOpenArtifact }),
2740
- !isUser && subagentLinks,
2741
- !isUser && !isGenerating && /* @__PURE__ */ jsxRuntime.jsx(
2742
- SourceChips,
2743
- {
2744
- messageId: message.external_id || "unknown",
2745
- citations: activeCitations,
2746
- citationData
2747
- }
2748
- )
2668
+ !isUser && subagentLinks
2749
2669
  ]
2750
2670
  }
2751
2671
  ),
@@ -2793,7 +2713,7 @@ function areMessagesEqual(prevProps, nextProps) {
2793
2713
  if (prevProps.subagentLinks !== nextProps.subagentLinks) return false;
2794
2714
  return true;
2795
2715
  }
2796
- var ConnectedMessage = React7__default.default.memo(MessageComponent, areMessagesEqual);
2716
+ var ConnectedMessage = React6__default.default.memo(MessageComponent, areMessagesEqual);
2797
2717
  var VERSION_LABELS = {
2798
2718
  branchOf: (current, total) => `Version ${current} of ${total}`,
2799
2719
  previousBranch: "Previous version",
@@ -2951,8 +2871,8 @@ function stripThinking(content) {
2951
2871
  }
2952
2872
  function ConnectedMessageList({ messages, scrollElementRef }) {
2953
2873
  const session = react.useArbiSessionStore();
2954
- const [previewOpen, setPreviewOpen] = React7.useState(false);
2955
- const participantTints = React7.useMemo(
2874
+ const [previewOpen, setPreviewOpen] = React6.useState(false);
2875
+ const participantTints = React6.useMemo(
2956
2876
  () => chunkCS6KNXUO_cjs.getParticipantTints(
2957
2877
  messages.map(
2958
2878
  (message) => message.role === "assistant" ? "" : message.created_by_ext_id ?? ""
@@ -2980,15 +2900,15 @@ function ConnectedMessageList({ messages, scrollElementRef }) {
2980
2900
  text: lastMessage?.role === "assistant" ? stripThinking(lastMessage.content ?? "") : "",
2981
2901
  resetKey: currentConversationId
2982
2902
  });
2983
- const scrollContainerRef = React7.useRef(null);
2984
- const getScrollContainer = React7.useCallback(() => {
2903
+ const scrollContainerRef = React6.useRef(null);
2904
+ const getScrollContainer = React6.useCallback(() => {
2985
2905
  scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(scrollContainerRef.current);
2986
2906
  return scrollContainerRef.current;
2987
2907
  }, [scrollElementRef]);
2988
- React7.useEffect(() => {
2908
+ React6.useEffect(() => {
2989
2909
  scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(null);
2990
2910
  }, [scrollElementRef]);
2991
- const { items: activityItems } = chunkPNWSEIWS_cjs.useConnectedThreadActivity(currentConversationId);
2911
+ const { items: activityItems } = chunkI3HK46DH_cjs.useConnectedThreadActivity(currentConversationId);
2992
2912
  const transcript = [
2993
2913
  ...displayMessages.map((message, index) => ({
2994
2914
  type: "message",
@@ -3006,11 +2926,11 @@ function ConnectedMessageList({ messages, scrollElementRef }) {
3006
2926
  createdAt: item.createdAt
3007
2927
  }))
3008
2928
  ].sort((a, b) => Date.parse(a.createdAt ?? "") - Date.parse(b.createdAt ?? ""));
3009
- const getTranscriptItemKey = React7.useCallback(
2929
+ const getTranscriptItemKey = React6.useCallback(
3010
2930
  (index) => transcript[index]?.id ?? index,
3011
2931
  [transcript]
3012
2932
  );
3013
- const estimateTranscriptItemSize = React7.useCallback(
2933
+ const estimateTranscriptItemSize = React6.useCallback(
3014
2934
  (index) => {
3015
2935
  const entry = transcript[index];
3016
2936
  if (!entry) return estimateActivityRowHeight();
@@ -3033,8 +2953,8 @@ function ConnectedMessageList({ messages, scrollElementRef }) {
3033
2953
  measureElement: measureMessageElement
3034
2954
  });
3035
2955
  const deepLinkMessageId = react.useArbiSessionState((state) => state.deepLinkMessageId);
3036
- const positionedDeepLink = React7.useRef(null);
3037
- React7.useEffect(() => {
2956
+ const positionedDeepLink = React6.useRef(null);
2957
+ React6.useEffect(() => {
3038
2958
  if (!deepLinkMessageId) {
3039
2959
  positionedDeepLink.current = null;
3040
2960
  return;
@@ -3057,7 +2977,7 @@ function ConnectedMessageList({ messages, scrollElementRef }) {
3057
2977
  };
3058
2978
  }, [deepLinkMessageId, transcript, rowVirtualizer]);
3059
2979
  const virtualItems = rowVirtualizer.getVirtualItems();
3060
- React7.useLayoutEffect(() => {
2980
+ React6.useLayoutEffect(() => {
3061
2981
  if (!deepLinkMessageId || !deepLinkMessageId.startsWith("ntf-")) return;
3062
2982
  const target = document.querySelector(`[data-message-id="${deepLinkMessageId}"]`);
3063
2983
  if (!target) return;
@@ -3139,32 +3059,32 @@ function ConnectedMessageList({ messages, scrollElementRef }) {
3139
3059
  /* @__PURE__ */ jsxRuntime.jsx(ConnectedThreadsPreview, { open: previewOpen, onOpenChange: setPreviewOpen })
3140
3060
  ] });
3141
3061
  }
3142
- var MessageAreaComponent = React7.forwardRef(
3062
+ var MessageAreaComponent = React6.forwardRef(
3143
3063
  ({ messages, scrollElementRef }, ref) => {
3144
3064
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: "flex w-full flex-1 flex-col pt-4", "data-testid": "message-area", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto w-full", "data-testid": "message-list-bottom-anchor", children: /* @__PURE__ */ jsxRuntime.jsx(ConnectedMessageList, { messages, scrollElementRef }) }) });
3145
3065
  }
3146
3066
  );
3147
3067
  MessageAreaComponent.displayName = "ConnectedMessageArea";
3148
- var ConnectedMessageArea = React7.memo(MessageAreaComponent, (prevProps, nextProps) => {
3068
+ var ConnectedMessageArea = React6.memo(MessageAreaComponent, (prevProps, nextProps) => {
3149
3069
  return prevProps.messages === nextProps.messages && prevProps.scrollElementRef === nextProps.scrollElementRef;
3150
3070
  });
3151
3071
  function ConnectedCompactConversation({ attachments } = {}) {
3152
- const containerRef = React7.useRef(null);
3153
- const scrollRef = React7.useRef(null);
3154
- const following = React7.useRef(true);
3155
- const [showLatest, setShowLatest] = React7.useState(false);
3156
- const inputRef = React7.useRef(null);
3072
+ const containerRef = React6.useRef(null);
3073
+ const scrollRef = React6.useRef(null);
3074
+ const following = React6.useRef(true);
3075
+ const [showLatest, setShowLatest] = React6.useState(false);
3076
+ const inputRef = React6.useRef(null);
3157
3077
  const { selectedWorkspaceId, parentMessageId, messageHistory } = react.useConversationData();
3158
3078
  const { isGenerating, handleSendMessage, handleAbortGeneration } = react.useConversationTurn({
3159
3079
  selectedWorkspaceId,
3160
3080
  parentMessageId
3161
3081
  });
3162
3082
  const currentConversationId = react.useArbiSessionState((state) => state.conversationId);
3163
- React7.useEffect(() => {
3083
+ React6.useEffect(() => {
3164
3084
  following.current = true;
3165
3085
  setShowLatest(false);
3166
3086
  }, [currentConversationId]);
3167
- React7.useEffect(() => {
3087
+ React6.useEffect(() => {
3168
3088
  const viewport = scrollRef.current;
3169
3089
  const content = containerRef.current;
3170
3090
  if (!viewport || !content) return;
@@ -3309,11 +3229,11 @@ function ConnectedConversationDocumentPicker({
3309
3229
  const upload = react.useUploadDocuments();
3310
3230
  const role = react.useWorkspaceRole();
3311
3231
  const canUpload = role !== null && role !== "guest";
3312
- const inputRef = React7.useRef(null);
3313
- const [expanded, setExpanded] = React7.useState(false);
3314
- const [uploadError, setUploadError] = React7.useState(null);
3315
- const [uploadNotice, setUploadNotice] = React7.useState(null);
3316
- const [search, setSearch] = React7.useState("");
3232
+ const inputRef = React6.useRef(null);
3233
+ const [expanded, setExpanded] = React6.useState(false);
3234
+ const [uploadError, setUploadError] = React6.useState(null);
3235
+ const [uploadNotice, setUploadNotice] = React6.useState(null);
3236
+ const [search, setSearch] = React6.useState("");
3317
3237
  const currentConversationId = react.useArbiSessionState((state) => state.conversationId);
3318
3238
  const convKey = currentConversationId || "new";
3319
3239
  const inConversationDocuments = react.useArbiSessionState(
@@ -3324,7 +3244,7 @@ function ConnectedConversationDocumentPicker({
3324
3244
  const visible = documents.filter(
3325
3245
  (doc) => ui.getDocumentTitle(doc, "Untitled").toLowerCase().includes(search.toLowerCase())
3326
3246
  );
3327
- React7.useEffect(() => {
3247
+ React6.useEffect(() => {
3328
3248
  setExpanded(false);
3329
3249
  setUploadNotice(null);
3330
3250
  setUploadError(null);
@@ -3541,16 +3461,16 @@ function ConnectedForgotPassword({
3541
3461
  const arbi = react.useArbi();
3542
3462
  const sso = useSsoSignIn();
3543
3463
  const { onRecovered: onSiteRecovered } = useAuthPages();
3544
- const [showSsoPrompt, setShowSsoPrompt] = React7.useState(false);
3545
- const [email, setEmail] = React7.useState(initialEmail ?? "");
3546
- const [recoveryKey, setRecoveryKey] = React7.useState(initialRecoveryKey ?? null);
3547
- const [isKeyEncrypted, setIsKeyEncrypted] = React7.useState(initialIsKeyEncrypted);
3548
- const [fileName, setFileName] = React7.useState(
3464
+ const [showSsoPrompt, setShowSsoPrompt] = React6.useState(false);
3465
+ const [email, setEmail] = React6.useState(initialEmail ?? "");
3466
+ const [recoveryKey, setRecoveryKey] = React6.useState(initialRecoveryKey ?? null);
3467
+ const [isKeyEncrypted, setIsKeyEncrypted] = React6.useState(initialIsKeyEncrypted);
3468
+ const [fileName, setFileName] = React6.useState(
3549
3469
  initialRecoveryKey ? "recovery link" : null
3550
3470
  );
3551
- const [error, setError] = React7.useState(null);
3552
- const [isProcessing, setIsProcessing] = React7.useState(false);
3553
- React7.useEffect(() => {
3471
+ const [error, setError] = React6.useState(null);
3472
+ const [isProcessing, setIsProcessing] = React6.useState(false);
3473
+ React6.useEffect(() => {
3554
3474
  if (!open) return;
3555
3475
  if (initialEmail !== void 0) setEmail(initialEmail);
3556
3476
  if (initialRecoveryKey !== void 0) {
@@ -3559,7 +3479,7 @@ function ConnectedForgotPassword({
3559
3479
  setFileName("recovery link");
3560
3480
  }
3561
3481
  }, [open, initialEmail, initialRecoveryKey, initialIsKeyEncrypted]);
3562
- const processFile = React7.useCallback(
3482
+ const processFile = React6.useCallback(
3563
3483
  async (file) => {
3564
3484
  setError(null);
3565
3485
  setIsKeyEncrypted(false);
@@ -3755,13 +3675,13 @@ function useLoginActions({
3755
3675
  const sso = useSsoSignIn();
3756
3676
  const environment = chunk3AWP3O5M_cjs.useBlocksEnvironment();
3757
3677
  const environmentNotify = environment.notify;
3758
- const notify3 = React7.useCallback(
3678
+ const notify3 = React6.useCallback(
3759
3679
  (...args) => args[1] === "error" && onError && typeof args[0] === "string" ? onError(args[0]) : environmentNotify(...args),
3760
3680
  [environmentNotify, onError]
3761
3681
  );
3762
3682
  const { passwordRules, onRegistered, onUnlockedOffline } = useAuthPages();
3763
- const [isAuthenticating, setIsAuthenticating] = React7.useState(false);
3764
- const [isRequestingCode, setIsRequestingCode] = React7.useState(false);
3683
+ const [isAuthenticating, setIsAuthenticating] = React6.useState(false);
3684
+ const [isRequestingCode, setIsRequestingCode] = React6.useState(false);
3765
3685
  const {
3766
3686
  email,
3767
3687
  password,
@@ -3772,7 +3692,7 @@ function useLoginActions({
3772
3692
  cooldownSeconds
3773
3693
  } = formState;
3774
3694
  const { setVerificationSent, setIsRedirecting, startCooldown, validateEmailWithError } = formActions;
3775
- const handleSsoLogin = React7.useCallback(
3695
+ const handleSsoLogin = React6.useCallback(
3776
3696
  (connection) => {
3777
3697
  arbi.session?.setSsoMode(true);
3778
3698
  setIsRedirecting(true);
@@ -3787,7 +3707,7 @@ function useLoginActions({
3787
3707
  },
3788
3708
  [arbi, sso, setIsRedirecting, notify3]
3789
3709
  );
3790
- const handleRequestVerificationCode = React7.useCallback(async () => {
3710
+ const handleRequestVerificationCode = React6.useCallback(async () => {
3791
3711
  if (cooldownSeconds > 0) {
3792
3712
  notify3(`Please wait ${cooldownSeconds} seconds before requesting again`, "warning");
3793
3713
  return;
@@ -3815,7 +3735,7 @@ function useLoginActions({
3815
3735
  startCooldown,
3816
3736
  notify3
3817
3737
  ]);
3818
- const handleLocalLogin = React7.useCallback(
3738
+ const handleLocalLogin = React6.useCallback(
3819
3739
  async (opts) => {
3820
3740
  arbi.session?.setSsoMode(false);
3821
3741
  const loginEmail = opts?.credentials?.email ?? email;
@@ -3868,7 +3788,7 @@ function useLoginActions({
3868
3788
  onUnlockedOffline
3869
3789
  ]
3870
3790
  );
3871
- const handleRegister = React7.useCallback(
3791
+ const handleRegister = React6.useCallback(
3872
3792
  async (saveRecoveryKey = true) => {
3873
3793
  arbi.session?.setSsoMode(false);
3874
3794
  if (!password || !confirmPassword || !firstName2 || !lastName || !verificationCode) {
@@ -3928,27 +3848,27 @@ function useLoginActions({
3928
3848
  function useLoginForm() {
3929
3849
  const { notify: notify3 } = chunk3AWP3O5M_cjs.useBlocksEnvironment();
3930
3850
  const { onReturnPath } = useAuthPages();
3931
- const [email, setEmail] = React7.useState("");
3932
- const [password, setPassword] = React7.useState("");
3933
- const [confirmPassword, setConfirmPassword] = React7.useState("");
3934
- const [firstName2, setFirstName] = React7.useState("");
3935
- const [lastName, setLastName] = React7.useState("");
3936
- const [verificationCode, setVerificationCode] = React7.useState("");
3937
- const [verificationSent, setVerificationSent] = React7.useState(false);
3938
- const [emailVerified, setEmailVerified] = React7.useState(false);
3939
- const [showVerificationForm, setShowVerificationForm] = React7.useState(false);
3940
- const [pendingAutoRequest, setPendingAutoRequest] = React7.useState(false);
3941
- const [cooldownSeconds, setCooldownSeconds] = React7.useState(0);
3942
- const [error, setError] = React7.useState(null);
3943
- const [success, setSuccess] = React7.useState(null);
3944
- const [isRegistering, setIsRegistering] = React7.useState(() => {
3851
+ const [email, setEmail] = React6.useState("");
3852
+ const [password, setPassword] = React6.useState("");
3853
+ const [confirmPassword, setConfirmPassword] = React6.useState("");
3854
+ const [firstName2, setFirstName] = React6.useState("");
3855
+ const [lastName, setLastName] = React6.useState("");
3856
+ const [verificationCode, setVerificationCode] = React6.useState("");
3857
+ const [verificationSent, setVerificationSent] = React6.useState(false);
3858
+ const [emailVerified, setEmailVerified] = React6.useState(false);
3859
+ const [showVerificationForm, setShowVerificationForm] = React6.useState(false);
3860
+ const [pendingAutoRequest, setPendingAutoRequest] = React6.useState(false);
3861
+ const [cooldownSeconds, setCooldownSeconds] = React6.useState(0);
3862
+ const [error, setError] = React6.useState(null);
3863
+ const [success, setSuccess] = React6.useState(null);
3864
+ const [isRegistering, setIsRegistering] = React6.useState(() => {
3945
3865
  if (typeof window === "undefined") return false;
3946
3866
  const tab = new URLSearchParams(window.location.search).get("tab");
3947
3867
  return tab === "register";
3948
3868
  });
3949
- const [isRedirecting, setIsRedirecting] = React7.useState(false);
3950
- const cooldownIntervalRef = React7.useRef(null);
3951
- React7.useEffect(() => {
3869
+ const [isRedirecting, setIsRedirecting] = React6.useState(false);
3870
+ const cooldownIntervalRef = React6.useRef(null);
3871
+ React6.useEffect(() => {
3952
3872
  return () => {
3953
3873
  if (cooldownIntervalRef.current) {
3954
3874
  clearInterval(cooldownIntervalRef.current);
@@ -3956,7 +3876,7 @@ function useLoginForm() {
3956
3876
  }
3957
3877
  };
3958
3878
  }, []);
3959
- React7.useEffect(() => {
3879
+ React6.useEffect(() => {
3960
3880
  const { params: hashParams, trailingFragment } = chunkVYJF4ZQY_cjs.splitAuthHash(window.location.hash);
3961
3881
  const errorParam = hashParams.get("error");
3962
3882
  const errorDescriptionParam = hashParams.get("error_description");
@@ -3990,13 +3910,13 @@ function useLoginForm() {
3990
3910
  window.history.replaceState(null, "", window.location.pathname + window.location.search);
3991
3911
  }
3992
3912
  }, []);
3993
- const validateEmail = React7.useCallback((emailToValidate) => {
3913
+ const validateEmail = React6.useCallback((emailToValidate) => {
3994
3914
  const atIndex = emailToValidate.indexOf("@");
3995
3915
  if (atIndex === -1) return false;
3996
3916
  const domainPart = emailToValidate.substring(atIndex + 1);
3997
3917
  return domainPart.includes(".");
3998
3918
  }, []);
3999
- const validateEmailWithError = React7.useCallback(
3919
+ const validateEmailWithError = React6.useCallback(
4000
3920
  (emailToValidate) => {
4001
3921
  if (!emailToValidate) {
4002
3922
  notify3("Please enter your email address.", "error");
@@ -4010,14 +3930,14 @@ function useLoginForm() {
4010
3930
  },
4011
3931
  [validateEmail, notify3]
4012
3932
  );
4013
- const clearCooldown = React7.useCallback(() => {
3933
+ const clearCooldown = React6.useCallback(() => {
4014
3934
  setCooldownSeconds(0);
4015
3935
  if (cooldownIntervalRef.current) {
4016
3936
  clearInterval(cooldownIntervalRef.current);
4017
3937
  cooldownIntervalRef.current = null;
4018
3938
  }
4019
3939
  }, []);
4020
- const resetEmailEntry = React7.useCallback(() => {
3940
+ const resetEmailEntry = React6.useCallback(() => {
4021
3941
  setEmailVerified(false);
4022
3942
  setVerificationSent(false);
4023
3943
  setShowVerificationForm(false);
@@ -4025,7 +3945,7 @@ function useLoginForm() {
4025
3945
  setPendingAutoRequest(false);
4026
3946
  clearCooldown();
4027
3947
  }, [clearCooldown]);
4028
- const startCooldown = React7.useCallback((seconds) => {
3948
+ const startCooldown = React6.useCallback((seconds) => {
4029
3949
  setCooldownSeconds(seconds);
4030
3950
  if (cooldownIntervalRef.current) {
4031
3951
  clearInterval(cooldownIntervalRef.current);
@@ -4043,12 +3963,12 @@ function useLoginForm() {
4043
3963
  });
4044
3964
  }, 1e3);
4045
3965
  }, []);
4046
- const switchMode = React7.useCallback((registering) => {
3966
+ const switchMode = React6.useCallback((registering) => {
4047
3967
  setIsRegistering(registering);
4048
3968
  setPassword("");
4049
3969
  setConfirmPassword("");
4050
3970
  }, []);
4051
- const clearForm = React7.useCallback(() => {
3971
+ const clearForm = React6.useCallback(() => {
4052
3972
  setEmailVerified(false);
4053
3973
  setEmail("");
4054
3974
  setPassword("");
@@ -4104,7 +4024,7 @@ function useLoginForm() {
4104
4024
  return { ...state, ...actions };
4105
4025
  }
4106
4026
  function useRegisterSubmitState(isRegistering, isPending, password, confirmPassword, email, firstName2, lastName, verificationCode, isPasswordValid) {
4107
- const isDisabled = React7.useMemo(() => {
4027
+ const isDisabled = React6.useMemo(() => {
4108
4028
  if (!isRegistering) return false;
4109
4029
  return isPending || !isPasswordValid(password) || password !== confirmPassword || !email || !firstName2 || !lastName || !verificationCode;
4110
4030
  }, [
@@ -4118,7 +4038,7 @@ function useRegisterSubmitState(isRegistering, isPending, password, confirmPassw
4118
4038
  verificationCode,
4119
4039
  isPasswordValid
4120
4040
  ]);
4121
- const isDefault = React7.useMemo(() => {
4041
+ const isDefault = React6.useMemo(() => {
4122
4042
  if (!isRegistering) return false;
4123
4043
  return email && password && confirmPassword && firstName2 && lastName && verificationCode && isPasswordValid(password) && password === confirmPassword;
4124
4044
  }, [
@@ -4144,7 +4064,7 @@ function CompactLogin({
4144
4064
  const auth = useAuthPages();
4145
4065
  const { notify: notify3 } = chunk3AWP3O5M_cjs.useBlocksEnvironment();
4146
4066
  const isSsoOnly = !!auth.ssoOnly;
4147
- const [error, setError] = React7.useState(null);
4067
+ const [error, setError] = React6.useState(null);
4148
4068
  const formState = useLoginForm();
4149
4069
  const { email, password, setEmail, setPassword } = formState;
4150
4070
  const { isAuthenticating, handleLocalLogin } = useLoginActions({
@@ -4152,8 +4072,8 @@ function CompactLogin({
4152
4072
  formActions: formState,
4153
4073
  onError: setError
4154
4074
  });
4155
- const [sso, setSso] = React7.useState(null);
4156
- const [masterPassword, setMasterPassword] = React7.useState("");
4075
+ const [sso, setSso] = React6.useState(null);
4076
+ const [masterPassword, setMasterPassword] = React6.useState("");
4157
4077
  const signInLocally = async (e) => {
4158
4078
  e.preventDefault();
4159
4079
  setError(null);
@@ -4343,7 +4263,7 @@ function useSsoVerificationRedirect() {
4343
4263
  const sso = useSsoSignIn();
4344
4264
  const { notify: notify3 } = chunk3AWP3O5M_cjs.useBlocksEnvironment();
4345
4265
  const { onVerificationFailed } = useAuthPages();
4346
- React7.useEffect(() => {
4266
+ React6.useEffect(() => {
4347
4267
  const urlParams = new URLSearchParams(window.location.search);
4348
4268
  const success = urlParams.get("success") || null;
4349
4269
  const code = urlParams.get("code") || null;
@@ -4446,7 +4366,7 @@ function LoginPage() {
4446
4366
  warmSodium();
4447
4367
  auth.onIntent?.();
4448
4368
  };
4449
- React7.useEffect(() => {
4369
+ React6.useEffect(() => {
4450
4370
  if (!isOnline || !allowRegistration) setIsRegistering(false);
4451
4371
  }, [isOnline, allowRegistration, setIsRegistering]);
4452
4372
  chunkVYJF4ZQY_cjs.useFragmentCredentials({
@@ -4457,9 +4377,9 @@ function LoginPage() {
4457
4377
  void handleLocalLogin({ credentials: { email: linkEmail, password: linkPassword } });
4458
4378
  }
4459
4379
  });
4460
- const autoRequestFiredRef = React7.useRef(false);
4461
- const emailInputRef = React7.useRef(null);
4462
- React7.useEffect(() => {
4380
+ const autoRequestFiredRef = React6.useRef(false);
4381
+ const emailInputRef = React6.useRef(null);
4382
+ React6.useEffect(() => {
4463
4383
  if (!pendingAutoRequest || autoRequestFiredRef.current) return;
4464
4384
  if (isSsoOnly || !isOnline || !allowRegistration) return;
4465
4385
  autoRequestFiredRef.current = true;
@@ -4473,17 +4393,17 @@ function LoginPage() {
4473
4393
  setPendingAutoRequest,
4474
4394
  handleRequestVerificationCode
4475
4395
  ]);
4476
- const [termsAccepted, setTermsAccepted] = React7.useState(false);
4477
- const [saveRecoveryKey, setSaveRecoveryKey] = React7.useState(true);
4478
- const [showPassword, setShowPassword] = React7.useState(false);
4479
- const [showForgotPasswordModal, setShowForgotPasswordModal] = React7.useState(false);
4480
- const [showChangePasswordModal, setShowChangePasswordModal] = React7.useState(false);
4481
- const [prefilledRecovery, setPrefilledRecovery] = React7.useState(null);
4396
+ const [termsAccepted, setTermsAccepted] = React6.useState(false);
4397
+ const [saveRecoveryKey, setSaveRecoveryKey] = React6.useState(true);
4398
+ const [showPassword, setShowPassword] = React6.useState(false);
4399
+ const [showForgotPasswordModal, setShowForgotPasswordModal] = React6.useState(false);
4400
+ const [showChangePasswordModal, setShowChangePasswordModal] = React6.useState(false);
4401
+ const [prefilledRecovery, setPrefilledRecovery] = React6.useState(null);
4482
4402
  const handleRecoverySuccess = () => {
4483
4403
  setShowForgotPasswordModal(false);
4484
4404
  setShowChangePasswordModal(true);
4485
4405
  };
4486
- React7.useEffect(() => {
4406
+ React6.useEffect(() => {
4487
4407
  if (window.location.pathname === "/recover") {
4488
4408
  const recovery = client.parseRecoveryUrl(window.location.search, window.location.hash);
4489
4409
  if (!recovery) return;
@@ -4510,12 +4430,12 @@ function LoginPage() {
4510
4430
  console.error("Failed to restore recovery state from sessionStorage:", err);
4511
4431
  }
4512
4432
  }, []);
4513
- React7.useEffect(() => {
4433
+ React6.useEffect(() => {
4514
4434
  if (isSsoOnly && !sso.isLoading && !isRedirecting) {
4515
4435
  handleSsoLogin();
4516
4436
  }
4517
4437
  }, [isSsoOnly, sso.isLoading, isRedirecting, handleSsoLogin]);
4518
- React7.useEffect(() => {
4438
+ React6.useEffect(() => {
4519
4439
  if (!sso.isLoading && isRedirecting) {
4520
4440
  const timer = setTimeout(() => {
4521
4441
  setIsRedirecting(false);
@@ -4871,18 +4791,18 @@ function LoginPage() {
4871
4791
  }
4872
4792
  );
4873
4793
  }
4874
- var Context = React7.createContext(null);
4794
+ var Context = React6.createContext(null);
4875
4795
  function useEmbeddedNavigation() {
4876
- return React7.useContext(Context);
4796
+ return React6.useContext(Context);
4877
4797
  }
4878
4798
  function EmbeddedNavigation({ children }) {
4879
4799
  const host = chunkEFS3XXZS_cjs.useHost();
4880
4800
  const session = react.useArbiSessionStore();
4881
4801
  const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
4882
4802
  const { data: availableDocuments } = react.useDocuments();
4883
- const [section, setSection] = React7.useState("main");
4884
- const [file, setFile] = React7.useState(null);
4885
- React7.useEffect(() => {
4803
+ const [section, setSection] = React6.useState("main");
4804
+ const [file, setFile] = React6.useState(null);
4805
+ React6.useEffect(() => {
4886
4806
  setSection("main");
4887
4807
  setFile(null);
4888
4808
  }, [workspaceId]);
@@ -4914,7 +4834,7 @@ function EmbeddedTopbar({
4914
4834
  actions
4915
4835
  }) {
4916
4836
  const nav = useEmbeddedNavigation();
4917
- const [menu, setMenu] = React7.useState(false);
4837
+ const [menu, setMenu] = React6.useState(false);
4918
4838
  const { data: docs = [] } = react.useDocuments();
4919
4839
  const file = docs.find(
4920
4840
  (d) => d.external_id === (nav?.file ? artifacts.parseVersionRef(nav.file.id).docId : "")
@@ -4989,11 +4909,11 @@ function EmbeddedDocuments() {
4989
4909
  const nav = useEmbeddedNavigation();
4990
4910
  const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
4991
4911
  const { data: docs = [], isLoading, error } = react.useDocuments();
4992
- const [search, setSearch] = React7.useState("");
4912
+ const [search, setSearch] = React6.useState("");
4993
4913
  const upload = react.useUploadDocuments();
4994
4914
  const role = react.useWorkspaceRole();
4995
- const input = React7.useRef(null);
4996
- const [uploadError, setUploadError] = React7.useState(null);
4915
+ const input = React6.useRef(null);
4916
+ const [uploadError, setUploadError] = React6.useState(null);
4997
4917
  if (!nav || nav.section === "main") return null;
4998
4918
  if (nav.section === "document" && nav.file?.workspaceId === workspaceId)
4999
4919
  return /* @__PURE__ */ jsxRuntime.jsx(EmbeddedDocument, { file: nav.file });
@@ -5179,10 +5099,10 @@ function EmbeddedWorkspaceHeader({ title }) {
5179
5099
  const signedIn = react.useArbiSession();
5180
5100
  const workspaceId = react.useArbiSessionState((s) => s.workspaceId);
5181
5101
  const { data: workspaces = [], isLoading, error: listError } = react.useWorkspaces();
5182
- const select = chunkPNWSEIWS_cjs.useSelectWorkspace();
5102
+ const select = chunkI3HK46DH_cjs.useSelectWorkspace();
5183
5103
  const connection = chunkURYJ2SFQ_cjs.useOptionalConnection();
5184
- const [pending, setPending] = React7.useState(false);
5185
- const [error, setError] = React7.useState(null);
5104
+ const [pending, setPending] = React6.useState(false);
5105
+ const [error, setError] = React6.useState(null);
5186
5106
  async function choose(id) {
5187
5107
  if (!id) return;
5188
5108
  setPending(true);
@@ -5299,7 +5219,7 @@ function ConnectedEmbeddedChat({
5299
5219
  );
5300
5220
  }
5301
5221
  function ArbiChat({ apiUrl, deploymentDomain, className, ...props }) {
5302
- const host = React7.useMemo(
5222
+ const host = React6.useMemo(
5303
5223
  () => defaultHost(
5304
5224
  {
5305
5225
  apiUrl,
@@ -5349,7 +5269,6 @@ exports.PREMIUM_TIER_TAG = PREMIUM_TIER_TAG;
5349
5269
  exports.RunningSubagents = RunningSubagents;
5350
5270
  exports.STANDARD_TIER_TAG = STANDARD_TIER_TAG;
5351
5271
  exports.SessionStatusIcon = SessionStatusIcon;
5352
- exports.SourceChips = SourceChips;
5353
5272
  exports.WorkflowStepMessage = WorkflowStepMessage;
5354
5273
  exports.backUpOnSignup = backUpOnSignup;
5355
5274
  exports.completeSsoSignIn = completeSsoSignIn;
@@ -5359,11 +5278,12 @@ exports.renderSessionStatusIcon = renderSessionStatusIcon;
5359
5278
  exports.resolveSsoName = resolveSsoName;
5360
5279
  exports.ssoAccountStatus = ssoAccountStatus;
5361
5280
  exports.useAuthPages = useAuthPages;
5281
+ exports.useContextualHints = useContextualHints;
5362
5282
  exports.useModelPicker = useModelPicker;
5363
5283
  exports.useOpenChunk = useOpenChunk;
5364
5284
  exports.useOpenWorkspaceIcon = useOpenWorkspaceIcon;
5365
5285
  exports.useSlashItems = useSlashItems;
5366
5286
  exports.useSsoSignIn = useSsoSignIn;
5367
5287
  exports.useWorkspaceDocTitles = useWorkspaceDocTitles;
5368
- //# sourceMappingURL=chunk-AOBNXZLS.cjs.map
5369
- //# sourceMappingURL=chunk-AOBNXZLS.cjs.map
5288
+ //# sourceMappingURL=chunk-Y3VXKSW7.cjs.map
5289
+ //# sourceMappingURL=chunk-Y3VXKSW7.cjs.map