@arbidocs/blocks 0.4.77 → 0.4.78

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 (71) hide show
  1. package/dist/agents/index.cjs +289 -277
  2. package/dist/agents/index.js +5 -5
  3. package/dist/agents/tasks/WorkflowThreadStrip.d.ts +9 -4
  4. package/dist/agents/workflows/StepBarFrame.d.ts +75 -0
  5. package/dist/agents/workflows/WorkflowRunner.d.ts +5 -1
  6. package/dist/agents/workflows/WorkflowStepBar.d.ts +9 -11
  7. package/dist/agents/workflows/index.d.ts +2 -0
  8. package/dist/agents/workflows/stepWindow.d.ts +59 -0
  9. package/dist/chat/ChatPage.d.ts +1 -1
  10. package/dist/chat/chat-page-types.d.ts +5 -0
  11. package/dist/chat/index.cjs +124 -124
  12. package/dist/chat/index.js +2 -2
  13. package/dist/{chunk-HEVVT6IT.js → chunk-5OC5CGYX.js} +128 -124
  14. package/dist/chunk-5OC5CGYX.js.map +1 -0
  15. package/dist/chunk-CWAZNXC5.js +441 -0
  16. package/dist/chunk-CWAZNXC5.js.map +1 -0
  17. package/dist/{chunk-NIP5BOP7.js → chunk-EWSEQEPL.js} +5 -4
  18. package/dist/chunk-EWSEQEPL.js.map +1 -0
  19. package/dist/{chunk-UEU23PTW.js → chunk-ICBAFX5B.js} +3 -3
  20. package/dist/{chunk-UEU23PTW.js.map → chunk-ICBAFX5B.js.map} +1 -1
  21. package/dist/{chunk-EKIUMNCN.cjs → chunk-IF6VAYIA.cjs} +5 -5
  22. package/dist/{chunk-EKIUMNCN.cjs.map → chunk-IF6VAYIA.cjs.map} +1 -1
  23. package/dist/chunk-MLAHDAN5.cjs +450 -0
  24. package/dist/chunk-MLAHDAN5.cjs.map +1 -0
  25. package/dist/{chunk-HOD6OM7L.cjs → chunk-MP6FK43E.cjs} +5 -4
  26. package/dist/chunk-MP6FK43E.cjs.map +1 -0
  27. package/dist/{chunk-JFUN4D7D.cjs → chunk-SSDISIDW.cjs} +152 -148
  28. package/dist/chunk-SSDISIDW.cjs.map +1 -0
  29. package/dist/{chunk-3XR3IEGU.cjs → chunk-VFIZYSZB.cjs} +573 -168
  30. package/dist/chunk-VFIZYSZB.cjs.map +1 -0
  31. package/dist/{chunk-34UW6XUQ.js → chunk-WXRCMIAE.js} +567 -172
  32. package/dist/chunk-WXRCMIAE.js.map +1 -0
  33. package/dist/{chunk-GTXOV7IJ.cjs → chunk-XMBYDLZQ.cjs} +4 -4
  34. package/dist/{chunk-GTXOV7IJ.cjs.map → chunk-XMBYDLZQ.cjs.map} +1 -1
  35. package/dist/{chunk-OEM5ARVM.js → chunk-XQDM6T6C.js} +3 -3
  36. package/dist/{chunk-OEM5ARVM.js.map → chunk-XQDM6T6C.js.map} +1 -1
  37. package/dist/connect/index.cjs +209 -53
  38. package/dist/connect/index.cjs.map +1 -1
  39. package/dist/connect/index.d.ts +2 -0
  40. package/dist/connect/index.js +190 -36
  41. package/dist/connect/index.js.map +1 -1
  42. package/dist/connection/ConnectedTagMatrix.d.ts +20 -0
  43. package/dist/connection/ConnectedWorkflowRunner.d.ts +13 -1
  44. package/dist/connection/WorkflowRunThread.d.ts +21 -0
  45. package/dist/facts/index.cjs +1 -1
  46. package/dist/facts/index.js +1 -1
  47. package/dist/files/index.cjs +1 -1
  48. package/dist/files/index.js +1 -1
  49. package/dist/home/index.cjs +1 -1
  50. package/dist/home/index.js +1 -1
  51. package/dist/index.cjs +492 -447
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.js +9 -8
  55. package/dist/index.js.map +1 -1
  56. package/dist/shell/index.cjs +1 -1
  57. package/dist/shell/index.js +1 -1
  58. package/dist/studio/index.cjs +4 -4
  59. package/dist/studio/index.js +3 -3
  60. package/dist/tags/TagMatrix.d.ts +64 -0
  61. package/dist/tags/index.d.ts +3 -0
  62. package/dist/tags/tagMatrixModel.d.ts +39 -0
  63. package/dist/workflow-canvas/index.cjs +48 -48
  64. package/dist/workflow-canvas/index.js +5 -5
  65. package/package.json +4 -4
  66. package/dist/chunk-34UW6XUQ.js.map +0 -1
  67. package/dist/chunk-3XR3IEGU.cjs.map +0 -1
  68. package/dist/chunk-HEVVT6IT.js.map +0 -1
  69. package/dist/chunk-HOD6OM7L.cjs.map +0 -1
  70. package/dist/chunk-JFUN4D7D.cjs.map +0 -1
  71. package/dist/chunk-NIP5BOP7.js.map +0 -1
