@arbidocs/blocks 0.4.73 → 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 (58) hide show
  1. package/dist/agents/index.cjs +253 -253
  2. package/dist/agents/index.js +3 -3
  3. package/dist/agents/workflows/WorkflowRunner.d.ts +20 -4
  4. package/dist/agents/workflows/WorkflowStepBar.d.ts +23 -0
  5. package/dist/agents/workflows/run.d.ts +1 -0
  6. package/dist/agents/workflows/types.d.ts +2 -0
  7. package/dist/chat/index.cjs +124 -124
  8. package/dist/chat/index.js +3 -3
  9. package/dist/{chunk-IUR565UW.cjs → chunk-5LP54CWR.cjs} +32 -32
  10. package/dist/chunk-5LP54CWR.cjs.map +1 -0
  11. package/dist/{chunk-3SFFTSOI.cjs → chunk-7CVF3DK2.cjs} +5 -5
  12. package/dist/{chunk-3SFFTSOI.cjs.map → chunk-7CVF3DK2.cjs.map} +1 -1
  13. package/dist/{chunk-V3L5DONY.cjs → chunk-B4SRYJLM.cjs} +31 -2
  14. package/dist/chunk-B4SRYJLM.cjs.map +1 -0
  15. package/dist/{chunk-WOYUXVVQ.cjs → chunk-HITAN7JF.cjs} +4 -4
  16. package/dist/{chunk-WOYUXVVQ.cjs.map → chunk-HITAN7JF.cjs.map} +1 -1
  17. package/dist/{chunk-3VQYJBOI.js → chunk-HOXKR26S.js} +31 -4
  18. package/dist/chunk-HOXKR26S.js.map +1 -0
  19. package/dist/{chunk-KJ3QEKOJ.cjs → chunk-IPGKTUF7.cjs} +7 -33
  20. package/dist/chunk-IPGKTUF7.cjs.map +1 -0
  21. package/dist/{chunk-QDNXEB3T.js → chunk-KOSGX3UK.js} +5 -5
  22. package/dist/chunk-KOSGX3UK.js.map +1 -0
  23. package/dist/{chunk-ORA2XE7U.js → chunk-MK6NJQGF.js} +3 -3
  24. package/dist/{chunk-ORA2XE7U.js.map → chunk-MK6NJQGF.js.map} +1 -1
  25. package/dist/{chunk-GTNUQBXI.cjs → chunk-P2RBE3FD.cjs} +254 -102
  26. package/dist/chunk-P2RBE3FD.cjs.map +1 -0
  27. package/dist/{chunk-G5DP27DU.js → chunk-UIWLDSTF.js} +3 -29
  28. package/dist/chunk-UIWLDSTF.js.map +1 -0
  29. package/dist/{chunk-VRPRAU3J.js → chunk-WJEKRSPH.js} +3 -3
  30. package/dist/{chunk-VRPRAU3J.js.map → chunk-WJEKRSPH.js.map} +1 -1
  31. package/dist/{chunk-2P3T23C7.js → chunk-YWYVIQ7T.js} +256 -104
  32. package/dist/chunk-YWYVIQ7T.js.map +1 -0
  33. package/dist/connect/index.cjs +95 -36
  34. package/dist/connect/index.cjs.map +1 -1
  35. package/dist/connect/index.js +80 -21
  36. package/dist/connect/index.js.map +1 -1
  37. package/dist/connection/ConnectedWorkflowRunner.d.ts +5 -1
  38. package/dist/connection/useWorkflowThread.d.ts +4 -0
  39. package/dist/index.cjs +382 -382
  40. package/dist/index.js +6 -6
  41. package/dist/studio/index.cjs +4 -4
  42. package/dist/studio/index.js +3 -3
  43. package/dist/workflow-canvas/StepInspector.d.ts +11 -0
  44. package/dist/workflow-canvas/WorkflowCanvas.d.ts +6 -2
  45. package/dist/workflow-canvas/index.cjs +200 -90
  46. package/dist/workflow-canvas/index.cjs.map +1 -1
  47. package/dist/workflow-canvas/index.js +168 -58
  48. package/dist/workflow-canvas/index.js.map +1 -1
  49. package/dist/workflow-canvas/viewport.d.ts +47 -0
  50. package/package.json +4 -4
  51. package/dist/chunk-2P3T23C7.js.map +0 -1
  52. package/dist/chunk-3VQYJBOI.js.map +0 -1
  53. package/dist/chunk-G5DP27DU.js.map +0 -1
  54. package/dist/chunk-GTNUQBXI.cjs.map +0 -1
  55. package/dist/chunk-IUR565UW.cjs.map +0 -1
  56. package/dist/chunk-KJ3QEKOJ.cjs.map +0 -1
  57. package/dist/chunk-QDNXEB3T.js.map +0 -1
  58. package/dist/chunk-V3L5DONY.cjs.map +0 -1
