@arbidocs/blocks 0.4.79 → 0.4.81

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 (46) hide show
  1. package/dist/agents/index.cjs +278 -278
  2. package/dist/agents/index.js +3 -3
  3. package/dist/agents/workflows/StepBarFrame.d.ts +8 -2
  4. package/dist/agents/workflows/WorkflowRunner.d.ts +35 -3
  5. package/dist/agents/workflows/run.d.ts +10 -0
  6. package/dist/agents/workflows/stepWindow.d.ts +7 -0
  7. package/dist/agents/workflows/types.d.ts +4 -2
  8. package/dist/{chunk-5XVWGJ2H.cjs → chunk-B3WCKBJ7.cjs} +3 -3
  9. package/dist/{chunk-5XVWGJ2H.cjs.map → chunk-B3WCKBJ7.cjs.map} +1 -1
  10. package/dist/{chunk-YGUKTFKW.cjs → chunk-BX7JWZWE.cjs} +122 -14
  11. package/dist/chunk-BX7JWZWE.cjs.map +1 -0
  12. package/dist/{chunk-3YET6D5E.cjs → chunk-F5WIETZY.cjs} +58 -43
  13. package/dist/chunk-F5WIETZY.cjs.map +1 -0
  14. package/dist/{chunk-O35LRB3P.js → chunk-GJV2G4FC.js} +3 -3
  15. package/dist/{chunk-O35LRB3P.js.map → chunk-GJV2G4FC.js.map} +1 -1
  16. package/dist/{chunk-BMOL5DN6.js → chunk-I56ORHPY.js} +27 -12
  17. package/dist/chunk-I56ORHPY.js.map +1 -0
  18. package/dist/{chunk-CWAZNXC5.js → chunk-SWSVPQNB.js} +30 -8
  19. package/dist/chunk-SWSVPQNB.js.map +1 -0
  20. package/dist/{chunk-6GXF62XN.js → chunk-THCFZKTM.js} +118 -15
  21. package/dist/chunk-THCFZKTM.js.map +1 -0
  22. package/dist/{chunk-MLAHDAN5.cjs → chunk-UA2AMDR6.cjs} +30 -8
  23. package/dist/chunk-UA2AMDR6.cjs.map +1 -0
  24. package/dist/connect/index.cjs +145 -62
  25. package/dist/connect/index.cjs.map +1 -1
  26. package/dist/connect/index.d.ts +1 -1
  27. package/dist/connect/index.js +106 -23
  28. package/dist/connect/index.js.map +1 -1
  29. package/dist/connection/ConnectedWorkflowRunner.d.ts +30 -4
  30. package/dist/files/index.cjs +2 -2
  31. package/dist/files/index.js +2 -2
  32. package/dist/index.cjs +467 -467
  33. package/dist/index.js +7 -7
  34. package/dist/settings/index.cjs +35 -35
  35. package/dist/settings/index.js +3 -3
  36. package/dist/workflow-canvas/index.cjs +46 -46
  37. package/dist/workflow-canvas/index.js +3 -3
  38. package/dist/workspaces/index.cjs +1 -1
  39. package/dist/workspaces/index.js +1 -1
  40. package/package.json +4 -4
  41. package/dist/chunk-3YET6D5E.cjs.map +0 -1
  42. package/dist/chunk-6GXF62XN.js.map +0 -1
  43. package/dist/chunk-BMOL5DN6.js.map +0 -1
  44. package/dist/chunk-CWAZNXC5.js.map +0 -1
  45. package/dist/chunk-MLAHDAN5.cjs.map +0 -1
  46. package/dist/chunk-YGUKTFKW.cjs.map +0 -1
@@ -85,6 +85,8 @@ var DEFAULT_TAG_MATRIX_LABELS = {
85
85
  choose: "\u2014",
86
86
  yes: "Yes"
87
87
  };
