@arbidocs/blocks 0.4.72 → 0.4.74

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 (109) hide show
  1. package/dist/agents/index.cjs +401 -262
  2. package/dist/agents/index.js +7 -4
  3. package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
  4. package/dist/agents/tasks/WorkflowThreadStrip.d.ts +58 -0
  5. package/dist/agents/tasks/index.d.ts +1 -0
  6. package/dist/agents/workflows/WorkflowRunner.d.ts +86 -0
  7. package/dist/agents/workflows/WorkflowStepBar.d.ts +23 -0
  8. package/dist/agents/workflows/index.d.ts +7 -1
  9. package/dist/agents/workflows/planSteps.d.ts +28 -0
  10. package/dist/agents/workflows/run.d.ts +98 -0
  11. package/dist/agents/workflows/skillMarkdown.d.ts +15 -0
  12. package/dist/agents/workflows/types.d.ts +111 -0
  13. package/dist/agents/workflows/useWorkflowPreview.d.ts +14 -0
  14. package/dist/agents/workflows/useWorkflowView.d.ts +54 -0
  15. package/dist/agents/workflows/workflow.d.ts +3 -1
  16. package/dist/chat/index.cjs +124 -124
  17. package/dist/chat/index.js +3 -3
  18. package/dist/{chunk-DH7C2UJO.cjs → chunk-5LP54CWR.cjs} +299 -526
  19. package/dist/chunk-5LP54CWR.cjs.map +1 -0
  20. package/dist/{chunk-3SFFTSOI.cjs → chunk-7CVF3DK2.cjs} +5 -5
  21. package/dist/{chunk-3SFFTSOI.cjs.map → chunk-7CVF3DK2.cjs.map} +1 -1
  22. package/dist/chunk-7D737FLE.cjs +43 -0
  23. package/dist/chunk-7D737FLE.cjs.map +1 -0
  24. package/dist/{chunk-V3L5DONY.cjs → chunk-B4SRYJLM.cjs} +31 -2
  25. package/dist/chunk-B4SRYJLM.cjs.map +1 -0
  26. package/dist/{chunk-LFGJAZ5H.js → chunk-DDF5GPIJ.js} +6 -36
  27. package/dist/chunk-DDF5GPIJ.js.map +1 -0
  28. package/dist/chunk-DETZZBG2.cjs +91 -0
  29. package/dist/chunk-DETZZBG2.cjs.map +1 -0
  30. package/dist/chunk-EVUEIBNU.js +89 -0
  31. package/dist/chunk-EVUEIBNU.js.map +1 -0
  32. package/dist/{chunk-G5QTGKDJ.cjs → chunk-HITAN7JF.cjs} +8 -8
  33. package/dist/{chunk-G5QTGKDJ.cjs.map → chunk-HITAN7JF.cjs.map} +1 -1
  34. package/dist/{chunk-3VQYJBOI.js → chunk-HOXKR26S.js} +31 -4
  35. package/dist/chunk-HOXKR26S.js.map +1 -0
  36. package/dist/{chunk-KJ3QEKOJ.cjs → chunk-IPGKTUF7.cjs} +7 -33
  37. package/dist/chunk-IPGKTUF7.cjs.map +1 -0
  38. package/dist/{chunk-IMC2Z32C.js → chunk-KOSGX3UK.js} +269 -485
  39. package/dist/chunk-KOSGX3UK.js.map +1 -0
  40. package/dist/{chunk-KOXUBCLL.js → chunk-MK6NJQGF.js} +4 -4
  41. package/dist/{chunk-KOXUBCLL.js.map → chunk-MK6NJQGF.js.map} +1 -1
  42. package/dist/{chunk-THO7DZNN.cjs → chunk-MUMH3Z6K.cjs} +20 -15
  43. package/dist/chunk-MUMH3Z6K.cjs.map +1 -0
  44. package/dist/{chunk-5HOAOKZL.js → chunk-OYMWV45N.js} +21 -16
  45. package/dist/chunk-OYMWV45N.js.map +1 -0
  46. package/dist/chunk-P2RBE3FD.cjs +1448 -0
  47. package/dist/chunk-P2RBE3FD.cjs.map +1 -0
  48. package/dist/{chunk-G5DP27DU.js → chunk-UIWLDSTF.js} +3 -29
  49. package/dist/chunk-UIWLDSTF.js.map +1 -0
  50. package/dist/{chunk-VRPRAU3J.js → chunk-WJEKRSPH.js} +3 -3
  51. package/dist/{chunk-VRPRAU3J.js.map → chunk-WJEKRSPH.js.map} +1 -1
  52. package/dist/chunk-XD2M6LIG.js +41 -0
  53. package/dist/chunk-XD2M6LIG.js.map +1 -0
  54. package/dist/chunk-YWYVIQ7T.js +1402 -0
  55. package/dist/chunk-YWYVIQ7T.js.map +1 -0
  56. package/dist/{chunk-WBDK4PIA.cjs → chunk-Z5VUZ6YD.cjs} +6 -37
  57. package/dist/chunk-Z5VUZ6YD.cjs.map +1 -0
  58. package/dist/connect/docx.cjs +2 -2
  59. package/dist/connect/docx.js +1 -1
  60. package/dist/connect/index.cjs +379 -27
  61. package/dist/connect/index.cjs.map +1 -1
  62. package/dist/connect/index.d.ts +1 -0
  63. package/dist/connect/index.js +362 -11
  64. package/dist/connect/index.js.map +1 -1
  65. package/dist/connection/ConnectedWorkflowBuilder.d.ts +44 -0
  66. package/dist/connection/ConnectedWorkflowRunner.d.ts +31 -0
  67. package/dist/connection/useWorkflowThread.d.ts +38 -0
  68. package/dist/facts/index.cjs +1 -1
  69. package/dist/facts/index.js +1 -1
  70. package/dist/files/index.cjs +9 -83
  71. package/dist/files/index.cjs.map +1 -1
  72. package/dist/files/index.js +6 -83
  73. package/dist/files/index.js.map +1 -1
  74. package/dist/home/index.cjs +22 -21
  75. package/dist/home/index.cjs.map +1 -1
  76. package/dist/home/index.js +4 -3
  77. package/dist/home/index.js.map +1 -1
  78. package/dist/index.cjs +579 -440
  79. package/dist/index.cjs.map +1 -1
  80. package/dist/index.js +11 -8
  81. package/dist/index.js.map +1 -1
  82. package/dist/shell/index.cjs +1 -1
  83. package/dist/shell/index.js +1 -1
  84. package/dist/studio/index.cjs +7 -7
  85. package/dist/studio/index.js +5 -5
  86. package/dist/workflow-canvas/StepInspector.d.ts +57 -0
  87. package/dist/workflow-canvas/TriggerInspector.d.ts +46 -0
  88. package/dist/workflow-canvas/WorkflowBuilder.d.ts +55 -0
  89. package/dist/workflow-canvas/WorkflowCanvas.d.ts +69 -0
  90. package/dist/workflow-canvas/edit.d.ts +54 -0
  91. package/dist/workflow-canvas/index.cjs +1719 -0
  92. package/dist/workflow-canvas/index.cjs.map +1 -0
  93. package/dist/workflow-canvas/index.d.ts +13 -0
  94. package/dist/workflow-canvas/index.js +1689 -0
  95. package/dist/workflow-canvas/index.js.map +1 -0
  96. package/dist/workflow-canvas/trigger.d.ts +51 -0
  97. package/dist/workflow-canvas/viewport.d.ts +47 -0
  98. package/package.json +25 -14
  99. package/src/workflow-canvas/canvas.css +113 -0
  100. package/dist/chunk-3VQYJBOI.js.map +0 -1
  101. package/dist/chunk-5HOAOKZL.js.map +0 -1
  102. package/dist/chunk-DH7C2UJO.cjs.map +0 -1
  103. package/dist/chunk-G5DP27DU.js.map +0 -1
  104. package/dist/chunk-IMC2Z32C.js.map +0 -1
  105. package/dist/chunk-KJ3QEKOJ.cjs.map +0 -1
  106. package/dist/chunk-LFGJAZ5H.js.map +0 -1
  107. package/dist/chunk-THO7DZNN.cjs.map +0 -1
  108. package/dist/chunk-V3L5DONY.cjs.map +0 -1
  109. package/dist/chunk-WBDK4PIA.cjs.map +0 -1