@@ -2,16 +2,16 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkB3WCKBJ7_cjs = require('../chunk-B3WCKBJ7.cjs');
5
- var chunkWOYUXVVQ_cjs = require('../chunk-WOYUXVVQ.cjs');
5
+ var chunkHITAN7JF_cjs = require('../chunk-HITAN7JF.cjs');
6
6
  var chunkMUMH3Z6K_cjs = require('../chunk-MUMH3Z6K.cjs');
7
- var chunkGTNUQBXI_cjs = require('../chunk-GTNUQBXI.cjs');
7
+ var chunkP2RBE3FD_cjs = require('../chunk-P2RBE3FD.cjs');
8
8
  require('../chunk-DETZZBG2.cjs');
9
9
  require('../chunk-7D737FLE.cjs');
10
- var chunkQVBZESYQ_cjs = require('../chunk-QVBZESYQ.cjs');
11
10
  require('../chunk-ADOKTJHV.cjs');
12
- var chunkKJ3QEKOJ_cjs = require('../chunk-KJ3QEKOJ.cjs');
11
+ var chunkQVBZESYQ_cjs = require('../chunk-QVBZESYQ.cjs');
12
+ var chunkIPGKTUF7_cjs = require('../chunk-IPGKTUF7.cjs');
13
13
  require('../chunk-VGOFFCMT.cjs');
14
- require('../chunk-V3L5DONY.cjs');
14
+ require('../chunk-B4SRYJLM.cjs');
15
15
  require('../chunk-7UTB4PHM.cjs');
16
16
  require('../chunk-PPCATBOY.cjs');
17
17
  var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
