@arbidocs/blocks 0.4.87 → 0.4.89

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 (88) hide show
  1. package/dist/agents/index.cjs +284 -284
  2. package/dist/agents/index.js +8 -8
  3. package/dist/chat/index.cjs +125 -125
  4. package/dist/chat/index.js +3 -3
  5. package/dist/{chunk-2EI7NCUA.cjs → chunk-2CFW2ELM.cjs} +8 -2
  6. package/dist/chunk-2CFW2ELM.cjs.map +1 -0
  7. package/dist/{chunk-2FBQSQDW.js → chunk-3D5MDCQ7.js} +299 -215
  8. package/dist/chunk-3D5MDCQ7.js.map +1 -0
  9. package/dist/{chunk-OR4CO743.cjs → chunk-5YXG342J.cjs} +3 -3
  10. package/dist/{chunk-OR4CO743.cjs.map → chunk-5YXG342J.cjs.map} +1 -1
  11. package/dist/{chunk-R26OHONI.js → chunk-6S5FLMWG.js} +83 -72
  12. package/dist/chunk-6S5FLMWG.js.map +1 -0
  13. package/dist/{chunk-X5K5PCRJ.cjs → chunk-CNI5QJ5B.cjs} +58 -58
  14. package/dist/{chunk-X5K5PCRJ.cjs.map → chunk-CNI5QJ5B.cjs.map} +1 -1
  15. package/dist/{chunk-P5ST47VY.js → chunk-DDF5GPIJ.js} +3 -3
  16. package/dist/{chunk-P5ST47VY.js.map → chunk-DDF5GPIJ.js.map} +1 -1
  17. package/dist/{chunk-PFA43QNX.js → chunk-EWSEQEPL.js} +3 -3
  18. package/dist/{chunk-PFA43QNX.js.map → chunk-EWSEQEPL.js.map} +1 -1
  19. package/dist/{chunk-YX466FWL.js → chunk-I44NX2ZB.js} +3 -3
  20. package/dist/{chunk-YX466FWL.js.map → chunk-I44NX2ZB.js.map} +1 -1
  21. package/dist/{chunk-LBE36YNZ.js → chunk-ICBAFX5B.js} +3 -3
  22. package/dist/{chunk-LBE36YNZ.js.map → chunk-ICBAFX5B.js.map} +1 -1
  23. package/dist/{chunk-C3DRLFU7.cjs → chunk-IF6VAYIA.cjs} +5 -5
  24. package/dist/{chunk-C3DRLFU7.cjs.map → chunk-IF6VAYIA.cjs.map} +1 -1
  25. package/dist/{chunk-5XZU64E2.cjs → chunk-MOJ5JQDN.cjs} +3 -3
  26. package/dist/{chunk-5XZU64E2.cjs.map → chunk-MOJ5JQDN.cjs.map} +1 -1
  27. package/dist/{chunk-O5NDG4EA.cjs → chunk-MP6FK43E.cjs} +3 -3
  28. package/dist/{chunk-O5NDG4EA.cjs.map → chunk-MP6FK43E.cjs.map} +1 -1
  29. package/dist/{chunk-AFSOUS5X.cjs → chunk-N26CXGXC.cjs} +83 -72
  30. package/dist/chunk-N26CXGXC.cjs.map +1 -0
  31. package/dist/{chunk-UJM7TG44.js → chunk-QLHW7JGN.js} +9 -9
  32. package/dist/{chunk-UJM7TG44.js.map → chunk-QLHW7JGN.js.map} +1 -1
  33. package/dist/{chunk-QOADH2YB.cjs → chunk-TF6YMDZL.cjs} +300 -216
  34. package/dist/chunk-TF6YMDZL.cjs.map +1 -0
  35. package/dist/{chunk-GFYGYME3.js → chunk-W7NZRZ54.js} +3 -3
  36. package/dist/{chunk-GFYGYME3.js.map → chunk-W7NZRZ54.js.map} +1 -1
  37. package/dist/{chunk-HUJLKDWX.cjs → chunk-XMBYDLZQ.cjs} +4 -4
  38. package/dist/{chunk-HUJLKDWX.cjs.map → chunk-XMBYDLZQ.cjs.map} +1 -1
  39. package/dist/{chunk-WDD255XQ.js → chunk-XQDM6T6C.js} +3 -3
  40. package/dist/{chunk-WDD255XQ.js.map → chunk-XQDM6T6C.js.map} +1 -1
  41. package/dist/{chunk-ZV3BKLFY.cjs → chunk-Z5VUZ6YD.cjs} +3 -3
  42. package/dist/{chunk-ZV3BKLFY.cjs.map → chunk-Z5VUZ6YD.cjs.map} +1 -1
  43. package/dist/{chunk-YU2KUMGE.js → chunk-ZX2VPMBJ.js} +8 -2
  44. package/dist/chunk-ZX2VPMBJ.js.map +1 -0
  45. package/dist/connect/index.cjs +116 -74
  46. package/dist/connect/index.cjs.map +1 -1
  47. package/dist/connect/index.js +61 -19
  48. package/dist/connect/index.js.map +1 -1
  49. package/dist/connection/WorkflowRunnerDialogs.d.ts +2 -0
  50. package/dist/facts/index.cjs +7 -7
  51. package/dist/facts/index.js +4 -4
  52. package/dist/files/index.cjs +4 -23
  53. package/dist/files/index.cjs.map +1 -1
  54. package/dist/files/index.js +4 -22
  55. package/dist/files/index.js.map +1 -1
  56. package/dist/files/views/TagFormParts.d.ts +0 -8
  57. package/dist/files/views/index.d.ts +1 -1
  58. package/dist/home/index.cjs +17 -17
  59. package/dist/home/index.js +3 -3
  60. package/dist/index.cjs +636 -544
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.js +116 -25
  63. package/dist/index.js.map +1 -1
  64. package/dist/retrieval/index.cjs +1 -1
  65. package/dist/retrieval/index.js +1 -1
  66. package/dist/settings/index.cjs +38 -38
  67. package/dist/settings/index.js +3 -3
  68. package/dist/shell/FilterInput.d.ts +3 -1
  69. package/dist/shell/index.cjs +5 -5
  70. package/dist/shell/index.js +2 -2
  71. package/dist/studio/index.cjs +4 -4
  72. package/dist/studio/index.js +3 -3
  73. package/dist/tags/TagDetail.d.ts +14 -2
  74. package/dist/tags/TagTable.d.ts +20 -11
  75. package/dist/tags/TagsNav.d.ts +28 -4
  76. package/dist/tags/index.d.ts +1 -1
  77. package/dist/tags/tagTableModel.d.ts +10 -2
  78. package/dist/workflow-canvas/index.cjs +51 -51
  79. package/dist/workflow-canvas/index.js +8 -8
  80. package/dist/workspaces/index.cjs +2 -2
  81. package/dist/workspaces/index.js +2 -2
  82. package/package.json +4 -4
  83. package/dist/chunk-2EI7NCUA.cjs.map +0 -1
  84. package/dist/chunk-2FBQSQDW.js.map +0 -1
  85. package/dist/chunk-AFSOUS5X.cjs.map +0 -1
  86. package/dist/chunk-QOADH2YB.cjs.map +0 -1
  87. package/dist/chunk-R26OHONI.js.map +0 -1
  88. package/dist/chunk-YU2KUMGE.js.map +0 -1
