@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.
Files changed (209) hide show
  1. package/dist/agents/index.cjs +438 -435
  2. package/dist/agents/index.js +10 -7
  3. package/dist/chat/index.cjs +139 -138
  4. package/dist/chat/index.js +4 -3
  5. package/dist/{chunk-S24XEVPS.cjs → chunk-464YPRAE.cjs} +33 -2
  6. package/dist/chunk-464YPRAE.cjs.map +1 -0
  7. package/dist/{chunk-7YLJHTDC.cjs → chunk-5A2QQAF5.cjs} +11 -11
  8. package/dist/{chunk-7YLJHTDC.cjs.map → chunk-5A2QQAF5.cjs.map} +1 -1
  9. package/dist/{chunk-ON3TKY5Y.js → chunk-5YHEHEJT.js} +242 -4
  10. package/dist/chunk-5YHEHEJT.js.map +1 -0
  11. package/dist/chunk-76L6LOP3.cjs +308 -0
  12. package/dist/chunk-76L6LOP3.cjs.map +1 -0
  13. package/dist/chunk-AOSUHWIL.js +98 -0
  14. package/dist/chunk-AOSUHWIL.js.map +1 -0
  15. package/dist/{chunk-PROK33G6.js → chunk-C44TDH54.js} +13 -1598
  16. package/dist/chunk-C44TDH54.js.map +1 -0
  17. package/dist/{chunk-YFY3TQ6Q.cjs → chunk-COCGRJLA.cjs} +7 -7
  18. package/dist/{chunk-YFY3TQ6Q.cjs.map → chunk-COCGRJLA.cjs.map} +1 -1
  19. package/dist/chunk-CQCC7LE7.js +210 -0
  20. package/dist/chunk-CQCC7LE7.js.map +1 -0
  21. package/dist/{chunk-UGCKUXRV.js → chunk-CSI2B2H5.js} +3 -3
  22. package/dist/{chunk-UGCKUXRV.js.map → chunk-CSI2B2H5.js.map} +1 -1
  23. package/dist/{chunk-R26BK7YL.cjs → chunk-DTROMMDX.cjs} +4 -4
  24. package/dist/{chunk-R26BK7YL.cjs.map → chunk-DTROMMDX.cjs.map} +1 -1
  25. package/dist/{chunk-65THHQVB.cjs → chunk-ECW2R2KF.cjs} +27 -27
  26. package/dist/{chunk-65THHQVB.cjs.map → chunk-ECW2R2KF.cjs.map} +1 -1
  27. package/dist/{chunk-RI6DZA5X.js → chunk-EF4ZLKRM.js} +3 -3
  28. package/dist/{chunk-RI6DZA5X.js.map → chunk-EF4ZLKRM.js.map} +1 -1
  29. package/dist/{chunk-WS5EX7DN.cjs → chunk-EYKISBDO.cjs} +5 -5
  30. package/dist/{chunk-WS5EX7DN.cjs.map → chunk-EYKISBDO.cjs.map} +1 -1
  31. package/dist/chunk-FJETR2AS.js +561 -0
  32. package/dist/chunk-FJETR2AS.js.map +1 -0
  33. package/dist/{chunk-JO3EMZ4X.js → chunk-GWSGIZQ5.js} +3 -3
  34. package/dist/{chunk-JO3EMZ4X.js.map → chunk-GWSGIZQ5.js.map} +1 -1
  35. package/dist/{chunk-I7WG3JRD.js → chunk-H4D7WKDY.js} +3 -3
  36. package/dist/{chunk-I7WG3JRD.js.map → chunk-H4D7WKDY.js.map} +1 -1
  37. package/dist/{chunk-GBS6QVGS.cjs → chunk-HAOKT4LC.cjs} +5 -5
  38. package/dist/{chunk-GBS6QVGS.cjs.map → chunk-HAOKT4LC.cjs.map} +1 -1
  39. package/dist/{chunk-N5X37J3D.js → chunk-IJST4EBM.js} +11 -8
  40. package/dist/chunk-IJST4EBM.js.map +1 -0
  41. package/dist/{chunk-3RJN2VTL.js → chunk-IXWJGOM2.js} +3 -3
  42. package/dist/{chunk-3RJN2VTL.js.map → chunk-IXWJGOM2.js.map} +1 -1
  43. package/dist/{chunk-CYNF5PZI.js → chunk-J5CWKFSC.js} +3 -3
  44. package/dist/{chunk-CYNF5PZI.js.map → chunk-J5CWKFSC.js.map} +1 -1
  45. package/dist/{chunk-OWCEQKAR.cjs → chunk-JSTKEZBS.cjs} +21 -318
  46. package/dist/chunk-JSTKEZBS.cjs.map +1 -0
  47. package/dist/{chunk-TP6PLDNM.cjs → chunk-KMZWKSKO.cjs} +8 -8
  48. package/dist/{chunk-TP6PLDNM.cjs.map → chunk-KMZWKSKO.cjs.map} +1 -1
  49. package/dist/{chunk-C4WSHRR6.cjs → chunk-KPZZ5FHE.cjs} +32 -12
  50. package/dist/chunk-KPZZ5FHE.cjs.map +1 -0
  51. package/dist/{chunk-CKCBBYTA.js → chunk-KSHKTOY2.js} +5 -205
  52. package/dist/chunk-KSHKTOY2.js.map +1 -0
  53. package/dist/chunk-LJJJ6CYH.cjs +62 -0
  54. package/dist/chunk-LJJJ6CYH.cjs.map +1 -0
  55. package/dist/chunk-LPYEUD2D.cjs +1627 -0
  56. package/dist/chunk-LPYEUD2D.cjs.map +1 -0
  57. package/dist/chunk-MHFF5N65.cjs +101 -0
  58. package/dist/chunk-MHFF5N65.cjs.map +1 -0
  59. package/dist/{chunk-GYAUJ4KT.js → chunk-MTSKK3BN.js} +32 -3
  60. package/dist/chunk-MTSKK3BN.js.map +1 -0
  61. package/dist/chunk-NHZK64TQ.js +75 -0
  62. package/dist/chunk-NHZK64TQ.js.map +1 -0
  63. package/dist/{chunk-BPBSSMRB.js → chunk-NRFAWUVD.js} +3 -3
  64. package/dist/{chunk-BPBSSMRB.js.map → chunk-NRFAWUVD.js.map} +1 -1
  65. package/dist/chunk-NWNVWO6L.cjs +80 -0
  66. package/dist/chunk-NWNVWO6L.cjs.map +1 -0
  67. package/dist/{chunk-HIJUXAWS.cjs → chunk-O2GW5IY6.cjs} +86 -83
  68. package/dist/chunk-O2GW5IY6.cjs.map +1 -0
  69. package/dist/{chunk-3BFGL2JL.cjs → chunk-ODRHHWHY.cjs} +4 -4
  70. package/dist/{chunk-3BFGL2JL.cjs.map → chunk-ODRHHWHY.cjs.map} +1 -1
  71. package/dist/{chunk-Y3KA6X7B.js → chunk-OVR3XMYL.js} +4 -4
  72. package/dist/{chunk-Y3KA6X7B.js.map → chunk-OVR3XMYL.js.map} +1 -1
  73. package/dist/{chunk-Y5KTM3V5.js → chunk-PDKM27DF.js} +17 -295
  74. package/dist/chunk-PDKM27DF.js.map +1 -0
  75. package/dist/{chunk-OAL3B2ZU.cjs → chunk-PLJ7PHWU.cjs} +5 -5
  76. package/dist/{chunk-OAL3B2ZU.cjs.map → chunk-PLJ7PHWU.cjs.map} +1 -1
  77. package/dist/{chunk-DPGFEMVT.cjs → chunk-RB7GX2VT.cjs} +57 -1665
  78. package/dist/chunk-RB7GX2VT.cjs.map +1 -0
  79. package/dist/chunk-RFIBUWLF.cjs +232 -0
  80. package/dist/chunk-RFIBUWLF.cjs.map +1 -0
  81. package/dist/{chunk-MIDXCYZB.cjs → chunk-RQ2Y7USX.cjs} +15 -235
  82. package/dist/chunk-RQ2Y7USX.cjs.map +1 -0
  83. package/dist/chunk-SV65E4QW.js +58 -0
  84. package/dist/chunk-SV65E4QW.js.map +1 -0
  85. package/dist/{chunk-LYUO3E6V.js → chunk-SZOFGU7W.js} +3 -3
  86. package/dist/{chunk-LYUO3E6V.js.map → chunk-SZOFGU7W.js.map} +1 -1
  87. package/dist/chunk-T5B7FM7S.js +1602 -0
  88. package/dist/chunk-T5B7FM7S.js.map +1 -0
  89. package/dist/{chunk-YNIBUKV5.js → chunk-TBEVGWY3.js} +32 -14
  90. package/dist/chunk-TBEVGWY3.js.map +1 -0
  91. package/dist/{chunk-MJCCBMM5.cjs → chunk-TC3RQNEX.cjs} +6 -80
  92. package/dist/chunk-TC3RQNEX.cjs.map +1 -0
  93. package/dist/chunk-TZGBRLPK.js +288 -0
  94. package/dist/chunk-TZGBRLPK.js.map +1 -0
  95. package/dist/chunk-U6YVZDOV.cjs +574 -0
  96. package/dist/chunk-U6YVZDOV.cjs.map +1 -0
  97. package/dist/{chunk-QIMVTGKS.cjs → chunk-U73KPFYH.cjs} +255 -2
  98. package/dist/chunk-U73KPFYH.cjs.map +1 -0
  99. package/dist/{chunk-HFGXA5CL.cjs → chunk-UTTTJSQU.cjs} +4 -4
  100. package/dist/{chunk-HFGXA5CL.cjs.map → chunk-UTTTJSQU.cjs.map} +1 -1
  101. package/dist/{chunk-DLBUFHLY.js → chunk-VTTZZ4FN.js} +4 -74
  102. package/dist/chunk-VTTZZ4FN.js.map +1 -0
  103. package/dist/{chunk-5FTIHRZH.cjs → chunk-XVUOMWMD.cjs} +4 -4
  104. package/dist/{chunk-5FTIHRZH.cjs.map → chunk-XVUOMWMD.cjs.map} +1 -1
  105. package/dist/{chunk-FXG7TFAG.js → chunk-Y4ATWQGV.js} +3 -3
  106. package/dist/{chunk-FXG7TFAG.js.map → chunk-Y4ATWQGV.js.map} +1 -1
  107. package/dist/{chunk-444XKG46.js → chunk-YKQ2DPIP.js} +3 -3
  108. package/dist/{chunk-444XKG46.js.map → chunk-YKQ2DPIP.js.map} +1 -1
  109. package/dist/{chunk-HEMU73OP.cjs → chunk-YSHIC4NJ.cjs} +4 -4
  110. package/dist/{chunk-HEMU73OP.cjs.map → chunk-YSHIC4NJ.cjs.map} +1 -1
  111. package/dist/{chunk-5BXEYYH6.js → chunk-ZM26YEOT.js} +3 -3
  112. package/dist/{chunk-5BXEYYH6.js.map → chunk-ZM26YEOT.js.map} +1 -1
  113. package/dist/citations/index.cjs +12 -12
  114. package/dist/citations/index.js +3 -3
  115. package/dist/connect/docx.cjs +36 -7
  116. package/dist/connect/docx.cjs.map +1 -1
  117. package/dist/connect/docx.d.ts +9 -2
  118. package/dist/connect/docx.js +30 -6
  119. package/dist/connect/docx.js.map +1 -1
  120. package/dist/connect/index.cjs +802 -628
  121. package/dist/connect/index.cjs.map +1 -1
  122. package/dist/connect/index.d.ts +2 -0
  123. package/dist/connect/index.js +636 -507
  124. package/dist/connect/index.js.map +1 -1
  125. package/dist/connection/ConnectedSettings.d.ts +3 -2
  126. package/dist/connection/docx/ConnectedNativeDocxComparison.d.ts +5 -0
  127. package/dist/connection/docx/ConnectedNativeDocxEditor.d.ts +16 -0
  128. package/dist/connection/{ConnectedStreamedWordArtifact.d.ts → docx/ConnectedStreamedWordArtifact.d.ts} +1 -1
  129. package/dist/connection/docx/support.d.ts +27 -0
  130. package/dist/connection/docx/useConnectedDocxReferences.d.ts +2 -0
  131. package/dist/connection/docx/useConnectedHouseTemplate.d.ts +2 -0
  132. package/dist/connection/settings-page/ConnectedAccountSettings.d.ts +35 -0
  133. package/dist/connection/settings-page/ConnectedMailSettings.d.ts +13 -0
  134. package/dist/connection/settings-page/ConnectedPremiumModels.d.ts +1 -0
  135. package/dist/connection/settings-page/ConnectedPrivacySettings.d.ts +12 -0
  136. package/dist/connection/settings-page/ConnectedSettingsPage.d.ts +29 -0
  137. package/dist/connection/settings-page/SessionStatusIcon.d.ts +7 -0
  138. package/dist/connection/settings-page/index.d.ts +6 -0
  139. package/dist/docx/index.cjs +17 -63
  140. package/dist/docx/index.cjs.map +1 -1
  141. package/dist/docx/index.d.ts +1 -0
  142. package/dist/docx/index.js +2 -64
  143. package/dist/docx/index.js.map +1 -1
  144. package/dist/docx/template/candidates.d.ts +16 -0
  145. package/dist/facts/index.cjs +3 -3
  146. package/dist/facts/index.js +2 -2
  147. package/dist/files/index.cjs +3 -3
  148. package/dist/files/index.js +2 -2
  149. package/dist/home/index.cjs +20 -20
  150. package/dist/home/index.js +4 -4
  151. package/dist/index.cjs +766 -741
  152. package/dist/index.cjs.map +1 -1
  153. package/dist/index.d.ts +2 -0
  154. package/dist/index.js +23 -18
  155. package/dist/index.js.map +1 -1
  156. package/dist/lib/deep-link.d.ts +46 -0
  157. package/dist/provider/BlocksProvider.d.ts +5 -1
  158. package/dist/provider/settings-section.d.ts +9 -0
  159. package/dist/retrieval/index.cjs +4 -4
  160. package/dist/retrieval/index.js +2 -2
  161. package/dist/settings/AppearanceSettings.d.ts +18 -0
  162. package/dist/settings/ServerConnectionControls.d.ts +16 -0
  163. package/dist/settings/SettingsPage.d.ts +31 -0
  164. package/dist/settings/index.cjs +188 -250
  165. package/dist/settings/index.cjs.map +1 -1
  166. package/dist/settings/index.d.ts +3 -1
  167. package/dist/settings/index.js +88 -199
  168. package/dist/settings/index.js.map +1 -1
  169. package/dist/shell/index.cjs +44 -44
  170. package/dist/shell/index.js +3 -3
  171. package/dist/site/index.cjs +74 -73
  172. package/dist/site/index.js +3 -2
  173. package/dist/studio/index.cjs +80 -78
  174. package/dist/studio/index.cjs.map +1 -1
  175. package/dist/studio/index.js +10 -8
  176. package/dist/studio/index.js.map +1 -1
  177. package/dist/workflow-canvas/index.cjs +62 -59
  178. package/dist/workflow-canvas/index.cjs.map +1 -1
  179. package/dist/workflow-canvas/index.js +10 -7
  180. package/dist/workflow-canvas/index.js.map +1 -1
  181. package/dist/workspaces/index.cjs +3 -3
  182. package/dist/workspaces/index.js +2 -2
  183. package/node_modules/@arbidocs/coedit/package.json +1 -1
  184. package/package.json +4 -4
  185. package/dist/chunk-4TR5QCCX.cjs +0 -43
  186. package/dist/chunk-4TR5QCCX.cjs.map +0 -1
  187. package/dist/chunk-7NDW4KF4.cjs +0 -112
  188. package/dist/chunk-7NDW4KF4.cjs.map +0 -1
  189. package/dist/chunk-C4WSHRR6.cjs.map +0 -1
  190. package/dist/chunk-CKCBBYTA.js.map +0 -1
  191. package/dist/chunk-DLBUFHLY.js.map +0 -1
  192. package/dist/chunk-DPGFEMVT.cjs.map +0 -1
  193. package/dist/chunk-ETXYVO6E.js +0 -109
  194. package/dist/chunk-ETXYVO6E.js.map +0 -1
  195. package/dist/chunk-GYAUJ4KT.js.map +0 -1
  196. package/dist/chunk-HIJUXAWS.cjs.map +0 -1
  197. package/dist/chunk-MCKOZACC.js +0 -41
  198. package/dist/chunk-MCKOZACC.js.map +0 -1
  199. package/dist/chunk-MIDXCYZB.cjs.map +0 -1
  200. package/dist/chunk-MJCCBMM5.cjs.map +0 -1
  201. package/dist/chunk-N5X37J3D.js.map +0 -1
  202. package/dist/chunk-ON3TKY5Y.js.map +0 -1
  203. package/dist/chunk-OWCEQKAR.cjs.map +0 -1
  204. package/dist/chunk-PROK33G6.js.map +0 -1
  205. package/dist/chunk-QIMVTGKS.cjs.map +0 -1
  206. package/dist/chunk-S24XEVPS.cjs.map +0 -1
  207. package/dist/chunk-Y5KTM3V5.js.map +0 -1
  208. package/dist/chunk-YNIBUKV5.js.map +0 -1
  209. 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 str2 = (v) => typeof v === "string" && v ? v : void 0;
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 = str2(detail.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 = str2(detail.step);
110
+ const step = str(detail.step);
393
111
  if (!step) continue;
394
112
  if (e.kind === "step_sent_back") {
395
- const to = str2(detail.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: str2(detail.to) };
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 = str2(detail.response_id) ?? before?.responseId ?? null;
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 = str2(detail.declined_by);
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: str2(detail.error) ?? (afterFailure ? before?.error ?? null : null),
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
- inputs: fields},
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
- exports.workflowsAccepting = workflowsAccepting;
995
- exports.workflowsForHost = workflowsForHost;
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"]}