@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.
- package/README.md +23 -0
- package/dist/{ConnectedDocumentViewer-U5TQ4LFJ.js → ConnectedDocumentViewer-4LRZ5N3L.js} +6 -6
- package/dist/{ConnectedDocumentViewer-U5TQ4LFJ.js.map → ConnectedDocumentViewer-4LRZ5N3L.js.map} +1 -1
- package/dist/{ConnectedDocumentViewer-ID2RG5MF.cjs → ConnectedDocumentViewer-FREQM2ES.cjs} +7 -7
- package/dist/{ConnectedDocumentViewer-ID2RG5MF.cjs.map → ConnectedDocumentViewer-FREQM2ES.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-PBMS77ZP.js → ConnectedNativeDocxComparison-P7OJ3UVK.js} +6 -6
- package/dist/{ConnectedNativeDocxComparison-PBMS77ZP.js.map → ConnectedNativeDocxComparison-P7OJ3UVK.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-R4OFGVHY.cjs → ConnectedNativeDocxComparison-RQIKQM5O.cjs} +7 -7
- package/dist/{ConnectedNativeDocxComparison-R4OFGVHY.cjs.map → ConnectedNativeDocxComparison-RQIKQM5O.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-27JZI2D5.js → ConnectedNativeDocxEditor-HX3FDJ2T.js} +5 -5
- package/dist/{ConnectedNativeDocxEditor-27JZI2D5.js.map → ConnectedNativeDocxEditor-HX3FDJ2T.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-774XRIP3.cjs → ConnectedNativeDocxEditor-XKQV7A37.cjs} +7 -7
- package/dist/{ConnectedNativeDocxEditor-774XRIP3.cjs.map → ConnectedNativeDocxEditor-XKQV7A37.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-7TNIQTVE.cjs → ConnectedStreamedWordArtifact-CSRL4SCO.cjs} +7 -7
- package/dist/ConnectedStreamedWordArtifact-CSRL4SCO.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-XEFXYMKS.js → ConnectedStreamedWordArtifact-SSH6M5LN.js} +6 -6
- package/dist/ConnectedStreamedWordArtifact-SSH6M5LN.js.map +1 -0
- package/dist/{DocumentReviewCard-7OPL6PWG.cjs → DocumentReviewCard-3PZJPVQC.cjs} +14 -14
- package/dist/{DocumentReviewCard-7OPL6PWG.cjs.map → DocumentReviewCard-3PZJPVQC.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-NDHCFYYT.js → DocumentReviewCard-KHMHG7A5.js} +9 -9
- package/dist/{DocumentReviewCard-NDHCFYYT.js.map → DocumentReviewCard-KHMHG7A5.js.map} +1 -1
- package/dist/{WorkspaceTableView-4INHJ7QK.js → WorkspaceTableView-4VMCTOFT.js} +5 -5
- package/dist/{WorkspaceTableView-4INHJ7QK.js.map → WorkspaceTableView-4VMCTOFT.js.map} +1 -1
- package/dist/{WorkspaceTableView-BTUSU3N3.cjs → WorkspaceTableView-Q44KNO3Z.cjs} +7 -7
- package/dist/{WorkspaceTableView-BTUSU3N3.cjs.map → WorkspaceTableView-Q44KNO3Z.cjs.map} +1 -1
- package/dist/agents/index.cjs +281 -281
- package/dist/agents/index.js +4 -4
- package/dist/{chunk-E3ILJRG4.cjs → chunk-2HECOUXC.cjs} +4 -3
- package/dist/chunk-2HECOUXC.cjs.map +1 -0
- package/dist/{chunk-AQPZ4QMV.cjs → chunk-3J2ASIM7.cjs} +3 -3
- package/dist/chunk-3J2ASIM7.cjs.map +1 -0
- package/dist/{chunk-QCFNPQWS.cjs → chunk-3LJUTIS6.cjs} +44 -44
- package/dist/{chunk-QCFNPQWS.cjs.map → chunk-3LJUTIS6.cjs.map} +1 -1
- package/dist/chunk-4B6HYQTW.cjs +20 -0
- package/dist/chunk-4B6HYQTW.cjs.map +1 -0
- package/dist/{chunk-4UMVAJJZ.js → chunk-6NEBHZIF.js} +4 -4
- package/dist/{chunk-4UMVAJJZ.js.map → chunk-6NEBHZIF.js.map} +1 -1
- package/dist/{chunk-IMIE5NOQ.js → chunk-7E5GV4R7.js} +4 -4
- package/dist/{chunk-IMIE5NOQ.js.map → chunk-7E5GV4R7.js.map} +1 -1
- package/dist/{chunk-LNXMSIKU.js → chunk-AWFEB4YJ.js} +8 -8
- package/dist/{chunk-LNXMSIKU.js.map → chunk-AWFEB4YJ.js.map} +1 -1
- package/dist/{chunk-JMQLTMJ7.js → chunk-B3BD5IJR.js} +16 -20
- package/dist/chunk-B3BD5IJR.js.map +1 -0
- package/dist/{chunk-5Q2U7GLI.cjs → chunk-CDW3W5U5.cjs} +4 -4
- package/dist/{chunk-5Q2U7GLI.cjs.map → chunk-CDW3W5U5.cjs.map} +1 -1
- package/dist/{chunk-SK5TP4DP.js → chunk-DBPPOJQM.js} +3 -3
- package/dist/{chunk-SK5TP4DP.js.map → chunk-DBPPOJQM.js.map} +1 -1
- package/dist/{chunk-NJ3YV3VM.cjs → chunk-DMYBHKNQ.cjs} +27 -27
- package/dist/{chunk-NJ3YV3VM.cjs.map → chunk-DMYBHKNQ.cjs.map} +1 -1
- package/dist/{chunk-563BHHHO.cjs → chunk-E6S6WHXL.cjs} +9 -9
- package/dist/{chunk-563BHHHO.cjs.map → chunk-E6S6WHXL.cjs.map} +1 -1
- package/dist/{chunk-BV34QPKE.js → chunk-EASXRDYQ.js} +3 -3
- package/dist/{chunk-BV34QPKE.js.map → chunk-EASXRDYQ.js.map} +1 -1
- package/dist/{chunk-JOFUAQTV.js → chunk-HWNVAQBX.js} +3 -3
- package/dist/{chunk-JOFUAQTV.js.map → chunk-HWNVAQBX.js.map} +1 -1
- package/dist/{chunk-PNWSEIWS.cjs → chunk-I3HK46DH.cjs} +4 -4
- package/dist/{chunk-PNWSEIWS.cjs.map → chunk-I3HK46DH.cjs.map} +1 -1
- package/dist/{chunk-GJKXYX47.js → chunk-IJ2CTMA7.js} +3 -3
- package/dist/{chunk-GJKXYX47.js.map → chunk-IJ2CTMA7.js.map} +1 -1
- package/dist/{chunk-7ZL6OVGO.cjs → chunk-IQFHOKQH.cjs} +23 -46
- package/dist/chunk-IQFHOKQH.cjs.map +1 -0
- package/dist/{chunk-7ZCM2GR2.js → chunk-IRCGXKLB.js} +3 -3
- package/dist/{chunk-7ZCM2GR2.js.map → chunk-IRCGXKLB.js.map} +1 -1
- package/dist/{chunk-G4GLDQLY.js → chunk-KG3W76BB.js} +3 -3
- package/dist/chunk-KG3W76BB.js.map +1 -0
- package/dist/{chunk-B66CICTP.cjs → chunk-KHLPBCRZ.cjs} +52 -52
- package/dist/{chunk-B66CICTP.cjs.map → chunk-KHLPBCRZ.cjs.map} +1 -1
- package/dist/{chunk-J4SEJSSV.js → chunk-KPIR4MJV.js} +6 -6
- package/dist/{chunk-J4SEJSSV.js.map → chunk-KPIR4MJV.js.map} +1 -1
- package/dist/{chunk-PA4EGGCI.js → chunk-KSHTODQZ.js} +3 -3
- package/dist/{chunk-PA4EGGCI.js.map → chunk-KSHTODQZ.js.map} +1 -1
- package/dist/{chunk-PT6D5B6L.cjs → chunk-MAUJVVFJ.cjs} +360 -410
- package/dist/chunk-MAUJVVFJ.cjs.map +1 -0
- package/dist/{chunk-MP7XCRHV.js → chunk-NRI5DKJE.js} +4 -3
- package/dist/chunk-NRI5DKJE.js.map +1 -0
- package/dist/{chunk-XXPDAENX.cjs → chunk-PGTDQBMX.cjs} +7 -7
- package/dist/{chunk-XXPDAENX.cjs.map → chunk-PGTDQBMX.cjs.map} +1 -1
- package/dist/{chunk-4JKK6S7U.cjs → chunk-S7G3A52F.cjs} +5 -5
- package/dist/{chunk-4JKK6S7U.cjs.map → chunk-S7G3A52F.cjs.map} +1 -1
- package/dist/{chunk-OUCWTKQT.js → chunk-SBFQF3BU.js} +4 -4
- package/dist/{chunk-OUCWTKQT.js.map → chunk-SBFQF3BU.js.map} +1 -1
- package/dist/{chunk-52VME6ZS.cjs → chunk-SIOBGNRY.cjs} +18 -18
- package/dist/{chunk-52VME6ZS.cjs.map → chunk-SIOBGNRY.cjs.map} +1 -1
- package/dist/chunk-SK3GBHPJ.js +15 -0
- package/dist/chunk-SK3GBHPJ.js.map +1 -0
- package/dist/{chunk-RADE22SM.cjs → chunk-T2OG3CPR.cjs} +4 -4
- package/dist/{chunk-RADE22SM.cjs.map → chunk-T2OG3CPR.cjs.map} +1 -1
- package/dist/{chunk-IGQJ6ET3.js → chunk-TWSOU6SE.js} +421 -501
- package/dist/chunk-TWSOU6SE.js.map +1 -0
- package/dist/{chunk-QRV4XYFJ.js → chunk-UCD7644N.js} +3 -3
- package/dist/{chunk-QRV4XYFJ.js.map → chunk-UCD7644N.js.map} +1 -1
- package/dist/{chunk-TQ4VGQHG.js → chunk-ULUCGL24.js} +3 -3
- package/dist/{chunk-TQ4VGQHG.js.map → chunk-ULUCGL24.js.map} +1 -1
- package/dist/{chunk-IRI6LPDX.cjs → chunk-UR4OSH2Q.cjs} +4 -4
- package/dist/{chunk-IRI6LPDX.cjs.map → chunk-UR4OSH2Q.cjs.map} +1 -1
- package/dist/{chunk-66QN6ZJR.cjs → chunk-URZAK3A3.cjs} +36 -36
- package/dist/{chunk-66QN6ZJR.cjs.map → chunk-URZAK3A3.cjs.map} +1 -1
- package/dist/{chunk-57S2PLCM.js → chunk-V2QWATXQ.js} +3 -3
- package/dist/{chunk-57S2PLCM.js.map → chunk-V2QWATXQ.js.map} +1 -1
- package/dist/{chunk-55JI2IGZ.cjs → chunk-VBLJNOVP.cjs} +4 -4
- package/dist/{chunk-55JI2IGZ.cjs.map → chunk-VBLJNOVP.cjs.map} +1 -1
- package/dist/{chunk-KFAFWPZK.cjs → chunk-VRMACPJR.cjs} +7 -7
- package/dist/{chunk-KFAFWPZK.cjs.map → chunk-VRMACPJR.cjs.map} +1 -1
- package/dist/{chunk-5Y6V7F6W.cjs → chunk-VWUNPAR2.cjs} +15 -19
- package/dist/chunk-VWUNPAR2.cjs.map +1 -0
- package/dist/{chunk-T3GTQXGP.js → chunk-W7CQ5MLR.js} +3 -3
- package/dist/{chunk-T3GTQXGP.js.map → chunk-W7CQ5MLR.js.map} +1 -1
- package/dist/{chunk-AOBNXZLS.cjs → chunk-Y3VXKSW7.cjs} +594 -674
- package/dist/chunk-Y3VXKSW7.cjs.map +1 -0
- package/dist/{chunk-RTYU6ZGO.cjs → chunk-YCABQ5W4.cjs} +4 -4
- package/dist/{chunk-RTYU6ZGO.cjs.map → chunk-YCABQ5W4.cjs.map} +1 -1
- package/dist/{chunk-EWHD3BY5.js → chunk-ZHHUEYSB.js} +25 -48
- package/dist/chunk-ZHHUEYSB.js.map +1 -0
- package/dist/{chunk-5PKIDR2Q.js → chunk-ZHJVABQ6.js} +361 -406
- package/dist/chunk-ZHJVABQ6.js.map +1 -0
- package/dist/connect/docx.cjs +11 -11
- package/dist/connect/docx.js +7 -7
- package/dist/connect/index.cjs +1448 -1367
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +2 -0
- package/dist/connect/index.js +545 -466
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +5 -5
- package/dist/connect/viewer.js +4 -4
- package/dist/connection/account-cluster/ConnectedAccountCluster.d.ts +2 -1
- package/dist/connection/facts/useFactFilters.d.ts +46 -0
- package/dist/connection/files/fields/ConnectedTagForm.d.ts +1 -1
- package/dist/connection/report-problem/ReportProblemDialog.d.ts +10 -8
- package/dist/connection/report-problem/useReportProblem.d.ts +2 -6
- package/dist/connection/tags/ConnectedTagTable.d.ts +1 -1
- package/dist/connection/tags/ConnectedTagsPage.d.ts +3 -1
- package/dist/connection/tags/TagsPageSections.d.ts +5 -3
- package/dist/connection/tags/tagged-content.d.ts +10 -0
- package/dist/connection/threads/useThreadTagFilter.d.ts +10 -0
- package/dist/connection/tips/ConnectedTipBar.d.ts +2 -1
- package/dist/connection/tips/useContextualHints.d.ts +6 -1
- package/dist/embed/index.cjs +13 -12
- package/dist/embed/index.js +8 -7
- package/dist/facts/index.cjs +45 -45
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +226 -226
- package/dist/files/index.js +2 -2
- package/dist/index.cjs +423 -367
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +76 -16
- package/dist/index.js.map +1 -1
- package/dist/settings/FilterChip.d.ts +2 -1
- package/dist/settings/TriStateFilterMenu.d.ts +1 -0
- package/dist/settings/index.cjs +158 -158
- package/dist/settings/index.js +2 -2
- package/dist/shell/index.cjs +14 -14
- package/dist/shell/index.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/tags/TagDetail.d.ts +2 -2
- package/dist/tags/TagTable.d.ts +17 -3
- package/dist/tags/index.d.ts +1 -1
- package/dist/workflow-canvas/index.cjs +29 -29
- package/dist/workflow-canvas/index.js +12 -12
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-7TNIQTVE.cjs.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-XEFXYMKS.js.map +0 -1
- package/dist/chunk-5PKIDR2Q.js.map +0 -1
- package/dist/chunk-5Y6V7F6W.cjs.map +0 -1
- package/dist/chunk-7ZL6OVGO.cjs.map +0 -1
- package/dist/chunk-AOBNXZLS.cjs.map +0 -1
- package/dist/chunk-AQPZ4QMV.cjs.map +0 -1
- package/dist/chunk-E3ILJRG4.cjs.map +0 -1
- package/dist/chunk-EWHD3BY5.js.map +0 -1
- package/dist/chunk-G4GLDQLY.js.map +0 -1
- package/dist/chunk-IGQJ6ET3.js.map +0 -1
- package/dist/chunk-JMQLTMJ7.js.map +0 -1
- package/dist/chunk-MP7XCRHV.js.map +0 -1
- package/dist/chunk-PT6D5B6L.cjs.map +0 -1
- 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
|
|
5
|
-
var
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
332
|
+
chunk2HECOUXC_cjs.ProfileCard,
|
|
332
333
|
{
|
|
333
334
|
avatar: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
334
335
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
335
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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] =
|
|
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 =
|
|
473
|
+
categories = chunk2HECOUXC_cjs.EMAIL_NOTIFICATION_CATEGORIES,
|
|
473
474
|
title = "Notifications"
|
|
474
475
|
}) {
|
|
475
|
-
const keys =
|
|
476
|
-
() => categories ===
|
|
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
|
-
|
|
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:
|
|
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] =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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] =
|
|
589
|
-
const [dialogOpen, setDialogOpen] =
|
|
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
|
-
|
|
624
|
+
chunk2HECOUXC_cjs.DeleteAccountDialog,
|
|
624
625
|
{
|
|
625
626
|
open: dialogOpen,
|
|
626
627
|
onClose: flow.onClose,
|
|
627
628
|
step: flow.step,
|
|
628
|
-
blockers:
|
|
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 } =
|
|
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 =
|
|
698
|
+
const selectedModelInfo = React6.useMemo(
|
|
698
699
|
() => availableModels?.models?.find((m) => m.model_name === selectedModel),
|
|
699
700
|
[availableModels, selectedModel]
|
|
700
701
|
);
|
|
701
|
-
const handleModelChange =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1369
|
+
const stepTokens = React6.useMemo(() => {
|
|
1067
1370
|
return mergedSteps.map((step) => step.step_tokens ?? null);
|
|
1068
1371
|
}, [mergedSteps]);
|
|
1069
|
-
const stepGbp =
|
|
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 =
|
|
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 =
|
|
1332
|
-
const rosterLanes =
|
|
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 =
|
|
1371
|
-
const scrollRef =
|
|
1372
|
-
const [hasMoreRight, setHasMoreRight] =
|
|
1373
|
-
const checkOverflow =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
const
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
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
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
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
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1884
|
-
|
|
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
|
-
|
|
1972
|
-
|
|
1973
|
-
leftButton,
|
|
1974
|
-
compact && modelSelector,
|
|
1975
|
-
onOpenSettings && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1976
|
-
ui.Button,
|
|
1892
|
+
items: [
|
|
1893
|
+
...workspace ? [
|
|
1977
1894
|
{
|
|
1978
|
-
|
|
1979
|
-
|
|
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
|
-
|
|
1991
|
-
!compact && modelSelector,
|
|
1992
|
-
rightButton
|
|
1993
|
-
] })
|
|
1898
|
+
] : [],
|
|
1899
|
+
...currentConversationId ? [{ label: conversationTitle }] : []
|
|
1900
|
+
]
|
|
1994
1901
|
}
|
|
1995
|
-
),
|
|
1996
|
-
|
|
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 =
|
|
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] =
|
|
2064
|
-
const [factSaved, setFactSaved] =
|
|
2065
|
-
const [isStepsExpanded, setIsStepsExpanded] =
|
|
2066
|
-
const [showDetailsModal, setShowDetailsModal] =
|
|
2067
|
-
const messageRef =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2182
|
+
React6__default.default.createElement(
|
|
2255
2183
|
"span",
|
|
2256
2184
|
{},
|
|
2257
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
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] =
|
|
2955
|
-
const participantTints =
|
|
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 =
|
|
2984
|
-
const getScrollContainer =
|
|
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
|
-
|
|
2908
|
+
React6.useEffect(() => {
|
|
2989
2909
|
scrollContainerRef.current = scrollElementRef?.current ?? resolveScrollContainer(null);
|
|
2990
2910
|
}, [scrollElementRef]);
|
|
2991
|
-
const { items: activityItems } =
|
|
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 =
|
|
2929
|
+
const getTranscriptItemKey = React6.useCallback(
|
|
3010
2930
|
(index) => transcript[index]?.id ?? index,
|
|
3011
2931
|
[transcript]
|
|
3012
2932
|
);
|
|
3013
|
-
const estimateTranscriptItemSize =
|
|
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 =
|
|
3037
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3153
|
-
const scrollRef =
|
|
3154
|
-
const following =
|
|
3155
|
-
const [showLatest, setShowLatest] =
|
|
3156
|
-
const inputRef =
|
|
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
|
-
|
|
3083
|
+
React6.useEffect(() => {
|
|
3164
3084
|
following.current = true;
|
|
3165
3085
|
setShowLatest(false);
|
|
3166
3086
|
}, [currentConversationId]);
|
|
3167
|
-
|
|
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 =
|
|
3313
|
-
const [expanded, setExpanded] =
|
|
3314
|
-
const [uploadError, setUploadError] =
|
|
3315
|
-
const [uploadNotice, setUploadNotice] =
|
|
3316
|
-
const [search, setSearch] =
|
|
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
|
-
|
|
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] =
|
|
3545
|
-
const [email, setEmail] =
|
|
3546
|
-
const [recoveryKey, setRecoveryKey] =
|
|
3547
|
-
const [isKeyEncrypted, setIsKeyEncrypted] =
|
|
3548
|
-
const [fileName, setFileName] =
|
|
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] =
|
|
3552
|
-
const [isProcessing, setIsProcessing] =
|
|
3553
|
-
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3764
|
-
const [isRequestingCode, setIsRequestingCode] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3932
|
-
const [password, setPassword] =
|
|
3933
|
-
const [confirmPassword, setConfirmPassword] =
|
|
3934
|
-
const [firstName2, setFirstName] =
|
|
3935
|
-
const [lastName, setLastName] =
|
|
3936
|
-
const [verificationCode, setVerificationCode] =
|
|
3937
|
-
const [verificationSent, setVerificationSent] =
|
|
3938
|
-
const [emailVerified, setEmailVerified] =
|
|
3939
|
-
const [showVerificationForm, setShowVerificationForm] =
|
|
3940
|
-
const [pendingAutoRequest, setPendingAutoRequest] =
|
|
3941
|
-
const [cooldownSeconds, setCooldownSeconds] =
|
|
3942
|
-
const [error, setError] =
|
|
3943
|
-
const [success, setSuccess] =
|
|
3944
|
-
const [isRegistering, setIsRegistering] =
|
|
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] =
|
|
3950
|
-
const cooldownIntervalRef =
|
|
3951
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3966
|
+
const switchMode = React6.useCallback((registering) => {
|
|
4047
3967
|
setIsRegistering(registering);
|
|
4048
3968
|
setPassword("");
|
|
4049
3969
|
setConfirmPassword("");
|
|
4050
3970
|
}, []);
|
|
4051
|
-
const clearForm =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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] =
|
|
4156
|
-
const [masterPassword, setMasterPassword] =
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
4461
|
-
const emailInputRef =
|
|
4462
|
-
|
|
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] =
|
|
4477
|
-
const [saveRecoveryKey, setSaveRecoveryKey] =
|
|
4478
|
-
const [showPassword, setShowPassword] =
|
|
4479
|
-
const [showForgotPasswordModal, setShowForgotPasswordModal] =
|
|
4480
|
-
const [showChangePasswordModal, setShowChangePasswordModal] =
|
|
4481
|
-
const [prefilledRecovery, setPrefilledRecovery] =
|
|
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
|
-
|
|
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
|
-
|
|
4433
|
+
React6.useEffect(() => {
|
|
4514
4434
|
if (isSsoOnly && !sso.isLoading && !isRedirecting) {
|
|
4515
4435
|
handleSsoLogin();
|
|
4516
4436
|
}
|
|
4517
4437
|
}, [isSsoOnly, sso.isLoading, isRedirecting, handleSsoLogin]);
|
|
4518
|
-
|
|
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 =
|
|
4794
|
+
var Context = React6.createContext(null);
|
|
4875
4795
|
function useEmbeddedNavigation() {
|
|
4876
|
-
return
|
|
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] =
|
|
4884
|
-
const [file, setFile] =
|
|
4885
|
-
|
|
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] =
|
|
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] =
|
|
4912
|
+
const [search, setSearch] = React6.useState("");
|
|
4993
4913
|
const upload = react.useUploadDocuments();
|
|
4994
4914
|
const role = react.useWorkspaceRole();
|
|
4995
|
-
const input =
|
|
4996
|
-
const [uploadError, setUploadError] =
|
|
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 =
|
|
5102
|
+
const select = chunkI3HK46DH_cjs.useSelectWorkspace();
|
|
5183
5103
|
const connection = chunkURYJ2SFQ_cjs.useOptionalConnection();
|
|
5184
|
-
const [pending, setPending] =
|
|
5185
|
-
const [error, setError] =
|
|
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 =
|
|
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-
|
|
5369
|
-
//# sourceMappingURL=chunk-
|
|
5288
|
+
//# sourceMappingURL=chunk-Y3VXKSW7.cjs.map
|
|
5289
|
+
//# sourceMappingURL=chunk-Y3VXKSW7.cjs.map
|