@@ -2,29 +2,29 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMUMH3Z6K_cjs = require('../chunk-MUMH3Z6K.cjs');
5
- var chunkX5K5PCRJ_cjs = require('../chunk-X5K5PCRJ.cjs');
5
+ var chunkCNI5QJ5B_cjs = require('../chunk-CNI5QJ5B.cjs');
6
6
  require('../chunk-S5HZBXZA.cjs');
7
7
  require('../chunk-ZW6FPIFC.cjs');
8
- var chunk5XZU64E2_cjs = require('../chunk-5XZU64E2.cjs');
9
- require('../chunk-AFSOUS5X.cjs');
8
+ var chunkMOJ5JQDN_cjs = require('../chunk-MOJ5JQDN.cjs');
9
+ require('../chunk-N26CXGXC.cjs');
10
10
  require('../chunk-7RGLTF76.cjs');
11
+ require('../chunk-Z5VUZ6YD.cjs');
12
+ require('../chunk-7D737FLE.cjs');
11
13
  require('../chunk-3AFWGEDJ.cjs');
12
14
  require('../chunk-VFUWWH52.cjs');
13
15
  require('../chunk-DETZZBG2.cjs');
14
16
  require('../chunk-V4ISCZJ7.cjs');
15
- require('../chunk-2EI7NCUA.cjs');
16
- require('../chunk-ZV3BKLFY.cjs');
17
- require('../chunk-7D737FLE.cjs');
17
+ require('../chunk-2CFW2ELM.cjs');
18
18
  require('../chunk-OB5F4577.cjs');
19
19
  require('../chunk-B4SRYJLM.cjs');
20
20
  require('../chunk-7UTB4PHM.cjs');
21
21
  require('../chunk-PPCATBOY.cjs');
22
+ require('../chunk-C54XEN5T.cjs');
23
+ require('../chunk-KDG6FER6.cjs');
22
24
  require('../chunk-ULWRNGGE.cjs');
23
25
  require('../chunk-IXALYQT7.cjs');
24
26
  require('../chunk-FX3K6LNZ.cjs');
25
27
  require('../chunk-MHVNT4J3.cjs');
26
- require('../chunk-C54XEN5T.cjs');
27
- require('../chunk-KDG6FER6.cjs');
28
28
  require('../chunk-DES3K4SD.cjs');
29
29
  var react = require('react');
30
30
  var react$2 = require('@arbidocs/react');
@@ -59,11 +59,11 @@ function withSteps(workflow, steps, layout) {
59
59
  const run = workflow.run.kind === "steps" ? workflow.run : { kind: "steps", steps: [] };
60
60
  return {
61
61
  ...workflow,
62
- run: { ...run, steps: chunk5XZU64E2_cjs.orderSteps(steps), layout: layout ?? run.layout }
62
+ run: { ...run, steps: chunkMOJ5JQDN_cjs.orderSteps(steps), layout: layout ?? run.layout }
63
63
  };
64
64
  }
65
65
  var layoutOf = (workflow) => workflow.run.kind === "steps" && workflow.run.layout || {};
66
- var explicit = (steps) => steps.map((s) => ({ ...s, after: chunk5XZU64E2_cjs.stepDependencies(steps, s.id) }));
66
+ var explicit = (steps) => steps.map((s) => ({ ...s, after: chunkMOJ5JQDN_cjs.stepDependencies(steps, s.id) }));
67
67
  function stepIdFor(steps, title) {
68
68
  const base = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").replace(/^[^a-z]+/, "") || "step";
69
69
  const taken = new Set(steps.map((s) => s.id));
@@ -110,7 +110,7 @@ function blankStep(kind, id, title) {
110
110
  }
111
111
  }