@@ -2,13 +2,16 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkB3WCKBJ7_cjs = require('../chunk-B3WCKBJ7.cjs');
5
- var chunkG5QTGKDJ_cjs = require('../chunk-G5QTGKDJ.cjs');
6
- var chunkTHO7DZNN_cjs = require('../chunk-THO7DZNN.cjs');
7
- var chunkQVBZESYQ_cjs = require('../chunk-QVBZESYQ.cjs');
5
+ var chunkHITAN7JF_cjs = require('../chunk-HITAN7JF.cjs');
6
+ var chunkMUMH3Z6K_cjs = require('../chunk-MUMH3Z6K.cjs');
7
+ var chunkP2RBE3FD_cjs = require('../chunk-P2RBE3FD.cjs');
8
+ require('../chunk-DETZZBG2.cjs');
9
+ require('../chunk-7D737FLE.cjs');
8
10
  require('../chunk-ADOKTJHV.cjs');
9
- var chunkKJ3QEKOJ_cjs = require('../chunk-KJ3QEKOJ.cjs');
11
+ var chunkQVBZESYQ_cjs = require('../chunk-QVBZESYQ.cjs');
12
+ var chunkIPGKTUF7_cjs = require('../chunk-IPGKTUF7.cjs');
10
13
  require('../chunk-VGOFFCMT.cjs');