@@ -0,0 +1,450 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var lucideReact = require('lucide-react');
6
+ var ui = require('@arbidocs/react/ui');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ // src/tags/tagMatrixModel.ts
10
+ function tagMatrixColumns(matrix) {
11
+ const columns = [];
12
+ const add = (f) => {
13
+ if (!columns.some((c) => c.id === f.id)) columns.push(f);
14
+ };
15
+ for (const f of matrix?.parent?.fields ?? []) add(f);
16
+ for (const row of matrix?.rows ?? []) for (const f of row.tag.fields ?? []) add(f);
17
+ return columns;
18
+ }
19
+ var cellValue = (row, column) => row.tag.field_values?.[column.id];
20
+ var isGap = (row) => row.doc_count + row.fact_count === 0;
21
+ function cellText(value, column, nameOf) {
22
+ if (value === void 0 || value === null || value === "") return "";
23
+ if (column.type === "checkbox") return value ? "Yes" : "No";
24
+ if (column.type === "person" && typeof value === "string") return nameOf?.(value) ?? value;
25
+ if (Array.isArray(value)) return value.map(String).join(", ");
26
+ return String(value);
27
+ }
28
+ function parseCell(text, type) {
29
+ const t = text.trim();
30
+ if (t === "") return null;
31
+ if (type === "number") {
32
+ const n = Number(t);
33
+ return Number.isNaN(n) ? null : n;
34
+ }
35
+ return t;
36
+ }
37
+ var escapeCell = (text) => text.replace(/\|/g, "\\|").replace(/\n+/g, " ");
38
+ function tagMatrixMarkdown(matrix, options) {
39
+ const columns = tagMatrixColumns(matrix);
40
+ const heads = [
41
+ options.rowHeading ?? "Item",
42
+ ...columns.map((c) => c.name),
43
+ options.evidence ?? "Evidence"
44
+ ];
45
+ const lines = [
46
+ `# ${options.title}`,
47
+ "",
48
+ `_Snapshot taken ${new Date(options.at ?? Date.now()).toISOString().slice(0, 16).replace("T", " ")} UTC_`,
49
+ "",
50
+ `| ${heads.map(escapeCell).join(" | ")} |`,
51
+ `| ${heads.map(() => "---").join(" | ")} |`
52
+ ];
53
+ for (const row of matrix.rows ?? []) {
54
+ const evidence = [
55
+ `${row.doc_count} document${row.doc_count === 1 ? "" : "s"}`,
56
+ `${row.fact_count} fact${row.fact_count === 1 ? "" : "s"}`
57
+ ].join(", ");
58
+ const cells = [
59
+ row.tag.name,
60
+ ...columns.map((c) => cellText(cellValue(row, c), c, options.nameOf)),
61
+ evidence
62
+ ];
63
+ lines.push(`| ${cells.map(escapeCell).join(" | ")} |`);
64
+ }
65
+ return `${lines.join("\n")}
66
+ `;
67
+ }
68
+ var DEFAULT_TAG_MATRIX_LABELS = {
69
+ row: "Item",
70
+ evidence: "Evidence",
71
+ documents: "{count} documents",
72
+ facts: "{count} facts",
73
+ document: "1 document",
74
+ fact: "1 fact",
75
+ more: "+{count} more",
76
+ gap: "No evidence",
77
+ gapsOnly: "Show gaps only",
78
+ gapCount: "{count} without evidence",
79
+ addRow: "Add row",
80
+ addRowPlaceholder: "Name of the new row",
81
+ add: "Add",
82
+ export: "Export as document",
83
+ exporting: "Exporting\u2026",
84
+ empty: "No rows yet.",
85
+ loading: "Loading\u2026",
86
+ noColumns: "No fields yet: add fields to the parent label to get columns.",
87
+ choose: "\u2014",
88
+ yes: "Yes"
89
+ };
90
+ function Cell({
91
+ row,
92
+ column,
93
+ people,
94
+ onChange,
95
+ l,
96
+ testId
97
+ }) {
98
+ const value = cellValue(row, column);
99
+ const nameOf = (id) => people?.find((p) => p.value === id)?.label;
100
+ const shown = cellText(value, column, nameOf);
101
+ const [draft, setDraft] = react.useState(shown);
102
+ react.useEffect(() => setDraft(cellText(value, column)), [value, column]);
103
+ const set = (next) => void onChange?.(row.tag.external_id, column.id, next);
104
+ if (!onChange)
105
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block truncate", title: shown, "data-testid": testId, children: shown || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: l.choose }) });
106
+ const field = "h-8 w-full min-w-24 rounded-md border border-transparent bg-transparent px-1.5 text-sm hover:border-input focus:border-input focus:bg-background focus:outline-none";
107
+ switch (column.type) {
108
+ case "checkbox":
109
+ return /* @__PURE__ */ jsxRuntime.jsx(
110
+ ui.Checkbox,
111
+ {
112
+ checked: value === true,
113
+ onCheckedChange: (v) => set(v === true),
114
+ "aria-label": `${row.tag.name}: ${column.name}`,
115
+ "data-testid": testId
116
+ }
117
+ );
118
+ case "select":
119
+ case "person": {
120
+ const options = column.type === "select" ? (column.options ?? []).map((o) => ({ value: o, label: o })) : people ?? [];
121
+ return /* @__PURE__ */ jsxRuntime.jsxs(
122
+ "select",
123
+ {
124
+ className: field,
125
+ value: typeof value === "string" ? value : "",
126
+ onChange: (e) => set(e.target.value || null),
127
+ "aria-label": `${row.tag.name}: ${column.name}`,
128
+ "data-testid": testId,
129
+ children: [
130
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: l.choose }),
131
+ options.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: o.label }, o.value)),
132
+ typeof value === "string" && value && !options.some((o) => o.value === value) && /* @__PURE__ */ jsxRuntime.jsx("option", { value, children: value })
133
+ ]
134
+ }
135
+ );
136
+ }
137
+ default: {
138
+ const commit = () => {
139
+ if (draft !== cellText(value, column)) set(parseCell(draft, column.type));
140
+ };
141
+ return /* @__PURE__ */ jsxRuntime.jsx(
142
+ "input",
143
+ {
144
+ className: field,
145
+ type: column.type === "number" ? "number" : column.type === "date" ? "date" : "text",
146
+ value: column.type === "date" ? draft.slice(0, 10) : draft,
147
+ onChange: (e) => setDraft(e.target.value),
148
+ onBlur: commit,
149
+ onKeyDown: (e) => {
150
+ if (e.key === "Enter") e.target.blur();
151
+ if (e.key === "Escape") setDraft(cellText(value, column));
152
+ },
153
+ "aria-label": `${row.tag.name}: ${column.name}`,
154
+ "data-testid": testId
155
+ }
156
+ );
157
+ }
158
+ }
159
+ }
160
+ function Evidence({
161
+ row,
162
+ l,
163
+ onOpenDocument,
164
+ onOpenFact,
165
+ onOpenRow,
166
+ testId
167
+ }) {
168
+ if (isGap(row))
169
+ return /* @__PURE__ */ jsxRuntime.jsxs(
170
+ "span",
171
+ {
172
+ className: "inline-flex items-center gap-1 rounded-full bg-amber-500/15 px-2 py-0.5 text-xs font-medium text-amber-700 dark:text-amber-300",
173
+ "data-testid": `${testId}-gap`,
174
+ children: [
175
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.AlertTriangle, { className: "size-3" }),
176
+ " ",
177
+ l.gap
178
+ ]
179
+ }
180
+ );
181
+ const docs = row.docs ?? [];
182
+ const facts = row.facts ?? [];
183
+ const more = row.doc_count - docs.length + (row.fact_count - facts.length);
184
+ const chip = "inline-flex max-w-44 items-center gap-1 truncate rounded-md border border-border px-1.5 py-0.5 text-xs hover:border-primary/40 hover:text-primary disabled:hover:border-border disabled:hover:text-inherit";
185
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1", "data-testid": testId, children: [
186
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-1 text-xs text-muted-foreground", children: [
187
+ row.doc_count === 1 ? l.document : row.doc_count ? l.documents.replace("{count}", String(row.doc_count)) : null,
188
+ row.fact_count === 1 ? l.fact : row.fact_count ? l.facts.replace("{count}", String(row.fact_count)) : null
189
+ ].filter(Boolean).join(" \xB7 ") }),
190
+ docs.map((d) => /* @__PURE__ */ jsxRuntime.jsxs(
191
+ "button",
192
+ {
193
+ type: "button",
194
+ className: chip,
195
+ title: d.note ? `${d.file_name}: ${d.note}` : d.file_name,
196
+ disabled: !onOpenDocument,
197
+ onClick: () => onOpenDocument?.(d.doc_ext_id),
198
+ "data-testid": `${testId}-doc-${d.doc_ext_id}`,
199
+ children: [
200
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "size-3 shrink-0" }),
201
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: d.file_name })
202
+ ]
203
+ },
204
+ d.doc_ext_id
205
+ )),
206
+ facts.map((f) => /* @__PURE__ */ jsxRuntime.jsxs(
207
+ "button",
208
+ {
209
+ type: "button",
210
+ className: chip,
211
+ title: f.text,
212
+ disabled: !onOpenFact,
213
+ onClick: () => onOpenFact?.(f.fact_ext_id),
214
+ "data-testid": `${testId}-fact-${f.fact_ext_id}`,
215
+ children: [
216
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Lightbulb, { className: "size-3 shrink-0" }),
217
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: f.text })
218
+ ]
219
+ },
220
+ f.fact_ext_id
221
+ )),
222
+ more > 0 && (onOpenRow ? /* @__PURE__ */ jsxRuntime.jsx(
223
+ "button",
224
+ {
225
+ type: "button",
226
+ className: "text-xs text-primary hover:underline",
227
+ onClick: () => onOpenRow(row.tag.external_id),
228
+ "data-testid": `${testId}-more`,
229
+ children: l.more.replace("{count}", String(more))
230
+ }
231
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", "data-testid": `${testId}-more`, children: l.more.replace("{count}", String(more)) }))
232
+ ] });
233
+ }
234
+ function TagMatrix({
235
+ matrix,
236
+ isLoading,
237
+ onChangeValue,
238
+ onAddRow,
239
+ onOpenDocument,
240
+ onOpenFact,
241
+ onOpenRow,
242
+ onExport,
243
+ people,
244
+ actions,
245
+ labels,
246
+ className,
247
+ testId = "tag-matrix"
248
+ }) {
249
+ const l = { ...DEFAULT_TAG_MATRIX_LABELS, ...labels };
250
+ const columns = react.useMemo(() => tagMatrixColumns(matrix), [matrix]);
251
+ const rows = matrix?.rows ?? [];
252
+ const gaps = rows.filter(isGap).length;
253
+ const [gapsOnly, setGapsOnly] = react.useState(false);
254
+ const [name, setName] = react.useState("");
255
+ const [adding, setAdding] = react.useState(false);
256
+ const [exporting, setExporting] = react.useState(false);
257
+ const shown = gapsOnly ? rows.filter(isGap) : rows;
258
+ const add = async () => {
259
+ const n = name.trim();
260
+ if (!n || !onAddRow) return;
261
+ setAdding(true);
262
+ try {
263
+ await onAddRow(n);
264
+ setName("");
265
+ } finally {
266
+ setAdding(false);
267
+ }
268
+ };
269
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ui.cn("space-y-3", className), "data-testid": testId, children: [
270
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
271
+ gaps > 0 && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm", children: [
272
+ /* @__PURE__ */ jsxRuntime.jsx(
273
+ ui.Checkbox,
274
+ {
275
+ checked: gapsOnly,
276
+ onCheckedChange: (v) => setGapsOnly(v === true),
277
+ "data-testid": `${testId}-gaps-only`
278
+ }
279
+ ),
280
+ l.gapsOnly,
281
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-amber-700 dark:text-amber-300", children: [
282
+ "(",
283
+ l.gapCount.replace("{count}", String(gaps)),
284
+ ")"
285
+ ] })
286
+ ] }),
287
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex flex-wrap items-center gap-2", children: [
288
+ actions,
289
+ onExport && /* @__PURE__ */ jsxRuntime.jsxs(
290
+ ui.Button,
291
+ {
292
+ variant: "outline",
293
+ size: "sm",
294
+ disabled: exporting || rows.length === 0,
295
+ onClick: async () => {
296
+ setExporting(true);
297
+ try {
298
+ await onExport();
299
+ } finally {
300
+ setExporting(false);
301
+ }
302
+ },
303
+ "data-testid": `${testId}-export`,
304
+ children: [
305
+ exporting ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileDown, { className: "size-4" }),
306
+ exporting ? l.exporting : l.export
307
+ ]
308
+ }
309
+ )
310
+ ] })
311
+ ] }),
312
+ isLoading ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
313
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-4 animate-spin" }),
314
+ " ",
315
+ l.loading
316
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "overflow-x-auto rounded-lg border border-border", children: [
317
+ /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full border-collapse text-sm", "data-testid": `${testId}-table`, children: [
318
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-muted/40", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
319
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "sticky left-0 z-10 bg-muted/40 px-3 py-2 text-left font-medium", children: l.row }),
320
+ columns.map((c) => /* @__PURE__ */ jsxRuntime.jsx(
321
+ "th",
322
+ {
323
+ className: "px-3 py-2 text-left font-medium",
324
+ "data-testid": `${testId}-column-${c.id}`,
325
+ children: c.name
326
+ },
327
+ c.id
328
+ )),
329
+ /* @__PURE__ */ jsxRuntime.jsx("th", { className: "px-3 py-2 text-left font-medium", children: l.evidence })
330
+ ] }) }),
331
+ /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
332
+ shown.map((row) => {
333
+ const id = row.tag.external_id;
334
+ const gap = isGap(row);
335
+ return /* @__PURE__ */ jsxRuntime.jsxs(
336
+ "tr",
337
+ {
338
+ className: ui.cn("border-t border-border align-top", gap && "bg-amber-500/5"),
339
+ "data-gap": gap || void 0,
340
+ "data-testid": `${testId}-row-${id}`,
341
+ children: [
342
+ /* @__PURE__ */ jsxRuntime.jsx(
343
+ "th",
344
+ {
345
+ scope: "row",
346
+ className: ui.cn(
347
+ "sticky left-0 z-10 max-w-56 px-3 py-2 text-left font-medium",
348
+ gap ? "bg-amber-50 dark:bg-amber-950" : "bg-background",
349
+ gap && "border-l-2 border-l-amber-500"
350
+ ),
351
+ children: onOpenRow ? /* @__PURE__ */ jsxRuntime.jsx(
352
+ "button",
353
+ {
354
+ type: "button",
355
+ className: "truncate text-left hover:text-primary hover:underline",
356
+ onClick: () => onOpenRow(id),
357
+ children: row.tag.name
358
+ }
359
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: row.tag.name })
360
+ }
361
+ ),
362
+ columns.map((c) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-1.5 py-1", children: /* @__PURE__ */ jsxRuntime.jsx(
363
+ Cell,
364
+ {
365
+ row,
366
+ column: c,
367
+ people,
368
+ onChange: onChangeValue,
369
+ l,
370
+ testId: `${testId}-cell-${id}-${c.id}`
371
+ }
372
+ ) }, c.id)),
373
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-3 py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
374
+ Evidence,
375
+ {
376
+ row,
377
+ l,
378
+ onOpenDocument,
379
+ onOpenFact,
380
+ onOpenRow,
381
+ testId: `${testId}-evidence-${id}`
382
+ }
383
+ ) })
384
+ ]
385
+ },
386
+ id
387
+ );
388
+ }),
389
+ shown.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { children: /* @__PURE__ */ jsxRuntime.jsx(
390
+ "td",
391
+ {
392
+ colSpan: columns.length + 2,
393
+ className: "px-3 py-6 text-center text-sm text-muted-foreground",
394
+ children: l.empty
395
+ }
396
+ ) })
397
+ ] })
398
+ ] }),
399
+ columns.length === 0 && rows.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "border-t border-border px-3 py-2 text-xs text-muted-foreground", children: l.noColumns })
400
+ ] }),
401
+ onAddRow && /* @__PURE__ */ jsxRuntime.jsxs(
402
+ "form",
403
+ {
404
+ className: "flex max-w-md items-center gap-2",
405
+ onSubmit: (e) => {
406
+ e.preventDefault();
407
+ void add();
408
+ },
409
+ children: [
410
+ /* @__PURE__ */ jsxRuntime.jsx(
411
+ ui.Input,
412
+ {
413
+ value: name,
414
+ placeholder: l.addRowPlaceholder,
415
+ "aria-label": l.addRow,
416
+ onChange: (e) => setName(e.target.value),
417
+ "data-testid": `${testId}-add-name`
418
+ }
419
+ ),
420
+ /* @__PURE__ */ jsxRuntime.jsxs(
421
+ ui.Button,
422
+ {
423
+ type: "submit",
424
+ size: "sm",
425
+ variant: "outline",
426
+ disabled: !name.trim() || adding,
427
+ "data-testid": `${testId}-add`,
428
+ children: [
429
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "size-4" }),
430
+ " ",
431
+ l.addRow
432
+ ]
433
+ }
434
+ )
435
+ ]
436
+ }
437
+ )
438
+ ] });
439
+ }
440
+
441
+ exports.DEFAULT_TAG_MATRIX_LABELS = DEFAULT_TAG_MATRIX_LABELS;
442
+ exports.TagMatrix = TagMatrix;
443
+ exports.cellText = cellText;
444
+ exports.cellValue = cellValue;
445
+ exports.isGap = isGap;
446
+ exports.parseCell = parseCell;
447
+ exports.tagMatrixColumns = tagMatrixColumns;
448
+ exports.tagMatrixMarkdown = tagMatrixMarkdown;
449
+ //# sourceMappingURL=chunk-MLAHDAN5.cjs.map
450
+ //# sourceMappingURL=chunk-MLAHDAN5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tags/tagMatrixModel.ts","../src/tags/TagMatrix.tsx"],"names":["useState","useEffect","jsx","Checkbox","jsxs","AlertTriangle","FileText","Lightbulb","useMemo","cn","Button","Loader2","FileDown","Input","Plus"],"mappings":"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","file":"chunk-MLAHDAN5.cjs","sourcesContent":["/**\n * The tag matrix as data: a parent label's child labels are the rows, the fields they share (the\n * parent's, then any a row adds) the columns, and each row's linked documents and facts its\n * evidence. Pure helpers for `TagMatrix`: the columns, a row's value, the gaps, and the snapshot\n * as a Markdown document.\n */\n\nimport type { components } from '@arbidocs/client'\n\nexport type TagMatrixData = components['schemas']['TagMatrixResponse']\nexport type TagMatrixRowData = components['schemas']['TagMatrixRow']\nexport type TagMatrixField = components['schemas']['TagField']\nexport type TagMatrixFieldType = TagMatrixField['type']\n\n/**\n * The columns: the parent's fields (shared by every row), then fields only some rows define,\n * each once, in the order first seen. Mirrors the SDK's `tagMatrixColumns`.\n */\nexport function tagMatrixColumns(matrix: TagMatrixData | null | undefined): TagMatrixField[] {\n const columns: TagMatrixField[] = []\n const add = (f: TagMatrixField) => {\n if (!columns.some((c) => c.id === f.id)) columns.push(f)\n }\n for (const f of matrix?.parent?.fields ?? []) add(f)\n for (const row of matrix?.rows ?? []) for (const f of row.tag.fields ?? []) add(f)\n return columns\n}\n\n/** A row's value for a column (values are keyed by field id). */\nexport const cellValue = (row: TagMatrixRowData, column: TagMatrixField): unknown =>\n row.tag.field_values?.[column.id]\n\n/** A row with nothing behind it: no linked document and no fact. */\nexport const isGap = (row: TagMatrixRowData): boolean => row.doc_count + row.fact_count === 0\n\n/** A value as text (a person by name, a checkbox as yes or no, blank as empty). */\nexport function cellText(\n value: unknown,\n column: Pick<TagMatrixField, 'type'>,\n nameOf?: (id: string) => string | undefined\n): string {\n if (value === undefined || value === null || value === '') return ''\n if (column.type === 'checkbox') return value ? 'Yes' : 'No'\n if (column.type === 'person' && typeof value === 'string') return nameOf?.(value) ?? value\n if (Array.isArray(value)) return value.map(String).join(', ')\n return String(value)\n}\n\n/** A typed input's text back as the value to store (`null` clears it). */\nexport function parseCell(text: string, type: TagMatrixFieldType): unknown {\n const t = text.trim()\n if (t === '') return null\n if (type === 'number') {\n const n = Number(t)\n return Number.isNaN(n) ? null : n\n }\n return t\n}\n\nconst escapeCell = (text: string) => text.replace(/\\|/g, '\\\\|').replace(/\\n+/g, ' ')\n\nexport interface TagMatrixMarkdownOptions {\n title: string\n /** The evidence column's heading. */\n evidence?: string\n /** The row column's heading. */\n rowHeading?: string\n nameOf?: (id: string) => string | undefined\n /** When the snapshot was taken (ISO); default now. */\n at?: string\n}\n\n/**\n * The matrix as a Markdown document: a heading, when it was taken, and one table (a row per\n * label, a column per field, then the evidence counts). What a host files or has signed.\n */\nexport function tagMatrixMarkdown(\n matrix: TagMatrixData,\n options: TagMatrixMarkdownOptions\n): string {\n const columns = tagMatrixColumns(matrix)\n const heads = [\n options.rowHeading ?? 'Item',\n ...columns.map((c) => c.name),\n options.evidence ?? 'Evidence',\n ]\n const lines = [\n `# ${options.title}`,\n '',\n `_Snapshot taken ${new Date(options.at ?? Date.now()).toISOString().slice(0, 16).replace('T', ' ')} UTC_`,\n '',\n `| ${heads.map(escapeCell).join(' | ')} |`,\n `| ${heads.map(() => '---').join(' | ')} |`,\n ]\n for (const row of matrix.rows ?? []) {\n const evidence = [\n `${row.doc_count} document${row.doc_count === 1 ? '' : 's'}`,\n `${row.fact_count} fact${row.fact_count === 1 ? '' : 's'}`,\n ].join(', ')\n const cells = [\n row.tag.name,\n ...columns.map((c) => cellText(cellValue(row, c), c, options.nameOf)),\n evidence,\n ]\n lines.push(`| ${cells.map(escapeCell).join(' | ')} |`)\n }\n return `${lines.join('\\n')}\\n`\n}\n","/**\n * A label's children as a matrix: one row per child label, a column per field they share,\n * editable in place by type (text, number, date, checkbox, choice, person), and the evidence behind\n * each row (its linked documents and facts, with counts). Rows with no evidence are marked as\n * gaps. A row can be added (a new child label), and the matrix exported as a document snapshot.\n * The data and every write come from the host (`ConnectedTagMatrix` binds them to ARBI).\n */\n\nimport { useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { AlertTriangle, FileDown, FileText, Lightbulb, Loader2, Plus } from 'lucide-react'\nimport { Button, Checkbox, Input, cn } from '@arbidocs/react/ui'\nimport {\n cellText,\n cellValue,\n isGap,\n parseCell,\n tagMatrixColumns,\n type TagMatrixData,\n type TagMatrixField,\n type TagMatrixRowData,\n} from './tagMatrixModel'\n\nexport interface TagMatrixLabels {\n row: string\n evidence: string\n /** `{count}` documents linked. */\n documents: string\n /** `{count}` facts linked. */\n facts: string\n /** One document, one fact. */\n document: string\n fact: string\n /** `{count}` more links than shown. */\n more: string\n gap: string\n gapsOnly: string\n /** `{count}` rows without evidence. */\n gapCount: string\n addRow: string\n addRowPlaceholder: string\n add: string\n export: string\n exporting: string\n empty: string\n loading: string\n noColumns: string\n choose: string\n yes: string\n}\n\nexport const DEFAULT_TAG_MATRIX_LABELS: TagMatrixLabels = {\n row: 'Item',\n evidence: 'Evidence',\n documents: '{count} documents',\n facts: '{count} facts',\n document: '1 document',\n fact: '1 fact',\n more: '+{count} more',\n gap: 'No evidence',\n gapsOnly: 'Show gaps only',\n gapCount: '{count} without evidence',\n addRow: 'Add row',\n addRowPlaceholder: 'Name of the new row',\n add: 'Add',\n export: 'Export as document',\n exporting: 'Exporting…',\n empty: 'No rows yet.',\n loading: 'Loading…',\n noColumns: 'No fields yet: add fields to the parent label to get columns.',\n choose: '—',\n yes: 'Yes',\n}\n\nexport interface TagMatrixProps {\n matrix: TagMatrixData | undefined\n isLoading?: boolean\n /** Change one cell (`null` clears it). Absent: read only. */\n onChangeValue?: (tagId: string, fieldId: string, value: unknown) => void | Promise<unknown>\n /** Add a row (a new child label). Absent: no \"Add row\". */\n onAddRow?: (name: string) => void | Promise<unknown>\n /** Open a linked document. */\n onOpenDocument?: (documentId: string) => void\n /** Open a linked fact. */\n onOpenFact?: (factId: string) => void\n /** Open a row's label (all its evidence). */\n onOpenRow?: (tagId: string) => void\n /** Export the matrix as it stands. Absent: no export button. */\n onExport?: () => void | Promise<unknown>\n /** Who a person column offers. */\n people?: ReadonlyArray<{ value: string; label: string }>\n /** Extra controls in the toolbar. */\n actions?: ReactNode\n labels?: Partial<TagMatrixLabels>\n className?: string\n testId?: string\n}\n\n/** One editable cell: committed on blur or Enter (a checkbox and a choice at once). */\nfunction Cell({\n row,\n column,\n people,\n onChange,\n l,\n testId,\n}: {\n row: TagMatrixRowData\n column: TagMatrixField\n people?: TagMatrixProps['people']\n onChange?: TagMatrixProps['onChangeValue']\n l: TagMatrixLabels\n testId: string\n}) {\n const value = cellValue(row, column)\n const nameOf = (id: string) => people?.find((p) => p.value === id)?.label\n const shown = cellText(value, column, nameOf)\n const [draft, setDraft] = useState(shown)\n useEffect(() => setDraft(cellText(value, column)), [value, column])\n const set = (next: unknown) => void onChange?.(row.tag.external_id, column.id, next)\n\n if (!onChange)\n return (\n <span className=\"block truncate\" title={shown} data-testid={testId}>\n {shown || <span className=\"text-muted-foreground\">{l.choose}</span>}\n </span>\n )\n const field =\n 'h-8 w-full min-w-24 rounded-md border border-transparent bg-transparent px-1.5 text-sm hover:border-input focus:border-input focus:bg-background focus:outline-none'\n switch (column.type) {\n case 'checkbox':\n return (\n <Checkbox\n checked={value === true}\n onCheckedChange={(v) => set(v === true)}\n aria-label={`${row.tag.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n case 'select':\n case 'person': {\n const options =\n column.type === 'select'\n ? (column.options ?? []).map((o) => ({ value: o, label: o }))\n : (people ?? [])\n return (\n <select\n className={field}\n value={typeof value === 'string' ? value : ''}\n onChange={(e) => set(e.target.value || null)}\n aria-label={`${row.tag.name}: ${column.name}`}\n data-testid={testId}\n >\n <option value=\"\">{l.choose}</option>\n {options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n {typeof value === 'string' && value && !options.some((o) => o.value === value) && (\n <option value={value}>{value}</option>\n )}\n </select>\n )\n }\n default: {\n const commit = () => {\n if (draft !== cellText(value, column)) set(parseCell(draft, column.type))\n }\n return (\n <input\n className={field}\n type={column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text'}\n value={column.type === 'date' ? draft.slice(0, 10) : draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur()\n if (e.key === 'Escape') setDraft(cellText(value, column))\n }}\n aria-label={`${row.tag.name}: ${column.name}`}\n data-testid={testId}\n />\n )\n }\n }\n}\n\n/** What backs a row: its documents and facts as links, with counts and \"+N more\". */\nfunction Evidence({\n row,\n l,\n onOpenDocument,\n onOpenFact,\n onOpenRow,\n testId,\n}: {\n row: TagMatrixRowData\n l: TagMatrixLabels\n onOpenDocument?: (id: string) => void\n onOpenFact?: (id: string) => void\n onOpenRow?: (id: string) => void\n testId: string\n}) {\n if (isGap(row))\n return (\n <span\n className=\"inline-flex items-center gap-1 rounded-full bg-amber-500/15 px-2 py-0.5 text-xs font-medium text-amber-700 dark:text-amber-300\"\n data-testid={`${testId}-gap`}\n >\n <AlertTriangle className=\"size-3\" /> {l.gap}\n </span>\n )\n const docs = row.docs ?? []\n const facts = row.facts ?? []\n const more = row.doc_count - docs.length + (row.fact_count - facts.length)\n const chip =\n 'inline-flex max-w-44 items-center gap-1 truncate rounded-md border border-border px-1.5 py-0.5 text-xs hover:border-primary/40 hover:text-primary disabled:hover:border-border disabled:hover:text-inherit'\n return (\n <div className=\"flex flex-wrap items-center gap-1\" data-testid={testId}>\n <span className=\"mr-1 text-xs text-muted-foreground\">\n {[\n row.doc_count === 1\n ? l.document\n : row.doc_count\n ? l.documents.replace('{count}', String(row.doc_count))\n : null,\n row.fact_count === 1\n ? l.fact\n : row.fact_count\n ? l.facts.replace('{count}', String(row.fact_count))\n : null,\n ]\n .filter(Boolean)\n .join(' · ')}\n </span>\n {docs.map((d) => (\n <button\n key={d.doc_ext_id}\n type=\"button\"\n className={chip}\n title={d.note ? `${d.file_name}: ${d.note}` : d.file_name}\n disabled={!onOpenDocument}\n onClick={() => onOpenDocument?.(d.doc_ext_id)}\n data-testid={`${testId}-doc-${d.doc_ext_id}`}\n >\n <FileText className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{d.file_name}</span>\n </button>\n ))}\n {facts.map((f) => (\n <button\n key={f.fact_ext_id}\n type=\"button\"\n className={chip}\n title={f.text}\n disabled={!onOpenFact}\n onClick={() => onOpenFact?.(f.fact_ext_id)}\n data-testid={`${testId}-fact-${f.fact_ext_id}`}\n >\n <Lightbulb className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{f.text}</span>\n </button>\n ))}\n {more > 0 &&\n (onOpenRow ? (\n <button\n type=\"button\"\n className=\"text-xs text-primary hover:underline\"\n onClick={() => onOpenRow(row.tag.external_id)}\n data-testid={`${testId}-more`}\n >\n {l.more.replace('{count}', String(more))}\n </button>\n ) : (\n <span className=\"text-xs text-muted-foreground\" data-testid={`${testId}-more`}>\n {l.more.replace('{count}', String(more))}\n </span>\n ))}\n </div>\n )\n}\n\nexport function TagMatrix({\n matrix,\n isLoading,\n onChangeValue,\n onAddRow,\n onOpenDocument,\n onOpenFact,\n onOpenRow,\n onExport,\n people,\n actions,\n labels,\n className,\n testId = 'tag-matrix',\n}: TagMatrixProps) {\n const l = { ...DEFAULT_TAG_MATRIX_LABELS, ...labels }\n const columns = useMemo(() => tagMatrixColumns(matrix), [matrix])\n const rows = matrix?.rows ?? []\n const gaps = rows.filter(isGap).length\n const [gapsOnly, setGapsOnly] = useState(false)\n const [name, setName] = useState('')\n const [adding, setAdding] = useState(false)\n const [exporting, setExporting] = useState(false)\n const shown = gapsOnly ? rows.filter(isGap) : rows\n\n const add = async () => {\n const n = name.trim()\n if (!n || !onAddRow) return\n setAdding(true)\n try {\n await onAddRow(n)\n setName('')\n } finally {\n setAdding(false)\n }\n }\n\n return (\n <div className={cn('space-y-3', className)} data-testid={testId}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {gaps > 0 && (\n <label className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n checked={gapsOnly}\n onCheckedChange={(v) => setGapsOnly(v === true)}\n data-testid={`${testId}-gaps-only`}\n />\n {l.gapsOnly}\n <span className=\"text-xs text-amber-700 dark:text-amber-300\">\n ({l.gapCount.replace('{count}', String(gaps))})\n </span>\n </label>\n )}\n <div className=\"ml-auto flex flex-wrap items-center gap-2\">\n {actions}\n {onExport && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={exporting || rows.length === 0}\n onClick={async () => {\n setExporting(true)\n try {\n await onExport()\n } finally {\n setExporting(false)\n }\n }}\n data-testid={`${testId}-export`}\n >\n {exporting ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <FileDown className=\"size-4\" />\n )}\n {exporting ? l.exporting : l.export}\n </Button>\n )}\n </div>\n </div>\n\n {isLoading ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"size-4 animate-spin\" /> {l.loading}\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full border-collapse text-sm\" data-testid={`${testId}-table`}>\n <thead className=\"bg-muted/40\">\n <tr>\n <th className=\"sticky left-0 z-10 bg-muted/40 px-3 py-2 text-left font-medium\">\n {l.row}\n </th>\n {columns.map((c) => (\n <th\n key={c.id}\n className=\"px-3 py-2 text-left font-medium\"\n data-testid={`${testId}-column-${c.id}`}\n >\n {c.name}\n </th>\n ))}\n <th className=\"px-3 py-2 text-left font-medium\">{l.evidence}</th>\n </tr>\n </thead>\n <tbody>\n {shown.map((row) => {\n const id = row.tag.external_id\n const gap = isGap(row)\n return (\n <tr\n key={id}\n className={cn('border-t border-border align-top', gap && 'bg-amber-500/5')}\n data-gap={gap || undefined}\n data-testid={`${testId}-row-${id}`}\n >\n <th\n scope=\"row\"\n className={cn(\n 'sticky left-0 z-10 max-w-56 px-3 py-2 text-left font-medium',\n gap ? 'bg-amber-50 dark:bg-amber-950' : 'bg-background',\n gap && 'border-l-2 border-l-amber-500'\n )}\n >\n {onOpenRow ? (\n <button\n type=\"button\"\n className=\"truncate text-left hover:text-primary hover:underline\"\n onClick={() => onOpenRow(id)}\n >\n {row.tag.name}\n </button>\n ) : (\n <span className=\"truncate\">{row.tag.name}</span>\n )}\n </th>\n {columns.map((c) => (\n <td key={c.id} className=\"px-1.5 py-1\">\n <Cell\n row={row}\n column={c}\n people={people}\n onChange={onChangeValue}\n l={l}\n testId={`${testId}-cell-${id}-${c.id}`}\n />\n </td>\n ))}\n <td className=\"px-3 py-2\">\n <Evidence\n row={row}\n l={l}\n onOpenDocument={onOpenDocument}\n onOpenFact={onOpenFact}\n onOpenRow={onOpenRow}\n testId={`${testId}-evidence-${id}`}\n />\n </td>\n </tr>\n )\n })}\n {shown.length === 0 && (\n <tr>\n <td\n colSpan={columns.length + 2}\n className=\"px-3 py-6 text-center text-sm text-muted-foreground\"\n >\n {l.empty}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n {columns.length === 0 && rows.length > 0 && (\n <p className=\"border-t border-border px-3 py-2 text-xs text-muted-foreground\">\n {l.noColumns}\n </p>\n )}\n </div>\n )}\n\n {onAddRow && (\n <form\n className=\"flex max-w-md items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n void add()\n }}\n >\n <Input\n value={name}\n placeholder={l.addRowPlaceholder}\n aria-label={l.addRow}\n onChange={(e) => setName(e.target.value)}\n data-testid={`${testId}-add-name`}\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n variant=\"outline\"\n disabled={!name.trim() || adding}\n data-testid={`${testId}-add`}\n >\n <Plus className=\"size-4\" /> {l.addRow}\n </Button>\n </form>\n )}\n </div>\n )\n}\n"]}
@@ -1921,6 +1921,7 @@ function ChatPage({
1921
1921
  renderContent,
1922
1922
  onOpenCitation,
1923
1923
  workflowStepTitle,
1924
+ singleThread,
1924
1925
  targetMessageId,
1925
1926
  asideBreakpoint = DEFAULT_ASIDE_BREAKPOINT_REM,
1926
1927
  fillHeight = false,
@@ -1955,7 +1956,7 @@ function ChatPage({
1955
1956
  const { width } = chunkB4SRYJLM_cjs.useElementSize(rootRef);
1956
1957
  const { height: headerHeight } = chunkB4SRYJLM_cjs.useElementSize(headerRef);
1957
1958
  const rem = chunkB4SRYJLM_cjs.rootFontSizePx();
1958
- const hasListColumn = width >= LIST_COLUMN_REM * rem;
1959
+ const hasListColumn = !singleThread && width >= LIST_COLUMN_REM * rem;
1959
1960
  const hasAsideColumn = width > 0 && width >= asideBreakpoint * rem;
1960
1961
  const fillPx = useFillHeight(rootRef, fillHeight, minHeight);
1961
1962
  const closeAside = react.useCallback(() => setIsAsideOpen(false), []);
@@ -2079,7 +2080,7 @@ function ChatPage({
2079
2080
  "data-slot": "chat-page-header",
2080
2081
  className: "flex min-h-12 shrink-0 items-center gap-2 border-b border-border px-3 py-1.5",
2081
2082
  children: [
2082
- hasListColumn ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1 items-center", children: heading }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
2083
+ hasListColumn || singleThread ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1 items-center", children: heading }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
2083
2084
  heading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 shrink", children: heading }) : null,
2084
2085
  /* @__PURE__ */ jsxRuntime.jsx(
2085
2086
  ChatThreadSelect,
@@ -2503,5 +2504,5 @@ exports.useAssistantDock = useAssistantDock;
2503
2504
  exports.useChatSurface = useChatSurface;
2504
2505
  exports.useRegisterEmbeddedChat = useRegisterEmbeddedChat;
2505
2506
  exports.useStreamAnnouncement = useStreamAnnouncement;
2506
- //# sourceMappingURL=chunk-HOD6OM7L.cjs.map
2507
- //# sourceMappingURL=chunk-HOD6OM7L.cjs.map
2507
+ //# sourceMappingURL=chunk-MP6FK43E.cjs.map
2508
+ //# sourceMappingURL=chunk-MP6FK43E.cjs.map