@@ -188,13 +188,35 @@ function formValues(step, inputs) {
188
188
  if (step.kind !== "form") return void 0;
189
189
  return Object.fromEntries(step.inputs.map((f) => [f.name, inputs[f.name] ?? ""]));
190
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
+ }
191
213
  function useWorkflowThread(workflow, options = {}) {
192
214
  const arbi = react$1.useArbi();
193
215
  const { ensureWorkspaceOpen } = chunkMUMH3Z6K_cjs.useConnection();
194
- const { wsId } = chunkWOYUXVVQ_cjs.useWorkspaceDocs();
216
+ const { wsId } = chunkHITAN7JF_cjs.useWorkspaceDocs();
195
217
  const [threadId, setThreadId] = react.useState(options.conversationId);
196
218
  const [localInputs, setLocalInputs] = react.useState(
197
- () => chunkGTNUQBXI_cjs.initialRunInputs(workflow, options.initialInputs)
219
+ () => chunkP2RBE3FD_cjs.initialRunInputs(workflow, options.initialInputs)
198
220
  );
199
221
  const [edits, setEdits] = react.useState({});
200
222
  const [localStates, setLocalStates] = react.useState({});
@@ -203,12 +225,12 @@ function useWorkflowThread(workflow, options = {}) {
203
225
  const conversations = react$1.useConversations(wsId, { enabled: !!threadId, live: true });
204
226
  const conversation = conversations.data?.find((c) => c.external_id === threadId);
205
227
  const steps = react.useMemo(
206
- () => chunkGTNUQBXI_cjs.workflowSteps(workflow).length > 0 ? chunkGTNUQBXI_cjs.workflowSteps(workflow) : chunkGTNUQBXI_cjs.fromPlanSteps(conversation?.plan?.steps ?? []),
228
+ () => chunkP2RBE3FD_cjs.workflowSteps(workflow).length > 0 ? chunkP2RBE3FD_cjs.workflowSteps(workflow) : chunkP2RBE3FD_cjs.fromPlanSteps(conversation?.plan?.steps ?? []),
207
229
  [workflow, conversation?.plan?.steps]
208
230
  );
209
231
  const activity = react$1.useConversationActivity(threadId, { live: !!threadId });
210
232
  const serverStates = react.useMemo(
211
- () => chunkGTNUQBXI_cjs.stepStatesFromActivity(activity.data ?? []),
233
+ () => chunkP2RBE3FD_cjs.stepStatesFromActivity(activity.data ?? []),
212
234
  [activity.data]
213
235
  );
214
236
  const working = steps.some(
@@ -218,16 +240,14 @@ function useWorkflowThread(workflow, options = {}) {
218
240
  const answers = react.useMemo(() => {
219
241
  const byId = /* @__PURE__ */ new Map();
220
242
  for (const t of threads.data?.threads ?? [])
221
- for (const m of t.history) if (m.role === "assistant") byId.set(m.external_id, m.content);
243
+ for (const m of t.history)
244
+ if (m.role === "assistant" && m.content?.trim()) byId.set(m.external_id, m.content);
222
245
  return byId;
223
246
  }, [threads.data]);
224
- const answerMissing = Object.values(serverStates).some(
225
- (st) => st.status === "done" && !!st.responseId && !answers.has(st.responseId)
226
- );
227
- const refetchThreads = threads.refetch;
228
- react.useEffect(() => {
229
- if (answerMissing) void refetchThreads();
230
- }, [answerMissing, activity.data, refetchThreads]);
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);
231
251
  const states = react.useMemo(() => {
232
252
  if (!threadId) return localStates;
233
253
  const out = {};
@@ -262,7 +282,7 @@ function useWorkflowThread(workflow, options = {}) {
262
282
  if (!id) {
263
283
  await ensureWorkspaceOpen();
264
284
  const created = await createWork.mutateAsync({
265
- title: chunkGTNUQBXI_cjs.runThreadTitle(workflow, values).slice(0, 60),
285
+ title: chunkP2RBE3FD_cjs.runThreadTitle(workflow, values).slice(0, 60),
266
286
  description: workflow.description || null,
267
287
  prompt: null,
268
288
  skill_ref: null,
@@ -274,7 +294,7 @@ function useWorkflowThread(workflow, options = {}) {
274
294
  criteria: [],
275
295
  max_passes: 3,
276
296
  documents: [],
277
- steps: chunkGTNUQBXI_cjs.toPlanSteps(workflow, {
297
+ steps: chunkP2RBE3FD_cjs.toPlanSteps(workflow, {
278
298
  inputs: values,
279
299
  resolveWorkflow: options.resolveWorkflow,
280
300
  compose: options.compose
@@ -308,7 +328,7 @@ function useWorkflowThread(workflow, options = {}) {
308
328
  },
309
329
  [arbi, threadId, refresh]
310
330
  );
311
- const view = chunkGTNUQBXI_cjs.useWorkflowView({
331
+ const view = chunkP2RBE3FD_cjs.useWorkflowView({
312
332
  steps,
313
333
  states,
314
334
  inputs,
@@ -323,7 +343,8 @@ function useWorkflowThread(workflow, options = {}) {
323
343
  var DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS = {
324
344
  notify: "Ask to approve",
325
345
  notified: "Notified.",
326
- openThread: "Open the thread"
346
+ openThread: "Open the thread",
347
+ loadingAnswer: "Fetching the answer\u2026"
327
348
  };
328
349
  function ConnectedWorkflowRunner({
329
350
  workflow,
@@ -337,17 +358,21 @@ function ConnectedWorkflowRunner({
337
358
  const l = { ...DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, ...connectedLabels };
338
359
  const arbi = react$1.useArbi();
339
360
  const { ensureWorkspaceOpen } = chunkMUMH3Z6K_cjs.useConnection();
340
- const { wsId } = chunkWOYUXVVQ_cjs.useWorkspaceDocs();
361
+ const { wsId } = chunkHITAN7JF_cjs.useWorkspaceDocs();
341
362
  const { data: docs = [], refetch } = react$1.useDocuments(wsId);
342
363
  const [uploading, setUploading] = react.useState(false);
343
364
  const { view, conversationId } = useWorkflowThread(workflow, options);
365
+ const [added, setAdded] = react.useState({});
344
366
  const onUpload = react.useCallback(
345
- async (files) => {
346
- if (!files.length) return;
367
+ async (files2, step) => {
368
+ if (!files2.length) return;
347
369
  setUploading(true);
348
370
  try {
349
371
  await ensureWorkspaceOpen();
350
- for (const f of files) await arbi.documents.uploadFile(f, f.name);
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
+ }
351
376
  await refetch();
352
377
  } finally {
353
378
  setUploading(false);
@@ -355,9 +380,35 @@ function ConnectedWorkflowRunner({
355
380
  },
356
381
  [arbi, ensureWorkspaceOpen, refetch]
357
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]);
358
395
  const renderAgentOutput = (step, state) => {
359
396
  const status = state?.status;
360
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
+ }
361
412
  return /* @__PURE__ */ jsxRuntime.jsx(
362
413
  react$1.AiAnswer,
363
414
  {
@@ -384,7 +435,7 @@ function ConnectedWorkflowRunner({
384
435
  }
385
436
  ) }),
386
437
  /* @__PURE__ */ jsxRuntime.jsx(
387
- chunkGTNUQBXI_cjs.WorkflowRunner,
438
+ chunkP2RBE3FD_cjs.WorkflowRunner,
388
439
  {
389
440
  ...runnerProps,
390
441
  workflow,
@@ -401,12 +452,20 @@ function ConnectedWorkflowRunner({
401
452
  ) : null,
402
453
  onUpload,
403
454
  uploading,
404
- files: docs.map((d) => ({ id: d.external_id, name: d.file_name ?? d.external_id })),
455
+ files,
405
456
  testIdPrefix
406
457
  }
407
458
  )
408
459
  ] });
409
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
+ }
410
469
  function ReviewNotify({
411
470
  conversationId,
412
471
  workspaceId,
@@ -1009,7 +1068,7 @@ function mapWorkNotification(note) {
1009
1068
  function ActiveChat({ agentId, workspaceId }) {
1010
1069
  const chat = react$1.useArbiChat({ agentId, workspaceId });
1011
1070
  return /* @__PURE__ */ jsxRuntime.jsx(
1012
- chunkKJ3QEKOJ_cjs.ChatPage,
1071
+ chunkIPGKTUF7_cjs.ChatPage,
1013
1072
  {
1014
1073
  chat: { ...chat, assistantMode: void 0, setAssistantMode: void 0 },
1015
1074
  documentsRequired: false,
@@ -1071,35 +1130,35 @@ function ConnectedAgentChatPanel({
1071
1130
 
1072
1131
  Object.defineProperty(exports, "ConnectedAssistantDock", {
1073
1132
  enumerable: true,
1074
- get: function () { return chunkWOYUXVVQ_cjs.ConnectedAssistantDock; }
1133
+ get: function () { return chunkHITAN7JF_cjs.ConnectedAssistantDock; }
1075
1134
  });
1076
1135
  Object.defineProperty(exports, "redlineStats", {
1077
1136
  enumerable: true,
1078
- get: function () { return chunkWOYUXVVQ_cjs.redlineStats; }
1137
+ get: function () { return chunkHITAN7JF_cjs.redlineStats; }
1079
1138
  });
1080
1139
  Object.defineProperty(exports, "textToArtifact", {
1081
1140
  enumerable: true,
1082
- get: function () { return chunkWOYUXVVQ_cjs.textToArtifact; }
1141
+ get: function () { return chunkHITAN7JF_cjs.textToArtifact; }
1083
1142
  });
1084
1143
  Object.defineProperty(exports, "toRedlineMarkdown", {
1085
1144
  enumerable: true,
1086
- get: function () { return chunkWOYUXVVQ_cjs.toRedlineMarkdown; }
1145
+ get: function () { return chunkHITAN7JF_cjs.toRedlineMarkdown; }
1087
1146
  });
1088
1147
  Object.defineProperty(exports, "useConnectedAiTask", {
1089
1148
  enumerable: true,
1090
- get: function () { return chunkWOYUXVVQ_cjs.useConnectedAiTask; }
1149
+ get: function () { return chunkHITAN7JF_cjs.useConnectedAiTask; }
1091
1150
  });
1092
1151
  Object.defineProperty(exports, "useConnectedChat", {
1093
1152
  enumerable: true,
1094
- get: function () { return chunkWOYUXVVQ_cjs.useConnectedChat; }
1153
+ get: function () { return chunkHITAN7JF_cjs.useConnectedChat; }
1095
1154
  });
1096
1155
  Object.defineProperty(exports, "useSemanticSearch", {
1097
1156
  enumerable: true,
1098
- get: function () { return chunkWOYUXVVQ_cjs.useSemanticSearch; }
1157
+ get: function () { return chunkHITAN7JF_cjs.useSemanticSearch; }
1099
1158
  });
1100
1159
  Object.defineProperty(exports, "useWorkspaceDocs", {
1101
1160
  enumerable: true,
1102
- get: function () { return chunkWOYUXVVQ_cjs.useWorkspaceDocs; }
1161
+ get: function () { return chunkHITAN7JF_cjs.useWorkspaceDocs; }
1103
1162
  });
1104
1163
  Object.defineProperty(exports, "ConnectionProvider", {
1105
1164
  enumerable: true,