11
- require('../chunk-V3L5DONY.cjs');
14
+ require('../chunk-B4SRYJLM.cjs');
12
15
  require('../chunk-7UTB4PHM.cjs');
13
16
  require('../chunk-PPCATBOY.cjs');
14
17
  var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
@@ -25,7 +28,7 @@ var lucideReact = require('lucide-react');
25
28
  var shell = require('@arbidocs/react/shell');
26
29
 
27
30
  function ConnectionBoundWebSocket({ children }) {
28
- const { status } = chunkTHO7DZNN_cjs.useConnection();
31
+ const { status } = chunkMUMH3Z6K_cjs.useConnection();
29
32
  return /* @__PURE__ */ jsxRuntime.jsx(react$1.ArbiWebSocketProvider, { enabled: status === "authenticated", children });
30
33
  }
31
34
  function ArbiAppProvider({
@@ -38,10 +41,10 @@ function ArbiAppProvider({
38
41
  })
39
42
  );
40
43
  const providerUrl = config.apiUrl || config.demoApiUrl || "https://demo.arbi.local";
41
- return /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.ArbiProvider, { url: providerUrl, deploymentDomain: config.deploymentDomain, children: /* @__PURE__ */ jsxRuntime.jsx(chunkTHO7DZNN_cjs.ConnectionProvider, { config, children: /* @__PURE__ */ jsxRuntime.jsx(ConnectionBoundWebSocket, { children }) }) }) });
44
+ return /* @__PURE__ */ jsxRuntime.jsx(reactQuery.QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsxRuntime.jsx(react$1.ArbiProvider, { url: providerUrl, deploymentDomain: config.deploymentDomain, children: /* @__PURE__ */ jsxRuntime.jsx(chunkMUMH3Z6K_cjs.ConnectionProvider, { config, children: /* @__PURE__ */ jsxRuntime.jsx(ConnectionBoundWebSocket, { children }) }) }) });
42
45
  }
43
46
  function ConnectedTaskAccessRequest({ conversationId }) {
44
- const { workspaceId } = chunkTHO7DZNN_cjs.useConnection();
47
+ const { workspaceId } = chunkMUMH3Z6K_cjs.useConnection();
45
48
  const tasks = react$1.useConversations(workspaceId ?? void 0, { live: true });
46
49
  const run = react$1.useRunConversation();
47
50
  const task = tasks.data?.find((item) => item.external_id === conversationId);
@@ -180,8 +183,355 @@ function StreamedArtifact({
180
183
  }
181
184
  );
182
185
  }
