@arbidocs/blocks 0.4.142 → 0.4.143
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 +438 -435
- package/dist/agents/index.js +10 -7
- package/dist/chat/index.cjs +139 -138
- package/dist/chat/index.js +4 -3
- package/dist/{chunk-S24XEVPS.cjs → chunk-464YPRAE.cjs} +33 -2
- package/dist/chunk-464YPRAE.cjs.map +1 -0
- package/dist/{chunk-7YLJHTDC.cjs → chunk-5A2QQAF5.cjs} +11 -11
- package/dist/{chunk-7YLJHTDC.cjs.map → chunk-5A2QQAF5.cjs.map} +1 -1
- package/dist/{chunk-ON3TKY5Y.js → chunk-5YHEHEJT.js} +242 -4
- package/dist/chunk-5YHEHEJT.js.map +1 -0
- package/dist/chunk-76L6LOP3.cjs +308 -0
- package/dist/chunk-76L6LOP3.cjs.map +1 -0
- package/dist/chunk-AOSUHWIL.js +98 -0
- package/dist/chunk-AOSUHWIL.js.map +1 -0
- package/dist/{chunk-PROK33G6.js → chunk-C44TDH54.js} +13 -1598
- package/dist/chunk-C44TDH54.js.map +1 -0
- package/dist/{chunk-YFY3TQ6Q.cjs → chunk-COCGRJLA.cjs} +7 -7
- package/dist/{chunk-YFY3TQ6Q.cjs.map → chunk-COCGRJLA.cjs.map} +1 -1
- package/dist/chunk-CQCC7LE7.js +210 -0
- package/dist/chunk-CQCC7LE7.js.map +1 -0
- package/dist/{chunk-UGCKUXRV.js → chunk-CSI2B2H5.js} +3 -3
- package/dist/{chunk-UGCKUXRV.js.map → chunk-CSI2B2H5.js.map} +1 -1
- package/dist/{chunk-R26BK7YL.cjs → chunk-DTROMMDX.cjs} +4 -4
- package/dist/{chunk-R26BK7YL.cjs.map → chunk-DTROMMDX.cjs.map} +1 -1
- package/dist/{chunk-65THHQVB.cjs → chunk-ECW2R2KF.cjs} +27 -27
- package/dist/{chunk-65THHQVB.cjs.map → chunk-ECW2R2KF.cjs.map} +1 -1
- package/dist/{chunk-RI6DZA5X.js → chunk-EF4ZLKRM.js} +3 -3
- package/dist/{chunk-RI6DZA5X.js.map → chunk-EF4ZLKRM.js.map} +1 -1
- package/dist/{chunk-WS5EX7DN.cjs → chunk-EYKISBDO.cjs} +5 -5
- package/dist/{chunk-WS5EX7DN.cjs.map → chunk-EYKISBDO.cjs.map} +1 -1
- package/dist/chunk-FJETR2AS.js +561 -0
- package/dist/chunk-FJETR2AS.js.map +1 -0
- package/dist/{chunk-JO3EMZ4X.js → chunk-GWSGIZQ5.js} +3 -3
- package/dist/{chunk-JO3EMZ4X.js.map → chunk-GWSGIZQ5.js.map} +1 -1
- package/dist/{chunk-I7WG3JRD.js → chunk-H4D7WKDY.js} +3 -3
- package/dist/{chunk-I7WG3JRD.js.map → chunk-H4D7WKDY.js.map} +1 -1
- package/dist/{chunk-GBS6QVGS.cjs → chunk-HAOKT4LC.cjs} +5 -5
- package/dist/{chunk-GBS6QVGS.cjs.map → chunk-HAOKT4LC.cjs.map} +1 -1
- package/dist/{chunk-N5X37J3D.js → chunk-IJST4EBM.js} +11 -8
- package/dist/chunk-IJST4EBM.js.map +1 -0
- package/dist/{chunk-3RJN2VTL.js → chunk-IXWJGOM2.js} +3 -3
- package/dist/{chunk-3RJN2VTL.js.map → chunk-IXWJGOM2.js.map} +1 -1
- package/dist/{chunk-CYNF5PZI.js → chunk-J5CWKFSC.js} +3 -3
- package/dist/{chunk-CYNF5PZI.js.map → chunk-J5CWKFSC.js.map} +1 -1
- package/dist/{chunk-OWCEQKAR.cjs → chunk-JSTKEZBS.cjs} +21 -318
- package/dist/chunk-JSTKEZBS.cjs.map +1 -0
- package/dist/{chunk-TP6PLDNM.cjs → chunk-KMZWKSKO.cjs} +8 -8
- package/dist/{chunk-TP6PLDNM.cjs.map → chunk-KMZWKSKO.cjs.map} +1 -1
- package/dist/{chunk-C4WSHRR6.cjs → chunk-KPZZ5FHE.cjs} +32 -12
- package/dist/chunk-KPZZ5FHE.cjs.map +1 -0
- package/dist/{chunk-CKCBBYTA.js → chunk-KSHKTOY2.js} +5 -205
- package/dist/chunk-KSHKTOY2.js.map +1 -0
- package/dist/chunk-LJJJ6CYH.cjs +62 -0
- package/dist/chunk-LJJJ6CYH.cjs.map +1 -0
- package/dist/chunk-LPYEUD2D.cjs +1627 -0
- package/dist/chunk-LPYEUD2D.cjs.map +1 -0
- package/dist/chunk-MHFF5N65.cjs +101 -0
- package/dist/chunk-MHFF5N65.cjs.map +1 -0
- package/dist/{chunk-GYAUJ4KT.js → chunk-MTSKK3BN.js} +32 -3
- package/dist/chunk-MTSKK3BN.js.map +1 -0
- package/dist/chunk-NHZK64TQ.js +75 -0
- package/dist/chunk-NHZK64TQ.js.map +1 -0
- package/dist/{chunk-BPBSSMRB.js → chunk-NRFAWUVD.js} +3 -3
- package/dist/{chunk-BPBSSMRB.js.map → chunk-NRFAWUVD.js.map} +1 -1
- package/dist/chunk-NWNVWO6L.cjs +80 -0
- package/dist/chunk-NWNVWO6L.cjs.map +1 -0
- package/dist/{chunk-HIJUXAWS.cjs → chunk-O2GW5IY6.cjs} +86 -83
- package/dist/chunk-O2GW5IY6.cjs.map +1 -0
- package/dist/{chunk-3BFGL2JL.cjs → chunk-ODRHHWHY.cjs} +4 -4
- package/dist/{chunk-3BFGL2JL.cjs.map → chunk-ODRHHWHY.cjs.map} +1 -1
- package/dist/{chunk-Y3KA6X7B.js → chunk-OVR3XMYL.js} +4 -4
- package/dist/{chunk-Y3KA6X7B.js.map → chunk-OVR3XMYL.js.map} +1 -1
- package/dist/{chunk-Y5KTM3V5.js → chunk-PDKM27DF.js} +17 -295
- package/dist/chunk-PDKM27DF.js.map +1 -0
- package/dist/{chunk-OAL3B2ZU.cjs → chunk-PLJ7PHWU.cjs} +5 -5
- package/dist/{chunk-OAL3B2ZU.cjs.map → chunk-PLJ7PHWU.cjs.map} +1 -1
- package/dist/{chunk-DPGFEMVT.cjs → chunk-RB7GX2VT.cjs} +57 -1665
- package/dist/chunk-RB7GX2VT.cjs.map +1 -0
- package/dist/chunk-RFIBUWLF.cjs +232 -0
- package/dist/chunk-RFIBUWLF.cjs.map +1 -0
- package/dist/{chunk-MIDXCYZB.cjs → chunk-RQ2Y7USX.cjs} +15 -235
- package/dist/chunk-RQ2Y7USX.cjs.map +1 -0
- package/dist/chunk-SV65E4QW.js +58 -0
- package/dist/chunk-SV65E4QW.js.map +1 -0
- package/dist/{chunk-LYUO3E6V.js → chunk-SZOFGU7W.js} +3 -3
- package/dist/{chunk-LYUO3E6V.js.map → chunk-SZOFGU7W.js.map} +1 -1
- package/dist/chunk-T5B7FM7S.js +1602 -0
- package/dist/chunk-T5B7FM7S.js.map +1 -0
- package/dist/{chunk-YNIBUKV5.js → chunk-TBEVGWY3.js} +32 -14
- package/dist/chunk-TBEVGWY3.js.map +1 -0
- package/dist/{chunk-MJCCBMM5.cjs → chunk-TC3RQNEX.cjs} +6 -80
- package/dist/chunk-TC3RQNEX.cjs.map +1 -0
- package/dist/chunk-TZGBRLPK.js +288 -0
- package/dist/chunk-TZGBRLPK.js.map +1 -0
- package/dist/chunk-U6YVZDOV.cjs +574 -0
- package/dist/chunk-U6YVZDOV.cjs.map +1 -0
- package/dist/{chunk-QIMVTGKS.cjs → chunk-U73KPFYH.cjs} +255 -2
- package/dist/chunk-U73KPFYH.cjs.map +1 -0
- package/dist/{chunk-HFGXA5CL.cjs → chunk-UTTTJSQU.cjs} +4 -4
- package/dist/{chunk-HFGXA5CL.cjs.map → chunk-UTTTJSQU.cjs.map} +1 -1
- package/dist/{chunk-DLBUFHLY.js → chunk-VTTZZ4FN.js} +4 -74
- package/dist/chunk-VTTZZ4FN.js.map +1 -0
- package/dist/{chunk-5FTIHRZH.cjs → chunk-XVUOMWMD.cjs} +4 -4
- package/dist/{chunk-5FTIHRZH.cjs.map → chunk-XVUOMWMD.cjs.map} +1 -1
- package/dist/{chunk-FXG7TFAG.js → chunk-Y4ATWQGV.js} +3 -3
- package/dist/{chunk-FXG7TFAG.js.map → chunk-Y4ATWQGV.js.map} +1 -1
- package/dist/{chunk-444XKG46.js → chunk-YKQ2DPIP.js} +3 -3
- package/dist/{chunk-444XKG46.js.map → chunk-YKQ2DPIP.js.map} +1 -1
- package/dist/{chunk-HEMU73OP.cjs → chunk-YSHIC4NJ.cjs} +4 -4
- package/dist/{chunk-HEMU73OP.cjs.map → chunk-YSHIC4NJ.cjs.map} +1 -1
- package/dist/{chunk-5BXEYYH6.js → chunk-ZM26YEOT.js} +3 -3
- package/dist/{chunk-5BXEYYH6.js.map → chunk-ZM26YEOT.js.map} +1 -1
- package/dist/citations/index.cjs +12 -12
- package/dist/citations/index.js +3 -3
- package/dist/connect/docx.cjs +36 -7
- package/dist/connect/docx.cjs.map +1 -1
- package/dist/connect/docx.d.ts +9 -2
- package/dist/connect/docx.js +30 -6
- package/dist/connect/docx.js.map +1 -1
- package/dist/connect/index.cjs +802 -628
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +2 -0
- package/dist/connect/index.js +636 -507
- package/dist/connect/index.js.map +1 -1
- package/dist/connection/ConnectedSettings.d.ts +3 -2
- package/dist/connection/docx/ConnectedNativeDocxComparison.d.ts +5 -0
- package/dist/connection/docx/ConnectedNativeDocxEditor.d.ts +16 -0
- package/dist/connection/{ConnectedStreamedWordArtifact.d.ts → docx/ConnectedStreamedWordArtifact.d.ts} +1 -1
- package/dist/connection/docx/support.d.ts +27 -0
- package/dist/connection/docx/useConnectedDocxReferences.d.ts +2 -0
- package/dist/connection/docx/useConnectedHouseTemplate.d.ts +2 -0
- package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +35 -0
- package/dist/connection/settings-page/ConnectedMailSettings.d.ts +13 -0
- package/dist/connection/settings-page/ConnectedPremiumModels.d.ts +1 -0
- package/dist/connection/settings-page/ConnectedPrivacySettings.d.ts +12 -0
- package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +29 -0
- package/dist/connection/settings-page/SessionStatusIcon.d.ts +7 -0
- package/dist/connection/settings-page/index.d.ts +6 -0
- package/dist/docx/index.cjs +17 -63
- package/dist/docx/index.cjs.map +1 -1
- package/dist/docx/index.d.ts +1 -0
- package/dist/docx/index.js +2 -64
- package/dist/docx/index.js.map +1 -1
- package/dist/docx/template/candidates.d.ts +16 -0
- package/dist/facts/index.cjs +3 -3
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +3 -3
- package/dist/files/index.js +2 -2
- package/dist/home/index.cjs +20 -20
- package/dist/home/index.js +4 -4
- package/dist/index.cjs +766 -741
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +23 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/deep-link.d.ts +46 -0
- package/dist/provider/BlocksProvider.d.ts +5 -1
- package/dist/provider/settings-section.d.ts +9 -0
- package/dist/retrieval/index.cjs +4 -4
- package/dist/retrieval/index.js +2 -2
- package/dist/settings/AppearanceSettings.d.ts +18 -0
- package/dist/settings/ServerConnectionControls.d.ts +16 -0
- package/dist/settings/SettingsPage.d.ts +31 -0
- package/dist/settings/index.cjs +188 -250
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.d.ts +3 -1
- package/dist/settings/index.js +88 -199
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/index.cjs +44 -44
- package/dist/shell/index.js +3 -3
- package/dist/site/index.cjs +74 -73
- package/dist/site/index.js +3 -2
- package/dist/studio/index.cjs +80 -78
- package/dist/studio/index.cjs.map +1 -1
- package/dist/studio/index.js +10 -8
- package/dist/studio/index.js.map +1 -1
- package/dist/workflow-canvas/index.cjs +62 -59
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/dist/workflow-canvas/index.js +10 -7
- package/dist/workflow-canvas/index.js.map +1 -1
- package/dist/workspaces/index.cjs +3 -3
- package/dist/workspaces/index.js +2 -2
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +4 -4
- package/dist/chunk-4TR5QCCX.cjs +0 -43
- package/dist/chunk-4TR5QCCX.cjs.map +0 -1
- package/dist/chunk-7NDW4KF4.cjs +0 -112
- package/dist/chunk-7NDW4KF4.cjs.map +0 -1
- package/dist/chunk-C4WSHRR6.cjs.map +0 -1
- package/dist/chunk-CKCBBYTA.js.map +0 -1
- package/dist/chunk-DLBUFHLY.js.map +0 -1
- package/dist/chunk-DPGFEMVT.cjs.map +0 -1
- package/dist/chunk-ETXYVO6E.js +0 -109
- package/dist/chunk-ETXYVO6E.js.map +0 -1
- package/dist/chunk-GYAUJ4KT.js.map +0 -1
- package/dist/chunk-HIJUXAWS.cjs.map +0 -1
- package/dist/chunk-MCKOZACC.js +0 -41
- package/dist/chunk-MCKOZACC.js.map +0 -1
- package/dist/chunk-MIDXCYZB.cjs.map +0 -1
- package/dist/chunk-MJCCBMM5.cjs.map +0 -1
- package/dist/chunk-N5X37J3D.js.map +0 -1
- package/dist/chunk-ON3TKY5Y.js.map +0 -1
- package/dist/chunk-OWCEQKAR.cjs.map +0 -1
- package/dist/chunk-PROK33G6.js.map +0 -1
- package/dist/chunk-QIMVTGKS.cjs.map +0 -1
- package/dist/chunk-S24XEVPS.cjs.map +0 -1
- package/dist/chunk-Y5KTM3V5.js.map +0 -1
- package/dist/chunk-YNIBUKV5.js.map +0 -1
- package/dist/connection/ConnectedNativeDocxEditor.d.ts +0 -6
|
@@ -1,296 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
var chunk76L6LOP3_cjs = require('./chunk-76L6LOP3.cjs');
|
|
4
5
|
var chunk7UTB4PHM_cjs = require('./chunk-7UTB4PHM.cjs');
|
|
5
|
-
var chunk32HW2Q33_cjs = require('./chunk-32HW2Q33.cjs');
|
|
6
6
|
var chunkPPCATBOY_cjs = require('./chunk-PPCATBOY.cjs');
|
|
7
7
|
var lucideReact = require('lucide-react');
|
|
8
8
|
var ui = require('@arbidocs/react/ui');
|
|
9
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
10
10
|
var react = require('react');
|
|
11
11
|
|
|
12
|
-
// src/agents/workflows/types.ts
|
|
13
|
-
var EMPTY_WORKFLOW_SCOPE = { folders: [], labels: [] };
|
|
14
|
-
|
|
15
|
-
// src/agents/workflows/workflow.ts
|
|
16
|
-
var isWorkflowScope = (value) => typeof value === "object" && value !== null && Array.isArray(value.folders) && Array.isArray(value.labels);
|
|
17
|
-
var isEmptyWorkflowScope = (scope) => scope.folders.length === 0 && scope.labels.length === 0 && !scope.documents?.length;
|
|
18
|
-
var isFileField = (field) => field.type === "scope" || field.type === "documents";
|
|
19
|
-
function emptyValue(field) {
|
|
20
|
-
switch (field.type) {
|
|
21
|
-
case "boolean":
|
|
22
|
-
return false;
|
|
23
|
-
case "scope":
|
|
24
|
-
return { folders: [], labels: [] };
|
|
25
|
-
case "documents":
|
|
26
|
-
return { folders: [], labels: [], documents: [] };
|
|
27
|
-
default:
|
|
28
|
-
return "";
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function defaultInputs(workflow) {
|
|
32
|
-
const inputs = {};
|
|
33
|
-
for (const field of workflow.inputs) {
|
|
34
|
-
const d = field.default;
|
|
35
|
-
inputs[field.name] = d === void 0 ? emptyValue(field) : isWorkflowScope(d) ? { ...d } : d;
|
|
36
|
-
}
|
|
37
|
-
return inputs;
|
|
38
|
-
}
|
|
39
|
-
function validateInputs(workflow, inputs) {
|
|
40
|
-
const errors = {};
|
|
41
|
-
for (const field of workflow.inputs) {
|
|
42
|
-
const value = inputs[field.name];
|
|
43
|
-
if (field.type === "number") {
|
|
44
|
-
const blank = value === "" || value === void 0;
|
|
45
|
-
if (blank) {
|
|
46
|
-
if (field.required) errors[field.name] = "required";
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
const n = Number(value);
|
|
50
|
-
if (Number.isNaN(n)) errors[field.name] = "number";
|
|
51
|
-
else if (field.min !== void 0 && n < field.min) errors[field.name] = "min";
|
|
52
|
-
else if (field.max !== void 0 && n > field.max) errors[field.name] = "max";
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (!field.required) continue;
|
|
56
|
-
if (field.type === "documents") {
|
|
57
|
-
if (!isWorkflowScope(value) || !value.documents?.length) errors[field.name] = "required";
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
if (field.type === "boolean" || field.type === "scope") continue;
|
|
61
|
-
if (typeof value !== "string" || value.trim() === "") errors[field.name] = "required";
|
|
62
|
-
}
|
|
63
|
-
return errors;
|
|
64
|
-
}
|
|
65
|
-
function promptFieldName(workflow) {
|
|
66
|
-
return workflow.inputs.find((f) => !f.advanced && (f.type === "text" || f.type === "longtext"))?.name;
|
|
67
|
-
}
|
|
68
|
-
var quoteList = (names) => {
|
|
69
|
-
const quoted = names.map((n) => `"${n}"`);
|
|
70
|
-
return quoted.length <= 1 ? quoted[0] ?? "" : `${quoted.slice(0, -1).join(", ")} and ${quoted[quoted.length - 1]}`;
|
|
71
|
-
};
|
|
72
|
-
function fragment(field, value, ctx) {
|
|
73
|
-
switch (field.type) {
|
|
74
|
-
case "documents": {
|
|
75
|
-
const ids = isWorkflowScope(value) ? value.documents ?? [] : [];
|
|
76
|
-
const names = ids.flatMap((id) => {
|
|
77
|
-
const title = ctx?.documentTitles?.[id];
|
|
78
|
-
return title ? [title] : [];
|
|
79
|
-
});
|
|
80
|
-
return quoteList(names);
|
|
81
|
-
}
|
|
82
|
-
case "boolean":
|
|
83
|
-
return value ? field.trueText ?? "yes" : field.falseText ?? "no";
|
|
84
|
-
case "select": {
|
|
85
|
-
const option = field.options?.find((o) => o.value === value);
|
|
86
|
-
return option ? option.text ?? option.label : String(value ?? "");
|
|
87
|
-
}
|
|
88
|
-
case "scope":
|
|
89
|
-
return "";
|
|
90
|
-
default:
|
|
91
|
-
return typeof value === "string" ? value.trim() : String(value ?? "");
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
function composeWorkflowPrompt(workflow, inputs, ctx) {
|
|
95
|
-
if (workflow.run.kind !== "prompt") return "";
|
|
96
|
-
const byName = new Map(workflow.inputs.map((f) => [f.name, f]));
|
|
97
|
-
const template = workflow.run.promptTemplate;
|
|
98
|
-
let out = "";
|
|
99
|
-
let last = 0;
|
|
100
|
-
const append = (text, isValue) => {
|
|
101
|
-
let t = text;
|
|
102
|
-
if (!isValue) {
|
|
103
|
-
t = t.replace(/[ \t]{2,}/g, " ");
|
|
104
|
-
if (/[ \t]$/.test(out)) t = t.replace(/^[ \t]+/, "");
|
|
105
|
-
}
|
|
106
|
-
out += t;
|
|
107
|
-
};
|
|
108
|
-
for (const m of template.matchAll(/\{\{\s*([a-z][a-z0-9_]*)\s*\}\}/gi)) {
|
|
109
|
-
append(template.slice(last, m.index), false);
|
|
110
|
-
const field = byName.get(m[1]);
|
|
111
|
-
append(field ? fragment(field, inputs[m[1]], ctx) : "", true);
|
|
112
|
-
last = m.index + m[0].length;
|
|
113
|
-
}
|
|
114
|
-
append(template.slice(last), false);
|
|
115
|
-
return out.trim();
|
|
116
|
-
}
|
|
117
|
-
function buildLaunch(workflow, inputs, agentId) {
|
|
118
|
-
const scopeField = workflow.inputs.find(isFileField);
|
|
119
|
-
const raw = scopeField ? inputs[scopeField.name] : void 0;
|
|
120
|
-
const scope = isWorkflowScope(raw) ? raw : { ...EMPTY_WORKFLOW_SCOPE };
|
|
121
|
-
return { workflow, inputs, scope, agentId: agentId || workflow.defaultAgentId || void 0 };
|
|
122
|
-
}
|
|
123
|
-
function workflowAccepts(workflow) {
|
|
124
|
-
const kinds = /* @__PURE__ */ new Set();
|
|
125
|
-
for (const field of workflow.inputs) if (field.context) kinds.add(field.context);
|
|
126
|
-
return [...kinds];
|
|
127
|
-
}
|
|
128
|
-
function workflowsAccepting(workflows, supplied) {
|
|
129
|
-
return workflows.filter((w) => workflowAccepts(w).some((k) => supplied.includes(k)));
|
|
130
|
-
}
|
|
131
|
-
function workflowsForHost(workflows, host) {
|
|
132
|
-
return workflows.filter((w) => !w.host || w.host === host);
|
|
133
|
-
}
|
|
134
|
-
function inputsFromContext(workflow, context) {
|
|
135
|
-
const inputs = {};
|
|
136
|
-
for (const field of workflow.inputs) {
|
|
137
|
-
if (!field.context) continue;
|
|
138
|
-
if (field.context === "selection") {
|
|
139
|
-
if (context.selection) inputs[field.name] = context.selection;
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
const ids = field.context === "image" ? context.image ? [context.image] : [] : context.documents;
|
|
143
|
-
if (ids?.length && isFileField(field)) {
|
|
144
|
-
inputs[field.name] = { folders: [], labels: [], documents: ids.slice(0, field.max ?? 1) };
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return inputs;
|
|
148
|
-
}
|
|
149
|
-
var SKILL_PROMPT_LABEL = "What should it work on?";
|
|
150
|
-
var SKILL_PROMPT_FALLBACK_PLACEHOLDER = "Describe what you want";
|
|
151
|
-
var plainHint = (hint) => hint.replace(/^[<[]\s*|\s*[>\]]$/g, "").trim();
|
|
152
|
-
function skillToWorkflow(skill) {
|
|
153
|
-
const hint = plainHint((skill.arg_hint ?? "").trim());
|
|
154
|
-
const inputs = [
|
|
155
|
-
{
|
|
156
|
-
name: "args",
|
|
157
|
-
type: "longtext",
|
|
158
|
-
label: SKILL_PROMPT_LABEL,
|
|
159
|
-
placeholder: hint || SKILL_PROMPT_FALLBACK_PLACEHOLDER,
|
|
160
|
-
required: true
|
|
161
|
-
}
|
|
162
|
-
];
|
|
163
|
-
return {
|
|
164
|
-
id: skill.slug,
|
|
165
|
-
skill: skill.slug,
|
|
166
|
-
title: skill.name || skill.slug,
|
|
167
|
-
description: skill.description ?? "",
|
|
168
|
-
inputs,
|
|
169
|
-
run: { kind: "prompt", promptTemplate: `/${skill.slug} {{args}}` },
|
|
170
|
-
landing: "chat",
|
|
171
|
-
schedulable: true
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
function skillTitle(name) {
|
|
175
|
-
if (!/^[a-z0-9]+(?:[-_][a-z0-9]+)*$/.test(name)) return name;
|
|
176
|
-
const words = name.replace(/[-_]+/g, " ");
|
|
177
|
-
return words.charAt(0).toUpperCase() + words.slice(1);
|
|
178
|
-
}
|
|
179
|
-
function mergeSkillWorkflows(host, listings) {
|
|
180
|
-
const hostIds = new Set(host.map((w) => w.id));
|
|
181
|
-
const skills = listings.filter((s) => !(s.visibility === "builtin" && hostIds.has(s.slug))).map((s) => ({
|
|
182
|
-
...skillToWorkflow({
|
|
183
|
-
name: skillTitle(s.name || s.slug),
|
|
184
|
-
slug: s.slug,
|
|
185
|
-
description: s.description ?? void 0,
|
|
186
|
-
arg_hint: s.arg_hint ?? void 0
|
|
187
|
-
}),
|
|
188
|
-
icon: "skill"
|
|
189
|
-
})).sort((a, b) => a.id.localeCompare(b.id));
|
|
190
|
-
const shadowed = new Set(skills.map((w) => w.id));
|
|
191
|
-
return { host: host.filter((w) => !shadowed.has(w.id)), skills };
|
|
192
|
-
}
|
|
193
|
-
var FIELD_TYPES = [
|
|
194
|
-
"text",
|
|
195
|
-
"longtext",
|
|
196
|
-
"boolean",
|
|
197
|
-
"select",
|
|
198
|
-
"number",
|
|
199
|
-
"date",
|
|
200
|
-
"scope",
|
|
201
|
-
"documents"
|
|
202
|
-
];
|
|
203
|
-
var str = (v) => typeof v === "string" ? v : void 0;
|
|
204
|
-
var num = (v) => typeof v === "number" ? v : void 0;
|
|
205
|
-
var bool = (v) => typeof v === "boolean" ? v : void 0;
|
|
206
|
-
function fieldFromFrontmatter(raw) {
|
|
207
|
-
if (typeof raw !== "object" || raw === null) return null;
|
|
208
|
-
const r = raw;
|
|
209
|
-
const name = str(r.name);
|
|
210
|
-
const type = FIELD_TYPES.find((t) => t === r.type);
|
|
211
|
-
if (!name || !/^[a-z][a-z0-9_]*$/.test(name) || !type) return null;
|
|
212
|
-
const options = Array.isArray(r.options) ? r.options.flatMap((o) => {
|
|
213
|
-
const ro = o;
|
|
214
|
-
const value = str(ro?.value);
|
|
215
|
-
const label = str(ro?.label);
|
|
216
|
-
return value && label ? [
|
|
217
|
-
{
|
|
218
|
-
value,
|
|
219
|
-
label,
|
|
220
|
-
description: str(ro.description),
|
|
221
|
-
text: str(ro.text),
|
|
222
|
-
icon: str(ro.icon),
|
|
223
|
-
tone: chunk32HW2Q33_cjs.isTone(ro.tone) ? ro.tone : void 0
|
|
224
|
-
}
|
|
225
|
-
] : [];
|
|
226
|
-
}) : void 0;
|
|
227
|
-
return {
|
|
228
|
-
name,
|
|
229
|
-
type,
|
|
230
|
-
label: str(r.label) ?? name,
|
|
231
|
-
description: str(r.description),
|
|
232
|
-
placeholder: str(r.placeholder),
|
|
233
|
-
required: bool(r.required),
|
|
234
|
-
default: r.default,
|
|
235
|
-
options,
|
|
236
|
-
min: num(r.min),
|
|
237
|
-
max: num(r.max),
|
|
238
|
-
trueText: str(r.true_text),
|
|
239
|
-
falseText: str(r.false_text),
|
|
240
|
-
advanced: bool(r.advanced),
|
|
241
|
-
accept: r.accept === "image" ? "image" : void 0,
|
|
242
|
-
context: r.context === "documents" || r.context === "selection" || r.context === "image" ? r.context : void 0,
|
|
243
|
-
by: Array.isArray(r.by) ? r.by.filter((b) => b === "folders" || b === "labels") : void 0
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
function workflowFromFrontmatter(id, frontmatter, body) {
|
|
247
|
-
const inputs = Array.isArray(frontmatter.inputs) ? frontmatter.inputs.flatMap((f) => {
|
|
248
|
-
const field = fieldFromFrontmatter(f);
|
|
249
|
-
return field ? [field] : [];
|
|
250
|
-
}) : [];
|
|
251
|
-
return {
|
|
252
|
-
id,
|
|
253
|
-
title: str(frontmatter.name) ?? id,
|
|
254
|
-
description: str(frontmatter.description) ?? "",
|
|
255
|
-
icon: str(frontmatter.icon),
|
|
256
|
-
inputs,
|
|
257
|
-
run: { kind: "prompt", promptTemplate: body.trim() },
|
|
258
|
-
landing: frontmatter.landing === "files" ? "files" : "chat",
|
|
259
|
-
requiresFiles: bool(frontmatter.requires_files),
|
|
260
|
-
schedulable: bool(frontmatter.schedulable) ?? true
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
function fieldToFrontmatter(field) {
|
|
264
|
-
return compact({
|
|
265
|
-
name: field.name,
|
|
266
|
-
type: field.type,
|
|
267
|
-
label: field.label,
|
|
268
|
-
description: field.description,
|
|
269
|
-
placeholder: field.placeholder,
|
|
270
|
-
required: field.required,
|
|
271
|
-
default: field.default,
|
|
272
|
-
options: field.options?.map(
|
|
273
|
-
(o) => compact({
|
|
274
|
-
value: o.value,
|
|
275
|
-
label: o.label,
|
|
276
|
-
description: o.description,
|
|
277
|
-
text: o.text,
|
|
278
|
-
icon: o.icon,
|
|
279
|
-
tone: o.tone
|
|
280
|
-
})
|
|
281
|
-
),
|
|
282
|
-
min: field.min,
|
|
283
|
-
max: field.max,
|
|
284
|
-
true_text: field.trueText,
|
|
285
|
-
false_text: field.falseText,
|
|
286
|
-
advanced: field.advanced,
|
|
287
|
-
by: field.by,
|
|
288
|
-
accept: field.accept,
|
|
289
|
-
context: field.context
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
var compact = (o) => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== void 0));
|
|
293
|
-
|
|
294
12
|
// src/agents/workflows/run.ts
|
|
295
13
|
function workflowSteps(workflow) {
|
|
296
14
|
return workflow.run.kind === "steps" ? workflow.run.steps : [];
|
|
@@ -367,7 +85,7 @@ var STEP_EVENTS = {
|
|
|
367
85
|
step_skipped: "skipped",
|
|
368
86
|
step_failed: "failed"
|
|
369
87
|
};
|
|
370
|
-
var
|
|
88
|
+
var str = (v) => typeof v === "string" && v ? v : void 0;
|
|
371
89
|
var ACTION_TYPES = ["sign", "email_draft", "tabular_review"];
|
|
372
90
|
var asAction = (v) => ACTION_TYPES.includes(v) ? v : void 0;
|
|
373
91
|
var asRecord = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : void 0;
|
|
@@ -382,17 +100,17 @@ function waitingForDocumentsText(count) {
|
|
|
382
100
|
return `Waiting for ${count} ${count === 1 ? "document" : "documents"} to finish processing`;
|
|
383
101
|
}
|
|
384
102
|
function reopenedBy(detail) {
|
|
385
|
-
const to =
|
|
103
|
+
const to = str(detail.to);
|
|
386
104
|
return asStrings(detail.reopened) ?? (to ? [to] : []);
|
|
387
105
|
}
|
|
388
106
|
function stepStatesFromActivity(events) {
|
|
389
107
|
const states = {};
|
|
390
108
|
for (const e of events) {
|
|
391
109
|
const detail = e.detail ?? {};
|
|
392
|
-
const step =
|
|
110
|
+
const step = str(detail.step);
|
|
393
111
|
if (!step) continue;
|
|
394
112
|
if (e.kind === "step_sent_back") {
|
|
395
|
-
const to =
|
|
113
|
+
const to = str(detail.to);
|
|
396
114
|
for (const id of reopenedBy(detail))
|
|
397
115
|
states[id] = id === to ? {
|
|
398
116
|
status: "pending",
|
|
@@ -402,7 +120,7 @@ function stepStatesFromActivity(events) {
|
|
|
402
120
|
continue;
|
|
403
121
|
}
|
|
404
122
|
if (e.kind === "step_ready") {
|
|
405
|
-
states[step] = { ...states[step] ?? { status: "pending" }, announcedTo:
|
|
123
|
+
states[step] = { ...states[step] ?? { status: "pending" }, announcedTo: str(detail.to) };
|
|
406
124
|
continue;
|
|
407
125
|
}
|
|
408
126
|
if (e.kind === "step_progress") {
|
|
@@ -414,7 +132,7 @@ function stepStatesFromActivity(events) {
|
|
|
414
132
|
const status = STEP_EVENTS[e.kind];
|
|
415
133
|
if (!status) continue;
|
|
416
134
|
const before = states[step];
|
|
417
|
-
const responseId =
|
|
135
|
+
const responseId = str(detail.response_id) ?? before?.responseId ?? null;
|
|
418
136
|
const startedAt = status === "running" ? e.created_at : before?.startedAt;
|
|
419
137
|
const action = asAction(detail.action) ?? before?.action;
|
|
420
138
|
const documents = asStrings(detail.documents) ?? before?.documents;
|
|
@@ -422,12 +140,12 @@ function stepStatesFromActivity(events) {
|
|
|
422
140
|
const output = status === "done" ? asRecord(detail.output) : void 0;
|
|
423
141
|
const approved = Array.isArray(detail.approved) ? detail.approved.filter(asRecord) : void 0;
|
|
424
142
|
const finished2 = status === "done" || status === "skipped" || status === "failed";
|
|
425
|
-
const declinedBy =
|
|
143
|
+
const declinedBy = str(detail.declined_by);
|
|
426
144
|
const afterFailure = status === "skipped" && (before?.status === "failed" || !!before?.skippedAfterFailure);
|
|
427
145
|
states[step] = {
|
|
428
146
|
status,
|
|
429
147
|
responseId,
|
|
430
|
-
error:
|
|
148
|
+
error: str(detail.error) ?? (afterFailure ? before?.error ?? null : null),
|
|
431
149
|
...afterFailure ? { skippedAfterFailure: true } : {},
|
|
432
150
|
...startedAt ? { startedAt } : {},
|
|
433
151
|
...action ? { action } : {},
|
|
@@ -450,7 +168,7 @@ function runFields(workflow) {
|
|
|
450
168
|
return [...workflow.inputs, ...workflowSteps(workflow).flatMap(stepFields)];
|
|
451
169
|
}
|
|
452
170
|
function initialRunInputs(workflow, inputs = {}) {
|
|
453
|
-
return { ...defaultInputs({ ...workflow, inputs: runFields(workflow) }), ...inputs };
|
|
171
|
+
return { ...chunk76L6LOP3_cjs.defaultInputs({ ...workflow, inputs: runFields(workflow) }), ...inputs };
|
|
454
172
|
}
|
|
455
173
|
var finished = (s) => s?.status === "done" || s?.status === "skipped";
|
|
456
174
|
function stepPhase(steps, states, id) {
|
|
@@ -492,11 +210,15 @@ function failedUpstream(steps, states, id) {
|
|
|
492
210
|
function validateStep(step, inputs) {
|
|
493
211
|
const fields = stepFields(step);
|
|
494
212
|
if (!fields.length) return {};
|
|
495
|
-
return validateInputs(
|
|
213
|
+
return chunk76L6LOP3_cjs.validateInputs(
|
|
496
214
|
{
|
|
497
215
|
id: step.id,
|
|
498
216
|
title: step.title,
|
|
499
|
-
|
|
217
|
+
description: "",
|
|
218
|
+
inputs: fields,
|
|
219
|
+
run: { kind: "operation" },
|
|
220
|
+
landing: "chat"
|
|
221
|
+
},
|
|
500
222
|
inputs
|
|
501
223
|
);
|
|
502
224
|
}
|
|
@@ -586,11 +308,11 @@ function composeStepPrompt(workflow, step, runInputs, { resolveWorkflow, compose
|
|
|
586
308
|
if (step.workflow) {
|
|
587
309
|
const target = resolveWorkflow?.(step.workflow);
|
|
588
310
|
if (!target) return "";
|
|
589
|
-
const inputs = { ...defaultInputs(target), ...fillStepInputs(step.with, runInputs) };
|
|
590
|
-
return target.run.kind === "prompt" ? composeWorkflowPrompt(target, inputs) : compose?.(target.id, inputs, runInputs) ?? "";
|
|
311
|
+
const inputs = { ...chunk76L6LOP3_cjs.defaultInputs(target), ...fillStepInputs(step.with, runInputs) };
|
|
312
|
+
return target.run.kind === "prompt" ? chunk76L6LOP3_cjs.composeWorkflowPrompt(target, inputs) : compose?.(target.id, inputs, runInputs) ?? "";
|
|
591
313
|
}
|
|
592
314
|
if (step.run?.kind === "prompt") {
|
|
593
|
-
return composeWorkflowPrompt(
|
|
315
|
+
return chunk76L6LOP3_cjs.composeWorkflowPrompt(
|
|
594
316
|
{ ...workflow, inputs: runFields(workflow), run: step.run },
|
|
595
317
|
runInputs
|
|
596
318
|
);
|
|
@@ -927,9 +649,6 @@ exports.DEFAULT_ASSIGNEE_WORDING = DEFAULT_ASSIGNEE_WORDING;
|
|
|
927
649
|
exports.DEFAULT_STEP_DOCUMENT_LABELS = DEFAULT_STEP_DOCUMENT_LABELS;
|
|
928
650
|
exports.DEFAULT_STEP_KIND_LABELS = DEFAULT_STEP_KIND_LABELS;
|
|
929
651
|
exports.DEFAULT_STEP_RECORD_LABELS = DEFAULT_STEP_RECORD_LABELS;
|
|
930
|
-
exports.EMPTY_WORKFLOW_SCOPE = EMPTY_WORKFLOW_SCOPE;
|
|
931
|
-
exports.SKILL_PROMPT_FALLBACK_PLACEHOLDER = SKILL_PROMPT_FALLBACK_PLACEHOLDER;
|
|
932
|
-
exports.SKILL_PROMPT_LABEL = SKILL_PROMPT_LABEL;
|
|
933
652
|
exports.STEP_KIND_ICONS = STEP_KIND_ICONS;
|
|
934
653
|
exports.StepBadgeMark = StepBadgeMark;
|
|
935
654
|
exports.StepChip = StepChip;
|
|
@@ -938,30 +657,21 @@ exports.StepDocumentCards = StepDocumentCards;
|
|
|
938
657
|
exports.StepRecord = StepRecord;
|
|
939
658
|
exports.WORKFLOW_STEP_KINDS = WORKFLOW_STEP_KINDS;
|
|
940
659
|
exports.assigneeName = assigneeName;
|
|
941
|
-
exports.buildLaunch = buildLaunch;
|
|
942
660
|
exports.canAssign = canAssign;
|
|
943
661
|
exports.composeStepPrompt = composeStepPrompt;
|
|
944
|
-
exports.composeWorkflowPrompt = composeWorkflowPrompt;
|
|
945
|
-
exports.defaultInputs = defaultInputs;
|
|
946
662
|
exports.dependsOn = dependsOn;
|
|
947
663
|
exports.eventWaitingDocuments = eventWaitingDocuments;
|
|
948
664
|
exports.failedUpstream = failedUpstream;
|
|
949
|
-
exports.fieldToFrontmatter = fieldToFrontmatter;
|
|
950
665
|
exports.fillRunText = fillRunText;
|
|
951
666
|
exports.fillStepInputs = fillStepInputs;
|
|
952
667
|
exports.formatDate = formatDate;
|
|
953
668
|
exports.initialRunInputs = initialRunInputs;
|
|
954
|
-
exports.inputsFromContext = inputsFromContext;
|
|
955
|
-
exports.isEmptyWorkflowScope = isEmptyWorkflowScope;
|
|
956
669
|
exports.isPersonAction = isPersonAction;
|
|
957
670
|
exports.isPersonStep = isPersonStep;
|
|
958
671
|
exports.isRunFinished = isRunFinished;
|
|
959
672
|
exports.isSteppedWorkflow = isSteppedWorkflow;
|
|
960
|
-
exports.isWorkflowScope = isWorkflowScope;
|
|
961
|
-
exports.mergeSkillWorkflows = mergeSkillWorkflows;
|
|
962
673
|
exports.nextAction = nextAction;
|
|
963
674
|
exports.orderSteps = orderSteps;
|
|
964
|
-
exports.promptFieldName = promptFieldName;
|
|
965
675
|
exports.reviewInstructions = reviewInstructions;
|
|
966
676
|
exports.rootFontSizePx = rootFontSizePx;
|
|
967
677
|
exports.runFields = runFields;
|
|
@@ -969,8 +679,6 @@ exports.runFieldsOf = runFieldsOf;
|
|
|
969
679
|
exports.runThreadTitle = runThreadTitle;
|
|
970
680
|
exports.sendBackTargets = sendBackTargets;
|
|
971
681
|
exports.shownValue = shownValue;
|
|
972
|
-
exports.skillTitle = skillTitle;
|
|
973
|
-
exports.skillToWorkflow = skillToWorkflow;
|
|
974
682
|
exports.splitDocRef = splitDocRef;
|
|
975
683
|
exports.stepConfigProblems = stepConfigProblems;
|
|
976
684
|
exports.stepDependencies = stepDependencies;
|
|
@@ -983,15 +691,10 @@ exports.stepStatesFromActivity = stepStatesFromActivity;
|
|
|
983
691
|
exports.upstreamSteps = upstreamSteps;
|
|
984
692
|
exports.useElementSize = useElementSize;
|
|
985
693
|
exports.useMentionAutocomplete = useMentionAutocomplete;
|
|
986
|
-
exports.validateInputs = validateInputs;
|
|
987
694
|
exports.validateStep = validateStep;
|
|
988
695
|
exports.validateWorkflowGraph = validateWorkflowGraph;
|
|
989
696
|
exports.waitingDocuments = waitingDocuments;
|
|
990
697
|
exports.waitingForDocumentsText = waitingForDocumentsText;
|
|
991
|
-
exports.workflowAccepts = workflowAccepts;
|
|
992
|
-
exports.workflowFromFrontmatter = workflowFromFrontmatter;
|
|
993
698
|
exports.workflowSteps = workflowSteps;
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
//# sourceMappingURL=chunk-OWCEQKAR.cjs.map
|
|
997
|
-
//# sourceMappingURL=chunk-OWCEQKAR.cjs.map
|
|
699
|
+
//# sourceMappingURL=chunk-JSTKEZBS.cjs.map
|
|
700
|
+
//# sourceMappingURL=chunk-JSTKEZBS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agents/workflows/run.ts","../src/agents/workflows/StepDocuments.tsx","../src/agents/workflows/stepKinds.ts","../src/chat/useMentionAutocomplete.ts","../src/agents/workflows/StepChip.tsx","../src/lib/useElementSize.ts"],"names":["before","waiting","finished","defaultInputs","validateInputs","composeWorkflowPrompt","jsxs","jsx","FileText","Button","cn","FileInput","Upload","Bot","ClipboardCheck","PenLine","Mail","Table2","useState","useEffect","useMemo","findMentionQuery","filterMentionCandidates","useCallback","insertMention","useListKeyNav","Fragment","Check","Loader2","Hourglass","AlertTriangle","MinusCircle","forwardRef","StepChip","useLayoutEffect","observeResize"],"mappings":"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","file":"chunk-JSTKEZBS.cjs","sourcesContent":["/**\n * The model of a stepped workflow (`run: { kind: 'steps' }`): the steps form a graph (each waits\n * for the steps in its `after`), and a run's progress is each step's `WorkflowStepState`, as the\n * run's thread records it (`stepStatesFromActivity`). Pure functions, shared by the thread runner\n * (`useWorkflowThread`), the builder's preview and the thread's top bar.\n */\n\nimport type {\n WorkflowActionStep,\n WorkflowActionType,\n WorkflowAgentStep,\n WorkflowAssignee,\n WorkflowDocumentRef,\n WorkflowField,\n WorkflowDefinition,\n WorkflowErrors,\n WorkflowInputs,\n WorkflowInputValue,\n WorkflowReviewStep,\n WorkflowStep,\n WorkflowStepState,\n WorkflowStepStatus,\n} from './types'\nimport { composeWorkflowPrompt, defaultInputs, validateInputs } from './workflow'\n\n/** A stepped workflow's steps; empty for a single-run one. */\nexport function workflowSteps(workflow: WorkflowDefinition): WorkflowStep[] {\n return workflow.run.kind === 'steps' ? workflow.run.steps : []\n}\n\nexport const isSteppedWorkflow = (workflow: WorkflowDefinition): boolean =>\n workflow.run.kind === 'steps'\n\n/* ------------------------------- graph ------------------------------- */\n\n/** What a step waits for: its `after`, else the step before it in the list (a sequence). */\nexport function stepDependencies(steps: WorkflowStep[], id: string): string[] {\n const i = steps.findIndex((s) => s.id === id)\n if (i < 0) return []\n return steps[i].after ?? (i > 0 ? [steps[i - 1].id] : [])\n}\n\n/** `a` waits for `b`, directly or through other steps. */\nexport function dependsOn(steps: WorkflowStep[], a: string, b: string): boolean {\n const seen = new Set<string>()\n const stack = [...stepDependencies(steps, a)]\n while (stack.length) {\n const id = stack.pop() as string\n if (id === b) return true\n if (seen.has(id)) continue\n seen.add(id)\n stack.push(...stepDependencies(steps, id))\n }\n return false\n}\n\n/**\n * The steps in dependency order, keeping the given order wherever the graph allows (a stable\n * topological sort). Every implicit dependency is written out as `after` first, so reordering\n * never changes what a step waits for. Steps in a cycle keep their place at the end; validation\n * reports them.\n */\nexport function orderSteps(steps: WorkflowStep[]): WorkflowStep[] {\n const explicit = steps.map((s) => ({ ...s, after: stepDependencies(steps, s.id) }))\n const known = new Set(explicit.map((s) => s.id))\n const placed = new Set<string>()\n const out: WorkflowStep[] = []\n let progress = true\n while (out.length < explicit.length && progress) {\n progress = false\n for (const s of explicit) {\n if (placed.has(s.id)) continue\n if (s.after.every((d) => placed.has(d) || !known.has(d))) {\n out.push(s)\n placed.add(s.id)\n progress = true\n break\n }\n }\n }\n return [...out, ...explicit.filter((s) => !placed.has(s.id))]\n}\n\nexport type WorkflowGraphProblem =\n | { code: 'duplicate'; step: string }\n | { code: 'unknown'; step: string; dependency: string }\n | { code: 'cycle'; step: string }\n | { code: 'order'; step: string; dependency: string }\n\n/** What makes a stepped workflow unrunnable. Empty = valid. */\nexport function validateWorkflowGraph(steps: WorkflowStep[]): WorkflowGraphProblem[] {\n const problems: WorkflowGraphProblem[] = []\n const ids = new Set<string>()\n for (const s of steps) {\n if (ids.has(s.id)) problems.push({ code: 'duplicate', step: s.id })\n ids.add(s.id)\n }\n steps.forEach((s, i) => {\n for (const d of stepDependencies(steps, s.id)) {\n if (!ids.has(d)) problems.push({ code: 'unknown', step: s.id, dependency: d })\n else if (d === s.id || dependsOn(steps, d, s.id)) problems.push({ code: 'cycle', step: s.id })\n else if (steps.findIndex((x) => x.id === d) > i)\n problems.push({ code: 'order', step: s.id, dependency: d })\n }\n })\n return problems\n}\n\n/**\n * The steps by depth (the longest chain before each): what the stepper shows side by side.\n * A sequence is one step per level.\n */\nexport function stepLevels(steps: WorkflowStep[]): WorkflowStep[][] {\n const depth = new Map<string, number>()\n for (const s of steps) {\n const deps = stepDependencies(steps, s.id).filter((d) => depth.has(d))\n depth.set(s.id, deps.length ? Math.max(...deps.map((d) => depth.get(d) as number)) + 1 : 0)\n }\n const levels: WorkflowStep[][] = []\n for (const s of steps) (levels[depth.get(s.id) as number] ??= []).push(s)\n return levels.filter(Boolean)\n}\n\n/* ----------------------------- progress ----------------------------- */\n\n/** One entry of a thread's activity log, as far as steps are concerned. */\nexport interface WorkflowActivityEvent {\n kind: string\n detail?: Record<string, unknown> | null\n actor_ext_id?: string | null\n created_at?: string\n}\n\nconst STEP_EVENTS: Record<string, WorkflowStepStatus> = {\n step_started: 'running',\n step_waiting: 'waiting',\n step_done: 'done',\n step_skipped: 'skipped',\n step_failed: 'failed',\n}\n\nconst str = (v: unknown): string | undefined => (typeof v === 'string' && v ? v : undefined)\nconst ACTION_TYPES: readonly WorkflowActionType[] = ['sign', 'email_draft', 'tabular_review']\nconst asAction = (v: unknown): WorkflowActionType | undefined =>\n ACTION_TYPES.includes(v as WorkflowActionType) ? (v as WorkflowActionType) : undefined\nconst asRecord = (v: unknown): Record<string, unknown> | undefined =>\n v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : undefined\nconst asStrings = (v: unknown): string[] | undefined =>\n Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : undefined\n\n/**\n * The documents (ids) a `waiting` step waits on to finish processing before its turn starts\n * (`waiting.documents`, from `step_waiting` and then `step_progress` as the set shrinks); none for\n * any other step. Action steps wait on people, not documents.\n */\nexport function waitingDocuments(state: WorkflowStepState | undefined): string[] {\n return state?.status === 'waiting' ? (asStrings(state.waiting?.documents) ?? []) : []\n}\n\n/** The documents a `step_waiting` / `step_progress` event names, if it names any. */\nexport function eventWaitingDocuments(detail: Record<string, unknown> | null | undefined) {\n return asStrings(asRecord(detail?.waiting)?.documents)\n}\n\n/** \"Waiting for 3 documents to finish processing\" (one: \"1 document\"). */\nexport function waitingForDocumentsText(count: number): string {\n return `Waiting for ${count} ${count === 1 ? 'document' : 'documents'} to finish processing`\n}\n\n/** The steps a `step_sent_back` reopens: its `reopened` list, else the one it went `to`. */\nfunction reopenedBy(detail: Record<string, unknown>): string[] {\n const to = str(detail.to)\n return asStrings(detail.reopened) ?? (to ? [to] : [])\n}\n\n/**\n * Each step's state from the thread's activity log (oldest first): its latest step event wins.\n * A send-back reopens the steps it lists as pending (only the one it went `to` is `sentBack`); a\n * `step_ready` records who was told and a `step_progress` what a waiting step now waits on, until\n * the step's next change. Mirrors the server (`workflow_steps.progress`).\n */\nexport function stepStatesFromActivity(\n events: WorkflowActivityEvent[]\n): Record<string, WorkflowStepState> {\n const states: Record<string, WorkflowStepState> = {}\n for (const e of events) {\n const detail = e.detail ?? {}\n const step = str(detail.step)\n if (!step) continue\n if (e.kind === 'step_sent_back') {\n const to = str(detail.to)\n for (const id of reopenedBy(detail))\n states[id] =\n id === to\n ? {\n status: 'pending',\n sentBack: true,\n hasNote: typeof detail.note_encrypted === 'string',\n }\n : { status: 'pending' }\n continue\n }\n if (e.kind === 'step_ready') {\n states[step] = { ...(states[step] ?? { status: 'pending' }), announcedTo: str(detail.to) }\n continue\n }\n if (e.kind === 'step_progress') {\n const before = states[step]\n const waiting = asRecord(detail.waiting)\n if (before?.status === 'waiting' && waiting) states[step] = { ...before, waiting }\n continue\n }\n const status = STEP_EVENTS[e.kind]\n if (!status) continue\n const before = states[step]\n const responseId = str(detail.response_id) ?? before?.responseId ?? null\n const startedAt = status === 'running' ? e.created_at : before?.startedAt\n const action = asAction(detail.action) ?? before?.action\n const documents = asStrings(detail.documents) ?? before?.documents\n const waiting = status === 'waiting' ? asRecord(detail.waiting) : undefined\n const output = status === 'done' ? asRecord(detail.output) : undefined\n const approved = Array.isArray(detail.approved)\n ? (detail.approved.filter(asRecord) as WorkflowStepState['approved'])\n : undefined\n const finished = status === 'done' || status === 'skipped' || status === 'failed'\n const declinedBy = str(detail.declined_by)\n // Skipped while it stood failed: what waits for it goes on without its result, and says so.\n const afterFailure =\n status === 'skipped' && (before?.status === 'failed' || !!before?.skippedAfterFailure)\n states[step] = {\n status,\n responseId,\n error: str(detail.error) ?? (afterFailure ? (before?.error ?? null) : null),\n ...(afterFailure ? { skippedAfterFailure: true } : {}),\n ...(startedAt ? { startedAt } : {}),\n ...(action ? { action } : {}),\n ...(documents?.length ? { documents } : {}),\n ...(waiting ? { waiting } : {}),\n ...(output ? { output } : {}),\n ...(approved ? { approved } : {}),\n ...(finished ? { by: e.actor_ext_id ?? null } : {}),\n ...(finished && e.created_at ? { at: e.created_at } : {}),\n ...(declinedBy ? { declinedBy } : {}),\n }\n }\n return states\n}\n\n/** The fields a person fills in on a step: a form's inputs, a review's fields. */\nexport function stepFields(step: WorkflowStep): WorkflowField[] {\n return step.kind === 'form' ? step.inputs : step.kind === 'review' ? (step.fields ?? []) : []\n}\n\n/** The fields the steps ask for (forms and reviews), in plan order. */\nexport const runFieldsOf = (steps: WorkflowStep[]): WorkflowField[] => steps.flatMap(stepFields)\n\n/** Every field the run asks for: the launch form's, then each form's and review's. */\nexport function runFields(workflow: WorkflowDefinition): WorkflowField[] {\n return [...workflow.inputs, ...workflowSteps(workflow).flatMap(stepFields)]\n}\n\n/** A fresh run's inputs: every field at its default, then the prefills. */\nexport function initialRunInputs(\n workflow: WorkflowDefinition,\n inputs: WorkflowInputs = {}\n): WorkflowInputs {\n return { ...defaultInputs({ ...workflow, inputs: runFields(workflow) }), ...inputs }\n}\n\nconst finished = (s: WorkflowStepState | undefined): boolean =>\n s?.status === 'done' || s?.status === 'skipped'\n\n/**\n * Where a step stands: `blocked` until everything it waits for has finished (done or skipped),\n * then `ready`, then its own status (`waiting`: an action step waiting on its people).\n */\nexport type WorkflowStepPhase =\n 'blocked' | 'ready' | 'running' | 'waiting' | 'done' | 'skipped' | 'failed'\n\nexport function stepPhase(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n id: string\n): WorkflowStepPhase {\n const s = states[id]\n if (s && s.status !== 'pending') return s.status\n return stepDependencies(steps, id).every((d) => finished(states[d])) ? 'ready' : 'blocked'\n}\n\nexport const isRunFinished = (\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>\n): boolean => steps.length > 0 && steps.every((s) => finished(states[s.id]))\n\n/** A step a person does (form, upload, review); agent and action steps start by themselves. */\nexport const isPersonStep = (step: WorkflowStep): boolean =>\n step.kind !== 'agent' && step.kind !== 'action'\n\n/** An action step whose waiting phase is a person's: signing, sending the email. */\nexport const isPersonAction = (step: WorkflowStep): step is WorkflowActionStep =>\n step.kind === 'action' && (step.action.type === 'sign' || step.action.type === 'email_draft')\n\n/** A step that can have an assignee and a reminder: a person step, or a signature or email. */\nexport const canAssign = (step: WorkflowStep): boolean => isPersonStep(step) || isPersonAction(step)\n\n/**\n * What the primary button does on the step in view:\n * - `complete`: finish this form, upload or review (approve) and move on;\n * - `move`: view the next step: this one is finished, or the next does not wait for it;\n * - `start`: start this agent or action step: it is ready but no run is under way to start it\n * (the run has no thread yet, or the server could not start it);\n * - `retry`: run this failed step again (what waits for it needs its result; skipping it is the\n * person's explicit choice, never the primary button);\n * - `finish`: show the completion (every step has finished);\n * - `wait`: nothing yet (this step is under way and the next waits for it, or it is blocked).\n */\nexport type WorkflowNextAction = 'complete' | 'move' | 'start' | 'retry' | 'finish' | 'wait'\n\nexport interface NextActionOptions {\n /**\n * No run is under way to start a ready agent or action step: the run's thread does not exist\n * yet (a run whose first open step is an agent step), or the server is not running it.\n */\n needsStart?: boolean\n /** The host can run a failed step again. */\n canRetry?: boolean\n}\n\nexport function nextAction(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n current: string | null,\n { needsStart = false, canRetry = false }: NextActionOptions = {}\n): WorkflowNextAction {\n const i = steps.findIndex((s) => s.id === current)\n const step = steps[i]\n if (!step) return 'wait'\n const phase = stepPhase(steps, states, step.id)\n if (phase === 'blocked') return 'wait'\n const following = steps[i + 1]\n const independentNext = !!following && !dependsOn(steps, following.id, step.id)\n if (phase === 'done' || phase === 'skipped') {\n if (following) return 'move'\n return isRunFinished(steps, states) ? 'finish' : 'wait'\n }\n if (isPersonStep(step)) return 'complete'\n // An email draft is done when its person says it is sent; a signature, when its signers sign.\n if (phase === 'waiting' && step.kind === 'action' && step.action.type === 'email_draft')\n return 'complete'\n // Ready, but nothing will start it unless the person does (no thread yet, or no run under way).\n if (phase === 'ready' && needsStart) return 'start'\n // An agent step on its way (about to start, or running): look ahead if nothing there waits for it.\n if (phase !== 'failed') return independentNext ? 'move' : 'wait'\n // A failed step is never passed over by the primary button: what waits for it needs its result.\n // Retry it; skipping it anyway is a separate, explicit choice.\n const waitedFor = steps.slice(i + 1).some((s) => dependsOn(steps, s.id, step.id))\n if (!waitedFor && following) return 'move'\n return canRetry ? 'retry' : 'wait'\n}\n\n/**\n * The steps `id` waits for (directly or through others) that failed: still failed (so `id` is\n * blocked until they are retried), or skipped after failing (so `id` goes on without their\n * result). In plan order.\n */\nexport function failedUpstream(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n id: string\n): Array<{ step: WorkflowStep; state: WorkflowStepState }> {\n return upstreamSteps(steps, id).flatMap((s) => {\n const state = states[s.id]\n return state && (state.status === 'failed' || state.skippedAfterFailure)\n ? [{ step: s, state }]\n : []\n })\n}\n\n/** A form's or a fielded review's problems (empty = it can move on); other steps have none. */\nexport function validateStep(step: WorkflowStep, inputs: WorkflowInputs): WorkflowErrors {\n const fields = stepFields(step)\n if (!fields.length) return {}\n return validateInputs(\n {\n id: step.id,\n title: step.title,\n description: '',\n inputs: fields,\n run: { kind: 'operation' },\n landing: 'chat',\n },\n inputs\n )\n}\n\n/* --------------------------- people and documents --------------------------- */\n\n/** Every step `id` waits for, directly or through others, in plan order. */\nexport function upstreamSteps(steps: WorkflowStep[], id: string): WorkflowStep[] {\n return steps.filter((s) => s.id !== id && dependsOn(steps, id, s.id))\n}\n\n/**\n * Where a ready step can send the work back to: an earlier step it waits for that has something\n * to redo (done, skipped or failed), nearest first.\n */\nexport function sendBackTargets(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n id: string\n): WorkflowStep[] {\n return upstreamSteps(steps, id)\n .filter((s) => ['done', 'skipped', 'failed'].includes(states[s.id]?.status ?? 'pending'))\n .reverse()\n}\n\n/** Something a step still needs before it can run, for the builder to point out. */\nexport interface WorkflowStepProblem {\n step: string\n missing: 'document' | 'signers' | 'recipients' | 'tags' | 'documents'\n}\n\nconst isBlankRef = (ref: WorkflowDocumentRef): boolean =>\n 'step' in ref ? !ref.step : 'input' in ref ? !ref.input : !ref.id.trim()\n\n/** What the steps still need before they can run: an action's document, signers, … */\nexport function stepConfigProblems(steps: WorkflowStep[]): WorkflowStepProblem[] {\n const out: WorkflowStepProblem[] = []\n for (const s of steps) {\n if (s.kind === 'action') {\n const a = s.action\n if (a.type === 'sign') {\n if (!a.document || isBlankRef(a.document)) out.push({ step: s.id, missing: 'document' })\n if (!a.signers.length) out.push({ step: s.id, missing: 'signers' })\n } else if (a.type === 'email_draft') {\n if (!a.to.some((t) => t.trim())) out.push({ step: s.id, missing: 'recipients' })\n } else {\n if (!a.tags.length) out.push({ step: s.id, missing: 'tags' })\n if (Array.isArray(a.documents) && !a.documents.length)\n out.push({ step: s.id, missing: 'documents' })\n }\n }\n if (s.kind === 'agent' && s.editDocument && isBlankRef(s.editDocument))\n out.push({ step: s.id, missing: 'document' })\n }\n return out\n}\n\n/** A document version id (`doc-…@v3`) split into the document and its version. */\nexport function splitDocRef(ref: string): { id: string; version?: number } {\n const m = /^(doc-[A-Za-z0-9]+)(?:@v(\\d+))?$/.exec(ref)\n return m ? { id: m[1], ...(m[2] ? { version: Number(m[2]) } : {}) } : { id: ref }\n}\n\n/** How an assignee that names no one directly is described. */\nexport interface AssigneeWording {\n runOwner: string\n projectLead: string\n /** `{field}`: the person field's label. */\n input: string\n}\n\nexport const DEFAULT_ASSIGNEE_WORDING: AssigneeWording = {\n runOwner: 'whoever started the run',\n projectLead: 'the project lead',\n input: 'the person in “{field}”',\n}\n\n/**\n * Who a step is for, in words: the person it was announced to, the member it names, the person a\n * form field holds (each through `nameOf`), else its role. Undefined when it names no one.\n */\nexport function assigneeName(\n assignee: WorkflowAssignee | undefined,\n options: {\n nameOf?: (id: string) => string | undefined\n inputs?: WorkflowInputs\n fields?: WorkflowField[]\n /** Who the server told (the assignee resolved): wins over a role. */\n announcedTo?: string | null\n wording?: Partial<AssigneeWording>\n } = {}\n): string | undefined {\n const w = { ...DEFAULT_ASSIGNEE_WORDING, ...options.wording }\n const name = (id: string) => options.nameOf?.(id) ?? id\n const told = options.announcedTo ? options.nameOf?.(options.announcedTo) : undefined\n if (told) return told\n if (!assignee) return undefined\n if ('user' in assignee) return name(assignee.user)\n if ('input' in assignee) {\n const value = options.inputs?.[assignee.input]\n if (typeof value === 'string' && value) return name(value)\n const label = options.fields?.find((f) => f.name === assignee.input)?.label ?? assignee.input\n return w.input.replace('{field}', label)\n }\n if ('runOwner' in assignee) return w.runOwner\n return w.projectLead\n}\n\n/* ----------------------------- composing ----------------------------- */\n\nconst asText = (value: WorkflowInputValue | undefined): string =>\n typeof value === 'string' ? value.trim() : typeof value === 'number' ? String(value) : ''\n\n/**\n * Fill a step's `with` templates from the run's inputs: `{{a}}`, `{{a || b}}` (first non-blank).\n * A template that is exactly one bare reference passes the value through untouched.\n */\nexport function fillStepInputs(\n templates: Record<string, string> | undefined,\n inputs: WorkflowInputs\n): WorkflowInputs {\n const out: WorkflowInputs = {}\n for (const [name, template] of Object.entries(templates ?? {})) {\n const bare = /^\\{\\{\\s*([a-z][a-z0-9_]*)\\s*\\}\\}$/i.exec(template)\n if (bare) {\n out[name] = inputs[bare[1]] ?? ''\n continue\n }\n out[name] = fillRunText(template, inputs)\n }\n return out\n}\n\n/** A template over the run's inputs, as text (`{{a}}`, `{{a || b}}`). */\nexport function fillRunText(template: string, inputs: WorkflowInputs): string {\n return template\n .replace(/\\{\\{([^}]*)\\}\\}/g, (_, expr: string) => {\n for (const ref of expr.split('||')) {\n const text = asText(inputs[ref.trim()])\n if (text) return text\n }\n return ''\n })\n .trim()\n}\n\n/** The run thread's title: the workflow's `threadTitle` template, else its title. */\nexport function runThreadTitle(workflow: WorkflowDefinition, inputs: WorkflowInputs): string {\n const template = workflow.run.kind === 'steps' ? workflow.run.threadTitle : undefined\n return (template && fillRunText(template, inputs)) || workflow.title\n}\n\n/** What a review asks for: its instructions filled from the run, else its title. */\nexport function reviewInstructions(step: WorkflowReviewStep, inputs: WorkflowInputs): string {\n return (step.instructions && fillRunText(step.instructions, inputs)) || step.title\n}\n\nexport interface StepComposeOptions {\n /** Looks up the workflow a step names (`step.workflow`). */\n resolveWorkflow?: (id: string) => WorkflowDefinition | undefined\n /**\n * The host's wording for `operation` runs: the named workflow's id (or the step's own id when it\n * runs inline), its filled inputs, and the whole run's inputs (e.g. to ground it in the record).\n */\n compose?: (id: string, inputs: WorkflowInputs, runInputs: WorkflowInputs) => string | undefined\n}\n\n/** The prompt an agent step of `workflow` sends; '' when nothing could compose it (no binding). */\nexport function composeStepPrompt(\n workflow: WorkflowDefinition,\n step: WorkflowAgentStep,\n runInputs: WorkflowInputs,\n { resolveWorkflow, compose }: StepComposeOptions = {}\n): string {\n if (step.workflow) {\n const target = resolveWorkflow?.(step.workflow)\n if (!target) return ''\n const inputs = { ...defaultInputs(target), ...fillStepInputs(step.with, runInputs) }\n return target.run.kind === 'prompt'\n ? composeWorkflowPrompt(target, inputs)\n : (compose?.(target.id, inputs, runInputs) ?? '')\n }\n if (step.run?.kind === 'prompt') {\n return composeWorkflowPrompt(\n { ...workflow, inputs: runFields(workflow), run: step.run },\n runInputs\n )\n }\n return compose?.(step.id, runInputs, runInputs) ?? ''\n}\n","/**\n * The documents a step is about — what most steps of real work hand on, review and approve is a\n * document, not a message in the chat. A drafting step's are the versions it produced; an approval's\n * are the drafts it approves (the versions of the steps it waits for while it is open, exactly the\n * versions it recorded once approved). `StepDocumentCards` shows them as cards to open, and\n * `StepRecord` what a finished step recorded: who did it, when, and its answers.\n */\n\nimport { FileText } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { splitDocRef, stepDependencies, stepFields } from './run'\nimport type { WorkflowField, WorkflowStep, WorkflowStepState } from './types'\n\n/** The document versions (`doc-…@v<n>`) a step is about, newest last, each once. */\nexport function stepDocuments(\n steps: WorkflowStep[],\n states: Record<string, WorkflowStepState>,\n id: string\n): string[] {\n const step = steps.find((s) => s.id === id)\n const state = states[id]\n if (!step) return []\n const own = [\n ...(state?.documents ?? []),\n ...((state?.output?.doc_ext_ids as string[] | undefined) ?? []),\n ]\n const refs =\n step.kind !== 'review'\n ? own\n : state?.status === 'done' && state.approved?.length\n ? state.approved.flatMap((e) => e.documents ?? [])\n : stepDependencies(steps, id).flatMap((dep) => states[dep]?.documents ?? [])\n return [...new Set(refs)]\n}\n\nexport interface StepDocumentLabels {\n open: string\n /** An approval's documents, before it is done. */\n toApprove: string\n approved: string\n produced: string\n /** `{version}` is replaced. */\n version: string\n}\n\nexport const DEFAULT_STEP_DOCUMENT_LABELS: StepDocumentLabels = {\n open: 'Open',\n toApprove: 'To approve',\n approved: 'Approved',\n produced: 'Drafted in this step',\n version: 'v{version}',\n}\n\n/** A step's documents as cards: the name, the version, and Open (the host's viewer or editor). */\nexport function StepDocumentCards({\n refs,\n heading,\n nameOfDoc,\n onOpen,\n labels,\n testId,\n}: {\n refs: string[]\n heading: string\n nameOfDoc?: (id: string) => string | undefined\n onOpen?: (ref: string) => void\n labels?: Partial<StepDocumentLabels>\n testId: string\n}) {\n const l = { ...DEFAULT_STEP_DOCUMENT_LABELS, ...labels }\n if (!refs.length) return null\n return (\n <div className=\"space-y-1\" data-testid={testId}>\n <p className=\"px-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {heading}\n </p>\n {refs.map((ref) => {\n const { id, version } = splitDocRef(ref)\n return (\n <div\n key={ref}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-2 py-1.5\"\n data-testid={`${testId}-${id}`}\n >\n <span className=\"wf-badge flex size-7 shrink-0 items-center justify-center rounded-md\">\n <FileText className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span\n className=\"line-clamp-2 block break-words text-sm font-medium leading-snug\"\n title={nameOfDoc?.(id) ?? id}\n >\n {nameOfDoc?.(id) ?? id}\n </span>\n {version && (\n <span className=\"block text-[11px] text-muted-foreground\">\n {l.version.replace('{version}', String(version))}\n </span>\n )}\n </span>\n {onOpen && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 shrink-0 px-2 text-xs\"\n onClick={() => onOpen(ref)}\n data-testid={`${testId}-${id}-open`}\n >\n {l.open}\n </Button>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n\nexport interface StepRecordLabels {\n /** `{name}` is replaced. */\n doneBy: string\n approvedBy: string\n someone: string\n}\n\nexport const DEFAULT_STEP_RECORD_LABELS: StepRecordLabels = {\n doneBy: 'Done by {name}',\n approvedBy: 'Approved by {name}',\n someone: 'someone',\n}\n\n/** A recorded time, in the reader's locale. */\nexport const formatDate = (iso: string | undefined): string => {\n const t = iso ? Date.parse(iso) : NaN\n return Number.isNaN(t)\n ? ''\n : new Date(t).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' })\n}\n\n/** A recorded answer as text: a person's name, an option's label, a tick… */\nexport const shownValue = (\n v: unknown,\n field: WorkflowField,\n nameOf?: (id: string) => string | undefined\n) => {\n if (v === undefined || v === null || v === '') return '—'\n if (typeof v === 'boolean') return v ? '✓' : '✗'\n if (field.type === 'person' && typeof v === 'string') return nameOf?.(v) ?? v\n if (field.type === 'select') return field.options?.find((o) => o.value === v)?.label ?? String(v)\n return typeof v === 'object' ? JSON.stringify(v) : String(v)\n}\n\n/** What a finished step recorded: who did it (approved it) and when, and the answers it took. */\nexport function StepRecord({\n step,\n state,\n inputs,\n nameOf,\n labels,\n className,\n testId,\n}: {\n step: WorkflowStep\n state: WorkflowStepState | undefined\n inputs: Record<string, unknown>\n nameOf?: (id: string) => string | undefined\n labels?: Partial<StepRecordLabels>\n className?: string\n testId: string\n}) {\n const l = { ...DEFAULT_STEP_RECORD_LABELS, ...labels }\n if (state?.status !== 'done') return null\n const who = state.by ? (nameOf?.(state.by) ?? l.someone) : undefined\n const fields = stepFields(step)\n if (!who && !fields.length) return null\n return (\n <div className={cn('space-y-1 px-1', className)} data-testid={testId}>\n {who && (\n <p className=\"text-xs\">\n {(step.kind === 'review' ? l.approvedBy : l.doneBy).replace('{name}', who)}\n {state.at && <span className=\"text-muted-foreground\"> · {formatDate(state.at)}</span>}\n </p>\n )}\n {fields.length > 0 && (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs\">\n {fields.map((f) => (\n <div key={f.name} className=\"contents\">\n <dt className=\"text-muted-foreground\">{f.label}</dt>\n <dd className=\"min-w-0 break-words\" data-testid={`${testId}-field-${f.name}`}>\n {shownValue(inputs[f.name], f, nameOf)}\n </dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n )\n}\n\n/**\n * A step's document, one click from its chip: a button joined to the chip's right that opens the\n * latest version — the drafted letter, or the draft an approval is for. Icon-only where room is\n * short (the thread's bar), with the document's name in the chat.\n */\nexport function StepDocumentButton({\n kind,\n name,\n onOpen,\n showName = false,\n label = 'Open {name}',\n testId,\n}: {\n kind: string\n name: string\n onOpen: () => void\n showName?: boolean\n /** Its accessible name; `{name}` is replaced. */\n label?: string\n testId?: string\n}) {\n const text = label.replace('{name}', name)\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n title={text}\n aria-label={text}\n className={cn(\n `wf-kind-${kind}`,\n showName ? 'min-w-0 shrink' : 'shrink-0',\n '-ml-px flex h-8 items-center gap-1.5 rounded-r-lg border border-border bg-card px-2 text-xs font-medium shadow-sm hover:border-[hsl(var(--wf-accent)/0.55)] hover:text-[hsl(var(--wf-accent))]'\n )}\n data-testid={testId}\n >\n <FileText className=\"wf-kind-text size-3.5 shrink-0\" aria-hidden />\n {showName && <span className=\"max-w-[14rem] truncate\">{name}</span>}\n </button>\n )\n}\n","/**\n * The kinds of step, as every view of a workflow shows them: the builder's canvas, the runner's\n * stepper, a thread's top bar and the threads list. Each kind has one icon here and one colour in\n * `blocks.css` (`.wf-kind-<kind>`, on the `--wf-*` variables), so a step looks the same wherever\n * it appears.\n */\n\nimport { Bot, ClipboardCheck, FileInput, Mail, PenLine, Table2, Upload } from 'lucide-react'\nimport type { WorkflowStep } from './types'\n\n/** Each kind of step, with each platform action (an `action` step) as a kind of its own. */\nexport type WorkflowStepKind =\n 'form' | 'upload' | 'agent' | 'review' | 'sign' | 'email_draft' | 'tabular_review'\n\n/** Every kind, in the order the add menus list them. */\nexport const WORKFLOW_STEP_KINDS: readonly WorkflowStepKind[] = [\n 'form',\n 'upload',\n 'agent',\n 'review',\n 'sign',\n 'email_draft',\n 'tabular_review',\n]\n\n/** A step's kind: an action step is its action's type. */\nexport const stepKindOf = (step: WorkflowStep): WorkflowStepKind =>\n step.kind === 'action' ? step.action.type : step.kind\n\nexport const STEP_KIND_ICONS = {\n form: FileInput,\n upload: Upload,\n agent: Bot,\n review: ClipboardCheck,\n sign: PenLine,\n email_draft: Mail,\n tabular_review: Table2,\n} as const\n\n/** Each kind's name, as the canvas cards and the thread bar label a step. */\nexport const DEFAULT_STEP_KIND_LABELS: Record<WorkflowStepKind, string> = {\n form: 'Form',\n upload: 'Upload',\n agent: 'AI step',\n review: 'Approval',\n sign: 'Sign',\n email_draft: 'Email draft',\n tabular_review: 'Tabular review',\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type RefObject,\n type SyntheticEvent,\n} from 'react'\nimport { useListKeyNav, type UseListKeyNav } from '../lib/useListKeyNav'\nimport {\n filterMentionCandidates,\n findMentionQuery,\n insertMention,\n type MentionCandidate,\n} from './mentions'\n\nexport interface UseMentionAutocompleteOptions {\n /** The draft. */\n value: string\n /** Writes the draft (the same setter the composer uses). */\n onValueChange: (next: string) => void\n /** Who can be mentioned: workspace members and the assistant. */\n candidates: ReadonlyArray<MentionCandidate>\n /** The composer textarea; read for the caret and refocused after a pick. */\n textareaRef: RefObject<HTMLTextAreaElement | null>\n}\n\nexport interface UseMentionAutocomplete {\n isOpen: boolean\n /** Filtered candidates for the `@query` at the caret. */\n items: MentionCandidate[]\n /** Keyboard navigation; call `nav.handleKeyDown` first in the textarea's `onKeyDown`. */\n nav: UseListKeyNav\n /** Insert a candidate in place of the `@query`. */\n pick: (candidate: MentionCandidate) => void\n /** Wrap the composer's `onValueChange` with this so the caret is tracked as the user types. */\n onValueChange: (next: string) => void\n /** Spread onto the textarea (via `textareaProps`): tracks caret moves (clicks, arrows). */\n textareaProps: { onSelect: (event: SyntheticEvent<HTMLTextAreaElement>) => void }\n}\n\n/**\n * Headless `@mention` autocomplete for a textarea: finds the `@query` at the caret, filters the\n * candidates, and on pick replaces the query with `@<label> `. Pair with {@link MentionMenu}.\n */\nexport function useMentionAutocomplete({\n value,\n onValueChange,\n candidates,\n textareaRef,\n}: UseMentionAutocompleteOptions): UseMentionAutocomplete {\n const [caret, setCaret] = useState<number | null>(null)\n // Escape dismisses the menu for the `@` it was opened at, until the user starts another one.\n const [dismissedAt, setDismissedAt] = useState<number | null>(null)\n\n // The draft can change from outside (cleared on send, restored on error): once the dismissed\n // `@` is gone, re-arm so the next `@` there opens the menu again.\n useEffect(() => {\n if (dismissedAt !== null && value[dismissedAt] !== '@') setDismissedAt(null)\n }, [value, dismissedAt])\n\n const match = useMemo(() => {\n if (caret === null) return null\n const query = findMentionQuery(value, Math.min(caret, value.length))\n // A completed recipient followed by a space is no longer an autocomplete query.\n return query && candidates.some((candidate) => query.query === `${candidate.label} `)\n ? null\n : query\n }, [value, caret, candidates])\n const items = useMemo(\n () => (match ? filterMentionCandidates(candidates, match.query) : []),\n [match, candidates]\n )\n const isOpen = !!match && items.length > 0 && dismissedAt !== match.start\n\n const readCaret = useCallback(() => {\n const ta = textareaRef.current\n setCaret(ta ? ta.selectionStart : null)\n }, [textareaRef])\n\n const pick = useCallback(\n (candidate: MentionCandidate) => {\n if (!match || caret === null) return\n const next = insertMention(value, match.start, Math.min(caret, value.length), candidate.label)\n onValueChange(next.text)\n setCaret(next.caret)\n // The inserted `@<label> ` is complete: keep the menu shut for this `@`.\n setDismissedAt(match.start)\n requestAnimationFrame(() => {\n const ta = textareaRef.current\n if (!ta) return\n ta.focus()\n ta.setSelectionRange(next.caret, next.caret)\n })\n },\n [match, caret, value, onValueChange, textareaRef]\n )\n\n const nav = useListKeyNav({\n open: isOpen,\n items,\n onPick: pick,\n onDismiss: () => setDismissedAt(match?.start ?? null),\n resetKey: match?.query,\n })\n\n const handleValueChange = useCallback(\n (next: string) => {\n onValueChange(next)\n const ta = textareaRef.current\n setCaret(ta ? ta.selectionStart : next.length)\n // Deleting text (or the `@` itself) re-arms the menu: the user is editing that mention.\n if (dismissedAt !== null && (next.length < value.length || next[dismissedAt] !== '@')) {\n setDismissedAt(null)\n }\n },\n [onValueChange, textareaRef, dismissedAt, value]\n )\n\n return {\n isOpen,\n items,\n nav,\n pick,\n onValueChange: handleValueChange,\n textareaProps: { onSelect: readCaret },\n }\n}\n","/**\n * A step on a bar — the runner's stepper, a thread's top bar, the threads list — drawn as the\n * builder's canvas card in miniature (`.wf-chip` in `blocks.css`): its kind's accent and icon, its\n * phase in the badge (a filled check once done, a spinner while running, an hourglass while it\n * waits), and, for the step in view, the kind's name and what it waits on above its title, as a\n * canvas card heads itself. A button, so it can open a popover (`PopoverTrigger asChild`).\n */\n\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { AlertTriangle, Check, Hourglass, Loader2, MinusCircle } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport type { WorkflowStepPhase } from './run'\n\n/**\n * What the badge shows: the kind's icon (filled in once done, as the canvas marks a done card), or\n * the phase while the step moves or when it went wrong.\n */\nexport function StepBadgeMark({ phase, icon }: { phase: WorkflowStepPhase; icon?: ReactNode }) {\n if (phase === 'done') return icon ? <>{icon}</> : <Check strokeWidth={3} />\n if (phase === 'running') return <Loader2 className=\"animate-spin\" />\n if (phase === 'waiting') return <Hourglass />\n if (phase === 'failed') return <AlertTriangle />\n if (phase === 'skipped') return <MinusCircle />\n return icon ? <>{icon}</> : <span className=\"size-1.5 rounded-full bg-current opacity-60\" />\n}\n\nexport interface StepChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** The kind (`form`, `agent`…, `start`, `adhoc`): its accent. */\n kind: string\n phase: WorkflowStepPhase\n /** The kind's icon (or the host's icon for the step). */\n icon?: ReactNode\n label: string\n /** The step in view: ringed, and headed with `heading` above its label. */\n current?: boolean\n /** The current chip's top line: the kind's name, and what the step waits on. */\n heading?: ReactNode\n /** The label's classes (how it gives up room on a crowded bar). */\n labelClassName?: string\n labelTestId?: string\n /** After the label: who acted in the step, a sent-back mark… */\n children?: ReactNode\n /** A static chip (the completion marker): not a button. */\n inert?: boolean\n}\n\nexport const StepChip = forwardRef<HTMLButtonElement, StepChipProps>(function StepChip(\n {\n kind,\n phase,\n icon,\n label,\n current,\n heading,\n labelClassName,\n labelTestId,\n children,\n inert,\n className,\n ...rest\n },\n ref\n) {\n const body = (\n <>\n <span className=\"wf-badge\" aria-hidden>\n <StepBadgeMark phase={phase} icon={icon} />\n </span>\n {current && heading ? (\n <span className=\"flex min-w-0 flex-col text-left\">\n <span className=\"wf-kind-text truncate text-[9px] font-semibold uppercase leading-3 tracking-wider\">\n {heading}\n </span>\n <span\n className={cn('wf-chip-label font-semibold', labelClassName)}\n data-testid={labelTestId}\n >\n {label}\n </span>\n </span>\n ) : (\n <span className={cn('wf-chip-label', labelClassName)} data-testid={labelTestId}>\n {label}\n </span>\n )}\n {children}\n </>\n )\n const classes = cn('wf-chip', `wf-kind-${kind}`, className)\n if (inert)\n return (\n <span\n className={classes}\n data-phase={phase}\n aria-current={current ? 'step' : undefined}\n {...(rest as Record<string, unknown>)}\n >\n {body}\n </span>\n )\n return (\n <button\n ref={ref}\n type=\"button\"\n className={classes}\n data-phase={phase}\n aria-current={current ? 'step' : undefined}\n {...rest}\n >\n {body}\n </button>\n )\n})\n","import { useLayoutEffect, useState, type RefObject } from 'react'\nimport { observeResize } from './observe-resize'\n\nexport interface ElementSize {\n width: number\n height: number\n}\n\n/**\n * The border-box size of an element, kept current with a ResizeObserver. It is measured before\n * the first paint (layout effect), so a layout that depends on it never flashes the wrong mode.\n * Window resize is listened to as well (a no-ResizeObserver engine, jsdom, still re-measures).\n */\nexport function useElementSize<T extends HTMLElement>(ref: RefObject<T | null>): ElementSize {\n const [size, setSize] = useState<ElementSize>({ width: 0, height: 0 })\n useLayoutEffect(() => {\n const el = ref.current\n if (!el) return\n const measure = () => {\n const rect = el.getBoundingClientRect()\n setSize((prev) =>\n prev.width === rect.width && prev.height === rect.height\n ? prev\n : { width: rect.width, height: rect.height }\n )\n }\n measure()\n window.addEventListener('resize', measure)\n const stopObserving = observeResize(el, measure)\n return () => {\n window.removeEventListener('resize', measure)\n stopObserving()\n }\n }, [ref])\n return size\n}\n\n/** The root font size in px (what `rem` means), 16 when it cannot be read. */\nexport function rootFontSizePx(): number {\n if (typeof document === 'undefined') return 16\n const size = parseFloat(getComputedStyle(document.documentElement).fontSize)\n return Number.isFinite(size) && size > 0 ? size : 16\n}\n"]}
|