88
+ var ROW_LABEL_WIDTH = "w-[18rem] min-w-[12rem] max-w-[18rem]";
89
+ var ROW_LABEL = "line-clamp-3 whitespace-normal break-words";
88
90
  function Cell({
89
91
  row,
90
92
  column,
@@ -119,7 +121,7 @@ function Cell({
119
121
  return /* @__PURE__ */ jsxs(
120
122
  "select",
121
123
  {
122
- className: field,
124
+ className: cn(field, "min-w-32 pr-6"),
123
125
  value: typeof value === "string" ? value : "",
124
126
  onChange: (e) => set(e.target.value || null),
125
127
  "aria-label": `${row.tag.name}: ${column.name}`,
@@ -139,7 +141,7 @@ function Cell({
139
141
  return /* @__PURE__ */ jsx(
140
142
  "input",
141
143
  {
142
- className: field,
144
+ className: cn(field, "min-w-32 pr-6"),
143
145
  type: column.type === "number" ? "number" : column.type === "date" ? "date" : "text",
144
146
  value: column.type === "date" ? draft.slice(0, 10) : draft,
145
147
  onChange: (e) => setDraft(e.target.value),
@@ -314,7 +316,16 @@ function TagMatrix({
314
316
  ] }) : /* @__PURE__ */ jsxs("div", { className: "overflow-x-auto rounded-lg border border-border", children: [
315
317
  /* @__PURE__ */ jsxs("table", { className: "w-full border-collapse text-sm", "data-testid": `${testId}-table`, children: [
316
318
  /* @__PURE__ */ jsx("thead", { className: "bg-muted/40", children: /* @__PURE__ */ jsxs("tr", { children: [
317
- /* @__PURE__ */ jsx("th", { className: "sticky left-0 z-10 bg-muted/40 px-3 py-2 text-left font-medium", children: l.row }),
319
+ /* @__PURE__ */ jsx(
320
+ "th",
321
+ {
322
+ className: cn(
323
+ ROW_LABEL_WIDTH,
324
+ "sticky left-0 z-10 bg-muted/40 px-3 py-2 text-left font-medium"
325
+ ),
326
+ children: l.row
327
+ }
328
+ ),
318
329
  columns.map((c) => /* @__PURE__ */ jsx(
319
330
  "th",
320
331
  {
@@ -342,7 +353,8 @@ function TagMatrix({
342
353
  {
343
354
  scope: "row",
344
355
  className: cn(
345
- "sticky left-0 z-10 max-w-56 px-3 py-2 text-left font-medium",
356
+ ROW_LABEL_WIDTH,
357
+ "sticky left-0 z-10 px-3 py-2 text-left font-medium",
346
358
  gap ? "bg-amber-50 dark:bg-amber-950" : "bg-background",
347
359
  gap && "border-l-2 border-l-amber-500"
348
360
  ),
@@ -350,11 +362,21 @@ function TagMatrix({
350
362
  "button",
351
363
  {
352
364
  type: "button",
353
- className: "truncate text-left hover:text-primary hover:underline",
365
+ className: cn(ROW_LABEL, "text-left hover:text-primary hover:underline"),
366
+ title: row.tag.name,
354
367
  onClick: () => onOpenRow(id),
368
+ "data-testid": `${testId}-row-${id}-label`,
369
+ children: row.tag.name
370
+ }
371
+ ) : /* @__PURE__ */ jsx(
372
+ "span",
373
+ {
374
+ className: ROW_LABEL,
375
+ title: row.tag.name,
376
+ "data-testid": `${testId}-row-${id}-label`,
355
377
  children: row.tag.name
356
378
  }
357
- ) : /* @__PURE__ */ jsx("span", { className: "truncate", children: row.tag.name })
379
+ )
358
380
  }
359
381
  ),
360
382
  columns.map((c) => /* @__PURE__ */ jsx("td", { className: "px-1.5 py-1", children: /* @__PURE__ */ jsx(
@@ -437,5 +459,5 @@ function TagMatrix({
437
459
  }
438
460
 
439
461
  export { DEFAULT_TAG_MATRIX_LABELS, TagMatrix, cellText, cellValue, isGap, parseCell, tagMatrixColumns, tagMatrixMarkdown };
440
- //# sourceMappingURL=chunk-CWAZNXC5.js.map
441
- //# sourceMappingURL=chunk-CWAZNXC5.js.map
462
+ //# sourceMappingURL=chunk-SWSVPQNB.js.map
463
+ //# sourceMappingURL=chunk-SWSVPQNB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tags/tagMatrixModel.ts","../src/tags/TagMatrix.tsx"],"names":[],"mappings":"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","file":"chunk-SWSVPQNB.js","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/**\n * The row-label (\"Item\") column: wide enough for a legal issue's name to read, never so wide the\n * fields are pushed out of view. Long names wrap inside it (cut after three lines, in full in the\n * tooltip), so a label never runs into the next column.\n */\nconst ROW_LABEL_WIDTH = 'w-[18rem] min-w-[12rem] max-w-[18rem]'\nconst ROW_LABEL = 'line-clamp-3 whitespace-normal break-words'\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={cn(field, 'min-w-32 pr-6')}\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={cn(field, 'min-w-32 pr-6')}\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\n className={cn(\n ROW_LABEL_WIDTH,\n 'sticky left-0 z-10 bg-muted/40 px-3 py-2 text-left font-medium'\n )}\n >\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 ROW_LABEL_WIDTH,\n 'sticky left-0 z-10 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={cn(ROW_LABEL, 'text-left hover:text-primary hover:underline')}\n title={row.tag.name}\n onClick={() => onOpenRow(id)}\n data-testid={`${testId}-row-${id}-label`}\n >\n {row.tag.name}\n </button>\n ) : (\n <span\n className={ROW_LABEL}\n title={row.tag.name}\n data-testid={`${testId}-row-${id}-label`}\n >\n {row.tag.name}\n </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"]}
@@ -627,6 +627,15 @@ var ACTION_TYPES = ["sign", "email_draft", "tabular_review"];
627
627
  var asAction = (v) => ACTION_TYPES.includes(v) ? v : void 0;
628
628
  var asRecord = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : void 0;
629
629
  var asStrings = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string") : void 0;
630
+ function waitingDocuments(state) {
631
+ return state?.status === "waiting" ? asStrings(state.waiting?.documents) ?? [] : [];
632
+ }
633
+ function eventWaitingDocuments(detail) {
634
+ return asStrings(asRecord(detail?.waiting)?.documents);
635
+ }
636
+ function waitingForDocumentsText(count) {
637
+ return `Waiting for ${count} ${count === 1 ? "document" : "documents"} to finish processing`;
638
+ }
630
639
  function reopenedBy(detail) {
631
640
  const to = str2(detail.to);
632
641
  return asStrings(detail.reopened) ?? (to ? [to] : []);
@@ -1271,6 +1280,14 @@ function useWorkflowView(options) {
1271
1280
  }
1272
1281
 
1273
1282
  // src/agents/workflows/stepWindow.ts
1283
+ var LABEL_MAX_PX = 320;
1284
+ var CHAR_PX = 6.5;
1285
+ var LEVEL_CHROME_PX = 56;
1286
+ var GROUP_CHIP_PX = 32;
1287
+ function levelRoomPx(titles) {
1288
+ const label = Math.max(0, ...titles.map((t) => Math.min(LABEL_MAX_PX, t.length * CHAR_PX)));
1289
+ return Math.ceil(label + LEVEL_CHROME_PX + (titles.length > 1 ? GROUP_CHIP_PX : 0));
1290
+ }
1274
1291
  var ATTENTION = ["waiting", "failed", "ready"];
1275
1292
  function activeStepId(levels, phaseOf) {
1276
1293
  const all = levels.flat();
@@ -1392,10 +1409,11 @@ var PHASE_TEXT = {
1392
1409
  };
1393
1410
  var STEP_PILL = "flex min-w-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-2.5 py-1 text-xs font-medium transition-colors";
1394
1411
  var STEP_LABEL = "min-w-[2.5rem] truncate";
1395
- var STEP_EXTRA = "min-w-0 shrink-[6] truncate font-normal opacity-80";
1412
+ var STEP_LABEL_MAX = "max-w-[20rem]";
1413
+ var STEP_LABEL_MAX_CURRENT = "max-w-[26rem]";
1414
+ var STEP_EXTRA = "min-w-[3rem] shrink-[1000] truncate font-normal opacity-80";
1396
1415
  var fill = (template, values) => Object.entries(values).reduce((s, [k, v]) => s.replace(`{${k}}`, String(v)), template);
1397
1416
  var NARROW_PX = 560;
1398
- var FULL_LEVEL_PX = 190;
1399
1417
  function StepBarFrame({
1400
1418
  levels,
1401
1419
  phaseOf,
@@ -1419,7 +1437,8 @@ function StepBarFrame({
1419
1437
  const narrow = width > 0 && width < NARROW_PX;
1420
1438
  const [start, setStart] = useState(null);
1421
1439
  useEffect(() => setStart(null), [current]);
1422
- const span = narrow ? 2 : width >= levels.length * FULL_LEVEL_PX ? levels.length : 3;
1440
+ const wholeFits = width >= levels.reduce((sum, lv) => sum + levelRoomPx(lv.map((s) => s.title)), 0);
1441
+ const span = narrow ? 2 : wholeFits ? levels.length : 3;
1423
1442
  const win = stepWindow({ levels, phaseOf, current, start, span });
1424
1443
  const [listOpen, setListOpen] = useState(null);
1425
1444
  const move = (to) => setStart(Math.max(0, Math.min(win.levels.length - 1, to)));
@@ -1583,12 +1602,13 @@ function StepBarFrame({
1583
1602
  arrow("back"),
1584
1603
  win.start === 0 && leading,
1585
1604
  overflow("before", win.hiddenBefore),
1586
- /* @__PURE__ */ jsx("ol", { className: "flex min-w-0 flex-1 items-center gap-1", children: win.visible.map((level, i) => /* @__PURE__ */ jsxs(
1605
+ /* @__PURE__ */ jsx("ol", { className: "flex min-w-0 flex-[1_1_auto] items-center gap-1", children: win.visible.map((level, i) => /* @__PURE__ */ jsxs(
1587
1606
  "li",
1588
1607
  {
1589
1608
  className: cn(
1590
1609
  "flex min-w-[5.5rem] items-center gap-1",
1591
- i === win.visible.length - 1 ? "flex-[0_1_auto]" : "flex-[1_1_auto]"
1610
+ i === win.visible.length - 1 ? "grow-0" : "grow",
1611
+ level.index === win.currentLevel && !narrow && atId && noteOf?.(atId) ? "shrink-[1000] basis-auto" : "shrink basis-auto"
1592
1612
  ),
1593
1613
  "data-role": level.role,
1594
1614
  children: [
@@ -1609,7 +1629,7 @@ function StepBarFrame({
1609
1629
  {
1610
1630
  "aria-hidden": true,
1611
1631
  className: cn(
1612
- "h-px min-w-3 flex-1",
1632
+ "h-px min-w-2 flex-1",
1613
1633
  level.steps.every((s) => ["done", "skipped"].includes(phaseOf(s.id))) ? "bg-emerald-600/40" : "bg-border"
1614
1634
  )
1615
1635
  }
@@ -1632,7 +1652,10 @@ function StepBarFrame({
1632
1652
  running.length > 0 && /* @__PURE__ */ jsxs(
1633
1653
  "div",
1634
1654
  {
1635
- className: cn("flex min-w-0 shrink items-center gap-1", narrow && "basis-full"),
1655
+ className: cn(
1656
+ "flex min-w-[6.5rem] shrink-[1000] items-center gap-1",
1657
+ narrow && "basis-full"
1658
+ ),
1636
1659
  "data-testid": tid("working"),
1637
1660
  children: [
1638
1661
  (running.length > 2 ? running.slice(0, 1) : running).map(workingPill),
@@ -2211,7 +2234,7 @@ function WorkflowStepBar({
2211
2234
  "data-testid": tid("step-done"),
2212
2235
  children: [
2213
2236
  /* @__PURE__ */ jsx(PhaseMark, { phase: run.isComplete ? "done" : "ready", icon: doneIcon }),
2214
- /* @__PURE__ */ jsx("span", { className: cn(STEP_LABEL, "max-w-[12rem]"), children: doneTitle })
2237
+ /* @__PURE__ */ jsx("span", { className: cn(STEP_LABEL, STEP_LABEL_MAX), children: doneTitle })
2215
2238
  ]
2216
2239
  }
2217
2240
  );
@@ -2232,7 +2255,7 @@ function WorkflowStepBar({
2232
2255
  /* @__PURE__ */ jsx(
2233
2256
  "span",
2234
2257
  {
2235
- className: cn(STEP_LABEL, isCurrent ? "max-w-[18rem]" : "max-w-[12rem]"),
2258
+ className: cn(STEP_LABEL, isCurrent ? STEP_LABEL_MAX_CURRENT : STEP_LABEL_MAX),
2236
2259
  "data-testid": tid(`step-${s.id}-label`),
2237
2260
  children: s.title
2238
2261
  }
@@ -2296,6 +2319,17 @@ var DEFAULT_WORKFLOW_RUNNER_LABELS = {
2296
2319
  fileReady: "Ready",
2297
2320
  fileFailed: "Could not be read",
2298
2321
  readingFiles: "Reading {current} of {count} files\u2026",
2322
+ uploadingFiles: "Uploading {count} files\u2026",
2323
+ uploadingFile: "Uploading 1 file\u2026",
2324
+ uploadingAny: "Uploading\u2026",
2325
+ uploadsFailed: "Retry or remove the {count} files that did not upload",
2326
+ uploadFailed: "Retry or remove the file that did not upload",
2327
+ fileUploading: "Uploading\u2026",
2328
+ fileUploadFailed: "Did not upload",
2329
+ retryUpload: "Retry",
2330
+ removeUpload: "Remove",
2331
+ waitingForDocuments: "Waiting for {count} documents to finish processing",
2332
+ waitingForDocument: "Waiting for 1 document to finish processing",
2299
2333
  markSent: "Mark as sent"
2300
2334
  };
2301
2335
  function WorkflowRunner({
@@ -2306,6 +2340,8 @@ function WorkflowRunner({
2306
2340
  onUpload,
2307
2341
  uploading = false,
2308
2342
  files,
2343
+ onRetryUpload,
2344
+ onRemoveUpload,
2309
2345
  renderUpload,
2310
2346
  renderStepNote,
2311
2347
  renderComplete,
@@ -2333,7 +2369,11 @@ function WorkflowRunner({
2333
2369
  const added = step?.kind === "upload" ? (files ?? []).filter((f) => f.addedFor === step.id) : [];
2334
2370
  const unread = added.filter((f) => f.status === "processing").length;
2335
2371
  const reading = action === "complete" && unread > 0;
2336
- const nextLabel = reading ? l.readingFiles.replace("{current}", String(Math.min(added.length - unread + 1, added.length))).replace("{count}", String(added.length)) : action === "skip" ? l.skip : action === "finish" ? l.finish : action === "complete" && step?.kind === "review" ? l.approve : action === "complete" && step?.kind === "action" ? l.markSent : action === "wait" && (run.isRunning || run.busy) ? l.working : (step && !run.isLocked(step.id) ? step.nextLabel : void 0) ?? l.next;
2372
+ const sending = added.filter((f) => f.status === "uploading").length;
2373
+ const unsent = added.filter((f) => f.status === "upload-failed").length;
2374
+ const uploadHold = step?.kind === "upload" && (sending > 0 || uploading || unsent > 0);
2375
+ const docsWait = !!step && waitingDocuments(run.stateOf(step.id)).length > 0;
2376
+ const nextLabel = sending ? sending === 1 ? l.uploadingFile : l.uploadingFiles.replace("{count}", String(sending)) : uploadHold && uploading ? l.uploadingAny : uploadHold ? unsent === 1 ? l.uploadFailed : l.uploadsFailed.replace("{count}", String(unsent)) : reading ? l.readingFiles.replace("{current}", String(Math.min(added.length - unread + 1, added.length))).replace("{count}", String(added.length)) : action === "skip" ? l.skip : action === "finish" ? l.finish : action === "complete" && step?.kind === "review" ? l.approve : action === "complete" && step?.kind === "action" ? l.markSent : action === "wait" && (run.isRunning || run.busy || docsWait) ? l.working : (step && !run.isLocked(step.id) ? step.nextLabel : void 0) ?? l.next;
2337
2377
  return /* @__PURE__ */ jsxs("div", { className: cn(compact3 ? "space-y-3" : "space-y-6", className), "data-testid": testIdPrefix, children: [
2338
2378
  !hideStepBar && /* @__PURE__ */ jsx(
2339
2379
  WorkflowStepBar,
@@ -2404,6 +2444,8 @@ function WorkflowRunner({
2404
2444
  files && /* @__PURE__ */ jsx(
2405
2445
  UploadFiles,
2406
2446
  {
2447
+ onRetry: onRetryUpload,
2448
+ onRemove: onRemoveUpload,
2407
2449
  added,
2408
2450
  others: files.filter((f) => f.addedFor !== step.id),
2409
2451
  l,
@@ -2472,6 +2514,7 @@ function WorkflowRunner({
2472
2514
  icon: icon(step.icon),
2473
2515
  renderStepNote,
2474
2516
  compact: compact3,
2517
+ nameOfDoc,
2475
2518
  extra: /* @__PURE__ */ jsxs(Fragment, { children: [
2476
2519
  /* @__PURE__ */ jsx(SentBackNote, { state: run.stateOf(step.id), l: pl, testId: tid(step.id) }),
2477
2520
  /* @__PURE__ */ jsx(
@@ -2531,11 +2574,11 @@ function WorkflowRunner({
2531
2574
  Button,
2532
2575
  {
2533
2576
  onClick: () => void run.next(),
2534
- disabled: action === "wait" || reading,
2577
+ disabled: action === "wait" || reading || uploadHold,
2535
2578
  "data-testid": tid("next"),
2536
2579
  children: [
2537
2580
  nextLabel,
2538
- reading || action === "wait" && (run.isRunning || run.busy) ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsx(ArrowRight, { className: "size-4" })
2581
+ reading || uploadHold && unsent === 0 || action === "wait" && (run.isRunning || run.busy || docsWait) ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsx(ArrowRight, { className: "size-4" })
2539
2582
  ]
2540
2583
  }
2541
2584
  )
@@ -2550,6 +2593,8 @@ function WorkflowRunner({
2550
2593
  function UploadFiles({
2551
2594
  added,
2552
2595
  others,
2596
+ onRetry,
2597
+ onRemove,
2553
2598
  l,
2554
2599
  testId
2555
2600
  }) {
@@ -2563,6 +2608,47 @@ function UploadFiles({
2563
2608
  children: [
2564
2609
  /* @__PURE__ */ jsx(FileText, { className: "size-3.5 shrink-0 text-primary" }),
2565
2610
  /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", title: f.name, children: f.name }),
2611
+ f.status === "uploading" && /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-1 text-xs", children: [
2612
+ /* @__PURE__ */ jsx(Loader2, { className: "size-3 animate-spin" }),
2613
+ " ",
2614
+ l.fileUploading
2615
+ ] }),
2616
+ f.status === "upload-failed" && /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-1 text-xs text-destructive", role: "alert", children: [
2617
+ /* @__PURE__ */ jsx(AlertTriangle, { className: "size-3" }),
2618
+ " ",
2619
+ l.fileUploadFailed,
2620
+ f.error ? `: ${f.error}` : "",
2621
+ onRetry && /* @__PURE__ */ jsxs(
2622
+ Button,
2623
+ {
2624
+ variant: "ghost",
2625
+ size: "sm",
2626
+ className: "h-6 px-2",
2627
+ onClick: () => onRetry(f),
2628
+ "data-testid": `${testId}-file-${f.id}-retry`,
2629
+ children: [
2630
+ /* @__PURE__ */ jsx(RotateCw, { className: "size-3" }),
2631
+ " ",
2632
+ l.retryUpload
2633
+ ]
2634
+ }
2635
+ ),
2636
+ onRemove && /* @__PURE__ */ jsxs(
2637
+ Button,
2638
+ {
2639
+ variant: "ghost",
2640
+ size: "sm",
2641
+ className: "h-6 px-2",
2642
+ onClick: () => onRemove(f),
2643
+ "data-testid": `${testId}-file-${f.id}-remove`,
2644
+ children: [
2645
+ /* @__PURE__ */ jsx(X, { className: "size-3" }),
2646
+ " ",
2647
+ l.removeUpload
2648
+ ]
2649
+ }
2650
+ )
2651
+ ] }),
2566
2652
  f.status === "processing" && /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-1 text-xs", children: [
2567
2653
  /* @__PURE__ */ jsx(Loader2, { className: "size-3 animate-spin" }),
2568
2654
  " ",
@@ -2632,11 +2718,14 @@ function AgentStepBody({
2632
2718
  renderStepNote,
2633
2719
  extra,
2634
2720
  compact: compact3,
2721
+ nameOfDoc,
2635
2722
  l,
2636
2723
  tid
2637
2724
  }) {
2638
2725
  const state = run.stateOf(step.id);
2639
2726
  const phase = run.phaseOf(step.id);
2727
+ const pending = waitingDocuments(state);
2728
+ const pendingNames = pending.flatMap((ref) => nameOfDoc?.(splitDocRef(ref).id) ?? []);
2640
2729
  const header = /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
2641
2730
  /* @__PURE__ */ jsx(StepHeading, { step, icon }),
2642
2731
  phase === "failed" && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children: run.retry && /* @__PURE__ */ jsxs(
@@ -2673,6 +2762,20 @@ function AgentStepBody({
2673
2762
  ]
2674
2763
  }
2675
2764
  ),
2765
+ pending.length > 0 && /* @__PURE__ */ jsxs(
2766
+ "div",
2767
+ {
2768
+ className: "space-y-0.5 text-sm text-muted-foreground",
2769
+ "data-testid": tid(`${step.id}-waiting-documents`),
2770
+ children: [
2771
+ /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2", children: [
2772
+ /* @__PURE__ */ jsx(Hourglass, { className: "size-4" }),
2773
+ pending.length === 1 ? l.waitingForDocument : l.waitingForDocuments.replace("{count}", String(pending.length))
2774
+ ] }),
2775
+ pendingNames.length > 0 && /* @__PURE__ */ jsx("p", { className: "pl-6 text-xs", children: pendingNames.join(", ") })
2776
+ ]
2777
+ }
2778
+ ),
2676
2779
  phase === "failed" && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", "data-testid": tid(`${step.id}-failed`), children: state?.error || l.failed }),
2677
2780
  phase === "skipped" && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: l.skipped }),
2678
2781
  extra
@@ -2702,6 +2805,6 @@ function AgentStepBody({
2702
2805
  ] });
2703
2806
  }
2704
2807
 
2705
- export { ActionStepBody, ApprovalEvidence, AssigneeLine, DEFAULT_ASSIGNEE_WORDING, DEFAULT_SCHEMA_FORM_LABELS, DEFAULT_STEP_BAR_LABELS, DEFAULT_WORKFLOW_RUNNER_LABELS, DEFAULT_WORKFLOW_STEP_PARTS_LABELS, EMPTY_WORKFLOW_SCOPE, PhaseMark, SKILL_PROMPT_FALLBACK_PLACEHOLDER, SKILL_PROMPT_LABEL, STEP_EXTRA, STEP_LABEL, STEP_PILL, SchemaForm, SendBackControl, StepBarFrame, WorkflowRunner, WorkflowStepBar, activeStepId, assigneeName, buildLaunch, canAssign, composeStepPrompt, composeWorkflowPrompt, defaultInputs, dependsOn, fieldToFrontmatter, fillRunText, fillStepInputs, fromPlanAssignee, fromPlanDocumentRef, fromPlanSteps, initialRunInputs, inputsFromContext, isEmptyWorkflowScope, isIncompleteSignal, isPersonAction, isPersonStep, isRunFinished, isSteppedWorkflow, isWorkflowScope, layoutFromPlanSteps, nextAction, orderSteps, promptFieldName, reviewInstructions, runFields, runFieldsOf, runThreadTitle, sendBackTargets, skillToWorkflow, splitDocRef, stepConfigProblems, stepDependencies, stepFields, stepLevels, stepPhase, stepPillTone, stepStatesFromActivity, stepWindow, toPlanAssignee, toPlanDocumentRef, toPlanSteps, upstreamSteps, useWorkflowView, validateInputs, validateStep, validateWorkflowGraph, workflowAccepts, workflowFromFrontmatter, workflowSteps, workflowsAccepting, workflowsForHost };
2706
- //# sourceMappingURL=chunk-6GXF62XN.js.map
2707
- //# sourceMappingURL=chunk-6GXF62XN.js.map
2808
+ export { ActionStepBody, ApprovalEvidence, AssigneeLine, DEFAULT_ASSIGNEE_WORDING, DEFAULT_SCHEMA_FORM_LABELS, DEFAULT_STEP_BAR_LABELS, DEFAULT_WORKFLOW_RUNNER_LABELS, DEFAULT_WORKFLOW_STEP_PARTS_LABELS, EMPTY_WORKFLOW_SCOPE, PhaseMark, SKILL_PROMPT_FALLBACK_PLACEHOLDER, SKILL_PROMPT_LABEL, STEP_EXTRA, STEP_LABEL, STEP_LABEL_MAX, STEP_LABEL_MAX_CURRENT, STEP_PILL, SchemaForm, SendBackControl, StepBarFrame, WorkflowRunner, WorkflowStepBar, activeStepId, assigneeName, buildLaunch, canAssign, composeStepPrompt, composeWorkflowPrompt, defaultInputs, dependsOn, eventWaitingDocuments, fieldToFrontmatter, fillRunText, fillStepInputs, fromPlanAssignee, fromPlanDocumentRef, fromPlanSteps, initialRunInputs, inputsFromContext, isEmptyWorkflowScope, isIncompleteSignal, isPersonAction, isPersonStep, isRunFinished, isSteppedWorkflow, isWorkflowScope, layoutFromPlanSteps, nextAction, orderSteps, promptFieldName, reviewInstructions, runFields, runFieldsOf, runThreadTitle, sendBackTargets, skillToWorkflow, splitDocRef, stepConfigProblems, stepDependencies, stepFields, stepLevels, stepPhase, stepPillTone, stepStatesFromActivity, stepWindow, toPlanAssignee, toPlanDocumentRef, toPlanSteps, upstreamSteps, useWorkflowView, validateInputs, validateStep, validateWorkflowGraph, waitingDocuments, waitingForDocumentsText, workflowAccepts, workflowFromFrontmatter, workflowSteps, workflowsAccepting, workflowsForHost };
2809
+ //# sourceMappingURL=chunk-THCFZKTM.js.map
2810
+ //# sourceMappingURL=chunk-THCFZKTM.js.map