186
+ var STARTING = /* @__PURE__ */ new Set(["pending", "running"]);
187
+ function formValues(step, inputs) {
188
+ if (step.kind !== "form") return void 0;
189
+ return Object.fromEntries(step.inputs.map((f) => [f.name, inputs[f.name] ?? ""]));
190
+ }
191
+ var ANSWER_RETRY_CAP = 16;
192
+ function answerRetryDelay(attempt) {
193
+ return attempt === 0 ? 0 : Math.min(1e3 * 2 ** (attempt - 1), 15e3);
194
+ }
195
+ function useAnswerRetry(missing, refetch) {
196
+ const [attempt, setAttempt] = react.useState(0);
197
+ const [prev, setPrev] = react.useState(missing);
198
+ if (prev !== missing) {
199
+ setPrev(missing);
200
+ setAttempt(0);
201
+ }
202
+ const refetchRef = react.useRef(refetch);
203
+ refetchRef.current = refetch;
204
+ react.useEffect(() => {
205
+ if (!missing || attempt >= ANSWER_RETRY_CAP) return;
206
+ const t = setTimeout(() => {
207
+ void refetchRef.current();
208
+ setAttempt((a) => a + 1);
209
+ }, answerRetryDelay(attempt));
210
+ return () => clearTimeout(t);
211
+ }, [missing, attempt]);
212
+ }
213
+ function useWorkflowThread(workflow, options = {}) {
214
+ const arbi = react$1.useArbi();
215
+ const { ensureWorkspaceOpen } = chunkMUMH3Z6K_cjs.useConnection();
216
+ const { wsId } = chunkHITAN7JF_cjs.useWorkspaceDocs();
217
+ const [threadId, setThreadId] = react.useState(options.conversationId);
218
+ const [localInputs, setLocalInputs] = react.useState(
219
+ () => chunkP2RBE3FD_cjs.initialRunInputs(workflow, options.initialInputs)
220
+ );
221
+ const [edits, setEdits] = react.useState({});
222
+ const [localStates, setLocalStates] = react.useState({});
223
+ const createWork = react$1.useCreateWork();
224
+ const actOnStep = react$1.useActOnStep();
225
+ const conversations = react$1.useConversations(wsId, { enabled: !!threadId, live: true });
226
+ const conversation = conversations.data?.find((c) => c.external_id === threadId);
227
+ const steps = react.useMemo(
228
+ () => chunkP2RBE3FD_cjs.workflowSteps(workflow).length > 0 ? chunkP2RBE3FD_cjs.workflowSteps(workflow) : chunkP2RBE3FD_cjs.fromPlanSteps(conversation?.plan?.steps ?? []),
229
+ [workflow, conversation?.plan?.steps]
230
+ );
231
+ const activity = react$1.useConversationActivity(threadId, { live: !!threadId });
232
+ const serverStates = react.useMemo(
233
+ () => chunkP2RBE3FD_cjs.stepStatesFromActivity(activity.data ?? []),
234
+ [activity.data]
235
+ );
236
+ const working = steps.some(
237
+ (s) => s.kind === "agent" && STARTING.has(serverStates[s.id]?.status ?? "pending")
238
+ );
239
+ const threads = react$1.useConversationThreads(wsId, threadId, { enabled: !!threadId, live: working });
240
+ const answers = react.useMemo(() => {
241
+ const byId = /* @__PURE__ */ new Map();
242
+ for (const t of threads.data?.threads ?? [])
243
+ for (const m of t.history)
244
+ if (m.role === "assistant" && m.content?.trim()) byId.set(m.external_id, m.content);
245
+ return byId;
246
+ }, [threads.data]);
247
+ const missing = Object.values(serverStates).flatMap(
248
+ (st) => st.status === "done" && st.responseId && !answers.has(st.responseId) ? [st.responseId] : []
249
+ ).sort().join(" ");
250
+ useAnswerRetry(missing, threads.refetch);
251
+ const states = react.useMemo(() => {
252
+ if (!threadId) return localStates;
253
+ const out = {};
254
+ for (const [id, s] of Object.entries(serverStates))
255
+ out[id] = { ...s, text: s.responseId ? answers.get(s.responseId) : void 0 };
256
+ return out;
257
+ }, [threadId, localStates, serverStates, answers]);
258
+ const inputs = react.useMemo(
259
+ () => threadId ? { ...localInputs, ...conversation?.skill_inputs ?? {}, ...edits } : { ...localInputs, ...edits },
260
+ [threadId, localInputs, conversation?.skill_inputs, edits]
261
+ );
262
+ const refresh = react.useCallback(async () => {
263
+ await Promise.all([activity.refetch(), conversations.refetch()]);
264
+ }, [activity, conversations]);
265
+ const act = react.useCallback(
266
+ async (id, body) => {
267
+ await actOnStep.mutateAsync({ conversationId: id, body });
268
+ await refresh();
269
+ },
270
+ [actOnStep, refresh]
271
+ );
272
+ const complete = react.useCallback(
273
+ async (step) => {
274
+ let values = inputs;
275
+ const commit = step.commit ? options.commit?.[step.id] : void 0;
276
+ if (commit && localStates[step.id]?.status !== "done") {
277
+ values = { ...values, ...await commit(values) ?? {} };
278
+ setLocalInputs(values);
279
+ setEdits({});
280
+ }
281
+ let id = threadId;
282
+ if (!id) {
283
+ await ensureWorkspaceOpen();
284
+ const created = await createWork.mutateAsync({
285
+ title: chunkP2RBE3FD_cjs.runThreadTitle(workflow, values).slice(0, 60),
286
+ description: workflow.description || null,
287
+ prompt: null,
288
+ skill_ref: null,
289
+ skill_inputs: values,
290
+ agent_ext_id: options.agentId ?? null,
291
+ auth_mode: "run_now_temp",
292
+ plan: {
293
+ goal: "",
294
+ criteria: [],
295
+ max_passes: 3,
296
+ documents: [],
297
+ steps: chunkP2RBE3FD_cjs.toPlanSteps(workflow, {
298
+ inputs: values,
299
+ resolveWorkflow: options.resolveWorkflow,
300
+ compose: options.compose
301
+ })
302
+ }
303
+ });
304
+ id = created.external_id;
305
+ setThreadId(id);
306
+ setLocalStates((s) => ({ ...s, [step.id]: { status: "done" } }));
307
+ options.onStarted?.(id);
308
+ }
309
+ await act(id, { step: step.id, action: "complete", inputs: formValues(step, values) });
310
+ },
311
+ [inputs, options, localStates, threadId, ensureWorkspaceOpen, createWork, workflow, act]
312
+ );
313
+ const skip = react.useCallback(
314
+ async (stepId) => {
315
+ if (!threadId) {
316
+ setLocalStates((s) => ({ ...s, [stepId]: { status: "skipped" } }));
317
+ return;
318
+ }
319
+ await act(threadId, { step: stepId, action: "skip" });
320
+ },
321
+ [threadId, act]
322
+ );
323
+ const retry = react.useCallback(
324
+ async (_stepId) => {
325
+ if (!threadId) return;
326
+ await arbi.conversations.runWithAuth(threadId);
327
+ await refresh();
328
+ },
329
+ [arbi, threadId, refresh]
330
+ );
331
+ const view = chunkP2RBE3FD_cjs.useWorkflowView({
332
+ steps,
333
+ states,
334
+ inputs,
335
+ setInput: (name, value) => setEdits((i) => ({ ...i, [name]: value })),
336
+ complete,
337
+ skip,
338
+ retry,
339
+ isLocked: (id) => states[id]?.status === "done"
340
+ });
341
+ return { view, conversationId: threadId, conversation };
342
+ }
343
+ var DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS = {
344
+ notify: "Ask to approve",
345
+ notified: "Notified.",
346
+ openThread: "Open the thread",
347
+ loadingAnswer: "Fetching the answer\u2026"
348
+ };
349
+ function ConnectedWorkflowRunner({
350
+ workflow,
351
+ options,
352
+ onOpenConversation,
353
+ emptyHint,
354
+ connectedLabels,
355
+ testIdPrefix = "workflow-run",
356
+ ...runnerProps
357
+ }) {
358
+ const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels };
359
+ const arbi = react$1.useArbi();
360
+ const { ensureWorkspaceOpen } = chunkMUMH3Z6K_cjs.useConnection();
361
+ const { wsId } = chunkHITAN7JF_cjs.useWorkspaceDocs();
362
+ const { data: docs = [], refetch } = react$1.useDocuments(wsId);
363
+ const [uploading, setUploading] = react.useState(false);
364
+ const { view, conversationId } = useWorkflowThread(workflow, options);
365
+ const [added, setAdded] = react.useState({});
366
+ const onUpload = react.useCallback(
367
+ async (files2, step) => {
368
+ if (!files2.length) return;
369
+ setUploading(true);
370
+ try {
371
+ await ensureWorkspaceOpen();
372
+ for (const f of files2) {
373
+ const { doc_ext_ids = [] } = await arbi.documents.uploadFile(f, f.name) ?? {};
374
+ setAdded((a) => ({ ...a, ...Object.fromEntries(doc_ext_ids.map((id) => [id, step.id])) }));
375
+ }
376
+ await refetch();
377
+ } finally {
378
+ setUploading(false);
379
+ }
380
+ },
381
+ [arbi, ensureWorkspaceOpen, refetch]
382
+ );
383
+ const files = docs.map((d) => ({
384
+ id: d.external_id,
385
+ name: d.file_name ?? d.external_id,
386
+ status: fileStatus(d.status),
387
+ addedFor: added[d.external_id]
388
+ }));
389
+ const reading = files.some((f) => f.addedFor && f.status === "processing");
390
+ react.useEffect(() => {
391
+ if (!reading) return;
392
+ const t = setInterval(() => void refetch(), READ_POLL_MS);
393
+ return () => clearInterval(t);
394
+ }, [reading, refetch]);
395
+ const renderAgentOutput = (step, state) => {
396
+ const status = state?.status;
397
+ if (!state?.text && status !== "done") return null;
398
+ if (!state?.text && state?.responseId) {
399
+ return /* @__PURE__ */ jsxRuntime.jsxs(
400
+ "p",
401
+ {
402
+ className: "flex items-center gap-2 text-sm text-muted-foreground",
403
+ "data-testid": `${testIdPrefix}-${step.id}-answer-loading`,
404
+ children: [
405
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }),
406
+ " ",
407
+ l.loadingAnswer
408
+ ]
409
+ }
410
+ );
411
+ }
412
+ return /* @__PURE__ */ jsxRuntime.jsx(
413
+ react$1.AiAnswer,
414
+ {
415
+ status: status === "running" ? "running" : "done",
416
+ text: state?.text ?? "",
417
+ emptyHint: emptyHint?.(step),
418
+ testId: `${testIdPrefix}-${step.id}-answer`
419
+ }
420
+ );
421
+ };
422
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
423
+ conversationId && onOpenConversation && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
424
+ ui.Button,
425
+ {
426
+ variant: "ghost",
427
+ size: "sm",
428
+ onClick: () => onOpenConversation(conversationId),
429
+ "data-testid": `${testIdPrefix}-open-thread`,
430
+ children: [
431
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { className: "size-4" }),
432
+ " ",
433
+ l.openThread
434
+ ]
435
+ }
436
+ ) }),
437
+ /* @__PURE__ */ jsxRuntime.jsx(
438
+ chunkP2RBE3FD_cjs.WorkflowRunner,
439
+ {
440
+ ...runnerProps,
441
+ workflow,
442
+ run: view,
443
+ renderAgentOutput,
444
+ renderReview: (step) => conversationId ? /* @__PURE__ */ jsxRuntime.jsx(
445
+ ReviewNotify,
446
+ {
447
+ conversationId,
448
+ workspaceId: wsId,
449
+ labels: l,
450
+ testId: `${testIdPrefix}-${step.id}`
451
+ }
452
+ ) : null,
453
+ onUpload,
454
+ uploading,
455
+ files,
456
+ testIdPrefix
457
+ }
458
+ )
459
+ ] });
460
+ }
461
+ var READ_POLL_MS = 3e3;
462
+ function fileStatus(status) {
463
+ const s = status?.toLowerCase();
464
+ if (!s) return void 0;
465
+ if (s === "failed") return "failed";
466
+ if (s === "completed" || s === "empty" || s === "low-content") return "ready";
467
+ return "processing";
468
+ }
469
+ function ReviewNotify({
470
+ conversationId,
471
+ workspaceId,
472
+ labels,
473
+ testId
474
+ }) {
475
+ const arbi = react$1.useArbi();
476
+ const { status, user, ensureWorkspaceOpen } = chunkMUMH3Z6K_cjs.useConnection();
477
+ const { data: members = [] } = react$1.useWorkspaceUsers(workspaceId, {
478
+ enabled: status === "authenticated" && !!workspaceId,
479
+ beforeFetch: ensureWorkspaceOpen
480
+ });
481
+ const people = members.filter(
482
+ (m) => !m.agent_ext_id && !m.user.external_id.startsWith("agt-") && m.user.external_id !== user?.externalId
483
+ );
484
+ const [picked, setPicked] = react.useState([]);
485
+ const [sent, setSent] = react.useState(false);
486
+ const [busy, setBusy] = react.useState(false);
487
+ if (people.length === 0) return null;
488
+ const toggle = (id) => setPicked((p) => p.includes(id) ? p.filter((x) => x !== id) : [...p, id]);
489
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", "data-testid": `${testId}-notify`, children: [
490
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: people.map((m) => {
491
+ const name = [m.user.given_name, m.user.family_name].filter(Boolean).join(" ") || m.user.email;
492
+ const on = picked.includes(m.user.external_id);
493
+ return /* @__PURE__ */ jsxRuntime.jsx(
494
+ "button",
495
+ {
496
+ type: "button",
497
+ onClick: () => toggle(m.user.external_id),
498
+ "aria-pressed": on,
499
+ className: ui.cn(
500
+ "rounded-full border px-2.5 py-1 text-xs",
501
+ on ? "border-primary bg-primary/10 text-primary" : "border-border text-muted-foreground"
502
+ ),
503
+ "data-testid": `${testId}-person-${m.user.external_id}`,
504
+ children: name
505
+ },
506
+ m.user.external_id
507
+ );
508
+ }) }),
509
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
510
+ /* @__PURE__ */ jsxRuntime.jsx(
511
+ ui.Button,
512
+ {
513
+ variant: "outline",
514
+ size: "sm",
515
+ disabled: !picked.length || busy,
516
+ onClick: async () => {
517
+ setBusy(true);
518
+ try {
519
+ await arbi.conversations.notify(conversationId, picked);
520
+ setSent(true);
521
+ } finally {
522
+ setBusy(false);
523
+ }
524
+ },
525
+ "data-testid": `${testId}-notify-send`,
526
+ children: labels.notify
527
+ }
528
+ ),
529
+ sent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: labels.notified })
530
+ ] })
531
+ ] });
532
+ }
183
533
  function useConnectedShellWorkspaces(options = {}) {
184
- const { workspaceId, setWorkspace } = chunkTHO7DZNN_cjs.useConnection();
534
+ const { workspaceId, setWorkspace } = chunkMUMH3Z6K_cjs.useConnection();
185
535
  const query = react$1.useWorkspaces();
186
536
  return react$1.useShellWorkspaces({
187
537
  ...options,
@@ -206,7 +556,7 @@ function ConnectedProfileCard({ notify: notify3, title = "Profile" }) {
206
556
  const updateProfile = react$1.useUpdateProfile();
207
557
  const requestEmailChange = react$1.useRequestEmailChange();
208
558
  const confirmEmailChange = react$1.useConfirmEmailChange();
209
- const { user } = chunkTHO7DZNN_cjs.useConnection();
559
+ const { user } = chunkMUMH3Z6K_cjs.useConnection();
210
560
  const name = react$1.useNameEditor({
211
561
  givenName: profile?.givenName,
212
562
  familyName: profile?.familyName,
@@ -471,7 +821,7 @@ function ConnectedLogoutDialog({
471
821
  isOnline = true,
472
822
  renderSessionIcon
473
823
  }) {
474
- const { logout } = chunkTHO7DZNN_cjs.useConnection();
824
+ const { logout } = chunkMUMH3Z6K_cjs.useConnection();
475
825
  const sessions = react$1.useSessions({ enabled: open });
476
826
  const logoutAll = react$1.useLogoutAllSessions();
477
827
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -497,7 +847,7 @@ function ConnectedLogoutDialog({
497
847
  function ConnectedDangerZone({ notify: notify3, renderSubscriptionLink }) {
498
848
  const [zoneOpen, setZoneOpen] = react.useState(false);
499
849
  const [dialogOpen, setDialogOpen] = react.useState(false);
500
- const { user, logout } = chunkTHO7DZNN_cjs.useConnection();
850
+ const { user, logout } = chunkMUMH3Z6K_cjs.useConnection();
501
851
  const remove = react$1.useDeleteAccount();
502
852
  const flow = react$1.useDeleteAccountFlow({
503
853
  userEmail: user?.email ?? "",
@@ -547,7 +897,7 @@ function ConnectedDangerZone({ notify: notify3, renderSubscriptionLink }) {
547
897
  }
548
898
  function useConnectedDocxNotifications(onOpen) {
549
899
  const arbi = react$1.useArbi();
550
- const { status, user, apiUrl } = chunkTHO7DZNN_cjs.useConnection();
900
+ const { status, user, apiUrl } = chunkMUMH3Z6K_cjs.useConnection();
551
901
  const queries = reactQuery.useQueryClient();
552
902
  const source = `docx-mentions:${apiUrl}:${user?.externalId || ""}`;
553
903
  const queryKey = ["docx-mentions", apiUrl, user?.externalId];
@@ -611,7 +961,7 @@ function useConnectedDocxNotifications(onOpen) {
611
961
  };
612
962
  }
613
963
  function useConnectedWorkNotifications(onOpen) {
614
- const { status, user, apiUrl } = chunkTHO7DZNN_cjs.useConnection();
964
+ const { status, user, apiUrl } = chunkMUMH3Z6K_cjs.useConnection();
615
965
  const source = `work-notifications:${apiUrl}:${user?.externalId || ""}`;
616
966
  const { data = [], markRead: persistRead } = react$1.useWorkNotifications({
617
967
  apiUrl,
@@ -718,7 +1068,7 @@ function mapWorkNotification(note) {
718
1068
  function ActiveChat({ agentId, workspaceId }) {
719
1069
  const chat = react$1.useArbiChat({ agentId, workspaceId });
720
1070
  return /* @__PURE__ */ jsxRuntime.jsx(
721
- chunkKJ3QEKOJ_cjs.ChatPage,
1071
+ chunkIPGKTUF7_cjs.ChatPage,
722
1072
  {
723
1073
  chat: { ...chat, assistantMode: void 0, setAssistantMode: void 0 },
724
1074
  documentsRequired: false,
@@ -780,51 +1130,51 @@ function ConnectedAgentChatPanel({
780
1130
 
781
1131
  Object.defineProperty(exports, "ConnectedAssistantDock", {
782
1132
  enumerable: true,
783
- get: function () { return chunkG5QTGKDJ_cjs.ConnectedAssistantDock; }
1133
+ get: function () { return chunkHITAN7JF_cjs.ConnectedAssistantDock; }
784
1134
  });
785
1135
  Object.defineProperty(exports, "redlineStats", {
786
1136
  enumerable: true,
787
- get: function () { return chunkG5QTGKDJ_cjs.redlineStats; }
1137
+ get: function () { return chunkHITAN7JF_cjs.redlineStats; }
788
1138
  });
789
1139
  Object.defineProperty(exports, "textToArtifact", {
790
1140
  enumerable: true,
791
- get: function () { return chunkG5QTGKDJ_cjs.textToArtifact; }
1141
+ get: function () { return chunkHITAN7JF_cjs.textToArtifact; }
792
1142
  });
793
1143
  Object.defineProperty(exports, "toRedlineMarkdown", {
794
1144
  enumerable: true,
795
- get: function () { return chunkG5QTGKDJ_cjs.toRedlineMarkdown; }
1145
+ get: function () { return chunkHITAN7JF_cjs.toRedlineMarkdown; }
796
1146
  });
797
1147
  Object.defineProperty(exports, "useConnectedAiTask", {
798
1148
  enumerable: true,
799
- get: function () { return chunkG5QTGKDJ_cjs.useConnectedAiTask; }
1149
+ get: function () { return chunkHITAN7JF_cjs.useConnectedAiTask; }
800
1150
  });
801
1151
  Object.defineProperty(exports, "useConnectedChat", {
802
1152
  enumerable: true,
803
- get: function () { return chunkG5QTGKDJ_cjs.useConnectedChat; }
1153
+ get: function () { return chunkHITAN7JF_cjs.useConnectedChat; }
804
1154
  });
805
1155
  Object.defineProperty(exports, "useSemanticSearch", {
806
1156
  enumerable: true,
807
- get: function () { return chunkG5QTGKDJ_cjs.useSemanticSearch; }
1157
+ get: function () { return chunkHITAN7JF_cjs.useSemanticSearch; }
808
1158
  });
809
1159
  Object.defineProperty(exports, "useWorkspaceDocs", {
810
1160
  enumerable: true,
811
- get: function () { return chunkG5QTGKDJ_cjs.useWorkspaceDocs; }
1161
+ get: function () { return chunkHITAN7JF_cjs.useWorkspaceDocs; }
812
1162
  });
813
1163
  Object.defineProperty(exports, "ConnectionProvider", {
814
1164
  enumerable: true,
815
- get: function () { return chunkTHO7DZNN_cjs.ConnectionProvider; }
1165
+ get: function () { return chunkMUMH3Z6K_cjs.ConnectionProvider; }
816
1166
  });
817
1167
  Object.defineProperty(exports, "SESSION_EXPIRED_MESSAGE", {
818
1168
  enumerable: true,
819
- get: function () { return chunkTHO7DZNN_cjs.SESSION_EXPIRED_MESSAGE; }
1169
+ get: function () { return chunkMUMH3Z6K_cjs.SESSION_EXPIRED_MESSAGE; }
820
1170
  });
821
1171
  Object.defineProperty(exports, "isAuthenticated", {
822
1172
  enumerable: true,
823
- get: function () { return chunkTHO7DZNN_cjs.isAuthenticated; }
1173
+ get: function () { return chunkMUMH3Z6K_cjs.isAuthenticated; }
824
1174
  });
825
1175
  Object.defineProperty(exports, "useConnection", {
826
1176
  enumerable: true,
827
- get: function () { return chunkTHO7DZNN_cjs.useConnection; }
1177
+ get: function () { return chunkMUMH3Z6K_cjs.useConnection; }
828
1178
  });
829
1179
  exports.ArbiAppProvider = ArbiAppProvider;
830
1180
  exports.ConnectedAgentChatPanel = ConnectedAgentChatPanel;
@@ -838,6 +1188,8 @@ exports.ConnectedSecuritySection = ConnectedSecuritySection;
838
1188
  exports.ConnectedSessionsRow = ConnectedSessionsRow;
839
1189
  exports.ConnectedSkillUpload = ConnectedSkillUpload;
840
1190
  exports.ConnectedTaskAccessRequest = ConnectedTaskAccessRequest;
1191
+ exports.ConnectedWorkflowRunner = ConnectedWorkflowRunner;
1192
+ exports.DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS = DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS;
841
1193
  exports.StreamedArtifact = StreamedArtifact;
842
1194
  exports.defaultUnmetPasswordRequirement = defaultUnmetPasswordRequirement;
843
1195
  exports.useConnectedDocxNotifications = useConnectedDocxNotifications;