@arbidocs/blocks 0.4.146 → 0.4.147
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/dist/agents/index.cjs +262 -262
- package/dist/agents/index.js +5 -5
- package/dist/{chunk-MFMASSEO.cjs → chunk-AINU3EJ6.cjs} +8 -8
- package/dist/{chunk-MFMASSEO.cjs.map → chunk-AINU3EJ6.cjs.map} +1 -1
- package/dist/{chunk-O2GW5IY6.cjs → chunk-AO7SK6WP.cjs} +29 -29
- package/dist/{chunk-O2GW5IY6.cjs.map → chunk-AO7SK6WP.cjs.map} +1 -1
- package/dist/{chunk-OBWYM25Y.js → chunk-DAHCRVPM.js} +3 -3
- package/dist/{chunk-OBWYM25Y.js.map → chunk-DAHCRVPM.js.map} +1 -1
- package/dist/{chunk-FUTMU4FR.js → chunk-DGV7HQA7.js} +6 -179
- package/dist/chunk-DGV7HQA7.js.map +1 -0
- package/dist/{chunk-O6IEZDRC.cjs → chunk-GRGS5M6O.cjs} +181 -3
- package/dist/chunk-GRGS5M6O.cjs.map +1 -0
- package/dist/{chunk-A6IU4GIW.js → chunk-H74HEPKT.js} +3 -3
- package/dist/{chunk-A6IU4GIW.js.map → chunk-H74HEPKT.js.map} +1 -1
- package/dist/{chunk-LPYEUD2D.cjs → chunk-IL3WB3YX.cjs} +3 -3
- package/dist/{chunk-LPYEUD2D.cjs.map → chunk-IL3WB3YX.cjs.map} +1 -1
- package/dist/{chunk-C3CGJK7A.cjs → chunk-LTU35TQN.cjs} +5 -5
- package/dist/{chunk-C3CGJK7A.cjs.map → chunk-LTU35TQN.cjs.map} +1 -1
- package/dist/{chunk-T5B7FM7S.js → chunk-LZRMXJIE.js} +3 -3
- package/dist/{chunk-T5B7FM7S.js.map → chunk-LZRMXJIE.js.map} +1 -1
- package/dist/{chunk-OPTBQSCV.cjs → chunk-MFY2ZNP6.cjs} +2 -181
- package/dist/{chunk-FUTMU4FR.js.map → chunk-MFY2ZNP6.cjs.map} +1 -1
- package/dist/{chunk-6HCJ3ZEU.js → chunk-R6VCPDPF.js} +178 -6
- package/dist/chunk-R6VCPDPF.js.map +1 -0
- package/dist/{chunk-C44TDH54.js → chunk-SUUPR735.js} +3 -3
- package/dist/{chunk-C44TDH54.js.map → chunk-SUUPR735.js.map} +1 -1
- package/dist/{chunk-RB7GX2VT.cjs → chunk-T5I4NRFP.cjs} +6 -6
- package/dist/{chunk-RB7GX2VT.cjs.map → chunk-T5I4NRFP.cjs.map} +1 -1
- package/dist/chunk-U37AYUPI.cjs +5371 -0
- package/dist/chunk-U37AYUPI.cjs.map +1 -0
- package/dist/{chunk-IJST4EBM.js → chunk-VUR63NMQ.js} +5 -5
- package/dist/{chunk-IJST4EBM.js.map → chunk-VUR63NMQ.js.map} +1 -1
- package/dist/chunk-WIZ7Z7FN.js +5179 -0
- package/dist/chunk-WIZ7Z7FN.js.map +1 -0
- package/dist/collaboration/index.cjs +73 -73
- package/dist/collaboration/index.js +2 -2
- package/dist/connect/docx.cjs +7 -7
- package/dist/connect/docx.js +4 -4
- package/dist/connect/index.cjs +1029 -125
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +910 -13
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/connectors/ConnectedAppsSettings.d.ts +24 -0
- package/dist/connection/connectors/ConnectedDriveSyncDialog.d.ts +12 -0
- package/dist/connection/connectors/ConnectedMailboxSyncDialog.d.ts +12 -0
- package/dist/connection/connectors/index.d.ts +4 -0
- package/dist/connection/connectors/sync-labels.d.ts +21 -0
- package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +4 -0
- package/dist/connection/settings-page/index.d.ts +1 -1
- package/dist/files/index.cjs +2 -2
- package/dist/files/index.js +2 -2
- package/dist/index.cjs +395 -395
- package/dist/index.js +11 -11
- package/dist/settings/PlanBadge.d.ts +1 -1
- package/dist/settings/index.cjs +545 -3710
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +8 -3525
- package/dist/settings/index.js.map +1 -1
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/workflow-canvas/index.cjs +18 -18
- package/dist/workflow-canvas/index.js +5 -5
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-5YHEHEJT.js +0 -1667
- package/dist/chunk-5YHEHEJT.js.map +0 -1
- package/dist/chunk-6HCJ3ZEU.js.map +0 -1
- package/dist/chunk-O6IEZDRC.cjs.map +0 -1
- package/dist/chunk-OPTBQSCV.cjs.map +0 -1
- package/dist/chunk-U73KPFYH.cjs +0 -1717
- package/dist/chunk-U73KPFYH.cjs.map +0 -1
package/dist/connect/index.cjs
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunkRXK3XP62_cjs = require('../chunk-RXK3XP62.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunkU37AYUPI_cjs = require('../chunk-U37AYUPI.cjs');
|
|
6
6
|
var chunkODRHHWHY_cjs = require('../chunk-ODRHHWHY.cjs');
|
|
7
|
-
var
|
|
7
|
+
var chunkAINU3EJ6_cjs = require('../chunk-AINU3EJ6.cjs');
|
|
8
8
|
var chunkGAYMJWTC_cjs = require('../chunk-GAYMJWTC.cjs');
|
|
9
9
|
var chunkGFNELPDP_cjs = require('../chunk-GFNELPDP.cjs');
|
|
10
10
|
var chunkJH6JTI76_cjs = require('../chunk-JH6JTI76.cjs');
|
|
@@ -12,21 +12,25 @@ require('../chunk-464YPRAE.cjs');
|
|
|
12
12
|
require('../chunk-V5OAXIBN.cjs');
|
|
13
13
|
require('../chunk-5FYU7ZIU.cjs');
|
|
14
14
|
var chunkO4YPVYPO_cjs = require('../chunk-O4YPVYPO.cjs');
|
|
15
|
-
|
|
15
|
+
require('../chunk-223D4727.cjs');
|
|
16
|
+
var chunkLTU35TQN_cjs = require('../chunk-LTU35TQN.cjs');
|
|
16
17
|
var chunkXAJIKT6Y_cjs = require('../chunk-XAJIKT6Y.cjs');
|
|
18
|
+
require('../chunk-QZTNTP75.cjs');
|
|
17
19
|
var chunkV46W7YLI_cjs = require('../chunk-V46W7YLI.cjs');
|
|
18
|
-
|
|
20
|
+
require('../chunk-NWNVWO6L.cjs');
|
|
21
|
+
var chunkGRGS5M6O_cjs = require('../chunk-GRGS5M6O.cjs');
|
|
19
22
|
require('../chunk-LJJJ6CYH.cjs');
|
|
20
23
|
var chunkI2QSDQQV_cjs = require('../chunk-I2QSDQQV.cjs');
|
|
21
24
|
require('../chunk-RC25WMVB.cjs');
|
|
22
|
-
var
|
|
25
|
+
var chunkT5I4NRFP_cjs = require('../chunk-T5I4NRFP.cjs');
|
|
23
26
|
var chunkRFIBUWLF_cjs = require('../chunk-RFIBUWLF.cjs');
|
|
24
|
-
var
|
|
27
|
+
var chunkIL3WB3YX_cjs = require('../chunk-IL3WB3YX.cjs');
|
|
25
28
|
require('../chunk-EYKISBDO.cjs');
|
|
26
|
-
require('../chunk-AHDJXIUB.cjs');
|
|
27
29
|
var chunkRQ2Y7USX_cjs = require('../chunk-RQ2Y7USX.cjs');
|
|
30
|
+
require('../chunk-AHDJXIUB.cjs');
|
|
28
31
|
require('../chunk-ZW6FPIFC.cjs');
|
|
29
32
|
require('../chunk-DETZZBG2.cjs');
|
|
33
|
+
require('../chunk-DVUZTGVL.cjs');
|
|
30
34
|
require('../chunk-DTROMMDX.cjs');
|
|
31
35
|
var chunkV4ISCZJ7_cjs = require('../chunk-V4ISCZJ7.cjs');
|
|
32
36
|
var chunk2EI7NCUA_cjs = require('../chunk-2EI7NCUA.cjs');
|
|
@@ -142,7 +146,7 @@ function ConnectedWorkspaceActivity({
|
|
|
142
146
|
[feed.data]
|
|
143
147
|
);
|
|
144
148
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
145
|
-
|
|
149
|
+
chunkLTU35TQN_cjs.WorkspaceActivityList,
|
|
146
150
|
{
|
|
147
151
|
...listProps,
|
|
148
152
|
items,
|
|
@@ -570,7 +574,7 @@ function NotificationCenter({
|
|
|
570
574
|
}
|
|
571
575
|
];
|
|
572
576
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-full bg-background", "data-testid": "notifications-page", children: [
|
|
573
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
577
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.DraggableHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
574
578
|
chunk7RGLTF76_cjs.TabHeader,
|
|
575
579
|
{
|
|
576
580
|
tabs,
|
|
@@ -820,7 +824,7 @@ function ConnectedWorkspaceNotificationMenu({
|
|
|
820
824
|
}, [error, notify]);
|
|
821
825
|
if (!workspaceId) return null;
|
|
822
826
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
823
|
-
|
|
827
|
+
chunkLTU35TQN_cjs.WorkspaceNotificationMenu,
|
|
824
828
|
{
|
|
825
829
|
...menuProps,
|
|
826
830
|
level,
|
|
@@ -839,7 +843,7 @@ function ConnectedThreadFollow({
|
|
|
839
843
|
enabled: live
|
|
840
844
|
});
|
|
841
845
|
if (!conversationId) return null;
|
|
842
|
-
const Control = as === "menu-item" ?
|
|
846
|
+
const Control = as === "menu-item" ? chunkLTU35TQN_cjs.ThreadFollowMenuItem : chunkLTU35TQN_cjs.ThreadFollowButton;
|
|
843
847
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
844
848
|
Control,
|
|
845
849
|
{
|
|
@@ -912,7 +916,7 @@ function ConnectedSkillUpload({ onDone, labels, className }) {
|
|
|
912
916
|
onChange: (e) => {
|
|
913
917
|
const file = e.target.files?.[0];
|
|
914
918
|
e.target.value = "";
|
|
915
|
-
if (file) void add(() =>
|
|
919
|
+
if (file) void add(() => chunkT5I4NRFP_cjs.importSkillFile(file));
|
|
916
920
|
}
|
|
917
921
|
}
|
|
918
922
|
),
|
|
@@ -937,7 +941,7 @@ function ConnectedSkillUpload({ onDone, labels, className }) {
|
|
|
937
941
|
className: "space-y-2",
|
|
938
942
|
onSubmit: (e) => {
|
|
939
943
|
e.preventDefault();
|
|
940
|
-
if (url.trim()) void add(() =>
|
|
944
|
+
if (url.trim()) void add(() => chunkT5I4NRFP_cjs.importSkillFromUrl(url));
|
|
941
945
|
},
|
|
942
946
|
children: [
|
|
943
947
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: "skills-add-url", children: l.fromLink }),
|
|
@@ -1001,9 +1005,9 @@ function ConnectedSkillsLibrary({
|
|
|
1001
1005
|
const [type, setType] = react.useState("all");
|
|
1002
1006
|
const [view, setView] = react.useState("gallery");
|
|
1003
1007
|
const [isBusy, setIsBusy] = react.useState(false);
|
|
1004
|
-
const all = react.useMemo(() =>
|
|
1008
|
+
const all = react.useMemo(() => chunkT5I4NRFP_cjs.buildLibrarySkills(builtins, listings ?? []), [builtins, listings]);
|
|
1005
1009
|
const shown = react.useMemo(
|
|
1006
|
-
() =>
|
|
1010
|
+
() => chunkT5I4NRFP_cjs.filterLibrarySkills(all, { query, source, type }),
|
|
1007
1011
|
[all, query, source, type]
|
|
1008
1012
|
);
|
|
1009
1013
|
const current = all.find((s) => s.slug === selected) ?? null;
|
|
@@ -1014,21 +1018,21 @@ function ConnectedSkillsLibrary({
|
|
|
1014
1018
|
const count = (s) => all.filter((x) => x.source === s).length;
|
|
1015
1019
|
const sourceOptions = [
|
|
1016
1020
|
{ id: "all", label: "All", count: all.length },
|
|
1017
|
-
{ id: "builtin", label:
|
|
1018
|
-
{ id: "mine", label:
|
|
1019
|
-
{ id: "shared", label:
|
|
1021
|
+
{ id: "builtin", label: chunkT5I4NRFP_cjs.SKILL_SOURCE_LABELS.builtin, count: count("builtin") },
|
|
1022
|
+
{ id: "mine", label: chunkT5I4NRFP_cjs.SKILL_SOURCE_LABELS.mine, count: count("mine") },
|
|
1023
|
+
{ id: "shared", label: chunkT5I4NRFP_cjs.SKILL_SOURCE_LABELS.shared, count: count("shared") }
|
|
1020
1024
|
];
|
|
1021
1025
|
const types = [...new Set(all.map((s) => s.type))];
|
|
1022
1026
|
const typeOptions = [
|
|
1023
1027
|
{ id: "all", label: "Any kind" },
|
|
1024
|
-
...types.map((t) => ({ id: t, label:
|
|
1028
|
+
...types.map((t) => ({ id: t, label: chunkT5I4NRFP_cjs.SKILL_TYPE_LABELS[t] ?? t }))
|
|
1025
1029
|
];
|
|
1026
1030
|
const pick = (slug) => {
|
|
1027
1031
|
setSelected(slug);
|
|
1028
1032
|
setMode("detail");
|
|
1029
1033
|
};
|
|
1030
1034
|
const markdownOf = async (skill) => {
|
|
1031
|
-
if (!skill.docExtId) return
|
|
1035
|
+
if (!skill.docExtId) return chunkT5I4NRFP_cjs.workflowToSkillMarkdown(skill.workflow);
|
|
1032
1036
|
const response = await arbi.documents.download(skill.docExtId);
|
|
1033
1037
|
if (!response.ok) throw new Error(`Could not read the skill (${response.status})`);
|
|
1034
1038
|
return response.text();
|
|
@@ -1036,7 +1040,7 @@ function ConnectedSkillsLibrary({
|
|
|
1036
1040
|
const saveAs = (slug, markdown, shared = false) => upload.mutateAsync([
|
|
1037
1041
|
{
|
|
1038
1042
|
folder: `${SKILL_FOLDER}${slug}`,
|
|
1039
|
-
fileName:
|
|
1043
|
+
fileName: chunkT5I4NRFP_cjs.SKILL_MAIN_FILENAME,
|
|
1040
1044
|
content: new Blob([markdown], { type: "text/markdown" }),
|
|
1041
1045
|
shared
|
|
1042
1046
|
}
|
|
@@ -1099,7 +1103,7 @@ function ConnectedSkillsLibrary({
|
|
|
1099
1103
|
try {
|
|
1100
1104
|
documentTools.downloadBlob(
|
|
1101
1105
|
new Blob([await markdownOf(skill)], { type: "text/markdown" }),
|
|
1102
|
-
|
|
1106
|
+
chunkT5I4NRFP_cjs.SKILL_MAIN_FILENAME
|
|
1103
1107
|
);
|
|
1104
1108
|
} catch (error) {
|
|
1105
1109
|
notify(errorText(error, "Could not export the skill"), "error");
|
|
@@ -1140,10 +1144,10 @@ function ConnectedSkillsLibrary({
|
|
|
1140
1144
|
}
|
|
1141
1145
|
)
|
|
1142
1146
|
] }),
|
|
1143
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1147
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkT5I4NRFP_cjs.SkillViewToggle, { value: view, onChange: setView })
|
|
1144
1148
|
] }),
|
|
1145
1149
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1146
|
-
|
|
1150
|
+
chunkT5I4NRFP_cjs.SkillFilterChips,
|
|
1147
1151
|
{
|
|
1148
1152
|
label: "Show",
|
|
1149
1153
|
value: source,
|
|
@@ -1152,7 +1156,7 @@ function ConnectedSkillsLibrary({
|
|
|
1152
1156
|
}
|
|
1153
1157
|
),
|
|
1154
1158
|
types.length > 1 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1155
|
-
|
|
1159
|
+
chunkT5I4NRFP_cjs.SkillFilterChips,
|
|
1156
1160
|
{
|
|
1157
1161
|
label: "Kind",
|
|
1158
1162
|
value: type,
|
|
@@ -1199,12 +1203,12 @@ function ConnectedSkillsLibrary({
|
|
|
1199
1203
|
view === "gallery" ? "grid grid-cols-[repeat(auto-fill,minmax(9.5rem,1fr))]" : "flex flex-col"
|
|
1200
1204
|
),
|
|
1201
1205
|
children: shown.map((skill) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
1202
|
-
|
|
1206
|
+
chunkT5I4NRFP_cjs.SkillTile,
|
|
1203
1207
|
{
|
|
1204
1208
|
name: skill.title,
|
|
1205
1209
|
testId: `skill-tile-${skill.slug}`,
|
|
1206
1210
|
description: skill.description,
|
|
1207
|
-
sourceLabel: skill.isShared ? `${
|
|
1211
|
+
sourceLabel: skill.isShared ? `${chunkT5I4NRFP_cjs.SKILL_SOURCE_LABELS.mine}, shared` : chunkT5I4NRFP_cjs.SKILL_SOURCE_LABELS[skill.source],
|
|
1208
1212
|
type: skill.type,
|
|
1209
1213
|
icon,
|
|
1210
1214
|
layout: view,
|
|
@@ -1239,7 +1243,7 @@ function ConnectedSkillsLibrary({
|
|
|
1239
1243
|
}
|
|
1240
1244
|
),
|
|
1241
1245
|
mode === "new" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1242
|
-
|
|
1246
|
+
chunkT5I4NRFP_cjs.SkillGenerateForm,
|
|
1243
1247
|
{
|
|
1244
1248
|
icon,
|
|
1245
1249
|
onGenerate: (desc) => {
|
|
@@ -1266,11 +1270,11 @@ function ConnectedSkillsLibrary({
|
|
|
1266
1270
|
),
|
|
1267
1271
|
mode === "add" && /* @__PURE__ */ jsxRuntime.jsx(ConnectedSkillUpload, { onDone: done }),
|
|
1268
1272
|
mode === "detail" && current && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1269
|
-
|
|
1273
|
+
chunkT5I4NRFP_cjs.SkillLibraryDetail,
|
|
1270
1274
|
{
|
|
1271
1275
|
skill: current,
|
|
1272
1276
|
icon,
|
|
1273
|
-
instructions: current.docExtId ? currentText ?
|
|
1277
|
+
instructions: current.docExtId ? currentText ? chunkT5I4NRFP_cjs.parseSkillFrontmatter(currentText, chunkT5I4NRFP_cjs.SKILL_MAIN_FILENAME).content : "" : current.workflow.run.kind === "prompt" ? current.workflow.run.promptTemplate : "",
|
|
1274
1278
|
isLoading: !!current.docExtId && textLoading,
|
|
1275
1279
|
actions: {
|
|
1276
1280
|
onRun: () => onRun(current.slug),
|
|
@@ -1305,7 +1309,7 @@ function SkillEditor({
|
|
|
1305
1309
|
const [seeded, setSeeded] = react.useState(!isEditing);
|
|
1306
1310
|
const [nameError, setNameError] = react.useState(null);
|
|
1307
1311
|
if (isEditing && !seeded && text !== void 0) {
|
|
1308
|
-
const parsed =
|
|
1312
|
+
const parsed = chunkT5I4NRFP_cjs.parseSkillFrontmatter(text, chunkT5I4NRFP_cjs.SKILL_MAIN_FILENAME);
|
|
1309
1313
|
setDescription(parsed.description ?? "");
|
|
1310
1314
|
setBody(parsed.content ?? "");
|
|
1311
1315
|
setSeeded(true);
|
|
@@ -1319,15 +1323,15 @@ function SkillEditor({
|
|
|
1319
1323
|
notify("Add a short description.", "error");
|
|
1320
1324
|
return;
|
|
1321
1325
|
}
|
|
1322
|
-
const slug =
|
|
1326
|
+
const slug = chunkT5I4NRFP_cjs.skillSlug(name);
|
|
1323
1327
|
try {
|
|
1324
|
-
await onSave(slug,
|
|
1328
|
+
await onSave(slug, chunkT5I4NRFP_cjs.serializeSkill({ name: slug, description, body }), isEditing);
|
|
1325
1329
|
} catch (err) {
|
|
1326
1330
|
notify(errorText(err, "Could not save the skill"), "error");
|
|
1327
1331
|
}
|
|
1328
1332
|
};
|
|
1329
1333
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1330
|
-
|
|
1334
|
+
chunkT5I4NRFP_cjs.SkillEditForm,
|
|
1331
1335
|
{
|
|
1332
1336
|
name,
|
|
1333
1337
|
onNameChange: setName,
|
|
@@ -1363,9 +1367,9 @@ function ConnectedAgentCreator({
|
|
|
1363
1367
|
agent,
|
|
1364
1368
|
initialName,
|
|
1365
1369
|
onSaved,
|
|
1366
|
-
capabilities =
|
|
1367
|
-
templates =
|
|
1368
|
-
types =
|
|
1370
|
+
capabilities = chunkT5I4NRFP_cjs.DEFAULT_AGENT_CAPABILITIES,
|
|
1371
|
+
templates = chunkT5I4NRFP_cjs.DEFAULT_AGENT_TEMPLATES,
|
|
1372
|
+
types = chunkT5I4NRFP_cjs.DEFAULT_AGENT_TYPES,
|
|
1369
1373
|
canRevokeWorkspaces = false,
|
|
1370
1374
|
labels
|
|
1371
1375
|
}) {
|
|
@@ -1407,7 +1411,7 @@ function ConnectedAgentCreator({
|
|
|
1407
1411
|
const initialValues = react.useMemo(
|
|
1408
1412
|
() => ({
|
|
1409
1413
|
name: agent?.given_name ?? initialName ?? "",
|
|
1410
|
-
persona: isEdit ?
|
|
1414
|
+
persona: isEdit ? chunkT5I4NRFP_cjs.stripPersonaPreamble(String(agents.PERSONA ?? "")) : "",
|
|
1411
1415
|
modelName: String(agents.AGENT_MODEL_NAME ?? ""),
|
|
1412
1416
|
capabilities: Object.fromEntries(capabilities.map(({ key }) => [key, Boolean(agents[key])])),
|
|
1413
1417
|
type: "builtin",
|
|
@@ -1426,7 +1430,7 @@ function ConnectedAgentCreator({
|
|
|
1426
1430
|
try {
|
|
1427
1431
|
let agentExtId = agent?.external_id ?? early?.id ?? "";
|
|
1428
1432
|
if (!agentExtId) {
|
|
1429
|
-
if (!
|
|
1433
|
+
if (!chunkT5I4NRFP_cjs.isValidAgentName(values.name)) {
|
|
1430
1434
|
notify("Give the agent a name first.", "error");
|
|
1431
1435
|
return;
|
|
1432
1436
|
}
|
|
@@ -1462,7 +1466,7 @@ function ConnectedAgentCreator({
|
|
|
1462
1466
|
title: `agent-${name}`,
|
|
1463
1467
|
sections: {
|
|
1464
1468
|
Agents: {
|
|
1465
|
-
PERSONA:
|
|
1469
|
+
PERSONA: chunkT5I4NRFP_cjs.composePersona(name, values.persona),
|
|
1466
1470
|
...values.modelName ? { AGENT_MODEL_NAME: values.modelName } : {},
|
|
1467
1471
|
...Object.fromEntries(capabilities.map(({ key }) => [key, !!values.capabilities[key]])),
|
|
1468
1472
|
ENABLED_SKILLS: values.capabilities.SKILLS_ENABLED && skills.length ? skills : null,
|
|
@@ -1485,7 +1489,7 @@ function ConnectedAgentCreator({
|
|
|
1485
1489
|
};
|
|
1486
1490
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1487
1491
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1488
|
-
|
|
1492
|
+
chunkT5I4NRFP_cjs.AgentCreator,
|
|
1489
1493
|
{
|
|
1490
1494
|
open: ready,
|
|
1491
1495
|
onOpenChange,
|
|
@@ -1501,11 +1505,11 @@ function ConnectedAgentCreator({
|
|
|
1501
1505
|
) : void 0,
|
|
1502
1506
|
revokingWorkspaceId: revokeAccess.isPending ? revokeAccess.variables?.workspaceId : void 0,
|
|
1503
1507
|
avatar: (values) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
1504
|
-
|
|
1508
|
+
chunkT5I4NRFP_cjs.AgentAvatarField,
|
|
1505
1509
|
{
|
|
1506
1510
|
picture,
|
|
1507
1511
|
isBusy: avatarBusy,
|
|
1508
|
-
canGenerate: isEdit ||
|
|
1512
|
+
canGenerate: isEdit || chunkT5I4NRFP_cjs.isValidAgentName(values.name),
|
|
1509
1513
|
onGenerate: () => handleGenerateAvatar(values)
|
|
1510
1514
|
}
|
|
1511
1515
|
),
|
|
@@ -1557,7 +1561,7 @@ function ConnectedAgentCreator({
|
|
|
1557
1561
|
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogTitle, { children: "Connect your agent" }),
|
|
1558
1562
|
/* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: "This key is shown once. Run the script on the machine that will host the agent." })
|
|
1559
1563
|
] }),
|
|
1560
|
-
connect && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1564
|
+
connect && /* @__PURE__ */ jsxRuntime.jsx(chunkT5I4NRFP_cjs.AgentConnectInstructions, { email: connect.email, signingKey: connect.signingKey })
|
|
1561
1565
|
]
|
|
1562
1566
|
}
|
|
1563
1567
|
) })
|
|
@@ -1594,7 +1598,7 @@ function ConnectedWorkflowHistory({
|
|
|
1594
1598
|
const { openConversation } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
|
|
1595
1599
|
const { data: runs = [], isLoading } = react$1.useWorkflowRuns(workflow?.external_id);
|
|
1596
1600
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1597
|
-
|
|
1601
|
+
chunkT5I4NRFP_cjs.TaskRunsDialog,
|
|
1598
1602
|
{
|
|
1599
1603
|
inline,
|
|
1600
1604
|
hideHeader,
|
|
@@ -1630,14 +1634,14 @@ function ConnectedTaskActivityDialog({
|
|
|
1630
1634
|
const activity = react$1.useConversationActivity(conversationId, { live });
|
|
1631
1635
|
const { data: agents = [] } = react$1.useAgents();
|
|
1632
1636
|
const { userId } = chunkGFNELPDP_cjs.useConnectedWorkspace();
|
|
1633
|
-
const { members } =
|
|
1637
|
+
const { members } = chunkAINU3EJ6_cjs.useConnectedWorkspaceRole();
|
|
1634
1638
|
const renderPerson = react.useCallback(
|
|
1635
1639
|
(id) => {
|
|
1636
1640
|
const isMe = !!id && id === userId;
|
|
1637
1641
|
const member = members.find((m) => m.user.external_id === id)?.user;
|
|
1638
1642
|
const name = member && [member.given_name, member.family_name].filter(Boolean).join(" ") || member?.email;
|
|
1639
1643
|
const person = { id, label: isMe ? "You" : name || "Someone", isMe };
|
|
1640
|
-
return renderTaskPerson ? renderTaskPerson(person) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1644
|
+
return renderTaskPerson ? renderTaskPerson(person) : /* @__PURE__ */ jsxRuntime.jsx(chunkIL3WB3YX_cjs.PersonPill, { person });
|
|
1641
1645
|
},
|
|
1642
1646
|
[renderTaskPerson, userId, members]
|
|
1643
1647
|
);
|
|
@@ -1646,7 +1650,7 @@ function ConnectedTaskActivityDialog({
|
|
|
1646
1650
|
[agents]
|
|
1647
1651
|
);
|
|
1648
1652
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1649
|
-
|
|
1653
|
+
chunkT5I4NRFP_cjs.TaskActivityDialog,
|
|
1650
1654
|
{
|
|
1651
1655
|
open: true,
|
|
1652
1656
|
onOpenChange: (open) => !open && onClose(),
|
|
@@ -1792,7 +1796,7 @@ function useWorkflowThread(workflow, options = {}) {
|
|
|
1792
1796
|
);
|
|
1793
1797
|
const conversation = conversations.data?.find((c) => c.external_id === threadId);
|
|
1794
1798
|
const steps = react.useMemo(
|
|
1795
|
-
() => chunkJSTKEZBS_cjs.workflowSteps(workflow).length > 0 ? chunkJSTKEZBS_cjs.workflowSteps(workflow) :
|
|
1799
|
+
() => chunkJSTKEZBS_cjs.workflowSteps(workflow).length > 0 ? chunkJSTKEZBS_cjs.workflowSteps(workflow) : chunkT5I4NRFP_cjs.fromPlanSteps(conversation?.plan?.steps ?? []),
|
|
1796
1800
|
[workflow, conversation?.plan?.steps]
|
|
1797
1801
|
);
|
|
1798
1802
|
const activity = react$1.useConversationActivity(threadId, { live: !!threadId });
|
|
@@ -1852,7 +1856,7 @@ function useWorkflowThread(workflow, options = {}) {
|
|
|
1852
1856
|
criteria: [],
|
|
1853
1857
|
max_passes: 3,
|
|
1854
1858
|
documents: [],
|
|
1855
|
-
steps:
|
|
1859
|
+
steps: chunkT5I4NRFP_cjs.toPlanSteps(workflow, {
|
|
1856
1860
|
inputs: values,
|
|
1857
1861
|
resolveWorkflow: options.resolveWorkflow,
|
|
1858
1862
|
compose: options.compose
|
|
@@ -1939,7 +1943,7 @@ function useWorkflowThread(workflow, options = {}) {
|
|
|
1939
1943
|
const anyRunning = Object.values(states).some((s) => s.status === "running");
|
|
1940
1944
|
const needsStart = !threadId || idle && !anyRunning;
|
|
1941
1945
|
const runError = idle ? conversation?.last_error ?? null : null;
|
|
1942
|
-
const view =
|
|
1946
|
+
const view = chunkT5I4NRFP_cjs.useWorkflowView({
|
|
1943
1947
|
steps,
|
|
1944
1948
|
states,
|
|
1945
1949
|
inputs,
|
|
@@ -2107,7 +2111,7 @@ function WorkflowWordDialog({
|
|
|
2107
2111
|
title: title ?? labels.wordTitle,
|
|
2108
2112
|
size: "xl",
|
|
2109
2113
|
testId: "workflow-word-dialog",
|
|
2110
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Body, { className: "h-[70dvh] p-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2114
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalScaffold.Body, { className: "h-[70dvh] p-0", children: /* @__PURE__ */ jsxRuntime.jsx(chunkAINU3EJ6_cjs.ConnectedNativeDocxEditor, { documentId: id, title: title ?? labels.wordTitle }) })
|
|
2111
2115
|
}
|
|
2112
2116
|
);
|
|
2113
2117
|
}
|
|
@@ -2416,7 +2420,7 @@ function ConnectedWorkflowRunner({
|
|
|
2416
2420
|
);
|
|
2417
2421
|
};
|
|
2418
2422
|
const runner = (compact) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2419
|
-
|
|
2423
|
+
chunkT5I4NRFP_cjs.WorkflowRunner,
|
|
2420
2424
|
{
|
|
2421
2425
|
people,
|
|
2422
2426
|
...runnerProps,
|
|
@@ -2462,7 +2466,7 @@ function ConnectedWorkflowRunner({
|
|
|
2462
2466
|
) }),
|
|
2463
2467
|
inThread && conversationId ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2464
2468
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2465
|
-
|
|
2469
|
+
chunkT5I4NRFP_cjs.WorkflowStepBar,
|
|
2466
2470
|
{
|
|
2467
2471
|
run: view,
|
|
2468
2472
|
levels: chunkJSTKEZBS_cjs.stepLevels(view.steps),
|
|
@@ -2663,7 +2667,7 @@ function ConnectedTagTable({
|
|
|
2663
2667
|
const fail = (e) => setError(e instanceof Error ? e.message : String(e));
|
|
2664
2668
|
const snapshot = (data) => {
|
|
2665
2669
|
const title = exportTitle ?? KIND_TITLES[kind];
|
|
2666
|
-
const bytes =
|
|
2670
|
+
const bytes = chunkLTU35TQN_cjs.tagTableDocx(data, {
|
|
2667
2671
|
title,
|
|
2668
2672
|
nameOf: (id) => people.find((p) => p.value === id)?.label
|
|
2669
2673
|
});
|
|
@@ -2673,7 +2677,7 @@ function ConnectedTagTable({
|
|
|
2673
2677
|
};
|
|
2674
2678
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
2675
2679
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2676
|
-
|
|
2680
|
+
chunkLTU35TQN_cjs.TagTable,
|
|
2677
2681
|
{
|
|
2678
2682
|
...props,
|
|
2679
2683
|
table,
|
|
@@ -2820,13 +2824,13 @@ function ConnectedProfileCard({
|
|
|
2820
2824
|
}
|
|
2821
2825
|
});
|
|
2822
2826
|
const display = profile?.fullName || "Unnamed";
|
|
2823
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2827
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.UserCircle, {}), title, children: [
|
|
2824
2828
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2825
|
-
|
|
2829
|
+
chunkU37AYUPI_cjs.ProfileCard,
|
|
2826
2830
|
{
|
|
2827
2831
|
avatar: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2828
2832
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2829
|
-
|
|
2833
|
+
chunkU37AYUPI_cjs.AvatarPicker,
|
|
2830
2834
|
{
|
|
2831
2835
|
pictureUrl: profile?.picture,
|
|
2832
2836
|
initials: chunkKDG6FER6_cjs.initials(display),
|
|
@@ -2873,9 +2877,9 @@ function ConnectedIdentityVerification({
|
|
|
2873
2877
|
onNameAccepted: () => notify("Name updated to match your ID", "success")
|
|
2874
2878
|
});
|
|
2875
2879
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2876
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2880
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.IdentityVerificationCard, { flow, labels, onManageBilling }),
|
|
2877
2881
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2878
|
-
|
|
2882
|
+
chunkU37AYUPI_cjs.IdentityVerificationDialog,
|
|
2879
2883
|
{
|
|
2880
2884
|
flow,
|
|
2881
2885
|
accountName: profile?.fullName ?? "",
|
|
@@ -2888,7 +2892,7 @@ function ConnectedIdentityVerification({
|
|
|
2888
2892
|
function ConnectedRequireVerified({ children, labels }) {
|
|
2889
2893
|
const { data: profile } = react$1.useProfile();
|
|
2890
2894
|
const flow = react$1.useIdentityVerification();
|
|
2891
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2895
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.RequireVerified, { flow, accountName: profile?.fullName ?? "", labels, children });
|
|
2892
2896
|
}
|
|
2893
2897
|
function defaultUnmetPasswordRequirement(password) {
|
|
2894
2898
|
if (password.length < 8) return "Minimum 8 characters";
|
|
@@ -2921,7 +2925,7 @@ function ConnectedPasswordChangeDialog({
|
|
|
2921
2925
|
onRecoveryComplete
|
|
2922
2926
|
});
|
|
2923
2927
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2924
|
-
|
|
2928
|
+
chunkU37AYUPI_cjs.PasswordChangeDialog,
|
|
2925
2929
|
{
|
|
2926
2930
|
open,
|
|
2927
2931
|
onClose: form.onCancel,
|
|
@@ -2947,10 +2951,10 @@ function ConnectedSecuritySection({
|
|
|
2947
2951
|
children
|
|
2948
2952
|
}) {
|
|
2949
2953
|
const [open, setOpen] = react.useState(false);
|
|
2950
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2951
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
2954
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.KeyRound, {}), title: "Security", children: [
|
|
2955
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsCard, { padding: "sm", children: [
|
|
2952
2956
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2953
|
-
|
|
2957
|
+
chunkU37AYUPI_cjs.SettingsActionRow,
|
|
2954
2958
|
{
|
|
2955
2959
|
title: "Change password",
|
|
2956
2960
|
description: "Used to sign in and to unlock your account key. Changing it keeps everything readable and re-encrypts nothing.",
|
|
@@ -2971,23 +2975,23 @@ function ConnectedSecuritySection({
|
|
|
2971
2975
|
] });
|
|
2972
2976
|
}
|
|
2973
2977
|
function ConnectedNotificationPreferences({
|
|
2974
|
-
categories =
|
|
2978
|
+
categories = chunkU37AYUPI_cjs.EMAIL_NOTIFICATION_CATEGORIES,
|
|
2975
2979
|
title = "Notifications"
|
|
2976
2980
|
}) {
|
|
2977
2981
|
const keys = react.useMemo(
|
|
2978
|
-
() => categories ===
|
|
2982
|
+
() => categories === chunkU37AYUPI_cjs.EMAIL_NOTIFICATION_CATEGORIES ? chunkU37AYUPI_cjs.EMAIL_NOTIFICATION_KEYS : categories.map((c) => c.key),
|
|
2979
2983
|
[categories]
|
|
2980
2984
|
);
|
|
2981
2985
|
const prefs = react$1.useNotificationPreferences(keys);
|
|
2982
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2983
|
-
|
|
2986
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsSection, { title, children: /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsCard, { className: "space-y-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
2987
|
+
chunkU37AYUPI_cjs.NotificationCategoryList,
|
|
2984
2988
|
{
|
|
2985
2989
|
masterId: "emailNotifications",
|
|
2986
2990
|
masterTitle: "Email Notifications",
|
|
2987
2991
|
masterDescription: "Email me about activity when I\u2019m away",
|
|
2988
2992
|
masterChecked: prefs.masterChecked,
|
|
2989
2993
|
onMasterChange: prefs.setAll,
|
|
2990
|
-
categories:
|
|
2994
|
+
categories: chunkU37AYUPI_cjs.toNotificationCategories(prefs.checked, categories),
|
|
2991
2995
|
onCategoryChange: prefs.setCategory
|
|
2992
2996
|
}
|
|
2993
2997
|
) }) });
|
|
@@ -3000,14 +3004,14 @@ function ConnectedSessionsRow({
|
|
|
3000
3004
|
const sessions = react$1.useSessions({ enabled: open });
|
|
3001
3005
|
const currentSessionId = react$1.useCurrentSessionId();
|
|
3002
3006
|
const terminate = react$1.useTerminateSession();
|
|
3003
|
-
const views =
|
|
3007
|
+
const views = chunkU37AYUPI_cjs.toActiveSessionViews(sessions.data ?? [], {
|
|
3004
3008
|
currentSessionId,
|
|
3005
3009
|
terminatingId: terminate.isPending ? terminate.variables : null,
|
|
3006
3010
|
renderIcon: renderSessionIcon
|
|
3007
3011
|
});
|
|
3008
3012
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3009
3013
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3010
|
-
|
|
3014
|
+
chunkU37AYUPI_cjs.SettingsRow,
|
|
3011
3015
|
{
|
|
3012
3016
|
label: "Active sessions",
|
|
3013
3017
|
description: "Devices and agents currently signed in to your account.",
|
|
@@ -3029,7 +3033,7 @@ function ConnectedSessionsRow({
|
|
|
3029
3033
|
}
|
|
3030
3034
|
),
|
|
3031
3035
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3032
|
-
|
|
3036
|
+
chunkU37AYUPI_cjs.ActiveSessionsDialog,
|
|
3033
3037
|
{
|
|
3034
3038
|
open,
|
|
3035
3039
|
onOpenChange: setOpen,
|
|
@@ -3071,7 +3075,7 @@ function ConnectedLogoutDialog({
|
|
|
3071
3075
|
signOut.mutate({ everywhere, reason: "manual" });
|
|
3072
3076
|
};
|
|
3073
3077
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3074
|
-
|
|
3078
|
+
chunkU37AYUPI_cjs.LogoutDialog,
|
|
3075
3079
|
{
|
|
3076
3080
|
open,
|
|
3077
3081
|
onClose,
|
|
@@ -3079,7 +3083,7 @@ function ConnectedLogoutDialog({
|
|
|
3079
3083
|
onLogoutAll: () => void run(true),
|
|
3080
3084
|
canLogoutAll,
|
|
3081
3085
|
isOnline,
|
|
3082
|
-
sessions:
|
|
3086
|
+
sessions: chunkU37AYUPI_cjs.toLogoutSessionViews(sessions.data ?? []),
|
|
3083
3087
|
renderSessionIcon
|
|
3084
3088
|
}
|
|
3085
3089
|
);
|
|
@@ -3101,7 +3105,7 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
|
|
|
3101
3105
|
});
|
|
3102
3106
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3103
3107
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3104
|
-
|
|
3108
|
+
chunkU37AYUPI_cjs.SettingsDangerZone,
|
|
3105
3109
|
{
|
|
3106
3110
|
isOpen: zoneOpen,
|
|
3107
3111
|
onToggle: () => setZoneOpen((o) => !o),
|
|
@@ -3121,12 +3125,12 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
|
|
|
3121
3125
|
}
|
|
3122
3126
|
),
|
|
3123
3127
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3124
|
-
|
|
3128
|
+
chunkU37AYUPI_cjs.DeleteAccountDialog,
|
|
3125
3129
|
{
|
|
3126
3130
|
open: dialogOpen,
|
|
3127
3131
|
onClose: flow.onClose,
|
|
3128
3132
|
step: flow.step,
|
|
3129
|
-
blockers:
|
|
3133
|
+
blockers: chunkU37AYUPI_cjs.toDeleteBlockerViews(flow.blockers, renderSubscriptionLink),
|
|
3130
3134
|
onContinue: flow.onContinue,
|
|
3131
3135
|
onBack: flow.onBack,
|
|
3132
3136
|
userEmail,
|
|
@@ -3141,7 +3145,7 @@ function ConnectedDangerZone({ renderSubscriptionLink }) {
|
|
|
3141
3145
|
function ServerConnectionRow({ onRefresh, ...status }) {
|
|
3142
3146
|
const { runtimeConfig } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
|
|
3143
3147
|
const [isRefreshing, setIsRefreshing] = react.useState(false);
|
|
3144
|
-
const view =
|
|
3148
|
+
const view = chunkU37AYUPI_cjs.serverConnectionView(status, runtimeConfig.deploymentDomain || "server");
|
|
3145
3149
|
const refresh = async () => {
|
|
3146
3150
|
setIsRefreshing(true);
|
|
3147
3151
|
try {
|
|
@@ -3150,8 +3154,8 @@ function ServerConnectionRow({ onRefresh, ...status }) {
|
|
|
3150
3154
|
setIsRefreshing(false);
|
|
3151
3155
|
}
|
|
3152
3156
|
};
|
|
3153
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3154
|
-
|
|
3157
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsRow, { label: "Server connection", description: view.description, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3158
|
+
chunkU37AYUPI_cjs.ServerConnectionButton,
|
|
3155
3159
|
{
|
|
3156
3160
|
state: view.state,
|
|
3157
3161
|
label: view.label,
|
|
@@ -3173,7 +3177,7 @@ function ConnectedAccountSettings({
|
|
|
3173
3177
|
renderSubscriptionLink
|
|
3174
3178
|
}) {
|
|
3175
3179
|
const [logoutOpen, setLogoutOpen] = react.useState(false);
|
|
3176
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3180
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsPanel, { className: "max-w-2xl", children: [
|
|
3177
3181
|
/* @__PURE__ */ jsxRuntime.jsx(ConnectedProfileCard, { avatarClassName, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3178
3182
|
ConnectedIdentityVerification,
|
|
3179
3183
|
{
|
|
@@ -3183,10 +3187,10 @@ function ConnectedAccountSettings({
|
|
|
3183
3187
|
) }),
|
|
3184
3188
|
afterProfile,
|
|
3185
3189
|
/* @__PURE__ */ jsxRuntime.jsx(ConnectedSecuritySection, { getUnmetRequirement: getUnmetPasswordRequirement, children: securityRows }),
|
|
3186
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3190
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsSection, { icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Wifi, {}), title: "Session", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsCard, { children: [
|
|
3187
3191
|
connection && /* @__PURE__ */ jsxRuntime.jsx(ServerConnectionRow, { ...connection }),
|
|
3188
3192
|
/* @__PURE__ */ jsxRuntime.jsx(ConnectedSessionsRow, { renderSessionIcon }),
|
|
3189
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3193
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsRow, { label: "Logout", description: "Sign out of your account on this device.", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3190
3194
|
ui.Button,
|
|
3191
3195
|
{
|
|
3192
3196
|
type: "button",
|
|
@@ -3468,10 +3472,10 @@ function ConnectedPrivacySettings({
|
|
|
3468
3472
|
const update = react$1.useUpdateUserSettings();
|
|
3469
3473
|
const hideOnlineStatus = settings?.hide_online_status ?? false;
|
|
3470
3474
|
const dismissedTips = settings?.dismissed_tips ?? [];
|
|
3471
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3472
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3475
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsPanel, { className: "max-w-2xl", children: [
|
|
3476
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsSection, { title: "Privacy and tips", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsCard, { children: [
|
|
3473
3477
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3474
|
-
|
|
3478
|
+
chunkU37AYUPI_cjs.SettingsRow,
|
|
3475
3479
|
{
|
|
3476
3480
|
label: "Show Online Status",
|
|
3477
3481
|
labelFor: "showOnlineStatus",
|
|
@@ -3489,7 +3493,7 @@ function ConnectedPrivacySettings({
|
|
|
3489
3493
|
),
|
|
3490
3494
|
rows,
|
|
3491
3495
|
showTipsReset && /* @__PURE__ */ jsxRuntime.jsx(
|
|
3492
|
-
|
|
3496
|
+
chunkU37AYUPI_cjs.SettingsRow,
|
|
3493
3497
|
{
|
|
3494
3498
|
label: "Hidden tips",
|
|
3495
3499
|
description: "Restore any Smart Tips you\u2019ve hidden with \u201Cdon\u2019t show again\u201D.",
|
|
@@ -3553,13 +3557,13 @@ var COLUMNS = [
|
|
|
3553
3557
|
flex: 1,
|
|
3554
3558
|
minWidth: 120,
|
|
3555
3559
|
cellRenderer: (params) => isStandard(params.data) ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
3556
|
-
|
|
3560
|
+
chunkU37AYUPI_cjs.ModelProviderLabel,
|
|
3557
3561
|
{
|
|
3558
3562
|
logo: /* @__PURE__ */ jsxRuntime.jsx("img", { src: "/favicon.svg", alt: "ARBI", className: "size-3.5 flex-shrink-0 rounded-sm" }),
|
|
3559
3563
|
children: "ARBI CITY"
|
|
3560
3564
|
}
|
|
3561
3565
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
3562
|
-
|
|
3566
|
+
chunkU37AYUPI_cjs.ModelProviderLabel,
|
|
3563
3567
|
{
|
|
3564
3568
|
logo: /* @__PURE__ */ jsxRuntime.jsx(react$1.ProviderIcon, { modelName: params.data?.model_name, provider: params.value, size: 14 }),
|
|
3565
3569
|
children: PROVIDER_NAMES[params.value ?? ""] || params.value || "\u2014"
|
|
@@ -3635,8 +3639,8 @@ function ConnectedPremiumModels() {
|
|
|
3635
3639
|
[save]
|
|
3636
3640
|
);
|
|
3637
3641
|
if (premiumModels.length === 0) return null;
|
|
3638
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3639
|
-
|
|
3642
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsPanel, { className: "max-w-2xl space-y-4", children: /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsSection, { title: "Premium models", children: /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsCard, { className: "space-y-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3643
|
+
chunkU37AYUPI_cjs.PremiumModelsFrame,
|
|
3640
3644
|
{
|
|
3641
3645
|
enabled: premiumModel !== "",
|
|
3642
3646
|
onEnabledChange: (enabled) => {
|
|
@@ -3660,11 +3664,269 @@ function ConnectedPremiumModels() {
|
|
|
3660
3664
|
}
|
|
3661
3665
|
) }) }) });
|
|
3662
3666
|
}
|
|
3667
|
+
var FAMILY_PRESENTATION = {
|
|
3668
|
+
microsoft: {
|
|
3669
|
+
name: "Microsoft",
|
|
3670
|
+
description: "One Microsoft connection covers both Outlook (email) and OneDrive (files) \u2014 import documents from either into a workspace.",
|
|
3671
|
+
descriptionWithSharePoint: "One Microsoft connection covers Outlook (email), OneDrive and SharePoint (files) \u2014 import documents from any of them into a workspace."
|
|
3672
|
+
},
|
|
3673
|
+
gmail: {
|
|
3674
|
+
name: "Google",
|
|
3675
|
+
description: "One Google connection covers both Gmail (email) and Google Drive (files) \u2014 import documents from either into a workspace."
|
|
3676
|
+
}
|
|
3677
|
+
};
|
|
3678
|
+
var EMAIL_AND_DRIVE_SUBTITLE = [
|
|
3679
|
+
"Connect Microsoft or Google once \u2014 a single connection lets you import documents",
|
|
3680
|
+
"from both their email (Outlook / Gmail) and their cloud storage (OneDrive / Google Drive)",
|
|
3681
|
+
"into a workspace."
|
|
3682
|
+
].join(" ");
|
|
3683
|
+
function toConnectionCardView(catalog, userConnector, options) {
|
|
3684
|
+
const isConnected = !!userConnector;
|
|
3685
|
+
const presentation = FAMILY_PRESENTATION[catalog.vendor_key];
|
|
3686
|
+
const description = (options.sharePointVisible ? presentation?.descriptionWithSharePoint : void 0) ?? presentation?.description ?? catalog.description;
|
|
3687
|
+
return {
|
|
3688
|
+
id: catalog.vendor_key,
|
|
3689
|
+
title: presentation?.name ?? catalog.display_name,
|
|
3690
|
+
description: description ?? void 0,
|
|
3691
|
+
iconUrl: catalog.icon_url,
|
|
3692
|
+
iconAlt: catalog.display_name,
|
|
3693
|
+
status: isConnected ? "connected" : catalog.requires_per_user_auth ? "available" : "organisation",
|
|
3694
|
+
justConnected: options.justConnected,
|
|
3695
|
+
identity: userConnector?.vendor_user_identity,
|
|
3696
|
+
warning: isConnected && userConnector?.token_scheme === "env" ? "Reconnect to upgrade security \u2014 your access token isn't yet bound to your session." : void 0,
|
|
3697
|
+
note: !catalog.requires_per_user_auth && !isConnected ? "Enabled for your organisation \u2014 no personal login required" : void 0,
|
|
3698
|
+
// Mailbox connectors show a read-only notice when native mail writes are disabled; sync is
|
|
3699
|
+
// configured per-workspace from the Add-files flow, not on this tab.
|
|
3700
|
+
showReadOnlyNotice: react$1.isMailboxSyncVendor(catalog.vendor_key) && !options.mailWriteEnabled,
|
|
3701
|
+
isDisconnecting: options.isDisconnecting
|
|
3702
|
+
};
|
|
3703
|
+
}
|
|
3704
|
+
function ConnectedAppsSettings({
|
|
3705
|
+
justConnectedVendor = null,
|
|
3706
|
+
onJustConnectedSeen
|
|
3707
|
+
}) {
|
|
3708
|
+
const arbi = react$1.useArbi();
|
|
3709
|
+
const { notify, navigate } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
|
|
3710
|
+
const { data: mailPolicy } = react$1.useMailPolicy();
|
|
3711
|
+
const isVendorVisible = react$1.useConnectorVendorVisibility();
|
|
3712
|
+
react.useEffect(() => {
|
|
3713
|
+
if (!justConnectedVendor || !onJustConnectedSeen) return;
|
|
3714
|
+
const timer = setTimeout(onJustConnectedSeen, 4e3);
|
|
3715
|
+
return () => clearTimeout(timer);
|
|
3716
|
+
}, [justConnectedVendor, onJustConnectedSeen]);
|
|
3717
|
+
react.useEffect(() => {
|
|
3718
|
+
if (!justConnectedVendor) return;
|
|
3719
|
+
void arbi.connectors.bridgeTokens({ vendor: justConnectedVendor });
|
|
3720
|
+
}, [justConnectedVendor, arbi]);
|
|
3721
|
+
const {
|
|
3722
|
+
data: catalog = [],
|
|
3723
|
+
isLoading: catalogLoading,
|
|
3724
|
+
error: catalogError
|
|
3725
|
+
} = react$1.useConnectorCatalog();
|
|
3726
|
+
const { data: myConnectors = [], isLoading: myLoading } = react$1.useMyConnectors();
|
|
3727
|
+
const disconnect = react$1.useDisconnectConnector();
|
|
3728
|
+
const {
|
|
3729
|
+
data: slackConnection,
|
|
3730
|
+
isLoading: slackLoading,
|
|
3731
|
+
isPending: slackStatusPendingQuery,
|
|
3732
|
+
isFetching: slackStatusFetching,
|
|
3733
|
+
isError: slackStatusError,
|
|
3734
|
+
refetch: refetchSlackConnection
|
|
3735
|
+
} = react$1.useSlackConnection();
|
|
3736
|
+
const slackStatusPending = slackStatusPendingQuery || slackStatusFetching || justConnectedVendor === "slack" && !slackConnection?.connected && !slackStatusError;
|
|
3737
|
+
const disconnectSlack = react$1.useDisconnectSlack();
|
|
3738
|
+
const { data: agents = [] } = react$1.useAgents();
|
|
3739
|
+
const [slackAgentId, setSlackAgentId] = react.useState("");
|
|
3740
|
+
const { data: slackAgentWorkspaces = [], isLoading: slackAgentWorkspacesLoading } = react$1.useAgentWorkspaces(slackAgentId, { enabled: Boolean(slackAgentId) });
|
|
3741
|
+
const [slackAuthorizing, setSlackAuthorizing] = react.useState(false);
|
|
3742
|
+
const [slackAgentEditorOpen, setSlackAgentEditorOpen] = react.useState(false);
|
|
3743
|
+
const isLoading = catalogLoading || myLoading;
|
|
3744
|
+
const connectedByVendor = Object.fromEntries(myConnectors.map((uc) => [uc.vendor_key, uc]));
|
|
3745
|
+
const handleConnect = async (vendorKey) => {
|
|
3746
|
+
navigate(await arbi.connectors.authorize(vendorKey));
|
|
3747
|
+
};
|
|
3748
|
+
const handleSlackConnect = async () => {
|
|
3749
|
+
if (!slackAgentId) return;
|
|
3750
|
+
setSlackAuthorizing(true);
|
|
3751
|
+
try {
|
|
3752
|
+
navigate(await arbi.connectors.slack.authorize(slackAgentId));
|
|
3753
|
+
} catch (error) {
|
|
3754
|
+
notify(
|
|
3755
|
+
error instanceof Error ? error.message : "Could not start Slack authorization",
|
|
3756
|
+
"error"
|
|
3757
|
+
);
|
|
3758
|
+
setSlackAuthorizing(false);
|
|
3759
|
+
}
|
|
3760
|
+
};
|
|
3761
|
+
const handleDisconnect = (vendorKey) => {
|
|
3762
|
+
disconnect.mutate({ vendorKey });
|
|
3763
|
+
if (vendorKey === "microsoft") {
|
|
3764
|
+
for (const spVendor of react$1.SHAREPOINT_VENDORS) {
|
|
3765
|
+
if (connectedByVendor[spVendor]) {
|
|
3766
|
+
disconnect.mutate({ vendorKey: spVendor });
|
|
3767
|
+
}
|
|
3768
|
+
}
|
|
3769
|
+
}
|
|
3770
|
+
};
|
|
3771
|
+
if (isLoading) {
|
|
3772
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.ConnectionsLoading, { message: "Loading connected apps\u2026" });
|
|
3773
|
+
}
|
|
3774
|
+
if (catalogError) {
|
|
3775
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.ConnectionsError, { message: "Failed to load connector catalog. Please refresh and try again." });
|
|
3776
|
+
}
|
|
3777
|
+
const visibleCatalog = catalog.filter((c) => isVendorVisible(c.vendor_key));
|
|
3778
|
+
const sharePointVisible = isVendorVisible("microsoft_sharepoint");
|
|
3779
|
+
const emailCatalog = visibleCatalog.filter((c) => react$1.isMailboxSyncVendor(c.vendor_key));
|
|
3780
|
+
const mcpCatalog = visibleCatalog.filter(
|
|
3781
|
+
(c) => !react$1.isMailboxSyncVendor(c.vendor_key) && !react$1.isSharePointVendor(c.vendor_key)
|
|
3782
|
+
);
|
|
3783
|
+
const renderCard = (entry) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
3784
|
+
chunkU37AYUPI_cjs.ConnectionCard,
|
|
3785
|
+
{
|
|
3786
|
+
connection: toConnectionCardView(entry, connectedByVendor[entry.vendor_key], {
|
|
3787
|
+
isDisconnecting: disconnect.isPending && disconnect.variables?.vendorKey === entry.vendor_key,
|
|
3788
|
+
sharePointVisible,
|
|
3789
|
+
mailWriteEnabled: mailPolicy?.enabled_providers.includes(entry.vendor_key) ?? false,
|
|
3790
|
+
// A `?connected=microsoft_sharepoint` return has no card of its own — alias
|
|
3791
|
+
// it to the Microsoft family card so its "Just connected" badge still lights.
|
|
3792
|
+
justConnected: justConnectedVendor === entry.vendor_key || entry.vendor_key === "microsoft" && react$1.isSharePointVendor(justConnectedVendor ?? "")
|
|
3793
|
+
}),
|
|
3794
|
+
onConnect: handleConnect,
|
|
3795
|
+
onDisconnect: handleDisconnect
|
|
3796
|
+
},
|
|
3797
|
+
entry.vendor_key
|
|
3798
|
+
);
|
|
3799
|
+
const renderGroup = (title, subtitle, icon2, entries) => {
|
|
3800
|
+
if (entries.length === 0) return null;
|
|
3801
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsSection, { icon: icon2, title, children: /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsCard, { className: "space-y-3", children: [
|
|
3802
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: subtitle }),
|
|
3803
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: entries.map(renderCard) })
|
|
3804
|
+
] }) });
|
|
3805
|
+
};
|
|
3806
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SettingsPanel, { className: "max-w-2xl", children: [
|
|
3807
|
+
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "rounded-xl border border-border bg-card px-5 py-4", children: [
|
|
3808
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-4", children: [
|
|
3809
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border border-border bg-background text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: "h-5 w-5" }) }),
|
|
3810
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
3811
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-heading text-sm font-semibold text-foreground", children: "Slack" }),
|
|
3812
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-sm text-muted-foreground", children: "Connect Slack to an existing ARBI agent. The agent uses its configured default workspace." }),
|
|
3813
|
+
slackConnection?.connected && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-1 text-xs text-muted-foreground", children: [
|
|
3814
|
+
"Connected to ",
|
|
3815
|
+
slackConnection.agent_name
|
|
3816
|
+
] })
|
|
3817
|
+
] }),
|
|
3818
|
+
slackConnection?.connected ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3819
|
+
ui.Button,
|
|
3820
|
+
{
|
|
3821
|
+
variant: "outline",
|
|
3822
|
+
size: "sm",
|
|
3823
|
+
onClick: () => disconnectSlack.mutate(),
|
|
3824
|
+
disabled: disconnectSlack.isPending,
|
|
3825
|
+
className: "text-destructive hover:bg-destructive/10 hover:text-destructive",
|
|
3826
|
+
children: [
|
|
3827
|
+
disconnectSlack.isPending ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }) : null,
|
|
3828
|
+
"Disconnect"
|
|
3829
|
+
]
|
|
3830
|
+
}
|
|
3831
|
+
) : slackStatusPending ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { variant: "outline", className: "gap-1.5 text-muted-foreground", children: [
|
|
3832
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-3 w-3 animate-spin" }),
|
|
3833
|
+
"Pending"
|
|
3834
|
+
] }) : slackStatusError ? /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { variant: "outline", size: "sm", onClick: () => void refetchSlackConnection(), children: "Retry status check" }) : slackConnection?.configured ? /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { variant: "outline", className: "text-muted-foreground", children: "Not connected" }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { variant: "outline", className: "text-muted-foreground", children: "Unavailable" })
|
|
3835
|
+
] }),
|
|
3836
|
+
!slackConnection?.connected && !slackStatusPending && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3837
|
+
"div",
|
|
3838
|
+
{
|
|
3839
|
+
className: "mt-4 flex flex-wrap items-end gap-3 border-t border-border/60 pt-4",
|
|
3840
|
+
"data-testid": "slack-agent-setup",
|
|
3841
|
+
children: [
|
|
3842
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "min-w-56 flex-1 space-y-1.5", children: [
|
|
3843
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: "ARBI agent" }),
|
|
3844
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3845
|
+
"select",
|
|
3846
|
+
{
|
|
3847
|
+
className: "h-10 w-full rounded-md border border-input bg-background px-3 text-sm pointer-coarse:h-11",
|
|
3848
|
+
value: slackAgentId,
|
|
3849
|
+
onChange: (event) => setSlackAgentId(event.target.value),
|
|
3850
|
+
children: [
|
|
3851
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Choose an agent" }),
|
|
3852
|
+
agents.map((agent) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: agent.external_id, children: agent.given_name || agent.email }, agent.external_id))
|
|
3853
|
+
]
|
|
3854
|
+
}
|
|
3855
|
+
)
|
|
3856
|
+
] }),
|
|
3857
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3858
|
+
ui.Button,
|
|
3859
|
+
{
|
|
3860
|
+
variant: "outline",
|
|
3861
|
+
size: "sm",
|
|
3862
|
+
onClick: () => setSlackAgentEditorOpen(true),
|
|
3863
|
+
disabled: slackLoading || slackAuthorizing,
|
|
3864
|
+
children: "Create Slack agent"
|
|
3865
|
+
}
|
|
3866
|
+
),
|
|
3867
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
3868
|
+
ui.Button,
|
|
3869
|
+
{
|
|
3870
|
+
size: "sm",
|
|
3871
|
+
onClick: () => void handleSlackConnect(),
|
|
3872
|
+
disabled: !slackConnection?.configured || !slackAgentId || slackLoading || slackAuthorizing,
|
|
3873
|
+
children: [
|
|
3874
|
+
slackAuthorizing ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "mr-1.5 h-3.5 w-3.5 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { className: "mr-1.5 h-3.5 w-3.5" }),
|
|
3875
|
+
slackAuthorizing ? "Starting Slack authorization\u2026" : "Connect to Slack"
|
|
3876
|
+
]
|
|
3877
|
+
}
|
|
3878
|
+
),
|
|
3879
|
+
slackAgentId && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3880
|
+
"div",
|
|
3881
|
+
{
|
|
3882
|
+
className: "w-full rounded-md bg-muted/40 px-3 py-2 text-xs",
|
|
3883
|
+
"data-testid": "slack-agent-workspaces",
|
|
3884
|
+
children: [
|
|
3885
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium text-foreground", children: "Agent workspace access" }),
|
|
3886
|
+
slackAgentWorkspacesLoading ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-muted-foreground", children: "Loading access\u2026" }) : slackAgentWorkspaces.length ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-1 space-y-1", children: slackAgentWorkspaces.map((workspace) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-wrap gap-x-2", children: [
|
|
3887
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: workspace.name }),
|
|
3888
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: workspace.role }),
|
|
3889
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: workspace.permanent ? "Standing access" : "Temporary access" }),
|
|
3890
|
+
workspace.is_default && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: "Slack default" })
|
|
3891
|
+
] }, workspace.workspace_ext_id)) }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-muted-foreground", children: "No workspace access. Share a workspace with this agent in that workspace\u2019s Members settings." })
|
|
3892
|
+
]
|
|
3893
|
+
}
|
|
3894
|
+
),
|
|
3895
|
+
slackStatusError ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "w-full text-xs text-muted-foreground", children: "ARBI could not check Slack availability. Retry the status check above before connecting." }) : !slackConnection?.configured ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "w-full text-xs text-muted-foreground", children: "Slack is unavailable because this ARBI deployment has not configured its Slack app credentials. You can still create an agent and set its workspace access; an administrator must configure Slack before connecting." }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "w-full text-xs text-muted-foreground", children: "Slack DMs wake this agent and receive replies there. It uses the marked default workspace; standing access is required." })
|
|
3896
|
+
]
|
|
3897
|
+
}
|
|
3898
|
+
),
|
|
3899
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3900
|
+
ConnectedAgentCreator,
|
|
3901
|
+
{
|
|
3902
|
+
open: slackAgentEditorOpen,
|
|
3903
|
+
onOpenChange: setSlackAgentEditorOpen,
|
|
3904
|
+
initialName: "SlackAssistant",
|
|
3905
|
+
onSaved: (agentExtId) => {
|
|
3906
|
+
setSlackAgentId(agentExtId);
|
|
3907
|
+
setSlackAgentEditorOpen(false);
|
|
3908
|
+
}
|
|
3909
|
+
}
|
|
3910
|
+
)
|
|
3911
|
+
] }),
|
|
3912
|
+
catalog.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SettingsCard, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.ConnectionsEmpty, { message: "No connectors available yet." }) }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3913
|
+
renderGroup("Email & Drive", EMAIL_AND_DRIVE_SUBTITLE, /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, {}), emailCatalog),
|
|
3914
|
+
renderGroup(
|
|
3915
|
+
"Apps & Integrations (MCP)",
|
|
3916
|
+
"Connect your legal tools so the ARBI agent can search them live during a conversation.",
|
|
3917
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlugZap, {}),
|
|
3918
|
+
mcpCatalog
|
|
3919
|
+
)
|
|
3920
|
+
] }),
|
|
3921
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-1 text-xs text-muted-foreground", children: "ARBI requests only the minimum permissions needed. Your credentials are encrypted and never shared. You can disconnect at any time." })
|
|
3922
|
+
] });
|
|
3923
|
+
}
|
|
3663
3924
|
var SETTINGS_SECTION_IDS = {
|
|
3664
3925
|
account: "account",
|
|
3665
3926
|
mail: "mail",
|
|
3666
3927
|
privacy: "privacy",
|
|
3667
|
-
chat: "chat"
|
|
3928
|
+
chat: "chat",
|
|
3929
|
+
connectedApps: "connected-apps"
|
|
3668
3930
|
};
|
|
3669
3931
|
function accountSettingsSection(props) {
|
|
3670
3932
|
return {
|
|
@@ -3698,6 +3960,14 @@ function chatSettingsSection() {
|
|
|
3698
3960
|
render: () => /* @__PURE__ */ jsxRuntime.jsx(ConnectedPremiumModels, {})
|
|
3699
3961
|
};
|
|
3700
3962
|
}
|
|
3963
|
+
function connectedAppsSettingsSection(props) {
|
|
3964
|
+
return {
|
|
3965
|
+
id: SETTINGS_SECTION_IDS.connectedApps,
|
|
3966
|
+
label: "Connected Apps",
|
|
3967
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PlugZap, { className: "w-6 h-6" }),
|
|
3968
|
+
render: () => /* @__PURE__ */ jsxRuntime.jsx(ConnectedAppsSettings, { ...props })
|
|
3969
|
+
};
|
|
3970
|
+
}
|
|
3701
3971
|
var DEFAULT_SETTINGS_SECTIONS = [
|
|
3702
3972
|
accountSettingsSection(),
|
|
3703
3973
|
privacySettingsSection(),
|
|
@@ -3716,7 +3986,7 @@ function ConnectedSettingsPage({
|
|
|
3716
3986
|
}, [requested]);
|
|
3717
3987
|
const controlled = section !== void 0;
|
|
3718
3988
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3719
|
-
|
|
3989
|
+
chunkU37AYUPI_cjs.SettingsPage,
|
|
3720
3990
|
{
|
|
3721
3991
|
...page,
|
|
3722
3992
|
sections,
|
|
@@ -3929,13 +4199,13 @@ function ConnectedWorkspaceSettings({
|
|
|
3929
4199
|
const [membersExpanded, setMembersExpanded] = react.useState(false);
|
|
3930
4200
|
const [shareOpen, setShareOpen] = react.useState(false);
|
|
3931
4201
|
if (!workspace) {
|
|
3932
|
-
return /* @__PURE__ */ jsxRuntime.jsx(chunkRXK3XP62_cjs.PageLoading, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4202
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkRXK3XP62_cjs.PageLoading, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkLTU35TQN_cjs.LoadingIndicator, { message: "Loading workspace..." }) });
|
|
3933
4203
|
}
|
|
3934
4204
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
3935
4205
|
/* @__PURE__ */ jsxRuntime.jsxs(chunkRXK3XP62_cjs.WorkspacePageFrame, { testId, children: [
|
|
3936
4206
|
/* @__PURE__ */ jsxRuntime.jsxs(chunkRXK3XP62_cjs.WorkspaceIdentityPanel, { children: [
|
|
3937
4207
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3938
|
-
|
|
4208
|
+
chunkLTU35TQN_cjs.EntityIdentityBar,
|
|
3939
4209
|
{
|
|
3940
4210
|
testId: "workspace-identity-bar",
|
|
3941
4211
|
canEdit: isOwner,
|
|
@@ -3952,7 +4222,7 @@ function ConnectedWorkspaceSettings({
|
|
|
3952
4222
|
label: "Name",
|
|
3953
4223
|
value: workspace.name,
|
|
3954
4224
|
placeholder: "Untitled",
|
|
3955
|
-
maxLength:
|
|
4225
|
+
maxLength: chunkLTU35TQN_cjs.IDENTITY_NAME_MAX_LENGTH,
|
|
3956
4226
|
valueClassName: "truncate text-base font-semibold",
|
|
3957
4227
|
testId: "workspace-home-title",
|
|
3958
4228
|
hideLabel: true,
|
|
@@ -4078,6 +4348,633 @@ function ConnectedWorkspaceSettings({
|
|
|
4078
4348
|
})
|
|
4079
4349
|
] });
|
|
4080
4350
|
}
|
|
4351
|
+
|
|
4352
|
+
// src/connection/connectors/sync-labels.ts
|
|
4353
|
+
var BACKFILL_OPTIONS = [
|
|
4354
|
+
{ value: "1", label: "Last 1 day" },
|
|
4355
|
+
{ value: "7", label: "Last 7 days" },
|
|
4356
|
+
{ value: "30", label: "Last 30 days" },
|
|
4357
|
+
{ value: "90", label: "Last 90 days" },
|
|
4358
|
+
{ value: "365", label: "Last year" }
|
|
4359
|
+
];
|
|
4360
|
+
function formatLastSync(iso) {
|
|
4361
|
+
const date = new Date(iso);
|
|
4362
|
+
if (Number.isNaN(date.getTime())) return iso;
|
|
4363
|
+
const diffMs = Date.now() - date.getTime();
|
|
4364
|
+
const diffMin = Math.round(diffMs / 6e4);
|
|
4365
|
+
if (diffMin < 1) return "just now";
|
|
4366
|
+
if (diffMin < 60) return `${diffMin}m ago`;
|
|
4367
|
+
const diffHr = Math.round(diffMin / 60);
|
|
4368
|
+
if (diffHr < 24) return `${diffHr}h ago`;
|
|
4369
|
+
const diffDay = Math.round(diffHr / 24);
|
|
4370
|
+
if (diffDay < 30) return `${diffDay}d ago`;
|
|
4371
|
+
return date.toLocaleDateString();
|
|
4372
|
+
}
|
|
4373
|
+
function windowLabel(days) {
|
|
4374
|
+
return BACKFILL_OPTIONS.find((o) => o.value === String(days))?.label ?? `Last ${days} days`;
|
|
4375
|
+
}
|
|
4376
|
+
function ConnectedMailboxSyncDialog({
|
|
4377
|
+
catalog,
|
|
4378
|
+
userConnector,
|
|
4379
|
+
open,
|
|
4380
|
+
onOpenChange,
|
|
4381
|
+
lockedWorkspaceExtId,
|
|
4382
|
+
onEnabled
|
|
4383
|
+
}) {
|
|
4384
|
+
const enableSync = react$1.useEnableMailboxSync();
|
|
4385
|
+
const disconnect = react$1.useDisconnectConnector();
|
|
4386
|
+
const arbi = react$1.useArbi();
|
|
4387
|
+
const { notify, navigate } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
|
|
4388
|
+
const reconnect = async () => {
|
|
4389
|
+
try {
|
|
4390
|
+
await disconnect.mutateAsync({ vendorKey: catalog.vendor_key });
|
|
4391
|
+
} catch {
|
|
4392
|
+
}
|
|
4393
|
+
try {
|
|
4394
|
+
navigate(await arbi.connectors.authorize(catalog.vendor_key, react$1.connectorReturnTo()));
|
|
4395
|
+
} catch {
|
|
4396
|
+
notify("Could not start reconnection. Please try again.", "error");
|
|
4397
|
+
}
|
|
4398
|
+
};
|
|
4399
|
+
const { data: workspaces = [] } = react$1.useWorkspaces({ enabled: open && !lockedWorkspaceExtId });
|
|
4400
|
+
const memberWorkspaces = workspaces.filter((w) => w.is_member);
|
|
4401
|
+
const [tokensBridged, setTokensBridged] = react.useState(false);
|
|
4402
|
+
react.useEffect(() => {
|
|
4403
|
+
if (!open) {
|
|
4404
|
+
setTokensBridged(false);
|
|
4405
|
+
return;
|
|
4406
|
+
}
|
|
4407
|
+
if (!userConnector?.is_connected) {
|
|
4408
|
+
setTokensBridged(true);
|
|
4409
|
+
return;
|
|
4410
|
+
}
|
|
4411
|
+
let cancelled = false;
|
|
4412
|
+
void arbi.connectors.bridgeTokens({ vendor: catalog.vendor_key }).finally(() => {
|
|
4413
|
+
if (!cancelled) setTokensBridged(true);
|
|
4414
|
+
});
|
|
4415
|
+
return () => {
|
|
4416
|
+
cancelled = true;
|
|
4417
|
+
};
|
|
4418
|
+
}, [open, arbi, userConnector?.is_connected, catalog.vendor_key]);
|
|
4419
|
+
const [workspaceExtId, setWorkspaceExtId] = react.useState("");
|
|
4420
|
+
const [backfill, setBackfill] = react.useState("1");
|
|
4421
|
+
const [backfillSince, setBackfillSince] = react.useState("");
|
|
4422
|
+
const [selectedFolders, setSelectedFolders] = react.useState([]);
|
|
4423
|
+
const [skipDuplicates, setSkipDuplicates] = react.useState(true);
|
|
4424
|
+
const [autoRename, setAutoRename] = react.useState(false);
|
|
4425
|
+
const [shared, setShared] = react.useState(false);
|
|
4426
|
+
const [autoSync, setAutoSync] = react.useState(false);
|
|
4427
|
+
react.useEffect(() => {
|
|
4428
|
+
if (!open) return;
|
|
4429
|
+
const target = lockedWorkspaceExtId ?? userConnector?.sync_workspace_ext_id ?? "";
|
|
4430
|
+
const workspaceSync = lockedWorkspaceExtId ? userConnector?.syncs?.find((s) => s.workspace_ext_id === lockedWorkspaceExtId) : void 0;
|
|
4431
|
+
setWorkspaceExtId(target);
|
|
4432
|
+
const since = workspaceSync?.backfill_since ?? userConnector?.backfill_since ?? null;
|
|
4433
|
+
if (since) {
|
|
4434
|
+
setBackfill("custom");
|
|
4435
|
+
setBackfillSince(since.slice(0, 10));
|
|
4436
|
+
} else {
|
|
4437
|
+
setBackfill(String(workspaceSync?.backfill_window ?? userConnector?.backfill_window ?? 1));
|
|
4438
|
+
setBackfillSince("");
|
|
4439
|
+
}
|
|
4440
|
+
setSelectedFolders(workspaceSync?.folders ?? userConnector?.sync_folders ?? []);
|
|
4441
|
+
setSkipDuplicates(workspaceSync?.skip_duplicates ?? userConnector?.skip_duplicates ?? true);
|
|
4442
|
+
setAutoRename(workspaceSync?.auto_rename ?? userConnector?.auto_rename ?? false);
|
|
4443
|
+
setShared(workspaceSync?.shared ?? userConnector?.shared ?? false);
|
|
4444
|
+
setAutoSync(workspaceSync?.auto_sync ?? userConnector?.auto_sync ?? false);
|
|
4445
|
+
}, [open, lockedWorkspaceExtId, userConnector]);
|
|
4446
|
+
const {
|
|
4447
|
+
data: folders = [],
|
|
4448
|
+
isLoading: foldersQueryLoading,
|
|
4449
|
+
error: foldersError
|
|
4450
|
+
} = react$1.useMailboxFolders(catalog.vendor_key, open && tokensBridged);
|
|
4451
|
+
const foldersLoading = !tokensBridged || foldersQueryLoading;
|
|
4452
|
+
const folderTree = chunkGRGS5M6O_cjs.buildMailFolderTree(folders);
|
|
4453
|
+
const [expandAllNonce, setExpandAllNonce] = react.useState(0);
|
|
4454
|
+
const [collapseAllNonce, setCollapseAllNonce] = react.useState(0);
|
|
4455
|
+
const selectAllIds = folderTree.flatMap(
|
|
4456
|
+
(n) => n.folder ? [n.folder.id] : n.children.flatMap((c) => c.folder ? [c.folder.id] : [])
|
|
4457
|
+
);
|
|
4458
|
+
const allSelected = selectAllIds.length > 0 && selectAllIds.every((id) => selectedFolders.includes(id));
|
|
4459
|
+
const toggleAllFolders = () => setSelectedFolders(allSelected ? [] : selectAllIds);
|
|
4460
|
+
const isCustomBackfill = backfill === "custom";
|
|
4461
|
+
const customDateMissing = isCustomBackfill && !backfillSince;
|
|
4462
|
+
const handleEnableSubmit = () => {
|
|
4463
|
+
if (!workspaceExtId || selectedFolders.length === 0 || customDateMissing) return;
|
|
4464
|
+
enableSync.mutate(
|
|
4465
|
+
{
|
|
4466
|
+
vendorKey: catalog.vendor_key,
|
|
4467
|
+
workspaceExtId,
|
|
4468
|
+
// A fixed date overrides the rolling window server-side; keep a sane
|
|
4469
|
+
// window value for backward compatibility.
|
|
4470
|
+
backfillWindow: isCustomBackfill ? 90 : Number(backfill),
|
|
4471
|
+
backfillSince: isCustomBackfill ? (/* @__PURE__ */ new Date(`${backfillSince}T00:00:00Z`)).toISOString() : null,
|
|
4472
|
+
folders: selectedFolders,
|
|
4473
|
+
skipDuplicates,
|
|
4474
|
+
autoRename,
|
|
4475
|
+
shared,
|
|
4476
|
+
autoSync
|
|
4477
|
+
},
|
|
4478
|
+
{
|
|
4479
|
+
onSuccess: () => {
|
|
4480
|
+
notify("Email settings saved", "success");
|
|
4481
|
+
onOpenChange(false);
|
|
4482
|
+
onEnabled?.(workspaceExtId);
|
|
4483
|
+
},
|
|
4484
|
+
onError: (err) => {
|
|
4485
|
+
let msg = "Could not enable email sync. Please try again.";
|
|
4486
|
+
const status = react$1.connectorErrorStatus(err);
|
|
4487
|
+
if (status !== void 0) {
|
|
4488
|
+
if (status === 403) {
|
|
4489
|
+
msg = "You are not a member of the selected workspace.";
|
|
4490
|
+
} else if (status === 404) {
|
|
4491
|
+
msg = "This connector is not available for email sync.";
|
|
4492
|
+
}
|
|
4493
|
+
}
|
|
4494
|
+
notify(msg, "error");
|
|
4495
|
+
}
|
|
4496
|
+
}
|
|
4497
|
+
);
|
|
4498
|
+
};
|
|
4499
|
+
const mailboxName = catalog.vendor_key === "gmail" ? "Gmail" : catalog.vendor_key === "microsoft" ? "Outlook" : catalog.display_name;
|
|
4500
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4501
|
+
chunkULWRNGGE_cjs.ModalScaffold,
|
|
4502
|
+
{
|
|
4503
|
+
open,
|
|
4504
|
+
onOpenChange,
|
|
4505
|
+
title: `${mailboxName} Import Settings`,
|
|
4506
|
+
description: `Import emails from ${catalog.display_name} into a workspace so the ARBI agent can search them. This is read-only \u2014 ARBI imports a copy and never modifies or deletes anything in your mailbox.`,
|
|
4507
|
+
showDescription: true,
|
|
4508
|
+
className: "w-[92vw] sm:max-w-lg",
|
|
4509
|
+
children: [
|
|
4510
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncDialogBody, { children: [
|
|
4511
|
+
!lockedWorkspaceExtId && /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncField, { label: "Target workspace", htmlFor: "sync-workspace", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4512
|
+
chunkU37AYUPI_cjs.SyncSelect,
|
|
4513
|
+
{
|
|
4514
|
+
id: "sync-workspace",
|
|
4515
|
+
value: workspaceExtId,
|
|
4516
|
+
onValueChange: setWorkspaceExtId,
|
|
4517
|
+
placeholder: "Select a workspace",
|
|
4518
|
+
options: memberWorkspaces.map((w) => ({ value: w.external_id, label: w.name }))
|
|
4519
|
+
}
|
|
4520
|
+
) }),
|
|
4521
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncField, { label: "Backfill window", htmlFor: "sync-backfill", children: [
|
|
4522
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4523
|
+
chunkU37AYUPI_cjs.SyncSelect,
|
|
4524
|
+
{
|
|
4525
|
+
id: "sync-backfill",
|
|
4526
|
+
value: backfill,
|
|
4527
|
+
onValueChange: setBackfill,
|
|
4528
|
+
options: [...BACKFILL_OPTIONS, { value: "custom", label: "Custom date\u2026" }]
|
|
4529
|
+
}
|
|
4530
|
+
),
|
|
4531
|
+
isCustomBackfill && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
4532
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4533
|
+
ui.Input,
|
|
4534
|
+
{
|
|
4535
|
+
type: "date",
|
|
4536
|
+
value: backfillSince,
|
|
4537
|
+
max: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
|
|
4538
|
+
onChange: (e) => setBackfillSince(e.target.value),
|
|
4539
|
+
"data-testid": "backfill-since-date",
|
|
4540
|
+
"aria-label": "Import emails since date"
|
|
4541
|
+
}
|
|
4542
|
+
),
|
|
4543
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncSmallNote, { children: "Emails are always imported from this date onward \u2014 the start point never moves." })
|
|
4544
|
+
] })
|
|
4545
|
+
] }),
|
|
4546
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4547
|
+
chunkU37AYUPI_cjs.SyncField,
|
|
4548
|
+
{
|
|
4549
|
+
label: `Folders to import${selectedFolders.length > 0 ? ` (${selectedFolders.length})` : ""}`,
|
|
4550
|
+
hint: "Select at least one folder to import.",
|
|
4551
|
+
actions: folders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncLinkRow, { children: [
|
|
4552
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4553
|
+
chunkU37AYUPI_cjs.SyncLinkButton,
|
|
4554
|
+
{
|
|
4555
|
+
onClick: () => setExpandAllNonce((n) => n + 1),
|
|
4556
|
+
testId: "mail-folders-expand-all",
|
|
4557
|
+
children: "Expand all"
|
|
4558
|
+
}
|
|
4559
|
+
),
|
|
4560
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4561
|
+
chunkU37AYUPI_cjs.SyncLinkButton,
|
|
4562
|
+
{
|
|
4563
|
+
onClick: () => setCollapseAllNonce((n) => n + 1),
|
|
4564
|
+
testId: "mail-folders-collapse-all",
|
|
4565
|
+
children: "Collapse all"
|
|
4566
|
+
}
|
|
4567
|
+
),
|
|
4568
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncLinkButton, { onClick: toggleAllFolders, children: allSelected ? "Clear all" : "Select all" })
|
|
4569
|
+
] }),
|
|
4570
|
+
children: foldersLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncLoading, { children: "Loading folders\u2026" }) : foldersError ? (
|
|
4571
|
+
// A failed fetch is not an empty mailbox: it hides auth/scope errors (e.g. a Gmail
|
|
4572
|
+
// account needing reconnect).
|
|
4573
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4574
|
+
chunkU37AYUPI_cjs.SyncReconnectNotice,
|
|
4575
|
+
{
|
|
4576
|
+
message: `Couldn\u2019t load folders from ${catalog.display_name}. Reconnect the account and try again.`,
|
|
4577
|
+
onReconnect: () => void reconnect(),
|
|
4578
|
+
isPending: disconnect.isPending,
|
|
4579
|
+
testId: "folders-reconnect"
|
|
4580
|
+
}
|
|
4581
|
+
)
|
|
4582
|
+
) : folders.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncNote, { children: "No folders found." }) : /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncTreeFrame, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4583
|
+
chunkGRGS5M6O_cjs.MailFolderTree,
|
|
4584
|
+
{
|
|
4585
|
+
nodes: folderTree,
|
|
4586
|
+
selected: selectedFolders,
|
|
4587
|
+
onChange: setSelectedFolders,
|
|
4588
|
+
expandAllNonce,
|
|
4589
|
+
collapseAllNonce
|
|
4590
|
+
}
|
|
4591
|
+
) })
|
|
4592
|
+
}
|
|
4593
|
+
),
|
|
4594
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncOptions, { children: [
|
|
4595
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4596
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4597
|
+
{
|
|
4598
|
+
checked: skipDuplicates,
|
|
4599
|
+
onCheckedChange: setSkipDuplicates,
|
|
4600
|
+
title: "Skip duplicates",
|
|
4601
|
+
description: "Skip files identical to ones already in the workspace.",
|
|
4602
|
+
testId: "mailbox-sync-skip-duplicates"
|
|
4603
|
+
}
|
|
4604
|
+
),
|
|
4605
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4606
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4607
|
+
{
|
|
4608
|
+
checked: autoRename,
|
|
4609
|
+
onCheckedChange: setAutoRename,
|
|
4610
|
+
title: "Auto-rename",
|
|
4611
|
+
description: "Generate a descriptive title with AI instead of using the sender and subject.",
|
|
4612
|
+
testId: "mailbox-sync-auto-rename"
|
|
4613
|
+
}
|
|
4614
|
+
),
|
|
4615
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4616
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4617
|
+
{
|
|
4618
|
+
checked: shared,
|
|
4619
|
+
onCheckedChange: setShared,
|
|
4620
|
+
title: "Share with the workspace",
|
|
4621
|
+
description: shared ? "Imported documents are visible to everyone in the workspace." : "Imported documents stay private to you.",
|
|
4622
|
+
testId: "mailbox-sync-shared"
|
|
4623
|
+
}
|
|
4624
|
+
),
|
|
4625
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4626
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4627
|
+
{
|
|
4628
|
+
checked: autoSync,
|
|
4629
|
+
onCheckedChange: setAutoSync,
|
|
4630
|
+
title: "Sync automatically",
|
|
4631
|
+
description: "Check for new email when you sign in, instead of only when you click Sync now. Requires you to be signed in \u2014 nothing syncs while you are away.",
|
|
4632
|
+
testId: "mailbox-sync-auto-sync"
|
|
4633
|
+
}
|
|
4634
|
+
)
|
|
4635
|
+
] })
|
|
4636
|
+
] }),
|
|
4637
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4638
|
+
chunkU37AYUPI_cjs.SyncDialogFooter,
|
|
4639
|
+
{
|
|
4640
|
+
onCancel: () => onOpenChange(false),
|
|
4641
|
+
onSave: handleEnableSubmit,
|
|
4642
|
+
saveDisabled: !workspaceExtId || selectedFolders.length === 0 || customDateMissing,
|
|
4643
|
+
isSaving: enableSync.isPending
|
|
4644
|
+
}
|
|
4645
|
+
)
|
|
4646
|
+
]
|
|
4647
|
+
}
|
|
4648
|
+
);
|
|
4649
|
+
}
|
|
4650
|
+
var DRIVE_PRODUCT_NAMES = {
|
|
4651
|
+
gmail: "Google Drive",
|
|
4652
|
+
microsoft_sharepoint: "SharePoint",
|
|
4653
|
+
box: "Box",
|
|
4654
|
+
dropbox: "Dropbox",
|
|
4655
|
+
onenote: "OneNote",
|
|
4656
|
+
clio: "Clio"
|
|
4657
|
+
};
|
|
4658
|
+
function DriveFolderNode({
|
|
4659
|
+
vendorKey,
|
|
4660
|
+
folder,
|
|
4661
|
+
depth,
|
|
4662
|
+
selected,
|
|
4663
|
+
onToggle,
|
|
4664
|
+
enabled,
|
|
4665
|
+
ancestorSelected,
|
|
4666
|
+
expandAllNonce,
|
|
4667
|
+
collapseAllNonce
|
|
4668
|
+
}) {
|
|
4669
|
+
const isSelected = ancestorSelected || selected.includes(folder.id);
|
|
4670
|
+
const [expanded, setExpanded] = react.useState(() => selected.includes(folder.id) || expandAllNonce > 0);
|
|
4671
|
+
const appliedNonce = react.useRef(expandAllNonce);
|
|
4672
|
+
react.useEffect(() => {
|
|
4673
|
+
if (expandAllNonce > appliedNonce.current) {
|
|
4674
|
+
appliedNonce.current = expandAllNonce;
|
|
4675
|
+
setExpanded(true);
|
|
4676
|
+
}
|
|
4677
|
+
}, [expandAllNonce]);
|
|
4678
|
+
const appliedCollapseNonce = react.useRef(collapseAllNonce);
|
|
4679
|
+
react.useEffect(() => {
|
|
4680
|
+
if (collapseAllNonce > appliedCollapseNonce.current) {
|
|
4681
|
+
appliedCollapseNonce.current = collapseAllNonce;
|
|
4682
|
+
setExpanded(false);
|
|
4683
|
+
}
|
|
4684
|
+
}, [collapseAllNonce]);
|
|
4685
|
+
const { data: children = [], isLoading } = react$1.useDriveFolderChildren(
|
|
4686
|
+
vendorKey,
|
|
4687
|
+
folder.id,
|
|
4688
|
+
enabled && expanded
|
|
4689
|
+
);
|
|
4690
|
+
const isSelectable = folder.selectable !== false;
|
|
4691
|
+
const { data: docCount, isLoading: countLoading } = react$1.useDriveFolderDocCount(
|
|
4692
|
+
vendorKey,
|
|
4693
|
+
folder.id,
|
|
4694
|
+
enabled && isSelectable
|
|
4695
|
+
// ← disabled for site: nodes
|
|
4696
|
+
);
|
|
4697
|
+
const mightHaveChildren = docCount == null || docCount > 0;
|
|
4698
|
+
const orderedChildren = [...children].sort((a, b) => a.name.localeCompare(b.name));
|
|
4699
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4700
|
+
chunkU37AYUPI_cjs.SyncFolderRow,
|
|
4701
|
+
{
|
|
4702
|
+
id: folder.id,
|
|
4703
|
+
name: folder.name,
|
|
4704
|
+
depth,
|
|
4705
|
+
hasChildren: mightHaveChildren,
|
|
4706
|
+
isExpanded: expanded,
|
|
4707
|
+
onToggleExpanded: () => setExpanded((e) => !e),
|
|
4708
|
+
isSelectable,
|
|
4709
|
+
checked: isSelected,
|
|
4710
|
+
disabled: ancestorSelected,
|
|
4711
|
+
onCheckedChange: () => onToggle(folder.id),
|
|
4712
|
+
count: typeof docCount === "number" ? docCount : void 0,
|
|
4713
|
+
isCountLoading: isSelectable && countLoading,
|
|
4714
|
+
children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncFolderStatus, { depth, kind: "loading" }) : orderedChildren.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncFolderStatus, { depth, kind: "empty" }) : orderedChildren.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
4715
|
+
DriveFolderNode,
|
|
4716
|
+
{
|
|
4717
|
+
vendorKey,
|
|
4718
|
+
folder: child,
|
|
4719
|
+
depth: depth + 1,
|
|
4720
|
+
selected,
|
|
4721
|
+
onToggle,
|
|
4722
|
+
enabled,
|
|
4723
|
+
ancestorSelected: isSelected,
|
|
4724
|
+
expandAllNonce,
|
|
4725
|
+
collapseAllNonce
|
|
4726
|
+
},
|
|
4727
|
+
child.id
|
|
4728
|
+
))
|
|
4729
|
+
}
|
|
4730
|
+
);
|
|
4731
|
+
}
|
|
4732
|
+
function ConnectedDriveSyncDialog({
|
|
4733
|
+
catalog,
|
|
4734
|
+
userConnector,
|
|
4735
|
+
open,
|
|
4736
|
+
onOpenChange,
|
|
4737
|
+
lockedWorkspaceExtId,
|
|
4738
|
+
onEnabled
|
|
4739
|
+
}) {
|
|
4740
|
+
const enableSync = react$1.useEnableDriveSync();
|
|
4741
|
+
const disconnect = react$1.useDisconnectConnector();
|
|
4742
|
+
const arbi = react$1.useArbi();
|
|
4743
|
+
const { notify, navigate } = chunkKPZZ5FHE_cjs.useBlocksEnvironment();
|
|
4744
|
+
const reconnect = async () => {
|
|
4745
|
+
try {
|
|
4746
|
+
await disconnect.mutateAsync({ vendorKey: catalog.vendor_key });
|
|
4747
|
+
} catch {
|
|
4748
|
+
}
|
|
4749
|
+
try {
|
|
4750
|
+
navigate(await arbi.connectors.authorize(catalog.vendor_key, react$1.connectorReturnTo()));
|
|
4751
|
+
} catch {
|
|
4752
|
+
notify("Could not start reconnection. Please try again.", "error");
|
|
4753
|
+
}
|
|
4754
|
+
};
|
|
4755
|
+
const { data: workspaces = [] } = react$1.useWorkspaces({ enabled: open && !lockedWorkspaceExtId });
|
|
4756
|
+
const memberWorkspaces = workspaces.filter((w) => w.is_member);
|
|
4757
|
+
const [tokensBridged, setTokensBridged] = react.useState(false);
|
|
4758
|
+
react.useEffect(() => {
|
|
4759
|
+
if (!open) {
|
|
4760
|
+
setTokensBridged(false);
|
|
4761
|
+
return;
|
|
4762
|
+
}
|
|
4763
|
+
if (!userConnector?.is_connected) {
|
|
4764
|
+
setTokensBridged(true);
|
|
4765
|
+
return;
|
|
4766
|
+
}
|
|
4767
|
+
let cancelled = false;
|
|
4768
|
+
void arbi.connectors.bridgeTokens({ vendor: catalog.vendor_key }).finally(() => {
|
|
4769
|
+
if (!cancelled) setTokensBridged(true);
|
|
4770
|
+
});
|
|
4771
|
+
return () => {
|
|
4772
|
+
cancelled = true;
|
|
4773
|
+
};
|
|
4774
|
+
}, [open, arbi, userConnector?.is_connected, catalog.vendor_key]);
|
|
4775
|
+
const [workspaceExtId, setWorkspaceExtId] = react.useState("");
|
|
4776
|
+
const [selectedFolders, setSelectedFolders] = react.useState([]);
|
|
4777
|
+
const [skipDuplicates, setSkipDuplicates] = react.useState(false);
|
|
4778
|
+
const [autoRename, setAutoRename] = react.useState(false);
|
|
4779
|
+
const [shared, setShared] = react.useState(false);
|
|
4780
|
+
const [autoSync, setAutoSync] = react.useState(false);
|
|
4781
|
+
react.useEffect(() => {
|
|
4782
|
+
if (!open) return;
|
|
4783
|
+
const target = lockedWorkspaceExtId ?? userConnector?.drive_sync_workspace_ext_id ?? "";
|
|
4784
|
+
setWorkspaceExtId(target);
|
|
4785
|
+
setSelectedFolders(userConnector?.drive_sync_folders ?? []);
|
|
4786
|
+
setSkipDuplicates(userConnector?.drive_skip_duplicates ?? false);
|
|
4787
|
+
setAutoRename(userConnector?.drive_auto_rename ?? false);
|
|
4788
|
+
setShared(userConnector?.drive_shared ?? false);
|
|
4789
|
+
setAutoSync(userConnector?.drive_auto_sync ?? false);
|
|
4790
|
+
setExpandAllNonce(0);
|
|
4791
|
+
setCollapseAllNonce(0);
|
|
4792
|
+
}, [open, lockedWorkspaceExtId, userConnector]);
|
|
4793
|
+
const [expandAllNonce, setExpandAllNonce] = react.useState(0);
|
|
4794
|
+
const [collapseAllNonce, setCollapseAllNonce] = react.useState(0);
|
|
4795
|
+
const treeEnabled = open && tokensBridged;
|
|
4796
|
+
const {
|
|
4797
|
+
data: folders = [],
|
|
4798
|
+
isLoading: foldersQueryLoading,
|
|
4799
|
+
error: foldersError
|
|
4800
|
+
} = react$1.useDriveFolderChildren(catalog.vendor_key, "root", treeEnabled);
|
|
4801
|
+
const foldersLoading = !tokensBridged || foldersQueryLoading;
|
|
4802
|
+
const needsReconnect = react$1.connectorErrorStatus(foldersError) === 409;
|
|
4803
|
+
const toggleFolder = (id) => setSelectedFolders((prev) => prev.includes(id) ? prev.filter((f) => f !== id) : [...prev, id]);
|
|
4804
|
+
const orderedFolders = [...folders].sort(
|
|
4805
|
+
(a, b) => a.name.localeCompare(b.name)
|
|
4806
|
+
);
|
|
4807
|
+
const handleEnableSubmit = () => {
|
|
4808
|
+
if (!workspaceExtId || selectedFolders.length === 0) return;
|
|
4809
|
+
const foldersToSubmit = selectedFolders.filter((id) => !id.startsWith("site:"));
|
|
4810
|
+
if (foldersToSubmit.length === 0) return;
|
|
4811
|
+
enableSync.mutate(
|
|
4812
|
+
{
|
|
4813
|
+
vendorKey: catalog.vendor_key,
|
|
4814
|
+
workspaceExtId,
|
|
4815
|
+
folders: foldersToSubmit,
|
|
4816
|
+
skipDuplicates,
|
|
4817
|
+
autoRename,
|
|
4818
|
+
shared,
|
|
4819
|
+
autoSync
|
|
4820
|
+
},
|
|
4821
|
+
{
|
|
4822
|
+
onSuccess: () => {
|
|
4823
|
+
notify(`${productName} settings saved`, "success");
|
|
4824
|
+
onOpenChange(false);
|
|
4825
|
+
onEnabled?.(workspaceExtId);
|
|
4826
|
+
},
|
|
4827
|
+
onError: (err) => {
|
|
4828
|
+
let msg = `Could not enable ${productName} sync. Please try again.`;
|
|
4829
|
+
const status = react$1.connectorErrorStatus(err);
|
|
4830
|
+
if (status !== void 0) {
|
|
4831
|
+
if (status === 403) {
|
|
4832
|
+
msg = "You are not a member of the selected workspace.";
|
|
4833
|
+
} else if (status === 409) {
|
|
4834
|
+
msg = `Reconnect needed \u2014 re-authorize your account to enable ${productName}.`;
|
|
4835
|
+
} else if (status === 404) {
|
|
4836
|
+
msg = `This connector is not available for ${productName} sync.`;
|
|
4837
|
+
}
|
|
4838
|
+
}
|
|
4839
|
+
notify(msg, "error");
|
|
4840
|
+
}
|
|
4841
|
+
}
|
|
4842
|
+
);
|
|
4843
|
+
};
|
|
4844
|
+
const productName = DRIVE_PRODUCT_NAMES[catalog.vendor_key] ?? "OneDrive";
|
|
4845
|
+
const reconnectButtonProps = {
|
|
4846
|
+
onReconnect: () => void reconnect(),
|
|
4847
|
+
isPending: disconnect.isPending,
|
|
4848
|
+
testId: "drive-folders-reconnect"
|
|
4849
|
+
};
|
|
4850
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4851
|
+
chunkULWRNGGE_cjs.ModalScaffold,
|
|
4852
|
+
{
|
|
4853
|
+
open,
|
|
4854
|
+
onOpenChange,
|
|
4855
|
+
title: `${productName} Import Settings`,
|
|
4856
|
+
description: `Import documents from ${productName} into a workspace so the ARBI agent can search them. This is read-only \u2014 ARBI imports a copy and never modifies or deletes anything in your ${productName}.`,
|
|
4857
|
+
showDescription: true,
|
|
4858
|
+
className: "w-[92vw] sm:max-w-lg",
|
|
4859
|
+
children: [
|
|
4860
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncDialogBody, { children: [
|
|
4861
|
+
!lockedWorkspaceExtId && /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncField, { label: "Target workspace", htmlFor: "drive-sync-workspace", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4862
|
+
chunkU37AYUPI_cjs.SyncSelect,
|
|
4863
|
+
{
|
|
4864
|
+
id: "drive-sync-workspace",
|
|
4865
|
+
value: workspaceExtId,
|
|
4866
|
+
onValueChange: setWorkspaceExtId,
|
|
4867
|
+
placeholder: "Select a workspace",
|
|
4868
|
+
options: memberWorkspaces.map((w) => ({ value: w.external_id, label: w.name }))
|
|
4869
|
+
}
|
|
4870
|
+
) }),
|
|
4871
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4872
|
+
chunkU37AYUPI_cjs.SyncField,
|
|
4873
|
+
{
|
|
4874
|
+
label: `Folders to import${selectedFolders.length > 0 ? ` (${selectedFolders.length})` : ""}`,
|
|
4875
|
+
hint: "Select at least one folder. Importing a folder includes everything inside it.",
|
|
4876
|
+
actions: orderedFolders.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncLinkRow, { children: [
|
|
4877
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4878
|
+
chunkU37AYUPI_cjs.SyncLinkButton,
|
|
4879
|
+
{
|
|
4880
|
+
onClick: () => setExpandAllNonce((n) => n + 1),
|
|
4881
|
+
testId: "drive-folders-expand-all",
|
|
4882
|
+
children: "Expand all"
|
|
4883
|
+
}
|
|
4884
|
+
),
|
|
4885
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4886
|
+
chunkU37AYUPI_cjs.SyncLinkButton,
|
|
4887
|
+
{
|
|
4888
|
+
onClick: () => setCollapseAllNonce((n) => n + 1),
|
|
4889
|
+
testId: "drive-folders-collapse-all",
|
|
4890
|
+
children: "Collapse all"
|
|
4891
|
+
}
|
|
4892
|
+
)
|
|
4893
|
+
] }),
|
|
4894
|
+
children: foldersLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncLoading, { children: "Loading folders\u2026" }) : needsReconnect ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4895
|
+
chunkU37AYUPI_cjs.SyncReconnectNotice,
|
|
4896
|
+
{
|
|
4897
|
+
...reconnectButtonProps,
|
|
4898
|
+
message: `Reconnect ${catalog.display_name} to enable ${productName} \u2014 your account needs to grant file access.`
|
|
4899
|
+
}
|
|
4900
|
+
) : foldersError ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4901
|
+
chunkU37AYUPI_cjs.SyncReconnectNotice,
|
|
4902
|
+
{
|
|
4903
|
+
...reconnectButtonProps,
|
|
4904
|
+
message: `Couldn\u2019t load folders from ${productName}. Reconnect the account and try again.`
|
|
4905
|
+
}
|
|
4906
|
+
) : orderedFolders.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncNote, { children: "No folders found." }) : /* @__PURE__ */ jsxRuntime.jsx(chunkU37AYUPI_cjs.SyncTreeFrame, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", "data-testid": "drive-folder-tree", children: orderedFolders.map((f) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
4907
|
+
DriveFolderNode,
|
|
4908
|
+
{
|
|
4909
|
+
vendorKey: catalog.vendor_key,
|
|
4910
|
+
folder: f,
|
|
4911
|
+
depth: 0,
|
|
4912
|
+
selected: selectedFolders,
|
|
4913
|
+
onToggle: toggleFolder,
|
|
4914
|
+
enabled: treeEnabled,
|
|
4915
|
+
ancestorSelected: false,
|
|
4916
|
+
expandAllNonce,
|
|
4917
|
+
collapseAllNonce
|
|
4918
|
+
},
|
|
4919
|
+
f.id
|
|
4920
|
+
)) }) })
|
|
4921
|
+
}
|
|
4922
|
+
),
|
|
4923
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkU37AYUPI_cjs.SyncOptions, { children: [
|
|
4924
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4925
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4926
|
+
{
|
|
4927
|
+
checked: skipDuplicates,
|
|
4928
|
+
onCheckedChange: setSkipDuplicates,
|
|
4929
|
+
title: "Skip duplicates",
|
|
4930
|
+
description: "Skip files identical to ones already in the workspace."
|
|
4931
|
+
}
|
|
4932
|
+
),
|
|
4933
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4934
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4935
|
+
{
|
|
4936
|
+
checked: autoRename,
|
|
4937
|
+
onCheckedChange: setAutoRename,
|
|
4938
|
+
title: "Auto-rename",
|
|
4939
|
+
description: "Generate a descriptive title with AI instead of using the filename."
|
|
4940
|
+
}
|
|
4941
|
+
),
|
|
4942
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4943
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4944
|
+
{
|
|
4945
|
+
checked: shared,
|
|
4946
|
+
onCheckedChange: setShared,
|
|
4947
|
+
title: "Share with the workspace",
|
|
4948
|
+
description: shared ? "Imported documents are visible to everyone in the workspace." : "Imported documents stay private to you."
|
|
4949
|
+
}
|
|
4950
|
+
),
|
|
4951
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4952
|
+
chunkU37AYUPI_cjs.SyncOptionToggle,
|
|
4953
|
+
{
|
|
4954
|
+
checked: autoSync,
|
|
4955
|
+
onCheckedChange: setAutoSync,
|
|
4956
|
+
title: "Sync automatically",
|
|
4957
|
+
description: "Check for new files when you sign in, instead of only when you click Sync now. Requires you to be signed in \u2014 nothing syncs while you are away.",
|
|
4958
|
+
testId: "drive-sync-auto-sync"
|
|
4959
|
+
}
|
|
4960
|
+
)
|
|
4961
|
+
] })
|
|
4962
|
+
] }),
|
|
4963
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4964
|
+
chunkU37AYUPI_cjs.SyncDialogFooter,
|
|
4965
|
+
{
|
|
4966
|
+
onCancel: () => onOpenChange(false),
|
|
4967
|
+
onSave: handleEnableSubmit,
|
|
4968
|
+
saveDisabled: !workspaceExtId || selectedFolders.length === 0,
|
|
4969
|
+
isSaving: enableSync.isPending,
|
|
4970
|
+
cancelButton: { testId: "drive-sync-cancel" },
|
|
4971
|
+
saveButton: { testId: "drive-sync-save" }
|
|
4972
|
+
}
|
|
4973
|
+
)
|
|
4974
|
+
]
|
|
4975
|
+
}
|
|
4976
|
+
);
|
|
4977
|
+
}
|
|
4081
4978
|
function useConnectedDocxNotifications(onOpen) {
|
|
4082
4979
|
const arbi = react$1.useArbi();
|
|
4083
4980
|
const { status, user, apiUrl } = chunkGFNELPDP_cjs.useConnection();
|
|
@@ -4359,7 +5256,7 @@ function useWordBody({
|
|
|
4359
5256
|
}
|
|
4360
5257
|
var MailBodyEditor = react.lazy(
|
|
4361
5258
|
() => import('../MailBodyEditor-D7MGJMLH.cjs').catch(() => ({
|
|
4362
|
-
default:
|
|
5259
|
+
default: chunkGRGS5M6O_cjs.PlainMailBodyEditor
|
|
4363
5260
|
}))
|
|
4364
5261
|
);
|
|
4365
5262
|
var NativeDocxEditor = react.lazy(
|
|
@@ -4451,9 +5348,9 @@ function MailComposerForm({
|
|
|
4451
5348
|
}, [drafts, draftId, subject]);
|
|
4452
5349
|
const body = () => ({
|
|
4453
5350
|
...initial,
|
|
4454
|
-
to:
|
|
4455
|
-
cc:
|
|
4456
|
-
bcc:
|
|
5351
|
+
to: chunkGRGS5M6O_cjs.parseMailRecipients(to),
|
|
5352
|
+
cc: chunkGRGS5M6O_cjs.parseMailRecipients(cc),
|
|
5353
|
+
bcc: chunkGRGS5M6O_cjs.parseMailRecipients(bcc),
|
|
4457
5354
|
subject,
|
|
4458
5355
|
text,
|
|
4459
5356
|
html,
|
|
@@ -4909,7 +5806,7 @@ function MailComposerForm({
|
|
|
4909
5806
|
}
|
|
4910
5807
|
),
|
|
4911
5808
|
documents && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4912
|
-
|
|
5809
|
+
chunkGRGS5M6O_cjs.MailDocumentPicker,
|
|
4913
5810
|
{
|
|
4914
5811
|
documents: documents.documents,
|
|
4915
5812
|
disabled: locked,
|
|
@@ -5028,7 +5925,7 @@ function ConnectedMailComposer({
|
|
|
5028
5925
|
openId,
|
|
5029
5926
|
async (from, id) => {
|
|
5030
5927
|
const message = await client.getMessage(from, id);
|
|
5031
|
-
return
|
|
5928
|
+
return chunkGRGS5M6O_cjs.draftMailCompose(
|
|
5032
5929
|
message,
|
|
5033
5930
|
await hydrateMailAttachments(client, from, message.id, message.attachments, {
|
|
5034
5931
|
isOnline,
|
|
@@ -5042,11 +5939,11 @@ function ConnectedMailComposer({
|
|
|
5042
5939
|
const start = react.useMemo(() => {
|
|
5043
5940
|
if (replyTo)
|
|
5044
5941
|
return original.data && account ? {
|
|
5045
|
-
...
|
|
5942
|
+
...chunkGRGS5M6O_cjs.replyMailCompose(original.data, { account, folderRole: "inbox" }),
|
|
5046
5943
|
text: "",
|
|
5047
5944
|
html: ""
|
|
5048
5945
|
} : void 0;
|
|
5049
|
-
return reloaded ? draft.data : initial ?? (openId ? draft.data :
|
|
5946
|
+
return reloaded ? draft.data : initial ?? (openId ? draft.data : chunkGRGS5M6O_cjs.emptyMailCompose());
|
|
5050
5947
|
}, [replyTo, original.data, account, reloaded, initial, openId, draft.data]);
|
|
5051
5948
|
if (!start)
|
|
5052
5949
|
return draft.error ?? original.error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "p-4 text-sm text-destructive", children: (draft.error ?? original.error)?.message }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "p-4 text-sm text-muted-foreground", children: "Loading draft\u2026" });
|
|
@@ -5352,7 +6249,7 @@ function ConnectedMailbox({
|
|
|
5352
6249
|
const message = detail.data;
|
|
5353
6250
|
react.useEffect(() => {
|
|
5354
6251
|
if (!composeAttachments?.length) return;
|
|
5355
|
-
openCompose({ ...
|
|
6252
|
+
openCompose({ ...chunkGRGS5M6O_cjs.emptyMailCompose(), attachments: composeAttachments });
|
|
5356
6253
|
onComposeOpened?.();
|
|
5357
6254
|
}, [composeAttachments]);
|
|
5358
6255
|
react.useEffect(() => {
|
|
@@ -5480,7 +6377,7 @@ function ConnectedMailbox({
|
|
|
5480
6377
|
const editDraft = async () => {
|
|
5481
6378
|
if (!message) return;
|
|
5482
6379
|
try {
|
|
5483
|
-
openCompose(
|
|
6380
|
+
openCompose(chunkGRGS5M6O_cjs.draftMailCompose(message, await hydrate(message.attachments)));
|
|
5484
6381
|
} catch (e) {
|
|
5485
6382
|
setActionError(e instanceof Error ? e.message : "Could not load draft attachments");
|
|
5486
6383
|
}
|
|
@@ -5489,7 +6386,7 @@ function ConnectedMailbox({
|
|
|
5489
6386
|
if (!message || !account) return;
|
|
5490
6387
|
try {
|
|
5491
6388
|
const attachments = forward ? await hydrate(message.attachments) : [];
|
|
5492
|
-
openCompose(
|
|
6389
|
+
openCompose(chunkGRGS5M6O_cjs.replyMailCompose(message, { account, folderRole, forward, all, attachments }));
|
|
5493
6390
|
} catch (e) {
|
|
5494
6391
|
setActionError(e instanceof Error ? e.message : "Could not prepare forwarded attachments");
|
|
5495
6392
|
}
|
|
@@ -5609,7 +6506,7 @@ function ConnectedMailbox({
|
|
|
5609
6506
|
{
|
|
5610
6507
|
size: "sm",
|
|
5611
6508
|
disabled: !ready || !!compose,
|
|
5612
|
-
onClick: () => openCompose(
|
|
6509
|
+
onClick: () => openCompose(chunkGRGS5M6O_cjs.emptyMailCompose()),
|
|
5613
6510
|
children: [
|
|
5614
6511
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-1.5 size-4" }),
|
|
5615
6512
|
"Email"
|
|
@@ -5688,7 +6585,7 @@ function ConnectedMailbox({
|
|
|
5688
6585
|
onEdit: (value) => openCompose({ ...value })
|
|
5689
6586
|
}),
|
|
5690
6587
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: deviceFolder ? "hidden" : "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5691
|
-
|
|
6588
|
+
chunkGRGS5M6O_cjs.MailGrid,
|
|
5692
6589
|
{
|
|
5693
6590
|
messages: filteredMessages,
|
|
5694
6591
|
loading: list.isPending && list.fetchStatus !== "idle",
|
|
@@ -5751,7 +6648,7 @@ function ConnectedMailbox({
|
|
|
5751
6648
|
},
|
|
5752
6649
|
`${account?.id}-${composeSession}`
|
|
5753
6650
|
) : message && selected ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5754
|
-
|
|
6651
|
+
chunkGRGS5M6O_cjs.MailMessageView,
|
|
5755
6652
|
{
|
|
5756
6653
|
account,
|
|
5757
6654
|
message,
|
|
@@ -5888,7 +6785,7 @@ function ConnectedMailMessage({
|
|
|
5888
6785
|
const attachments = forward ? await hydrateMailAttachments(client, account, message.id, message.attachments, {
|
|
5889
6786
|
isOnline
|
|
5890
6787
|
}) : [];
|
|
5891
|
-
onCompose(
|
|
6788
|
+
onCompose(chunkGRGS5M6O_cjs.replyMailCompose(message, { account, folderRole, forward, all, attachments }));
|
|
5892
6789
|
} catch (e) {
|
|
5893
6790
|
setError(e instanceof Error ? e.message : "Could not prepare forwarded attachments");
|
|
5894
6791
|
}
|
|
@@ -5896,7 +6793,7 @@ function ConnectedMailMessage({
|
|
|
5896
6793
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [
|
|
5897
6794
|
error && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "px-4 pt-3 text-sm text-destructive", children: error }),
|
|
5898
6795
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5899
|
-
|
|
6796
|
+
chunkGRGS5M6O_cjs.MailMessageView,
|
|
5900
6797
|
{
|
|
5901
6798
|
account,
|
|
5902
6799
|
message,
|
|
@@ -5907,7 +6804,7 @@ function ConnectedMailMessage({
|
|
|
5907
6804
|
onBack: onClose,
|
|
5908
6805
|
onEditDraft: () => void hydrateMailAttachments(client, account, message.id, message.attachments, {
|
|
5909
6806
|
isOnline
|
|
5910
|
-
}).then((attachments) => onCompose(
|
|
6807
|
+
}).then((attachments) => onCompose(chunkGRGS5M6O_cjs.draftMailCompose(message, attachments))).catch((e) => setError(e.message)),
|
|
5911
6808
|
onReply: (forward, all) => void reply(forward, all),
|
|
5912
6809
|
onReplyWithArbi: onReplyWithArbi && account.provider === "native" ? () => onReplyWithArbi(message, account) : void 0,
|
|
5913
6810
|
onUpdate: (body) => void update(body),
|
|
@@ -9658,43 +10555,43 @@ Object.defineProperty(exports, "useWorkspaceDocs", {
|
|
|
9658
10555
|
});
|
|
9659
10556
|
Object.defineProperty(exports, "ConnectedWorkflowDocumentsField", {
|
|
9660
10557
|
enumerable: true,
|
|
9661
|
-
get: function () { return
|
|
10558
|
+
get: function () { return chunkAINU3EJ6_cjs.ConnectedWorkflowDocumentsField; }
|
|
9662
10559
|
});
|
|
9663
10560
|
Object.defineProperty(exports, "ConnectedWorkflowLauncher", {
|
|
9664
10561
|
enumerable: true,
|
|
9665
|
-
get: function () { return
|
|
10562
|
+
get: function () { return chunkAINU3EJ6_cjs.ConnectedWorkflowLauncher; }
|
|
9666
10563
|
});
|
|
9667
10564
|
Object.defineProperty(exports, "ConnectedWorkflowsTable", {
|
|
9668
10565
|
enumerable: true,
|
|
9669
|
-
get: function () { return
|
|
10566
|
+
get: function () { return chunkAINU3EJ6_cjs.ConnectedWorkflowsTable; }
|
|
9670
10567
|
});
|
|
9671
10568
|
Object.defineProperty(exports, "DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS", {
|
|
9672
10569
|
enumerable: true,
|
|
9673
|
-
get: function () { return
|
|
10570
|
+
get: function () { return chunkAINU3EJ6_cjs.DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS; }
|
|
9674
10571
|
});
|
|
9675
10572
|
Object.defineProperty(exports, "NativeDocxSupportProvider", {
|
|
9676
10573
|
enumerable: true,
|
|
9677
|
-
get: function () { return
|
|
10574
|
+
get: function () { return chunkAINU3EJ6_cjs.NativeDocxSupportProvider; }
|
|
9678
10575
|
});
|
|
9679
10576
|
Object.defineProperty(exports, "toWorkflowFieldDocument", {
|
|
9680
10577
|
enumerable: true,
|
|
9681
|
-
get: function () { return
|
|
10578
|
+
get: function () { return chunkAINU3EJ6_cjs.toWorkflowFieldDocument; }
|
|
9682
10579
|
});
|
|
9683
10580
|
Object.defineProperty(exports, "useConnectedAgentOptions", {
|
|
9684
10581
|
enumerable: true,
|
|
9685
|
-
get: function () { return
|
|
10582
|
+
get: function () { return chunkAINU3EJ6_cjs.useConnectedAgentOptions; }
|
|
9686
10583
|
});
|
|
9687
10584
|
Object.defineProperty(exports, "useConnectedWorkflowScopeSource", {
|
|
9688
10585
|
enumerable: true,
|
|
9689
|
-
get: function () { return
|
|
10586
|
+
get: function () { return chunkAINU3EJ6_cjs.useConnectedWorkflowScopeSource; }
|
|
9690
10587
|
});
|
|
9691
10588
|
Object.defineProperty(exports, "useConnectedWorkspaceRole", {
|
|
9692
10589
|
enumerable: true,
|
|
9693
|
-
get: function () { return
|
|
10590
|
+
get: function () { return chunkAINU3EJ6_cjs.useConnectedWorkspaceRole; }
|
|
9694
10591
|
});
|
|
9695
10592
|
Object.defineProperty(exports, "useNativeDocxSupport", {
|
|
9696
10593
|
enumerable: true,
|
|
9697
|
-
get: function () { return
|
|
10594
|
+
get: function () { return chunkAINU3EJ6_cjs.useNativeDocxSupport; }
|
|
9698
10595
|
});
|
|
9699
10596
|
Object.defineProperty(exports, "ConnectedWorkspaceDataProvider", {
|
|
9700
10597
|
enumerable: true,
|
|
@@ -9733,11 +10630,14 @@ Object.defineProperty(exports, "useConnection", {
|
|
|
9733
10630
|
get: function () { return chunkGFNELPDP_cjs.useConnection; }
|
|
9734
10631
|
});
|
|
9735
10632
|
exports.ArbiAppProvider = ArbiAppProvider;
|
|
10633
|
+
exports.BACKFILL_OPTIONS = BACKFILL_OPTIONS;
|
|
9736
10634
|
exports.ConnectedAccountSettings = ConnectedAccountSettings;
|
|
9737
10635
|
exports.ConnectedAgentChatPanel = ConnectedAgentChatPanel;
|
|
9738
10636
|
exports.ConnectedAgentCreator = ConnectedAgentCreator;
|
|
10637
|
+
exports.ConnectedAppsSettings = ConnectedAppsSettings;
|
|
9739
10638
|
exports.ConnectedCalendar = ConnectedCalendar;
|
|
9740
10639
|
exports.ConnectedDangerZone = ConnectedDangerZone;
|
|
10640
|
+
exports.ConnectedDriveSyncDialog = ConnectedDriveSyncDialog;
|
|
9741
10641
|
exports.ConnectedIdentityVerification = ConnectedIdentityVerification;
|
|
9742
10642
|
exports.ConnectedLogoutDialog = ConnectedLogoutDialog;
|
|
9743
10643
|
exports.ConnectedMailAccounts = ConnectedMailAccounts;
|
|
@@ -9747,6 +10647,7 @@ exports.ConnectedMailMessage = ConnectedMailMessage;
|
|
|
9747
10647
|
exports.ConnectedMailSettings = ConnectedMailSettings;
|
|
9748
10648
|
exports.ConnectedMailSetup = ConnectedMailSetup;
|
|
9749
10649
|
exports.ConnectedMailbox = ConnectedMailbox;
|
|
10650
|
+
exports.ConnectedMailboxSyncDialog = ConnectedMailboxSyncDialog;
|
|
9750
10651
|
exports.ConnectedNotificationCenter = ConnectedNotificationCenter;
|
|
9751
10652
|
exports.ConnectedNotificationPreferences = ConnectedNotificationPreferences;
|
|
9752
10653
|
exports.ConnectedPasswordChangeDialog = ConnectedPasswordChangeDialog;
|
|
@@ -9783,9 +10684,11 @@ exports.accountSettingsSection = accountSettingsSection;
|
|
|
9783
10684
|
exports.bookingCancelLink = bookingCancelLink;
|
|
9784
10685
|
exports.buildNotificationCenterItems = buildNotificationCenterItems;
|
|
9785
10686
|
exports.chatSettingsSection = chatSettingsSection;
|
|
10687
|
+
exports.connectedAppsSettingsSection = connectedAppsSettingsSection;
|
|
9786
10688
|
exports.countNotificationTypes = countNotificationTypes;
|
|
9787
10689
|
exports.defaultUnmetPasswordRequirement = defaultUnmetPasswordRequirement;
|
|
9788
10690
|
exports.filterNotificationCenterItems = filterNotificationCenterItems;
|
|
10691
|
+
exports.formatLastSync = formatLastSync;
|
|
9789
10692
|
exports.mailSettingsSection = mailSettingsSection;
|
|
9790
10693
|
exports.openMeetingLink = openMeetingLink;
|
|
9791
10694
|
exports.privacySettingsSection = privacySettingsSection;
|
|
@@ -9798,6 +10701,7 @@ exports.useConnectedDocxNotifications = useConnectedDocxNotifications;
|
|
|
9798
10701
|
exports.useConnectedShellWorkspaces = useConnectedShellWorkspaces;
|
|
9799
10702
|
exports.useConnectedWorkNotifications = useConnectedWorkNotifications;
|
|
9800
10703
|
exports.useConnectedWorkspaceSettings = useConnectedWorkspaceSettings;
|
|
10704
|
+
exports.windowLabel = windowLabel;
|
|
9801
10705
|
exports.workflowRunView = workflowRunView;
|
|
9802
10706
|
//# sourceMappingURL=index.cjs.map
|
|
9803
10707
|
//# sourceMappingURL=index.cjs.map
|