112
112
  function addStep(workflow, kind, options = {}) {
113
- const steps = explicit(chunk5XZU64E2_cjs.workflowSteps(workflow));
113
+ const steps = explicit(chunkMOJ5JQDN_cjs.workflowSteps(workflow));
114
114
  const title = options.title ?? DEFAULT_TITLES[kind];
115
115
  const id = stepIdFor(steps, title);
116
116
  const step = { ...blankStep(kind, id, title), after: options.after ? [options.after] : [] };
@@ -119,7 +119,7 @@ function addStep(workflow, kind, options = {}) {
119
119
  return { workflow: withSteps(workflow, [...steps, step], layout), id };
120
120
  }
121
121
  function removeStep(workflow, id) {
122
- const steps = explicit(chunk5XZU64E2_cjs.workflowSteps(workflow));
122
+ const steps = explicit(chunkMOJ5JQDN_cjs.workflowSteps(workflow));
123
123
  const removed = steps.find((s) => s.id === id);
124
124
  if (!removed) return workflow;
125
125
  const bridged = steps.filter((s) => s.id !== id).map(
@@ -132,8 +132,8 @@ function removeStep(workflow, id) {
132
132
  return withSteps(workflow, bridged, layout);
133
133
  }
134
134
  function connectSteps(workflow, from, to) {
135
- const steps = explicit(chunk5XZU64E2_cjs.workflowSteps(workflow));
136
- if (from === to || !steps.some((s) => s.id === from) || chunk5XZU64E2_cjs.dependsOn(steps, from, to)) {
135
+ const steps = explicit(chunkMOJ5JQDN_cjs.workflowSteps(workflow));
136
+ if (from === to || !steps.some((s) => s.id === from) || chunkMOJ5JQDN_cjs.dependsOn(steps, from, to)) {
137
137
  return workflow;
138
138
  }
139
139
  return withSteps(
@@ -143,16 +143,16 @@ function connectSteps(workflow, from, to) {
143
143
  )
144
144
  );
145
145
  }
146
- var wouldCycle = (workflow, from, to) => from === to || chunk5XZU64E2_cjs.dependsOn(chunk5XZU64E2_cjs.workflowSteps(workflow), from, to);
146
+ var wouldCycle = (workflow, from, to) => from === to || chunkMOJ5JQDN_cjs.dependsOn(chunkMOJ5JQDN_cjs.workflowSteps(workflow), from, to);
147
147
  function disconnectSteps(workflow, from, to) {
148
- const steps = explicit(chunk5XZU64E2_cjs.workflowSteps(workflow));
148
+ const steps = explicit(chunkMOJ5JQDN_cjs.workflowSteps(workflow));
149
149
  return withSteps(
150
150
  workflow,
151
151
  steps.map((s) => s.id === to ? { ...s, after: (s.after ?? []).filter((d) => d !== from) } : s)
152
152
  );
153
153
  }
154
154
  function updateStep(workflow, id, patch) {
155
- const steps = explicit(chunk5XZU64E2_cjs.workflowSteps(workflow));
155
+ const steps = explicit(chunkMOJ5JQDN_cjs.workflowSteps(workflow));
156
156
  return withSteps(
157
157
  workflow,
158
158
  steps.map(
@@ -166,7 +166,7 @@ var renameIn = (text, from, to) => text.replace(
166
166
  );
167
167
  function renameInput(workflow, from, to) {
168
168
  if (from === to) return workflow;
169
- const steps = chunk5XZU64E2_cjs.workflowSteps(workflow).map((s) => {
169
+ const steps = chunkMOJ5JQDN_cjs.workflowSteps(workflow).map((s) => {
170
170
  if (s.kind === "agent")
171
171
  return {
172
172
  ...s,
@@ -215,13 +215,13 @@ function renameInput(workflow, from, to) {
215
215
  var renamePerson = (a, from, to) => "input" in a && a.input === from ? { input: to } : a;
216
216
  var renameRef = (r, from, to) => "input" in r && r.input === from ? { input: to } : r;
217
217
  function moveStep(workflow, id, position) {
218
- return withSteps(workflow, chunk5XZU64E2_cjs.workflowSteps(workflow), { ...layoutOf(workflow), [id]: position });
218
+ return withSteps(workflow, chunkMOJ5JQDN_cjs.workflowSteps(workflow), { ...layoutOf(workflow), [id]: position });
219
219
  }
220
220
  var COLUMN = 300;
221
221
  var ROW = 140;
222
222
  function autoLayout(steps) {
223
223
  const layout = {};
224
- chunk5XZU64E2_cjs.stepLevels(steps).forEach(
224
+ chunkMOJ5JQDN_cjs.stepLevels(steps).forEach(
225
225
  (level, x) => level.forEach((s, y) => {
226
226
  layout[s.id] = { x: x * COLUMN, y: (y - (level.length - 1) / 2) * ROW };
227
227
  })
@@ -229,7 +229,7 @@ function autoLayout(steps) {
229
229
  return layout;
230
230
  }
231
231
  function layoutWithDefaults(workflow) {
232
- const auto = autoLayout(chunk5XZU64E2_cjs.workflowSteps(workflow));
232
+ const auto = autoLayout(chunkMOJ5JQDN_cjs.workflowSteps(workflow));
233
233
  return { ...auto, ...layoutOf(workflow) };
234
234
  }
235
235
  var DEFAULT_SIGNALS_EDITOR_LABELS = {
@@ -326,9 +326,9 @@ function SignalsEditor({
326
326
  {
327
327
  className: ui.cn(
328
328
  "space-y-1.5 rounded-md border p-2",
329
- chunk5XZU64E2_cjs.isIncompleteSignal(signal) ? "border-destructive/50" : "border-border"
329
+ chunkMOJ5JQDN_cjs.isIncompleteSignal(signal) ? "border-destructive/50" : "border-border"
330
330
  ),
331
- "data-incomplete": chunk5XZU64E2_cjs.isIncompleteSignal(signal) || void 0,
331
+ "data-incomplete": chunkMOJ5JQDN_cjs.isIncompleteSignal(signal) || void 0,
332
332
  "data-testid": `${testId}-${i}`,
333
333
  children: [
334
334
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
@@ -1043,7 +1043,7 @@ function StepInspector({
1043
1043
  testId = "step-inspector"
1044
1044
  }) {
1045
1045
  const l = { ...DEFAULT_STEP_INSPECTOR_LABELS, ...labels };
1046
- const steps = chunk5XZU64E2_cjs.workflowSteps(workflow);
1046
+ const steps = chunkMOJ5JQDN_cjs.workflowSteps(workflow);
1047
1047
  const step = steps.find((s) => s.id === stepId);
1048
1048
  const run = workflow.run.kind === "steps" ? workflow.run : void 0;
1049
1049
  if (!step || !run) {
@@ -1070,8 +1070,8 @@ function StepInspector({
1070
1070
  const patch = (p) => onChange(updateStep(workflow, step.id, p));
1071
1071
  const al = { ...DEFAULT_STEP_ACTION_SETTINGS_LABELS, ...actionLabels };
1072
1072
  const ctx = {
1073
- earlier: chunk5XZU64E2_cjs.upstreamSteps(steps, step.id),
1074
- fields: chunk5XZU64E2_cjs.runFields(workflow),
1073
+ earlier: chunkMOJ5JQDN_cjs.upstreamSteps(steps, step.id),
1074
+ fields: chunkMOJ5JQDN_cjs.runFields(workflow),
1075
1075
  people,
1076
1076
  tags,
1077
1077
  documents
@@ -1092,7 +1092,7 @@ function StepInspector({
1092
1092
  )
1093
1093
  );
1094
1094
  };
1095
- const deps = chunk5XZU64E2_cjs.stepDependencies(steps, step.id);
1095
+ const deps = chunkMOJ5JQDN_cjs.stepDependencies(steps, step.id);
1096
1096
  const titleOf = (id) => steps.find((s) => s.id === id)?.title ?? id;
1097
1097
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": `${testId}-step`, children: [
1098
1098
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
@@ -1172,7 +1172,7 @@ function StepInspector({
1172
1172
  {
1173
1173
  step,
1174
1174
  workflows,
1175
- fields: chunk5XZU64E2_cjs.runFields(workflow).map((f) => f.name),
1175
+ fields: chunkMOJ5JQDN_cjs.runFields(workflow).map((f) => f.name),
1176
1176
  patch,
1177
1177
  l,
1178
1178
  testId
@@ -1232,7 +1232,7 @@ function StepInspector({
1232
1232
  testId: `${testId}-review-grid`
1233
1233
  }
1234
1234
  ),
1235
- chunk5XZU64E2_cjs.canAssign(step) && /* @__PURE__ */ jsxRuntime.jsx(AssigneeSettings, { step, patch, ctx, l: al, testId }),
1235
+ chunkMOJ5JQDN_cjs.canAssign(step) && /* @__PURE__ */ jsxRuntime.jsx(AssigneeSettings, { step, patch, ctx, l: al, testId }),
1236
1236
  /* @__PURE__ */ jsxRuntime.jsx(
1237
1237
  SignalsEditor,
1238
1238
  {
@@ -1488,7 +1488,7 @@ function triggerFields(trigger, clearOthers) {
1488
1488
  return {
1489
1489
  timezone: trigger.timezone,
1490
1490
  rrule: trigger.start === "repeat" ? trigger.rrule.trim() : none,
1491
- run_at: trigger.start === "once" ? chunkX5K5PCRJ_cjs.localInputToIso(trigger.runAt) : none,
1491
+ run_at: trigger.start === "once" ? chunkCNI5QJ5B_cjs.localInputToIso(trigger.runAt) : none,
1492
1492
  event_kind: trigger.start === "event" ? trigger.eventKind.trim() : none,
1493
1493
  // A step signal is `workflow_signal` narrowed to one signal name.
1494
1494
  event_filter: filter ?? none,
@@ -1504,7 +1504,7 @@ function plan(value, options) {
1504
1504
  criteria: [],
1505
1505
  max_passes: 3,
1506
1506
  documents: [],
1507
- steps: chunk5XZU64E2_cjs.toPlanSteps(value.workflow, options)
1507
+ steps: chunkMOJ5JQDN_cjs.toPlanSteps(value.workflow, options)
1508
1508
  };
1509
1509
  }
1510
1510
  function builderToWorkflowRequest(value, workspaceId, options = {}) {
@@ -1539,7 +1539,7 @@ function builderToWorkflowUpdate(value, options = {}) {
1539
1539
  }
1540
1540
  function workflowRecordToBuilder(record) {
1541
1541
  const planned = record.plan?.steps ?? [];
1542
- const steps = planned.length ? chunk5XZU64E2_cjs.fromPlanSteps(planned) : record.prompt || record.skill_ref ? [
1542
+ const steps = planned.length ? chunkMOJ5JQDN_cjs.fromPlanSteps(planned) : record.prompt || record.skill_ref ? [
1543
1543
  {
1544
1544
  id: "work",
1545
1545
  kind: "agent",
@@ -1547,7 +1547,7 @@ function workflowRecordToBuilder(record) {
1547
1547
  ...record.skill_ref ? { workflow: record.skill_ref } : { run: { kind: "prompt", promptTemplate: record.prompt } }
1548
1548
  }
1549
1549
  ] : [];
1550
- const when = chunkX5K5PCRJ_cjs.workflowWhen(record);
1550
+ const when = chunkCNI5QJ5B_cjs.workflowWhen(record);
1551
1551
  return {
1552
1552
  workflow: {
1553
1553
  id: record.external_id,
@@ -1556,12 +1556,12 @@ function workflowRecordToBuilder(record) {
1556
1556
  inputs: [],
1557
1557
  landing: "chat",
1558
1558
  schedulable: false,
1559
- run: { kind: "steps", steps, layout: chunk5XZU64E2_cjs.layoutFromPlanSteps(planned ?? []) }
1559
+ run: { kind: "steps", steps, layout: chunkMOJ5JQDN_cjs.layoutFromPlanSteps(planned ?? []) }
1560
1560
  },
1561
1561
  trigger: {
1562
1562
  ...DEFAULT_WORKFLOW_TRIGGER,
1563
1563
  start: when === "now" ? "manual" : when,
1564
- runAt: chunkX5K5PCRJ_cjs.isoToLocalInput(record.run_at),
1564
+ runAt: chunkCNI5QJ5B_cjs.isoToLocalInput(record.run_at),
1565
1565
  rrule: record.rrule ?? "",
1566
1566
  timezone: record.timezone || DEFAULT_WORKFLOW_TRIGGER.timezone,
1567
1567
  eventKind: record.event_kind ?? "",
@@ -1617,7 +1617,7 @@ function triggerSummary(trigger, options = {}) {
1617
1617
  case "once":
1618
1618
  return trigger.runAt ? new Date(trigger.runAt).toLocaleString() : l.starts.once;
1619
1619
  case "repeat":
1620
- return trigger.rrule ? chunkX5K5PCRJ_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
1620
+ return trigger.rrule ? chunkCNI5QJ5B_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
1621
1621
  case "event":
1622
1622
  if (isSignalTrigger(trigger))
1623
1623
  return trigger.signal ? l.signalSummary.replace("{signal}", trigger.signal) : l.stepSignals;
@@ -1676,7 +1676,7 @@ function TriggerInspector({
1676
1676
  }
1677
1677
  )
1678
1678
  ] }),
1679
- trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkX5K5PCRJ_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1679
+ trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkCNI5QJ5B_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1680
1680
  trigger.start === "event" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1681
1681
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.event }),
1682
1682
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1728,7 +1728,7 @@ function TriggerInspector({
1728
1728
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1729
1729
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.agent }),
1730
1730
  /* @__PURE__ */ jsxRuntime.jsx(
1731
- chunkX5K5PCRJ_cjs.AgentSelect,
1731
+ chunkCNI5QJ5B_cjs.AgentSelect,
1732
1732
  {
1733
1733
  agents,
1734
1734
  value: trigger.agentId,
@@ -2038,12 +2038,12 @@ function WorkflowCanvas({
2038
2038
  testId = "workflow-canvas"
2039
2039
  }) {
2040
2040
  const l = react.useMemo(() => ({ ...DEFAULT_WORKFLOW_CANVAS_LABELS, ...labels }), [labels]);
2041
- const steps = chunk5XZU64E2_cjs.workflowSteps(workflow);
2041
+ const steps = chunkMOJ5JQDN_cjs.workflowSteps(workflow);
2042
2042
  const editable = !!onChange;
2043
2043
  const built = react.useMemo(() => {
2044
2044
  const layout = layoutWithDefaults(workflow);
2045
- const all = chunk5XZU64E2_cjs.workflowSteps(workflow);
2046
- const roots = all.filter((s) => chunk5XZU64E2_cjs.stepDependencies(all, s.id).length === 0);
2045
+ const all = chunkMOJ5JQDN_cjs.workflowSteps(workflow);
2046
+ const roots = all.filter((s) => chunkMOJ5JQDN_cjs.stepDependencies(all, s.id).length === 0);
2047
2047
  const triggerNode = trigger ? [
2048
2048
  {
2049
2049
  id: TRIGGER_NODE,
@@ -2092,7 +2092,7 @@ function WorkflowCanvas({
2092
2092
  react.useEffect(() => setNodes(built), [built]);
2093
2093
  const edges = react.useMemo(
2094
2094
  () => steps.flatMap((s) => {
2095
- const deps = chunk5XZU64E2_cjs.stepDependencies(steps, s.id);
2095
+ const deps = chunkMOJ5JQDN_cjs.stepDependencies(steps, s.id);
2096
2096
  const from = deps.length ? deps : trigger ? [TRIGGER_NODE] : [];
2097
2097
  return from.map((d) => ({
2098
2098
  id: `${d}->${s.id}`,
@@ -2343,12 +2343,12 @@ function WorkflowBuilder({
2343
2343
  const [mode, setMode] = react.useState("design");
2344
2344
  const [adding, setAdding] = react.useState(false);
2345
2345
  const { workflow, trigger } = value;
2346
- const steps = chunk5XZU64E2_cjs.workflowSteps(workflow);
2347
- const problems = chunk5XZU64E2_cjs.validateWorkflowGraph(steps);
2348
- const missing = chunk5XZU64E2_cjs.stepConfigProblems(steps);
2346
+ const steps = chunkMOJ5JQDN_cjs.workflowSteps(workflow);
2347
+ const problems = chunkMOJ5JQDN_cjs.validateWorkflowGraph(steps);
2348
+ const missing = chunkMOJ5JQDN_cjs.stepConfigProblems(steps);
2349
2349
  const nameOf = (id) => people.find((p) => p.value === id)?.label;
2350
- const fields = chunk5XZU64E2_cjs.runFields(workflow);
2351
- const assigneeOf = (step) => chunk5XZU64E2_cjs.canAssign(step) ? chunk5XZU64E2_cjs.assigneeName(step.assignee, { nameOf, fields }) : void 0;
2350
+ const fields = chunkMOJ5JQDN_cjs.runFields(workflow);
2351
+ const assigneeOf = (step) => chunkMOJ5JQDN_cjs.canAssign(step) ? chunkMOJ5JQDN_cjs.assigneeName(step.assignee, { nameOf, fields }) : void 0;
2352
2352
  const titles = react.useMemo(() => new Map(workflows.map((w) => [w.id, w.title])), [workflows]);
2353
2353
  const setWorkflow = (next) => onChange({ ...value, workflow: next });
2354
2354
  const addAfter = (from, kind) => {
@@ -2579,13 +2579,13 @@ function WorkflowPreview({
2579
2579
  renderIcon,
2580
2580
  testId
2581
2581
  }) {
2582
- const run = chunkX5K5PCRJ_cjs.useWorkflowPreview(workflow, {
2582
+ const run = chunkCNI5QJ5B_cjs.useWorkflowPreview(workflow, {
2583
2583
  resolveWorkflow: (id) => workflows.find((w) => w.id === id),
2584
2584
  compose,
2585
2585
  answer
2586
2586
  });
2587
2587
  return /* @__PURE__ */ jsxRuntime.jsx(
2588
- chunk5XZU64E2_cjs.WorkflowRunner,
2588
+ chunkMOJ5JQDN_cjs.WorkflowRunner,
2589
2589
  {
2590
2590
  workflow,
2591
2591
  run,
@@ -2673,7 +2673,7 @@ function ConnectedWorkflowBuilder({
2673
2673
  () => [
2674
2674
  ...hostWorkflows,
2675
2675
  ...(skills.data ?? []).map(
2676
- (s) => chunk5XZU64E2_cjs.skillToWorkflow({
2676
+ (s) => chunkMOJ5JQDN_cjs.skillToWorkflow({
2677
2677
  name: s.name,
2678
2678
  slug: s.slug,
2679
2679
  description: s.description,
@@ -2689,7 +2689,7 @@ function ConnectedWorkflowBuilder({
2689
2689
  }));
2690
2690
  const tasks = (conversations.data ?? []).filter((c) => c.status && c.status !== "done").map((c) => ({ value: c.external_id, label: c.title || c.external_id }));
2691
2691
  const options = { resolveWorkflow: (wid) => workflows.find((w) => w.id === wid), compose };
2692
- const problem = triggerProblem(value.trigger) ?? (chunk5XZU64E2_cjs.validateWorkflowGraph(chunk5XZU64E2_cjs.workflowSteps(value.workflow)).length || chunk5XZU64E2_cjs.stepConfigProblems(chunk5XZU64E2_cjs.workflowSteps(value.workflow)).length ? "graph" : null);
2692
+ const problem = triggerProblem(value.trigger) ?? (chunkMOJ5JQDN_cjs.validateWorkflowGraph(chunkMOJ5JQDN_cjs.workflowSteps(value.workflow)).length || chunkMOJ5JQDN_cjs.stepConfigProblems(chunkMOJ5JQDN_cjs.workflowSteps(value.workflow)).length ? "graph" : null);
2693
2693
  const busy = !!pending || create.isPending || update.isPending || run.isPending;
2694
2694
  const save = async () => {
2695
2695
  if (!workspaceId) return void 0;
@@ -1,28 +1,28 @@
1
1
  "use client";
2
2
  import { useConnection } from '../chunk-OYMWV45N.js';
3
- import { workflowWhen, isoToLocalInput, describeRRule, RecurrenceBuilder, AgentSelect, useWorkflowPreview, localInputToIso } from '../chunk-UJM7TG44.js';
3
+ import { workflowWhen, isoToLocalInput, describeRRule, RecurrenceBuilder, AgentSelect, useWorkflowPreview, localInputToIso } from '../chunk-QLHW7JGN.js';
4
4
  import '../chunk-4XJZ6AAY.js';
5
5
  import '../chunk-P6GHJSLR.js';
6
- import { workflowSteps, dependsOn, stepLevels, isIncompleteSignal, runFields, upstreamSteps, stepDependencies, canAssign, fromPlanSteps, layoutFromPlanSteps, validateWorkflowGraph, stepConfigProblems, WorkflowRunner, skillToWorkflow, assigneeName, orderSteps, toPlanSteps } from '../chunk-YX466FWL.js';
7
- import '../chunk-R26OHONI.js';
6
+ import { workflowSteps, dependsOn, stepLevels, isIncompleteSignal, runFields, upstreamSteps, stepDependencies, canAssign, fromPlanSteps, layoutFromPlanSteps, validateWorkflowGraph, stepConfigProblems, WorkflowRunner, skillToWorkflow, assigneeName, orderSteps, toPlanSteps } from '../chunk-I44NX2ZB.js';
7
+ import '../chunk-6S5FLMWG.js';
8
8
  import '../chunk-4WWM3GQ5.js';
9
+ import '../chunk-DDF5GPIJ.js';
10
+ import '../chunk-XD2M6LIG.js';
9
11
  import '../chunk-RFXJYIDV.js';
10
12
  import '../chunk-DPLRHEJZ.js';
11
13
  import '../chunk-EVUEIBNU.js';
12
14
  import '../chunk-NUNKSZKU.js';
13
- import '../chunk-YU2KUMGE.js';
14
- import '../chunk-P5ST47VY.js';
15
- import '../chunk-XD2M6LIG.js';
15
+ import '../chunk-ZX2VPMBJ.js';
16
16
  import '../chunk-S7PSMMRG.js';
17
17
  import '../chunk-HOXKR26S.js';
18
18
  import '../chunk-AA3PT6KR.js';
19
19
  import '../chunk-NPLYHR2E.js';
20
+ import '../chunk-76JDDMSP.js';
21
+ import '../chunk-OXF2IFXG.js';
20
22
  import '../chunk-TX2ZICS7.js';
21
23
  import '../chunk-ZPLG7QYF.js';
22
24
  import '../chunk-SLSBJRWW.js';
23
25
  import '../chunk-7F6CBP3Z.js';
24
- import '../chunk-76JDDMSP.js';
25
- import '../chunk-OXF2IFXG.js';
26
26
  import '../chunk-VUNV25KB.js';
27
27
  import { useMemo, useState, useEffect, useCallback, useRef } from 'react';
28
28
  import { useWorkspaceUsers, useTags, useDocuments, useWorkflows, useSkills, useAgents, useConversations, useCreateWorkflow, useUpdateWorkflow, useRunWorkflow } from '@arbidocs/react';
@@ -4,10 +4,10 @@
4
4
  var chunkXZIYRKLW_cjs = require('../chunk-XZIYRKLW.cjs');
5
5
  var chunkXAJIKT6Y_cjs = require('../chunk-XAJIKT6Y.cjs');
6
6
  var chunkOB5F4577_cjs = require('../chunk-OB5F4577.cjs');
7
- var chunk7G2LJMUG_cjs = require('../chunk-7G2LJMUG.cjs');
8
- var chunkULWRNGGE_cjs = require('../chunk-ULWRNGGE.cjs');
9
7
  require('../chunk-C54XEN5T.cjs');
10
8
  var chunkKDG6FER6_cjs = require('../chunk-KDG6FER6.cjs');
9
+ var chunk7G2LJMUG_cjs = require('../chunk-7G2LJMUG.cjs');
10
+ var chunkULWRNGGE_cjs = require('../chunk-ULWRNGGE.cjs');
11
11
  require('../chunk-DES3K4SD.cjs');
12
12
  var react = require('react');
13
13
  var lucideReact = require('lucide-react');
@@ -2,10 +2,10 @@
2
2
  import { CollapsibleSection, KeyValueRow } from '../chunk-LGBAZD37.js';
3
3
  import { MemberAvatarStack } from '../chunk-XNOASBGW.js';
4
4
  import { ActionLink } from '../chunk-S7PSMMRG.js';
5
- export { RoleBadge, WorkspaceTypeBadgeView } from '../chunk-NBV56SGU.js';
6
- import { ModalHeader } from '../chunk-TX2ZICS7.js';
7
5
  import '../chunk-76JDDMSP.js';
8
6
  import { fromNow, fmtDate } from '../chunk-OXF2IFXG.js';
7
+ export { RoleBadge, WorkspaceTypeBadgeView } from '../chunk-NBV56SGU.js';
8
+ import { ModalHeader } from '../chunk-TX2ZICS7.js';
9
9
  import '../chunk-VUNV25KB.js';
10
10
  import { createContext, useContext, useMemo, useState, useCallback, useId } from 'react';
11
11
  import { FileText, MessagesSquare, Users, Check, ChevronRight, UserPlus, LogOut, AlertCircle, Plus, ArrowUpRight, AlignLeft, Globe, CreditCard, Loader2, FolderLock } from 'lucide-react';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/blocks",
3
- "version": "0.4.87",
3
+ "version": "0.4.89",
4
4
  "description": "Composable, domain-neutral UI blocks for ARBI apps, organised by capability (retrieval, facts, agents, workspaces, citations, collaboration) plus shell, theme and site primitives, on top of @arbidocs/react.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -266,8 +266,8 @@
266
266
  "example:test:e2e": "playwright test -c examples/custom-ui/playwright.config.ts"
267
267
  },
268
268
  "dependencies": {
269
- "@arbidocs/client": "0.4.87",
270
- "@arbidocs/coedit": "0.4.87",
269
+ "@arbidocs/client": "0.4.89",
270
+ "@arbidocs/coedit": "0.4.89",
271
271
  "@dnd-kit/core": "^6.3.1",
272
272
  "@dnd-kit/sortable": "^10.0.0",
273
273
  "@dnd-kit/utilities": "^3.2.2",
@@ -293,7 +293,7 @@
293
293
  "zustand": "^5.0.14"
294
294
  },
295
295
  "peerDependencies": {
296
- "@arbidocs/react": "0.4.87",
296
+ "@arbidocs/react": "0.4.89",
297
297
  "@docx-editor.dev/core": "2.28.0",
298
298
  "@docx-editor.dev/react": "2.28.0",
299
299
  "@lexical/html": "0.35.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shell/FilterInput.tsx"],"names":["jsx","cn","testIdOr","jsxs","Filter","Input","X","Popover","PopoverTrigger","SlidersHorizontal","PopoverContent","Command","CommandList","CommandGroup","CommandItem","Check"],"mappings":"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","file":"chunk-2EI7NCUA.cjs","sourcesContent":["/** Shared page filter with configurable searchable fields and optional quick-filter control. */\nimport type { ReactNode } from 'react'\nimport { X, Filter, SlidersHorizontal, Check } from 'lucide-react'\nimport {\n Command,\n CommandGroup,\n CommandItem,\n CommandList,\n Input,\n Popover,\n PopoverContent,\n PopoverTrigger,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\nexport type FilterField = 'text' | 'labels'\n\nexport const DEFAULT_FILTER_FIELDS: { value: FilterField; label: string }[] = [\n { value: 'text', label: 'Text' },\n { value: 'labels', label: 'Labels' },\n]\n\nexport interface FilterInputLabels<Field extends string = FilterField> {\n placeholder: string\n clear: string\n chooseFields: string\n fieldsHeading: string\n /** Display name per searchable field. */\n fieldNames: Partial<Record<Field, string>>\n}\n\nexport const DEFAULT_FILTER_INPUT_LABELS: FilterInputLabels = {\n placeholder: 'Filter...',\n clear: 'Clear filter',\n chooseFields: 'Choose fields to filter',\n fieldsHeading: 'Filter fields',\n fieldNames: { text: 'Text', labels: 'Labels' },\n}\n\nexport interface FilterInputTestIds<Field extends string = FilterField> {\n root: string\n quick: string\n input: string\n fieldsButton: string\n field: (field: Field) => string\n}\n\nexport interface FilterInputProps<Field extends string = FilterField> {\n fieldOptions?: { value: Field; label: string }[]\n value: string\n /** Lists with one searchable field need no field selector. */\n hideFieldPicker?: boolean\n ariaLabel?: string\n onChange: (q: string) => void\n fields: Field[]\n onFieldsChange: (fields: Field[]) => void\n /**\n * The quick-filter dropdown trigger, embedded inside the input on the left\n * (mirroring the Files search box). When absent, a static funnel icon shows.\n */\n filter?: ReactNode\n /** Width classes for the box (default `w-44`). */\n className?: string\n /** No outline: a soft fill instead of the input border, for a header that is already ruled. */\n borderless?: boolean\n labels?: Partial<FilterInputLabels<Field>>\n testIds?: Partial<FilterInputTestIds<Field>>\n}\n\nexport function FilterInput<Field extends string = FilterField>({\n fieldOptions,\n value,\n hideFieldPicker = false,\n ariaLabel,\n onChange,\n fields,\n onFieldsChange,\n filter,\n className,\n borderless = false,\n labels,\n testIds,\n}: FilterInputProps<Field>) {\n const l = { ...DEFAULT_FILTER_INPUT_LABELS, ...labels }\n const options = fieldOptions ?? (DEFAULT_FILTER_FIELDS as { value: Field; label: string }[])\n const toggleField = (field: Field) =>\n onFieldsChange(fields.includes(field) ? fields.filter((f) => f !== field) : [...fields, field])\n\n return (\n <div\n className={cn('flex min-w-0 items-center', className ?? 'w-44 pointer-coarse:w-56')}\n data-testid={testIdOr(testIds?.root, { testId: 'facts-filter' })}\n >\n <div className=\"relative flex-1 min-w-0\">\n {filter ? (\n <div\n className=\"absolute left-1 top-1/2 z-10 -translate-y-1/2\"\n data-testid={testIdOr(testIds?.quick, { testId: 'facts-filter-quick' })}\n >\n {filter}\n </div>\n ) : (\n <Filter className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n )}\n <Input\n aria-label={ariaLabel}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={l.placeholder}\n data-testid={testIdOr(testIds?.input, { testId: 'facts-filter-input' })}\n className={cn(\n 'h-7 pr-12 text-sm shadow-none focus-visible:ring-0 pointer-coarse:h-11 pointer-coarse:pr-12',\n // Touch: the 44px clear button only needs its room while there is text to clear, so\n // an empty field keeps space for its placeholder on a phone.\n value && 'pointer-coarse:pr-24',\n borderless\n ? 'border-transparent bg-muted/50 hover:bg-muted focus-visible:bg-muted'\n : 'border-input bg-background',\n filter ? 'pl-11' : 'pl-7',\n hideFieldPicker && 'pr-7 pointer-coarse:pr-11'\n )}\n />\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange('')}\n aria-label={l.clear}\n className={cn(\n 'absolute top-1/2 z-10 -translate-y-1/2 text-muted-foreground hover:text-foreground pointer-coarse:flex pointer-coarse:size-11 pointer-coarse:items-center pointer-coarse:justify-center',\n hideFieldPicker\n ? 'right-1.5 pointer-coarse:right-0'\n : 'right-7 pointer-coarse:right-11'\n )}\n >\n <X className=\"size-3\" />\n </button>\n )}\n {/* Field picker — inside the input on the right, muted, exactly as the\n Files search box renders it. */}\n {!hideFieldPicker && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={l.chooseFields}\n data-testid={testIdOr(testIds?.fieldsButton, {\n testId: 'facts-filter-fields-button',\n })}\n className=\"absolute right-1.5 top-1/2 z-10 -translate-y-1/2 !h-5 !w-5 !p-0 text-muted-foreground/60 transition-colors hover:text-foreground pointer-coarse:right-0 pointer-coarse:!flex pointer-coarse:!h-11 pointer-coarse:!w-11 pointer-coarse:items-center pointer-coarse:justify-center\"\n >\n <SlidersHorizontal className=\"size-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent className=\"w-44 p-0\" align=\"end\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandList>\n <CommandGroup heading={l.fieldsHeading}>\n {options.map((option) => {\n const isSelected = fields.includes(option.value)\n return (\n <CommandItem\n key={option.value}\n onSelect={() => toggleField(option.value)}\n className=\"cursor-pointer text-sm\"\n data-testid={testIdOr(testIds?.field?.(option.value), {\n testId: `facts-filter-field-${option.value}`,\n })}\n >\n <div\n className={cn(\n 'mr-2 flex size-3.5 items-center justify-center rounded-sm border border-primary',\n isSelected\n ? 'bg-primary text-primary-foreground'\n : 'opacity-50 [&_svg]:invisible'\n )}\n >\n <Check className=\"size-3\" />\n </div>\n {labels?.fieldNames?.[option.value] ?? option.label}\n </CommandItem>\n )\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )}\n </div>\n </div>\n )\n}\n"]}